|
@@ -1195,17 +1195,6 @@ found:
|
|
|
return v;
|
|
|
}
|
|
|
|
|
|
-static struct vring *wil_find_tx_bcast(struct wil6210_priv *wil,
|
|
|
- struct sk_buff *skb)
|
|
|
-{
|
|
|
- struct wireless_dev *wdev = wil->wdev;
|
|
|
-
|
|
|
- if (wdev->iftype != NL80211_IFTYPE_AP)
|
|
|
- return wil_find_tx_bcast_2(wil, skb);
|
|
|
-
|
|
|
- return wil_find_tx_bcast_1(wil, skb);
|
|
|
-}
|
|
|
-
|
|
|
static int wil_tx_desc_map(struct vring_tx_desc *d, dma_addr_t pa, u32 len,
|
|
|
int vring_index)
|
|
|
{
|
|
@@ -1905,12 +1894,26 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|
|
pr_once_fw = false;
|
|
|
|
|
|
/* find vring */
|
|
|
- if (wil->wdev->iftype == NL80211_IFTYPE_STATION) {
|
|
|
- /* in STA mode (ESS), all to same VRING */
|
|
|
+ if (wil->wdev->iftype == NL80211_IFTYPE_STATION && !wil->pbss) {
|
|
|
+ /* in STA mode (ESS), all to same VRING (to AP) */
|
|
|
vring = wil_find_tx_vring_sta(wil, skb);
|
|
|
- } else { /* direct communication, find matching VRING */
|
|
|
- vring = bcast ? wil_find_tx_bcast(wil, skb) :
|
|
|
- wil_find_tx_ucast(wil, skb);
|
|
|
+ } else if (bcast) {
|
|
|
+ if (wil->pbss)
|
|
|
+ /* in pbss, no bcast VRING - duplicate skb in
|
|
|
+ * all stations VRINGs
|
|
|
+ */
|
|
|
+ vring = wil_find_tx_bcast_2(wil, skb);
|
|
|
+ else if (wil->wdev->iftype == NL80211_IFTYPE_AP)
|
|
|
+ /* AP has a dedicated bcast VRING */
|
|
|
+ vring = wil_find_tx_bcast_1(wil, skb);
|
|
|
+ else
|
|
|
+ /* unexpected combination, fallback to duplicating
|
|
|
+ * the skb in all stations VRINGs
|
|
|
+ */
|
|
|
+ vring = wil_find_tx_bcast_2(wil, skb);
|
|
|
+ } else {
|
|
|
+ /* unicast, find specific VRING by dest. address */
|
|
|
+ vring = wil_find_tx_ucast(wil, skb);
|
|
|
}
|
|
|
if (unlikely(!vring)) {
|
|
|
wil_dbg_txrx(wil, "No Tx VRING found for %pM\n", eth->h_dest);
|