浏览代码

wil6210: fix reordering for MCAST

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>
Vladimir Kondratiev 11 年之前
父节点
当前提交
e4373d8e4a

+ 8 - 2
drivers/net/wireless/ath/wil6210/rx_reorder.c

@@ -97,14 +97,20 @@ void wil_rx_reorder(struct wil6210_priv *wil, struct sk_buff *skb)
 	int cid = wil_rxdesc_cid(d);
 	int cid = wil_rxdesc_cid(d);
 	int mid = wil_rxdesc_mid(d);
 	int mid = wil_rxdesc_mid(d);
 	u16 seq = wil_rxdesc_seq(d);
 	u16 seq = wil_rxdesc_seq(d);
+	int mcast = wil_rxdesc_mcast(d);
 	struct wil_sta_info *sta = &wil->sta[cid];
 	struct wil_sta_info *sta = &wil->sta[cid];
 	struct wil_tid_ampdu_rx *r;
 	struct wil_tid_ampdu_rx *r;
 	u16 hseq;
 	u16 hseq;
 	int index;
 	int index;
 	unsigned long flags;
 	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);
 	spin_lock_irqsave(&sta->tid_rx_lock, flags);
 
 

+ 1 - 7
drivers/net/wireless/ath/wil6210/txrx.c

@@ -581,14 +581,8 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
 			skb->protocol = htons(ETH_P_802_2);
 			skb->protocol = htons(ETH_P_802_2);
 			wil_netif_rx_any(skb, ndev);
 			wil_netif_rx_any(skb, ndev);
 		} else {
 		} else {
-			struct ethhdr *eth = (void *)skb->data;
-
 			skb->protocol = eth_type_trans(skb, ndev);
 			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);
 	wil_rx_refill(wil, v->size);

+ 5 - 0
drivers/net/wireless/ath/wil6210/txrx.h

@@ -423,6 +423,11 @@ static inline int wil_rxdesc_mcs(struct vring_rx_desc *d)
 	return WIL_GET_BITS(d->mac.d1, 21, 24);
 	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)
 static inline int wil_rxdesc_phy_length(struct vring_rx_desc *d)
 {
 {
 	return WIL_GET_BITS(d->dma.d0, 16, 29);
 	return WIL_GET_BITS(d->dma.d0, 16, 29);