1 /* 2 * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr> 3 * Copyright (c) 2006 Sam Leffler, Errno Consulting 4 * Copyright (c) 2007 Christoph Hellwig <hch@lst.de> 5 * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org> 6 * Copyright (c) 2012 Pontus Fuchs <pontus.fuchs@gmail.com> 7 * 8 * Permission to use, copy, modify, and/or distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #define AR5523_FLAG_PRE_FIRMWARE (1 << 0) 22 #define AR5523_FLAG_ABG (1 << 1) 23 24 #define AR5523_FIRMWARE_FILE "ar5523.bin" 25 26 #define AR5523_CMD_TX_PIPE 0x01 27 #define AR5523_DATA_TX_PIPE 0x02 28 #define AR5523_CMD_RX_PIPE 0x81 29 #define AR5523_DATA_RX_PIPE 0x82 30 31 #define ar5523_cmd_tx_pipe(dev) \ 32 usb_sndbulkpipe((dev), AR5523_CMD_TX_PIPE) 33 #define ar5523_data_tx_pipe(dev) \ 34 usb_sndbulkpipe((dev), AR5523_DATA_TX_PIPE) 35 #define ar5523_cmd_rx_pipe(dev) \ 36 usb_rcvbulkpipe((dev), AR5523_CMD_RX_PIPE) 37 #define ar5523_data_rx_pipe(dev) \ 38 usb_rcvbulkpipe((dev), AR5523_DATA_RX_PIPE) 39 40 #define AR5523_DATA_TIMEOUT 10000 41 #define AR5523_CMD_TIMEOUT 1000 42 43 #define AR5523_TX_DATA_COUNT 8 44 #define AR5523_TX_DATA_RESTART_COUNT 2 45 #define AR5523_RX_DATA_COUNT 16 46 #define AR5523_RX_DATA_REFILL_COUNT 8 47 48 #define AR5523_CMD_ID 1 49 #define AR5523_DATA_ID 2 50 51 #define AR5523_TX_WD_TIMEOUT (HZ * 2) 52 #define AR5523_FLUSH_TIMEOUT (HZ * 3) 53 54 enum AR5523_flags { 55 AR5523_HW_UP, 56 AR5523_USB_DISCONNECTED, 57 AR5523_CONNECTED 58 }; 59 60 struct ar5523_tx_cmd { 61 struct ar5523 *ar; 62 struct urb *urb_tx; 63 void *buf_tx; 64 void *odata; 65 int olen; 66 int flags; 67 int res; 68 struct completion done; 69 }; 70 71 /* This struct is placed in tx_info->driver_data. It must not be larger 72 * than IEEE80211_TX_INFO_DRIVER_DATA_SIZE. 73 */ 74 struct ar5523_tx_data { 75 struct list_head list; 76 struct ar5523 *ar; 77 struct sk_buff *skb; 78 struct urb *urb; 79 }; 80 81 struct ar5523_rx_data { 82 struct list_head list; 83 struct ar5523 *ar; 84 struct urb *urb; 85 struct sk_buff *skb; 86 }; 87 88 struct ar5523 { 89 struct usb_device *dev; 90 struct ieee80211_hw *hw; 91 92 unsigned long flags; 93 struct mutex mutex; 94 struct workqueue_struct *wq; 95 96 struct ar5523_tx_cmd tx_cmd; 97 98 struct delayed_work stat_work; 99 100 struct timer_list tx_wd_timer; 101 struct work_struct tx_wd_work; 102 struct work_struct tx_work; 103 struct list_head tx_queue_pending; 104 struct list_head tx_queue_submitted; 105 spinlock_t tx_data_list_lock; 106 wait_queue_head_t tx_flush_waitq; 107 108 /* Queued + Submitted TX frames */ 109 atomic_t tx_nr_total; 110 111 /* Submitted TX frames */ 112 atomic_t tx_nr_pending; 113 114 void *rx_cmd_buf; 115 struct urb *rx_cmd_urb; 116 117 struct ar5523_rx_data rx_data[AR5523_RX_DATA_COUNT]; 118 spinlock_t rx_data_list_lock; 119 struct list_head rx_data_free; 120 struct list_head rx_data_used; 121 atomic_t rx_data_free_cnt; 122 123 struct work_struct rx_refill_work; 124 125 unsigned int rxbufsz; 126 u8 serial[16]; 127 128 struct ieee80211_channel channels[14]; 129 struct ieee80211_rate rates[12]; 130 struct ieee80211_supported_band band; 131 struct ieee80211_vif *vif; 132 }; 133 134 /* flags for sending firmware commands */ 135 #define AR5523_CMD_FLAG_READ (1 << 1) 136 #define AR5523_CMD_FLAG_MAGIC (1 << 2) 137 138 #define ar5523_dbg(ar, format, arg...) \ 139 dev_dbg(&(ar)->dev->dev, format, ## arg) 140 141 /* On USB hot-unplug there can be a lot of URBs in flight and they'll all 142 * fail. Instead of dealing with them in every possible place just surpress 143 * any messages on USB disconnect. 144 */ 145 #define ar5523_err(ar, format, arg...) \ 146 do { \ 147 if (!test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) { \ 148 dev_err(&(ar)->dev->dev, format, ## arg); \ 149 } \ 150 } while (0) 151 #define ar5523_info(ar, format, arg...) \ 152 dev_info(&(ar)->dev->dev, format, ## arg) 153