From b0d5f664a0633a696b6764cb265280a7192302cb Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 13 Dec 2015 13:02:32 +0100 Subject: [PATCH] mt7603: initialize mac tx info template Signed-off-by: Felix Fietkau --- mt7603.h | 3 +++ mt7603_core.c | 10 ++++++++ mt7603_dma.h | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ mt7603_init.c | 18 ++++++++++++++ mt7603_regs.h | 2 ++ 5 files changed, 98 insertions(+) diff --git a/mt7603.h b/mt7603.h index 3abca533..504a6242 100644 --- a/mt7603.h +++ b/mt7603.h @@ -80,6 +80,9 @@ struct mt7603_dev { }; extern const struct ieee80211_ops mt7603_ops; + +u32 mt7603_reg_map(struct mt7603_dev *dev, u32 addr); + struct mt7603_dev *mt7603_alloc_device(struct device *pdev); irqreturn_t mt7603_irq_handler(int irq, void *dev_instance); diff --git a/mt7603_core.c b/mt7603_core.c index 8a204627..7a3199b0 100644 --- a/mt7603_core.c +++ b/mt7603_core.c @@ -63,3 +63,13 @@ irqreturn_t mt7603_irq_handler(int irq, void *dev_instance) return IRQ_HANDLED; } + +u32 mt7603_reg_map(struct mt7603_dev *dev, u32 addr) +{ + u32 base = addr & GENMASK(31, 19); + u32 offset = addr & GENMASK(18, 0); + + mt76_wr(dev, MT_MCU_PCIE_REMAP_2, base); + + return MT_PCIE_REMAP_BASE_2 + offset; +} diff --git a/mt7603_dma.h b/mt7603_dma.h index 2363abd4..60254ba8 100644 --- a/mt7603_dma.h +++ b/mt7603_dma.h @@ -28,4 +28,69 @@ enum rx_pkt_type { PKT_TYPE_RX_EVENT = 7, }; +#define MT_TXD0_P_IDX BIT(31) +#define MT_TXD0_Q_IDX GENMASK(30, 27) +#define MT_TXD0_UTXB BIT(26) +#define MT_TXD0_UNXV BIT(25) +#define MT_TXD0_UDP_TCP_SUM BIT(24) +#define MT_TXD0_IP_SUM BIT(23) +#define MT_TXD0_ETH_TYPE_OFFSET GENMASK(22, 16) +#define MT_TXD0_TX_BYTES GENMASK(15, 0) + +#define MT_TXD1_OWN_MAC GENMASK(31, 26) +#define MT_TXD1_PROTECTED BIT(23) +#define MT_TXD1_TID GENMASK(22, 20) +#define MT_TXD1_NO_ACK BIT(19) +#define MT_TXD1_HDR_PAD GENMASK(18, 16) +#define MT_TXD1_FT BIT(15) +#define MT_TXD1_HDR_FORMAT GENMASK(14, 13) +#define MT_TXD1_HDR_INFO GENMASK(12, 8) +#define MT_TXD1_WLAN_IDX GENMASK(7, 0) + +#define MT_TXD2_FIX_RATE BIT(31) +#define MT_TXD2_TIMING_MEASURE BIT(30) +#define MT_TXD2_BA_DISABLE BIT(29) +#define MT_TXD2_POWER_OFFSET GENMASK(28, 24) +#define MT_TXD2_MAX_TX_TIME GENMASK(23, 16) +#define MT_TXD2_FRAG GENMASK(15, 14) +#define MT_TXD2_HTC_VLD BIT(13) +#define MT_TXD2_DURATION BIT(12) +#define MT_TXD2_BIP BIT(11) +#define MT_TXD2_MULTICAST BIT(10) +#define MT_TXD2_RTS BIT(9) +#define MT_TXD2_SOUNDING BIT(8) +#define MT_TXD2_NDPA BIT(7) +#define MT_TXD2_NDP BIT(6) +#define MT_TXD2_FRAME_TYPE GENMASK(5, 4) +#define MT_TXD2_SUB_TYPE GENMASK(3, 0) + +#define MT_TXD3_SN_VALID BIT(31) +#define MT_TXD3_PN_VALID BIT(30) +#define MT_TXD3_SEQ GENMASK(27, 16) +#define MT_TXD3_REM_TX_COUNT GENMASK(15, 11) +#define MT_TXD3_TX_COUNT GENMASK(10, 6) + +#define MT_TXD4_PN_LOW GENMASK(31, 0) + +#define MT_TXD5_PN_HIGH GENMASK(31, 16) +#define MT_TXD5_SW_POWER_MGMT BIT(13) +#define MT_TXD5_BA_SEQ_CTRL BIT(12) +#define MT_TXD5_DA_SELECT BIT(11) +#define MT_TXD5_TX_STATUS_HOST BIT(10) +#define MT_TXD5_TX_STATUS_MCU BIT(9) +#define MT_TXD5_TX_STATUS_FMT BIT(8) +#define MT_TXD5_PID GENMASK(7, 0) + +#define MT_TXD6_SGI BIT(31) +#define MT_TXD6_LDPC BIT(30) +#define MT_TXD6_TX_RATE GENMASK(29, 18) +#define MT_TXD6_I_TXBF BIT(17) +#define MT_TXD6_E_TXBF BIT(16) +#define MT_TXD6_DYN_BW BIT(15) +#define MT_TXD6_ANT_PRI GENMASK(14, 12) +#define MT_TXD6_SPE_EN BIT(11) +#define MT_TXD6_BW GENMASK(10, 8) +#define MT_TXD6_ANT_ID GENMASK(7, 2) +#define MT_TXD6_FIXED_RATE BIT(0) + #endif diff --git a/mt7603_init.c b/mt7603_init.c index 03d35c55..0244c3f4 100644 --- a/mt7603_init.c +++ b/mt7603_init.c @@ -12,6 +12,7 @@ */ #include "mt7603.h" +#include "mt7603_dma.h" struct mt7603_dev *mt7603_alloc_device(struct device *pdev) { @@ -38,6 +39,21 @@ wait_for_wpdma(struct mt7603_dev *dev) 0, 1000); } +static void +mt7603_set_tmac_template(struct mt7603_dev *dev) +{ + u32 desc[5] = { + [1] = MT76_SET(MT_TXD3_REM_TX_COUNT, 0xf), + [3] = MT_TXD5_SW_POWER_MGMT + }; + u32 addr; + int i; + + addr = mt7603_reg_map(dev, MT_TMAC_INFO_TEMPLATE); + for (i = 0; i < ARRAY_SIZE(desc); i++) + mt76_wr(dev, addr + 4 * i, desc[i]); +} + static int mt7603_mac_reset(struct mt7603_dev *dev) { @@ -61,6 +77,8 @@ mt7603_mac_reset(struct mt7603_dev *dev) mt76_wr(dev, MT_WF_RFCR1, 0); + mt7603_set_tmac_template(dev); + return 0; } diff --git a/mt7603_regs.h b/mt7603_regs.h index 6afa5df0..b30e455d 100644 --- a/mt7603_regs.h +++ b/mt7603_regs.h @@ -141,4 +141,6 @@ #define MT_TX_HW_QUEUE_BCN 7 #define MT_TX_HW_QUEUE_BMC 8 +#define MT_TMAC_INFO_TEMPLATE 0x800c0040 + #endif