Commit d39b52e3 authored by Sean Wang's avatar Sean Wang Committed by Felix Fietkau
Browse files

mt76: introduce mt76_sdio module



Introduce mt76_sdio module as common layer to add mt7663s support

Co-developed-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 90520afb
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -12,6 +12,10 @@ config MT76_USB
	tristate
	depends on MT76_CORE

config MT76_SDIO
	tristate
	depends on MT76_CORE

config MT76x02_LIB
	tristate
	select MT76_CORE
+2 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_MT76_CORE) += mt76.o
obj-$(CONFIG_MT76_USB) += mt76-usb.o
obj-$(CONFIG_MT76_SDIO) += mt76-sdio.o
obj-$(CONFIG_MT76x02_LIB) += mt76x02-lib.o
obj-$(CONFIG_MT76x02_USB) += mt76x02-usb.o

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

mt76-usb-y := usb.o usb_trace.o
mt76-sdio-y := sdio.o

CFLAGS_trace.o := -I$(src)
CFLAGS_usb_trace.o := -I$(src)
+5 −1
Original line number Diff line number Diff line
@@ -305,7 +305,11 @@ mt76_phy_init(struct mt76_dev *dev, struct ieee80211_hw *hw)
	ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
	ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
	ieee80211_hw_set(hw, TX_AMSDU);

	/* TODO: avoid linearization for SDIO */
	if (!mt76_is_sdio(dev))
		ieee80211_hw_set(hw, TX_FRAG_LIST);

	ieee80211_hw_set(hw, MFP_CAPABLE);
	ieee80211_hw_set(hw, AP_LINK_PS);
	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
+30 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ struct mt76_reg_pair {
enum mt76_bus_type {
	MT76_BUS_MMIO,
	MT76_BUS_USB,
	MT76_BUS_SDIO,
};

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

#define mt76_is_usb(dev) ((dev)->bus->type == MT76_BUS_USB)
#define mt76_is_mmio(dev) ((dev)->bus->type == MT76_BUS_MMIO)
#define mt76_is_sdio(dev) ((dev)->bus->type == MT76_BUS_SDIO)

enum mt76_txq_id {
	MT_TXQ_VO = IEEE80211_AC_VO,
@@ -95,6 +97,7 @@ struct mt76_queue_entry {
	union {
		struct mt76_txwi_cache *txwi;
		struct urb *urb;
		int buf_sz;
	};
	enum mt76_txq_id qid;
	bool skip_buf0:1;
@@ -147,6 +150,8 @@ struct mt76_mcu_ops {
			    int len, bool wait_resp);
	int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb,
				int cmd, bool wait_resp);
	u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset);
	void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val);
	int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base,
			 const struct mt76_reg_pair *rp, int len);
	int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base,
@@ -440,6 +445,24 @@ struct mt76_usb {
	} mcu;
};

struct mt76_sdio {
	struct task_struct *tx_kthread;
	struct task_struct *kthread;
	struct work_struct stat_work;

	unsigned long state;

	struct sdio_func *func;

	struct {
		struct mutex lock;
		int pse_data_quota;
		int ple_data_quota;
		int pse_mcu_quota;
		int deficit;
	} sched;
};

struct mt76_mmio {
	void __iomem *regs;
	spinlock_t irq_lock;
@@ -626,6 +649,7 @@ struct mt76_dev {
	union {
		struct mt76_mmio mmio;
		struct mt76_usb usb;
		struct mt76_sdio sdio;
	};
};

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

int mt76s_init(struct mt76_dev *dev, struct sdio_func *func,
	       const struct mt76_bus_ops *bus_ops);
int mt76s_alloc_queues(struct mt76_dev *dev);
void mt76s_stop_txrx(struct mt76_dev *dev);
void mt76s_deinit(struct mt76_dev *dev);

struct sk_buff *
mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data,
		   int data_len);
+4 −1
Original line number Diff line number Diff line
@@ -359,7 +359,10 @@ int mt7663_usb_sdio_register_device(struct mt7615_dev *dev)
		return err;

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