Lines Matching full:this
188 static inline void wl3501_switch_page(struct wl3501_card *this, u8 page) in wl3501_switch_page() argument
190 wl3501_outb(page, this->base_addr + WL3501_NIC_BSS); in wl3501_switch_page()
199 static int wl3501_get_flash_mac_addr(struct wl3501_card *this) in wl3501_get_flash_mac_addr() argument
201 int base_addr = this->base_addr; in wl3501_get_flash_mac_addr()
210 this->mac_addr[0] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
212 this->mac_addr[1] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
214 this->mac_addr[2] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
216 this->mac_addr[3] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
218 this->mac_addr[4] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
220 this->mac_addr[5] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
222 this->reg_domain = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
228 this->version[0] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
230 this->version[1] = inb(base_addr + WL3501_NIC_IODPA); in wl3501_get_flash_mac_addr()
232 wl3501_switch_page(this, WL3501_BSS_SPAGE0); in wl3501_get_flash_mac_addr()
235 return this->mac_addr[0] == 0x00 && this->mac_addr[1] == 0x60; in wl3501_get_flash_mac_addr()
240 * @this: Card
247 static void wl3501_set_to_wla(struct wl3501_card *this, u16 dest, void *src, in wl3501_set_to_wla() argument
251 wl3501_switch_page(this, (dest & 0x8000) ? WL3501_BSS_SPAGE1 : in wl3501_set_to_wla()
254 wl3501_outb(dest & 0xff, this->base_addr + WL3501_NIC_LMAL); in wl3501_set_to_wla()
255 wl3501_outb(((dest >> 8) & 0x7f), this->base_addr + WL3501_NIC_LMAH); in wl3501_set_to_wla()
258 wl3501_outsb(this->base_addr + WL3501_NIC_IODPA, src, size); in wl3501_set_to_wla()
263 * @this: Card
270 static void wl3501_get_from_wla(struct wl3501_card *this, u16 src, void *dest, in wl3501_get_from_wla() argument
274 wl3501_switch_page(this, (src & 0x8000) ? WL3501_BSS_SPAGE1 : in wl3501_get_from_wla()
277 wl3501_outb(src & 0xff, this->base_addr + WL3501_NIC_LMAL); in wl3501_get_from_wla()
278 wl3501_outb((src >> 8) & 0x7f, this->base_addr + WL3501_NIC_LMAH); in wl3501_get_from_wla()
281 insb(this->base_addr + WL3501_NIC_IODPA, dest, size); in wl3501_get_from_wla()
296 static u16 wl3501_get_tx_buffer(struct wl3501_card *this, u16 len) in wl3501_get_tx_buffer() argument
302 if (full_len > this->tx_buffer_cnt * 254) in wl3501_get_tx_buffer()
304 ret = this->tx_buffer_head; in wl3501_get_tx_buffer()
310 wl3501_get_from_wla(this, this->tx_buffer_head, &next, in wl3501_get_tx_buffer()
313 wl3501_set_to_wla(this, this->tx_buffer_head, &zero, in wl3501_get_tx_buffer()
315 this->tx_buffer_head = next; in wl3501_get_tx_buffer()
319 this->tx_buffer_head = ret; in wl3501_get_tx_buffer()
324 this->tx_buffer_cnt -= blk_cnt; in wl3501_get_tx_buffer()
332 static void wl3501_free_tx_buffer(struct wl3501_card *this, u16 ptr) in wl3501_free_tx_buffer() argument
335 if (!this->tx_buffer_head) in wl3501_free_tx_buffer()
336 this->tx_buffer_head = ptr; in wl3501_free_tx_buffer()
338 wl3501_set_to_wla(this, this->tx_buffer_tail, in wl3501_free_tx_buffer()
343 this->tx_buffer_cnt++; in wl3501_free_tx_buffer()
344 wl3501_get_from_wla(this, ptr, &next, sizeof(next)); in wl3501_free_tx_buffer()
345 this->tx_buffer_tail = ptr; in wl3501_free_tx_buffer()
350 static int wl3501_esbq_req_test(struct wl3501_card *this) in wl3501_esbq_req_test() argument
354 wl3501_get_from_wla(this, this->esbq_req_head + 3, &tmp, sizeof(tmp)); in wl3501_esbq_req_test()
358 static void wl3501_esbq_req(struct wl3501_card *this, u16 *ptr) in wl3501_esbq_req() argument
362 wl3501_set_to_wla(this, this->esbq_req_head, ptr, 2); in wl3501_esbq_req()
363 wl3501_set_to_wla(this, this->esbq_req_head + 2, &tmp, sizeof(tmp)); in wl3501_esbq_req()
364 this->esbq_req_head += 4; in wl3501_esbq_req()
365 if (this->esbq_req_head >= this->esbq_req_end) in wl3501_esbq_req()
366 this->esbq_req_head = this->esbq_req_start; in wl3501_esbq_req()
369 static int wl3501_esbq_exec(struct wl3501_card *this, void *sig, int sig_size) in wl3501_esbq_exec() argument
373 if (wl3501_esbq_req_test(this)) { in wl3501_esbq_exec()
374 u16 ptr = wl3501_get_tx_buffer(this, sig_size); in wl3501_esbq_exec()
376 wl3501_set_to_wla(this, ptr, sig, sig_size); in wl3501_esbq_exec()
377 wl3501_esbq_req(this, &ptr); in wl3501_esbq_exec()
384 static int wl3501_request_mib(struct wl3501_card *this, u8 index, void *bf) in wl3501_request_mib() argument
393 spin_lock_irqsave(&this->lock, flags); in wl3501_request_mib()
394 if (wl3501_esbq_req_test(this)) { in wl3501_request_mib()
395 u16 ptr = wl3501_get_tx_buffer(this, sizeof(sig)); in wl3501_request_mib()
397 wl3501_set_to_wla(this, ptr, &sig, sizeof(sig)); in wl3501_request_mib()
398 wl3501_esbq_req(this, &ptr); in wl3501_request_mib()
399 this->sig_get_confirm.mib_status = 255; in wl3501_request_mib()
403 spin_unlock_irqrestore(&this->lock, flags); in wl3501_request_mib()
408 static int wl3501_get_mib_value(struct wl3501_card *this, u8 index, in wl3501_get_mib_value() argument
413 rc = wl3501_request_mib(this, index, bf); in wl3501_get_mib_value()
417 rc = wait_event_interruptible(this->wait, in wl3501_get_mib_value()
418 this->sig_get_confirm.mib_status != 255); in wl3501_get_mib_value()
422 memcpy(bf, this->sig_get_confirm.mib_value, size); in wl3501_get_mib_value()
426 static int wl3501_pwr_mgmt(struct wl3501_card *this, int suspend) in wl3501_pwr_mgmt() argument
437 spin_lock_irqsave(&this->lock, flags); in wl3501_pwr_mgmt()
438 if (wl3501_esbq_req_test(this)) { in wl3501_pwr_mgmt()
439 u16 ptr = wl3501_get_tx_buffer(this, sizeof(sig)); in wl3501_pwr_mgmt()
441 wl3501_set_to_wla(this, ptr, &sig, sizeof(sig)); in wl3501_pwr_mgmt()
442 wl3501_esbq_req(this, &ptr); in wl3501_pwr_mgmt()
443 this->sig_pwr_mgmt_confirm.status = 255; in wl3501_pwr_mgmt()
444 spin_unlock_irqrestore(&this->lock, flags); in wl3501_pwr_mgmt()
445 rc = wait_event_interruptible(this->wait, in wl3501_pwr_mgmt()
446 this->sig_pwr_mgmt_confirm.status != 255); in wl3501_pwr_mgmt()
449 this->sig_pwr_mgmt_confirm.status); in wl3501_pwr_mgmt()
453 spin_unlock_irqrestore(&this->lock, flags); in wl3501_pwr_mgmt()
460 * @this: Card
468 static int wl3501_send_pkt(struct wl3501_card *this, u8 *data, u16 len) in wl3501_send_pkt() argument
477 if (wl3501_esbq_req_test(this)) { in wl3501_send_pkt()
478 sig_bf = wl3501_get_tx_buffer(this, sizeof(sig)); in wl3501_send_pkt()
482 bf = wl3501_get_tx_buffer(this, len + 26 + 24); in wl3501_send_pkt()
485 wl3501_free_tx_buffer(this, sig_bf); in wl3501_send_pkt()
498 wl3501_set_to_wla(this, bf + 2 + in wl3501_send_pkt()
509 wl3501_set_to_wla(this, in wl3501_send_pkt()
513 wl3501_get_from_wla(this, bf, &next, sizeof(next)); in wl3501_send_pkt()
526 wl3501_set_to_wla(this, bf + 2 + in wl3501_send_pkt()
530 wl3501_get_from_wla(this, bf, &next, sizeof(next)); in wl3501_send_pkt()
541 wl3501_set_to_wla(this, bf + 2, pdata, tmplen); in wl3501_send_pkt()
543 wl3501_get_from_wla(this, bf, &next, sizeof(next)); in wl3501_send_pkt()
546 wl3501_set_to_wla(this, sig_bf, &sig, sizeof(sig)); in wl3501_send_pkt()
547 wl3501_esbq_req(this, &sig_bf); in wl3501_send_pkt()
553 static int wl3501_mgmt_resync(struct wl3501_card *this) in wl3501_mgmt_resync() argument
559 return wl3501_esbq_exec(this, &sig, sizeof(sig)); in wl3501_mgmt_resync()
562 static inline int wl3501_fw_bss_type(struct wl3501_card *this) in wl3501_fw_bss_type() argument
564 return this->net_type == IW_MODE_INFRA ? WL3501_NET_TYPE_INFRA : in wl3501_fw_bss_type()
568 static inline int wl3501_fw_cap_info(struct wl3501_card *this) in wl3501_fw_cap_info() argument
570 return this->net_type == IW_MODE_INFRA ? WL3501_MGMT_CAPABILITY_ESS : in wl3501_fw_cap_info()
574 static int wl3501_mgmt_scan(struct wl3501_card *this, u16 chan_time) in wl3501_mgmt_scan() argument
582 .bss_type = wl3501_fw_bss_type(this), in wl3501_mgmt_scan()
585 this->bss_cnt = this->join_sta_bss = 0; in wl3501_mgmt_scan()
586 return wl3501_esbq_exec(this, &sig, sizeof(sig)); in wl3501_mgmt_scan()
589 static int wl3501_mgmt_join(struct wl3501_card *this, u16 stas) in wl3501_mgmt_join() argument
599 .chan = this->chan, in wl3501_mgmt_join()
603 memcpy(&sig.beacon_period, &this->bss_set[stas].beacon_period, 72); in wl3501_mgmt_join()
604 return wl3501_esbq_exec(this, &sig, sizeof(sig)); in wl3501_mgmt_join()
607 static int wl3501_mgmt_start(struct wl3501_card *this) in wl3501_mgmt_start() argument
618 .chan = this->chan, in wl3501_mgmt_start()
651 .bss_type = wl3501_fw_bss_type(this), in wl3501_mgmt_start()
652 .cap_info = wl3501_fw_cap_info(this), in wl3501_mgmt_start()
655 iw_copy_mgmt_info_element(&sig.ssid.el, &this->essid.el); in wl3501_mgmt_start()
656 iw_copy_mgmt_info_element(&this->keep_essid.el, &this->essid.el); in wl3501_mgmt_start()
657 return wl3501_esbq_exec(this, &sig, sizeof(sig)); in wl3501_mgmt_start()
660 static void wl3501_mgmt_scan_confirm(struct wl3501_card *this, u16 addr) in wl3501_mgmt_scan_confirm() argument
667 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_mgmt_scan_confirm()
670 if ((this->net_type == IW_MODE_INFRA && in wl3501_mgmt_scan_confirm()
672 (this->net_type == IW_MODE_ADHOC && in wl3501_mgmt_scan_confirm()
674 this->net_type == IW_MODE_AUTO) { in wl3501_mgmt_scan_confirm()
675 if (!this->essid.el.len) in wl3501_mgmt_scan_confirm()
677 else if (this->essid.el.len == 3 && in wl3501_mgmt_scan_confirm()
678 !memcmp(this->essid.essid, "ANY", 3)) in wl3501_mgmt_scan_confirm()
680 else if (this->essid.el.len != sig.ssid.el.len) in wl3501_mgmt_scan_confirm()
682 else if (memcmp(this->essid.essid, sig.ssid.essid, in wl3501_mgmt_scan_confirm()
683 this->essid.el.len)) in wl3501_mgmt_scan_confirm()
688 for (i = 0; i < this->bss_cnt; i++) { in wl3501_mgmt_scan_confirm()
689 if (ether_addr_equal_unaligned(this->bss_set[i].bssid, sig.bssid)) { in wl3501_mgmt_scan_confirm()
696 memcpy(&this->bss_set[i].beacon_period, in wl3501_mgmt_scan_confirm()
698 this->bss_cnt++; in wl3501_mgmt_scan_confirm()
699 this->rssi = sig.rssi; in wl3501_mgmt_scan_confirm()
704 this->join_sta_bss = 0; in wl3501_mgmt_scan_confirm()
705 for (i = this->join_sta_bss; i < this->bss_cnt; i++) in wl3501_mgmt_scan_confirm()
706 if (!wl3501_mgmt_join(this, i)) in wl3501_mgmt_scan_confirm()
708 this->join_sta_bss = i; in wl3501_mgmt_scan_confirm()
709 if (this->join_sta_bss == this->bss_cnt) { in wl3501_mgmt_scan_confirm()
710 if (this->net_type == IW_MODE_INFRA) in wl3501_mgmt_scan_confirm()
711 wl3501_mgmt_scan(this, 100); in wl3501_mgmt_scan_confirm()
713 this->adhoc_times++; in wl3501_mgmt_scan_confirm()
714 if (this->adhoc_times > WL3501_MAX_ADHOC_TRIES) in wl3501_mgmt_scan_confirm()
715 wl3501_mgmt_start(this); in wl3501_mgmt_scan_confirm()
717 wl3501_mgmt_scan(this, 100); in wl3501_mgmt_scan_confirm()
725 * @this: Card
730 static int wl3501_block_interrupt(struct wl3501_card *this) in wl3501_block_interrupt() argument
732 u8 old = inb(this->base_addr + WL3501_NIC_GCR); in wl3501_block_interrupt()
736 wl3501_outb(new, this->base_addr + WL3501_NIC_GCR); in wl3501_block_interrupt()
742 * @this: Card
747 static int wl3501_unblock_interrupt(struct wl3501_card *this) in wl3501_unblock_interrupt() argument
749 u8 old = inb(this->base_addr + WL3501_NIC_GCR); in wl3501_unblock_interrupt()
753 wl3501_outb(new, this->base_addr + WL3501_NIC_GCR); in wl3501_unblock_interrupt()
762 * @this: card
766 static u16 wl3501_receive(struct wl3501_card *this, u8 *bf, u16 size) in wl3501_receive() argument
772 wl3501_get_from_wla(this, this->start_seg + 2, in wl3501_receive()
775 wl3501_get_from_wla(this, in wl3501_receive()
776 this->start_seg + in wl3501_receive()
783 wl3501_get_from_wla(this, in wl3501_receive()
784 this->start_seg + in wl3501_receive()
791 wl3501_get_from_wla(this, next_addr + 5, data, in wl3501_receive()
795 wl3501_get_from_wla(this, next_addr + 2, &next_addr1, in wl3501_receive()
799 wl3501_get_from_wla(this, next_addr + 5, data, size); in wl3501_receive()
806 static void wl3501_esbq_req_free(struct wl3501_card *this) in wl3501_esbq_req_free() argument
811 if (this->esbq_req_head == this->esbq_req_tail) in wl3501_esbq_req_free()
813 wl3501_get_from_wla(this, this->esbq_req_tail + 3, &tmp, sizeof(tmp)); in wl3501_esbq_req_free()
816 wl3501_get_from_wla(this, this->esbq_req_tail, &addr, sizeof(addr)); in wl3501_esbq_req_free()
817 wl3501_free_tx_buffer(this, addr); in wl3501_esbq_req_free()
818 this->esbq_req_tail += 4; in wl3501_esbq_req_free()
819 if (this->esbq_req_tail >= this->esbq_req_end) in wl3501_esbq_req_free()
820 this->esbq_req_tail = this->esbq_req_start; in wl3501_esbq_req_free()
825 static int wl3501_esbq_confirm(struct wl3501_card *this) in wl3501_esbq_confirm() argument
829 wl3501_get_from_wla(this, this->esbq_confirm + 3, &tmp, sizeof(tmp)); in wl3501_esbq_confirm()
835 struct wl3501_card *this = netdev_priv(dev); in wl3501_online() local
838 dev->name, this->bssid); in wl3501_online()
842 static void wl3501_esbq_confirm_done(struct wl3501_card *this) in wl3501_esbq_confirm_done() argument
846 wl3501_set_to_wla(this, this->esbq_confirm + 3, &tmp, sizeof(tmp)); in wl3501_esbq_confirm_done()
847 this->esbq_confirm += 4; in wl3501_esbq_confirm_done()
848 if (this->esbq_confirm >= this->esbq_confirm_end) in wl3501_esbq_confirm_done()
849 this->esbq_confirm = this->esbq_confirm_start; in wl3501_esbq_confirm_done()
852 static int wl3501_mgmt_auth(struct wl3501_card *this) in wl3501_mgmt_auth() argument
861 memcpy(sig.mac_addr, this->bssid, ETH_ALEN); in wl3501_mgmt_auth()
862 return wl3501_esbq_exec(this, &sig, sizeof(sig)); in wl3501_mgmt_auth()
865 static int wl3501_mgmt_association(struct wl3501_card *this) in wl3501_mgmt_association() argument
871 .cap_info = this->cap_info, in wl3501_mgmt_association()
875 memcpy(sig.mac_addr, this->bssid, ETH_ALEN); in wl3501_mgmt_association()
876 return wl3501_esbq_exec(this, &sig, sizeof(sig)); in wl3501_mgmt_association()
881 struct wl3501_card *this = netdev_priv(dev); in wl3501_mgmt_join_confirm() local
885 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_mgmt_join_confirm()
887 if (this->net_type == IW_MODE_INFRA) { in wl3501_mgmt_join_confirm()
888 if (this->join_sta_bss < this->bss_cnt) { in wl3501_mgmt_join_confirm()
889 const int i = this->join_sta_bss; in wl3501_mgmt_join_confirm()
890 memcpy(this->bssid, in wl3501_mgmt_join_confirm()
891 this->bss_set[i].bssid, ETH_ALEN); in wl3501_mgmt_join_confirm()
892 this->chan = this->bss_set[i].ds_pset.chan; in wl3501_mgmt_join_confirm()
893 iw_copy_mgmt_info_element(&this->keep_essid.el, in wl3501_mgmt_join_confirm()
894 &this->bss_set[i].ssid.el); in wl3501_mgmt_join_confirm()
895 wl3501_mgmt_auth(this); in wl3501_mgmt_join_confirm()
898 const int i = this->join_sta_bss; in wl3501_mgmt_join_confirm()
900 memcpy(&this->bssid, &this->bss_set[i].bssid, ETH_ALEN); in wl3501_mgmt_join_confirm()
901 this->chan = this->bss_set[i].ds_pset.chan; in wl3501_mgmt_join_confirm()
902 iw_copy_mgmt_info_element(&this->keep_essid.el, in wl3501_mgmt_join_confirm()
903 &this->bss_set[i].ssid.el); in wl3501_mgmt_join_confirm()
908 this->join_sta_bss++; in wl3501_mgmt_join_confirm()
909 for (i = this->join_sta_bss; i < this->bss_cnt; i++) in wl3501_mgmt_join_confirm()
910 if (!wl3501_mgmt_join(this, i)) in wl3501_mgmt_join_confirm()
912 this->join_sta_bss = i; in wl3501_mgmt_join_confirm()
913 if (this->join_sta_bss == this->bss_cnt) { in wl3501_mgmt_join_confirm()
914 if (this->net_type == IW_MODE_INFRA) in wl3501_mgmt_join_confirm()
915 wl3501_mgmt_scan(this, 100); in wl3501_mgmt_join_confirm()
917 this->adhoc_times++; in wl3501_mgmt_join_confirm()
918 if (this->adhoc_times > WL3501_MAX_ADHOC_TRIES) in wl3501_mgmt_join_confirm()
919 wl3501_mgmt_start(this); in wl3501_mgmt_join_confirm()
921 wl3501_mgmt_scan(this, 100); in wl3501_mgmt_join_confirm()
928 struct wl3501_card *this) in wl3501_alarm_interrupt() argument
930 if (this->net_type == IW_MODE_INFRA) { in wl3501_alarm_interrupt()
933 wl3501_mgmt_resync(this); in wl3501_alarm_interrupt()
938 struct wl3501_card *this, in wl3501_md_confirm_interrupt() argument
944 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_md_confirm_interrupt()
945 wl3501_free_tx_buffer(this, sig.data); in wl3501_md_confirm_interrupt()
951 struct wl3501_card *this, u16 addr) in wl3501_md_ind_interrupt() argument
958 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_md_ind_interrupt()
959 this->start_seg = sig.data; in wl3501_md_ind_interrupt()
960 wl3501_get_from_wla(this, in wl3501_md_ind_interrupt()
963 this->rssi = rssi <= 63 ? (rssi * 100) / 64 : 255; in wl3501_md_ind_interrupt()
965 wl3501_get_from_wla(this, in wl3501_md_ind_interrupt()
986 wl3501_receive(this, skb->data, pkt_len); in wl3501_md_ind_interrupt()
995 static inline void wl3501_get_confirm_interrupt(struct wl3501_card *this, in wl3501_get_confirm_interrupt() argument
999 wl3501_get_from_wla(this, addr, &this->sig_get_confirm, in wl3501_get_confirm_interrupt()
1000 sizeof(this->sig_get_confirm)); in wl3501_get_confirm_interrupt()
1001 wake_up(&this->wait); in wl3501_get_confirm_interrupt()
1005 struct wl3501_card *this, in wl3501_start_confirm_interrupt() argument
1011 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_start_confirm_interrupt()
1019 struct wl3501_card *this = netdev_priv(dev); in wl3501_assoc_confirm_interrupt() local
1023 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_assoc_confirm_interrupt()
1029 static inline void wl3501_auth_confirm_interrupt(struct wl3501_card *this, in wl3501_auth_confirm_interrupt() argument
1035 wl3501_get_from_wla(this, addr, &sig, sizeof(sig)); in wl3501_auth_confirm_interrupt()
1038 wl3501_mgmt_association(this); in wl3501_auth_confirm_interrupt()
1040 wl3501_mgmt_resync(this); in wl3501_auth_confirm_interrupt()
1048 struct wl3501_card *this = netdev_priv(dev); in wl3501_rx_interrupt() local
1053 if (!wl3501_esbq_confirm(this)) in wl3501_rx_interrupt()
1055 wl3501_get_from_wla(this, this->esbq_confirm, &addr, sizeof(addr)); in wl3501_rx_interrupt()
1056 wl3501_get_from_wla(this, addr + 2, &sig_id, sizeof(sig_id)); in wl3501_rx_interrupt()
1062 wl3501_alarm_interrupt(dev, this); in wl3501_rx_interrupt()
1065 wl3501_md_confirm_interrupt(dev, this, addr); in wl3501_rx_interrupt()
1068 wl3501_md_ind_interrupt(dev, this, addr); in wl3501_rx_interrupt()
1071 wl3501_get_confirm_interrupt(this, addr, in wl3501_rx_interrupt()
1072 &this->sig_get_confirm, in wl3501_rx_interrupt()
1073 sizeof(this->sig_get_confirm)); in wl3501_rx_interrupt()
1076 wl3501_get_confirm_interrupt(this, addr, in wl3501_rx_interrupt()
1077 &this->sig_pwr_mgmt_confirm, in wl3501_rx_interrupt()
1078 sizeof(this->sig_pwr_mgmt_confirm)); in wl3501_rx_interrupt()
1081 wl3501_start_confirm_interrupt(dev, this, addr); in wl3501_rx_interrupt()
1084 wl3501_mgmt_scan_confirm(this, addr); in wl3501_rx_interrupt()
1093 wl3501_auth_confirm_interrupt(this, addr); in wl3501_rx_interrupt()
1096 wl3501_mgmt_resync(this); /* FIXME: should be resync_confirm */ in wl3501_rx_interrupt()
1099 wl3501_esbq_confirm_done(this); in wl3501_rx_interrupt()
1103 wl3501_esbq_req_free(this); in wl3501_rx_interrupt()
1108 static inline void wl3501_ack_interrupt(struct wl3501_card *this) in wl3501_ack_interrupt() argument
1110 wl3501_outb(WL3501_GCR_ECINT, this->base_addr + WL3501_NIC_GCR); in wl3501_ack_interrupt()
1128 struct wl3501_card *this; in wl3501_interrupt() local
1130 this = netdev_priv(dev); in wl3501_interrupt()
1131 spin_lock(&this->lock); in wl3501_interrupt()
1132 wl3501_ack_interrupt(this); in wl3501_interrupt()
1133 wl3501_block_interrupt(this); in wl3501_interrupt()
1135 wl3501_unblock_interrupt(this); in wl3501_interrupt()
1136 spin_unlock(&this->lock); in wl3501_interrupt()
1141 static int wl3501_reset_board(struct wl3501_card *this) in wl3501_reset_board() argument
1147 wl3501_outb_p(WL3501_GCR_CORESET, this->base_addr + WL3501_NIC_GCR); in wl3501_reset_board()
1148 wl3501_outb_p(0, this->base_addr + WL3501_NIC_GCR); in wl3501_reset_board()
1149 wl3501_outb_p(WL3501_GCR_CORESET, this->base_addr + WL3501_NIC_GCR); in wl3501_reset_board()
1152 wl3501_set_to_wla(this, 0x480, &tmp, sizeof(tmp)); in wl3501_reset_board()
1155 wl3501_outb_p(0, this->base_addr + WL3501_NIC_GCR); in wl3501_reset_board()
1159 wl3501_unblock_interrupt(this); /* acme: was commented */ in wl3501_reset_board()
1163 wl3501_get_from_wla(this, 0x480, &tmp, sizeof(tmp)); in wl3501_reset_board()
1168 wl3501_set_to_wla(this, 0x480, &tmp, sizeof(tmp)); in wl3501_reset_board()
1179 static int wl3501_init_firmware(struct wl3501_card *this) in wl3501_init_firmware() argument
1182 int rc = wl3501_reset_board(this); in wl3501_init_firmware()
1186 this->card_name[0] = '\0'; in wl3501_init_firmware()
1187 wl3501_get_from_wla(this, 0x1a00, in wl3501_init_firmware()
1188 this->card_name, sizeof(this->card_name)); in wl3501_init_firmware()
1189 this->card_name[sizeof(this->card_name) - 1] = '\0'; in wl3501_init_firmware()
1190 this->firmware_date[0] = '\0'; in wl3501_init_firmware()
1191 wl3501_get_from_wla(this, 0x1a40, in wl3501_init_firmware()
1192 this->firmware_date, sizeof(this->firmware_date)); in wl3501_init_firmware()
1193 this->firmware_date[sizeof(this->firmware_date) - 1] = '\0'; in wl3501_init_firmware()
1195 wl3501_switch_page(this, WL3501_BSS_SPAGE0); in wl3501_init_firmware()
1197 wl3501_get_from_wla(this, 0x482, &this->esbq_req_start, 2); in wl3501_init_firmware()
1198 wl3501_get_from_wla(this, 0x486, &this->esbq_req_end, 2); in wl3501_init_firmware()
1199 wl3501_get_from_wla(this, 0x488, &this->esbq_confirm_start, 2); in wl3501_init_firmware()
1200 wl3501_get_from_wla(this, 0x48c, &this->esbq_confirm_end, 2); in wl3501_init_firmware()
1201 wl3501_get_from_wla(this, 0x48e, &this->tx_buffer_head, 2); in wl3501_init_firmware()
1202 wl3501_get_from_wla(this, 0x492, &this->tx_buffer_size, 2); in wl3501_init_firmware()
1203 this->esbq_req_tail = this->esbq_req_head = this->esbq_req_start; in wl3501_init_firmware()
1204 this->esbq_req_end += this->esbq_req_start; in wl3501_init_firmware()
1205 this->esbq_confirm = this->esbq_confirm_start; in wl3501_init_firmware()
1206 this->esbq_confirm_end += this->esbq_confirm_start; in wl3501_init_firmware()
1208 this->tx_buffer_cnt = 1; in wl3501_init_firmware()
1209 ptr = this->tx_buffer_head; in wl3501_init_firmware()
1211 while ((next - this->tx_buffer_head) < this->tx_buffer_size) { in wl3501_init_firmware()
1212 this->tx_buffer_cnt++; in wl3501_init_firmware()
1213 wl3501_set_to_wla(this, ptr, &next, sizeof(next)); in wl3501_init_firmware()
1219 wl3501_set_to_wla(this, ptr, &next, sizeof(next)); in wl3501_init_firmware()
1220 this->tx_buffer_tail = ptr; in wl3501_init_firmware()
1230 struct wl3501_card *this = netdev_priv(dev); in wl3501_close() local
1233 link = this->p_dev; in wl3501_close()
1235 spin_lock_irqsave(&this->lock, flags); in wl3501_close()
1240 wl3501_ack_interrupt(this); in wl3501_close()
1243 wl3501_block_interrupt(this); in wl3501_close()
1246 spin_unlock_irqrestore(&this->lock, flags); in wl3501_close()
1260 struct wl3501_card *this = netdev_priv(dev); in wl3501_reset() local
1264 spin_lock_irqsave(&this->lock, flags); in wl3501_reset()
1265 wl3501_block_interrupt(this); in wl3501_reset()
1267 if (wl3501_init_firmware(this)) { in wl3501_reset()
1279 this->adhoc_times = 0; in wl3501_reset()
1280 wl3501_ack_interrupt(this); in wl3501_reset()
1281 wl3501_unblock_interrupt(this); in wl3501_reset()
1282 wl3501_mgmt_scan(this, 100); in wl3501_reset()
1286 spin_unlock_irqrestore(&this->lock, flags); in wl3501_reset()
1315 struct wl3501_card *this = netdev_priv(dev); in wl3501_hard_start_xmit() local
1318 spin_lock_irqsave(&this->lock, flags); in wl3501_hard_start_xmit()
1319 enabled = wl3501_block_interrupt(this); in wl3501_hard_start_xmit()
1320 rc = wl3501_send_pkt(this, skb->data, skb->len); in wl3501_hard_start_xmit()
1322 wl3501_unblock_interrupt(this); in wl3501_hard_start_xmit()
1331 if (this->tx_buffer_cnt < 2) in wl3501_hard_start_xmit()
1334 spin_unlock_irqrestore(&this->lock, flags); in wl3501_hard_start_xmit()
1341 struct wl3501_card *this = netdev_priv(dev); in wl3501_open() local
1344 link = this->p_dev; in wl3501_open()
1346 spin_lock_irqsave(&this->lock, flags); in wl3501_open()
1354 if (wl3501_init_firmware(this)) in wl3501_open()
1357 this->adhoc_times = 0; in wl3501_open()
1359 wl3501_ack_interrupt(this); in wl3501_open()
1362 wl3501_unblock_interrupt(this); in wl3501_open()
1363 wl3501_mgmt_scan(this, 100); in wl3501_open()
1368 dev->name, this->card_name, in wl3501_open()
1369 dev->name, this->firmware_date); in wl3501_open()
1371 spin_unlock_irqrestore(&this->lock, flags); in wl3501_open()
1380 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_wireless_stats() local
1381 struct iw_statistics *wstats = &this->wstats; in wl3501_get_wireless_stats()
1386 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_WEP_ICV_ERROR_COUNT, in wl3501_get_wireless_stats()
1389 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_WEP_UNDECRYPTABLE_COUNT, in wl3501_get_wireless_stats()
1392 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_WEP_EXCLUDED_COUNT, in wl3501_get_wireless_stats()
1395 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_RETRY_COUNT, in wl3501_get_wireless_stats()
1398 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_FAILED_COUNT, in wl3501_get_wireless_stats()
1401 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_RTS_FAILURE_COUNT, in wl3501_get_wireless_stats()
1404 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_ACK_FAILURE_COUNT, in wl3501_get_wireless_stats()
1407 if (!wl3501_get_mib_value(this, WL3501_MIB_ATTR_FRAME_DUPLICATE_COUNT, in wl3501_get_wireless_stats()
1417 * This deletes a driver "instance". The device is de-registered with Card
1449 struct wl3501_card *this = netdev_priv(dev); in wl3501_set_freq() local
1453 if (iw_valid_channel(this->reg_domain, channel)) { in wl3501_set_freq()
1454 this->chan = channel; in wl3501_set_freq()
1463 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_freq() local
1466 ieee80211_channel_to_frequency(this->chan, NL80211_BAND_2GHZ); in wl3501_get_freq()
1479 struct wl3501_card *this = netdev_priv(dev); in wl3501_set_mode() local
1481 this->net_type = wrqu->mode; in wl3501_set_mode()
1490 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_mode() local
1492 wrqu->mode = this->net_type; in wl3501_get_mode()
1499 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_sens() local
1501 wrqu->sens.value = this->rssi; in wl3501_get_sens()
1530 struct wl3501_card *this = netdev_priv(dev); in wl3501_set_wap() local
1539 memcpy(this->bssid, wrqu->ap_addr.sa_data, ETH_ALEN); in wl3501_set_wap()
1549 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_wap() local
1552 memcpy(wrqu->ap_addr.sa_data, this->bssid, ETH_ALEN); in wl3501_get_wap()
1568 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_scan() local
1573 for (i = 0; i < this->bss_cnt; ++i) { in wl3501_get_scan()
1576 memcpy(iwe.u.ap_addr.sa_data, this->bss_set[i].bssid, ETH_ALEN); in wl3501_get_scan()
1582 iwe.u.data.length = this->bss_set[i].ssid.el.len; in wl3501_get_scan()
1586 this->bss_set[i].ssid.essid); in wl3501_get_scan()
1588 iwe.u.mode = this->bss_set[i].bss_type; in wl3501_get_scan()
1593 iwe.u.freq.m = this->bss_set[i].ds_pset.chan; in wl3501_get_scan()
1599 if (this->bss_set[i].cap_info & WL3501_MGMT_CAPABILITY_PRIVACY) in wl3501_get_scan()
1618 struct wl3501_card *this = netdev_priv(dev); in wl3501_set_essid() local
1622 &this->essid.el, in wl3501_set_essid()
1626 &this->essid.el, "ANY", 3); in wl3501_set_essid()
1635 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_essid() local
1638 spin_lock_irqsave(&this->lock, flags); in wl3501_get_essid()
1640 wrqu->essid.length = this->essid.el.len; in wl3501_get_essid()
1641 memcpy(extra, this->essid.essid, this->essid.el.len); in wl3501_get_essid()
1642 spin_unlock_irqrestore(&this->lock, flags); in wl3501_get_essid()
1649 struct wl3501_card *this = netdev_priv(dev); in wl3501_set_nick() local
1651 if (wrqu->data.length > sizeof(this->nick)) in wl3501_set_nick()
1653 strlcpy(this->nick, extra, wrqu->data.length); in wl3501_set_nick()
1660 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_nick() local
1662 strlcpy(extra, this->nick, 32); in wl3501_get_nick()
1671 * FIXME: have to see from where to get this info, perhaps this card in wl3501_get_rate()
1685 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_rts_threshold() local
1686 int rc = wl3501_get_mib_value(this, WL3501_MIB_ATTR_RTS_THRESHOLD, in wl3501_get_rts_threshold()
1701 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_frag_threshold() local
1702 int rc = wl3501_get_mib_value(this, WL3501_MIB_ATTR_FRAG_THRESHOLD, in wl3501_get_frag_threshold()
1717 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_txpow() local
1718 int rc = wl3501_get_mib_value(this, in wl3501_get_txpow()
1725 * From the MIB values I think this can be configurable, in wl3501_get_txpow()
1739 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_retry() local
1740 int rc = wl3501_get_mib_value(this, in wl3501_get_retry()
1749 rc = wl3501_get_mib_value(this, WL3501_MIB_ATTR_SHORT_RETRY_LIMIT, in wl3501_get_retry()
1766 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_encode() local
1767 int rc = wl3501_get_mib_value(this, in wl3501_get_encode()
1776 rc = wl3501_get_mib_value(this, WL3501_MIB_ATTR_EXCLUDE_UNENCRYPTED, in wl3501_get_encode()
1782 rc = wl3501_get_mib_value(this, WL3501_MIB_ATTR_WEP_KEY_MAPPINGS_LEN, in wl3501_get_encode()
1786 rc = wl3501_get_mib_value(this, WL3501_MIB_ATTR_WEP_KEY_MAPPINGS, in wl3501_get_encode()
1803 struct wl3501_card *this = netdev_priv(dev); in wl3501_get_power() local
1804 int rc = wl3501_get_mib_value(this, in wl3501_get_power()
1862 struct wl3501_card *this; in wl3501_probe() local
1880 this = netdev_priv(dev); in wl3501_probe()
1881 this->wireless_data.spy_data = &this->spy_data; in wl3501_probe()
1882 this->p_dev = p_dev; in wl3501_probe()
1883 dev->wireless_data = &this->wireless_data; in wl3501_probe()
1897 struct wl3501_card *this; in wl3501_config() local
1899 /* Try allocating IO ports. This tries a few fixed addresses. If you in wl3501_config()
1906 * 0x200-0x2ff, and so on, because this seems safer */ in wl3501_config()
1916 /* Now allocate an interrupt line. Note that this does not actually in wl3501_config()
1935 this = netdev_priv(dev); in wl3501_config()
1937 this->base_addr = dev->base_addr; in wl3501_config()
1939 if (!wl3501_get_flash_mac_addr(this)) { in wl3501_config()
1947 dev->dev_addr[i] = ((char *)&this->mac_addr)[i]; in wl3501_config()
1952 dev->name, this->base_addr, (int)dev->irq, in wl3501_config()
1957 this->net_type = IW_MODE_INFRA; in wl3501_config()
1958 this->bss_cnt = 0; in wl3501_config()
1959 this->join_sta_bss = 0; in wl3501_config()
1960 this->adhoc_times = 0; in wl3501_config()
1961 iw_set_mgmt_info_element(IW_MGMT_INFO_ELEMENT_SSID, &this->essid.el, in wl3501_config()
1963 this->card_name[0] = '\0'; in wl3501_config()
1964 this->firmware_date[0] = '\0'; in wl3501_config()
1965 this->rssi = 255; in wl3501_config()
1966 this->chan = iw_default_channel(this->reg_domain); in wl3501_config()
1967 strlcpy(this->nick, "Planet WL3501", sizeof(this->nick)); in wl3501_config()
1968 spin_lock_init(&this->lock); in wl3501_config()
1969 init_waitqueue_head(&this->wait); in wl3501_config()