drivers/net/wireless/mediatek/mt76/mt7996/dma.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/mediatek/mt76/mt7996/dma.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/mediatek/mt76/mt7996/dma.c
Extension
.c
Size
32146 bytes
Lines
1058
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (is_mt7996(&dev->mt76)) {
			RXQ_CONFIG(MT_RXQ_TXFREE_BAND0, WFDMA0,
				   MT_INT_RX_TXFREE_MAIN, MT7996_RXQ_TXFREE0);
			/* band1 */
			RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND1, WFDMA0,
				   MT_INT_RX_DONE_MSDU_PG_BAND1,
				   MT7996_RXQ_MSDU_PG_BAND1);
			/* band2 */
			RXQ_CONFIG(MT_RXQ_RRO_BAND2, WFDMA0,
				   MT_INT_RX_DONE_RRO_BAND2,
				   MT7996_RXQ_RRO_BAND2);
			RXQ_CONFIG(MT_RXQ_MSDU_PAGE_BAND2, WFDMA0,
				   MT_INT_RX_DONE_MSDU_PG_BAND2,
				   MT7996_RXQ_MSDU_PG_BAND2);
			RXQ_CONFIG(MT_RXQ_TXFREE_BAND2, WFDMA0,
				   MT_INT_RX_TXFREE_TRI, MT7996_RXQ_TXFREE2);
		} else {
			RXQ_CONFIG(MT_RXQ_RRO_BAND1, WFDMA0,
				   MT_INT_RX_DONE_RRO_BAND1,
				   MT7996_RXQ_RRO_BAND1);
		}

		if (dev->mt76.hwrro_mode == MT76_HWRRO_V3)
			RXQ_CONFIG(MT_RXQ_RRO_IND, WFDMA0,
				   MT_INT_RX_DONE_RRO_IND,
				   MT7996_RXQ_RRO_IND);
		else
			RXQ_CONFIG(MT_RXQ_RRO_RXDMAD_C, WFDMA0,
				   MT_INT_RX_DONE_RRO_RXDMAD_C,
				   MT7996_RXQ_RRO_RXDMAD_C);
	}

	/* data tx queue */
	if (is_mt7996(&dev->mt76)) {
		if (dev->hif2) {
			if (mt76_npu_device_active(&dev->mt76)) {
				TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND2,
					   MT7996_TXQ_BAND2);
				TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND0,
					   MT7996_TXQ_BAND0);
				TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND1,
					   MT7996_TXQ_BAND1);
			} else {
				/* default bn1:ring19 bn2:ring21 */
				TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,
					   MT7996_TXQ_BAND0);
				TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,
					   MT7996_TXQ_BAND1);
				TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND2,
					   MT7996_TXQ_BAND2);
			}
		} else {
			/* single pcie bn0/1:ring18 bn2:ring19 */
			TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,
				   MT7996_TXQ_BAND0);
			TXQ_CONFIG(2, WFDMA0, MT_INT_TX_DONE_BAND1,
				   MT7996_TXQ_BAND1);
		}
	} else {
		if (dev->hif2) {
			/*  bn0:ring18 bn1:ring21 */
			TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,
				   MT7996_TXQ_BAND0);
			TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND2,
				   MT7996_TXQ_BAND2);
		} else {
			/* single pcie bn0:ring18 bn1:ring19 */
			TXQ_CONFIG(0, WFDMA0, MT_INT_TX_DONE_BAND0,
				   MT7996_TXQ_BAND0);
			TXQ_CONFIG(1, WFDMA0, MT_INT_TX_DONE_BAND1,
				   MT7996_TXQ_BAND1);
		}
	}

	/* mcu tx queue */
	MCUQ_CONFIG(MT_MCUQ_FWDL, WFDMA0, MT_INT_TX_DONE_FWDL, MT7996_TXQ_FWDL);
	MCUQ_CONFIG(MT_MCUQ_WM, WFDMA0, MT_INT_TX_DONE_MCU_WM, MT7996_TXQ_MCU_WM);
	if (mt7996_has_wa(dev))
		MCUQ_CONFIG(MT_MCUQ_WA, WFDMA0, MT_INT_TX_DONE_MCU_WA,
			    MT7996_TXQ_MCU_WA);
}

static u32 __mt7996_dma_prefetch_base(u16 *base, u8 depth)
{
	u32 ret = *base << 16 | depth;

	*base = *base + (depth << 4);

	return ret;
}

Annotation

Implementation Notes