1 /* 2 * Copyright (c) 2010 Broadcom Corporation 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /**************** 18 * Common types * 19 */ 20 21 #ifndef BRCMFMAC_CORE_H 22 #define BRCMFMAC_CORE_H 23 24 #include <net/cfg80211.h> 25 #include "fweh.h" 26 27 #define TOE_TX_CSUM_OL 0x00000001 28 #define TOE_RX_CSUM_OL 0x00000002 29 30 /* For supporting multiple interfaces */ 31 #define BRCMF_MAX_IFS 16 32 33 /* Small, medium and maximum buffer size for dcmd 34 */ 35 #define BRCMF_DCMD_SMLEN 256 36 #define BRCMF_DCMD_MEDLEN 1536 37 #define BRCMF_DCMD_MAXLEN 8192 38 39 /* IOCTL from host to device are limited in lenght. A device can only handle 40 * ethernet frame size. This limitation is to be applied by protocol layer. 41 */ 42 #define BRCMF_TX_IOCTL_MAX_MSG_SIZE (ETH_FRAME_LEN+ETH_FCS_LEN) 43 44 #define BRCMF_AMPDU_RX_REORDER_MAXFLOWS 256 45 46 /* Length of firmware version string stored for 47 * ethtool driver info which uses 32 bytes as well. 48 */ 49 #define BRCMF_DRIVER_FIRMWARE_VERSION_LEN 32 50 51 /** 52 * struct brcmf_ampdu_rx_reorder - AMPDU receive reorder info 53 * 54 * @pktslots: dynamic allocated array for ordering AMPDU packets. 55 * @flow_id: AMPDU flow identifier. 56 * @cur_idx: last AMPDU index from firmware. 57 * @exp_idx: expected next AMPDU index. 58 * @max_idx: maximum amount of packets per AMPDU. 59 * @pend_pkts: number of packets currently in @pktslots. 60 */ 61 struct brcmf_ampdu_rx_reorder { 62 struct sk_buff **pktslots; 63 u8 flow_id; 64 u8 cur_idx; 65 u8 exp_idx; 66 u8 max_idx; 67 u8 pend_pkts; 68 }; 69 70 /* Forward decls for struct brcmf_pub (see below) */ 71 struct brcmf_proto; /* device communication protocol info */ 72 struct brcmf_cfg80211_dev; /* cfg80211 device info */ 73 struct brcmf_fws_info; /* firmware signalling info */ 74 75 /* 76 * struct brcmf_rev_info 77 * 78 * The result field stores the error code of the 79 * revision info request from firmware. For the 80 * other fields see struct brcmf_rev_info_le in 81 * fwil_types.h 82 */ 83 struct brcmf_rev_info { 84 int result; 85 u32 vendorid; 86 u32 deviceid; 87 u32 radiorev; 88 u32 chiprev; 89 u32 corerev; 90 u32 boardid; 91 u32 boardvendor; 92 u32 boardrev; 93 u32 driverrev; 94 u32 ucoderev; 95 u32 bus; 96 u32 chipnum; 97 u32 phytype; 98 u32 phyrev; 99 u32 anarev; 100 u32 chippkg; 101 u32 nvramrev; 102 }; 103 104 /* Common structure for module and instance linkage */ 105 struct brcmf_pub { 106 /* Linkage ponters */ 107 struct brcmf_bus *bus_if; 108 struct brcmf_proto *proto; 109 struct brcmf_cfg80211_info *config; 110 111 /* Internal brcmf items */ 112 uint hdrlen; /* Total BRCMF header length (proto + bus) */ 113 uint rxsz; /* Rx buffer size bus module should use */ 114 115 /* Dongle media info */ 116 char fwver[BRCMF_DRIVER_FIRMWARE_VERSION_LEN]; 117 u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */ 118 119 /* Multicast data packets sent to dongle */ 120 unsigned long tx_multicast; 121 122 struct mac_address addresses[BRCMF_MAX_IFS]; 123 124 struct brcmf_if *iflist[BRCMF_MAX_IFS]; 125 s32 if2bss[BRCMF_MAX_IFS]; 126 127 struct mutex proto_block; 128 unsigned char proto_buf[BRCMF_DCMD_MAXLEN]; 129 130 struct brcmf_fweh_info fweh; 131 132 struct brcmf_fws_info *fws; 133 134 struct brcmf_ampdu_rx_reorder 135 *reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS]; 136 137 u32 feat_flags; 138 u32 chip_quirks; 139 140 struct brcmf_rev_info revinfo; 141 #ifdef DEBUG 142 struct dentry *dbgfs_dir; 143 #endif 144 }; 145 146 /* forward declarations */ 147 struct brcmf_cfg80211_vif; 148 struct brcmf_fws_mac_descriptor; 149 150 /** 151 * enum brcmf_netif_stop_reason - reason for stopping netif queue. 152 * 153 * @BRCMF_NETIF_STOP_REASON_FWS_FC: 154 * netif stopped due to firmware signalling flow control. 155 * @BRCMF_NETIF_STOP_REASON_FLOW: 156 * netif stopped due to flowring full. 157 * @BRCMF_NETIF_STOP_REASON_DISCONNECTED: 158 * netif stopped due to not being connected (STA mode). 159 */ 160 enum brcmf_netif_stop_reason { 161 BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0), 162 BRCMF_NETIF_STOP_REASON_FLOW = BIT(1), 163 BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2) 164 }; 165 166 /** 167 * struct brcmf_if - interface control information. 168 * 169 * @drvr: points to device related information. 170 * @vif: points to cfg80211 specific interface information. 171 * @ndev: associated network device. 172 * @stats: interface specific network statistics. 173 * @setmacaddr_work: worker object for setting mac address. 174 * @multicast_work: worker object for multicast provisioning. 175 * @fws_desc: interface specific firmware-signalling descriptor. 176 * @ifidx: interface index in device firmware. 177 * @bssidx: index of bss associated with this interface. 178 * @mac_addr: assigned mac address. 179 * @netif_stop: bitmap indicates reason why netif queues are stopped. 180 * @netif_stop_lock: spinlock for update netif_stop from multiple sources. 181 * @pend_8021x_cnt: tracks outstanding number of 802.1x frames. 182 * @pend_8021x_wait: used for signalling change in count. 183 */ 184 struct brcmf_if { 185 struct brcmf_pub *drvr; 186 struct brcmf_cfg80211_vif *vif; 187 struct net_device *ndev; 188 struct net_device_stats stats; 189 struct work_struct setmacaddr_work; 190 struct work_struct multicast_work; 191 struct brcmf_fws_mac_descriptor *fws_desc; 192 int ifidx; 193 s32 bssidx; 194 u8 mac_addr[ETH_ALEN]; 195 u8 netif_stop; 196 spinlock_t netif_stop_lock; 197 atomic_t pend_8021x_cnt; 198 wait_queue_head_t pend_8021x_wait; 199 }; 200 201 struct brcmf_skb_reorder_data { 202 u8 *reorder; 203 }; 204 205 int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); 206 207 /* Return pointer to interface name */ 208 char *brcmf_ifname(struct brcmf_pub *drvr, int idx); 209 struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); 210 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); 211 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx, 212 bool is_p2pdev, char *name, u8 *mac_addr); 213 void brcmf_remove_interface(struct brcmf_if *ifp); 214 int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr); 215 void brcmf_txflowblock_if(struct brcmf_if *ifp, 216 enum brcmf_netif_stop_reason reason, bool state); 217 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); 218 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); 219 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); 220 221 #endif /* BRCMFMAC_CORE_H */ 222