aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/wil6210
diff options
context:
space:
mode:
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>2015-02-15 07:02:32 -0500
committerKalle Valo <kvalo@codeaurora.org>2015-02-27 03:15:17 -0500
commite3351277ac585df77ac2454c518205897c01a184 (patch)
tree4fd0d5faf088bb3fa908db8e1e9f930ce7e89af4 /drivers/net/wireless/ath/wil6210
parent9a5511b58b25aaf4cba61d9144229d2987a5135c (diff)
wil6210: enable fix for HW bug in 802.11->803.3 transform
In the old hardware, bug existed that caused DA and SA for every Rx packet to be swapped in the AP mode. New hardware has fix for this bug. Enable this fix in the hardware. Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/ath/wil6210')
-rw-r--r--drivers/net/wireless/ath/wil6210/main.c4
-rw-r--r--drivers/net/wireless/ath/wil6210/txrx.c31
-rw-r--r--drivers/net/wireless/ath/wil6210/wil6210.h7
3 files changed, 11 insertions, 31 deletions
diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c
index 95755a551796..db74e811f5c4 100644
--- a/drivers/net/wireless/ath/wil6210/main.c
+++ b/drivers/net/wireless/ath/wil6210/main.c
@@ -579,6 +579,10 @@ static int wil_target_reset(struct wil6210_priv *wil)
579 579
580 C(RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); 580 C(RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD);
581 581
582 /* enable fix for HW bug related to the SA/DA swap in AP Rx */
583 S(RGF_DMA_OFUL_NID_0, BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN |
584 BIT_DMA_OFUL_NID_0_RX_EXT_A3_SRC);
585
582 wil_dbg_misc(wil, "Reset completed in %d ms\n", delay * RST_DELAY); 586 wil_dbg_misc(wil, "Reset completed in %d ms\n", delay * RST_DELAY);
583 return 0; 587 return 0;
584} 588}
diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c
index 8439f65db259..779d8369f9bc 100644
--- a/drivers/net/wireless/ath/wil6210/txrx.c
+++ b/drivers/net/wireless/ath/wil6210/txrx.c
@@ -346,27 +346,6 @@ static void wil_rx_add_radiotap_header(struct wil6210_priv *wil,
346 } 346 }
347} 347}
348 348
349/*
350 * Fast swap in place between 2 registers
351 */
352static void wil_swap_u16(u16 *a, u16 *b)
353{
354 *a ^= *b;
355 *b ^= *a;
356 *a ^= *b;
357}
358
359static void wil_swap_ethaddr(void *data)
360{
361 struct ethhdr *eth = data;
362 u16 *s = (u16 *)eth->h_source;
363 u16 *d = (u16 *)eth->h_dest;
364
365 wil_swap_u16(s++, d++);
366 wil_swap_u16(s++, d++);
367 wil_swap_u16(s, d);
368}
369
370/** 349/**
371 * reap 1 frame from @swhead 350 * reap 1 frame from @swhead
372 * 351 *
@@ -386,7 +365,6 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
386 unsigned int sz = mtu_max + ETH_HLEN; 365 unsigned int sz = mtu_max + ETH_HLEN;
387 u16 dmalen; 366 u16 dmalen;
388 u8 ftype; 367 u8 ftype;
389 u8 ds_bits;
390 int cid; 368 int cid;
391 struct wil_net_stats *stats; 369 struct wil_net_stats *stats;
392 370
@@ -474,15 +452,6 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
474 */ 452 */
475 } 453 }
476 454
477 ds_bits = wil_rxdesc_ds_bits(d);
478 if (ds_bits == 1) {
479 /*
480 * HW bug - in ToDS mode, i.e. Rx on AP side,
481 * addresses get swapped
482 */
483 wil_swap_ethaddr(skb->data);
484 }
485
486 return skb; 455 return skb;
487} 456}
488 457
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h
index 97422e7854d3..85f001191319 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -181,6 +181,13 @@ struct RGF_BL {
181 #define BIT_DMA_ITR_CNT_CRL_CLR BIT(3) 181 #define BIT_DMA_ITR_CNT_CRL_CLR BIT(3)
182 #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH BIT(4) 182 #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH BIT(4)
183 183
184/* Offload control (Sparrow B0+) */
185#define RGF_DMA_OFUL_NID_0 (0x881cd4)
186 #define BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN BIT(0)
187 #define BIT_DMA_OFUL_NID_0_TX_EXT_TR_EN BIT(1)
188 #define BIT_DMA_OFUL_NID_0_RX_EXT_A3_SRC BIT(2)
189 #define BIT_DMA_OFUL_NID_0_TX_EXT_A3_SRC BIT(3)
190
184/* New (sparrow v2+) interrupt moderation control */ 191/* New (sparrow v2+) interrupt moderation control */
185#define RGF_DMA_ITR_TX_DESQ_NO_MOD (0x881d40) 192#define RGF_DMA_ITR_TX_DESQ_NO_MOD (0x881d40)
186#define RGF_DMA_ITR_TX_CNT_TRSH (0x881d34) 193#define RGF_DMA_ITR_TX_CNT_TRSH (0x881d34)