346 lines
12 KiB
Diff
346 lines
12 KiB
Diff
|
Upcoming fw versions will have different max links support
|
||
|
(according to the hw). Get ready for it by configuring
|
||
|
wl->num_links per-hw, instead of using the const WL12XX_MAX_LINKS.
|
||
|
|
||
|
However, continue using WLCORE_MAX_LINKS in order to simplify
|
||
|
structs declarations (we use it in multiple bitmaps, and converting
|
||
|
them to dynamic arrays is just cumbersome).
|
||
|
|
||
|
Signed-off-by: Eliad Peller <eliad@wizery.com>
|
||
|
|
||
|
---
|
||
|
drivers/net/wireless/ti/wl12xx/main.c | 3 +++
|
||
|
drivers/net/wireless/ti/wl12xx/wl12xx.h | 2 ++
|
||
|
drivers/net/wireless/ti/wl18xx/main.c | 3 +++
|
||
|
drivers/net/wireless/ti/wl18xx/wl18xx.h | 4 +++-
|
||
|
drivers/net/wireless/ti/wlcore/cmd.c | 4 ++--
|
||
|
drivers/net/wireless/ti/wlcore/event.c | 4 ++--
|
||
|
drivers/net/wireless/ti/wlcore/main.c | 12 ++++++++----
|
||
|
drivers/net/wireless/ti/wlcore/rx.c | 8 ++++----
|
||
|
drivers/net/wireless/ti/wlcore/tx.c | 20 ++++++++++----------
|
||
|
drivers/net/wireless/ti/wlcore/wlcore.h | 8 +++++---
|
||
|
drivers/net/wireless/ti/wlcore/wlcore_i.h | 13 +++++++++----
|
||
|
11 files changed, 51 insertions(+), 30 deletions(-)
|
||
|
|
||
|
--- a/drivers/net/wireless/ti/wl12xx/main.c
|
||
|
+++ b/drivers/net/wireless/ti/wl12xx/main.c
|
||
|
@@ -1749,9 +1749,12 @@ static int wl12xx_setup(struct wl1271 *w
|
||
|
struct wlcore_platdev_data *pdev_data = dev_get_platdata(&wl->pdev->dev);
|
||
|
struct wl12xx_platform_data *pdata = pdev_data->pdata;
|
||
|
|
||
|
+ BUILD_BUG_ON(WL12XX_MAX_LINKS > WLCORE_MAX_LINKS);
|
||
|
+
|
||
|
wl->rtable = wl12xx_rtable;
|
||
|
wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
|
||
|
wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
|
||
|
+ wl->num_links = WL12XX_MAX_LINKS;
|
||
|
wl->num_channels = 1;
|
||
|
wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
|
||
|
wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
|
||
|
--- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||
|
+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
|
||
|
@@ -65,6 +65,8 @@
|
||
|
|
||
|
#define WL12XX_RX_BA_MAX_SESSIONS 3
|
||
|
|
||
|
+#define WL12XX_MAX_LINKS 12
|
||
|
+
|
||
|
struct wl127x_rx_mem_pool_addr {
|
||
|
u32 addr;
|
||
|
u32 addr_extra;
|
||
|
--- a/drivers/net/wireless/ti/wl18xx/main.c
|
||
|
+++ b/drivers/net/wireless/ti/wl18xx/main.c
|
||
|
@@ -1752,9 +1752,12 @@ static int wl18xx_setup(struct wl1271 *w
|
||
|
struct wl18xx_priv *priv = wl->priv;
|
||
|
int ret;
|
||
|
|
||
|
+ BUILD_BUG_ON(WL18XX_MAX_LINKS > WLCORE_MAX_LINKS);
|
||
|
+
|
||
|
wl->rtable = wl18xx_rtable;
|
||
|
wl->num_tx_desc = WL18XX_NUM_TX_DESCRIPTORS;
|
||
|
wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
|
||
|
+ wl->num_links = WL18XX_MAX_LINKS;
|
||
|
wl->num_channels = 2;
|
||
|
wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
|
||
|
wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
|
||
|
--- a/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||
|
+++ b/drivers/net/wireless/ti/wl18xx/wl18xx.h
|
||
|
@@ -42,6 +42,8 @@
|
||
|
|
||
|
#define WL18XX_RX_BA_MAX_SESSIONS 5
|
||
|
|
||
|
+#define WL18XX_MAX_LINKS 12
|
||
|
+
|
||
|
struct wl18xx_priv {
|
||
|
/* buffer for sending commands to FW */
|
||
|
u8 cmd_buf[WL18XX_CMD_MAX_SIZE];
|
||
|
@@ -114,7 +116,7 @@ struct wl18xx_fw_packet_counters {
|
||
|
u8 tx_released_pkts[NUM_TX_QUEUES];
|
||
|
|
||
|
/* Cumulative counter of freed packets per HLID */
|
||
|
- u8 tx_lnk_free_pkts[WL12XX_MAX_LINKS];
|
||
|
+ u8 tx_lnk_free_pkts[WL18XX_MAX_LINKS];
|
||
|
|
||
|
/* Cumulative counter of released Voice memory blocks */
|
||
|
u8 tx_voice_released_blks;
|
||
|
--- a/drivers/net/wireless/ti/wlcore/cmd.c
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
|
||
|
@@ -312,8 +312,8 @@ static int wlcore_get_new_session_id(str
|
||
|
int wl12xx_allocate_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
|
||
|
{
|
||
|
unsigned long flags;
|
||
|
- u8 link = find_first_zero_bit(wl->links_map, WL12XX_MAX_LINKS);
|
||
|
- if (link >= WL12XX_MAX_LINKS)
|
||
|
+ u8 link = find_first_zero_bit(wl->links_map, wl->num_links);
|
||
|
+ if (link >= wl->num_links)
|
||
|
return -EBUSY;
|
||
|
|
||
|
wl->session_ids[link] = wlcore_get_new_session_id(wl, link);
|
||
|
--- a/drivers/net/wireless/ti/wlcore/event.c
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/event.c
|
||
|
@@ -68,7 +68,7 @@ static void wl1271_stop_ba_event(struct
|
||
|
u8 hlid;
|
||
|
struct wl1271_link *lnk;
|
||
|
for_each_set_bit(hlid, wlvif->ap.sta_hlid_map,
|
||
|
- WL12XX_MAX_LINKS) {
|
||
|
+ wl->num_links) {
|
||
|
lnk = &wl->links[hlid];
|
||
|
if (!lnk->ba_bitmap)
|
||
|
continue;
|
||
|
@@ -173,7 +173,7 @@ static void wlcore_disconnect_sta(struct
|
||
|
const u8 *addr;
|
||
|
int h;
|
||
|
|
||
|
- for_each_set_bit(h, &sta_bitmap, WL12XX_MAX_LINKS) {
|
||
|
+ for_each_set_bit(h, &sta_bitmap, wl->num_links) {
|
||
|
bool found = false;
|
||
|
/* find the ap vif connected to this sta */
|
||
|
wl12xx_for_each_wlvif_ap(wl, wlvif) {
|
||
|
--- a/drivers/net/wireless/ti/wlcore/main.c
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/main.c
|
||
|
@@ -372,7 +372,7 @@ static void wl12xx_irq_update_links_stat
|
||
|
wl->ap_fw_ps_map = cur_fw_ps_map;
|
||
|
}
|
||
|
|
||
|
- for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, WL12XX_MAX_LINKS)
|
||
|
+ for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links)
|
||
|
wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
|
||
|
wl->links[hlid].allocated_pkts);
|
||
|
}
|
||
|
@@ -412,7 +412,7 @@ static int wlcore_fw_status(struct wl127
|
||
|
}
|
||
|
|
||
|
|
||
|
- for_each_set_bit(i, wl->links_map, WL12XX_MAX_LINKS) {
|
||
|
+ for_each_set_bit(i, wl->links_map, wl->num_links) {
|
||
|
u8 diff;
|
||
|
lnk = &wl->links[i];
|
||
|
|
||
|
@@ -5888,7 +5888,7 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
|
||
|
int i, j, ret;
|
||
|
unsigned int order;
|
||
|
|
||
|
- BUILD_BUG_ON(AP_MAX_STATIONS > WL12XX_MAX_LINKS);
|
||
|
+ BUILD_BUG_ON(AP_MAX_STATIONS > WLCORE_MAX_LINKS);
|
||
|
|
||
|
hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
|
||
|
if (!hw) {
|
||
|
@@ -5911,8 +5911,12 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
|
||
|
|
||
|
wl->hw = hw;
|
||
|
|
||
|
+ /*
|
||
|
+ * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
|
||
|
+ * we don't allocate any additional resource here, so that's fine.
|
||
|
+ */
|
||
|
for (i = 0; i < NUM_TX_QUEUES; i++)
|
||
|
- for (j = 0; j < WL12XX_MAX_LINKS; j++)
|
||
|
+ for (j = 0; j < WLCORE_MAX_LINKS; j++)
|
||
|
skb_queue_head_init(&wl->links[j].tx_queue[i]);
|
||
|
|
||
|
skb_queue_head_init(&wl->deferred_rx_queue);
|
||
|
--- a/drivers/net/wireless/ti/wlcore/rx.c
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/rx.c
|
||
|
@@ -205,7 +205,7 @@ static int wl1271_rx_handle_data(struct
|
||
|
|
||
|
int wlcore_rx(struct wl1271 *wl, struct wl_fw_status *status)
|
||
|
{
|
||
|
- unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
|
||
|
+ unsigned long active_hlids[BITS_TO_LONGS(WLCORE_MAX_LINKS)] = {0};
|
||
|
u32 buf_size;
|
||
|
u32 fw_rx_counter = status->fw_rx_counter % wl->num_rx_desc;
|
||
|
u32 drv_rx_counter = wl->rx_counter % wl->num_rx_desc;
|
||
|
@@ -263,12 +263,12 @@ int wlcore_rx(struct wl1271 *wl, struct
|
||
|
wl->aggr_buf + pkt_offset,
|
||
|
pkt_len, rx_align,
|
||
|
&hlid) == 1) {
|
||
|
- if (hlid < WL12XX_MAX_LINKS)
|
||
|
+ if (hlid < wl->num_links)
|
||
|
__set_bit(hlid, active_hlids);
|
||
|
else
|
||
|
WARN(1,
|
||
|
- "hlid exceeded WL12XX_MAX_LINKS "
|
||
|
- "(%d)\n", hlid);
|
||
|
+ "hlid (%d) exceeded MAX_LINKS\n",
|
||
|
+ hlid);
|
||
|
}
|
||
|
|
||
|
wl->rx_counter++;
|
||
|
--- a/drivers/net/wireless/ti/wlcore/tx.c
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/tx.c
|
||
|
@@ -565,11 +565,11 @@ static struct sk_buff *wlcore_vif_dequeu
|
||
|
int i, h, start_hlid;
|
||
|
|
||
|
/* start from the link after the last one */
|
||
|
- start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
|
||
|
+ start_hlid = (wlvif->last_tx_hlid + 1) % wl->num_links;
|
||
|
|
||
|
/* dequeue according to AC, round robin on each link */
|
||
|
- for (i = 0; i < WL12XX_MAX_LINKS; i++) {
|
||
|
- h = (start_hlid + i) % WL12XX_MAX_LINKS;
|
||
|
+ for (i = 0; i < wl->num_links; i++) {
|
||
|
+ h = (start_hlid + i) % wl->num_links;
|
||
|
|
||
|
/* only consider connected stations */
|
||
|
if (!test_bit(h, wlvif->links_map))
|
||
|
@@ -693,8 +693,8 @@ static void wl1271_skb_queue_head(struct
|
||
|
skb_queue_head(&wl->links[hlid].tx_queue[q], skb);
|
||
|
|
||
|
/* make sure we dequeue the same packet next time */
|
||
|
- wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
|
||
|
- WL12XX_MAX_LINKS;
|
||
|
+ wlvif->last_tx_hlid = (hlid + wl->num_links - 1) %
|
||
|
+ wl->num_links;
|
||
|
}
|
||
|
|
||
|
spin_lock_irqsave(&wl->wl_lock, flags);
|
||
|
@@ -727,7 +727,7 @@ void wl12xx_rearm_rx_streaming(struct wl
|
||
|
timeout = wl->conf.rx_streaming.duration;
|
||
|
wl12xx_for_each_wlvif_sta(wl, wlvif) {
|
||
|
bool found = false;
|
||
|
- for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
|
||
|
+ for_each_set_bit(hlid, active_hlids, wl->num_links) {
|
||
|
if (test_bit(hlid, wlvif->links_map)) {
|
||
|
found = true;
|
||
|
break;
|
||
|
@@ -764,7 +764,7 @@ int wlcore_tx_work_locked(struct wl1271
|
||
|
struct wl1271_tx_hw_descr *desc;
|
||
|
u32 buf_offset = 0, last_len = 0;
|
||
|
bool sent_packets = false;
|
||
|
- unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
|
||
|
+ unsigned long active_hlids[BITS_TO_LONGS(WLCORE_MAX_LINKS)] = {0};
|
||
|
int ret = 0;
|
||
|
int bus_ret = 0;
|
||
|
u8 hlid;
|
||
|
@@ -1066,7 +1066,7 @@ void wl12xx_tx_reset_wlvif(struct wl1271
|
||
|
int i;
|
||
|
|
||
|
/* TX failure */
|
||
|
- for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
|
||
|
+ for_each_set_bit(i, wlvif->links_map, wl->num_links) {
|
||
|
if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
|
||
|
i != wlvif->ap.bcast_hlid && i != wlvif->ap.global_hlid) {
|
||
|
/* this calls wl12xx_free_link */
|
||
|
@@ -1090,7 +1090,7 @@ void wl12xx_tx_reset(struct wl1271 *wl)
|
||
|
|
||
|
/* only reset the queues if something bad happened */
|
||
|
if (wl1271_tx_total_queue_count(wl) != 0) {
|
||
|
- for (i = 0; i < WL12XX_MAX_LINKS; i++)
|
||
|
+ for (i = 0; i < wl->num_links; i++)
|
||
|
wl1271_tx_reset_link_queues(wl, i);
|
||
|
|
||
|
for (i = 0; i < NUM_TX_QUEUES; i++)
|
||
|
@@ -1183,7 +1183,7 @@ void wl1271_tx_flush(struct wl1271 *wl)
|
||
|
WL1271_TX_FLUSH_TIMEOUT / 1000);
|
||
|
|
||
|
/* forcibly flush all Tx buffers on our queues */
|
||
|
- for (i = 0; i < WL12XX_MAX_LINKS; i++)
|
||
|
+ for (i = 0; i < wl->num_links; i++)
|
||
|
wl1271_tx_reset_link_queues(wl, i);
|
||
|
|
||
|
out_wake:
|
||
|
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
|
||
|
@@ -224,7 +224,7 @@ struct wl1271 {
|
||
|
int channel;
|
||
|
u8 system_hlid;
|
||
|
|
||
|
- unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
|
||
|
+ unsigned long links_map[BITS_TO_LONGS(WLCORE_MAX_LINKS)];
|
||
|
unsigned long roles_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
||
|
unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
||
|
unsigned long rate_policies_map[
|
||
|
@@ -232,7 +232,7 @@ struct wl1271 {
|
||
|
unsigned long klv_templates_map[
|
||
|
BITS_TO_LONGS(WLCORE_MAX_KLV_TEMPLATES)];
|
||
|
|
||
|
- u8 session_ids[WL12XX_MAX_LINKS];
|
||
|
+ u8 session_ids[WLCORE_MAX_LINKS];
|
||
|
|
||
|
struct list_head wlvif_list;
|
||
|
|
||
|
@@ -380,7 +380,7 @@ struct wl1271 {
|
||
|
* AP-mode - links indexed by HLID. The global and broadcast links
|
||
|
* are always active.
|
||
|
*/
|
||
|
- struct wl1271_link links[WL12XX_MAX_LINKS];
|
||
|
+ struct wl1271_link links[WLCORE_MAX_LINKS];
|
||
|
|
||
|
/* number of currently active links */
|
||
|
int active_link_count;
|
||
|
@@ -438,6 +438,8 @@ struct wl1271 {
|
||
|
u32 num_tx_desc;
|
||
|
/* number of RX descriptors the HW supports. */
|
||
|
u32 num_rx_desc;
|
||
|
+ /* number of links the HW supports */
|
||
|
+ u8 num_links;
|
||
|
|
||
|
/* translate HW Tx rates to standard rate-indices */
|
||
|
const u8 **band_rate_to_idx;
|
||
|
--- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||
|
+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
|
||
|
@@ -58,10 +58,15 @@
|
||
|
#define WL1271_DEFAULT_DTIM_PERIOD 1
|
||
|
|
||
|
#define WL12XX_MAX_ROLES 4
|
||
|
-#define WL12XX_MAX_LINKS 12
|
||
|
#define WL12XX_INVALID_ROLE_ID 0xff
|
||
|
#define WL12XX_INVALID_LINK_ID 0xff
|
||
|
|
||
|
+/*
|
||
|
+ * max number of links allowed by all HWs.
|
||
|
+ * this is NOT the actual max links supported by the current hw.
|
||
|
+ */
|
||
|
+#define WLCORE_MAX_LINKS 12
|
||
|
+
|
||
|
/* the driver supports the 2.4Ghz and 5Ghz bands */
|
||
|
#define WLCORE_NUM_BANDS 2
|
||
|
|
||
|
@@ -156,7 +161,7 @@ struct wl_fw_status {
|
||
|
|
||
|
/*
|
||
|
* Cumulative counter of freed packets per HLID
|
||
|
- * (length of the array is WL12XX_MAX_LINKS)
|
||
|
+ * (length of the array is wl->num_links)
|
||
|
*/
|
||
|
u8 *tx_lnk_free_pkts;
|
||
|
|
||
|
@@ -357,7 +362,7 @@ struct wl12xx_vif {
|
||
|
|
||
|
/* HLIDs bitmap of associated stations */
|
||
|
unsigned long sta_hlid_map[BITS_TO_LONGS(
|
||
|
- WL12XX_MAX_LINKS)];
|
||
|
+ WLCORE_MAX_LINKS)];
|
||
|
|
||
|
/* recoreded keys - set here before AP startup */
|
||
|
struct wl1271_ap_key *recorded_keys[MAX_NUM_KEYS];
|
||
|
@@ -374,7 +379,7 @@ struct wl12xx_vif {
|
||
|
/* counters of packets per AC, across all links in the vif */
|
||
|
int tx_queue_count[NUM_TX_QUEUES];
|
||
|
|
||
|
- unsigned long links_map[BITS_TO_LONGS(WL12XX_MAX_LINKS)];
|
||
|
+ unsigned long links_map[BITS_TO_LONGS(WLCORE_MAX_LINKS)];
|
||
|
|
||
|
u8 ssid[IEEE80211_MAX_SSID_LEN + 1];
|
||
|
u8 ssid_len;
|