Lines Matching full:local

28  *   host and card memories. BAP0 accesses are protected with local->baplock
128 static void prism2_check_sta_fw_version(local_info_t *local);
135 static int prism2_download(local_info_t *local,
138 static int prism2_download_volatile(local_info_t *local,
140 static int prism2_download_genesis(local_info_t *local,
142 static int prism2_get_ram_size(local_info_t *local);
174 * @local: pointer to private Host AP driver data
179 * Caller must have acquired local->cmdlock before calling this function.
181 static inline void __hostap_cmd_queue_free(local_info_t *local, in __hostap_cmd_queue_free() argument
189 local->cmd_queue_len--; in __hostap_cmd_queue_free()
200 * @local: pointer to private Host AP driver data
206 static inline void hostap_cmd_queue_free(local_info_t *local, in hostap_cmd_queue_free() argument
212 spin_lock_irqsave(&local->cmdlock, flags); in hostap_cmd_queue_free()
213 __hostap_cmd_queue_free(local, entry, del_req); in hostap_cmd_queue_free()
214 spin_unlock_irqrestore(&local->cmdlock, flags); in hostap_cmd_queue_free()
220 * @local: pointer to private Host AP driver data
222 static void prism2_clear_cmd_queue(local_info_t *local) in prism2_clear_cmd_queue() argument
228 spin_lock_irqsave(&local->cmdlock, flags); in prism2_clear_cmd_queue()
229 list_for_each_safe(ptr, n, &local->cmd_queue) { in prism2_clear_cmd_queue()
234 local->dev->name, entry->type, entry->cmd, in prism2_clear_cmd_queue()
236 __hostap_cmd_queue_free(local, entry, 1); in prism2_clear_cmd_queue()
238 if (local->cmd_queue_len) { in prism2_clear_cmd_queue()
242 "flush\n", local->dev->name, local->cmd_queue_len); in prism2_clear_cmd_queue()
243 local->cmd_queue_len = 0; in prism2_clear_cmd_queue()
245 spin_unlock_irqrestore(&local->cmdlock, flags); in prism2_clear_cmd_queue()
258 local_info_t *local; in hfa384x_cmd_issue() local
264 local = iface->local; in hfa384x_cmd_issue()
266 if (local->func->card_present && !local->func->card_present(local)) in hfa384x_cmd_issue()
298 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd_issue()
303 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd_issue()
325 local_info_t *local; in hfa384x_cmd() local
332 local = iface->local; in hfa384x_cmd()
340 if (local->cmd_queue_len >= HOSTAP_CMD_QUEUE_MAX_LEN) { in hfa384x_cmd()
368 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd()
369 issue = list_empty(&local->cmd_queue); in hfa384x_cmd()
372 list_add_tail(&entry->list, &local->cmd_queue); in hfa384x_cmd()
373 local->cmd_queue_len++; in hfa384x_cmd()
374 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd()
414 * local reference to it, and the data can be kfree()'d in hfa384x_cmd()
419 * If the entry is not in the list prism2_cmd_ev() has a local in hfa384x_cmd()
429 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd()
435 local->cmd_queue_len--; in hfa384x_cmd()
437 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd()
477 hostap_cmd_queue_free(local, entry, 1); in hfa384x_cmd()
503 local_info_t *local; in hfa384x_cmd_callback() local
509 local = iface->local; in hfa384x_cmd_callback()
511 if (local->cmd_queue_len >= HOSTAP_CMD_QUEUE_MAX_LEN + 2) { in hfa384x_cmd_callback()
530 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd_callback()
531 issue = list_empty(&local->cmd_queue); in hfa384x_cmd_callback()
534 list_add_tail(&entry->list, &local->cmd_queue); in hfa384x_cmd_callback()
535 local->cmd_queue_len++; in hfa384x_cmd_callback()
536 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd_callback()
543 hostap_cmd_queue_free(local, entry, ret); in hfa384x_cmd_callback()
663 local_info_t *local; in prism2_cmd_ev() local
667 local = iface->local; in prism2_cmd_ev()
669 spin_lock(&local->cmdlock); in prism2_cmd_ev()
670 if (!list_empty(&local->cmd_queue)) { in prism2_cmd_ev()
671 entry = list_entry(local->cmd_queue.next, in prism2_cmd_ev()
675 local->cmd_queue_len--; in prism2_cmd_ev()
680 __hostap_cmd_queue_free(local, entry, 1); in prism2_cmd_ev()
684 spin_unlock(&local->cmdlock); in prism2_cmd_ev()
711 hostap_cmd_queue_free(local, entry, 1); in prism2_cmd_ev()
715 spin_lock(&local->cmdlock); in prism2_cmd_ev()
716 if (!list_empty(&local->cmd_queue)) { in prism2_cmd_ev()
717 entry = list_entry(local->cmd_queue.next, in prism2_cmd_ev()
727 spin_unlock(&local->cmdlock); in prism2_cmd_ev()
733 spin_lock(&local->cmdlock); in prism2_cmd_ev()
734 __hostap_cmd_queue_free(local, entry, res); in prism2_cmd_ev()
735 spin_unlock(&local->cmdlock); in prism2_cmd_ev()
809 local_info_t *local; in hfa384x_get_rid() local
814 local = iface->local; in hfa384x_get_rid()
816 if (local->no_pri) { in hfa384x_get_rid()
823 if ((local->func->card_present && !local->func->card_present(local)) || in hfa384x_get_rid()
824 local->hw_downloading) in hfa384x_get_rid()
827 res = mutex_lock_interruptible(&local->rid_bap_mtx); in hfa384x_get_rid()
836 mutex_unlock(&local->rid_bap_mtx); in hfa384x_get_rid()
840 spin_lock_bh(&local->baplock); in hfa384x_get_rid()
862 spin_unlock_bh(&local->baplock); in hfa384x_get_rid()
863 mutex_unlock(&local->rid_bap_mtx); in hfa384x_get_rid()
882 local_info_t *local; in hfa384x_set_rid() local
887 local = iface->local; in hfa384x_set_rid()
889 if (local->no_pri) { in hfa384x_set_rid()
896 if ((local->func->card_present && !local->func->card_present(local)) || in hfa384x_set_rid()
897 local->hw_downloading) in hfa384x_set_rid()
904 res = mutex_lock_interruptible(&local->rid_bap_mtx); in hfa384x_set_rid()
908 spin_lock_bh(&local->baplock); in hfa384x_set_rid()
914 spin_unlock_bh(&local->baplock); in hfa384x_set_rid()
919 mutex_unlock(&local->rid_bap_mtx); in hfa384x_set_rid()
924 mutex_unlock(&local->rid_bap_mtx); in hfa384x_set_rid()
1007 local_info_t *local; in prism2_reset_port() local
1011 local = iface->local; in prism2_reset_port()
1013 if (!local->dev_enabled) in prism2_reset_port()
1032 if (local->fragm_threshold != 2346 && in prism2_reset_port()
1034 local->fragm_threshold)) { in prism2_reset_port()
1037 dev->name, local->fragm_threshold); in prism2_reset_port()
1041 (void) hostap_set_antsel(local); in prism2_reset_port()
1052 local_info_t *local; in prism2_get_version_info() local
1055 local = iface->local; in prism2_get_version_info()
1057 if (local->no_pri) { in prism2_get_version_info()
1076 local_info_t *local; in prism2_setup_rids() local
1081 local = iface->local; in prism2_setup_rids()
1085 if (!local->fw_ap) { in prism2_setup_rids()
1086 u16 tmp1 = hostap_get_porttype(local); in prism2_setup_rids()
1097 if (local->iw_mode != IW_MODE_MASTER || local->essid[0] != '\0') { in prism2_setup_rids()
1099 local->essid); in prism2_setup_rids()
1119 local->channel_mask = le16_to_cpu(tmp); in prism2_setup_rids()
1121 if (local->channel < 1 || local->channel > 14 || in prism2_setup_rids()
1122 !(local->channel_mask & (1 << (local->channel - 1)))) { in prism2_setup_rids()
1124 "(%d)!\n", dev->name, local->channel); in prism2_setup_rids()
1129 ret = hostap_set_word(dev, HFA384X_RID_CNFOWNCHANNEL, local->channel); in prism2_setup_rids()
1132 dev->name, local->channel); in prism2_setup_rids()
1137 local->beacon_int); in prism2_setup_rids()
1140 dev->name, local->beacon_int); in prism2_setup_rids()
1147 local->dtim_period); in prism2_setup_rids()
1150 dev->name, local->dtim_period); in prism2_setup_rids()
1157 local->is_promisc); in prism2_setup_rids()
1160 dev->name, local->is_promisc); in prism2_setup_rids()
1162 if (!local->fw_ap) { in prism2_setup_rids()
1164 local->essid); in prism2_setup_rids()
1174 if (local->tx_rate_control == 0) { in prism2_setup_rids()
1175 local->tx_rate_control = in prism2_setup_rids()
1181 if (local->basic_rates == 0) in prism2_setup_rids()
1182 local->basic_rates = HFA384X_RATES_1MBPS | HFA384X_RATES_2MBPS; in prism2_setup_rids()
1184 if (!local->fw_ap) { in prism2_setup_rids()
1186 local->tx_rate_control); in prism2_setup_rids()
1189 dev->name, local->tx_rate_control); in prism2_setup_rids()
1194 local->tx_rate_control); in prism2_setup_rids()
1197 dev->name, local->tx_rate_control); in prism2_setup_rids()
1201 local->basic_rates); in prism2_setup_rids()
1204 dev->name, local->basic_rates); in prism2_setup_rids()
1214 if (local->name_set) in prism2_setup_rids()
1216 local->name); in prism2_setup_rids()
1218 if (hostap_set_encryption(local)) { in prism2_setup_rids()
1223 (void) hostap_set_antsel(local); in prism2_setup_rids()
1225 if (hostap_set_roaming(local)) { in prism2_setup_rids()
1230 if (local->sta_fw_ver >= PRISM2_FW_VER(1,6,3) && in prism2_setup_rids()
1231 hostap_set_word(dev, HFA384X_RID_CNFENHSECURITY, local->enh_sec)) in prism2_setup_rids()
1233 dev->name, local->enh_sec); in prism2_setup_rids()
1241 if (local->sta_fw_ver >= PRISM2_FW_VER(0,8,2)) { in prism2_setup_rids()
1245 local->tallies32 = 0; in prism2_setup_rids()
1247 local->tallies32 = 1; in prism2_setup_rids()
1249 local->tallies32 = 0; in prism2_setup_rids()
1251 hostap_set_auth_algs(local); in prism2_setup_rids()
1254 local->fragm_threshold)) { in prism2_setup_rids()
1256 "failed\n", dev->name, local->fragm_threshold); in prism2_setup_rids()
1260 local->rts_threshold)) { in prism2_setup_rids()
1262 dev->name, local->rts_threshold); in prism2_setup_rids()
1265 if (local->manual_retry_count >= 0 && in prism2_setup_rids()
1267 local->manual_retry_count)) { in prism2_setup_rids()
1269 dev->name, local->manual_retry_count); in prism2_setup_rids()
1272 if (local->sta_fw_ver >= PRISM2_FW_VER(1,3,1) && in prism2_setup_rids()
1274 local->rssi_to_dBm = le16_to_cpu(tmp); in prism2_setup_rids()
1277 if (local->sta_fw_ver >= PRISM2_FW_VER(1,7,0) && local->wpa && in prism2_setup_rids()
1283 if (local->sta_fw_ver >= PRISM2_FW_VER(1,7,0) && local->generic_elem && in prism2_setup_rids()
1285 local->generic_elem, local->generic_elem_len)) { in prism2_setup_rids()
1298 local_info_t *local; in prism2_hw_init() local
1305 local = iface->local; in prism2_hw_init()
1307 clear_bit(HOSTAP_BITS_TRANSMIT, &local->bits); in prism2_hw_init()
1336 local->no_pri = 1; in prism2_hw_init()
1338 if (local->sram_type == -1) in prism2_hw_init()
1339 local->sram_type = prism2_get_ram_size(local); in prism2_hw_init()
1343 local->no_pri = 0; in prism2_hw_init()
1354 local_info_t *local; in prism2_hw_init2() local
1358 local = iface->local; in prism2_hw_init2()
1361 kfree(local->pda); in prism2_hw_init2()
1362 if (local->no_pri) in prism2_hw_init2()
1363 local->pda = NULL; in prism2_hw_init2()
1365 local->pda = prism2_read_pda(dev); in prism2_hw_init2()
1379 if (initial || local->pri_only) { in prism2_hw_init2()
1391 local->pri_only = 1; in prism2_hw_init2()
1394 local->pri_only = 0; in prism2_hw_init2()
1403 local->txfid_len = PRISM2_TXFID_LEN; in prism2_hw_init2()
1405 local->txfid[i] = hfa384x_allocate_fid(dev, local->txfid_len); in prism2_hw_init2()
1406 if (local->txfid[i] == 0xffff && local->txfid_len > 1600) { in prism2_hw_init2()
1407 local->txfid[i] = hfa384x_allocate_fid(dev, 1600); in prism2_hw_init2()
1408 if (local->txfid[i] != 0xffff) { in prism2_hw_init2()
1411 local->txfid_len = 1600; in prism2_hw_init2()
1414 if (local->txfid[i] == 0xffff) in prism2_hw_init2()
1416 local->intransmitfid[i] = PRISM2_TXFID_EMPTY; in prism2_hw_init2()
1423 prism2_check_sta_fw_version(local); in prism2_hw_init2()
1430 list_for_each(ptr, &local->hostap_interfaces) { in prism2_hw_init2()
1434 } else if (local->fw_ap) in prism2_hw_init2()
1435 prism2_check_sta_fw_version(local); in prism2_hw_init2()
1443 if (!local->no_pri) in prism2_hw_init2()
1452 local_info_t *local; in prism2_hw_enable() local
1456 local = iface->local; in prism2_hw_enable()
1457 was_resetting = local->hw_resetting; in prism2_hw_enable()
1464 local->hw_ready = 1; in prism2_hw_enable()
1465 local->hw_reset_tries = 0; in prism2_hw_enable()
1466 local->hw_resetting = 0; in prism2_hw_enable()
1491 local_info_t *local; in prism2_hw_config() local
1494 local = iface->local; in prism2_hw_config()
1496 if (local->hw_downloading) in prism2_hw_config()
1500 return local->no_pri ? 0 : 1; in prism2_hw_config()
1508 if (!local->pri_only && in prism2_hw_config()
1509 (initial == 0 || (initial == 2 && local->num_dev_open > 0))) { in prism2_hw_config()
1510 if (!local->dev_enabled) in prism2_hw_config()
1511 prism2_callback(local, PRISM2_CALLBACK_ENABLE); in prism2_hw_config()
1512 local->dev_enabled = 1; in prism2_hw_config()
1523 local_info_t *local; in prism2_hw_shutdown() local
1526 local = iface->local; in prism2_hw_shutdown()
1531 local->hw_ready = 0; in prism2_hw_shutdown()
1532 if (local->dev_enabled) in prism2_hw_shutdown()
1533 prism2_callback(local, PRISM2_CALLBACK_DISABLE); in prism2_hw_shutdown()
1534 local->dev_enabled = 0; in prism2_hw_shutdown()
1536 if (local->func->card_present && !local->func->card_present(local)) { in prism2_hw_shutdown()
1551 prism2_clear_cmd_queue(local); in prism2_hw_shutdown()
1558 local_info_t *local; in prism2_hw_reset() local
1571 local = iface->local; in prism2_hw_reset()
1579 if (local->hw_downloading) in prism2_hw_reset()
1582 if (local->hw_resetting) { in prism2_hw_reset()
1588 local->hw_reset_tries++; in prism2_hw_reset()
1589 if (local->hw_reset_tries > 10) { in prism2_hw_reset()
1597 local->hw_resetting = 1; in prism2_hw_reset()
1598 if (local->func->cor_sreset) { in prism2_hw_reset()
1606 local->func->cor_sreset(local); in prism2_hw_reset()
1611 local->hw_resetting = 0; in prism2_hw_reset()
1614 if (local->dl_pri) { in prism2_hw_reset()
1617 if (prism2_download_genesis(local, local->dl_pri) < 0) in prism2_hw_reset()
1622 if (local->dl_sec) { in prism2_hw_reset()
1625 if (prism2_download_volatile(local, local->dl_sec) < 0) in prism2_hw_reset()
1635 static void prism2_schedule_reset(local_info_t *local) in prism2_schedule_reset() argument
1637 schedule_work(&local->reset_queue); in prism2_schedule_reset()
1645 local_info_t *local = container_of(work, local_info_t, reset_queue); in handle_reset_queue() local
1647 printk(KERN_DEBUG "%s: scheduled card reset\n", local->dev->name); in handle_reset_queue()
1648 prism2_hw_reset(local->dev); in handle_reset_queue()
1650 if (netif_queue_stopped(local->dev)) { in handle_reset_queue()
1654 if (local->intransmitfid[i] == PRISM2_TXFID_EMPTY) { in handle_reset_queue()
1657 netif_wake_queue(local->dev); in handle_reset_queue()
1664 static int prism2_get_txfid_idx(local_info_t *local) in prism2_get_txfid_idx() argument
1669 spin_lock_irqsave(&local->txfidlock, flags); in prism2_get_txfid_idx()
1670 end = idx = local->next_txfid; in prism2_get_txfid_idx()
1672 if (local->intransmitfid[idx] == PRISM2_TXFID_EMPTY) { in prism2_get_txfid_idx()
1673 local->intransmitfid[idx] = PRISM2_TXFID_RESERVED; in prism2_get_txfid_idx()
1674 spin_unlock_irqrestore(&local->txfidlock, flags); in prism2_get_txfid_idx()
1681 spin_unlock_irqrestore(&local->txfidlock, flags); in prism2_get_txfid_idx()
1685 local->dev->stats.tx_dropped++; in prism2_get_txfid_idx()
1696 local_info_t *local; in prism2_transmit_cb() local
1700 local = iface->local; in prism2_transmit_cb()
1714 if (!test_and_clear_bit(HOSTAP_BITS_TRANSMIT, &local->bits)) { in prism2_transmit_cb()
1725 spin_lock(&local->txfidlock); in prism2_transmit_cb()
1729 local->intransmitfid[idx] = resp0; in prism2_transmit_cb()
1733 dev->name, idx, local->txfid[idx], in prism2_transmit_cb()
1734 resp0, local->intransmitfid[local->next_txfid]); in prism2_transmit_cb()
1739 local->next_txfid = idx; in prism2_transmit_cb()
1743 if (local->intransmitfid[idx] == PRISM2_TXFID_EMPTY) { in prism2_transmit_cb()
1744 spin_unlock(&local->txfidlock); in prism2_transmit_cb()
1750 } while (idx != local->next_txfid); in prism2_transmit_cb()
1751 spin_unlock(&local->txfidlock); in prism2_transmit_cb()
1763 local_info_t *local; in prism2_transmit() local
1767 local = iface->local; in prism2_transmit()
1773 if (test_and_set_bit(HOSTAP_BITS_TRANSMIT, &local->bits)) { in prism2_transmit()
1786 local->txfid[idx], in prism2_transmit()
1812 local_info_t *local; in prism2_tx_80211() local
1819 local = iface->local; in prism2_tx_80211()
1823 prism2_callback(local, PRISM2_CALLBACK_TX_START); in prism2_tx_80211()
1825 if ((local->func->card_present && !local->func->card_present(local)) || in prism2_tx_80211()
1826 !local->hw_ready || local->hw_downloading || local->pri_only) { in prism2_tx_80211()
1849 tx_control = local->tx_control; in prism2_tx_80211()
1861 idx = prism2_get_txfid_idx(local); in prism2_tx_80211()
1865 if (local->frame_dump & PRISM2_DUMP_TX_HDR) in prism2_tx_80211()
1868 spin_lock(&local->baplock); in prism2_tx_80211()
1869 res = hfa384x_setup_bap(dev, BAP0, local->txfid[idx], 0); in prism2_tx_80211()
1876 spin_unlock(&local->baplock); in prism2_tx_80211()
1883 local->intransmitfid[idx] = PRISM2_TXFID_EMPTY; in prism2_tx_80211()
1884 schedule_work(&local->reset_queue); in prism2_tx_80211()
1891 prism2_callback(local, PRISM2_CALLBACK_TX_END); in prism2_tx_80211()
1935 static void prism2_rx(local_info_t *local) in prism2_rx() argument
1937 struct net_device *dev = local->dev; in prism2_rx()
1943 prism2_callback(local, PRISM2_CALLBACK_RX_START); in prism2_rx()
1952 schedule_work(&local->reset_queue); in prism2_rx()
1959 spin_lock(&local->baplock); in prism2_rx()
1965 spin_unlock(&local->baplock); in prism2_rx()
1969 schedule_work(&local->reset_queue); in prism2_rx()
1984 if (macport == 7 && local->iw_mode == IW_MODE_MONITOR) { in prism2_rx()
1991 spin_unlock(&local->baplock); in prism2_rx()
2001 spin_unlock(&local->baplock); in prism2_rx()
2011 spin_unlock(&local->baplock); in prism2_rx()
2018 skb_queue_tail(&local->rx_list, skb); in prism2_rx()
2019 tasklet_schedule(&local->rx_tasklet); in prism2_rx()
2022 prism2_callback(local, PRISM2_CALLBACK_RX_END); in prism2_rx()
2038 static void hostap_rx_skb(local_info_t *local, struct sk_buff *skb) in hostap_rx_skb() argument
2048 if (local->iw_mode == IW_MODE_MONITOR && in hostap_rx_skb()
2059 if (local->frame_dump & PRISM2_DUMP_RX_HDR && in hostap_rx_skb()
2064 (!local->monitor_allow_fcserr || in hostap_rx_skb()
2065 local->iw_mode != IW_MODE_MONITOR)) in hostap_rx_skb()
2075 stats.signal = rxdesc->signal - local->rssi_to_dBm; in hostap_rx_skb()
2076 stats.noise = rxdesc->silence - local->rssi_to_dBm; in hostap_rx_skb()
2098 local_info_t *local = (local_info_t *) data; in hostap_rx_tasklet() local
2101 while ((skb = skb_dequeue(&local->rx_list)) != NULL) in hostap_rx_tasklet()
2102 hostap_rx_skb(local, skb); in hostap_rx_tasklet()
2110 local_info_t *local; in prism2_alloc_ev() local
2115 local = iface->local; in prism2_alloc_ev()
2121 spin_lock(&local->txfidlock); in prism2_alloc_ev()
2122 idx = local->next_alloc; in prism2_alloc_ev()
2125 if (local->txfid[idx] == fid) { in prism2_alloc_ev()
2130 if (local->intransmitfid[idx] == PRISM2_TXFID_EMPTY) in prism2_alloc_ev()
2133 if (local->intransmitfid[idx] == PRISM2_TXFID_RESERVED) in prism2_alloc_ev()
2137 local->intransmitfid[idx] = PRISM2_TXFID_EMPTY; in prism2_alloc_ev()
2139 local->next_alloc = idx >= PRISM2_TXFID_COUNT ? 0 : in prism2_alloc_ev()
2142 if (!test_bit(HOSTAP_BITS_TRANSMIT, &local->bits) && in prism2_alloc_ev()
2146 spin_unlock(&local->txfidlock); in prism2_alloc_ev()
2153 } while (idx != local->next_alloc); in prism2_alloc_ev()
2160 printk(" %04x[%04x]", local->txfid[idx], in prism2_alloc_ev()
2161 local->intransmitfid[idx]); in prism2_alloc_ev()
2163 spin_unlock(&local->txfidlock); in prism2_alloc_ev()
2173 static void hostap_tx_callback(local_info_t *local, in hostap_tx_callback() argument
2182 if (memcmp(txdesc->addr2, local->dev->dev_addr, ETH_ALEN)) { in hostap_tx_callback()
2184 local->dev->name); in hostap_tx_callback()
2190 spin_lock(&local->lock); in hostap_tx_callback()
2191 cb = local->tx_callback; in hostap_tx_callback()
2194 spin_unlock(&local->lock); in hostap_tx_callback()
2198 local->dev->name, sw_support); in hostap_tx_callback()
2207 "skb\n", local->dev->name); in hostap_tx_callback()
2215 skb->dev = local->dev; in hostap_tx_callback()
2223 static int hostap_tx_compl_read(local_info_t *local, int error, in hostap_tx_compl_read() argument
2229 struct net_device *dev = local->dev; in hostap_tx_compl_read()
2235 spin_lock(&local->baplock); in hostap_tx_compl_read()
2243 schedule_work(&local->reset_queue); in hostap_tx_compl_read()
2265 spin_unlock(&local->baplock); in hostap_tx_compl_read()
2272 static void prism2_tx_ev(local_info_t *local) in prism2_tx_ev() argument
2274 struct net_device *dev = local->dev; in prism2_tx_ev()
2278 if (hostap_tx_compl_read(local, 0, &txdesc, &payload)) in prism2_tx_ev()
2281 if (local->frame_dump & PRISM2_DUMP_TX_HDR) { in prism2_tx_ev()
2292 hostap_tx_callback(local, &txdesc, 1, payload); in prism2_tx_ev()
2303 local_info_t *local = (local_info_t *) data; in hostap_sta_tx_exc_tasklet() local
2306 while ((skb = skb_dequeue(&local->sta_tx_exc_list)) != NULL) { in hostap_sta_tx_exc_tasklet()
2317 hostap_handle_sta_tx_exc(local, skb); in hostap_sta_tx_exc_tasklet()
2325 static void prism2_txexc(local_info_t *local) in prism2_txexc() argument
2327 struct net_device *dev = local->dev; in prism2_txexc()
2333 show_dump = local->frame_dump & PRISM2_DUMP_TXEXC_HDR; in prism2_txexc()
2336 res = hostap_tx_compl_read(local, 1, &txdesc, &payload); in prism2_txexc()
2358 if (local->iw_mode == IW_MODE_MASTER || in prism2_txexc()
2359 local->iw_mode == IW_MODE_REPEAT || in prism2_txexc()
2360 local->wds_type & HOSTAP_WDS_AP_CLIENT) { in prism2_txexc()
2366 skb_queue_tail(&local->sta_tx_exc_list, skb); in prism2_txexc()
2367 tasklet_schedule(&local->sta_tx_exc_tasklet); in prism2_txexc()
2372 hostap_tx_callback(local, &txdesc, 0, payload); in prism2_txexc()
2406 local_info_t *local = (local_info_t *) data; in hostap_info_tasklet() local
2409 while ((skb = skb_dequeue(&local->info_list)) != NULL) { in hostap_info_tasklet()
2410 hostap_info_process(local, skb); in hostap_info_tasklet()
2417 static void prism2_info(local_info_t *local) in prism2_info() argument
2419 struct net_device *dev = local->dev; in prism2_info()
2427 spin_lock(&local->baplock); in prism2_info()
2432 spin_unlock(&local->baplock); in prism2_info()
2436 schedule_work(&local->reset_queue); in prism2_info()
2447 spin_unlock(&local->baplock); in prism2_info()
2456 spin_unlock(&local->baplock); in prism2_info()
2465 spin_unlock(&local->baplock); in prism2_info()
2472 spin_unlock(&local->baplock); in prism2_info()
2474 skb_queue_tail(&local->info_list, skb); in prism2_info()
2475 tasklet_schedule(&local->info_tasklet); in prism2_info()
2485 local_info_t *local = (local_info_t *) data; in hostap_bap_tasklet() local
2486 struct net_device *dev = local->dev; in hostap_bap_tasklet()
2490 if (local->func->card_present && !local->func->card_present(local)) in hostap_bap_tasklet()
2493 set_bit(HOSTAP_BITS_BAP_TASKLET, &local->bits); in hostap_bap_tasklet()
2502 prism2_rx(local); in hostap_bap_tasklet()
2504 prism2_info(local); in hostap_bap_tasklet()
2506 prism2_tx_ev(local); in hostap_bap_tasklet()
2508 prism2_txexc(local); in hostap_bap_tasklet()
2511 set_bit(HOSTAP_BITS_BAP_TASKLET2, &local->bits); in hostap_bap_tasklet()
2512 clear_bit(HOSTAP_BITS_BAP_TASKLET, &local->bits); in hostap_bap_tasklet()
2516 clear_bit(HOSTAP_BITS_BAP_TASKLET2, &local->bits); in hostap_bap_tasklet()
2544 local_info_t *local; in prism2_ev_tick() local
2549 local = iface->local; in prism2_ev_tick()
2551 if (time_after(jiffies, local->last_tick_timer + 5 * HZ) && in prism2_ev_tick()
2552 local->last_tick_timer) { in prism2_ev_tick()
2558 dev->name, local->bits, evstat, inten); in prism2_ev_tick()
2560 local->sw_tick_stuck++; in prism2_ev_tick()
2574 static void prism2_check_magic(local_info_t *local) in prism2_check_magic() argument
2585 struct net_device *dev = local->dev; in prism2_check_magic()
2588 if (!local->hw_ready) in prism2_check_magic()
2604 schedule_work(&local->reset_queue); in prism2_check_magic()
2617 local_info_t *local; in prism2_interrupt() local
2622 local = iface->local; in prism2_interrupt()
2625 spin_lock(&local->irq_init_lock); in prism2_interrupt()
2631 spin_unlock(&local->irq_init_lock); in prism2_interrupt()
2634 spin_unlock(&local->irq_init_lock); in prism2_interrupt()
2638 if (local->func->card_present && !local->func->card_present(local)) { in prism2_interrupt()
2646 prism2_check_magic(local); in prism2_interrupt()
2651 if (local->shutdown) in prism2_interrupt()
2671 if (!local->hw_ready || local->hw_resetting || in prism2_interrupt()
2672 !local->dev_enabled) { in prism2_interrupt()
2678 if (local->dev_enabled && (ev & ~HFA384X_EV_TICK) && in prism2_interrupt()
2685 !local->hw_ready ? " (!hw_ready)" : "", in prism2_interrupt()
2686 local->hw_resetting ? in prism2_interrupt()
2688 !local->dev_enabled ? in prism2_interrupt()
2710 tasklet_schedule(&local->bap_tasklet); in prism2_interrupt()
2740 static void prism2_check_sta_fw_version(local_info_t *local) in prism2_check_sta_fw_version() argument
2745 if (hfa384x_get_rid(local->dev, HFA384X_RID_STAID, in prism2_check_sta_fw_version()
2749 local->fw_ap = 0; in prism2_check_sta_fw_version()
2753 local->fw_ap = 1; in prism2_check_sta_fw_version()
2760 local->sta_fw_ver = PRISM2_FW_VER(major, minor, variant); in prism2_check_sta_fw_version()
2768 local->fw_encrypt_ok = local->sta_fw_ver >= PRISM2_FW_VER(1,4,9); in prism2_check_sta_fw_version()
2770 if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && in prism2_check_sta_fw_version()
2771 !local->fw_encrypt_ok) { in prism2_check_sta_fw_version()
2774 local->dev->name); in prism2_check_sta_fw_version()
2775 local->host_encrypt = 1; in prism2_check_sta_fw_version()
2785 if (local->sta_fw_ver >= PRISM2_FW_VER(1,5,0)) in prism2_check_sta_fw_version()
2786 local->wds_type |= HOSTAP_WDS_STANDARD_FRAME; in prism2_check_sta_fw_version()
2790 local->dev->name); in prism2_check_sta_fw_version()
2793 hostap_check_sta_fw_version(local->ap, local->sta_fw_ver); in prism2_check_sta_fw_version()
2799 local_info_t *local = (local_info_t *) data; in hostap_passive_scan() local
2800 struct net_device *dev = local->dev; in hostap_passive_scan()
2803 if (local->passive_scan_interval <= 0) in hostap_passive_scan()
2806 if (local->passive_scan_state == PASSIVE_SCAN_LISTEN) { in hostap_passive_scan()
2813 if (test_bit(HOSTAP_BITS_TRANSMIT, &local->bits)) { in hostap_passive_scan()
2816 local->passive_scan_timer.expires = jiffies + HZ / 10; in hostap_passive_scan()
2817 add_timer(&local->passive_scan_timer); in hostap_passive_scan()
2822 local->passive_scan_channel++; in hostap_passive_scan()
2823 if (local->passive_scan_channel > 14) in hostap_passive_scan()
2824 local->passive_scan_channel = 1; in hostap_passive_scan()
2826 } while (!(local->channel_mask & in hostap_passive_scan()
2827 (1 << (local->passive_scan_channel - 1))) && in hostap_passive_scan()
2837 dev->name, local->passive_scan_channel); in hostap_passive_scan()
2838 chan = local->passive_scan_channel; in hostap_passive_scan()
2839 local->passive_scan_state = PASSIVE_SCAN_WAIT; in hostap_passive_scan()
2840 local->passive_scan_timer.expires = jiffies + HZ / 10; in hostap_passive_scan()
2842 chan = local->channel; in hostap_passive_scan()
2843 local->passive_scan_state = PASSIVE_SCAN_LISTEN; in hostap_passive_scan()
2844 local->passive_scan_timer.expires = jiffies + in hostap_passive_scan()
2845 local->passive_scan_interval * HZ; in hostap_passive_scan()
2854 add_timer(&local->passive_scan_timer); in hostap_passive_scan()
2862 local_info_t *local = in handle_comms_qual_update() local
2864 prism2_update_comms_qual(local->dev); in handle_comms_qual_update()
2869 * used to monitor that local->last_tick_timer is being updated. If not,
2875 local_info_t *local = (local_info_t *) data; in hostap_tick_timer() local
2876 local->last_tick_timer = jiffies; in hostap_tick_timer()
2881 !local->hw_downloading && local->hw_ready && in hostap_tick_timer()
2882 !local->hw_resetting && local->dev_enabled) { in hostap_tick_timer()
2883 hfa384x_cmd_callback(local->dev, HFA384X_CMDCODE_INQUIRE, in hostap_tick_timer()
2888 if ((local->last_comms_qual_update == 0 || in hostap_tick_timer()
2889 time_after(jiffies, local->last_comms_qual_update + 10 * HZ)) && in hostap_tick_timer()
2890 (local->iw_mode == IW_MODE_INFRA || in hostap_tick_timer()
2891 local->iw_mode == IW_MODE_ADHOC)) { in hostap_tick_timer()
2892 schedule_work(&local->comms_qual_update); in hostap_tick_timer()
2895 local->tick_timer.expires = jiffies + 2 * HZ; in hostap_tick_timer()
2896 add_timer(&local->tick_timer); in hostap_tick_timer()
2905 local_info_t *local = (local_info_t *) data; in prism2_registers_proc_read() local
2913 p += sprintf(p, #n "=%04x\n", hfa384x_read_reg(local->dev, HFA384X_##n##_OFF)) in prism2_registers_proc_read()
2975 local_info_t *local; in prism2_set_tim() local
2978 local = iface->local; in prism2_set_tim()
2983 local->dev->name); in prism2_set_tim()
2989 spin_lock_bh(&local->set_tim_lock); in prism2_set_tim()
2990 list_for_each(ptr, &local->set_tim_list) { in prism2_set_tim()
2996 local->dev->name, aid, entry->set, set); in prism2_set_tim()
3004 list_add_tail(&new_entry->list, &local->set_tim_list); in prism2_set_tim()
3005 spin_unlock_bh(&local->set_tim_lock); in prism2_set_tim()
3007 schedule_work(&local->set_tim_queue); in prism2_set_tim()
3015 local_info_t *local = container_of(work, local_info_t, set_tim_queue); in handle_set_tim_queue() local
3021 spin_lock_bh(&local->set_tim_lock); in handle_set_tim_queue()
3022 if (!list_empty(&local->set_tim_list)) { in handle_set_tim_queue()
3023 entry = list_entry(local->set_tim_list.next, in handle_set_tim_queue()
3027 spin_unlock_bh(&local->set_tim_lock); in handle_set_tim_queue()
3032 local->dev->name, entry->aid, entry->set); in handle_set_tim_queue()
3037 if (hostap_set_word(local->dev, HFA384X_RID_CNFTIMCTRL, val)) { in handle_set_tim_queue()
3040 local->dev->name, entry->aid, entry->set); in handle_set_tim_queue()
3048 static void prism2_clear_set_tim_queue(local_info_t *local) in prism2_clear_set_tim_queue() argument
3052 list_for_each_safe(ptr, n, &local->set_tim_list) { in prism2_clear_set_tim_queue()
3090 struct local_info *local; in prism2_init_local_data() local
3112 local = (struct local_info *) ((((long) (iface + 1)) + 3) & ~3); in prism2_init_local_data()
3113 local->ap = (struct ap_data *) ((((long) (local + 1)) + 3) & ~3); in prism2_init_local_data()
3114 local->dev = iface->dev = dev; in prism2_init_local_data()
3115 iface->local = local; in prism2_init_local_data()
3117 INIT_LIST_HEAD(&local->hostap_interfaces); in prism2_init_local_data()
3119 local->hw_module = THIS_MODULE; in prism2_init_local_data()
3122 local->io_debug_enabled = 1; in prism2_init_local_data()
3125 local->func = funcs; in prism2_init_local_data()
3126 local->func->cmd = hfa384x_cmd; in prism2_init_local_data()
3127 local->func->read_regs = hfa384x_read_regs; in prism2_init_local_data()
3128 local->func->get_rid = hfa384x_get_rid; in prism2_init_local_data()
3129 local->func->set_rid = hfa384x_set_rid; in prism2_init_local_data()
3130 local->func->hw_enable = prism2_hw_enable; in prism2_init_local_data()
3131 local->func->hw_config = prism2_hw_config; in prism2_init_local_data()
3132 local->func->hw_reset = prism2_hw_reset; in prism2_init_local_data()
3133 local->func->hw_shutdown = prism2_hw_shutdown; in prism2_init_local_data()
3134 local->func->reset_port = prism2_reset_port; in prism2_init_local_data()
3135 local->func->schedule_reset = prism2_schedule_reset; in prism2_init_local_data()
3137 local->func->read_aux = prism2_download_aux_dump; in prism2_init_local_data()
3138 local->func->download = prism2_download; in prism2_init_local_data()
3140 local->func->tx = prism2_tx_80211; in prism2_init_local_data()
3141 local->func->set_tim = prism2_set_tim; in prism2_init_local_data()
3142 local->func->need_tx_headroom = 0; /* no need to add txdesc in in prism2_init_local_data()
3146 local->mtu = mtu; in prism2_init_local_data()
3148 rwlock_init(&local->iface_lock); in prism2_init_local_data()
3149 spin_lock_init(&local->txfidlock); in prism2_init_local_data()
3150 spin_lock_init(&local->cmdlock); in prism2_init_local_data()
3151 spin_lock_init(&local->baplock); in prism2_init_local_data()
3152 spin_lock_init(&local->lock); in prism2_init_local_data()
3153 spin_lock_init(&local->irq_init_lock); in prism2_init_local_data()
3154 mutex_init(&local->rid_bap_mtx); in prism2_init_local_data()
3158 local->card_idx = card_idx; in prism2_init_local_data()
3161 memcpy(local->essid, essid, in prism2_init_local_data()
3163 local->essid[MAX_SSID_LEN] = '\0'; in prism2_init_local_data()
3167 local->iw_mode = i; in prism2_init_local_data()
3171 local->iw_mode = IW_MODE_MASTER; in prism2_init_local_data()
3173 local->channel = GET_INT_PARM(channel, card_idx); in prism2_init_local_data()
3174 local->beacon_int = GET_INT_PARM(beacon_int, card_idx); in prism2_init_local_data()
3175 local->dtim_period = GET_INT_PARM(dtim_period, card_idx); in prism2_init_local_data()
3176 local->wds_max_connections = 16; in prism2_init_local_data()
3177 local->tx_control = HFA384X_TX_CTRL_FLAGS; in prism2_init_local_data()
3178 local->manual_retry_count = -1; in prism2_init_local_data()
3179 local->rts_threshold = 2347; in prism2_init_local_data()
3180 local->fragm_threshold = 2346; in prism2_init_local_data()
3181 local->rssi_to_dBm = 100; /* default; to be overriden by in prism2_init_local_data()
3183 local->auth_algs = PRISM2_AUTH_OPEN | PRISM2_AUTH_SHARED_KEY; in prism2_init_local_data()
3184 local->sram_type = -1; in prism2_init_local_data()
3185 local->scan_channel_mask = 0xffff; in prism2_init_local_data()
3186 local->monitor_type = PRISM2_MONITOR_RADIOTAP; in prism2_init_local_data()
3189 INIT_WORK(&local->reset_queue, handle_reset_queue); in prism2_init_local_data()
3190 INIT_WORK(&local->set_multicast_list_queue, in prism2_init_local_data()
3193 INIT_WORK(&local->set_tim_queue, handle_set_tim_queue); in prism2_init_local_data()
3194 INIT_LIST_HEAD(&local->set_tim_list); in prism2_init_local_data()
3195 spin_lock_init(&local->set_tim_lock); in prism2_init_local_data()
3197 INIT_WORK(&local->comms_qual_update, handle_comms_qual_update); in prism2_init_local_data()
3204 HOSTAP_TASKLET_INIT(&local->bap_tasklet, hostap_bap_tasklet, in prism2_init_local_data()
3205 (unsigned long) local); in prism2_init_local_data()
3207 HOSTAP_TASKLET_INIT(&local->info_tasklet, hostap_info_tasklet, in prism2_init_local_data()
3208 (unsigned long) local); in prism2_init_local_data()
3209 hostap_info_init(local); in prism2_init_local_data()
3211 HOSTAP_TASKLET_INIT(&local->rx_tasklet, in prism2_init_local_data()
3212 hostap_rx_tasklet, (unsigned long) local); in prism2_init_local_data()
3213 skb_queue_head_init(&local->rx_list); in prism2_init_local_data()
3215 HOSTAP_TASKLET_INIT(&local->sta_tx_exc_tasklet, in prism2_init_local_data()
3216 hostap_sta_tx_exc_tasklet, (unsigned long) local); in prism2_init_local_data()
3217 skb_queue_head_init(&local->sta_tx_exc_list); in prism2_init_local_data()
3219 INIT_LIST_HEAD(&local->cmd_queue); in prism2_init_local_data()
3220 init_waitqueue_head(&local->hostscan_wq); in prism2_init_local_data()
3222 lib80211_crypt_info_init(&local->crypt_info, dev->name, &local->lock); in prism2_init_local_data()
3224 init_timer(&local->passive_scan_timer); in prism2_init_local_data()
3225 local->passive_scan_timer.data = (unsigned long) local; in prism2_init_local_data()
3226 local->passive_scan_timer.function = hostap_passive_scan; in prism2_init_local_data()
3228 init_timer(&local->tick_timer); in prism2_init_local_data()
3229 local->tick_timer.data = (unsigned long) local; in prism2_init_local_data()
3230 local->tick_timer.function = hostap_tick_timer; in prism2_init_local_data()
3231 local->tick_timer.expires = jiffies + 2 * HZ; in prism2_init_local_data()
3232 add_timer(&local->tick_timer); in prism2_init_local_data()
3234 INIT_LIST_HEAD(&local->bss_list); in prism2_init_local_data()
3236 hostap_setup_dev(dev, local, HOSTAP_INTERFACE_MASTER); in prism2_init_local_data()
3256 hostap_init_data(local); in prism2_init_local_data()
3268 struct local_info *local; in hostap_hw_ready() local
3271 local = iface->local; in hostap_hw_ready()
3272 local->ddev = hostap_add_interface(local, HOSTAP_INTERFACE_MAIN, 0, in hostap_hw_ready()
3275 if (local->ddev) { in hostap_hw_ready()
3276 if (local->iw_mode == IW_MODE_INFRA || in hostap_hw_ready()
3277 local->iw_mode == IW_MODE_ADHOC) { in hostap_hw_ready()
3278 netif_carrier_off(local->dev); in hostap_hw_ready()
3279 netif_carrier_off(local->ddev); in hostap_hw_ready()
3281 hostap_init_proc(local); in hostap_hw_ready()
3283 create_proc_read_entry("registers", 0, local->proc, in hostap_hw_ready()
3284 prism2_registers_proc_read, local); in hostap_hw_ready()
3286 hostap_init_ap_proc(local); in hostap_hw_ready()
3299 struct local_info *local; in prism2_free_local_data() local
3306 local = iface->local; in prism2_free_local_data()
3308 /* Unregister all netdevs before freeing local data. */ in prism2_free_local_data()
3309 list_for_each_safe(ptr, n, &local->hostap_interfaces) { in prism2_free_local_data()
3318 unregister_netdev(local->dev); in prism2_free_local_data()
3320 flush_work_sync(&local->reset_queue); in prism2_free_local_data()
3321 flush_work_sync(&local->set_multicast_list_queue); in prism2_free_local_data()
3322 flush_work_sync(&local->set_tim_queue); in prism2_free_local_data()
3324 flush_work_sync(&local->info_queue); in prism2_free_local_data()
3326 flush_work_sync(&local->comms_qual_update); in prism2_free_local_data()
3328 lib80211_crypt_info_free(&local->crypt_info); in prism2_free_local_data()
3330 if (timer_pending(&local->passive_scan_timer)) in prism2_free_local_data()
3331 del_timer(&local->passive_scan_timer); in prism2_free_local_data()
3333 if (timer_pending(&local->tick_timer)) in prism2_free_local_data()
3334 del_timer(&local->tick_timer); in prism2_free_local_data()
3336 prism2_clear_cmd_queue(local); in prism2_free_local_data()
3338 skb_queue_purge(&local->info_list); in prism2_free_local_data()
3339 skb_queue_purge(&local->rx_list); in prism2_free_local_data()
3340 skb_queue_purge(&local->sta_tx_exc_list); in prism2_free_local_data()
3342 if (local->dev_enabled) in prism2_free_local_data()
3343 prism2_callback(local, PRISM2_CALLBACK_DISABLE); in prism2_free_local_data()
3345 if (local->ap != NULL) in prism2_free_local_data()
3346 hostap_free_data(local->ap); in prism2_free_local_data()
3349 if (local->proc != NULL) in prism2_free_local_data()
3350 remove_proc_entry("registers", local->proc); in prism2_free_local_data()
3352 hostap_remove_proc(local); in prism2_free_local_data()
3354 tx_cb = local->tx_callback; in prism2_free_local_data()
3361 hostap_set_hostapd(local, 0, 0); in prism2_free_local_data()
3362 hostap_set_hostapd_sta(local, 0, 0); in prism2_free_local_data()
3365 if (local->frag_cache[i].skb != NULL) in prism2_free_local_data()
3366 dev_kfree_skb(local->frag_cache[i].skb); in prism2_free_local_data()
3370 prism2_download_free_data(local->dl_pri); in prism2_free_local_data()
3371 prism2_download_free_data(local->dl_sec); in prism2_free_local_data()
3374 prism2_clear_set_tim_queue(local); in prism2_free_local_data()
3376 list_for_each_safe(ptr, n, &local->bss_list) { in prism2_free_local_data()
3382 kfree(local->pda); in prism2_free_local_data()
3383 kfree(local->last_scan_results); in prism2_free_local_data()
3384 kfree(local->generic_elem); in prism2_free_local_data()
3386 free_netdev(local->dev); in prism2_free_local_data()
3394 struct local_info *local; in prism2_suspend() local
3398 local = iface->local; in prism2_suspend()
3404 wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL); in prism2_suspend()