Lines Matching +full:entry +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
8 * Copyright (c) 2002-2005, Jouni Malinen <j@w1.fi>
11 * - there is currently no way of associating TX packets to correct wds device
24 * host and card memories. BAP0 accesses are protected with local->baplock
82 MODULE_PARM_DESC(dev_template, "Prefix for network device name (default: "
88 /* check WTERR events (Wait Time-out) in development versions */
153 regs->cmd = HFA384X_INW(HFA384X_CMD_OFF); in hfa384x_read_regs()
154 regs->evstat = HFA384X_INW(HFA384X_EVSTAT_OFF); in hfa384x_read_regs()
155 regs->offset0 = HFA384X_INW(HFA384X_OFFSET0_OFF); in hfa384x_read_regs()
156 regs->offset1 = HFA384X_INW(HFA384X_OFFSET1_OFF); in hfa384x_read_regs()
157 regs->swsupport0 = HFA384X_INW(HFA384X_SWSUPPORT0_OFF); in hfa384x_read_regs()
162 * __hostap_cmd_queue_free - Free Prism2 command queue entry (private)
164 * @entry: Prism2 command queue entry to be freed
165 * @del_req: request the entry to be removed
168 * Caller must have acquired local->cmdlock before calling this function.
171 struct hostap_cmd_queue *entry, in __hostap_cmd_queue_free() argument
175 entry->del_req = 1; in __hostap_cmd_queue_free()
176 if (!list_empty(&entry->list)) { in __hostap_cmd_queue_free()
177 list_del_init(&entry->list); in __hostap_cmd_queue_free()
178 local->cmd_queue_len--; in __hostap_cmd_queue_free()
182 if (refcount_dec_and_test(&entry->usecnt) && entry->del_req) in __hostap_cmd_queue_free()
183 kfree(entry); in __hostap_cmd_queue_free()
188 * hostap_cmd_queue_free - Free Prism2 command queue entry
190 * @entry: Prism2 command queue entry to be freed
191 * @del_req: request the entry to be removed
193 * Free a Prism2 command queue entry.
196 struct hostap_cmd_queue *entry, in hostap_cmd_queue_free() argument
201 spin_lock_irqsave(&local->cmdlock, flags); in hostap_cmd_queue_free()
202 __hostap_cmd_queue_free(local, entry, del_req); in hostap_cmd_queue_free()
203 spin_unlock_irqrestore(&local->cmdlock, flags); in hostap_cmd_queue_free()
208 * prism2_clear_cmd_queue - Free all pending Prism2 command queue entries
215 struct hostap_cmd_queue *entry; in prism2_clear_cmd_queue() local
217 spin_lock_irqsave(&local->cmdlock, flags); in prism2_clear_cmd_queue()
218 list_for_each_safe(ptr, n, &local->cmd_queue) { in prism2_clear_cmd_queue()
219 entry = list_entry(ptr, struct hostap_cmd_queue, list); in prism2_clear_cmd_queue()
220 refcount_inc(&entry->usecnt); in prism2_clear_cmd_queue()
221 printk(KERN_DEBUG "%s: removed pending cmd_queue entry " in prism2_clear_cmd_queue()
223 local->dev->name, entry->type, entry->cmd, in prism2_clear_cmd_queue()
224 entry->param0); in prism2_clear_cmd_queue()
225 __hostap_cmd_queue_free(local, entry, 1); in prism2_clear_cmd_queue()
227 if (local->cmd_queue_len) { in prism2_clear_cmd_queue()
231 "flush\n", local->dev->name, local->cmd_queue_len); in prism2_clear_cmd_queue()
232 local->cmd_queue_len = 0; in prism2_clear_cmd_queue()
234 spin_unlock_irqrestore(&local->cmdlock, flags); in prism2_clear_cmd_queue()
239 * hfa384x_cmd_issue - Issue a Prism2 command to the hardware
241 * @entry: Prism2 command queue entry to be issued
244 struct hostap_cmd_queue *entry) in hfa384x_cmd_issue() argument
253 local = iface->local; in hfa384x_cmd_issue()
255 if (local->func->card_present && !local->func->card_present(local)) in hfa384x_cmd_issue()
256 return -ENODEV; in hfa384x_cmd_issue()
258 if (entry->issued) { in hfa384x_cmd_issue()
259 printk(KERN_DEBUG "%s: driver bug - re-issuing command @%p\n", in hfa384x_cmd_issue()
260 dev->name, entry); in hfa384x_cmd_issue()
267 tries--; in hfa384x_cmd_issue()
274 "for %d usec\n", dev->name, in hfa384x_cmd_issue()
275 HFA384X_CMD_BUSY_TIMEOUT - tries); in hfa384x_cmd_issue()
281 printk(KERN_DEBUG "%s: hfa384x_cmd_issue - timeout - " in hfa384x_cmd_issue()
282 "reg=0x%04x\n", dev->name, reg); in hfa384x_cmd_issue()
283 return -ETIMEDOUT; in hfa384x_cmd_issue()
287 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd_issue()
288 HFA384X_OUTW(entry->param0, HFA384X_PARAM0_OFF); in hfa384x_cmd_issue()
289 HFA384X_OUTW(entry->param1, HFA384X_PARAM1_OFF); in hfa384x_cmd_issue()
290 HFA384X_OUTW(entry->cmd, HFA384X_CMD_OFF); in hfa384x_cmd_issue()
291 entry->issued = 1; in hfa384x_cmd_issue()
292 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd_issue()
299 * hfa384x_cmd - Issue a Prism2 command and wait (sleep) for completion
317 struct hostap_cmd_queue *entry; in hfa384x_cmd() local
321 local = iface->local; in hfa384x_cmd()
323 if (local->cmd_queue_len >= HOSTAP_CMD_QUEUE_MAX_LEN) { in hfa384x_cmd()
325 dev->name); in hfa384x_cmd()
326 return -1; in hfa384x_cmd()
330 return -EINTR; in hfa384x_cmd()
332 entry = kzalloc(sizeof(*entry), GFP_ATOMIC); in hfa384x_cmd()
333 if (entry == NULL) in hfa384x_cmd()
334 return -ENOMEM; in hfa384x_cmd()
336 refcount_set(&entry->usecnt, 1); in hfa384x_cmd()
337 entry->type = CMD_SLEEP; in hfa384x_cmd()
338 entry->cmd = cmd; in hfa384x_cmd()
339 entry->param0 = param0; in hfa384x_cmd()
341 entry->param1 = *param1; in hfa384x_cmd()
342 init_waitqueue_head(&entry->compl); in hfa384x_cmd()
346 add_wait_queue(&entry->compl, &wait); in hfa384x_cmd()
349 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd()
350 issue = list_empty(&local->cmd_queue); in hfa384x_cmd()
352 entry->issuing = 1; in hfa384x_cmd()
353 list_add_tail(&entry->list, &local->cmd_queue); in hfa384x_cmd()
354 local->cmd_queue_len++; in hfa384x_cmd()
355 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd()
362 err = -EINTR; in hfa384x_cmd()
365 if (hfa384x_cmd_issue(dev, entry)) in hfa384x_cmd()
366 err = -ETIMEDOUT; in hfa384x_cmd()
372 if (!err && entry->type != CMD_COMPLETED) { in hfa384x_cmd()
376 res = -1; in hfa384x_cmd()
379 err = -EINTR; in hfa384x_cmd()
385 * of time to avoid removing entry from the list before in hfa384x_cmd()
391 remove_wait_queue(&entry->compl, &wait); in hfa384x_cmd()
393 /* If entry->list is still in the list, it must be removed in hfa384x_cmd()
400 * If the entry is not in the list prism2_cmd_ev() has a local in hfa384x_cmd()
404 /* FIX: if the entry->list is in the list, it has not been completed in hfa384x_cmd()
407 * dereference.. it would probably be better to leave the entry in the in hfa384x_cmd()
410 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd()
411 if (!list_empty(&entry->list)) { in hfa384x_cmd()
412 printk(KERN_DEBUG "%s: hfa384x_cmd: entry still in list? " in hfa384x_cmd()
413 "(entry=%p, type=%d, res=%d)\n", dev->name, entry, in hfa384x_cmd()
414 entry->type, res); in hfa384x_cmd()
415 list_del_init(&entry->list); in hfa384x_cmd()
416 local->cmd_queue_len--; in hfa384x_cmd()
418 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd()
422 dev->name, err); in hfa384x_cmd()
427 if (entry->type != CMD_COMPLETED) { in hfa384x_cmd()
430 "completed (res=%d, entry=%p, type=%d, cmd=0x%04x, " in hfa384x_cmd()
431 "param0=0x%04x, EVSTAT=%04x INTEN=%04x)\n", dev->name, in hfa384x_cmd()
432 res, entry, entry->type, entry->cmd, entry->param0, reg, in hfa384x_cmd()
436 * interrupt was not delivered - probably an issue in hfa384x_cmd()
437 * with pcmcia-cs configuration. */ in hfa384x_cmd()
439 "seem to work\n", dev->name); in hfa384x_cmd()
442 res = -ETIMEDOUT; in hfa384x_cmd()
447 *resp0 = entry->resp0; in hfa384x_cmd()
449 if (entry->res) { in hfa384x_cmd()
452 dev->name, cmd, entry->res, entry->resp0); in hfa384x_cmd()
456 res = entry->res; in hfa384x_cmd()
458 hostap_cmd_queue_free(local, entry, 1); in hfa384x_cmd()
464 * hfa384x_cmd_callback - Issue a Prism2 command; callback when completed
487 struct hostap_cmd_queue *entry; in hfa384x_cmd_callback() local
490 local = iface->local; in hfa384x_cmd_callback()
492 if (local->cmd_queue_len >= HOSTAP_CMD_QUEUE_MAX_LEN + 2) { in hfa384x_cmd_callback()
494 dev->name); in hfa384x_cmd_callback()
495 return -1; in hfa384x_cmd_callback()
498 entry = kzalloc(sizeof(*entry), GFP_ATOMIC); in hfa384x_cmd_callback()
499 if (entry == NULL) in hfa384x_cmd_callback()
500 return -ENOMEM; in hfa384x_cmd_callback()
502 refcount_set(&entry->usecnt, 1); in hfa384x_cmd_callback()
503 entry->type = CMD_CALLBACK; in hfa384x_cmd_callback()
504 entry->cmd = cmd; in hfa384x_cmd_callback()
505 entry->param0 = param0; in hfa384x_cmd_callback()
506 entry->callback = callback; in hfa384x_cmd_callback()
507 entry->context = context; in hfa384x_cmd_callback()
509 spin_lock_irqsave(&local->cmdlock, flags); in hfa384x_cmd_callback()
510 issue = list_empty(&local->cmd_queue); in hfa384x_cmd_callback()
512 entry->issuing = 1; in hfa384x_cmd_callback()
513 list_add_tail(&entry->list, &local->cmd_queue); in hfa384x_cmd_callback()
514 local->cmd_queue_len++; in hfa384x_cmd_callback()
515 spin_unlock_irqrestore(&local->cmdlock, flags); in hfa384x_cmd_callback()
517 if (issue && hfa384x_cmd_issue(dev, entry)) in hfa384x_cmd_callback()
518 ret = -ETIMEDOUT; in hfa384x_cmd_callback()
522 hostap_cmd_queue_free(local, entry, ret); in hfa384x_cmd_callback()
529 * __hfa384x_cmd_no_wait - Issue a Prism2 command (private)
547 tries--; in __hfa384x_cmd_no_wait()
553 printk(KERN_DEBUG "%s: __hfa384x_cmd_no_wait(%d) - timeout - " in __hfa384x_cmd_no_wait()
554 "reg=0x%04x\n", dev->name, io_debug_num, reg); in __hfa384x_cmd_no_wait()
555 return -ETIMEDOUT; in __hfa384x_cmd_no_wait()
567 * hfa384x_cmd_wait - Issue a Prism2 command and busy wait for completion
589 tries--; in hfa384x_cmd_wait()
595 printk(KERN_DEBUG "%s: hfa384x_cmd_wait - timeout2 - " in hfa384x_cmd_wait()
596 "reg=0x%04x\n", dev->name, reg); in hfa384x_cmd_wait()
597 return -ETIMEDOUT; in hfa384x_cmd_wait()
606 dev->name, cmd, res); in hfa384x_cmd_wait()
617 * hfa384x_cmd_no_wait - Issue a Prism2 command; do not wait for completion
630 * prism2_cmd_ev - Prism2 command completion event handler
643 struct hostap_cmd_queue *entry = NULL; in prism2_cmd_ev() local
646 local = iface->local; in prism2_cmd_ev()
648 spin_lock(&local->cmdlock); in prism2_cmd_ev()
649 if (!list_empty(&local->cmd_queue)) { in prism2_cmd_ev()
650 entry = list_entry(local->cmd_queue.next, in prism2_cmd_ev()
652 refcount_inc(&entry->usecnt); in prism2_cmd_ev()
653 list_del_init(&entry->list); in prism2_cmd_ev()
654 local->cmd_queue_len--; in prism2_cmd_ev()
656 if (!entry->issued) { in prism2_cmd_ev()
658 "cmd not issued\n", dev->name); in prism2_cmd_ev()
659 __hostap_cmd_queue_free(local, entry, 1); in prism2_cmd_ev()
660 entry = NULL; in prism2_cmd_ev()
663 spin_unlock(&local->cmdlock); in prism2_cmd_ev()
665 if (!entry) { in prism2_cmd_ev()
668 "pending commands\n", dev->name); in prism2_cmd_ev()
672 entry->resp0 = HFA384X_INW(HFA384X_RESP0_OFF); in prism2_cmd_ev()
673 entry->res = (HFA384X_INW(HFA384X_STATUS_OFF) & in prism2_cmd_ev()
679 if (entry->type == CMD_SLEEP) { in prism2_cmd_ev()
680 entry->type = CMD_COMPLETED; in prism2_cmd_ev()
681 wake_up_interruptible(&entry->compl); in prism2_cmd_ev()
682 } else if (entry->type == CMD_CALLBACK) { in prism2_cmd_ev()
683 if (entry->callback) in prism2_cmd_ev()
684 entry->callback(dev, entry->context, entry->resp0, in prism2_cmd_ev()
685 entry->res); in prism2_cmd_ev()
688 dev->name, entry->type); in prism2_cmd_ev()
690 hostap_cmd_queue_free(local, entry, 1); in prism2_cmd_ev()
693 entry = NULL; in prism2_cmd_ev()
694 spin_lock(&local->cmdlock); in prism2_cmd_ev()
695 if (!list_empty(&local->cmd_queue)) { in prism2_cmd_ev()
696 entry = list_entry(local->cmd_queue.next, in prism2_cmd_ev()
698 if (entry->issuing) { in prism2_cmd_ev()
701 entry = NULL; in prism2_cmd_ev()
703 if (entry) in prism2_cmd_ev()
704 refcount_inc(&entry->usecnt); in prism2_cmd_ev()
706 spin_unlock(&local->cmdlock); in prism2_cmd_ev()
708 if (entry) { in prism2_cmd_ev()
710 * entry from cmd_queue */ in prism2_cmd_ev()
711 int res = hfa384x_cmd_issue(dev, entry); in prism2_cmd_ev()
712 spin_lock(&local->cmdlock); in prism2_cmd_ev()
713 __hostap_cmd_queue_free(local, entry, res); in prism2_cmd_ev()
714 spin_unlock(&local->cmdlock); in prism2_cmd_ev()
725 tries--; in hfa384x_wait_offset()
741 return -EINVAL; in hfa384x_setup_bap()
753 printk(KERN_DEBUG "%s: hfa384x_setup_bap - timeout before\n", in hfa384x_setup_bap()
754 dev->name); in hfa384x_setup_bap()
755 ret = -ETIMEDOUT; in hfa384x_setup_bap()
764 printk(KERN_DEBUG "%s: hfa384x_setup_bap - timeout after\n", in hfa384x_setup_bap()
765 dev->name); in hfa384x_setup_bap()
766 ret = -ETIMEDOUT; in hfa384x_setup_bap()
772 printk(KERN_DEBUG "%s: hfa384x_setup_bap - offset error " in hfa384x_setup_bap()
774 dev->name, bap, id, offset, HFA384X_INW(o_off)); in hfa384x_setup_bap()
775 ret = -EINVAL; in hfa384x_setup_bap()
793 local = iface->local; in hfa384x_get_rid()
795 if (local->no_pri) { in hfa384x_get_rid()
796 printk(KERN_DEBUG "%s: cannot get RID %04x (len=%d) - no PRI " in hfa384x_get_rid()
797 "f/w\n", dev->name, rid, len); in hfa384x_get_rid()
798 return -ENOTTY; /* Well.. not really correct, but return in hfa384x_get_rid()
802 if ((local->func->card_present && !local->func->card_present(local)) || in hfa384x_get_rid()
803 local->hw_downloading) in hfa384x_get_rid()
804 return -ENODEV; in hfa384x_get_rid()
806 res = mutex_lock_interruptible(&local->rid_bap_mtx); in hfa384x_get_rid()
814 dev->name, res, rid, len); in hfa384x_get_rid()
815 mutex_unlock(&local->rid_bap_mtx); in hfa384x_get_rid()
819 spin_lock_bh(&local->baplock); in hfa384x_get_rid()
831 res = -ENODATA; in hfa384x_get_rid()
835 rlen = (le16_to_cpu(rec.len) - 1) * 2; in hfa384x_get_rid()
837 printk(KERN_DEBUG "%s: hfa384x_get_rid - RID len mismatch: " in hfa384x_get_rid()
839 dev->name, rid, rlen, len); in hfa384x_get_rid()
840 res = -ENODATA; in hfa384x_get_rid()
846 spin_unlock_bh(&local->baplock); in hfa384x_get_rid()
847 mutex_unlock(&local->rid_bap_mtx); in hfa384x_get_rid()
850 if (res != -ENODATA) in hfa384x_get_rid()
852 "len=%d) - failed - res=%d\n", dev->name, rid, in hfa384x_get_rid()
854 if (res == -ETIMEDOUT) in hfa384x_get_rid()
871 local = iface->local; in hfa384x_set_rid()
873 if (local->no_pri) { in hfa384x_set_rid()
874 printk(KERN_DEBUG "%s: cannot set RID %04x (len=%d) - no PRI " in hfa384x_set_rid()
875 "f/w\n", dev->name, rid, len); in hfa384x_set_rid()
876 return -ENOTTY; /* Well.. not really correct, but return in hfa384x_set_rid()
880 if ((local->func->card_present && !local->func->card_present(local)) || in hfa384x_set_rid()
881 local->hw_downloading) in hfa384x_set_rid()
882 return -ENODEV; in hfa384x_set_rid()
888 res = mutex_lock_interruptible(&local->rid_bap_mtx); in hfa384x_set_rid()
892 spin_lock_bh(&local->baplock); in hfa384x_set_rid()
898 spin_unlock_bh(&local->baplock); in hfa384x_set_rid()
901 printk(KERN_DEBUG "%s: hfa384x_set_rid (rid=%04x, len=%d) - " in hfa384x_set_rid()
902 "failed - res=%d\n", dev->name, rid, len, res); in hfa384x_set_rid()
903 mutex_unlock(&local->rid_bap_mtx); in hfa384x_set_rid()
908 mutex_unlock(&local->rid_bap_mtx); in hfa384x_set_rid()
913 dev->name, res, rid, len); in hfa384x_set_rid()
915 if (res == -ETIMEDOUT) in hfa384x_set_rid()
968 dev->name, len); in hfa384x_allocate_fid()
977 printk("%s: fid allocate, len=%d - timeout\n", dev->name, len); in hfa384x_allocate_fid()
995 local = iface->local; in prism2_reset_port()
997 if (!local->dev_enabled) in prism2_reset_port()
1004 dev->name); in prism2_reset_port()
1010 "port\n", dev->name); in prism2_reset_port()
1016 if (local->fragm_threshold != 2346 && in prism2_reset_port()
1018 local->fragm_threshold)) { in prism2_reset_port()
1021 dev->name, local->fragm_threshold); in prism2_reset_port()
1039 local = iface->local; in prism2_get_version_info()
1041 if (local->no_pri) { in prism2_get_version_info()
1042 /* PRI f/w not yet available - cannot read RIDs */ in prism2_get_version_info()
1043 return -1; in prism2_get_version_info()
1047 return -1; in prism2_get_version_info()
1050 printk(KERN_INFO "%s: %s: id=0x%02x v%d.%d.%d\n", dev->name, txt, in prism2_get_version_info()
1065 local = iface->local; in prism2_setup_rids()
1069 if (!local->fw_ap) { in prism2_setup_rids()
1074 dev->name, tmp1); in prism2_setup_rids()
1081 if (local->iw_mode != IW_MODE_MASTER || local->essid[0] != '\0') { in prism2_setup_rids()
1083 local->essid); in prism2_setup_rids()
1085 printk("%s: AP own SSID setting failed\n", dev->name); in prism2_setup_rids()
1094 dev->name, PRISM2_DATA_MAXLEN); in prism2_setup_rids()
1099 printk("%s: Channel list read failed\n", dev->name); in prism2_setup_rids()
1100 ret = -EINVAL; in prism2_setup_rids()
1103 local->channel_mask = le16_to_cpu(tmp); in prism2_setup_rids()
1105 if (local->channel < 1 || local->channel > 14 || in prism2_setup_rids()
1106 !(local->channel_mask & (1 << (local->channel - 1)))) { in prism2_setup_rids()
1108 "(%d)!\n", dev->name, local->channel); in prism2_setup_rids()
1109 ret = -EBUSY; in prism2_setup_rids()
1113 ret = hostap_set_word(dev, HFA384X_RID_CNFOWNCHANNEL, local->channel); in prism2_setup_rids()
1116 dev->name, local->channel); in prism2_setup_rids()
1121 local->beacon_int); in prism2_setup_rids()
1124 dev->name, local->beacon_int); in prism2_setup_rids()
1126 if (ret == -ETIMEDOUT) in prism2_setup_rids()
1131 local->dtim_period); in prism2_setup_rids()
1134 dev->name, local->dtim_period); in prism2_setup_rids()
1136 if (ret == -ETIMEDOUT) in prism2_setup_rids()
1141 local->is_promisc); in prism2_setup_rids()
1144 dev->name, local->is_promisc); in prism2_setup_rids()
1146 if (!local->fw_ap) { in prism2_setup_rids()
1148 local->essid); in prism2_setup_rids()
1150 printk("%s: Desired SSID setting failed\n", dev->name); in prism2_setup_rids()
1158 if (local->tx_rate_control == 0) { in prism2_setup_rids()
1159 local->tx_rate_control = in prism2_setup_rids()
1165 if (local->basic_rates == 0) in prism2_setup_rids()
1166 local->basic_rates = HFA384X_RATES_1MBPS | HFA384X_RATES_2MBPS; in prism2_setup_rids()
1168 if (!local->fw_ap) { in prism2_setup_rids()
1170 local->tx_rate_control); in prism2_setup_rids()
1173 dev->name, local->tx_rate_control); in prism2_setup_rids()
1178 local->tx_rate_control); in prism2_setup_rids()
1181 dev->name, local->tx_rate_control); in prism2_setup_rids()
1185 local->basic_rates); in prism2_setup_rids()
1188 dev->name, local->basic_rates); in prism2_setup_rids()
1194 dev->name); in prism2_setup_rids()
1198 if (local->name_set) in prism2_setup_rids()
1200 local->name); in prism2_setup_rids()
1204 dev->name); in prism2_setup_rids()
1211 dev->name); in prism2_setup_rids()
1214 if (local->sta_fw_ver >= PRISM2_FW_VER(1,6,3) && in prism2_setup_rids()
1215 hostap_set_word(dev, HFA384X_RID_CNFENHSECURITY, local->enh_sec)) in prism2_setup_rids()
1217 dev->name, local->enh_sec); in prism2_setup_rids()
1219 /* 32-bit tallies were added in STA f/w 0.8.0, but they were apparently in prism2_setup_rids()
1221 * This has been fixed in 0.8.2, so enable 32-bit tallies only in prism2_setup_rids()
1222 * beginning with that firmware version. Another bug fix for 32-bit in prism2_setup_rids()
1223 * tallies in 1.4.0; should 16-bit tallies be used for some other in prism2_setup_rids()
1225 if (local->sta_fw_ver >= PRISM2_FW_VER(0,8,2)) { in prism2_setup_rids()
1228 "failed\n", dev->name); in prism2_setup_rids()
1229 local->tallies32 = 0; in prism2_setup_rids()
1231 local->tallies32 = 1; in prism2_setup_rids()
1233 local->tallies32 = 0; in prism2_setup_rids()
1238 local->fragm_threshold)) { in prism2_setup_rids()
1240 "failed\n", dev->name, local->fragm_threshold); in prism2_setup_rids()
1244 local->rts_threshold)) { in prism2_setup_rids()
1246 dev->name, local->rts_threshold); in prism2_setup_rids()
1249 if (local->manual_retry_count >= 0 && in prism2_setup_rids()
1251 local->manual_retry_count)) { in prism2_setup_rids()
1253 dev->name, local->manual_retry_count); in prism2_setup_rids()
1256 if (local->sta_fw_ver >= PRISM2_FW_VER(1,3,1) && in prism2_setup_rids()
1258 local->rssi_to_dBm = le16_to_cpu(tmp); in prism2_setup_rids()
1261 if (local->sta_fw_ver >= PRISM2_FW_VER(1,7,0) && local->wpa && in prism2_setup_rids()
1264 dev->name); in prism2_setup_rids()
1267 if (local->sta_fw_ver >= PRISM2_FW_VER(1,7,0) && local->generic_elem && in prism2_setup_rids()
1269 local->generic_elem, local->generic_elem_len)) { in prism2_setup_rids()
1271 dev->name); in prism2_setup_rids()
1289 local = iface->local; in prism2_hw_init()
1291 clear_bit(HOSTAP_BITS_TRANSMIT, &local->bits); in prism2_hw_init()
1297 printk(KERN_INFO "%s: first command failed - assuming card " in prism2_hw_init()
1305 printk(KERN_DEBUG "%s: init command completed too quickly - " in prism2_hw_init()
1306 "retrying\n", dev->name); in prism2_hw_init()
1318 "flash - card initialization not completed\n", in prism2_hw_init()
1320 local->no_pri = 1; in prism2_hw_init()
1322 if (local->sram_type == -1) in prism2_hw_init()
1323 local->sram_type = prism2_get_ram_size(local); in prism2_hw_init()
1327 local->no_pri = 0; in prism2_hw_init()
1329 (jiffies - start) * 1000 / HZ); in prism2_hw_init()
1342 local = iface->local; in prism2_hw_init2()
1345 kfree(local->pda); in prism2_hw_init2()
1346 if (local->no_pri) in prism2_hw_init2()
1347 local->pda = NULL; in prism2_hw_init2()
1349 local->pda = prism2_read_pda(dev); in prism2_hw_init2()
1363 if (initial || local->pri_only) { in prism2_hw_init2()
1374 "- only Primary f/w present\n", dev->name); in prism2_hw_init2()
1375 local->pri_only = 1; in prism2_hw_init2()
1378 local->pri_only = 0; in prism2_hw_init2()
1387 local->txfid_len = PRISM2_TXFID_LEN; in prism2_hw_init2()
1389 local->txfid[i] = hfa384x_allocate_fid(dev, local->txfid_len); in prism2_hw_init2()
1390 if (local->txfid[i] == 0xffff && local->txfid_len > 1600) { in prism2_hw_init2()
1391 local->txfid[i] = hfa384x_allocate_fid(dev, 1600); in prism2_hw_init2()
1392 if (local->txfid[i] != 0xffff) { in prism2_hw_init2()
1394 "(1600 bytes)\n", dev->name); in prism2_hw_init2()
1395 local->txfid_len = 1600; in prism2_hw_init2()
1398 if (local->txfid[i] == 0xffff) in prism2_hw_init2()
1400 local->intransmitfid[i] = PRISM2_TXFID_EMPTY; in prism2_hw_init2()
1410 dev->dev_addr, 6, 1) < 0) { in prism2_hw_init2()
1412 dev->name); in prism2_hw_init2()
1414 list_for_each(ptr, &local->hostap_interfaces) { in prism2_hw_init2()
1416 eth_hw_addr_inherit(iface->dev, dev); in prism2_hw_init2()
1418 } else if (local->fw_ap) in prism2_hw_init2()
1427 if (!local->no_pri) in prism2_hw_init2()
1440 local = iface->local; in prism2_hw_enable()
1441 was_resetting = local->hw_resetting; in prism2_hw_enable()
1444 printk("%s: MAC port 0 enabling failed\n", dev->name); in prism2_hw_enable()
1448 local->hw_ready = 1; in prism2_hw_enable()
1449 local->hw_reset_tries = 0; in prism2_hw_enable()
1450 local->hw_resetting = 0; in prism2_hw_enable()
1453 /* at least D-Link DWL-650 seems to require additional port reset in prism2_hw_enable()
1457 printk("%s: MAC port 0 resetting failed\n", dev->name); in prism2_hw_enable()
1478 local = iface->local; in prism2_hw_config()
1480 if (local->hw_downloading) in prism2_hw_config()
1484 return local->no_pri ? 0 : 1; in prism2_hw_config()
1492 if (!local->pri_only && in prism2_hw_config()
1493 (initial == 0 || (initial == 2 && local->num_dev_open > 0))) { in prism2_hw_config()
1494 if (!local->dev_enabled) in prism2_hw_config()
1496 local->dev_enabled = 1; in prism2_hw_config()
1510 local = iface->local; in prism2_hw_shutdown()
1515 local->hw_ready = 0; in prism2_hw_shutdown()
1516 if (local->dev_enabled) in prism2_hw_shutdown()
1518 local->dev_enabled = 0; in prism2_hw_shutdown()
1520 if (local->func->card_present && !local->func->card_present(local)) { in prism2_hw_shutdown()
1522 "during shutdown\n", dev->name); in prism2_hw_shutdown()
1555 local = iface->local; in prism2_hw_reset()
1557 if (local->hw_downloading) in prism2_hw_reset()
1560 if (local->hw_resetting) { in prism2_hw_reset()
1561 printk(KERN_WARNING "%s: %s: already resetting card - " in prism2_hw_reset()
1562 "ignoring reset request\n", dev_info, dev->name); in prism2_hw_reset()
1566 local->hw_reset_tries++; in prism2_hw_reset()
1567 if (local->hw_reset_tries > 10) { in prism2_hw_reset()
1569 dev->name); in prism2_hw_reset()
1573 printk(KERN_WARNING "%s: %s: resetting card\n", dev_info, dev->name); in prism2_hw_reset()
1575 local->hw_resetting = 1; in prism2_hw_reset()
1576 if (local->func->cor_sreset) { in prism2_hw_reset()
1583 disable_irq(dev->irq); in prism2_hw_reset()
1584 local->func->cor_sreset(local); in prism2_hw_reset()
1585 enable_irq(dev->irq); in prism2_hw_reset()
1589 local->hw_resetting = 0; in prism2_hw_reset()
1592 if (local->dl_pri) { in prism2_hw_reset()
1594 "firmware\n", dev->name); in prism2_hw_reset()
1595 if (prism2_download_genesis(local, local->dl_pri) < 0) in prism2_hw_reset()
1597 dev->name); in prism2_hw_reset()
1600 if (local->dl_sec) { in prism2_hw_reset()
1602 "firmware\n", dev->name); in prism2_hw_reset()
1603 if (prism2_download_volatile(local, local->dl_sec) < 0) in prism2_hw_reset()
1605 dev->name); in prism2_hw_reset()
1615 schedule_work(&local->reset_queue); in prism2_schedule_reset()
1625 printk(KERN_DEBUG "%s: scheduled card reset\n", local->dev->name); in handle_reset_queue()
1626 prism2_hw_reset(local->dev); in handle_reset_queue()
1628 if (netif_queue_stopped(local->dev)) { in handle_reset_queue()
1632 if (local->intransmitfid[i] == PRISM2_TXFID_EMPTY) { in handle_reset_queue()
1635 netif_wake_queue(local->dev); in handle_reset_queue()
1647 spin_lock_irqsave(&local->txfidlock, flags); in prism2_get_txfid_idx()
1648 end = idx = local->next_txfid; in prism2_get_txfid_idx()
1650 if (local->intransmitfid[idx] == PRISM2_TXFID_EMPTY) { in prism2_get_txfid_idx()
1651 local->intransmitfid[idx] = PRISM2_TXFID_RESERVED; in prism2_get_txfid_idx()
1652 spin_unlock_irqrestore(&local->txfidlock, flags); in prism2_get_txfid_idx()
1659 spin_unlock_irqrestore(&local->txfidlock, flags); in prism2_get_txfid_idx()
1663 local->dev->stats.tx_dropped++; in prism2_get_txfid_idx()
1665 return -1; in prism2_get_txfid_idx()
1678 local = iface->local; in prism2_transmit_cb()
1681 printk(KERN_DEBUG "%s: prism2_transmit_cb - res=0x%02x\n", in prism2_transmit_cb()
1682 dev->name, res); in prism2_transmit_cb()
1688 "idx=%d\n", dev->name, idx); in prism2_transmit_cb()
1692 if (!test_and_clear_bit(HOSTAP_BITS_TRANSMIT, &local->bits)) { in prism2_transmit_cb()
1694 "with no pending transmit\n", dev->name); in prism2_transmit_cb()
1703 spin_lock(&local->txfidlock); in prism2_transmit_cb()
1707 local->intransmitfid[idx] = resp0; in prism2_transmit_cb()
1711 dev->name, idx, local->txfid[idx], in prism2_transmit_cb()
1712 resp0, local->intransmitfid[local->next_txfid]); in prism2_transmit_cb()
1717 local->next_txfid = idx; in prism2_transmit_cb()
1721 if (local->intransmitfid[idx] == PRISM2_TXFID_EMPTY) { in prism2_transmit_cb()
1722 spin_unlock(&local->txfidlock); in prism2_transmit_cb()
1728 } while (idx != local->next_txfid); in prism2_transmit_cb()
1729 spin_unlock(&local->txfidlock); in prism2_transmit_cb()
1745 local = iface->local; in prism2_transmit()
1751 if (test_and_set_bit(HOSTAP_BITS_TRANSMIT, &local->bits)) { in prism2_transmit()
1752 printk(KERN_DEBUG "%s: driver bug - prism2_transmit() called " in prism2_transmit()
1753 "when previous TX was pending\n", dev->name); in prism2_transmit()
1754 return -1; in prism2_transmit()
1764 local->txfid[idx], in prism2_transmit()
1769 "failed (res=%d)\n", dev->name, res); in prism2_transmit()
1770 dev->stats.tx_dropped++; in prism2_transmit()
1772 return -1; in prism2_transmit()
1793 int hdr_len, data_len, idx, res, ret = -1; in prism2_tx_80211()
1797 local = iface->local; in prism2_tx_80211()
1799 meta = (struct hostap_skb_tx_data *) skb->cb; in prism2_tx_80211()
1803 if ((local->func->card_present && !local->func->card_present(local)) || in prism2_tx_80211()
1804 !local->hw_ready || local->hw_downloading || local->pri_only) { in prism2_tx_80211()
1806 printk(KERN_DEBUG "%s: prism2_tx_80211: hw not ready -" in prism2_tx_80211()
1807 " skipping\n", dev->name); in prism2_tx_80211()
1814 /* skb->data starts with txdesc->frame_control */ in prism2_tx_80211()
1819 skb->len >= 30) { in prism2_tx_80211()
1826 tx_control = local->tx_control; in prism2_tx_80211()
1827 if (meta->tx_cb_idx) { in prism2_tx_80211()
1829 txdesc.sw_support = cpu_to_le32(meta->tx_cb_idx); in prism2_tx_80211()
1832 txdesc.tx_rate = meta->rate; in prism2_tx_80211()
1834 data_len = skb->len - hdr_len; in prism2_tx_80211()
1842 if (local->frame_dump & PRISM2_DUMP_TX_HDR) in prism2_tx_80211()
1843 hostap_dump_tx_header(dev->name, &txdesc); in prism2_tx_80211()
1845 spin_lock(&local->baplock); in prism2_tx_80211()
1846 res = hfa384x_setup_bap(dev, BAP0, local->txfid[idx], 0); in prism2_tx_80211()
1851 res = hfa384x_to_bap(dev, BAP0, skb->data + hdr_len, in prism2_tx_80211()
1852 skb->len - hdr_len); in prism2_tx_80211()
1853 spin_unlock(&local->baplock); in prism2_tx_80211()
1858 printk(KERN_DEBUG "%s: prism2_tx_80211 - to BAP0 failed\n", in prism2_tx_80211()
1859 dev->name); in prism2_tx_80211()
1860 local->intransmitfid[idx] = PRISM2_TXFID_EMPTY; in prism2_tx_80211()
1861 schedule_work(&local->reset_queue); in prism2_tx_80211()
1896 dev->name, i, reg, val, val2, val3); in prism2_read_fid_reg()
1903 "%04x (%04x %04x %04x)\n", dev->name, reg, val, val2, val3); in prism2_read_fid_reg()
1914 struct net_device *dev = local->dev; in prism2_rx()
1929 schedule_work(&local->reset_queue); in prism2_rx()
1936 spin_lock(&local->baplock); in prism2_rx()
1942 spin_unlock(&local->baplock); in prism2_rx()
1943 printk(KERN_DEBUG "%s: copy from BAP0 failed %d\n", dev->name, in prism2_rx()
1945 if (res == -ETIMEDOUT) { in prism2_rx()
1946 schedule_work(&local->reset_queue); in prism2_rx()
1958 * negative value, so allow also values 65522 .. 65534 (-14 .. -2) for in prism2_rx()
1961 if (macport == 7 && local->iw_mode == IW_MODE_MONITOR) { in prism2_rx()
1962 if (len >= (u16) -14) { in prism2_rx()
1963 hdr_len -= 65535 - len; in prism2_rx()
1964 hdr_len--; in prism2_rx()
1968 spin_unlock(&local->baplock); in prism2_rx()
1970 "length 0x%04x\n", dev->name, len); in prism2_rx()
1971 hostap_dump_rx_header(dev->name, &rxdesc); in prism2_rx()
1978 spin_unlock(&local->baplock); in prism2_rx()
1980 dev->name); in prism2_rx()
1983 skb->dev = dev; in prism2_rx()
1988 spin_unlock(&local->baplock); in prism2_rx()
1991 "frame data\n", dev->name); in prism2_rx()
1995 skb_queue_tail(&local->rx_list, skb); in prism2_rx()
1996 tasklet_schedule(&local->rx_tasklet); in prism2_rx()
2007 dev->stats.rx_dropped++; in prism2_rx()
2018 struct net_device *dev = skb->dev; in hostap_rx_skb()
2023 if (skb->len < sizeof(*rxdesc)) { in hostap_rx_skb()
2025 if (local->iw_mode == IW_MODE_MONITOR && in hostap_rx_skb()
2026 skb->len >= sizeof(*rxdesc) - 30) { in hostap_rx_skb()
2027 rx_hdrlen = skb->len; in hostap_rx_skb()
2034 rxdesc = (struct hfa384x_rx_frame *) skb->data; in hostap_rx_skb()
2036 if (local->frame_dump & PRISM2_DUMP_RX_HDR && in hostap_rx_skb()
2037 skb->len >= sizeof(*rxdesc)) in hostap_rx_skb()
2038 hostap_dump_rx_header(dev->name, rxdesc); in hostap_rx_skb()
2040 if (le16_to_cpu(rxdesc->status) & HFA384X_RX_STATUS_FCSERR && in hostap_rx_skb()
2041 (!local->monitor_allow_fcserr || in hostap_rx_skb()
2042 local->iw_mode != IW_MODE_MONITOR)) in hostap_rx_skb()
2045 if (skb->len > PRISM2_DATA_MAXLEN) { in hostap_rx_skb()
2047 dev->name, skb->len, PRISM2_DATA_MAXLEN); in hostap_rx_skb()
2051 stats.mac_time = le32_to_cpu(rxdesc->time); in hostap_rx_skb()
2052 stats.signal = rxdesc->signal - local->rssi_to_dBm; in hostap_rx_skb()
2053 stats.noise = rxdesc->silence - local->rssi_to_dBm; in hostap_rx_skb()
2054 stats.rate = rxdesc->rate; in hostap_rx_skb()
2057 hdrlen = hostap_80211_get_hdrlen(rxdesc->frame_control); in hostap_rx_skb()
2061 memmove(skb_pull(skb, rx_hdrlen - hdrlen), in hostap_rx_skb()
2062 &rxdesc->frame_control, hdrlen); in hostap_rx_skb()
2078 while ((skb = skb_dequeue(&local->rx_list)) != NULL) in hostap_rx_tasklet()
2092 local = iface->local; in prism2_alloc_ev()
2096 PDEBUG(DEBUG_FID, "FID: interrupt: ALLOC - fid=0x%04x\n", fid); in prism2_alloc_ev()
2098 spin_lock(&local->txfidlock); in prism2_alloc_ev()
2099 idx = local->next_alloc; in prism2_alloc_ev()
2102 if (local->txfid[idx] == fid) { in prism2_alloc_ev()
2107 if (local->intransmitfid[idx] == PRISM2_TXFID_EMPTY) in prism2_alloc_ev()
2110 if (local->intransmitfid[idx] == PRISM2_TXFID_RESERVED) in prism2_alloc_ev()
2114 local->intransmitfid[idx] = PRISM2_TXFID_EMPTY; in prism2_alloc_ev()
2116 local->next_alloc = idx >= PRISM2_TXFID_COUNT ? 0 : in prism2_alloc_ev()
2119 if (!test_bit(HOSTAP_BITS_TRANSMIT, &local->bits) && in prism2_alloc_ev()
2123 spin_unlock(&local->txfidlock); in prism2_alloc_ev()
2130 } while (idx != local->next_alloc); in prism2_alloc_ev()
2133 "read 0x%04x) for alloc event\n", dev->name, fid, in prism2_alloc_ev()
2137 printk(" %04x[%04x]", local->txfid[idx], in prism2_alloc_ev()
2138 local->intransmitfid[idx]); in prism2_alloc_ev()
2140 spin_unlock(&local->txfidlock); in prism2_alloc_ev()
2159 if (!ether_addr_equal(txdesc->addr2, local->dev->dev_addr)) { in hostap_tx_callback()
2160 printk(KERN_DEBUG "%s: TX callback - foreign frame\n", in hostap_tx_callback()
2161 local->dev->name); in hostap_tx_callback()
2165 sw_support = le32_to_cpu(txdesc->sw_support); in hostap_tx_callback()
2167 spin_lock(&local->lock); in hostap_tx_callback()
2168 cb = local->tx_callback; in hostap_tx_callback()
2169 while (cb != NULL && cb->idx != sw_support) in hostap_tx_callback()
2170 cb = cb->next; in hostap_tx_callback()
2171 spin_unlock(&local->lock); in hostap_tx_callback()
2175 local->dev->name, sw_support); in hostap_tx_callback()
2179 hdrlen = hostap_80211_get_hdrlen(txdesc->frame_control); in hostap_tx_callback()
2180 len = le16_to_cpu(txdesc->data_len); in hostap_tx_callback()
2184 "skb\n", local->dev->name); in hostap_tx_callback()
2188 skb_put_data(skb, (void *)&txdesc->frame_control, hdrlen); in hostap_tx_callback()
2192 skb->dev = local->dev; in hostap_tx_callback()
2195 cb->func(skb, ok, cb->data); in hostap_tx_callback()
2206 struct net_device *dev = local->dev; in hostap_tx_compl_read()
2210 PDEBUG(DEBUG_FID, "interrupt: TX (err=%d) - fid=0x%04x\n", fid, error); in hostap_tx_compl_read()
2212 spin_lock(&local->baplock); in hostap_tx_compl_read()
2217 PDEBUG(DEBUG_EXTRA, "%s: TX (err=%d) - fid=0x%04x - could not " in hostap_tx_compl_read()
2218 "read txdesc\n", dev->name, error, fid); in hostap_tx_compl_read()
2219 if (res == -ETIMEDOUT) { in hostap_tx_compl_read()
2220 schedule_work(&local->reset_queue); in hostap_tx_compl_read()
2222 ret = -1; in hostap_tx_compl_read()
2225 if (txdesc->sw_support) { in hostap_tx_compl_read()
2226 len = le16_to_cpu(txdesc->data_len); in hostap_tx_compl_read()
2232 "frame payload\n", dev->name); in hostap_tx_compl_read()
2235 ret = -1; in hostap_tx_compl_read()
2242 spin_unlock(&local->baplock); in hostap_tx_compl_read()
2251 struct net_device *dev = local->dev; in prism2_tx_ev()
2258 if (local->frame_dump & PRISM2_DUMP_TX_HDR) { in prism2_tx_ev()
2259 PDEBUG(DEBUG_EXTRA, "%s: TX - status=0x%04x " in prism2_tx_ev()
2262 dev->name, le16_to_cpu(txdesc.status), in prism2_tx_ev()
2283 while ((skb = skb_dequeue(&local->sta_tx_exc_list)) != NULL) { in hostap_sta_tx_exc_tasklet()
2285 (struct hfa384x_tx_frame *) skb->data; in hostap_sta_tx_exc_tasklet()
2287 if (skb->len >= sizeof(*txdesc)) { in hostap_sta_tx_exc_tasklet()
2290 int hdrlen = hostap_80211_get_hdrlen(txdesc->frame_control); in hostap_sta_tx_exc_tasklet()
2291 memmove(skb_pull(skb, sizeof(*txdesc) - hdrlen), in hostap_sta_tx_exc_tasklet()
2292 &txdesc->frame_control, hdrlen); in hostap_sta_tx_exc_tasklet()
2304 struct net_device *dev = local->dev; in prism2_txexc()
2310 show_dump = local->frame_dump & PRISM2_DUMP_TXEXC_HDR; in prism2_txexc()
2311 dev->stats.tx_errors++; in prism2_txexc()
2323 * Other errors means that *we* screwed up. - Jean II */ in prism2_txexc()
2335 if (local->iw_mode == IW_MODE_MASTER || in prism2_txexc()
2336 local->iw_mode == IW_MODE_REPEAT || in prism2_txexc()
2337 local->wds_type & HOSTAP_WDS_AP_CLIENT) { in prism2_txexc()
2342 skb_queue_tail(&local->sta_tx_exc_list, skb); in prism2_txexc()
2343 tasklet_schedule(&local->sta_tx_exc_tasklet); in prism2_txexc()
2354 PDEBUG(DEBUG_EXTRA, "%s: TXEXC - status=0x%04x (%s%s%s%s)" in prism2_txexc()
2356 dev->name, status, in prism2_txexc()
2385 while ((skb = skb_dequeue(&local->info_list)) != NULL) { in hostap_info_tasklet()
2395 struct net_device *dev = local->dev; in prism2_info()
2403 spin_lock(&local->baplock); in prism2_info()
2408 spin_unlock(&local->baplock); in prism2_info()
2411 if (res == -ETIMEDOUT) { in prism2_info()
2412 schedule_work(&local->reset_queue); in prism2_info()
2417 left = (le16_to_cpu(info.len) - 1) * 2; in prism2_info()
2423 spin_unlock(&local->baplock); in prism2_info()
2425 "length 0x%04x (type 0x%04x)\n", dev->name, in prism2_info()
2432 spin_unlock(&local->baplock); in prism2_info()
2434 "frame\n", dev->name); in prism2_info()
2441 spin_unlock(&local->baplock); in prism2_info()
2443 "len=0x%04x, type=0x%04x\n", dev->name, fid, in prism2_info()
2448 spin_unlock(&local->baplock); in prism2_info()
2450 skb_queue_tail(&local->info_list, skb); in prism2_info()
2451 tasklet_schedule(&local->info_tasklet); in prism2_info()
2462 struct net_device *dev = local->dev; in hostap_bap_tasklet()
2466 if (local->func->card_present && !local->func->card_present(local)) in hostap_bap_tasklet()
2469 set_bit(HOSTAP_BITS_BAP_TASKLET, &local->bits); in hostap_bap_tasklet()
2473 while (frames-- > 0) { in hostap_bap_tasklet()
2487 set_bit(HOSTAP_BITS_BAP_TASKLET2, &local->bits); in hostap_bap_tasklet()
2488 clear_bit(HOSTAP_BITS_BAP_TASKLET, &local->bits); in hostap_bap_tasklet()
2492 clear_bit(HOSTAP_BITS_BAP_TASKLET2, &local->bits); in hostap_bap_tasklet()
2501 PDEBUG(DEBUG_EXTRA, "%s: INFDROP event\n", dev->name); in prism2_infdrop()
2525 local = iface->local; in prism2_ev_tick()
2527 if (time_after(jiffies, local->last_tick_timer + 5 * HZ) && in prism2_ev_tick()
2528 local->last_tick_timer) { in prism2_ev_tick()
2534 dev->name, local->bits, evstat, inten); in prism2_ev_tick()
2536 local->sw_tick_stuck++; in prism2_ev_tick()
2540 "hang\n", dev->name); in prism2_ev_tick()
2553 * return 0x0000 in SWSUPPORT0 for unknown reason, but re-reading the in prism2_check_magic()
2561 struct net_device *dev = local->dev; in prism2_check_magic()
2564 if (!local->hw_ready) in prism2_check_magic()
2569 "%04X != %04X - card removed?\n", dev->name, in prism2_check_magic()
2574 printk(KERN_DEBUG "%s: interrupt - SWSUPPORT0=%04x " in prism2_check_magic()
2575 "MAGIC=%04x\n", dev->name, in prism2_check_magic()
2580 schedule_work(&local->reset_queue); in prism2_check_magic()
2598 local = iface->local; in prism2_interrupt()
2601 spin_lock(&local->irq_init_lock); in prism2_interrupt()
2602 if (!dev->base_addr) { in prism2_interrupt()
2605 dev->name); in prism2_interrupt()
2607 spin_unlock(&local->irq_init_lock); in prism2_interrupt()
2610 spin_unlock(&local->irq_init_lock); in prism2_interrupt()
2614 if (local->func->card_present && !local->func->card_present(local)) { in prism2_interrupt()
2617 dev->name); in prism2_interrupt()
2627 if (local->shutdown) in prism2_interrupt()
2631 dev->name); in prism2_interrupt()
2647 if (!local->hw_ready || local->hw_resetting || in prism2_interrupt()
2648 !local->dev_enabled) { in prism2_interrupt()
2654 if (local->dev_enabled && (ev & ~HFA384X_EV_TICK) && in prism2_interrupt()
2659 dev->name, ev, in prism2_interrupt()
2661 !local->hw_ready ? " (!hw_ready)" : "", in prism2_interrupt()
2662 local->hw_resetting ? in prism2_interrupt()
2664 !local->dev_enabled ? in prism2_interrupt()
2686 tasklet_schedule(&local->bap_tasklet); in prism2_interrupt()
2691 PDEBUG(DEBUG_EXTRA, "%s: WTERR event\n", dev->name); in prism2_interrupt()
2721 if (hfa384x_get_rid(local->dev, HFA384X_RID_STAID, in prism2_check_sta_fw_version()
2725 local->fw_ap = 0; in prism2_check_sta_fw_version()
2729 local->fw_ap = 1; in prism2_check_sta_fw_version()
2736 local->sta_fw_ver = PRISM2_FW_VER(major, minor, variant); in prism2_check_sta_fw_version()
2739 * firmware-based WEP encryption when using Host AP mode, so use in prism2_check_sta_fw_version()
2744 local->fw_encrypt_ok = local->sta_fw_ver >= PRISM2_FW_VER(1,4,9); in prism2_check_sta_fw_version()
2746 if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt && in prism2_check_sta_fw_version()
2747 !local->fw_encrypt_ok) { in prism2_check_sta_fw_version()
2748 printk(KERN_DEBUG "%s: defaulting to host-based encryption as " in prism2_check_sta_fw_version()
2750 local->dev->name); in prism2_check_sta_fw_version()
2751 local->host_encrypt = 1; in prism2_check_sta_fw_version()
2761 if (local->sta_fw_ver >= PRISM2_FW_VER(1,5,0)) in prism2_check_sta_fw_version()
2762 local->wds_type |= HOSTAP_WDS_STANDARD_FRAME; in prism2_check_sta_fw_version()
2766 local->dev->name); in prism2_check_sta_fw_version()
2769 hostap_check_sta_fw_version(local->ap, local->sta_fw_ver); in prism2_check_sta_fw_version()
2776 struct net_device *dev = local->dev; in hostap_passive_scan()
2779 if (local->passive_scan_interval <= 0) in hostap_passive_scan()
2782 if (local->passive_scan_state == PASSIVE_SCAN_LISTEN) { in hostap_passive_scan()
2787 * passive scanning when a host-generated frame is being in hostap_passive_scan()
2789 if (test_bit(HOSTAP_BITS_TRANSMIT, &local->bits)) { in hostap_passive_scan()
2791 "TX - delaying\n", dev->name); in hostap_passive_scan()
2792 local->passive_scan_timer.expires = jiffies + HZ / 10; in hostap_passive_scan()
2793 add_timer(&local->passive_scan_timer); in hostap_passive_scan()
2798 local->passive_scan_channel++; in hostap_passive_scan()
2799 if (local->passive_scan_channel > 14) in hostap_passive_scan()
2800 local->passive_scan_channel = 1; in hostap_passive_scan()
2801 max_tries--; in hostap_passive_scan()
2802 } while (!(local->channel_mask & in hostap_passive_scan()
2803 (1 << (local->passive_scan_channel - 1))) && in hostap_passive_scan()
2808 " found\n", dev->name); in hostap_passive_scan()
2813 dev->name, local->passive_scan_channel); in hostap_passive_scan()
2814 chan = local->passive_scan_channel; in hostap_passive_scan()
2815 local->passive_scan_state = PASSIVE_SCAN_WAIT; in hostap_passive_scan()
2816 local->passive_scan_timer.expires = jiffies + HZ / 10; in hostap_passive_scan()
2818 chan = local->channel; in hostap_passive_scan()
2819 local->passive_scan_state = PASSIVE_SCAN_LISTEN; in hostap_passive_scan()
2820 local->passive_scan_timer.expires = jiffies + in hostap_passive_scan()
2821 local->passive_scan_interval * HZ; in hostap_passive_scan()
2828 "failed\n", dev->name, chan); in hostap_passive_scan()
2830 add_timer(&local->passive_scan_timer); in hostap_passive_scan()
2840 prism2_update_comms_qual(local->dev); in handle_comms_qual_update()
2844 /* Software watchdog - called as a timer. Hardware interrupt (Tick event) is
2845 * used to monitor that local->last_tick_timer is being updated. If not,
2846 * interrupt busy-loop is assumed and driver tries to recover by masking out
2852 local->last_tick_timer = jiffies; in hostap_tick_timer()
2855 * more often during low load and when using 32-bit tallies. */ in hostap_tick_timer()
2857 !local->hw_downloading && local->hw_ready && in hostap_tick_timer()
2858 !local->hw_resetting && local->dev_enabled) { in hostap_tick_timer()
2859 hfa384x_cmd_callback(local->dev, HFA384X_CMDCODE_INQUIRE, in hostap_tick_timer()
2864 if ((local->last_comms_qual_update == 0 || in hostap_tick_timer()
2865 time_after(jiffies, local->last_comms_qual_update + 10 * HZ)) && in hostap_tick_timer()
2866 (local->iw_mode == IW_MODE_INFRA || in hostap_tick_timer()
2867 local->iw_mode == IW_MODE_ADHOC)) { in hostap_tick_timer()
2868 schedule_work(&local->comms_qual_update); in hostap_tick_timer()
2871 local->tick_timer.expires = jiffies + 2 * HZ; in hostap_tick_timer()
2872 add_timer(&local->tick_timer); in hostap_tick_timer()
2884 local_info_t *local = m->private; in prism2_registers_proc_show()
2887 seq_printf(m, #n "=%04x\n", hfa384x_read_reg(local->dev, HFA384X_##n##_OFF)) in prism2_registers_proc_show()
2951 local = iface->local; in prism2_set_tim()
2955 return -ENOMEM; in prism2_set_tim()
2957 new_entry->aid = aid; in prism2_set_tim()
2958 new_entry->set = set; in prism2_set_tim()
2960 spin_lock_bh(&local->set_tim_lock); in prism2_set_tim()
2961 list_for_each(ptr, &local->set_tim_list) { in prism2_set_tim()
2962 struct set_tim_data *entry = in prism2_set_tim() local
2964 if (entry->aid == aid) { in prism2_set_tim()
2967 local->dev->name, aid, entry->set, set); in prism2_set_tim()
2968 entry->set = set; in prism2_set_tim()
2975 list_add_tail(&new_entry->list, &local->set_tim_list); in prism2_set_tim()
2976 spin_unlock_bh(&local->set_tim_lock); in prism2_set_tim()
2978 schedule_work(&local->set_tim_queue); in prism2_set_tim()
2987 struct set_tim_data *entry; in handle_set_tim_queue() local
2991 entry = NULL; in handle_set_tim_queue()
2992 spin_lock_bh(&local->set_tim_lock); in handle_set_tim_queue()
2993 if (!list_empty(&local->set_tim_list)) { in handle_set_tim_queue()
2994 entry = list_entry(local->set_tim_list.next, in handle_set_tim_queue()
2996 list_del(&entry->list); in handle_set_tim_queue()
2998 spin_unlock_bh(&local->set_tim_lock); in handle_set_tim_queue()
2999 if (!entry) in handle_set_tim_queue()
3003 local->dev->name, entry->aid, entry->set); in handle_set_tim_queue()
3005 val = entry->aid; in handle_set_tim_queue()
3006 if (entry->set) in handle_set_tim_queue()
3008 if (hostap_set_word(local->dev, HFA384X_RID_CNFTIMCTRL, val)) { in handle_set_tim_queue()
3011 local->dev->name, entry->aid, entry->set); in handle_set_tim_queue()
3014 kfree(entry); in handle_set_tim_queue()
3023 list_for_each_safe(ptr, n, &local->set_tim_list) { in prism2_clear_set_tim_queue()
3024 struct set_tim_data *entry; in prism2_clear_set_tim_queue() local
3025 entry = list_entry(ptr, struct set_tim_data, list); in prism2_clear_set_tim_queue()
3026 list_del(&entry->list); in prism2_clear_set_tim_queue()
3027 kfree(entry); in prism2_clear_set_tim_queue()
3044 lockdep_set_class(&txq->_xmit_lock, in prism2_set_lockdep_class_one()
3050 lockdep_set_class(&dev->addr_list_lock, in prism2_set_lockdep_class()
3084 local->ap = (struct ap_data *) ((((long) (local + 1)) + 3) & ~3); in prism2_init_local_data()
3085 local->dev = iface->dev = dev; in prism2_init_local_data()
3086 iface->local = local; in prism2_init_local_data()
3087 iface->type = HOSTAP_INTERFACE_MASTER; in prism2_init_local_data()
3088 INIT_LIST_HEAD(&local->hostap_interfaces); in prism2_init_local_data()
3090 local->hw_module = THIS_MODULE; in prism2_init_local_data()
3093 local->io_debug_enabled = 1; in prism2_init_local_data()
3096 local->func = funcs; in prism2_init_local_data()
3097 local->func->cmd = hfa384x_cmd; in prism2_init_local_data()
3098 local->func->read_regs = hfa384x_read_regs; in prism2_init_local_data()
3099 local->func->get_rid = hfa384x_get_rid; in prism2_init_local_data()
3100 local->func->set_rid = hfa384x_set_rid; in prism2_init_local_data()
3101 local->func->hw_enable = prism2_hw_enable; in prism2_init_local_data()
3102 local->func->hw_config = prism2_hw_config; in prism2_init_local_data()
3103 local->func->hw_reset = prism2_hw_reset; in prism2_init_local_data()
3104 local->func->hw_shutdown = prism2_hw_shutdown; in prism2_init_local_data()
3105 local->func->reset_port = prism2_reset_port; in prism2_init_local_data()
3106 local->func->schedule_reset = prism2_schedule_reset; in prism2_init_local_data()
3108 local->func->read_aux_proc_ops = &prism2_download_aux_dump_proc_ops; in prism2_init_local_data()
3109 local->func->download = prism2_download; in prism2_init_local_data()
3111 local->func->tx = prism2_tx_80211; in prism2_init_local_data()
3112 local->func->set_tim = prism2_set_tim; in prism2_init_local_data()
3113 local->func->need_tx_headroom = 0; /* no need to add txdesc in in prism2_init_local_data()
3114 * skb->data (FIX: maybe for DMA bus in prism2_init_local_data()
3117 local->mtu = mtu; in prism2_init_local_data()
3119 rwlock_init(&local->iface_lock); in prism2_init_local_data()
3120 spin_lock_init(&local->txfidlock); in prism2_init_local_data()
3121 spin_lock_init(&local->cmdlock); in prism2_init_local_data()
3122 spin_lock_init(&local->baplock); in prism2_init_local_data()
3123 spin_lock_init(&local->lock); in prism2_init_local_data()
3124 spin_lock_init(&local->irq_init_lock); in prism2_init_local_data()
3125 mutex_init(&local->rid_bap_mtx); in prism2_init_local_data()
3129 local->card_idx = card_idx; in prism2_init_local_data()
3132 memcpy(local->essid, essid, in prism2_init_local_data()
3134 local->essid[MAX_SSID_LEN] = '\0'; in prism2_init_local_data()
3138 local->iw_mode = i; in prism2_init_local_data()
3142 local->iw_mode = IW_MODE_MASTER; in prism2_init_local_data()
3144 local->channel = GET_INT_PARM(channel, card_idx); in prism2_init_local_data()
3145 local->beacon_int = GET_INT_PARM(beacon_int, card_idx); in prism2_init_local_data()
3146 local->dtim_period = GET_INT_PARM(dtim_period, card_idx); in prism2_init_local_data()
3147 local->wds_max_connections = 16; in prism2_init_local_data()
3148 local->tx_control = HFA384X_TX_CTRL_FLAGS; in prism2_init_local_data()
3149 local->manual_retry_count = -1; in prism2_init_local_data()
3150 local->rts_threshold = 2347; in prism2_init_local_data()
3151 local->fragm_threshold = 2346; in prism2_init_local_data()
3152 local->rssi_to_dBm = 100; /* default; to be overriden by in prism2_init_local_data()
3154 local->auth_algs = PRISM2_AUTH_OPEN | PRISM2_AUTH_SHARED_KEY; in prism2_init_local_data()
3155 local->sram_type = -1; in prism2_init_local_data()
3156 local->scan_channel_mask = 0xffff; in prism2_init_local_data()
3157 local->monitor_type = PRISM2_MONITOR_RADIOTAP; in prism2_init_local_data()
3160 INIT_WORK(&local->reset_queue, handle_reset_queue); in prism2_init_local_data()
3161 INIT_WORK(&local->set_multicast_list_queue, in prism2_init_local_data()
3164 INIT_WORK(&local->set_tim_queue, handle_set_tim_queue); in prism2_init_local_data()
3165 INIT_LIST_HEAD(&local->set_tim_list); in prism2_init_local_data()
3166 spin_lock_init(&local->set_tim_lock); in prism2_init_local_data()
3168 INIT_WORK(&local->comms_qual_update, handle_comms_qual_update); in prism2_init_local_data()
3173 do { memset((q), 0, sizeof(*(q))); (q)->func = (void(*)(unsigned long))(f); } \ in prism2_init_local_data()
3175 HOSTAP_TASKLET_INIT(&local->bap_tasklet, hostap_bap_tasklet, in prism2_init_local_data()
3178 HOSTAP_TASKLET_INIT(&local->info_tasklet, hostap_info_tasklet, in prism2_init_local_data()
3182 HOSTAP_TASKLET_INIT(&local->rx_tasklet, in prism2_init_local_data()
3184 skb_queue_head_init(&local->rx_list); in prism2_init_local_data()
3186 HOSTAP_TASKLET_INIT(&local->sta_tx_exc_tasklet, in prism2_init_local_data()
3188 skb_queue_head_init(&local->sta_tx_exc_list); in prism2_init_local_data()
3190 INIT_LIST_HEAD(&local->cmd_queue); in prism2_init_local_data()
3191 init_waitqueue_head(&local->hostscan_wq); in prism2_init_local_data()
3193 lib80211_crypt_info_init(&local->crypt_info, dev->name, &local->lock); in prism2_init_local_data()
3195 timer_setup(&local->passive_scan_timer, hostap_passive_scan, 0); in prism2_init_local_data()
3196 timer_setup(&local->tick_timer, hostap_tick_timer, 0); in prism2_init_local_data()
3197 local->tick_timer.expires = jiffies + 2 * HZ; in prism2_init_local_data()
3198 add_timer(&local->tick_timer); in prism2_init_local_data()
3200 INIT_LIST_HEAD(&local->bss_list); in prism2_init_local_data()
3204 dev->type = ARPHRD_IEEE80211; in prism2_init_local_data()
3205 dev->header_ops = &hostap_80211_ops; in prism2_init_local_data()
3220 printk(KERN_INFO "%s: Registered netdevice %s\n", dev_info, dev->name); in prism2_init_local_data()
3237 local = iface->local; in hostap_hw_ready()
3238 local->ddev = hostap_add_interface(local, HOSTAP_INTERFACE_MAIN, 0, in hostap_hw_ready()
3241 if (local->ddev) { in hostap_hw_ready()
3242 if (local->iw_mode == IW_MODE_INFRA || in hostap_hw_ready()
3243 local->iw_mode == IW_MODE_ADHOC) { in hostap_hw_ready()
3244 netif_carrier_off(local->dev); in hostap_hw_ready()
3245 netif_carrier_off(local->ddev); in hostap_hw_ready()
3249 proc_create_single_data("registers", 0, local->proc, in hostap_hw_ready()
3256 return -1; in hostap_hw_ready()
3272 local = iface->local; in prism2_free_local_data()
3275 list_for_each_safe(ptr, n, &local->hostap_interfaces) { in prism2_free_local_data()
3277 if (iface->type == HOSTAP_INTERFACE_MASTER) { in prism2_free_local_data()
3281 hostap_remove_interface(iface->dev, 0, 1); in prism2_free_local_data()
3284 unregister_netdev(local->dev); in prism2_free_local_data()
3286 flush_work(&local->reset_queue); in prism2_free_local_data()
3287 flush_work(&local->set_multicast_list_queue); in prism2_free_local_data()
3288 flush_work(&local->set_tim_queue); in prism2_free_local_data()
3290 flush_work(&local->info_queue); in prism2_free_local_data()
3292 flush_work(&local->comms_qual_update); in prism2_free_local_data()
3294 lib80211_crypt_info_free(&local->crypt_info); in prism2_free_local_data()
3296 if (timer_pending(&local->passive_scan_timer)) in prism2_free_local_data()
3297 del_timer(&local->passive_scan_timer); in prism2_free_local_data()
3299 if (timer_pending(&local->tick_timer)) in prism2_free_local_data()
3300 del_timer(&local->tick_timer); in prism2_free_local_data()
3304 skb_queue_purge(&local->info_list); in prism2_free_local_data()
3305 skb_queue_purge(&local->rx_list); in prism2_free_local_data()
3306 skb_queue_purge(&local->sta_tx_exc_list); in prism2_free_local_data()
3308 if (local->dev_enabled) in prism2_free_local_data()
3311 if (local->ap != NULL) in prism2_free_local_data()
3312 hostap_free_data(local->ap); in prism2_free_local_data()
3315 if (local->proc != NULL) in prism2_free_local_data()
3316 remove_proc_entry("registers", local->proc); in prism2_free_local_data()
3320 tx_cb = local->tx_callback; in prism2_free_local_data()
3323 tx_cb = tx_cb->next; in prism2_free_local_data()
3331 if (local->frag_cache[i].skb != NULL) in prism2_free_local_data()
3332 dev_kfree_skb(local->frag_cache[i].skb); in prism2_free_local_data()
3336 prism2_download_free_data(local->dl_pri); in prism2_free_local_data()
3337 prism2_download_free_data(local->dl_sec); in prism2_free_local_data()
3342 list_for_each_safe(ptr, n, &local->bss_list) { in prism2_free_local_data()
3348 kfree(local->pda); in prism2_free_local_data()
3349 kfree(local->last_scan_results); in prism2_free_local_data()
3350 kfree(local->generic_elem); in prism2_free_local_data()
3352 free_netdev(local->dev); in prism2_free_local_data()
3364 local = iface->local; in prism2_suspend()
3370 wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL); in prism2_suspend()