fix TXP DMA unmap for mt7622/mt7623
Subsystems (2)
Lorenzo Bianconi
maintainerv2 cover fix TXP DMA unmap for mt7622/mt7623
Fix a possible data corruption unmapping hw txp from DMA engine
Changes since v1:
- remove usb series dependency to make backportig easier
- add specific macro for 7663
Lorenzo Bianconi (2):
mt76: mt7622: fix DMA unmap length
mt76: mt7663: fix DMA unmap length
.../net/wireless/mediatek/mt76/mt7615/mac.c | 26 ++++++++++++------- .../net/wireless/mediatek/mt76/mt7615/mac.h | 3 +++ 2 files changed, 20 insertions(+), 9 deletions(-)
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH v2 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 | 6 +++--- drivers/net/wireless/mediatek/mt76/mt7615/mac.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +3 -3
@@ -695,7 +695,7 @@ mt7615_txp_skb_unmap_hw(struct mt76_dev *dev, struct mt7615_hw_txp *txp) len =le16_to_cpu (ptr->len0); last = len &MT_TXD_LEN_MSDU_LAST ; - len &= ~MT_TXD_LEN_MSDU_LAST ; + len &=MT_TXD_LEN_MASK ;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf0), len,DMA_TO_DEVICE );if (last)
@@ -703,7 +703,7 @@ mt7615_txp_skb_unmap_hw(struct mt76_dev *dev, struct mt7615_hw_txp *txp) len =le16_to_cpu (ptr->len1); last = len &MT_TXD_LEN_MSDU_LAST ; - len &= ~MT_TXD_LEN_MSDU_LAST ; + len &=MT_TXD_LEN_MASK ;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf1), len,DMA_TO_DEVICE );if (last)
@@ -1114,8 +1114,8 @@ mt7615_write_hw_txp(struct mt7615_dev *dev, struct mt76_tx_info *tx_info, txp->msdu_id[0 ] =cpu_to_le16 (id |MT_MSDU_ID_VALID );for (i =0 ; i < nbuf; i++) { +u16 len = tx_info->buf[i +1 ].len &MT_TXD_LEN_MASK ;u32 addr = tx_info->buf[i +1 ].addr; -u16 len = tx_info->buf[i +1 ].len;if (i == nbuf -1 ) len |= MT_TXD_LEN_MSDU_LAST |
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +1 -0
@@ -253,6 +253,7 @@ enum tx_phy_bandwidth {#define MT_MSDU_ID_VALID BIT(15) +#define MT_TXD_LEN_MASK GENMASK(11, 0)#define MT_TXD_LEN_MSDU_LAST BIT(14)#define MT_TXD_LEN_AMSDU_LAST BIT(15)
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH v2 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]>
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 20 +++++++++++++------ .../net/wireless/mediatek/mt76/mt7615/mac.h | 2 ++ 2 files changed, 16 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +14 -6
@@ -686,15 +686,18 @@ 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;int i; + last_mask =is_mt7663 (dev) ?MT_TXD_LEN_LAST :MT_TXD_LEN_MSDU_LAST ; +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_LEN_MSDU_LAST ; + last = len & last_mask; len &=MT_TXD_LEN_MASK ;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf0), len,DMA_TO_DEVICE );
@@ -702,7 +705,7 @@ mt7615_txp_skb_unmap_hw(struct mt76_dev *dev, struct mt7615_hw_txp *txp)break ; len =le16_to_cpu (ptr->len1); - last = len &MT_TXD_LEN_MSDU_LAST ; + last = len & last_mask; len &=MT_TXD_LEN_MASK ;dma_unmap_single (dev->dev,le32_to_cpu (ptr->buf1), len,DMA_TO_DEVICE );
@@ -1105,21 +1108,26 @@ 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; tx_info->buf[0 ].len =MT_TXD_SIZE +sizeof (*txp); tx_info->nbuf =1 ; txp->msdu_id[0 ] =cpu_to_le16 (id |MT_MSDU_ID_VALID ); +if (is_mt7663 (&dev->mt76)) + last_mask =MT_TXD_LEN_LAST ; +else + last_mask =MT_TXD_LEN_AMSDU_LAST | +MT_TXD_LEN_MSDU_LAST ; +for (i =0 ; i < nbuf; i++) {u16 len = tx_info->buf[i +1 ].len &MT_TXD_LEN_MASK ;u32 addr = tx_info->buf[i +1 ].addr;if (i == nbuf -1 ) - len |=MT_TXD_LEN_MSDU_LAST | -MT_TXD_LEN_AMSDU_LAST ; + len |= last_mask;if (i &1 ) { ptr->buf1 =cpu_to_le32 (addr);
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +2 -0
@@ -256,6 +256,8 @@ enum tx_phy_bandwidth {#define MT_TXD_LEN_MASK GENMASK(11, 0)#define MT_TXD_LEN_MSDU_LAST BIT(14)#define MT_TXD_LEN_AMSDU_LAST BIT(15) +/* mt7663 */ +#define MT_TXD_LEN_LAST BIT(15)struct mt7615_txp_ptr {__le32 buf0;
Signature · 1 line
2.25.2