1 // SPDX-License-Identifier: ISC 2 /* 3 * Copyright (c) 2010 Broadcom Corporation 4 */ 5 6 /**************** 7 * Common types * 8 */ 9 10 #ifndef BRCMFMAC_CORE_H 11 #define BRCMFMAC_CORE_H 12 13 #include <net/cfg80211.h> 14 #include "fweh.h" 15 16 #define TOE_TX_CSUM_OL 0x00000001 17 #define TOE_RX_CSUM_OL 0x00000002 18 19 /* For supporting multiple interfaces */ 20 #define BRCMF_MAX_IFS 16 21 22 /* Small, medium and maximum buffer size for dcmd 23 */ 24 #define BRCMF_DCMD_SMLEN 256 25 #define BRCMF_DCMD_MEDLEN 1536 26 #define BRCMF_DCMD_MAXLEN 8192 27 28 /* IOCTL from host to device are limited in length. A device can only handle 29 * ethernet frame size. This limitation is to be applied by protocol layer. 30 */ 31 #define BRCMF_TX_IOCTL_MAX_MSG_SIZE (ETH_FRAME_LEN+ETH_FCS_LEN) 32 33 #define BRCMF_AMPDU_RX_REORDER_MAXFLOWS 256 34 35 /* Length of firmware version string stored for 36 * ethtool driver info which uses 32 bytes as well. 37 */ 38 #define BRCMF_DRIVER_FIRMWARE_VERSION_LEN 32 39 40 #define NDOL_MAX_ENTRIES 8 41 42 /** 43 * struct brcmf_ampdu_rx_reorder - AMPDU receive reorder info 44 * 45 * @pktslots: dynamic allocated array for ordering AMPDU packets. 46 * @flow_id: AMPDU flow identifier. 47 * @cur_idx: last AMPDU index from firmware. 48 * @exp_idx: expected next AMPDU index. 49 * @max_idx: maximum amount of packets per AMPDU. 50 * @pend_pkts: number of packets currently in @pktslots. 51 */ 52 struct brcmf_ampdu_rx_reorder { 53 struct sk_buff **pktslots; 54 u8 flow_id; 55 u8 cur_idx; 56 u8 exp_idx; 57 u8 max_idx; 58 u8 pend_pkts; 59 }; 60 61 /* Forward decls for struct brcmf_pub (see below) */ 62 struct brcmf_proto; /* device communication protocol info */ 63 struct brcmf_fws_info; /* firmware signalling info */ 64 struct brcmf_mp_device; /* module paramateres, device specific */ 65 66 /* 67 * struct brcmf_rev_info 68 * 69 * The result field stores the error code of the 70 * revision info request from firmware. For the 71 * other fields see struct brcmf_rev_info_le in 72 * fwil_types.h 73 */ 74 struct brcmf_rev_info { 75 int result; 76 u32 vendorid; 77 u32 deviceid; 78 u32 radiorev; 79 u32 corerev; 80 u32 boardid; 81 u32 boardvendor; 82 u32 boardrev; 83 u32 driverrev; 84 u32 ucoderev; 85 u32 bus; 86 char chipname[12]; 87 u32 phytype; 88 u32 phyrev; 89 u32 anarev; 90 u32 chippkg; 91 u32 nvramrev; 92 }; 93 94 /* Common structure for module and instance linkage */ 95 struct brcmf_pub { 96 /* Linkage ponters */ 97 struct brcmf_bus *bus_if; 98 struct brcmf_proto *proto; 99 struct wiphy *wiphy; 100 struct cfg80211_ops *ops; 101 struct brcmf_cfg80211_info *config; 102 103 /* Internal brcmf items */ 104 uint hdrlen; /* Total BRCMF header length (proto + bus) */ 105 106 /* Dongle media info */ 107 char fwver[BRCMF_DRIVER_FIRMWARE_VERSION_LEN]; 108 u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */ 109 110 struct mac_address addresses[BRCMF_MAX_IFS]; 111 112 struct brcmf_if *iflist[BRCMF_MAX_IFS]; 113 s32 if2bss[BRCMF_MAX_IFS]; 114 struct brcmf_if *mon_if; 115 116 struct mutex proto_block; 117 unsigned char proto_buf[BRCMF_DCMD_MAXLEN]; 118 119 struct brcmf_fweh_info fweh; 120 121 struct brcmf_ampdu_rx_reorder 122 *reorder_flows[BRCMF_AMPDU_RX_REORDER_MAXFLOWS]; 123 124 u32 feat_flags; 125 u32 chip_quirks; 126 127 struct brcmf_rev_info revinfo; 128 #ifdef DEBUG 129 struct dentry *dbgfs_dir; 130 #endif 131 132 struct notifier_block inetaddr_notifier; 133 struct notifier_block inet6addr_notifier; 134 struct brcmf_mp_device *settings; 135 136 struct work_struct bus_reset; 137 138 u8 clmver[BRCMF_DCMD_SMLEN]; 139 }; 140 141 /* forward declarations */ 142 struct brcmf_cfg80211_vif; 143 struct brcmf_fws_mac_descriptor; 144 145 /** 146 * enum brcmf_netif_stop_reason - reason for stopping netif queue. 147 * 148 * @BRCMF_NETIF_STOP_REASON_FWS_FC: 149 * netif stopped due to firmware signalling flow control. 150 * @BRCMF_NETIF_STOP_REASON_FLOW: 151 * netif stopped due to flowring full. 152 * @BRCMF_NETIF_STOP_REASON_DISCONNECTED: 153 * netif stopped due to not being connected (STA mode). 154 */ 155 enum brcmf_netif_stop_reason { 156 BRCMF_NETIF_STOP_REASON_FWS_FC = BIT(0), 157 BRCMF_NETIF_STOP_REASON_FLOW = BIT(1), 158 BRCMF_NETIF_STOP_REASON_DISCONNECTED = BIT(2) 159 }; 160 161 /** 162 * struct brcmf_if - interface control information. 163 * 164 * @drvr: points to device related information. 165 * @vif: points to cfg80211 specific interface information. 166 * @ndev: associated network device. 167 * @multicast_work: worker object for multicast provisioning. 168 * @ndoffload_work: worker object for neighbor discovery offload configuration. 169 * @fws_desc: interface specific firmware-signalling descriptor. 170 * @ifidx: interface index in device firmware. 171 * @bsscfgidx: index of bss associated with this interface. 172 * @mac_addr: assigned mac address. 173 * @netif_stop: bitmap indicates reason why netif queues are stopped. 174 * @netif_stop_lock: spinlock for update netif_stop from multiple sources. 175 * @pend_8021x_cnt: tracks outstanding number of 802.1x frames. 176 * @pend_8021x_wait: used for signalling change in count. 177 * @fwil_fwerr: flag indicating fwil layer should return firmware error codes. 178 */ 179 struct brcmf_if { 180 struct brcmf_pub *drvr; 181 struct brcmf_cfg80211_vif *vif; 182 struct net_device *ndev; 183 struct work_struct multicast_work; 184 struct work_struct ndoffload_work; 185 struct brcmf_fws_mac_descriptor *fws_desc; 186 int ifidx; 187 s32 bsscfgidx; 188 u8 mac_addr[ETH_ALEN]; 189 u8 netif_stop; 190 spinlock_t netif_stop_lock; 191 atomic_t pend_8021x_cnt; 192 wait_queue_head_t pend_8021x_wait; 193 struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES]; 194 u8 ipv6addr_idx; 195 bool fwil_fwerr; 196 }; 197 198 int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); 199 200 /* Return pointer to interface name */ 201 char *brcmf_ifname(struct brcmf_if *ifp); 202 struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); 203 void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable); 204 int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); 205 struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, 206 bool is_p2pdev, const char *name, u8 *mac_addr); 207 void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); 208 void brcmf_txflowblock_if(struct brcmf_if *ifp, 209 enum brcmf_netif_stop_reason reason, bool state); 210 void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); 211 void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, bool inirq); 212 void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb); 213 void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked); 214 int brcmf_net_mon_attach(struct brcmf_if *ifp); 215 void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); 216 int __init brcmf_core_init(void); 217 void __exit brcmf_core_exit(void); 218 219 #endif /* BRCMFMAC_CORE_H */ 220