wil6210: fix reordering for MCAST
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Tue, 23 Dec 2014 07:47:21 +0000 (09:47 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 15 Jan 2015 12:31:41 +0000 (14:31 +0200)
In the reordering block, Ethernet DA was checked for MCAST, this is wrong.
Check instead MCAST indication from 802.11 MAC header. Hardware saves
this into Rx descriptor.

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wil6210/rx_reorder.c
drivers/net/wireless/ath/wil6210/txrx.c
drivers/net/wireless/ath/wil6210/txrx.h

index 0865c3430e51f5d568fdaa04ce56ca3db436f414..20d65f224f7cc63b651f4ff75dc3259bf50d32ad 100644 (file)
@@ -97,14 +97,20 @@ void wil_rx_reorder(struct wil6210_priv *wil, struct sk_buff *skb)
        int cid = wil_rxdesc_cid(d);
        int mid = wil_rxdesc_mid(d);
        u16 seq = wil_rxdesc_seq(d);
+       int mcast = wil_rxdesc_mcast(d);
        struct wil_sta_info *sta = &wil->sta[cid];
        struct wil_tid_ampdu_rx *r;
        u16 hseq;
        int index;
        unsigned long flags;
 
-       wil_dbg_txrx(wil, "MID %d CID %d TID %d Seq 0x%03x\n",
-                    mid, cid, tid, seq);
+       wil_dbg_txrx(wil, "MID %d CID %d TID %d Seq 0x%03x mcast %01x\n",
+                    mid, cid, tid, seq, mcast);
+
+       if (unlikely(mcast)) {
+               wil_netif_rx_any(skb, ndev);
+               return;
+       }
 
        spin_lock_irqsave(&sta->tid_rx_lock, flags);
 
index 4c145eea9c32cd1acc4fa622a91e040a56abad57..5fc5f56545ce52d935ba712f015b4b8ad2b58a1d 100644 (file)
@@ -581,14 +581,8 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
                        skb->protocol = htons(ETH_P_802_2);
                        wil_netif_rx_any(skb, ndev);
                } else {
-                       struct ethhdr *eth = (void *)skb->data;
-
                        skb->protocol = eth_type_trans(skb, ndev);
-
-                       if (is_unicast_ether_addr(eth->h_dest))
-                               wil_rx_reorder(wil, skb);
-                       else
-                               wil_netif_rx_any(skb, ndev);
+                       wil_rx_reorder(wil, skb);
                }
        }
        wil_rx_refill(wil, v->size);
index e7db35646cdda92e9c04286e287d9db129e454c1..c906c5f0b6635f9cd4344fd7e1e229c20d0ae4b0 100644 (file)
@@ -423,6 +423,11 @@ static inline int wil_rxdesc_mcs(struct vring_rx_desc *d)
        return WIL_GET_BITS(d->mac.d1, 21, 24);
 }
 
+static inline int wil_rxdesc_mcast(struct vring_rx_desc *d)
+{
+       return WIL_GET_BITS(d->mac.d1, 13, 14);
+}
+
 static inline int wil_rxdesc_phy_length(struct vring_rx_desc *d)
 {
        return WIL_GET_BITS(d->dma.d0, 16, 29);