2 * Copyright (c) 2010 Broadcom Corporation
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.
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.
24 #define BRCMF_VERSION_STR "4.218.248.5"
28 #define TOE_TX_CSUM_OL 0x00000001
29 #define TOE_RX_CSUM_OL 0x00000002
31 /* For supporting multiple interfaces */
32 #define BRCMF_MAX_IFS 16
34 #define DOT11_MAX_DEFAULT_KEYS 4
36 #define BRCMF_E_STATUS_SUCCESS 0
37 #define BRCMF_E_STATUS_FAIL 1
38 #define BRCMF_E_STATUS_TIMEOUT 2
39 #define BRCMF_E_STATUS_NO_NETWORKS 3
40 #define BRCMF_E_STATUS_ABORT 4
41 #define BRCMF_E_STATUS_NO_ACK 5
42 #define BRCMF_E_STATUS_UNSOLICITED 6
43 #define BRCMF_E_STATUS_ATTEMPT 7
44 #define BRCMF_E_STATUS_PARTIAL 8
45 #define BRCMF_E_STATUS_NEWSCAN 9
46 #define BRCMF_E_STATUS_NEWASSOC 10
47 #define BRCMF_E_STATUS_11HQUIET 11
48 #define BRCMF_E_STATUS_SUPPRESS 12
49 #define BRCMF_E_STATUS_NOCHANS 13
50 #define BRCMF_E_STATUS_CS_ABORT 15
51 #define BRCMF_E_STATUS_ERROR 16
53 #define BRCMF_E_REASON_INITIAL_ASSOC 0
54 #define BRCMF_E_REASON_LOW_RSSI 1
55 #define BRCMF_E_REASON_DEAUTH 2
56 #define BRCMF_E_REASON_DISASSOC 3
57 #define BRCMF_E_REASON_BCNS_LOST 4
58 #define BRCMF_E_REASON_MINTXRATE 9
59 #define BRCMF_E_REASON_TXFAIL 10
61 #define BRCMF_E_REASON_LINK_BSSCFG_DIS 4
62 #define BRCMF_E_REASON_FAST_ROAM_FAILED 5
63 #define BRCMF_E_REASON_DIRECTED_ROAM 6
64 #define BRCMF_E_REASON_TSPEC_REJECTED 7
65 #define BRCMF_E_REASON_BETTER_AP 8
67 #define BRCMF_E_IF_ADD 1
68 #define BRCMF_E_IF_DEL 2
69 #define BRCMF_E_IF_CHANGE 3
71 #define BRCMF_E_IF_FLAG_NOIF 1
73 #define BRCMF_E_IF_ROLE_STA 0
74 #define BRCMF_E_IF_ROLE_AP 1
75 #define BRCMF_E_IF_ROLE_WDS 2
77 /* Small, medium and maximum buffer size for dcmd
79 #define BRCMF_DCMD_SMLEN 256
80 #define BRCMF_DCMD_MEDLEN 1536
81 #define BRCMF_DCMD_MAXLEN 8192
83 #define BRCMF_AMPDU_RX_REORDER_MAXFLOWS 256
85 /* Length of firmware version string stored for
86 * ethtool driver info which uses 32 bytes as well.
88 #define BRCMF_DRIVER_FIRMWARE_VERSION_LEN 32
90 /* Bus independent dongle command */
92 uint cmd
; /* common dongle cmd definition */
93 void *buf
; /* pointer to user buffer */
94 uint len
; /* length of user buffer */
95 u8 set
; /* get or set request (optional) */
96 uint used
; /* bytes read or written (optional) */
97 uint needed
; /* bytes needed (optional) */
101 * struct brcmf_ampdu_rx_reorder - AMPDU receive reorder info
103 * @pktslots: dynamic allocated array for ordering AMPDU packets.
104 * @flow_id: AMPDU flow identifier.
105 * @cur_idx: last AMPDU index from firmware.
106 * @exp_idx: expected next AMPDU index.
107 * @max_idx: maximum amount of packets per AMPDU.
108 * @pend_pkts: number of packets currently in @pktslots.
110 struct brcmf_ampdu_rx_reorder
{
111 struct sk_buff
**pktslots
;
119 /* Forward decls for struct brcmf_pub (see below) */
120 struct brcmf_proto
; /* device communication protocol info */
121 struct brcmf_cfg80211_dev
; /* cfg80211 device info */
122 struct brcmf_fws_info
; /* firmware signalling info */
124 /* Common structure for module and instance linkage */
126 /* Linkage ponters */
127 struct brcmf_bus
*bus_if
;
128 struct brcmf_proto
*proto
;
129 struct brcmf_cfg80211_info
*config
;
131 /* Internal brcmf items */
132 uint hdrlen
; /* Total BRCMF header length (proto + bus) */
133 uint rxsz
; /* Rx buffer size bus module should use */
134 u8 wme_dp
; /* wme discard priority */
136 /* Dongle media info */
137 char fwver
[BRCMF_DRIVER_FIRMWARE_VERSION_LEN
];
138 u8 mac
[ETH_ALEN
]; /* MAC address obtained from dongle */
140 /* Multicast data packets sent to dongle */
141 unsigned long tx_multicast
;
143 struct brcmf_if
*iflist
[BRCMF_MAX_IFS
];
145 struct mutex proto_block
;
146 unsigned char proto_buf
[BRCMF_DCMD_MAXLEN
];
148 struct brcmf_fweh_info fweh
;
150 struct brcmf_fws_info
*fws
;
152 struct brcmf_ampdu_rx_reorder
153 *reorder_flows
[BRCMF_AMPDU_RX_REORDER_MAXFLOWS
];
155 struct dentry
*dbgfs_dir
;
159 struct brcmf_if_event
{
167 /* forward declarations */
168 struct brcmf_cfg80211_vif
;
169 struct brcmf_fws_mac_descriptor
;
172 * enum brcmf_netif_stop_reason - reason for stopping netif queue.
174 * @BRCMF_NETIF_STOP_REASON_FWS_FC:
175 * netif stopped due to firmware signalling flow control.
176 * @BRCMF_NETIF_STOP_REASON_BLOCK_BUS:
177 * netif stopped due to bus blocking.
179 enum brcmf_netif_stop_reason
{
180 BRCMF_NETIF_STOP_REASON_FWS_FC
= 1,
181 BRCMF_NETIF_STOP_REASON_BLOCK_BUS
= 2
185 * struct brcmf_if - interface control information.
187 * @drvr: points to device related information.
188 * @vif: points to cfg80211 specific interface information.
189 * @ndev: associated network device.
190 * @stats: interface specific network statistics.
191 * @setmacaddr_work: worker object for setting mac address.
192 * @multicast_work: worker object for multicast provisioning.
193 * @fws_desc: interface specific firmware-signalling descriptor.
194 * @ifidx: interface index in device firmware.
195 * @bssidx: index of bss associated with this interface.
196 * @mac_addr: assigned mac address.
197 * @netif_stop: bitmap indicates reason why netif queues are stopped.
198 * @netif_stop_lock: spinlock for update netif_stop from multiple sources.
199 * @pend_8021x_cnt: tracks outstanding number of 802.1x frames.
200 * @pend_8021x_wait: used for signalling change in count.
203 struct brcmf_pub
*drvr
;
204 struct brcmf_cfg80211_vif
*vif
;
205 struct net_device
*ndev
;
206 struct net_device_stats stats
;
207 struct work_struct setmacaddr_work
;
208 struct work_struct multicast_work
;
209 struct brcmf_fws_mac_descriptor
*fws_desc
;
212 u8 mac_addr
[ETH_ALEN
];
214 spinlock_t netif_stop_lock
;
215 atomic_t pend_8021x_cnt
;
216 wait_queue_head_t pend_8021x_wait
;
219 struct brcmf_skb_reorder_data
{
223 int brcmf_netdev_wait_pend8021x(struct net_device
*ndev
);
225 /* Return pointer to interface name */
226 char *brcmf_ifname(struct brcmf_pub
*drvr
, int idx
);
228 int brcmf_net_attach(struct brcmf_if
*ifp
, bool rtnl_locked
);
229 struct brcmf_if
*brcmf_add_if(struct brcmf_pub
*drvr
, s32 bssidx
, s32 ifidx
,
230 char *name
, u8
*mac_addr
);
231 void brcmf_del_if(struct brcmf_pub
*drvr
, s32 bssidx
);
232 void brcmf_txflowblock_if(struct brcmf_if
*ifp
,
233 enum brcmf_netif_stop_reason reason
, bool state
);
234 u32
brcmf_get_chip_info(struct brcmf_if
*ifp
);
235 void brcmf_txfinalize(struct brcmf_pub
*drvr
, struct sk_buff
*txp
,
238 /* Sets dongle media info (drv_version, mac address). */
239 int brcmf_c_preinit_dcmds(struct brcmf_if
*ifp
);
241 #endif /* _BRCMF_H_ */