1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2010-2011 Atheros Communications Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission to use, copy, modify, and/or distribute this software for any 5*4882a593Smuzhiyun * purpose with or without fee is hereby granted, provided that the above 6*4882a593Smuzhiyun * copyright notice and this permission notice appear in all copies. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*4882a593Smuzhiyun * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*4882a593Smuzhiyun * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*4882a593Smuzhiyun * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*4882a593Smuzhiyun * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef HTC_USB_H 18*4882a593Smuzhiyun #define HTC_USB_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* old firmware images */ 21*4882a593Smuzhiyun #define FIRMWARE_AR7010_1_1 "htc_7010.fw" 22*4882a593Smuzhiyun #define FIRMWARE_AR9271 "htc_9271.fw" 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* supported Major FW version */ 25*4882a593Smuzhiyun #define MAJOR_VERSION_REQ 1 26*4882a593Smuzhiyun #define MINOR_VERSION_REQ 3 27*4882a593Smuzhiyun /* minimal and maximal supported Minor FW version. */ 28*4882a593Smuzhiyun #define FIRMWARE_MINOR_IDX_MAX 4 29*4882a593Smuzhiyun #define FIRMWARE_MINOR_IDX_MIN 3 30*4882a593Smuzhiyun #define HTC_FW_PATH "ath9k_htc" 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #define HTC_9271_MODULE_FW HTC_FW_PATH "/htc_9271-" \ 33*4882a593Smuzhiyun __stringify(MAJOR_VERSION_REQ) \ 34*4882a593Smuzhiyun "." __stringify(FIRMWARE_MINOR_IDX_MAX) ".0.fw" 35*4882a593Smuzhiyun #define HTC_7010_MODULE_FW HTC_FW_PATH "/htc_7010-" \ 36*4882a593Smuzhiyun __stringify(MAJOR_VERSION_REQ) \ 37*4882a593Smuzhiyun "." __stringify(FIRMWARE_MINOR_IDX_MAX) ".0.fw" 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun extern int htc_use_dev_fw; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define IS_AR7010_DEVICE(_v) (((_v) == AR9280_USB) || ((_v) == AR9287_USB)) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define AR9271_FIRMWARE 0x501000 44*4882a593Smuzhiyun #define AR9271_FIRMWARE_TEXT 0x903000 45*4882a593Smuzhiyun #define AR7010_FIRMWARE_TEXT 0x906000 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define FIRMWARE_DOWNLOAD 0x30 48*4882a593Smuzhiyun #define FIRMWARE_DOWNLOAD_COMP 0x31 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define ATH_USB_RX_STREAM_MODE_TAG 0x4e00 51*4882a593Smuzhiyun #define ATH_USB_TX_STREAM_MODE_TAG 0x697e 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* FIXME: Verify these numbers (with Windows) */ 54*4882a593Smuzhiyun #define MAX_TX_URB_NUM 8 55*4882a593Smuzhiyun #define MAX_TX_BUF_NUM 256 56*4882a593Smuzhiyun #define MAX_TX_BUF_SIZE 32768 57*4882a593Smuzhiyun #define MAX_TX_AGGR_NUM 20 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define MAX_RX_URB_NUM 8 60*4882a593Smuzhiyun #define MAX_RX_BUF_SIZE 16384 61*4882a593Smuzhiyun #define MAX_PKT_NUM_IN_TRANSFER 10 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define MAX_REG_OUT_URB_NUM 1 64*4882a593Smuzhiyun #define MAX_REG_IN_URB_NUM 64 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define MAX_REG_IN_BUF_SIZE 64 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* USB Endpoint definition */ 69*4882a593Smuzhiyun #define USB_WLAN_TX_PIPE 1 70*4882a593Smuzhiyun #define USB_WLAN_RX_PIPE 2 71*4882a593Smuzhiyun #define USB_REG_IN_PIPE 3 72*4882a593Smuzhiyun #define USB_REG_OUT_PIPE 4 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #define USB_MSG_TIMEOUT 1000 /* (ms) */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define HIF_USB_MAX_RXPIPES 2 77*4882a593Smuzhiyun #define HIF_USB_MAX_TXPIPES 4 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct tx_buf { 80*4882a593Smuzhiyun u8 *buf; 81*4882a593Smuzhiyun u16 len; 82*4882a593Smuzhiyun u16 offset; 83*4882a593Smuzhiyun struct urb *urb; 84*4882a593Smuzhiyun struct sk_buff_head skb_queue; 85*4882a593Smuzhiyun struct hif_device_usb *hif_dev; 86*4882a593Smuzhiyun struct list_head list; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct rx_buf { 90*4882a593Smuzhiyun struct sk_buff *skb; 91*4882a593Smuzhiyun struct hif_device_usb *hif_dev; 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define HIF_USB_TX_STOP BIT(0) 95*4882a593Smuzhiyun #define HIF_USB_TX_FLUSH BIT(1) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct hif_usb_tx { 98*4882a593Smuzhiyun u8 flags; 99*4882a593Smuzhiyun u8 tx_buf_cnt; 100*4882a593Smuzhiyun u16 tx_skb_cnt; 101*4882a593Smuzhiyun struct sk_buff_head tx_skb_queue; 102*4882a593Smuzhiyun struct list_head tx_buf; 103*4882a593Smuzhiyun struct list_head tx_pending; 104*4882a593Smuzhiyun spinlock_t tx_lock; 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct cmd_buf { 108*4882a593Smuzhiyun struct sk_buff *skb; 109*4882a593Smuzhiyun struct hif_device_usb *hif_dev; 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define HIF_USB_START BIT(0) 113*4882a593Smuzhiyun #define HIF_USB_READY BIT(1) 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun struct hif_device_usb { 116*4882a593Smuzhiyun struct usb_device *udev; 117*4882a593Smuzhiyun struct usb_interface *interface; 118*4882a593Smuzhiyun const struct usb_device_id *usb_device_id; 119*4882a593Smuzhiyun const void *fw_data; 120*4882a593Smuzhiyun size_t fw_size; 121*4882a593Smuzhiyun struct completion fw_done; 122*4882a593Smuzhiyun struct htc_target *htc_handle; 123*4882a593Smuzhiyun struct hif_usb_tx tx; 124*4882a593Smuzhiyun struct usb_anchor regout_submitted; 125*4882a593Smuzhiyun struct usb_anchor rx_submitted; 126*4882a593Smuzhiyun struct usb_anchor reg_in_submitted; 127*4882a593Smuzhiyun struct usb_anchor mgmt_submitted; 128*4882a593Smuzhiyun struct sk_buff *remain_skb; 129*4882a593Smuzhiyun char fw_name[32]; 130*4882a593Smuzhiyun int fw_minor_index; 131*4882a593Smuzhiyun int rx_remain_len; 132*4882a593Smuzhiyun int rx_pkt_len; 133*4882a593Smuzhiyun int rx_transfer_len; 134*4882a593Smuzhiyun int rx_pad_len; 135*4882a593Smuzhiyun spinlock_t rx_lock; 136*4882a593Smuzhiyun u8 flags; /* HIF_USB_* */ 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun int ath9k_hif_usb_init(void); 140*4882a593Smuzhiyun void ath9k_hif_usb_exit(void); 141*4882a593Smuzhiyun void ath9k_hif_usb_dealloc_urbs(struct hif_device_usb *hif_dev); 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #endif /* HTC_USB_H */ 144