1234567891011121314151617181920212223242526272829303132333435363738394041 |
- From: Felix Fietkau <[email protected]>
- Date: Sun, 23 Jul 2017 14:58:22 +0200
- Subject: [PATCH] ath9k: fix more-data flag for buffered multicast
- packets
- The flag needs to be cleared for the last packet in the list, not the
- first one. Fixes some issues with multicast packet loss for powersave
- clients connected to an ath9k AP.
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- --- a/drivers/net/wireless/ath/ath9k/xmit.c
- +++ b/drivers/net/wireless/ath/ath9k/xmit.c
- @@ -2451,7 +2451,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw
- .txq = sc->beacon.cabq
- };
- struct ath_tx_info info = {};
- - struct ieee80211_hdr *hdr;
- struct ath_buf *bf_tail = NULL;
- struct ath_buf *bf;
- LIST_HEAD(bf_q);
- @@ -2495,15 +2494,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw
- if (list_empty(&bf_q))
- return;
-
- - bf = list_first_entry(&bf_q, struct ath_buf, list);
- - hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data;
- -
- - if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) {
- - hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
- - dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
- - sizeof(*hdr), DMA_TO_DEVICE);
- - }
- + bf = list_last_entry(&bf_q, struct ath_buf, list);
- + ath9k_set_moredata(sc, bf, false);
-
- + bf = list_first_entry(&bf_q, struct ath_buf, list);
- ath_txq_lock(sc, txctl.txq);
- ath_tx_fill_desc(sc, bf, txctl.txq, 0);
- ath_tx_txqaddbuf(sc, txctl.txq, &bf_q, false);
|