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