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 #define NDOL_MAX_ENTRIES 8 52 53 /** 54 * struct brcmf_ampdu_rx_reorder - AMPDU receive reorder info 55 * 56 * @pktslots: dynamic allocated array for ordering AMPDU packets. 57 * @flow_id: AMPDU flow identifier. 58 * @cur_idx: last AMPDU index from firmware. 59 * @exp_idx: expected next AMPDU index. 60 * @max_idx: maximum amount of packets per AMPDU. 61 * @pend_pkts: number of packets currently in @pktslots. 62 */ 63 struct brcmf_ampdu_rx_reorder { 64 struct sk_buff **pktslots; 65 u8 flow_id; 66 u8 cur_idx; 67 u8 exp_idx; 68 u8 max_idx; 69 u8 pend_pkts; 70 }; 71 72 /* Forward decls for struct brcmf_pub (see below) */ 73 struct brcmf_proto; /* device communication protocol info */ 74 struct brcmf_fws_info; /* firmware signalling info */ 75 struct brcmf_mp_device; /* module paramateres, device specific */ 76 77 /* 78 * struct brcmf_rev_info 79 * 80 * The result field stores the error code of the 81 * revision info request from firmware. For the 82 * other fields see struct brcmf_rev_info_le in 83 * fwil_types.h 84 */ 85 struct brcmf_rev_info { 86 int result; 87 u32 vendorid; 88 u32 deviceid; 89 u32 radiorev; 90 u32 chiprev; 91 u32 corerev; 92 u32 boardid; 93 u32 boardvendor; 94 u32 boardrev; 95 u32 driverrev; 96 u32 ucoderev; 97 u32 bus; 98 u32 chipnum; 99 u32 phytype; 100 u32 phyrev; 101 u32 anarev; 102 u32 chippkg; 103 u32 nvramrev; 104 }; 105 106 /* Common structure for module and instance linkage */ 107 struct brcmf_pub { 108 /* Linkage ponters */ 109 struct brcmf_bus *bus_if; 110 struct brcmf_proto *proto; 111 struct brcmf_cfg80211_info *config; 112 113 /* Internal brcmf items */ 114 uint hdrlen; /* Total BRCMF header length (proto + bus) */ 115 116 /* Dongle media info */ 117 char fwver[BRCMF_DRIVER_FIRMWARE_VERSION_LEN]; 118 u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */ 119 120 struct mac_address addresses[BRCMF_MAX_IFS]; 121 122 struct brcmf_if *iflist[BRCMF_MAX_IFS]; 123 s32 if2bss[BRCMF_MAX_IFS]; 124 125 struct mutex proto_block; 126 unsigned char proto_buf[BRCMF_DCMD_MAXLEN]; 127 128 struct brcmf_fweh_info fweh; 129 130 struct brcmf_fws_info *fws; 131 132 struct brcmf_ampdu_rx_reorder 133 *reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS]; 134 135 u32 feat_flags; 136 u32 chip_quirks; 137 138 struct brcmf_rev_info revinfo; 139 #ifdef DEBUG 140 struct dentry *dbgfs_dir; 141 #endif 142 143 struct notifier_block inetaddr_notifier; 144 struct notifier_block inet6addr_notifier; 145 struct brcmf_mp_device *settings; 146 }; 147 148 /* forward declarations */ 149 struct brcmf_cfg80211_vif; 150 struct brcmf_fws_mac_descriptor; 151 152 /** 153 * enum brcmf_netif_stop_reason - reason for stopping netif queue. 154 * 155 * @BRCMF_NETIF_STOP_REASON_FWS_FC: 156 * netif stopped due to firmware signalling flow control. 157 * @BRCMF_NETIF_STOP_REASON_FLOW: 158 * netif stopped due to flowring full. 159 * @BRCMF_NETIF_STOP_REASON_DISCONNECTED: 160 * netif stopped due to not being connected (STA mode). 161 */ 162 enum brcmf_netif_stop_reason { 163 BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0), 164 BRCMF_NETIF_STOP_REASON_FLOW = BIT(1), 165 BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2) 166 }; 167 168 /** 169 * struct brcmf_if - interface control information. 170 * 171 * @drvr: points to device related information. 172 * @vif: points to cfg80211 specific interface information. 173 * @ndev: associated network device. 174 * @multicast_work: worker object for multicast provisioning. 175 * @ndoffload_work: worker object for neighbor discovery offload configuration. 176 * @fws_desc: interface specific firmware-signalling descriptor. 177 * @ifidx: interface index in device firmware. 178 * @bsscfgidx: index of bss associated with this interface. 179 * @mac_addr: assigned mac address. 180 * @netif_stop: bitmap indicates reason why netif queues are stopped. 181 * @netif_stop_lock: spinlock for update netif_stop from multiple sources. 182 * @pend_8021x_cnt: tracks outstanding number of 802.1x frames. 183 * @pend_8021x_wait: used for signalling change in count. 184 */ 185 struct brcmf_if { 186 struct brcmf_pub *drvr; 187 struct brcmf_cfg80211_vif *vif; 188 struct net_device *ndev; 189 struct work_struct multicast_work; 190 struct work_struct ndoffload_work; 191 struct brcmf_fws_mac_descriptor *fws_desc; 192 int ifidx; 193 s32 bsscfgidx; 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 struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES]; 200 u8 ipv6addr_idx; 201 }; 202 203 int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); 204 205 /* Return pointer to interface name */ 206 char *brcmf_ifname(struct brcmf_if *ifp); 207 struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); 208 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); 209 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, 210 bool is_p2pdev, const char *name, u8 *mac_addr); 211 void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); 212 void brcmf_txflowblock_if(struct brcmf_if *ifp, 213 enum brcmf_netif_stop_reason reason, bool state); 214 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); 215 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); 216 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); 217 int __init brcmf_core_init(void); 218 void __exit brcmf_core_exit(void); 219 220 #endif /* BRCMFMAC_CORE_H */ 221