fix TXP DMA unmap for mt7622/mt7623
Subsystems (2)
Lorenzo Bianconi
maintainercover fix TXP DMA unmap for mt7622/mt7623
Fix a possible data corruption unmapping hw txp from DMA engine
Lorenzo Bianconi (2):
mt76: mt7622: fix DMA unmap length
mt76: mt7663: fix DMA unmap length
drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 17 +++++++++++++---- drivers/net/wireless/mediatek/mt76/mt7615/mac.h | 3 +++ .../net/wireless/mediatek/mt76/mt7615/pci_mac.c | 16 ++++++++++++---- 3 files changed, 28 insertions(+), 8 deletions(-)
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH 1/2 mt76: mt7622: fix DMA unmap length
Fix DMA unmap length estimation in mt7615_txp_skb_unmap_hw for mt7622 chipset
Fixes 6aa4ed7927f1 ("mt76: mt7615: implement DMA support for MT7622")
Signed-off-by Lorenzo Bianconi <[email protected]>
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 8 ++++---- drivers/net/wireless/mediatek/mt76/mt7615/mac.h | 1 + drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c | 3 +-- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +4 -4
@@ -662,16 +662,16 @@ mt7615_txp_skb_unmap_hw(struct mt76_dev *dev, struct mt7615_hw_txp *txp)u16 len; len =le16_to_cpu (ptr->len0); - last = len &MT_TXD_LEN_MSDU_LAST ; - len &= ~MT_TXD_LEN_MSDU_LAST ; + last = len &MT_TXD_LAST_MASK ; + len &= ~MT_TXD_LAST_MASK ;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf0), len,DMA_TO_DEVICE );if (last)break ; len =le16_to_cpu (ptr->len1); - last = len &MT_TXD_LEN_MSDU_LAST ; - len &= ~MT_TXD_LEN_MSDU_LAST ; + last = len &MT_TXD_LAST_MASK ; + len &= ~MT_TXD_LAST_MASK ;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf1), len,DMA_TO_DEVICE );if (last)
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +1 -0
@@ -258,6 +258,7 @@ enum tx_phy_bandwidth {#define MT_TXD_LEN_MSDU_LAST BIT(14)#define MT_TXD_LEN_AMSDU_LAST BIT(15) +#define MT_TXD_LAST_MASK GENMASK(15, 14)struct mt7615_txp_ptr {__le32 buf0;
drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c +1 -2
@@ -67,8 +67,7 @@ mt7615_write_hw_txp(struct mt7615_dev *dev, struct mt76_tx_info *tx_info,u16 len = tx_info->buf[i +1 ].len;if (i == nbuf -1 ) - len |=MT_TXD_LEN_MSDU_LAST | -MT_TXD_LEN_AMSDU_LAST ; + len |=MT_TXD_LAST_MASK ;if (i &1 ) { ptr->buf1 =cpu_to_le32 (addr);
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH 2/2 mt76: mt7663: fix DMA unmap length
In reply to Lorenzo BianconiFix DMA unmap length for mt7663e devices in mt7615_txp_skb_unmap_hw
Fixes f40ac0f3d3c0 ("mt76: mt7615: introduce mt7663e support")
Co-developed-by Sean Wang <[email protected]>
Signed-off-by Sean Wang <[email protected]>
Co-developed-by Soul Huang <[email protected]>
Signed-off-by Soul Huang <[email protected]>
Signed-off-by Lorenzo Bianconi <[email protected]>
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 17 +++++++++++++---- drivers/net/wireless/mediatek/mt76/mt7615/mac.h | 2 ++ .../net/wireless/mediatek/mt76/mt7615/pci_mac.c | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 7 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +13 -4
@@ -654,24 +654,33 @@ mt7615_txp_skb_unmap_fw(struct mt76_dev *dev, struct mt7615_fw_txp *txp)static void mt7615_txp_skb_unmap_hw (struct mt76_dev *dev,struct mt7615_hw_txp *txp) { +u32 last_mask, len_mask;int i; +if (is_mt7663 (dev)) { + last_mask =MT_TXD_LEN_AMSDU_LAST ; + len_mask =MT7663_TXD_LEN_MASK ; + }else { + last_mask =MT_TXD_LAST_MASK ; + len_mask =MT_TXD_LEN_MASK ; + } +for (i =0 ; i <ARRAY_SIZE (txp->ptr); i++) {struct mt7615_txp_ptr *ptr = &txp->ptr[i];bool last;u16 len; len =le16_to_cpu (ptr->len0); - last = len &MT_TXD_LAST_MASK ; - len &= ~MT_TXD_LAST_MASK ; + last = len & last_mask; + len &= len_mask;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf0), len,DMA_TO_DEVICE );if (last)break ; len =le16_to_cpu (ptr->len1); - last = len &MT_TXD_LAST_MASK ; - len &= ~MT_TXD_LAST_MASK ; + last = len & last_mask; + len &= len_mask;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf1), len,DMA_TO_DEVICE );if (last)
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +2 -0
@@ -256,8 +256,10 @@ enum tx_phy_bandwidth {#define MT_MSDU_ID_VALID BIT(15) +#define MT7663_TXD_LEN_MASK GENMASK(11, 0)#define MT_TXD_LEN_MSDU_LAST BIT(14)#define MT_TXD_LEN_AMSDU_LAST BIT(15) +#define MT_TXD_LEN_MASK GENMASK(13, 0)#define MT_TXD_LAST_MASK GENMASK(15, 14)struct mt7615_txp_ptr {
drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c +12 -3
@@ -54,20 +54,29 @@ mt7615_write_hw_txp(struct mt7615_dev *dev, struct mt76_tx_info *tx_info, {struct mt7615_hw_txp *txp = txp_ptr;struct mt7615_txp_ptr *ptr = &txp->ptr[0 ]; -int nbuf = tx_info->nbuf -1 ; -int i; +int i, nbuf = tx_info->nbuf -1 ; +u32 last_mask, len_mask; tx_info->buf[0 ].len =MT_TXD_SIZE +sizeof (*txp); tx_info->nbuf =1 ; +if (is_mt7663 (&dev->mt76)) { + last_mask =MT_TXD_LEN_AMSDU_LAST ; + len_mask =MT7663_TXD_LEN_MASK ; + }else { + last_mask =MT_TXD_LAST_MASK ; + len_mask =MT_TXD_LEN_MASK ; + } + txp->msdu_id[0 ] =cpu_to_le16 (id |MT_MSDU_ID_VALID );for (i =0 ; i < nbuf; i++) {u32 addr = tx_info->buf[i +1 ].addr;u16 len = tx_info->buf[i +1 ].len; + len &= len_mask;if (i == nbuf -1 ) - len |=MT_TXD_LAST_MASK ; + len |= last_mask;if (i &1 ) { ptr->buf1 =cpu_to_le32 (addr);
Signature · 1 line
2.25.2