Skip to content

Commit a66cbdd

Browse files
moore-brosnbd168
authored andcommitted
mt76: mt7615: introduce mt7663s support
Introduce support for mt7663s 802.11ac 2x2:2 chipset to mt7615 driver. Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent d39b52e commit a66cbdd

File tree

12 files changed

+1114
-1
lines changed

12 files changed

+1114
-1
lines changed

drivers/net/wireless/mediatek/mt76/mt7615/Kconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,14 @@ config MT7663U
4242
This adds support for MT7663U 802.11ac 2x2:2 wireless devices.
4343

4444
To compile this driver as a module, choose M here.
45+
46+
config MT7663S
47+
tristate "MediaTek MT7663S (SDIO) support"
48+
select MT76_SDIO
49+
select MT7663_USB_SDIO_COMMON
50+
depends on MAC80211
51+
depends on MMC
52+
help
53+
This adds support for MT7663S 802.11ac 2x2:2 wireless devices.
54+
55+
To compile this driver as a module, choose M here.

drivers/net/wireless/mediatek/mt76/mt7615/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ obj-$(CONFIG_MT7615_COMMON) += mt7615-common.o
44
obj-$(CONFIG_MT7615E) += mt7615e.o
55
obj-$(CONFIG_MT7663_USB_SDIO_COMMON) += mt7663-usb-sdio-common.o
66
obj-$(CONFIG_MT7663U) += mt7663u.o
7+
obj-$(CONFIG_MT7663S) += mt7663s.o
78

89
CFLAGS_trace.o := -I$(src)
910

@@ -16,3 +17,4 @@ mt7615e-$(CONFIG_MT7622_WMAC) += soc.o
1617

1718
mt7663-usb-sdio-common-y := usb_sdio.o
1819
mt7663u-y := usb.o usb_mcu.o
20+
mt7663s-y := sdio.o sdio_mcu.o sdio_txrx.o

drivers/net/wireless/mediatek/mt76/mt7615/mcu.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,10 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
146146
mcu_txd->cid = mcu_cmd;
147147
break;
148148
case MCU_CE_PREFIX:
149-
mcu_txd->set_query = MCU_Q_SET;
149+
if (cmd & MCU_QUERY_MASK)
150+
mcu_txd->set_query = MCU_Q_QUERY;
151+
else
152+
mcu_txd->set_query = MCU_Q_SET;
150153
mcu_txd->cid = mcu_cmd;
151154
break;
152155
default:
@@ -214,6 +217,14 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,
214217
ret = le32_to_cpu(event->status);
215218
break;
216219
}
220+
case MCU_CMD_REG_READ: {
221+
struct mt7615_mcu_reg_event *event;
222+
223+
skb_pull(skb, sizeof(*rxd));
224+
event = (struct mt7615_mcu_reg_event *)skb->data;
225+
ret = (int)le32_to_cpu(event->val);
226+
break;
227+
}
217228
default:
218229
break;
219230
}
@@ -3885,3 +3896,32 @@ int mt7615_mcu_set_p2p_oppps(struct ieee80211_hw *hw,
38853896
return __mt76_mcu_send_msg(&dev->mt76, MCU_CMD_SET_P2P_OPPPS,
38863897
&req, sizeof(req), false);
38873898
}
3899+
3900+
u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset)
3901+
{
3902+
struct {
3903+
__le32 addr;
3904+
__le32 val;
3905+
} __packed req = {
3906+
.addr = cpu_to_le32(offset),
3907+
};
3908+
3909+
return __mt76_mcu_send_msg(dev, MCU_CMD_REG_READ,
3910+
&req, sizeof(req), true);
3911+
}
3912+
EXPORT_SYMBOL_GPL(mt7615_mcu_reg_rr);
3913+
3914+
void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val)
3915+
{
3916+
struct {
3917+
__le32 addr;
3918+
__le32 val;
3919+
} __packed req = {
3920+
.addr = cpu_to_le32(offset),
3921+
.val = cpu_to_le32(val),
3922+
};
3923+
3924+
__mt76_mcu_send_msg(dev, MCU_CMD_REG_WRITE,
3925+
&req, sizeof(req), false);
3926+
}
3927+
EXPORT_SYMBOL_GPL(mt7615_mcu_reg_wr);

drivers/net/wireless/mediatek/mt76/mt7615/mcu.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ enum {
8181
MCU_EVENT_GENERIC = 0x01,
8282
MCU_EVENT_ACCESS_REG = 0x02,
8383
MCU_EVENT_MT_PATCH_SEM = 0x04,
84+
MCU_EVENT_REG_ACCESS = 0x05,
8485
MCU_EVENT_SCAN_DONE = 0x0d,
8586
MCU_EVENT_ROC = 0x10,
8687
MCU_EVENT_BSS_ABSENCE = 0x11,
@@ -242,6 +243,8 @@ enum {
242243
#define MCU_CMD_MASK ~(MCU_FW_PREFIX | MCU_UNI_PREFIX | \
243244
MCU_CE_PREFIX | MCU_QUERY_PREFIX)
244245

246+
#define MCU_QUERY_MASK BIT(16)
247+
245248
enum {
246249
MCU_CMD_TARGET_ADDRESS_LEN_REQ = MCU_FW_PREFIX | 0x01,
247250
MCU_CMD_FW_START_REQ = MCU_FW_PREFIX | 0x02,
@@ -429,6 +432,11 @@ struct nt7615_sched_scan_done {
429432
__le16 pad;
430433
} __packed;
431434

435+
struct mt7615_mcu_reg_event {
436+
__le32 reg;
437+
__le32 val;
438+
} __packed;
439+
432440
struct mt7615_mcu_bss_event {
433441
u8 bss_idx;
434442
u8 is_absent;
@@ -581,6 +589,8 @@ enum {
581589
MCU_CMD_SET_P2P_OPPPS = MCU_CE_PREFIX | 0x33,
582590
MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61,
583591
MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
592+
MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0,
593+
MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0,
584594
};
585595

586596
#define MCU_CMD_ACK BIT(0)

drivers/net/wireless/mediatek/mt76/mt7615/mmio.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const u32 mt7663e_reg_map[] = {
4343
[MT_CSR_BASE] = 0x07000,
4444
[MT_PLE_BASE] = 0x08000,
4545
[MT_PSE_BASE] = 0x0c000,
46+
[MT_PP_BASE] = 0x0e000,
4647
[MT_CFG_BASE] = 0x20000,
4748
[MT_AGG_BASE] = 0x22000,
4849
[MT_TMAC_BASE] = 0x24000,

drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,8 @@ int mt7615_mcu_update_arp_filter(struct ieee80211_hw *hw,
656656
struct ieee80211_vif *vif,
657657
struct ieee80211_bss_conf *info);
658658
int __mt7663_load_firmware(struct mt7615_dev *dev);
659+
u32 mt7615_mcu_reg_rr(struct mt76_dev *dev, u32 offset);
660+
void mt7615_mcu_reg_wr(struct mt76_dev *dev, u32 offset, u32 val);
659661

660662
/* usb */
661663
int mt7663_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
@@ -670,4 +672,12 @@ void mt7663_usb_sdio_wtbl_work(struct work_struct *work);
670672
int mt7663_usb_sdio_register_device(struct mt7615_dev *dev);
671673
int mt7663u_mcu_init(struct mt7615_dev *dev);
672674

675+
/* sdio */
676+
u32 mt7663s_read_pcr(struct mt7615_dev *dev);
677+
int mt7663s_mcu_init(struct mt7615_dev *dev);
678+
int mt7663s_driver_own(struct mt7615_dev *dev);
679+
int mt7663s_firmware_own(struct mt7615_dev *dev);
680+
int mt7663s_kthread_run(void *data);
681+
void mt7663s_sdio_irq(struct sdio_func *func);
682+
673683
#endif

drivers/net/wireless/mediatek/mt76/mt7615/regs.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ enum mt7615_reg_base {
2828
MT_PCIE_REMAP_BASE2,
2929
MT_TOP_MISC_BASE,
3030
MT_EFUSE_ADDR_BASE,
31+
MT_PP_BASE,
3132
__MT_BASE_MAX,
3233
};
3334

@@ -152,6 +153,8 @@ enum mt7615_reg_base {
152153

153154
#define MT_PLE(ofs) ((dev)->reg_map[MT_PLE_BASE] + (ofs))
154155

156+
#define MT_PLE_PG_HIF0_GROUP MT_PLE(0x110)
157+
#define MT_HIF0_MIN_QUOTA GENMASK(11, 0)
155158
#define MT_PLE_FL_Q0_CTRL MT_PLE(0x1b0)
156159
#define MT_PLE_FL_Q1_CTRL MT_PLE(0x1b4)
157160
#define MT_PLE_FL_Q2_CTRL MT_PLE(0x1b8)
@@ -161,13 +164,22 @@ enum mt7615_reg_base {
161164
((n) << 2))
162165

163166
#define MT_PSE(ofs) ((dev)->reg_map[MT_PSE_BASE] + (ofs))
167+
#define MT_PSE_PG_HIF0_GROUP MT_PSE(0x110)
168+
#define MT_HIF0_MIN_QUOTA GENMASK(11, 0)
169+
#define MT_PSE_PG_HIF1_GROUP MT_PSE(0x118)
170+
#define MT_HIF1_MIN_QUOTA GENMASK(11, 0)
164171
#define MT_PSE_QUEUE_EMPTY MT_PSE(0x0b4)
165172
#define MT_HIF_0_EMPTY_MASK BIT(16)
166173
#define MT_HIF_1_EMPTY_MASK BIT(17)
167174
#define MT_HIF_ALL_EMPTY_MASK GENMASK(17, 16)
168175
#define MT_PSE_PG_INFO MT_PSE(0x194)
169176
#define MT_PSE_SRC_CNT GENMASK(27, 16)
170177

178+
#define MT_PP(ofs) ((dev)->reg_map[MT_PP_BASE] + (ofs))
179+
#define MT_PP_TXDWCNT MT_PP(0x0)
180+
#define MT_PP_TXDWCNT_TX0_ADD_DW_CNT GENMASK(7, 0)
181+
#define MT_PP_TXDWCNT_TX1_ADD_DW_CNT GENMASK(15, 8)
182+
171183
#define MT_WF_PHY_BASE 0x82070000
172184
#define MT_WF_PHY(ofs) (MT_WF_PHY_BASE + (ofs))
173185

0 commit comments

Comments
 (0)