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 corerev; 91 u32 boardid; 92 u32 boardvendor; 93 u32 boardrev; 94 u32 driverrev; 95 u32 ucoderev; 96 u32 bus; 97 char chipname[12]; 98 u32 phytype; 99 u32 phyrev; 100 u32 anarev; 101 u32 chippkg; 102 u32 nvramrev; 103 }; 104 105 /* Common structure for module and instance linkage */ 106 struct brcmf_pub { 107 /* Linkage ponters */ 108 struct brcmf_bus *bus_if; 109 struct brcmf_proto *proto; 110 struct wiphy *wiphy; 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 struct brcmf_if *mon_if; 125 126 struct mutex proto_block; 127 unsigned char proto_buf[BRCMF_DCMD_MAXLEN]; 128 129 struct brcmf_fweh_info fweh; 130 131 struct brcmf_ampdu_rx_reorder 132 *reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS]; 133 134 u32 feat_flags; 135 u32 chip_quirks; 136 137 struct brcmf_rev_info revinfo; 138 #ifdef DEBUG 139 struct dentry *dbgfs_dir; 140 #endif 141 142 struct notifier_block inetaddr_notifier; 143 struct notifier_block inet6addr_notifier; 144 struct brcmf_mp_device *settings; 145 146 u8 clmver[BRCMF_DCMD_SMLEN]; 147 }; 148 149 /* forward declarations */ 150 struct brcmf_cfg80211_vif; 151 struct brcmf_fws_mac_descriptor; 152 153 /** 154 * enum brcmf_netif_stop_reason - reason for stopping netif queue. 155 * 156 * @BRCMF_NETIF_STOP_REASON_FWS_FC: 157 * netif stopped due to firmware signalling flow control. 158 * @BRCMF_NETIF_STOP_REASON_FLOW: 159 * netif stopped due to flowring full. 160 * @BRCMF_NETIF_STOP_REASON_DISCONNECTED: 161 * netif stopped due to not being connected (STA mode). 162 */ 163 enum brcmf_netif_stop_reason { 164 BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0), 165 BRCMF_NETIF_STOP_REASON_FLOW = BIT(1), 166 BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2) 167 }; 168 169 /** 170 * struct brcmf_if - interface control information. 171 * 172 * @drvr: points to device related information. 173 * @vif: points to cfg80211 specific interface information. 174 * @ndev: associated network device. 175 * @multicast_work: worker object for multicast provisioning. 176 * @ndoffload_work: worker object for neighbor discovery offload configuration. 177 * @fws_desc: interface specific firmware-signalling descriptor. 178 * @ifidx: interface index in device firmware. 179 * @bsscfgidx: index of bss associated with this interface. 180 * @mac_addr: assigned mac address. 181 * @netif_stop: bitmap indicates reason why netif queues are stopped. 182 * @netif_stop_lock: spinlock for update netif_stop from multiple sources. 183 * @pend_8021x_cnt: tracks outstanding number of 802.1x frames. 184 * @pend_8021x_wait: used for signalling change in count. 185 * @fwil_fwerr: flag indicating fwil layer should return firmware error codes. 186 */ 187 struct brcmf_if { 188 struct brcmf_pub *drvr; 189 struct brcmf_cfg80211_vif *vif; 190 struct net_device *ndev; 191 struct work_struct multicast_work; 192 struct work_struct ndoffload_work; 193 struct brcmf_fws_mac_descriptor *fws_desc; 194 int ifidx; 195 s32 bsscfgidx; 196 u8 mac_addr[ETH_ALEN]; 197 u8 netif_stop; 198 spinlock_t netif_stop_lock; 199 atomic_t pend_8021x_cnt; 200 wait_queue_head_t pend_8021x_wait; 201 struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES]; 202 u8 ipv6addr_idx; 203 bool fwil_fwerr; 204 }; 205 206 int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); 207 208 /* Return pointer to interface name */ 209 char *brcmf_ifname(struct brcmf_if *ifp); 210 struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); 211 void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable); 212 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); 213 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, 214 bool is_p2pdev, const char *name, u8 *mac_addr); 215 void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); 216 void brcmf_txflowblock_if(struct brcmf_if *ifp, 217 enum brcmf_netif_stop_reason reason, bool state); 218 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); 219 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); 220 void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb); 221 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); 222 int __init brcmf_core_init(void); 223 void __exit brcmf_core_exit(void); 224 225 #endif /* BRCMFMAC_CORE_H */ 226