Lines Matching refs:ar

45 static int ar5523_submit_rx_cmd(struct ar5523 *ar);
46 static void ar5523_data_tx_pkt_put(struct ar5523 *ar);
48 static void ar5523_read_reply(struct ar5523 *ar, struct ar5523_cmd_hdr *hdr, in ar5523_read_reply() argument
61 ar5523_dbg(ar, "Code = %d len = %d\n", be32_to_cpu(hdr->code) & 0xff, in ar5523_read_reply()
77 ar5523_err(ar, "olen to small %d < %d\n", in ar5523_read_reply()
94 struct ar5523 *ar = urb->context; in ar5523_cmd_rx_cb() local
95 struct ar5523_tx_cmd *cmd = &ar->tx_cmd; in ar5523_cmd_rx_cb()
96 struct ar5523_cmd_hdr *hdr = ar->rx_cmd_buf; in ar5523_cmd_rx_cb()
102 ar5523_err(ar, "RX USB error %d.\n", urb->status); in ar5523_cmd_rx_cb()
107 ar5523_err(ar, "RX USB to short.\n"); in ar5523_cmd_rx_cb()
111 ar5523_dbg(ar, "%s code %02x priv %d\n", __func__, in ar5523_cmd_rx_cb()
121 ar5523_err(ar, "Unexpected command id: %02x\n", in ar5523_cmd_rx_cb()
125 ar5523_read_reply(ar, hdr, cmd); in ar5523_cmd_rx_cb()
129 ar5523_dbg(ar, "WDCMSG_DEVICE_AVAIL\n"); in ar5523_cmd_rx_cb()
136 ar5523_dbg(ar, "WDCMSG_SEND_COMPLETE: %d pending\n", in ar5523_cmd_rx_cb()
137 atomic_read(&ar->tx_nr_pending)); in ar5523_cmd_rx_cb()
138 if (!test_bit(AR5523_HW_UP, &ar->flags)) in ar5523_cmd_rx_cb()
139 ar5523_dbg(ar, "Unexpected WDCMSG_SEND_COMPLETE\n"); in ar5523_cmd_rx_cb()
141 mod_timer(&ar->tx_wd_timer, in ar5523_cmd_rx_cb()
143 ar5523_data_tx_pkt_put(ar); in ar5523_cmd_rx_cb()
153 ar5523_err(ar, "Invalid reply to WDCMSG_TARGET_START"); in ar5523_cmd_rx_cb()
163 ar5523_dbg(ar, "WDCMSG_STATS_UPDATE\n"); in ar5523_cmd_rx_cb()
168 ar5523_submit_rx_cmd(ar); in ar5523_cmd_rx_cb()
171 static int ar5523_alloc_rx_cmd(struct ar5523 *ar) in ar5523_alloc_rx_cmd() argument
173 ar->rx_cmd_urb = usb_alloc_urb(0, GFP_KERNEL); in ar5523_alloc_rx_cmd()
174 if (!ar->rx_cmd_urb) in ar5523_alloc_rx_cmd()
177 ar->rx_cmd_buf = usb_alloc_coherent(ar->dev, AR5523_MAX_RXCMDSZ, in ar5523_alloc_rx_cmd()
179 &ar->rx_cmd_urb->transfer_dma); in ar5523_alloc_rx_cmd()
180 if (!ar->rx_cmd_buf) { in ar5523_alloc_rx_cmd()
181 usb_free_urb(ar->rx_cmd_urb); in ar5523_alloc_rx_cmd()
187 static void ar5523_cancel_rx_cmd(struct ar5523 *ar) in ar5523_cancel_rx_cmd() argument
189 usb_kill_urb(ar->rx_cmd_urb); in ar5523_cancel_rx_cmd()
192 static void ar5523_free_rx_cmd(struct ar5523 *ar) in ar5523_free_rx_cmd() argument
194 usb_free_coherent(ar->dev, AR5523_MAX_RXCMDSZ, in ar5523_free_rx_cmd()
195 ar->rx_cmd_buf, ar->rx_cmd_urb->transfer_dma); in ar5523_free_rx_cmd()
196 usb_free_urb(ar->rx_cmd_urb); in ar5523_free_rx_cmd()
199 static int ar5523_submit_rx_cmd(struct ar5523 *ar) in ar5523_submit_rx_cmd() argument
203 usb_fill_bulk_urb(ar->rx_cmd_urb, ar->dev, in ar5523_submit_rx_cmd()
204 ar5523_cmd_rx_pipe(ar->dev), ar->rx_cmd_buf, in ar5523_submit_rx_cmd()
205 AR5523_MAX_RXCMDSZ, ar5523_cmd_rx_cb, ar); in ar5523_submit_rx_cmd()
206 ar->rx_cmd_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in ar5523_submit_rx_cmd()
208 error = usb_submit_urb(ar->rx_cmd_urb, GFP_ATOMIC); in ar5523_submit_rx_cmd()
211 ar5523_err(ar, "error %d when submitting rx urb\n", in ar5523_submit_rx_cmd()
224 struct ar5523 *ar = cmd->ar; in ar5523_cmd_tx_cb() local
227 ar5523_err(ar, "Failed to TX command. Status = %d\n", in ar5523_cmd_tx_cb()
240 static int ar5523_cmd(struct ar5523 *ar, u32 code, const void *idata, in ar5523_cmd() argument
244 struct ar5523_tx_cmd *cmd = &ar->tx_cmd; in ar5523_cmd()
264 ar5523_dbg(ar, "do cmd %02x\n", code); in ar5523_cmd()
266 usb_fill_bulk_urb(cmd->urb_tx, ar->dev, ar5523_cmd_tx_pipe(ar->dev), in ar5523_cmd()
272 ar5523_err(ar, "could not send command 0x%x, error=%d\n", in ar5523_cmd()
279 ar5523_err(ar, "timeout waiting for command %02x reply\n", in ar5523_cmd()
286 static int ar5523_cmd_write(struct ar5523 *ar, u32 code, const void *data, in ar5523_cmd_write() argument
290 return ar5523_cmd(ar, code, data, len, NULL, 0, flags); in ar5523_cmd_write()
293 static int ar5523_cmd_read(struct ar5523 *ar, u32 code, const void *idata, in ar5523_cmd_read() argument
297 return ar5523_cmd(ar, code, idata, ilen, odata, olen, flags); in ar5523_cmd_read()
300 static int ar5523_config(struct ar5523 *ar, u32 reg, u32 val) in ar5523_config() argument
309 error = ar5523_cmd_write(ar, WDCMSG_TARGET_SET_CONFIG, &write, in ar5523_config()
312 ar5523_err(ar, "could not write register 0x%02x\n", reg); in ar5523_config()
316 static int ar5523_config_multi(struct ar5523 *ar, u32 reg, const void *data, in ar5523_config_multi() argument
327 error = ar5523_cmd_write(ar, WDCMSG_TARGET_SET_CONFIG, &write, in ar5523_config_multi()
330 ar5523_err(ar, "could not write %d bytes to register 0x%02x\n", in ar5523_config_multi()
335 static int ar5523_get_status(struct ar5523 *ar, u32 which, void *odata, in ar5523_get_status() argument
342 error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_STATUS, in ar5523_get_status()
345 ar5523_err(ar, "could not read EEPROM offset 0x%02x\n", which); in ar5523_get_status()
349 static int ar5523_get_capability(struct ar5523 *ar, u32 cap, u32 *val) in ar5523_get_capability() argument
355 error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_CAPABILITY, &cap_be, in ar5523_get_capability()
359 ar5523_err(ar, "could not read capability %u\n", cap); in ar5523_get_capability()
366 static int ar5523_get_devcap(struct ar5523 *ar) in ar5523_get_devcap() argument
369 error = ar5523_get_capability(ar, x, &cap); \ in ar5523_get_devcap()
372 ar5523_info(ar, "Cap: " \ in ar5523_get_devcap()
415 static int ar5523_set_ledsteady(struct ar5523 *ar, int lednum, int ledmode) in ar5523_set_ledsteady() argument
422 ar5523_dbg(ar, "set %s led %s (steady)\n", in ar5523_set_ledsteady()
425 return ar5523_cmd_write(ar, WDCMSG_SET_LED_STEADY, &led, sizeof(led), in ar5523_set_ledsteady()
429 static int ar5523_set_rxfilter(struct ar5523 *ar, u32 bits, u32 op) in ar5523_set_rxfilter() argument
436 ar5523_dbg(ar, "setting Rx filter=0x%x flags=0x%x\n", bits, op); in ar5523_set_rxfilter()
437 return ar5523_cmd_write(ar, WDCMSG_RX_FILTER, &rxfilter, in ar5523_set_rxfilter()
441 static int ar5523_reset_tx_queues(struct ar5523 *ar) in ar5523_reset_tx_queues() argument
445 ar5523_dbg(ar, "resetting Tx queue\n"); in ar5523_reset_tx_queues()
446 return ar5523_cmd_write(ar, WDCMSG_RELEASE_TX_QUEUE, in ar5523_reset_tx_queues()
450 static int ar5523_set_chan(struct ar5523 *ar) in ar5523_set_chan() argument
452 struct ieee80211_conf *conf = &ar->hw->conf; in ar5523_set_chan()
464 ar5523_dbg(ar, "set chan flags 0x%x freq %d\n", in ar5523_set_chan()
467 return ar5523_cmd_write(ar, WDCMSG_RESET, &reset, sizeof(reset), 0); in ar5523_set_chan()
470 static int ar5523_queue_init(struct ar5523 *ar) in ar5523_queue_init() argument
474 ar5523_dbg(ar, "setting up Tx queue\n"); in ar5523_queue_init()
484 return ar5523_cmd_write(ar, WDCMSG_SETUP_TX_QUEUE, &qinfo, in ar5523_queue_init()
488 static int ar5523_switch_chan(struct ar5523 *ar) in ar5523_switch_chan() argument
492 error = ar5523_set_chan(ar); in ar5523_switch_chan()
494 ar5523_err(ar, "could not set chan, error %d\n", error); in ar5523_switch_chan()
499 error = ar5523_reset_tx_queues(ar); in ar5523_switch_chan()
501 ar5523_err(ar, "could not reset Tx queues, error %d\n", in ar5523_switch_chan()
506 error = ar5523_queue_init(ar); in ar5523_switch_chan()
508 ar5523_err(ar, "could not init wme, error %d\n", error); in ar5523_switch_chan()
514 static void ar5523_rx_data_put(struct ar5523 *ar, in ar5523_rx_data_put() argument
518 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_rx_data_put()
519 list_move(&data->list, &ar->rx_data_free); in ar5523_rx_data_put()
520 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_rx_data_put()
526 struct ar5523 *ar = data->ar; in ar5523_data_rx_cb() local
529 struct ieee80211_hw *hw = ar->hw; in ar5523_data_rx_cb()
535 ar5523_dbg(ar, "%s\n", __func__); in ar5523_data_rx_cb()
539 ar5523_err(ar, "%s: USB err: %d\n", __func__, in ar5523_data_rx_cb()
545 ar5523_err(ar, "RX: wrong xfer size (usblen=%d)\n", usblen); in ar5523_data_rx_cb()
553 ar5523_dbg(ar, "RX: No final flag. s: %d f: %02x l: %d\n", in ar5523_data_rx_cb()
564 if (rxlen > ar->rxbufsz) { in ar5523_data_rx_cb()
565 ar5523_dbg(ar, "RX: Bad descriptor (len=%d)\n", in ar5523_data_rx_cb()
571 ar5523_dbg(ar, "RX: rxlen is 0\n"); in ar5523_data_rx_cb()
576 ar5523_dbg(ar, "Bad RX status (0x%x len = %d). Skip\n", in ar5523_data_rx_cb()
586 ar5523_dbg(ar, "eek, alignment workaround activated\n"); in ar5523_data_rx_cb()
608 ar5523_rx_data_put(ar, data); in ar5523_data_rx_cb()
609 if (atomic_inc_return(&ar->rx_data_free_cnt) >= in ar5523_data_rx_cb()
611 test_bit(AR5523_HW_UP, &ar->flags)) in ar5523_data_rx_cb()
612 queue_work(ar->wq, &ar->rx_refill_work); in ar5523_data_rx_cb()
617 struct ar5523 *ar = container_of(work, struct ar5523, rx_refill_work); in ar5523_rx_refill_work() local
622 ar5523_dbg(ar, "%s\n", __func__); in ar5523_rx_refill_work()
624 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
626 if (!list_empty(&ar->rx_data_free)) in ar5523_rx_refill_work()
627 data = (struct ar5523_rx_data *) ar->rx_data_free.next; in ar5523_rx_refill_work()
630 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
635 data->skb = alloc_skb(ar->rxbufsz, GFP_KERNEL); in ar5523_rx_refill_work()
637 ar5523_err(ar, "could not allocate rx skbuff\n"); in ar5523_rx_refill_work()
641 usb_fill_bulk_urb(data->urb, ar->dev, in ar5523_rx_refill_work()
642 ar5523_data_rx_pipe(ar->dev), data->skb->data, in ar5523_rx_refill_work()
643 ar->rxbufsz, ar5523_data_rx_cb, data); in ar5523_rx_refill_work()
645 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
646 list_move(&data->list, &ar->rx_data_used); in ar5523_rx_refill_work()
647 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
648 atomic_dec(&ar->rx_data_free_cnt); in ar5523_rx_refill_work()
654 ar5523_err(ar, "Err sending rx data urb %d\n", in ar5523_rx_refill_work()
656 ar5523_rx_data_put(ar, data); in ar5523_rx_refill_work()
657 atomic_inc(&ar->rx_data_free_cnt); in ar5523_rx_refill_work()
666 static void ar5523_cancel_rx_bufs(struct ar5523 *ar) in ar5523_cancel_rx_bufs() argument
672 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_cancel_rx_bufs()
673 if (!list_empty(&ar->rx_data_used)) in ar5523_cancel_rx_bufs()
674 data = (struct ar5523_rx_data *) ar->rx_data_used.next; in ar5523_cancel_rx_bufs()
677 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_cancel_rx_bufs()
683 list_move(&data->list, &ar->rx_data_free); in ar5523_cancel_rx_bufs()
684 atomic_inc(&ar->rx_data_free_cnt); in ar5523_cancel_rx_bufs()
688 static void ar5523_free_rx_bufs(struct ar5523 *ar) in ar5523_free_rx_bufs() argument
692 ar5523_cancel_rx_bufs(ar); in ar5523_free_rx_bufs()
693 while (!list_empty(&ar->rx_data_free)) { in ar5523_free_rx_bufs()
694 data = (struct ar5523_rx_data *) ar->rx_data_free.next; in ar5523_free_rx_bufs()
700 static int ar5523_alloc_rx_bufs(struct ar5523 *ar) in ar5523_alloc_rx_bufs() argument
705 struct ar5523_rx_data *data = &ar->rx_data[i]; in ar5523_alloc_rx_bufs()
707 data->ar = ar; in ar5523_alloc_rx_bufs()
710 ar5523_err(ar, "could not allocate rx data urb\n"); in ar5523_alloc_rx_bufs()
713 list_add_tail(&data->list, &ar->rx_data_free); in ar5523_alloc_rx_bufs()
714 atomic_inc(&ar->rx_data_free_cnt); in ar5523_alloc_rx_bufs()
719 ar5523_free_rx_bufs(ar); in ar5523_alloc_rx_bufs()
723 static void ar5523_data_tx_pkt_put(struct ar5523 *ar) in ar5523_data_tx_pkt_put() argument
725 atomic_dec(&ar->tx_nr_total); in ar5523_data_tx_pkt_put()
726 if (!atomic_dec_return(&ar->tx_nr_pending)) { in ar5523_data_tx_pkt_put()
727 del_timer(&ar->tx_wd_timer); in ar5523_data_tx_pkt_put()
728 wake_up(&ar->tx_flush_waitq); in ar5523_data_tx_pkt_put()
731 if (atomic_read(&ar->tx_nr_total) < AR5523_TX_DATA_RESTART_COUNT) { in ar5523_data_tx_pkt_put()
732 ar5523_dbg(ar, "restart tx queue\n"); in ar5523_data_tx_pkt_put()
733 ieee80211_wake_queues(ar->hw); in ar5523_data_tx_pkt_put()
743 struct ar5523 *ar = data->ar; in ar5523_data_tx_cb() local
746 ar5523_dbg(ar, "data tx urb completed: %d\n", urb->status); in ar5523_data_tx_cb()
748 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_data_tx_cb()
750 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_data_tx_cb()
753 ar5523_dbg(ar, "%s: urb status: %d\n", __func__, urb->status); in ar5523_data_tx_cb()
754 ar5523_data_tx_pkt_put(ar); in ar5523_data_tx_cb()
755 ieee80211_free_txskb(ar->hw, skb); in ar5523_data_tx_cb()
758 ieee80211_tx_status_irqsafe(ar->hw, skb); in ar5523_data_tx_cb()
770 struct ar5523 *ar = hw->priv; in ar5523_tx() local
773 ar5523_dbg(ar, "tx called\n"); in ar5523_tx()
774 if (atomic_inc_return(&ar->tx_nr_total) >= AR5523_TX_DATA_COUNT) { in ar5523_tx()
775 ar5523_dbg(ar, "tx queue full\n"); in ar5523_tx()
776 ar5523_dbg(ar, "stop queues (tot %d pend %d)\n", in ar5523_tx()
777 atomic_read(&ar->tx_nr_total), in ar5523_tx()
778 atomic_read(&ar->tx_nr_pending)); in ar5523_tx()
782 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx()
783 list_add_tail(&data->list, &ar->tx_queue_pending); in ar5523_tx()
784 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx()
786 ieee80211_queue_work(ar->hw, &ar->tx_work); in ar5523_tx()
789 static void ar5523_tx_work_locked(struct ar5523 *ar) in ar5523_tx_work_locked() argument
804 ar5523_dbg(ar, "%s\n", __func__); in ar5523_tx_work_locked()
806 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
807 if (!list_empty(&ar->tx_queue_pending)) { in ar5523_tx_work_locked()
809 ar->tx_queue_pending.next; in ar5523_tx_work_locked()
813 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
827 ar5523_err(ar, "Failed to allocate TX urb\n"); in ar5523_tx_work_locked()
828 ieee80211_free_txskb(ar->hw, skb); in ar5523_tx_work_locked()
832 data->ar = ar; in ar5523_tx_work_locked()
848 if (test_bit(AR5523_CONNECTED, &ar->flags)) in ar5523_tx_work_locked()
859 usb_fill_bulk_urb(urb, ar->dev, ar5523_data_tx_pipe(ar->dev), in ar5523_tx_work_locked()
862 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
863 list_add_tail(&data->list, &ar->tx_queue_submitted); in ar5523_tx_work_locked()
864 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
865 mod_timer(&ar->tx_wd_timer, jiffies + AR5523_TX_WD_TIMEOUT); in ar5523_tx_work_locked()
866 atomic_inc(&ar->tx_nr_pending); in ar5523_tx_work_locked()
868 ar5523_dbg(ar, "TX Frame (%d pending)\n", in ar5523_tx_work_locked()
869 atomic_read(&ar->tx_nr_pending)); in ar5523_tx_work_locked()
872 ar5523_err(ar, "error %d when submitting tx urb\n", in ar5523_tx_work_locked()
874 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
876 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
877 atomic_dec(&ar->tx_nr_pending); in ar5523_tx_work_locked()
878 ar5523_data_tx_pkt_put(ar); in ar5523_tx_work_locked()
880 ieee80211_free_txskb(ar->hw, skb); in ar5523_tx_work_locked()
887 struct ar5523 *ar = container_of(work, struct ar5523, tx_work); in ar5523_tx_work() local
889 ar5523_dbg(ar, "%s\n", __func__); in ar5523_tx_work()
890 mutex_lock(&ar->mutex); in ar5523_tx_work()
891 ar5523_tx_work_locked(ar); in ar5523_tx_work()
892 mutex_unlock(&ar->mutex); in ar5523_tx_work()
897 struct ar5523 *ar = (struct ar5523 *) arg; in ar5523_tx_wd_timer() local
899 ar5523_dbg(ar, "TX watchdog timer triggered\n"); in ar5523_tx_wd_timer()
900 ieee80211_queue_work(ar->hw, &ar->tx_wd_work); in ar5523_tx_wd_timer()
905 struct ar5523 *ar = container_of(work, struct ar5523, tx_wd_work); in ar5523_tx_wd_work() local
911 mutex_lock(&ar->mutex); in ar5523_tx_wd_work()
912 ar5523_err(ar, "TX queue stuck (tot %d pend %d)\n", in ar5523_tx_wd_work()
913 atomic_read(&ar->tx_nr_total), in ar5523_tx_wd_work()
914 atomic_read(&ar->tx_nr_pending)); in ar5523_tx_wd_work()
916 ar5523_err(ar, "Will restart dongle.\n"); in ar5523_tx_wd_work()
917 ar5523_cmd_write(ar, WDCMSG_TARGET_RESET, NULL, 0, 0); in ar5523_tx_wd_work()
918 mutex_unlock(&ar->mutex); in ar5523_tx_wd_work()
921 static void ar5523_flush_tx(struct ar5523 *ar) in ar5523_flush_tx() argument
923 ar5523_tx_work_locked(ar); in ar5523_flush_tx()
926 if (test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) in ar5523_flush_tx()
928 if (!wait_event_timeout(ar->tx_flush_waitq, in ar5523_flush_tx()
929 !atomic_read(&ar->tx_nr_pending), AR5523_FLUSH_TIMEOUT)) in ar5523_flush_tx()
930 ar5523_err(ar, "flush timeout (tot %d pend %d)\n", in ar5523_flush_tx()
931 atomic_read(&ar->tx_nr_total), in ar5523_flush_tx()
932 atomic_read(&ar->tx_nr_pending)); in ar5523_flush_tx()
935 static void ar5523_free_tx_cmd(struct ar5523 *ar) in ar5523_free_tx_cmd() argument
937 struct ar5523_tx_cmd *cmd = &ar->tx_cmd; in ar5523_free_tx_cmd()
939 usb_free_coherent(ar->dev, AR5523_MAX_RXCMDSZ, cmd->buf_tx, in ar5523_free_tx_cmd()
944 static int ar5523_alloc_tx_cmd(struct ar5523 *ar) in ar5523_alloc_tx_cmd() argument
946 struct ar5523_tx_cmd *cmd = &ar->tx_cmd; in ar5523_alloc_tx_cmd()
948 cmd->ar = ar; in ar5523_alloc_tx_cmd()
953 ar5523_err(ar, "could not allocate urb\n"); in ar5523_alloc_tx_cmd()
956 cmd->buf_tx = usb_alloc_coherent(ar->dev, AR5523_MAX_TXCMDSZ, in ar5523_alloc_tx_cmd()
972 struct ar5523 *ar = container_of(work, struct ar5523, stat_work.work); in ar5523_stat_work() local
975 ar5523_dbg(ar, "%s\n", __func__); in ar5523_stat_work()
976 mutex_lock(&ar->mutex); in ar5523_stat_work()
982 error = ar5523_cmd_write(ar, WDCMSG_TARGET_GET_STATS, NULL, 0, 0); in ar5523_stat_work()
984 ar5523_err(ar, "could not query stats, error %d\n", error); in ar5523_stat_work()
985 mutex_unlock(&ar->mutex); in ar5523_stat_work()
986 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work, HZ); in ar5523_stat_work()
994 struct ar5523 *ar = hw->priv; in ar5523_start() local
998 ar5523_dbg(ar, "start called\n"); in ar5523_start()
1000 mutex_lock(&ar->mutex); in ar5523_start()
1002 ar5523_cmd_write(ar, WDCMSG_BIND, &val, sizeof(val), 0); in ar5523_start()
1005 ar5523_config_multi(ar, CFG_MAC_ADDR, &ar->hw->wiphy->perm_addr, in ar5523_start()
1009 ar5523_config(ar, CFG_RATE_CONTROL_ENABLE, 0x00000001); in ar5523_start()
1010 ar5523_config(ar, CFG_DIVERSITY_CTL, 0x00000001); in ar5523_start()
1011 ar5523_config(ar, CFG_ABOLT, 0x0000003f); in ar5523_start()
1012 ar5523_config(ar, CFG_WME_ENABLED, 0x00000000); in ar5523_start()
1014 ar5523_config(ar, CFG_SERVICE_TYPE, 1); in ar5523_start()
1015 ar5523_config(ar, CFG_TP_SCALE, 0x00000000); in ar5523_start()
1016 ar5523_config(ar, CFG_TPC_HALF_DBM5, 0x0000003c); in ar5523_start()
1017 ar5523_config(ar, CFG_TPC_HALF_DBM2, 0x0000003c); in ar5523_start()
1018 ar5523_config(ar, CFG_OVERRD_TX_POWER, 0x00000000); in ar5523_start()
1019 ar5523_config(ar, CFG_GMODE_PROTECTION, 0x00000000); in ar5523_start()
1020 ar5523_config(ar, CFG_GMODE_PROTECT_RATE_INDEX, 0x00000003); in ar5523_start()
1021 ar5523_config(ar, CFG_PROTECTION_TYPE, 0x00000000); in ar5523_start()
1022 ar5523_config(ar, CFG_MODE_CTS, 0x00000002); in ar5523_start()
1024 error = ar5523_cmd_read(ar, WDCMSG_TARGET_START, NULL, 0, in ar5523_start()
1027 ar5523_dbg(ar, "could not start target, error %d\n", error); in ar5523_start()
1030 ar5523_dbg(ar, "WDCMSG_TARGET_START returns handle: 0x%x\n", in ar5523_start()
1033 ar5523_switch_chan(ar); in ar5523_start()
1036 ar5523_cmd_write(ar, WDCMSG_SET_PWR_MODE, &val, sizeof(val), 0); in ar5523_start()
1038 ar5523_cmd_write(ar, WDCMSG_RESET_KEY_CACHE, NULL, 0, 0); in ar5523_start()
1040 set_bit(AR5523_HW_UP, &ar->flags); in ar5523_start()
1041 queue_work(ar->wq, &ar->rx_refill_work); in ar5523_start()
1044 ar5523_set_rxfilter(ar, 0, UATH_FILTER_OP_INIT); in ar5523_start()
1045 ar5523_set_rxfilter(ar, in ar5523_start()
1050 ar5523_set_ledsteady(ar, UATH_LED_ACTIVITY, UATH_LED_ON); in ar5523_start()
1051 ar5523_dbg(ar, "start OK\n"); in ar5523_start()
1054 mutex_unlock(&ar->mutex); in ar5523_start()
1060 struct ar5523 *ar = hw->priv; in ar5523_stop() local
1062 ar5523_dbg(ar, "stop called\n"); in ar5523_stop()
1064 cancel_delayed_work_sync(&ar->stat_work); in ar5523_stop()
1065 mutex_lock(&ar->mutex); in ar5523_stop()
1066 clear_bit(AR5523_HW_UP, &ar->flags); in ar5523_stop()
1068 ar5523_set_ledsteady(ar, UATH_LED_LINK, UATH_LED_OFF); in ar5523_stop()
1069 ar5523_set_ledsteady(ar, UATH_LED_ACTIVITY, UATH_LED_OFF); in ar5523_stop()
1071 ar5523_cmd_write(ar, WDCMSG_TARGET_STOP, NULL, 0, 0); in ar5523_stop()
1073 del_timer_sync(&ar->tx_wd_timer); in ar5523_stop()
1074 cancel_work_sync(&ar->tx_wd_work); in ar5523_stop()
1075 cancel_work_sync(&ar->rx_refill_work); in ar5523_stop()
1076 ar5523_cancel_rx_bufs(ar); in ar5523_stop()
1077 mutex_unlock(&ar->mutex); in ar5523_stop()
1082 struct ar5523 *ar = hw->priv; in ar5523_set_rts_threshold() local
1085 ar5523_dbg(ar, "set_rts_threshold called\n"); in ar5523_set_rts_threshold()
1086 mutex_lock(&ar->mutex); in ar5523_set_rts_threshold()
1088 ret = ar5523_config(ar, CFG_USER_RTS_THRESHOLD, value); in ar5523_set_rts_threshold()
1090 mutex_unlock(&ar->mutex); in ar5523_set_rts_threshold()
1097 struct ar5523 *ar = hw->priv; in ar5523_flush() local
1099 ar5523_dbg(ar, "flush called\n"); in ar5523_flush()
1100 ar5523_flush_tx(ar); in ar5523_flush()
1106 struct ar5523 *ar = hw->priv; in ar5523_add_interface() local
1108 ar5523_dbg(ar, "add interface called\n"); in ar5523_add_interface()
1110 if (ar->vif) { in ar5523_add_interface()
1111 ar5523_dbg(ar, "invalid add_interface\n"); in ar5523_add_interface()
1117 ar->vif = vif; in ar5523_add_interface()
1128 struct ar5523 *ar = hw->priv; in ar5523_remove_interface() local
1130 ar5523_dbg(ar, "remove interface called\n"); in ar5523_remove_interface()
1131 ar->vif = NULL; in ar5523_remove_interface()
1136 struct ar5523 *ar = hw->priv; in ar5523_hwconfig() local
1138 ar5523_dbg(ar, "config called\n"); in ar5523_hwconfig()
1139 mutex_lock(&ar->mutex); in ar5523_hwconfig()
1141 ar5523_dbg(ar, "Do channel switch\n"); in ar5523_hwconfig()
1142 ar5523_flush_tx(ar); in ar5523_hwconfig()
1143 ar5523_switch_chan(ar); in ar5523_hwconfig()
1145 mutex_unlock(&ar->mutex); in ar5523_hwconfig()
1149 static int ar5523_get_wlan_mode(struct ar5523 *ar, in ar5523_get_wlan_mode() argument
1157 band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band]; in ar5523_get_wlan_mode()
1158 sta = ieee80211_find_sta(ar->vif, bss_conf->bssid); in ar5523_get_wlan_mode()
1160 ar5523_info(ar, "STA not found!\n"); in ar5523_get_wlan_mode()
1163 sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band]; in ar5523_get_wlan_mode()
1185 static void ar5523_create_rateset(struct ar5523 *ar, in ar5523_create_rateset() argument
1195 sta = ieee80211_find_sta(ar->vif, bss_conf->bssid); in ar5523_create_rateset()
1198 ar5523_info(ar, "STA not found. Cannot set rates\n"); in ar5523_create_rateset()
1201 sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band]; in ar5523_create_rateset()
1203 ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set); in ar5523_create_rateset()
1205 band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band]; in ar5523_create_rateset()
1208 ar5523_dbg(ar, "Considering rate %d : %d\n", in ar5523_create_rateset()
1223 static int ar5523_set_basic_rates(struct ar5523 *ar, in ar5523_set_basic_rates() argument
1231 ar5523_create_rateset(ar, bss, &rates.rateset, true); in ar5523_set_basic_rates()
1233 return ar5523_cmd_write(ar, WDCMSG_SET_BASIC_RATE, &rates, in ar5523_set_basic_rates()
1237 static int ar5523_create_connection(struct ar5523 *ar, in ar5523_create_connection() argument
1250 ar5523_create_rateset(ar, bss, &create.connattr.rateset, false); in ar5523_create_connection()
1252 wlan_mode = ar5523_get_wlan_mode(ar, bss); in ar5523_create_connection()
1255 return ar5523_cmd_write(ar, WDCMSG_CREATE_CONNECTION, &create, in ar5523_create_connection()
1259 static int ar5523_write_associd(struct ar5523 *ar, in ar5523_write_associd() argument
1269 return ar5523_cmd_write(ar, WDCMSG_WRITE_ASSOCID, &associd, in ar5523_write_associd()
1278 struct ar5523 *ar = hw->priv; in ar5523_bss_info_changed() local
1281 ar5523_dbg(ar, "bss_info_changed called\n"); in ar5523_bss_info_changed()
1282 mutex_lock(&ar->mutex); in ar5523_bss_info_changed()
1288 error = ar5523_create_connection(ar, vif, bss); in ar5523_bss_info_changed()
1290 ar5523_err(ar, "could not create connection\n"); in ar5523_bss_info_changed()
1294 error = ar5523_set_basic_rates(ar, bss); in ar5523_bss_info_changed()
1296 ar5523_err(ar, "could not set negotiated rate set\n"); in ar5523_bss_info_changed()
1300 error = ar5523_write_associd(ar, bss); in ar5523_bss_info_changed()
1302 ar5523_err(ar, "could not set association\n"); in ar5523_bss_info_changed()
1307 ar5523_set_ledsteady(ar, UATH_LED_LINK, UATH_LED_ON); in ar5523_bss_info_changed()
1308 set_bit(AR5523_CONNECTED, &ar->flags); in ar5523_bss_info_changed()
1309 ieee80211_queue_delayed_work(hw, &ar->stat_work, HZ); in ar5523_bss_info_changed()
1312 cancel_delayed_work(&ar->stat_work); in ar5523_bss_info_changed()
1313 clear_bit(AR5523_CONNECTED, &ar->flags); in ar5523_bss_info_changed()
1314 ar5523_set_ledsteady(ar, UATH_LED_LINK, UATH_LED_OFF); in ar5523_bss_info_changed()
1318 mutex_unlock(&ar->mutex); in ar5523_bss_info_changed()
1332 struct ar5523 *ar = hw->priv; in ar5523_configure_filter() local
1335 ar5523_dbg(ar, "configure_filter called\n"); in ar5523_configure_filter()
1336 mutex_lock(&ar->mutex); in ar5523_configure_filter()
1337 ar5523_flush_tx(ar); in ar5523_configure_filter()
1349 ar5523_set_rxfilter(ar, 0, UATH_FILTER_OP_INIT); in ar5523_configure_filter()
1350 ar5523_set_rxfilter(ar, filter, UATH_FILTER_OP_SET); in ar5523_configure_filter()
1352 mutex_unlock(&ar->mutex); in ar5523_configure_filter()
1368 static int ar5523_host_available(struct ar5523 *ar) in ar5523_host_available() argument
1377 return ar5523_cmd_read(ar, WDCMSG_HOST_AVAILABLE, in ar5523_host_available()
1381 static int ar5523_get_devstatus(struct ar5523 *ar) in ar5523_get_devstatus() argument
1387 error = ar5523_get_status(ar, ST_MAC_ADDR, macaddr, ETH_ALEN); in ar5523_get_devstatus()
1389 ar5523_err(ar, "could not read MAC address\n"); in ar5523_get_devstatus()
1393 SET_IEEE80211_PERM_ADDR(ar->hw, macaddr); in ar5523_get_devstatus()
1395 error = ar5523_get_status(ar, ST_SERIAL_NUMBER, in ar5523_get_devstatus()
1396 &ar->serial[0], sizeof(ar->serial)); in ar5523_get_devstatus()
1398 ar5523_err(ar, "could not read device serial number\n"); in ar5523_get_devstatus()
1406 static int ar5523_get_max_rxsz(struct ar5523 *ar) in ar5523_get_max_rxsz() argument
1412 error = ar5523_get_status(ar, ST_WDC_TRANSPORT_CHUNK_SIZE, &rxsize, in ar5523_get_max_rxsz()
1415 ar5523_err(ar, "could not read max RX size\n"); in ar5523_get_max_rxsz()
1419 ar->rxbufsz = be32_to_cpu(rxsize); in ar5523_get_max_rxsz()
1421 if (!ar->rxbufsz || ar->rxbufsz > AR5523_SANE_RXBUFSZ) { in ar5523_get_max_rxsz()
1422 ar5523_err(ar, "Bad rxbufsz from device. Using %d instead\n", in ar5523_get_max_rxsz()
1424 ar->rxbufsz = AR5523_SANE_RXBUFSZ; in ar5523_get_max_rxsz()
1427 ar5523_dbg(ar, "Max RX buf size: %d\n", ar->rxbufsz); in ar5523_get_max_rxsz()
1467 static int ar5523_init_modes(struct ar5523 *ar) in ar5523_init_modes() argument
1469 BUILD_BUG_ON(sizeof(ar->channels) != sizeof(ar5523_channels)); in ar5523_init_modes()
1470 BUILD_BUG_ON(sizeof(ar->rates) != sizeof(ar5523_rates)); in ar5523_init_modes()
1472 memcpy(ar->channels, ar5523_channels, sizeof(ar5523_channels)); in ar5523_init_modes()
1473 memcpy(ar->rates, ar5523_rates, sizeof(ar5523_rates)); in ar5523_init_modes()
1475 ar->band.band = IEEE80211_BAND_2GHZ; in ar5523_init_modes()
1476 ar->band.channels = ar->channels; in ar5523_init_modes()
1477 ar->band.n_channels = ARRAY_SIZE(ar5523_channels); in ar5523_init_modes()
1478 ar->band.bitrates = ar->rates; in ar5523_init_modes()
1479 ar->band.n_bitrates = ARRAY_SIZE(ar5523_rates); in ar5523_init_modes()
1480 ar->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &ar->band; in ar5523_init_modes()
1585 struct ar5523 *ar; in ar5523_probe() local
1597 hw = ieee80211_alloc_hw(sizeof(*ar), &ar5523_ops); in ar5523_probe()
1602 ar = hw->priv; in ar5523_probe()
1603 ar->hw = hw; in ar5523_probe()
1604 ar->dev = dev; in ar5523_probe()
1605 mutex_init(&ar->mutex); in ar5523_probe()
1607 INIT_DELAYED_WORK(&ar->stat_work, ar5523_stat_work); in ar5523_probe()
1608 init_timer(&ar->tx_wd_timer); in ar5523_probe()
1609 setup_timer(&ar->tx_wd_timer, ar5523_tx_wd_timer, (unsigned long) ar); in ar5523_probe()
1610 INIT_WORK(&ar->tx_wd_work, ar5523_tx_wd_work); in ar5523_probe()
1611 INIT_WORK(&ar->tx_work, ar5523_tx_work); in ar5523_probe()
1612 INIT_LIST_HEAD(&ar->tx_queue_pending); in ar5523_probe()
1613 INIT_LIST_HEAD(&ar->tx_queue_submitted); in ar5523_probe()
1614 spin_lock_init(&ar->tx_data_list_lock); in ar5523_probe()
1615 atomic_set(&ar->tx_nr_total, 0); in ar5523_probe()
1616 atomic_set(&ar->tx_nr_pending, 0); in ar5523_probe()
1617 init_waitqueue_head(&ar->tx_flush_waitq); in ar5523_probe()
1619 atomic_set(&ar->rx_data_free_cnt, 0); in ar5523_probe()
1620 INIT_WORK(&ar->rx_refill_work, ar5523_rx_refill_work); in ar5523_probe()
1621 INIT_LIST_HEAD(&ar->rx_data_free); in ar5523_probe()
1622 INIT_LIST_HEAD(&ar->rx_data_used); in ar5523_probe()
1623 spin_lock_init(&ar->rx_data_list_lock); in ar5523_probe()
1625 ar->wq = create_singlethread_workqueue("ar5523"); in ar5523_probe()
1626 if (!ar->wq) { in ar5523_probe()
1627 ar5523_err(ar, "Could not create wq\n"); in ar5523_probe()
1631 error = ar5523_alloc_rx_bufs(ar); in ar5523_probe()
1633 ar5523_err(ar, "Could not allocate rx buffers\n"); in ar5523_probe()
1637 error = ar5523_alloc_rx_cmd(ar); in ar5523_probe()
1639 ar5523_err(ar, "Could not allocate rx command buffers\n"); in ar5523_probe()
1643 error = ar5523_alloc_tx_cmd(ar); in ar5523_probe()
1645 ar5523_err(ar, "Could not allocate tx command buffers\n"); in ar5523_probe()
1649 error = ar5523_submit_rx_cmd(ar); in ar5523_probe()
1651 ar5523_err(ar, "Failed to submit rx cmd\n"); in ar5523_probe()
1658 error = ar5523_host_available(ar); in ar5523_probe()
1660 ar5523_err(ar, "could not initialize adapter\n"); in ar5523_probe()
1664 error = ar5523_get_max_rxsz(ar); in ar5523_probe()
1666 ar5523_err(ar, "could not get caps from adapter\n"); in ar5523_probe()
1670 error = ar5523_get_devcap(ar); in ar5523_probe()
1672 ar5523_err(ar, "could not get caps from adapter\n"); in ar5523_probe()
1676 error = ar5523_get_devstatus(ar); in ar5523_probe()
1678 ar5523_err(ar, "could not get device status\n"); in ar5523_probe()
1682 ar5523_info(ar, "MAC/BBP AR5523, RF AR%c112\n", in ar5523_probe()
1685 ar->vif = NULL; in ar5523_probe()
1694 error = ar5523_init_modes(ar); in ar5523_probe()
1702 ar5523_err(ar, "could not register device\n"); in ar5523_probe()
1706 ar5523_info(ar, "Found and initialized AR5523 device\n"); in ar5523_probe()
1710 ar5523_cancel_rx_cmd(ar); in ar5523_probe()
1712 ar5523_free_tx_cmd(ar); in ar5523_probe()
1714 ar5523_free_rx_cmd(ar); in ar5523_probe()
1716 ar5523_free_rx_bufs(ar); in ar5523_probe()
1718 destroy_workqueue(ar->wq); in ar5523_probe()
1728 struct ar5523 *ar = hw->priv; in ar5523_disconnect() local
1730 ar5523_dbg(ar, "detaching\n"); in ar5523_disconnect()
1731 set_bit(AR5523_USB_DISCONNECTED, &ar->flags); in ar5523_disconnect()
1735 ar5523_cancel_rx_cmd(ar); in ar5523_disconnect()
1736 ar5523_free_tx_cmd(ar); in ar5523_disconnect()
1737 ar5523_free_rx_cmd(ar); in ar5523_disconnect()
1738 ar5523_free_rx_bufs(ar); in ar5523_disconnect()
1740 destroy_workqueue(ar->wq); in ar5523_disconnect()