Skip to content

Commit d39b52e

Browse files
moore-brosnbd168
authored andcommitted
mt76: introduce mt76_sdio module
Introduce mt76_sdio module as common layer to add mt7663s support 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 90520af commit d39b52e

File tree

6 files changed

+408
-2
lines changed

6 files changed

+408
-2
lines changed

drivers/net/wireless/mediatek/mt76/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ config MT76_USB
1212
tristate
1313
depends on MT76_CORE
1414

15+
config MT76_SDIO
16+
tristate
17+
depends on MT76_CORE
18+
1519
config MT76x02_LIB
1620
tristate
1721
select MT76_CORE

drivers/net/wireless/mediatek/mt76/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# SPDX-License-Identifier: GPL-2.0-only
22
obj-$(CONFIG_MT76_CORE) += mt76.o
33
obj-$(CONFIG_MT76_USB) += mt76-usb.o
4+
obj-$(CONFIG_MT76_SDIO) += mt76-sdio.o
45
obj-$(CONFIG_MT76x02_LIB) += mt76x02-lib.o
56
obj-$(CONFIG_MT76x02_USB) += mt76x02-usb.o
67

@@ -12,6 +13,7 @@ mt76-$(CONFIG_PCI) += pci.o
1213
mt76-$(CONFIG_NL80211_TESTMODE) += testmode.o
1314

1415
mt76-usb-y := usb.o usb_trace.o
16+
mt76-sdio-y := sdio.o
1517

1618
CFLAGS_trace.o := -I$(src)
1719
CFLAGS_usb_trace.o := -I$(src)

drivers/net/wireless/mediatek/mt76/mac80211.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,11 @@ mt76_phy_init(struct mt76_dev *dev, struct ieee80211_hw *hw)
305305
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
306306
ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
307307
ieee80211_hw_set(hw, TX_AMSDU);
308-
ieee80211_hw_set(hw, TX_FRAG_LIST);
308+
309+
/* TODO: avoid linearization for SDIO */
310+
if (!mt76_is_sdio(dev))
311+
ieee80211_hw_set(hw, TX_FRAG_LIST);
312+
309313
ieee80211_hw_set(hw, MFP_CAPABLE);
310314
ieee80211_hw_set(hw, AP_LINK_PS);
311315
ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct mt76_reg_pair {
3434
enum mt76_bus_type {
3535
MT76_BUS_MMIO,
3636
MT76_BUS_USB,
37+
MT76_BUS_SDIO,
3738
};
3839

3940
struct mt76_bus_ops {
@@ -53,6 +54,7 @@ struct mt76_bus_ops {
5354

5455
#define mt76_is_usb(dev) ((dev)->bus->type == MT76_BUS_USB)
5556
#define mt76_is_mmio(dev) ((dev)->bus->type == MT76_BUS_MMIO)
57+
#define mt76_is_sdio(dev) ((dev)->bus->type == MT76_BUS_SDIO)
5658

5759
enum mt76_txq_id {
5860
MT_TXQ_VO = IEEE80211_AC_VO,
@@ -95,6 +97,7 @@ struct mt76_queue_entry {
9597
union {
9698
struct mt76_txwi_cache *txwi;
9799
struct urb *urb;
100+
int buf_sz;
98101
};
99102
enum mt76_txq_id qid;
100103
bool skip_buf0:1;
@@ -147,6 +150,8 @@ struct mt76_mcu_ops {
147150
int len, bool wait_resp);
148151
int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb,
149152
int cmd, bool wait_resp);
153+
u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset);
154+
void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val);
150155
int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base,
151156
const struct mt76_reg_pair *rp, int len);
152157
int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base,
@@ -440,6 +445,24 @@ struct mt76_usb {
440445
} mcu;
441446
};
442447

448+
struct mt76_sdio {
449+
struct task_struct *tx_kthread;
450+
struct task_struct *kthread;
451+
struct work_struct stat_work;
452+
453+
unsigned long state;
454+
455+
struct sdio_func *func;
456+
457+
struct {
458+
struct mutex lock;
459+
int pse_data_quota;
460+
int ple_data_quota;
461+
int pse_mcu_quota;
462+
int deficit;
463+
} sched;
464+
};
465+
443466
struct mt76_mmio {
444467
void __iomem *regs;
445468
spinlock_t irq_lock;
@@ -626,6 +649,7 @@ struct mt76_dev {
626649
union {
627650
struct mt76_mmio mmio;
628651
struct mt76_usb usb;
652+
struct mt76_sdio sdio;
629653
};
630654
};
631655

@@ -1030,6 +1054,12 @@ void mt76u_stop_rx(struct mt76_dev *dev);
10301054
int mt76u_resume_rx(struct mt76_dev *dev);
10311055
void mt76u_queues_deinit(struct mt76_dev *dev);
10321056

1057+
int mt76s_init(struct mt76_dev *dev, struct sdio_func *func,
1058+
const struct mt76_bus_ops *bus_ops);
1059+
int mt76s_alloc_queues(struct mt76_dev *dev);
1060+
void mt76s_stop_txrx(struct mt76_dev *dev);
1061+
void mt76s_deinit(struct mt76_dev *dev);
1062+
10331063
struct sk_buff *
10341064
mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data,
10351065
int data_len);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,10 @@ int mt7663_usb_sdio_register_device(struct mt7615_dev *dev)
359359
return err;
360360

361361
/* check hw sg support in order to enable AMSDU */
362-
hw->max_tx_fragments = dev->mt76.usb.sg_en ? MT_HW_TXP_MAX_BUF_NUM : 1;
362+
if (dev->mt76.usb.sg_en || mt76_is_sdio(&dev->mt76))
363+
hw->max_tx_fragments = MT_HW_TXP_MAX_BUF_NUM;
364+
else
365+
hw->max_tx_fragments = 1;
363366
hw->extra_tx_headroom += MT_USB_TXD_SIZE;
364367
if (mt76_is_usb(&dev->mt76))
365368
hw->extra_tx_headroom += MT_USB_HDR_SIZE;

0 commit comments

Comments
 (0)