1f1d2b4d3SLarry Finger /****************************************************************************** 2f1d2b4d3SLarry Finger * 3f1d2b4d3SLarry Finger * Copyright(c) 2009-2012 Realtek Corporation. All rights reserved. 4f1d2b4d3SLarry Finger * 5f1d2b4d3SLarry Finger * This program is free software; you can redistribute it and/or modify it 6f1d2b4d3SLarry Finger * under the terms of version 2 of the GNU General Public License as 7f1d2b4d3SLarry Finger * published by the Free Software Foundation. 8f1d2b4d3SLarry Finger * 9f1d2b4d3SLarry Finger * This program is distributed in the hope that it will be useful, but WITHOUT 10f1d2b4d3SLarry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11f1d2b4d3SLarry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12f1d2b4d3SLarry Finger * more details. 13f1d2b4d3SLarry Finger * 14f1d2b4d3SLarry Finger * You should have received a copy of the GNU General Public License along with 15f1d2b4d3SLarry Finger * this program; if not, write to the Free Software Foundation, Inc., 16f1d2b4d3SLarry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17f1d2b4d3SLarry Finger * 18f1d2b4d3SLarry Finger * The full GNU General Public License is included in this distribution in the 19f1d2b4d3SLarry Finger * file called LICENSE. 20f1d2b4d3SLarry Finger * 21f1d2b4d3SLarry Finger * Contact Information: 22f1d2b4d3SLarry Finger * wlanfae <wlanfae@realtek.com> 23f1d2b4d3SLarry Finger * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 24f1d2b4d3SLarry Finger * Hsinchu 300, Taiwan. 25f1d2b4d3SLarry Finger * 26f1d2b4d3SLarry Finger *****************************************************************************/ 27f1d2b4d3SLarry Finger 28f1d2b4d3SLarry Finger #ifndef __RTL_USB_H__ 29f1d2b4d3SLarry Finger #define __RTL_USB_H__ 30f1d2b4d3SLarry Finger 31f1d2b4d3SLarry Finger #include <linux/skbuff.h> 32f1d2b4d3SLarry Finger 33f1d2b4d3SLarry Finger #define RTL_RX_DESC_SIZE 24 34f1d2b4d3SLarry Finger 35f1d2b4d3SLarry Finger #define RTL_USB_DEVICE(vend, prod, cfg) \ 36f1d2b4d3SLarry Finger .match_flags = USB_DEVICE_ID_MATCH_DEVICE, \ 37f1d2b4d3SLarry Finger .idVendor = (vend), \ 38f1d2b4d3SLarry Finger .idProduct = (prod), \ 39f1d2b4d3SLarry Finger .driver_info = (kernel_ulong_t)&(cfg) 40f1d2b4d3SLarry Finger 41f1d2b4d3SLarry Finger #define USB_HIGH_SPEED_BULK_SIZE 512 42f1d2b4d3SLarry Finger #define USB_FULL_SPEED_BULK_SIZE 64 43f1d2b4d3SLarry Finger 44f1d2b4d3SLarry Finger 45f1d2b4d3SLarry Finger #define RTL_USB_MAX_TXQ_NUM 4 /* max tx queue */ 46f1d2b4d3SLarry Finger #define RTL_USB_MAX_EP_NUM 6 /* max ep number */ 47f1d2b4d3SLarry Finger #define RTL_USB_MAX_TX_URBS_NUM 8 48f1d2b4d3SLarry Finger 49f1d2b4d3SLarry Finger enum rtl_txq { 50f1d2b4d3SLarry Finger /* These definitions shall be consistent with value 51f1d2b4d3SLarry Finger * returned by skb_get_queue_mapping 52f1d2b4d3SLarry Finger *------------------------------------*/ 53f1d2b4d3SLarry Finger RTL_TXQ_BK, 54f1d2b4d3SLarry Finger RTL_TXQ_BE, 55f1d2b4d3SLarry Finger RTL_TXQ_VI, 56f1d2b4d3SLarry Finger RTL_TXQ_VO, 57f1d2b4d3SLarry Finger /*------------------------------------*/ 58f1d2b4d3SLarry Finger RTL_TXQ_BCN, 59f1d2b4d3SLarry Finger RTL_TXQ_MGT, 60f1d2b4d3SLarry Finger RTL_TXQ_HI, 61f1d2b4d3SLarry Finger 62f1d2b4d3SLarry Finger /* Must be last */ 63f1d2b4d3SLarry Finger __RTL_TXQ_NUM, 64f1d2b4d3SLarry Finger }; 65f1d2b4d3SLarry Finger 66f1d2b4d3SLarry Finger struct rtl_ep_map { 67f1d2b4d3SLarry Finger u32 ep_mapping[__RTL_TXQ_NUM]; 68f1d2b4d3SLarry Finger }; 69f1d2b4d3SLarry Finger 70f1d2b4d3SLarry Finger struct _trx_info { 71f1d2b4d3SLarry Finger struct rtl_usb *rtlusb; 72f1d2b4d3SLarry Finger u32 ep_num; 73f1d2b4d3SLarry Finger }; 74f1d2b4d3SLarry Finger 75f1d2b4d3SLarry Finger static inline void _rtl_install_trx_info(struct rtl_usb *rtlusb, 76f1d2b4d3SLarry Finger struct sk_buff *skb, 77f1d2b4d3SLarry Finger u32 ep_num) 78f1d2b4d3SLarry Finger { 79f1d2b4d3SLarry Finger struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 80f1d2b4d3SLarry Finger info->rate_driver_data[0] = rtlusb; 81f1d2b4d3SLarry Finger info->rate_driver_data[1] = (void *)(__kernel_size_t)ep_num; 82f1d2b4d3SLarry Finger } 83f1d2b4d3SLarry Finger 84f1d2b4d3SLarry Finger 85f1d2b4d3SLarry Finger /* Add suspend/resume later */ 86f1d2b4d3SLarry Finger enum rtl_usb_state { 87f1d2b4d3SLarry Finger USB_STATE_STOP = 0, 88f1d2b4d3SLarry Finger USB_STATE_START = 1, 89f1d2b4d3SLarry Finger }; 90f1d2b4d3SLarry Finger 91f1d2b4d3SLarry Finger #define IS_USB_STOP(rtlusb_ptr) (USB_STATE_STOP == (rtlusb_ptr)->state) 92f1d2b4d3SLarry Finger #define IS_USB_START(rtlusb_ptr) (USB_STATE_START == (rtlusb_ptr)->state) 93f1d2b4d3SLarry Finger #define SET_USB_STOP(rtlusb_ptr) \ 94f1d2b4d3SLarry Finger do { \ 95f1d2b4d3SLarry Finger (rtlusb_ptr)->state = USB_STATE_STOP; \ 96f1d2b4d3SLarry Finger } while (0) 97f1d2b4d3SLarry Finger 98f1d2b4d3SLarry Finger #define SET_USB_START(rtlusb_ptr) \ 99f1d2b4d3SLarry Finger do { \ 100f1d2b4d3SLarry Finger (rtlusb_ptr)->state = USB_STATE_START; \ 101f1d2b4d3SLarry Finger } while (0) 102f1d2b4d3SLarry Finger 103f1d2b4d3SLarry Finger struct rtl_usb { 104f1d2b4d3SLarry Finger struct usb_device *udev; 105f1d2b4d3SLarry Finger struct usb_interface *intf; 106f1d2b4d3SLarry Finger enum rtl_usb_state state; 107f1d2b4d3SLarry Finger 108f1d2b4d3SLarry Finger /* Bcn control register setting */ 109f1d2b4d3SLarry Finger u32 reg_bcn_ctrl_val; 110f1d2b4d3SLarry Finger /* for 88/92cu card disable */ 111f1d2b4d3SLarry Finger u8 disableHWSM; 112f1d2b4d3SLarry Finger /*QOS & EDCA */ 113f1d2b4d3SLarry Finger enum acm_method acm_method; 114f1d2b4d3SLarry Finger /* irq . HIMR,HIMR_EX */ 115f1d2b4d3SLarry Finger u32 irq_mask[2]; 116f1d2b4d3SLarry Finger bool irq_enabled; 117f1d2b4d3SLarry Finger 118f1d2b4d3SLarry Finger u16 (*usb_mq_to_hwq)(__le16 fc, u16 mac80211_queue_index); 119f1d2b4d3SLarry Finger 120f1d2b4d3SLarry Finger /* Tx */ 121f1d2b4d3SLarry Finger u8 out_ep_nums ; 122f1d2b4d3SLarry Finger u8 out_queue_sel; 123f1d2b4d3SLarry Finger struct rtl_ep_map ep_map; 124f1d2b4d3SLarry Finger 125f1d2b4d3SLarry Finger u32 max_bulk_out_size; 126f1d2b4d3SLarry Finger u32 tx_submitted_urbs; 127f1d2b4d3SLarry Finger struct sk_buff_head tx_skb_queue[RTL_USB_MAX_EP_NUM]; 128f1d2b4d3SLarry Finger 129f1d2b4d3SLarry Finger struct usb_anchor tx_pending[RTL_USB_MAX_EP_NUM]; 130f1d2b4d3SLarry Finger struct usb_anchor tx_submitted; 131f1d2b4d3SLarry Finger 132f1d2b4d3SLarry Finger struct sk_buff *(*usb_tx_aggregate_hdl)(struct ieee80211_hw *, 133f1d2b4d3SLarry Finger struct sk_buff_head *); 134f1d2b4d3SLarry Finger int (*usb_tx_post_hdl)(struct ieee80211_hw *, 135f1d2b4d3SLarry Finger struct urb *, struct sk_buff *); 136f1d2b4d3SLarry Finger void (*usb_tx_cleanup)(struct ieee80211_hw *, struct sk_buff *); 137f1d2b4d3SLarry Finger 138f1d2b4d3SLarry Finger /* Rx */ 139f1d2b4d3SLarry Finger u8 in_ep_nums; 140f1d2b4d3SLarry Finger u32 in_ep; /* Bulk IN endpoint number */ 141f1d2b4d3SLarry Finger u32 rx_max_size; /* Bulk IN max buffer size */ 142f1d2b4d3SLarry Finger u32 rx_urb_num; /* How many Bulk INs are submitted to host. */ 143f1d2b4d3SLarry Finger struct usb_anchor rx_submitted; 144f1d2b4d3SLarry Finger struct usb_anchor rx_cleanup_urbs; 145f1d2b4d3SLarry Finger struct tasklet_struct rx_work_tasklet; 146f1d2b4d3SLarry Finger struct sk_buff_head rx_queue; 147f1d2b4d3SLarry Finger void (*usb_rx_segregate_hdl)(struct ieee80211_hw *, struct sk_buff *, 148f1d2b4d3SLarry Finger struct sk_buff_head *); 149f1d2b4d3SLarry Finger void (*usb_rx_hdl)(struct ieee80211_hw *, struct sk_buff *); 150f1d2b4d3SLarry Finger }; 151f1d2b4d3SLarry Finger 152f1d2b4d3SLarry Finger struct rtl_usb_priv { 153f1d2b4d3SLarry Finger struct rtl_usb dev; 154f1d2b4d3SLarry Finger struct rtl_led_ctl ledctl; 155f1d2b4d3SLarry Finger }; 156f1d2b4d3SLarry Finger 157f1d2b4d3SLarry Finger #define rtl_usbpriv(hw) (((struct rtl_usb_priv *)(rtl_priv(hw))->priv)) 158f1d2b4d3SLarry Finger #define rtl_usbdev(usbpriv) (&((usbpriv)->dev)) 159f1d2b4d3SLarry Finger 160f1d2b4d3SLarry Finger 161f1d2b4d3SLarry Finger 162f1d2b4d3SLarry Finger int rtl_usb_probe(struct usb_interface *intf, 163f1d2b4d3SLarry Finger const struct usb_device_id *id, 164f1d2b4d3SLarry Finger struct rtl_hal_cfg *rtl92cu_hal_cfg); 165f1d2b4d3SLarry Finger void rtl_usb_disconnect(struct usb_interface *intf); 166f1d2b4d3SLarry Finger int rtl_usb_suspend(struct usb_interface *pusb_intf, pm_message_t message); 167f1d2b4d3SLarry Finger int rtl_usb_resume(struct usb_interface *pusb_intf); 168f1d2b4d3SLarry Finger 169f1d2b4d3SLarry Finger #endif 170