wifi: mt76: mt7996: fix RX buffer size of MCU event
[ Upstream commit 42cb27af34de4acf680606fad2c1f2932110591f ]
Some management frames are first processed by the firmware and then
passed to the driver through the MCU event rings. In CONNAC3, event rings
do not support scatter-gather and have a size limitation of 2048 bytes.
If a packet sized between 1728 and 2048 bytes arrives from an event ring,
the ring will hang because the driver attempts to use scatter-gather to
process it.
To fix this, include the size of struct skb_shared_info in the MCU RX
buffer size to prevent scatter-gather from being used for event skb in
mt76_dma_rx_fill_buf().
Fixes: 98686cd216
("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices")
Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20250515032952.1653494-7-shayne.chen@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
800f7e73a6
commit
1e8b2048f9
@@ -300,7 +300,7 @@ int mt7996_dma_init(struct mt7996_dev *dev)
|
|||||||
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
|
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU],
|
||||||
MT_RXQ_ID(MT_RXQ_MCU),
|
MT_RXQ_ID(MT_RXQ_MCU),
|
||||||
MT7996_RX_MCU_RING_SIZE,
|
MT7996_RX_MCU_RING_SIZE,
|
||||||
MT_RX_BUF_SIZE,
|
MT7996_RX_MCU_BUF_SIZE,
|
||||||
MT_RXQ_RING_BASE(MT_RXQ_MCU));
|
MT_RXQ_RING_BASE(MT_RXQ_MCU));
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -309,7 +309,7 @@ int mt7996_dma_init(struct mt7996_dev *dev)
|
|||||||
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
|
ret = mt76_queue_alloc(dev, &dev->mt76.q_rx[MT_RXQ_MCU_WA],
|
||||||
MT_RXQ_ID(MT_RXQ_MCU_WA),
|
MT_RXQ_ID(MT_RXQ_MCU_WA),
|
||||||
MT7996_RX_MCU_RING_SIZE_WA,
|
MT7996_RX_MCU_RING_SIZE_WA,
|
||||||
MT_RX_BUF_SIZE,
|
MT7996_RX_MCU_BUF_SIZE,
|
||||||
MT_RXQ_RING_BASE(MT_RXQ_MCU_WA));
|
MT_RXQ_RING_BASE(MT_RXQ_MCU_WA));
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -27,6 +27,9 @@
|
|||||||
#define MT7996_RX_RING_SIZE 1536
|
#define MT7996_RX_RING_SIZE 1536
|
||||||
#define MT7996_RX_MCU_RING_SIZE 512
|
#define MT7996_RX_MCU_RING_SIZE 512
|
||||||
#define MT7996_RX_MCU_RING_SIZE_WA 1024
|
#define MT7996_RX_MCU_RING_SIZE_WA 1024
|
||||||
|
/* scatter-gather of mcu event is not supported in connac3 */
|
||||||
|
#define MT7996_RX_MCU_BUF_SIZE (2048 + \
|
||||||
|
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
|
||||||
|
|
||||||
#define MT7996_FIRMWARE_WA "mediatek/mt7996/mt7996_wa.bin"
|
#define MT7996_FIRMWARE_WA "mediatek/mt7996/mt7996_wa.bin"
|
||||||
#define MT7996_FIRMWARE_WM "mediatek/mt7996/mt7996_wm.bin"
|
#define MT7996_FIRMWARE_WM "mediatek/mt7996/mt7996_wm.bin"
|
||||||
|
Reference in New Issue
Block a user