1 Upcoming fw versions will have different max links support
2 (according to the hw). Get ready for it by configuring
3 wl->num_links per-hw, instead of using the const WL12XX_MAX_LINKS.
5 However, continue using WLCORE_MAX_LINKS in order to simplify
6 structs declarations (we use it in multiple bitmaps, and converting
7 them to dynamic arrays is just cumbersome).
9 Signed-off-by: Eliad Peller <eliad@wizery.com>
12 drivers/net/wireless/ti/wl12xx/main.c | 3 +++
13 drivers/net/wireless/ti/wl12xx/wl12xx.h | 2 ++
14 drivers/net/wireless/ti/wl18xx/main.c | 3 +++
15 drivers/net/wireless/ti/wl18xx/wl18xx.h | 4 +++-
16 drivers/net/wireless/ti/wlcore/cmd.c | 4 ++--
17 drivers/net/wireless/ti/wlcore/event.c | 4 ++--
18 drivers/net/wireless/ti/wlcore/main.c | 12 ++++++++----
19 drivers/net/wireless/ti/wlcore/rx.c | 8 ++++----
20 drivers/net/wireless/ti/wlcore/tx.c | 20 ++++++++++----------
21 drivers/net/wireless/ti/wlcore/wlcore.h | 8 +++++---
22 drivers/net/wireless/ti/wlcore/wlcore_i.h | 13 +++++++++----
23 11 files changed, 51 insertions(+), 30 deletions(-)
25 --- a/drivers/net/wireless/ti/wl12xx/main.c
26 +++ b/drivers/net/wireless/ti/wl12xx/main.c
27 @@ -1749,9 +1749,12 @@ static int wl12xx_setup(struct wl1271 *w
28 struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
29 struct wl12xx_platform_data *pdata = pdev_data->pdata;
31 + BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
33 wl->rtable = wl12xx_rtable;
34 wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
35 wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
36 + wl->num_links = WL12XX_MAX_LINKS;
38 wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
39 wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
40 --- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
41 +++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
44 #define WL12XX_RX_BA_MAX_SESSIONS 3
46 +#define WL12XX_MAX_LINKS 12
48 struct wl127x_rx_mem_pool_addr {
51 --- a/drivers/net/wireless/ti/wl18xx/main.c
52 +++ b/drivers/net/wireless/ti/wl18xx/main.c
53 @@ -1752,9 +1752,12 @@ static int wl18xx_setup(struct wl1271 *w
54 struct wl18xx_priv *priv = wl->priv;
57 + BUILD_BUG_ON(WL18XX_MAX_LINKS > WLCORE_MAX_LINKS);
59 wl->rtable = wl18xx_rtable;
60 wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS;
61 wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
62 + wl->num_links = WL18XX_MAX_LINKS;
64 wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
65 wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
66 --- a/drivers/net/wireless/ti/wl18xx/wl18xx.h
67 +++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h
70 #define WL18XX_RX_BA_MAX_SESSIONS 5
72 +#define WL18XX_MAX_LINKS 12
75 /* buffer for sending commands to FW */
76 u8 cmd_buf[WL18XX_CMD_MAX_SIZE];
77 @@ -114,7 +116,7 @@ struct wl18xx_fw_packet_counters {
78 u8 tx_released_pkts[NUM_TX_QUEUES];
80 /* Cumulative counter of freed packets per HLID */
81 - u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
82 + u8 tx_lnk_free_pkts[WL18XX_MAX_LINKS];
84 /* Cumulative counter of released Voice memory blocks */
85 u8 tx_voice_released_blks;
86 --- a/drivers/net/wireless/ti/wlcore/cmd.c
87 +++ b/drivers/net/wireless/ti/wlcore/cmd.c
88 @@ -312,8 +312,8 @@ static int wlcore_get_new_session_id(str
89 int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
92 - u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS);
93 - if (link >= WL12XX_MAX_LINKS)
94 + u8 link = find_first_zero_bit(wl->links_map, wl->num_links);
95 + if (link >= wl->num_links)
98 wl->session_ids[link] = wlcore_get_new_session_id(wl, link);
99 --- a/drivers/net/wireless/ti/wlcore/event.c
100 +++ b/drivers/net/wireless/ti/wlcore/event.c
101 @@ -68,7 +68,7 @@ static void wl1271_stop_ba_event(struct
103 struct wl1271_link *lnk;
104 for_each_set_bit(hlid, wlvif->ap.sta_hlid_map,
105 - WL12XX_MAX_LINKS) {
107 lnk = &wl->links[hlid];
110 @@ -173,7 +173,7 @@ static void wlcore_disconnect_sta(struct
114 - for_each_set_bit(h, &sta_bitmap, WL12XX_MAX_LINKS) {
115 + for_each_set_bit(h, &sta_bitmap, wl->num_links) {
117 /* find the ap vif connected to this sta */
118 wl12xx_for_each_wlvif_ap(wl, wlvif) {
119 --- a/drivers/net/wireless/ti/wlcore/main.c
120 +++ b/drivers/net/wireless/ti/wlcore/main.c
121 @@ -372,7 +372,7 @@ static void wl12xx_irq_update_links_stat
122 wl->ap_fw_ps_map = cur_fw_ps_map;
125 - for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, WL12XX_MAX_LINKS)
126 + for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links)
127 wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
128 wl->links[hlid].allocated_pkts);
130 @@ -412,7 +412,7 @@ static int wlcore_fw_status(struct wl127
134 - for_each_set_bit(i, wl->links_map, WL12XX_MAX_LINKS) {
135 + for_each_set_bit(i, wl->links_map, wl->num_links) {
139 @@ -5888,7 +5888,7 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
143 - BUILD_BUG_ON(AP_MAX_STATIONS > WL12XX_MAX_LINKS);
144 + BUILD_BUG_ON(AP_MAX_STATIONS > WLCORE_MAX_LINKS);
146 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
148 @@ -5911,8 +5911,12 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
153 + * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
154 + * we don't allocate any additional resource here, so that's fine.
156 for (i = 0; i < NUM_TX_QUEUES; i++)
157 - for (j = 0; j < WL12XX_MAX_LINKS; j++)
158 + for (j = 0; j < WLCORE_MAX_LINKS; j++)
159 skb_queue_head_init(&wl->links[j].tx_queue[i]);
161 skb_queue_head_init(&wl->deferred_rx_queue);
162 --- a/drivers/net/wireless/ti/wlcore/rx.c
163 +++ b/drivers/net/wireless/ti/wlcore/rx.c
164 @@ -205,7 +205,7 @@ static int wl1271_rx_handle_data(struct
166 int wlcore_rx(struct wl1271 *wl, struct wl_fw_status *status)
168 - unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
169 + unsigned long active_hlids[BITS_TO_LONGS(WLCORE_MAX_LINKS)] = {0};
171 u32 fw_rx_counter = status->fw_rx_counter % wl->num_rx_desc;
172 u32 drv_rx_counter = wl->rx_counter % wl->num_rx_desc;
173 @@ -263,12 +263,12 @@ int wlcore_rx(struct wl1271 *wl, struct
174 wl->aggr_buf + pkt_offset,
177 - if (hlid < WL12XX_MAX_LINKS)
178 + if (hlid < wl->num_links)
179 __set_bit(hlid, active_hlids);
182 - "hlid exceeded WL12XX_MAX_LINKS "
184 + "hlid (%d) exceeded MAX_LINKS\n",
189 --- a/drivers/net/wireless/ti/wlcore/tx.c
190 +++ b/drivers/net/wireless/ti/wlcore/tx.c
191 @@ -565,11 +565,11 @@ static struct sk_buff *wlcore_vif_dequeu
192 int i, h, start_hlid;
194 /* start from the link after the last one */
195 - start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
196 + start_hlid = (wlvif->last_tx_hlid + 1) % wl->num_links;
198 /* dequeue according to AC, round robin on each link */
199 - for (i = 0; i < WL12XX_MAX_LINKS; i++) {
200 - h = (start_hlid + i) % WL12XX_MAX_LINKS;
201 + for (i = 0; i < wl->num_links; i++) {
202 + h = (start_hlid + i) % wl->num_links;
204 /* only consider connected stations */
205 if (!test_bit(h, wlvif->links_map))
206 @@ -693,8 +693,8 @@ static void wl1271_skb_queue_head(struct
207 skb_queue_head(&wl->links[hlid].tx_queue[q], skb);
209 /* make sure we dequeue the same packet next time */
210 - wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
212 + wlvif->last_tx_hlid = (hlid + wl->num_links - 1) %
216 spin_lock_irqsave(&wl->wl_lock, flags);
217 @@ -727,7 +727,7 @@ void wl12xx_rearm_rx_streaming(struct wl
218 timeout = wl->conf.rx_streaming.duration;
219 wl12xx_for_each_wlvif_sta(wl, wlvif) {
221 - for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
222 + for_each_set_bit(hlid, active_hlids, wl->num_links) {
223 if (test_bit(hlid, wlvif->links_map)) {
226 @@ -764,7 +764,7 @@ int wlcore_tx_work_locked(struct wl1271
227 struct wl1271_tx_hw_descr *desc;
228 u32 buf_offset = 0, last_len = 0;
229 bool sent_packets = false;
230 - unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
231 + unsigned long active_hlids[BITS_TO_LONGS(WLCORE_MAX_LINKS)] = {0};
235 @@ -1066,7 +1066,7 @@ void wl12xx_tx_reset_wlvif(struct wl1271
239 - for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
240 + for_each_set_bit(i, wlvif->links_map, wl->num_links) {
241 if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
242 i != wlvif->ap.bcast_hlid && i != wlvif->ap.global_hlid) {
243 /* this calls wl12xx_free_link */
244 @@ -1090,7 +1090,7 @@ void wl12xx_tx_reset(struct wl1271 *wl)
246 /* only reset the queues if something bad happened */
247 if (wl1271_tx_total_queue_count(wl) != 0) {
248 - for (i = 0; i < WL12XX_MAX_LINKS; i++)
249 + for (i = 0; i < wl->num_links; i++)
250 wl1271_tx_reset_link_queues(wl, i);
252 for (i = 0; i < NUM_TX_QUEUES; i++)
253 @@ -1183,7 +1183,7 @@ void wl1271_tx_flush(struct wl1271 *wl)
254 WL1271_TX_FLUSH_TIMEOUT / 1000);
256 /* forcibly flush all Tx buffers on our queues */
257 - for (i = 0; i < WL12XX_MAX_LINKS; i++)
258 + for (i = 0; i < wl->num_links; i++)
259 wl1271_tx_reset_link_queues(wl, i);
262 --- a/drivers/net/wireless/ti/wlcore/wlcore.h
263 +++ b/drivers/net/wireless/ti/wlcore/wlcore.h
264 @@ -224,7 +224,7 @@ struct wl1271 {
268 - unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
269 + unsigned long links_map[BITS_TO_LONGS(WLCORE_MAX_LINKS)];
270 unsigned long roles_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
271 unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
272 unsigned long rate_policies_map[
273 @@ -232,7 +232,7 @@ struct wl1271 {
274 unsigned long klv_templates_map[
275 BITS_TO_LONGS(WLCORE_MAX_KLV_TEMPLATES)];
277 - u8 session_ids[WL12XX_MAX_LINKS];
278 + u8 session_ids[WLCORE_MAX_LINKS];
280 struct list_head wlvif_list;
282 @@ -380,7 +380,7 @@ struct wl1271 {
283 * AP-mode - links indexed by HLID. The global and broadcast links
286 - struct wl1271_link links[WL12XX_MAX_LINKS];
287 + struct wl1271_link links[WLCORE_MAX_LINKS];
289 /* number of currently active links */
290 int active_link_count;
291 @@ -438,6 +438,8 @@ struct wl1271 {
293 /* number of RX descriptors the HW supports. */
295 + /* number of links the HW supports */
298 /* translate HW Tx rates to standard rate-indices */
299 const u8 **band_rate_to_idx;
300 --- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
301 +++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
303 #define WL1271_DEFAULT_DTIM_PERIOD 1
305 #define WL12XX_MAX_ROLES 4
306 -#define WL12XX_MAX_LINKS 12
307 #define WL12XX_INVALID_ROLE_ID 0xff
308 #define WL12XX_INVALID_LINK_ID 0xff
311 + * max number of links allowed by all HWs.
312 + * this is NOT the actual max links supported by the current hw.
314 +#define WLCORE_MAX_LINKS 12
316 /* the driver supports the 2.4Ghz and 5Ghz bands */
317 #define WLCORE_NUM_BANDS 2
319 @@ -156,7 +161,7 @@ struct wl_fw_status {
322 * Cumulative counter of freed packets per HLID
323 - * (length of the array is WL12XX_MAX_LINKS)
324 + * (length of the array is wl->num_links)
326 u8 *tx_lnk_free_pkts;
328 @@ -357,7 +362,7 @@ struct wl12xx_vif {
330 /* HLIDs bitmap of associated stations */
331 unsigned long sta_hlid_map[BITS_TO_LONGS(
332 - WL12XX_MAX_LINKS)];
333 + WLCORE_MAX_LINKS)];
335 /* recoreded keys - set here before AP startup */
336 struct wl1271_ap_key *recorded_keys[MAX_NUM_KEYS];
337 @@ -374,7 +379,7 @@ struct wl12xx_vif {
338 /* counters of packets per AC, across all links in the vif */
339 int tx_queue_count[NUM_TX_QUEUES];
341 - unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
342 + unsigned long links_map[BITS_TO_LONGS(WLCORE_MAX_LINKS)];
344 u8 ssid[IEEE80211_MAX_SSID_LEN + 1];