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()
265 ar5523_dbg(ar, "do cmd %02x\n", code); in ar5523_cmd()
267 usb_fill_bulk_urb(cmd->urb_tx, ar->dev, ar5523_cmd_tx_pipe(ar->dev), in ar5523_cmd()
273 ar5523_err(ar, "could not send command 0x%x, error=%d\n", in ar5523_cmd()
280 ar5523_err(ar, "timeout waiting for command %02x reply\n", in ar5523_cmd()
287 static int ar5523_cmd_write(struct ar5523 *ar, u32 code, const void *data, in ar5523_cmd_write() argument
291 return ar5523_cmd(ar, code, data, len, NULL, 0, flags); in ar5523_cmd_write()
294 static int ar5523_cmd_read(struct ar5523 *ar, u32 code, const void *idata, in ar5523_cmd_read() argument
298 return ar5523_cmd(ar, code, idata, ilen, odata, olen, flags); in ar5523_cmd_read()
301 static int ar5523_config(struct ar5523 *ar, u32 reg, u32 val) in ar5523_config() argument
310 error = ar5523_cmd_write(ar, WDCMSG_TARGET_SET_CONFIG, &write, in ar5523_config()
313 ar5523_err(ar, "could not write register 0x%02x\n", reg); in ar5523_config()
317 static int ar5523_config_multi(struct ar5523 *ar, u32 reg, const void *data, in ar5523_config_multi() argument
328 error = ar5523_cmd_write(ar, WDCMSG_TARGET_SET_CONFIG, &write, in ar5523_config_multi()
331 ar5523_err(ar, "could not write %d bytes to register 0x%02x\n", in ar5523_config_multi()
336 static int ar5523_get_status(struct ar5523 *ar, u32 which, void *odata, in ar5523_get_status() argument
343 error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_STATUS, in ar5523_get_status()
346 ar5523_err(ar, "could not read EEPROM offset 0x%02x\n", which); in ar5523_get_status()
350 static int ar5523_get_capability(struct ar5523 *ar, u32 cap, u32 *val) in ar5523_get_capability() argument
356 error = ar5523_cmd_read(ar, WDCMSG_TARGET_GET_CAPABILITY, &cap_be, in ar5523_get_capability()
360 ar5523_err(ar, "could not read capability %u\n", cap); in ar5523_get_capability()
367 static int ar5523_get_devcap(struct ar5523 *ar) in ar5523_get_devcap() argument
370 error = ar5523_get_capability(ar, x, &cap); \ in ar5523_get_devcap()
373 ar5523_info(ar, "Cap: " \ in ar5523_get_devcap()
416 static int ar5523_set_ledsteady(struct ar5523 *ar, int lednum, int ledmode) in ar5523_set_ledsteady() argument
423 ar5523_dbg(ar, "set %s led %s (steady)\n", in ar5523_set_ledsteady()
426 return ar5523_cmd_write(ar, WDCMSG_SET_LED_STEADY, &led, sizeof(led), in ar5523_set_ledsteady()
430 static int ar5523_set_rxfilter(struct ar5523 *ar, u32 bits, u32 op) in ar5523_set_rxfilter() argument
437 ar5523_dbg(ar, "setting Rx filter=0x%x flags=0x%x\n", bits, op); in ar5523_set_rxfilter()
438 return ar5523_cmd_write(ar, WDCMSG_RX_FILTER, &rxfilter, in ar5523_set_rxfilter()
442 static int ar5523_reset_tx_queues(struct ar5523 *ar) in ar5523_reset_tx_queues() argument
446 ar5523_dbg(ar, "resetting Tx queue\n"); in ar5523_reset_tx_queues()
447 return ar5523_cmd_write(ar, WDCMSG_RELEASE_TX_QUEUE, in ar5523_reset_tx_queues()
451 static int ar5523_set_chan(struct ar5523 *ar) in ar5523_set_chan() argument
453 struct ieee80211_conf *conf = &ar->hw->conf; in ar5523_set_chan()
465 ar5523_dbg(ar, "set chan flags 0x%x freq %d\n", in ar5523_set_chan()
468 return ar5523_cmd_write(ar, WDCMSG_RESET, &reset, sizeof(reset), 0); in ar5523_set_chan()
471 static int ar5523_queue_init(struct ar5523 *ar) in ar5523_queue_init() argument
475 ar5523_dbg(ar, "setting up Tx queue\n"); in ar5523_queue_init()
485 return ar5523_cmd_write(ar, WDCMSG_SETUP_TX_QUEUE, &qinfo, in ar5523_queue_init()
489 static int ar5523_switch_chan(struct ar5523 *ar) in ar5523_switch_chan() argument
493 error = ar5523_set_chan(ar); in ar5523_switch_chan()
495 ar5523_err(ar, "could not set chan, error %d\n", error); in ar5523_switch_chan()
500 error = ar5523_reset_tx_queues(ar); in ar5523_switch_chan()
502 ar5523_err(ar, "could not reset Tx queues, error %d\n", in ar5523_switch_chan()
507 error = ar5523_queue_init(ar); in ar5523_switch_chan()
509 ar5523_err(ar, "could not init wme, error %d\n", error); in ar5523_switch_chan()
515 static void ar5523_rx_data_put(struct ar5523 *ar, in ar5523_rx_data_put() argument
519 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_rx_data_put()
520 list_move(&data->list, &ar->rx_data_free); in ar5523_rx_data_put()
521 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_rx_data_put()
527 struct ar5523 *ar = data->ar; in ar5523_data_rx_cb() local
530 struct ieee80211_hw *hw = ar->hw; in ar5523_data_rx_cb()
536 ar5523_dbg(ar, "%s\n", __func__); in ar5523_data_rx_cb()
540 ar5523_err(ar, "%s: USB err: %d\n", __func__, in ar5523_data_rx_cb()
546 ar5523_err(ar, "RX: wrong xfer size (usblen=%d)\n", usblen); in ar5523_data_rx_cb()
554 ar5523_dbg(ar, "RX: No final flag. s: %d f: %02x l: %d\n", in ar5523_data_rx_cb()
565 if (rxlen > ar->rxbufsz) { in ar5523_data_rx_cb()
566 ar5523_dbg(ar, "RX: Bad descriptor (len=%d)\n", in ar5523_data_rx_cb()
572 ar5523_dbg(ar, "RX: rxlen is 0\n"); in ar5523_data_rx_cb()
577 ar5523_dbg(ar, "Bad RX status (0x%x len = %d). Skip\n", in ar5523_data_rx_cb()
587 ar5523_dbg(ar, "eek, alignment workaround activated\n"); in ar5523_data_rx_cb()
609 ar5523_rx_data_put(ar, data); in ar5523_data_rx_cb()
610 if (atomic_inc_return(&ar->rx_data_free_cnt) >= in ar5523_data_rx_cb()
612 test_bit(AR5523_HW_UP, &ar->flags)) in ar5523_data_rx_cb()
613 queue_work(ar->wq, &ar->rx_refill_work); in ar5523_data_rx_cb()
618 struct ar5523 *ar = container_of(work, struct ar5523, rx_refill_work); in ar5523_rx_refill_work() local
623 ar5523_dbg(ar, "%s\n", __func__); in ar5523_rx_refill_work()
625 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
627 if (!list_empty(&ar->rx_data_free)) in ar5523_rx_refill_work()
628 data = (struct ar5523_rx_data *) ar->rx_data_free.next; in ar5523_rx_refill_work()
631 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
636 data->skb = alloc_skb(ar->rxbufsz, GFP_KERNEL); in ar5523_rx_refill_work()
638 ar5523_err(ar, "could not allocate rx skbuff\n"); in ar5523_rx_refill_work()
642 usb_fill_bulk_urb(data->urb, ar->dev, in ar5523_rx_refill_work()
643 ar5523_data_rx_pipe(ar->dev), data->skb->data, in ar5523_rx_refill_work()
644 ar->rxbufsz, ar5523_data_rx_cb, data); in ar5523_rx_refill_work()
646 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
647 list_move(&data->list, &ar->rx_data_used); in ar5523_rx_refill_work()
648 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_rx_refill_work()
649 atomic_dec(&ar->rx_data_free_cnt); in ar5523_rx_refill_work()
655 ar5523_err(ar, "Err sending rx data urb %d\n", in ar5523_rx_refill_work()
657 ar5523_rx_data_put(ar, data); in ar5523_rx_refill_work()
658 atomic_inc(&ar->rx_data_free_cnt); in ar5523_rx_refill_work()
667 static void ar5523_cancel_rx_bufs(struct ar5523 *ar) in ar5523_cancel_rx_bufs() argument
673 spin_lock_irqsave(&ar->rx_data_list_lock, flags); in ar5523_cancel_rx_bufs()
674 if (!list_empty(&ar->rx_data_used)) in ar5523_cancel_rx_bufs()
675 data = (struct ar5523_rx_data *) ar->rx_data_used.next; in ar5523_cancel_rx_bufs()
678 spin_unlock_irqrestore(&ar->rx_data_list_lock, flags); in ar5523_cancel_rx_bufs()
684 list_move(&data->list, &ar->rx_data_free); in ar5523_cancel_rx_bufs()
685 atomic_inc(&ar->rx_data_free_cnt); in ar5523_cancel_rx_bufs()
689 static void ar5523_free_rx_bufs(struct ar5523 *ar) in ar5523_free_rx_bufs() argument
693 ar5523_cancel_rx_bufs(ar); in ar5523_free_rx_bufs()
694 while (!list_empty(&ar->rx_data_free)) { in ar5523_free_rx_bufs()
695 data = (struct ar5523_rx_data *) ar->rx_data_free.next; in ar5523_free_rx_bufs()
701 static int ar5523_alloc_rx_bufs(struct ar5523 *ar) in ar5523_alloc_rx_bufs() argument
706 struct ar5523_rx_data *data = &ar->rx_data[i]; in ar5523_alloc_rx_bufs()
708 data->ar = ar; in ar5523_alloc_rx_bufs()
712 list_add_tail(&data->list, &ar->rx_data_free); in ar5523_alloc_rx_bufs()
713 atomic_inc(&ar->rx_data_free_cnt); in ar5523_alloc_rx_bufs()
718 ar5523_free_rx_bufs(ar); in ar5523_alloc_rx_bufs()
722 static void ar5523_data_tx_pkt_put(struct ar5523 *ar) in ar5523_data_tx_pkt_put() argument
724 atomic_dec(&ar->tx_nr_total); in ar5523_data_tx_pkt_put()
725 if (!atomic_dec_return(&ar->tx_nr_pending)) { in ar5523_data_tx_pkt_put()
726 del_timer(&ar->tx_wd_timer); in ar5523_data_tx_pkt_put()
727 wake_up(&ar->tx_flush_waitq); in ar5523_data_tx_pkt_put()
730 if (atomic_read(&ar->tx_nr_total) < AR5523_TX_DATA_RESTART_COUNT) { in ar5523_data_tx_pkt_put()
731 ar5523_dbg(ar, "restart tx queue\n"); in ar5523_data_tx_pkt_put()
732 ieee80211_wake_queues(ar->hw); in ar5523_data_tx_pkt_put()
742 struct ar5523 *ar = data->ar; in ar5523_data_tx_cb() local
745 ar5523_dbg(ar, "data tx urb completed: %d\n", urb->status); in ar5523_data_tx_cb()
747 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_data_tx_cb()
749 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_data_tx_cb()
752 ar5523_dbg(ar, "%s: urb status: %d\n", __func__, urb->status); in ar5523_data_tx_cb()
753 ar5523_data_tx_pkt_put(ar); in ar5523_data_tx_cb()
754 ieee80211_free_txskb(ar->hw, skb); in ar5523_data_tx_cb()
757 ieee80211_tx_status_irqsafe(ar->hw, skb); in ar5523_data_tx_cb()
769 struct ar5523 *ar = hw->priv; in ar5523_tx() local
772 ar5523_dbg(ar, "tx called\n"); in ar5523_tx()
773 if (atomic_inc_return(&ar->tx_nr_total) >= AR5523_TX_DATA_COUNT) { in ar5523_tx()
774 ar5523_dbg(ar, "tx queue full\n"); in ar5523_tx()
775 ar5523_dbg(ar, "stop queues (tot %d pend %d)\n", in ar5523_tx()
776 atomic_read(&ar->tx_nr_total), in ar5523_tx()
777 atomic_read(&ar->tx_nr_pending)); in ar5523_tx()
781 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx()
782 list_add_tail(&data->list, &ar->tx_queue_pending); in ar5523_tx()
783 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx()
785 ieee80211_queue_work(ar->hw, &ar->tx_work); in ar5523_tx()
788 static void ar5523_tx_work_locked(struct ar5523 *ar) in ar5523_tx_work_locked() argument
803 ar5523_dbg(ar, "%s\n", __func__); in ar5523_tx_work_locked()
805 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
806 if (!list_empty(&ar->tx_queue_pending)) { in ar5523_tx_work_locked()
808 ar->tx_queue_pending.next; in ar5523_tx_work_locked()
812 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
826 ieee80211_free_txskb(ar->hw, skb); in ar5523_tx_work_locked()
830 data->ar = ar; in ar5523_tx_work_locked()
846 if (test_bit(AR5523_CONNECTED, &ar->flags)) in ar5523_tx_work_locked()
857 usb_fill_bulk_urb(urb, ar->dev, ar5523_data_tx_pipe(ar->dev), in ar5523_tx_work_locked()
860 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
861 list_add_tail(&data->list, &ar->tx_queue_submitted); in ar5523_tx_work_locked()
862 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
863 mod_timer(&ar->tx_wd_timer, jiffies + AR5523_TX_WD_TIMEOUT); in ar5523_tx_work_locked()
864 atomic_inc(&ar->tx_nr_pending); in ar5523_tx_work_locked()
866 ar5523_dbg(ar, "TX Frame (%d pending)\n", in ar5523_tx_work_locked()
867 atomic_read(&ar->tx_nr_pending)); in ar5523_tx_work_locked()
870 ar5523_err(ar, "error %d when submitting tx urb\n", in ar5523_tx_work_locked()
872 spin_lock_irqsave(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
874 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); in ar5523_tx_work_locked()
875 atomic_dec(&ar->tx_nr_pending); in ar5523_tx_work_locked()
876 ar5523_data_tx_pkt_put(ar); in ar5523_tx_work_locked()
878 ieee80211_free_txskb(ar->hw, skb); in ar5523_tx_work_locked()
885 struct ar5523 *ar = container_of(work, struct ar5523, tx_work); in ar5523_tx_work() local
887 ar5523_dbg(ar, "%s\n", __func__); in ar5523_tx_work()
888 mutex_lock(&ar->mutex); in ar5523_tx_work()
889 ar5523_tx_work_locked(ar); in ar5523_tx_work()
890 mutex_unlock(&ar->mutex); in ar5523_tx_work()
895 struct ar5523 *ar = from_timer(ar, t, tx_wd_timer); in ar5523_tx_wd_timer() local
897 ar5523_dbg(ar, "TX watchdog timer triggered\n"); in ar5523_tx_wd_timer()
898 ieee80211_queue_work(ar->hw, &ar->tx_wd_work); in ar5523_tx_wd_timer()
903 struct ar5523 *ar = container_of(work, struct ar5523, tx_wd_work); in ar5523_tx_wd_work() local
909 mutex_lock(&ar->mutex); in ar5523_tx_wd_work()
910 ar5523_err(ar, "TX queue stuck (tot %d pend %d)\n", in ar5523_tx_wd_work()
911 atomic_read(&ar->tx_nr_total), in ar5523_tx_wd_work()
912 atomic_read(&ar->tx_nr_pending)); in ar5523_tx_wd_work()
914 ar5523_err(ar, "Will restart dongle.\n"); in ar5523_tx_wd_work()
915 ar5523_cmd_write(ar, WDCMSG_TARGET_RESET, NULL, 0, 0); in ar5523_tx_wd_work()
916 mutex_unlock(&ar->mutex); in ar5523_tx_wd_work()
919 static void ar5523_flush_tx(struct ar5523 *ar) in ar5523_flush_tx() argument
921 ar5523_tx_work_locked(ar); in ar5523_flush_tx()
924 if (test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) in ar5523_flush_tx()
926 if (!wait_event_timeout(ar->tx_flush_waitq, in ar5523_flush_tx()
927 !atomic_read(&ar->tx_nr_pending), AR5523_FLUSH_TIMEOUT)) in ar5523_flush_tx()
928 ar5523_err(ar, "flush timeout (tot %d pend %d)\n", in ar5523_flush_tx()
929 atomic_read(&ar->tx_nr_total), in ar5523_flush_tx()
930 atomic_read(&ar->tx_nr_pending)); in ar5523_flush_tx()
933 static void ar5523_free_tx_cmd(struct ar5523 *ar) in ar5523_free_tx_cmd() argument
935 struct ar5523_tx_cmd *cmd = &ar->tx_cmd; in ar5523_free_tx_cmd()
937 usb_free_coherent(ar->dev, AR5523_MAX_RXCMDSZ, cmd->buf_tx, in ar5523_free_tx_cmd()
942 static int ar5523_alloc_tx_cmd(struct ar5523 *ar) in ar5523_alloc_tx_cmd() argument
944 struct ar5523_tx_cmd *cmd = &ar->tx_cmd; in ar5523_alloc_tx_cmd()
946 cmd->ar = ar; in ar5523_alloc_tx_cmd()
952 cmd->buf_tx = usb_alloc_coherent(ar->dev, AR5523_MAX_TXCMDSZ, in ar5523_alloc_tx_cmd()
968 struct ar5523 *ar = container_of(work, struct ar5523, stat_work.work); in ar5523_stat_work() local
971 ar5523_dbg(ar, "%s\n", __func__); in ar5523_stat_work()
972 mutex_lock(&ar->mutex); in ar5523_stat_work()
978 error = ar5523_cmd_write(ar, WDCMSG_TARGET_GET_STATS, NULL, 0, 0); in ar5523_stat_work()
980 ar5523_err(ar, "could not query stats, error %d\n", error); in ar5523_stat_work()
981 mutex_unlock(&ar->mutex); in ar5523_stat_work()
982 ieee80211_queue_delayed_work(ar->hw, &ar->stat_work, HZ); in ar5523_stat_work()
990 struct ar5523 *ar = hw->priv; in ar5523_start() local
994 ar5523_dbg(ar, "start called\n"); in ar5523_start()
996 mutex_lock(&ar->mutex); in ar5523_start()
998 ar5523_cmd_write(ar, WDCMSG_BIND, &val, sizeof(val), 0); in ar5523_start()
1001 ar5523_config_multi(ar, CFG_MAC_ADDR, &ar->hw->wiphy->perm_addr, in ar5523_start()
1005 ar5523_config(ar, CFG_RATE_CONTROL_ENABLE, 0x00000001); in ar5523_start()
1006 ar5523_config(ar, CFG_DIVERSITY_CTL, 0x00000001); in ar5523_start()
1007 ar5523_config(ar, CFG_ABOLT, 0x0000003f); in ar5523_start()
1008 ar5523_config(ar, CFG_WME_ENABLED, 0x00000000); in ar5523_start()
1010 ar5523_config(ar, CFG_SERVICE_TYPE, 1); in ar5523_start()
1011 ar5523_config(ar, CFG_TP_SCALE, 0x00000000); in ar5523_start()
1012 ar5523_config(ar, CFG_TPC_HALF_DBM5, 0x0000003c); in ar5523_start()
1013 ar5523_config(ar, CFG_TPC_HALF_DBM2, 0x0000003c); in ar5523_start()
1014 ar5523_config(ar, CFG_OVERRD_TX_POWER, 0x00000000); in ar5523_start()
1015 ar5523_config(ar, CFG_GMODE_PROTECTION, 0x00000000); in ar5523_start()
1016 ar5523_config(ar, CFG_GMODE_PROTECT_RATE_INDEX, 0x00000003); in ar5523_start()
1017 ar5523_config(ar, CFG_PROTECTION_TYPE, 0x00000000); in ar5523_start()
1018 ar5523_config(ar, CFG_MODE_CTS, 0x00000002); in ar5523_start()
1020 error = ar5523_cmd_read(ar, WDCMSG_TARGET_START, NULL, 0, in ar5523_start()
1023 ar5523_dbg(ar, "could not start target, error %d\n", error); in ar5523_start()
1026 ar5523_dbg(ar, "WDCMSG_TARGET_START returns handle: 0x%x\n", in ar5523_start()
1029 ar5523_switch_chan(ar); in ar5523_start()
1032 ar5523_cmd_write(ar, WDCMSG_SET_PWR_MODE, &val, sizeof(val), 0); in ar5523_start()
1034 ar5523_cmd_write(ar, WDCMSG_RESET_KEY_CACHE, NULL, 0, 0); in ar5523_start()
1036 set_bit(AR5523_HW_UP, &ar->flags); in ar5523_start()
1037 queue_work(ar->wq, &ar->rx_refill_work); in ar5523_start()
1040 ar5523_set_rxfilter(ar, 0, UATH_FILTER_OP_INIT); in ar5523_start()
1041 ar5523_set_rxfilter(ar, in ar5523_start()
1046 ar5523_set_ledsteady(ar, UATH_LED_ACTIVITY, UATH_LED_ON); in ar5523_start()
1047 ar5523_dbg(ar, "start OK\n"); in ar5523_start()
1050 mutex_unlock(&ar->mutex); in ar5523_start()
1056 struct ar5523 *ar = hw->priv; in ar5523_stop() local
1058 ar5523_dbg(ar, "stop called\n"); in ar5523_stop()
1060 cancel_delayed_work_sync(&ar->stat_work); in ar5523_stop()
1061 mutex_lock(&ar->mutex); in ar5523_stop()
1062 clear_bit(AR5523_HW_UP, &ar->flags); in ar5523_stop()
1064 ar5523_set_ledsteady(ar, UATH_LED_LINK, UATH_LED_OFF); in ar5523_stop()
1065 ar5523_set_ledsteady(ar, UATH_LED_ACTIVITY, UATH_LED_OFF); in ar5523_stop()
1067 ar5523_cmd_write(ar, WDCMSG_TARGET_STOP, NULL, 0, 0); in ar5523_stop()
1069 del_timer_sync(&ar->tx_wd_timer); in ar5523_stop()
1070 cancel_work_sync(&ar->tx_wd_work); in ar5523_stop()
1071 cancel_work_sync(&ar->rx_refill_work); in ar5523_stop()
1072 ar5523_cancel_rx_bufs(ar); in ar5523_stop()
1073 mutex_unlock(&ar->mutex); in ar5523_stop()
1078 struct ar5523 *ar = hw->priv; in ar5523_set_rts_threshold() local
1081 ar5523_dbg(ar, "set_rts_threshold called\n"); in ar5523_set_rts_threshold()
1082 mutex_lock(&ar->mutex); in ar5523_set_rts_threshold()
1084 ret = ar5523_config(ar, CFG_USER_RTS_THRESHOLD, value); in ar5523_set_rts_threshold()
1086 mutex_unlock(&ar->mutex); in ar5523_set_rts_threshold()
1093 struct ar5523 *ar = hw->priv; in ar5523_flush() local
1095 ar5523_dbg(ar, "flush called\n"); in ar5523_flush()
1096 ar5523_flush_tx(ar); in ar5523_flush()
1102 struct ar5523 *ar = hw->priv; in ar5523_add_interface() local
1104 ar5523_dbg(ar, "add interface called\n"); in ar5523_add_interface()
1106 if (ar->vif) { in ar5523_add_interface()
1107 ar5523_dbg(ar, "invalid add_interface\n"); in ar5523_add_interface()
1113 ar->vif = vif; in ar5523_add_interface()
1124 struct ar5523 *ar = hw->priv; in ar5523_remove_interface() local
1126 ar5523_dbg(ar, "remove interface called\n"); in ar5523_remove_interface()
1127 ar->vif = NULL; in ar5523_remove_interface()
1132 struct ar5523 *ar = hw->priv; in ar5523_hwconfig() local
1134 ar5523_dbg(ar, "config called\n"); in ar5523_hwconfig()
1135 mutex_lock(&ar->mutex); in ar5523_hwconfig()
1137 ar5523_dbg(ar, "Do channel switch\n"); in ar5523_hwconfig()
1138 ar5523_flush_tx(ar); in ar5523_hwconfig()
1139 ar5523_switch_chan(ar); in ar5523_hwconfig()
1141 mutex_unlock(&ar->mutex); in ar5523_hwconfig()
1145 static int ar5523_get_wlan_mode(struct ar5523 *ar, in ar5523_get_wlan_mode() argument
1153 band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band]; in ar5523_get_wlan_mode()
1154 sta = ieee80211_find_sta(ar->vif, bss_conf->bssid); in ar5523_get_wlan_mode()
1156 ar5523_info(ar, "STA not found!\n"); in ar5523_get_wlan_mode()
1159 sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band]; in ar5523_get_wlan_mode()
1181 static void ar5523_create_rateset(struct ar5523 *ar, in ar5523_create_rateset() argument
1191 sta = ieee80211_find_sta(ar->vif, bss_conf->bssid); in ar5523_create_rateset()
1194 ar5523_info(ar, "STA not found. Cannot set rates\n"); in ar5523_create_rateset()
1197 sta_rate_set = sta->supp_rates[ar->hw->conf.chandef.chan->band]; in ar5523_create_rateset()
1199 ar5523_dbg(ar, "sta rate_set = %08x\n", sta_rate_set); in ar5523_create_rateset()
1201 band = ar->hw->wiphy->bands[ar->hw->conf.chandef.chan->band]; in ar5523_create_rateset()
1204 ar5523_dbg(ar, "Considering rate %d : %d\n", in ar5523_create_rateset()
1219 static int ar5523_set_basic_rates(struct ar5523 *ar, in ar5523_set_basic_rates() argument
1227 ar5523_create_rateset(ar, bss, &rates.rateset, true); in ar5523_set_basic_rates()
1229 return ar5523_cmd_write(ar, WDCMSG_SET_BASIC_RATE, &rates, in ar5523_set_basic_rates()
1233 static int ar5523_create_connection(struct ar5523 *ar, in ar5523_create_connection() argument
1246 ar5523_create_rateset(ar, bss, &create.connattr.rateset, false); in ar5523_create_connection()
1248 wlan_mode = ar5523_get_wlan_mode(ar, bss); in ar5523_create_connection()
1251 return ar5523_cmd_write(ar, WDCMSG_CREATE_CONNECTION, &create, in ar5523_create_connection()
1255 static int ar5523_write_associd(struct ar5523 *ar, in ar5523_write_associd() argument
1265 return ar5523_cmd_write(ar, WDCMSG_WRITE_ASSOCID, &associd, in ar5523_write_associd()
1274 struct ar5523 *ar = hw->priv; in ar5523_bss_info_changed() local
1277 ar5523_dbg(ar, "bss_info_changed called\n"); in ar5523_bss_info_changed()
1278 mutex_lock(&ar->mutex); in ar5523_bss_info_changed()
1284 error = ar5523_create_connection(ar, vif, bss); in ar5523_bss_info_changed()
1286 ar5523_err(ar, "could not create connection\n"); in ar5523_bss_info_changed()
1290 error = ar5523_set_basic_rates(ar, bss); in ar5523_bss_info_changed()
1292 ar5523_err(ar, "could not set negotiated rate set\n"); in ar5523_bss_info_changed()
1296 error = ar5523_write_associd(ar, bss); in ar5523_bss_info_changed()
1298 ar5523_err(ar, "could not set association\n"); in ar5523_bss_info_changed()
1303 ar5523_set_ledsteady(ar, UATH_LED_LINK, UATH_LED_ON); in ar5523_bss_info_changed()
1304 set_bit(AR5523_CONNECTED, &ar->flags); in ar5523_bss_info_changed()
1305 ieee80211_queue_delayed_work(hw, &ar->stat_work, HZ); in ar5523_bss_info_changed()
1308 cancel_delayed_work(&ar->stat_work); in ar5523_bss_info_changed()
1309 clear_bit(AR5523_CONNECTED, &ar->flags); in ar5523_bss_info_changed()
1310 ar5523_set_ledsteady(ar, UATH_LED_LINK, UATH_LED_OFF); in ar5523_bss_info_changed()
1314 mutex_unlock(&ar->mutex); in ar5523_bss_info_changed()
1327 struct ar5523 *ar = hw->priv; in ar5523_configure_filter() local
1330 ar5523_dbg(ar, "configure_filter called\n"); in ar5523_configure_filter()
1331 mutex_lock(&ar->mutex); in ar5523_configure_filter()
1332 ar5523_flush_tx(ar); in ar5523_configure_filter()
1344 ar5523_set_rxfilter(ar, 0, UATH_FILTER_OP_INIT); in ar5523_configure_filter()
1345 ar5523_set_rxfilter(ar, filter, UATH_FILTER_OP_SET); in ar5523_configure_filter()
1347 mutex_unlock(&ar->mutex); in ar5523_configure_filter()
1363 static int ar5523_host_available(struct ar5523 *ar) in ar5523_host_available() argument
1372 return ar5523_cmd_read(ar, WDCMSG_HOST_AVAILABLE, in ar5523_host_available()
1376 static int ar5523_get_devstatus(struct ar5523 *ar) in ar5523_get_devstatus() argument
1382 error = ar5523_get_status(ar, ST_MAC_ADDR, macaddr, ETH_ALEN); in ar5523_get_devstatus()
1384 ar5523_err(ar, "could not read MAC address\n"); in ar5523_get_devstatus()
1388 SET_IEEE80211_PERM_ADDR(ar->hw, macaddr); in ar5523_get_devstatus()
1390 error = ar5523_get_status(ar, ST_SERIAL_NUMBER, in ar5523_get_devstatus()
1391 &ar->serial[0], sizeof(ar->serial)); in ar5523_get_devstatus()
1393 ar5523_err(ar, "could not read device serial number\n"); in ar5523_get_devstatus()
1401 static int ar5523_get_max_rxsz(struct ar5523 *ar) in ar5523_get_max_rxsz() argument
1407 error = ar5523_get_status(ar, ST_WDC_TRANSPORT_CHUNK_SIZE, &rxsize, in ar5523_get_max_rxsz()
1410 ar5523_err(ar, "could not read max RX size\n"); in ar5523_get_max_rxsz()
1414 ar->rxbufsz = be32_to_cpu(rxsize); in ar5523_get_max_rxsz()
1416 if (!ar->rxbufsz || ar->rxbufsz > AR5523_SANE_RXBUFSZ) { in ar5523_get_max_rxsz()
1417 ar5523_err(ar, "Bad rxbufsz from device. Using %d instead\n", in ar5523_get_max_rxsz()
1419 ar->rxbufsz = AR5523_SANE_RXBUFSZ; in ar5523_get_max_rxsz()
1422 ar5523_dbg(ar, "Max RX buf size: %d\n", ar->rxbufsz); in ar5523_get_max_rxsz()
1462 static int ar5523_init_modes(struct ar5523 *ar) in ar5523_init_modes() argument
1464 BUILD_BUG_ON(sizeof(ar->channels) != sizeof(ar5523_channels)); in ar5523_init_modes()
1465 BUILD_BUG_ON(sizeof(ar->rates) != sizeof(ar5523_rates)); in ar5523_init_modes()
1467 memcpy(ar->channels, ar5523_channels, sizeof(ar5523_channels)); in ar5523_init_modes()
1468 memcpy(ar->rates, ar5523_rates, sizeof(ar5523_rates)); in ar5523_init_modes()
1470 ar->band.band = NL80211_BAND_2GHZ; in ar5523_init_modes()
1471 ar->band.channels = ar->channels; in ar5523_init_modes()
1472 ar->band.n_channels = ARRAY_SIZE(ar5523_channels); in ar5523_init_modes()
1473 ar->band.bitrates = ar->rates; in ar5523_init_modes()
1474 ar->band.n_bitrates = ARRAY_SIZE(ar5523_rates); in ar5523_init_modes()
1475 ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = &ar->band; in ar5523_init_modes()
1580 struct ar5523 *ar; in ar5523_probe() local
1592 hw = ieee80211_alloc_hw(sizeof(*ar), &ar5523_ops); in ar5523_probe()
1597 ar = hw->priv; in ar5523_probe()
1598 ar->hw = hw; in ar5523_probe()
1599 ar->dev = dev; in ar5523_probe()
1600 mutex_init(&ar->mutex); in ar5523_probe()
1602 INIT_DELAYED_WORK(&ar->stat_work, ar5523_stat_work); in ar5523_probe()
1603 timer_setup(&ar->tx_wd_timer, ar5523_tx_wd_timer, 0); in ar5523_probe()
1604 INIT_WORK(&ar->tx_wd_work, ar5523_tx_wd_work); in ar5523_probe()
1605 INIT_WORK(&ar->tx_work, ar5523_tx_work); in ar5523_probe()
1606 INIT_LIST_HEAD(&ar->tx_queue_pending); in ar5523_probe()
1607 INIT_LIST_HEAD(&ar->tx_queue_submitted); in ar5523_probe()
1608 spin_lock_init(&ar->tx_data_list_lock); in ar5523_probe()
1609 atomic_set(&ar->tx_nr_total, 0); in ar5523_probe()
1610 atomic_set(&ar->tx_nr_pending, 0); in ar5523_probe()
1611 init_waitqueue_head(&ar->tx_flush_waitq); in ar5523_probe()
1613 atomic_set(&ar->rx_data_free_cnt, 0); in ar5523_probe()
1614 INIT_WORK(&ar->rx_refill_work, ar5523_rx_refill_work); in ar5523_probe()
1615 INIT_LIST_HEAD(&ar->rx_data_free); in ar5523_probe()
1616 INIT_LIST_HEAD(&ar->rx_data_used); in ar5523_probe()
1617 spin_lock_init(&ar->rx_data_list_lock); in ar5523_probe()
1619 ar->wq = create_singlethread_workqueue("ar5523"); in ar5523_probe()
1620 if (!ar->wq) { in ar5523_probe()
1621 ar5523_err(ar, "Could not create wq\n"); in ar5523_probe()
1625 error = ar5523_alloc_rx_bufs(ar); in ar5523_probe()
1627 ar5523_err(ar, "Could not allocate rx buffers\n"); in ar5523_probe()
1631 error = ar5523_alloc_rx_cmd(ar); in ar5523_probe()
1633 ar5523_err(ar, "Could not allocate rx command buffers\n"); in ar5523_probe()
1637 error = ar5523_alloc_tx_cmd(ar); in ar5523_probe()
1639 ar5523_err(ar, "Could not allocate tx command buffers\n"); in ar5523_probe()
1643 error = ar5523_submit_rx_cmd(ar); in ar5523_probe()
1645 ar5523_err(ar, "Failed to submit rx cmd\n"); in ar5523_probe()
1652 error = ar5523_host_available(ar); in ar5523_probe()
1654 ar5523_err(ar, "could not initialize adapter\n"); in ar5523_probe()
1658 error = ar5523_get_max_rxsz(ar); in ar5523_probe()
1660 ar5523_err(ar, "could not get caps from adapter\n"); in ar5523_probe()
1664 error = ar5523_get_devcap(ar); in ar5523_probe()
1666 ar5523_err(ar, "could not get caps from adapter\n"); in ar5523_probe()
1670 error = ar5523_get_devstatus(ar); in ar5523_probe()
1672 ar5523_err(ar, "could not get device status\n"); in ar5523_probe()
1676 ar5523_info(ar, "MAC/BBP AR5523, RF AR%c112\n", in ar5523_probe()
1679 ar->vif = NULL; in ar5523_probe()
1688 error = ar5523_init_modes(ar); in ar5523_probe()
1698 ar5523_err(ar, "could not register device\n"); in ar5523_probe()
1702 ar5523_info(ar, "Found and initialized AR5523 device\n"); in ar5523_probe()
1706 ar5523_cancel_rx_cmd(ar); in ar5523_probe()
1708 ar5523_free_tx_cmd(ar); in ar5523_probe()
1710 ar5523_free_rx_cmd(ar); in ar5523_probe()
1712 ar5523_free_rx_bufs(ar); in ar5523_probe()
1714 destroy_workqueue(ar->wq); in ar5523_probe()
1724 struct ar5523 *ar = hw->priv; in ar5523_disconnect() local
1726 ar5523_dbg(ar, "detaching\n"); in ar5523_disconnect()
1727 set_bit(AR5523_USB_DISCONNECTED, &ar->flags); in ar5523_disconnect()
1731 ar5523_cancel_rx_cmd(ar); in ar5523_disconnect()
1732 ar5523_free_tx_cmd(ar); in ar5523_disconnect()
1733 ar5523_free_rx_cmd(ar); in ar5523_disconnect()
1734 ar5523_free_rx_bufs(ar); in ar5523_disconnect()
1736 destroy_workqueue(ar->wq); in ar5523_disconnect()