introduce support for mt7663s devices
Subsystems (2)
Lorenzo Bianconi
maintainercover introduce support for mt7663s devices
Introduce support for mt7663s 802.11ac 2x2:2 chipset to mt7615 driver. Introduce mt76_sdio module as common sdio layer.
Introduce mt7663-common module as container for shared code between usb and sdio mt7663 drivers
Lorenzo Bianconi (4):
mt76: mt7615: take into account sdio bus configuring txwi
mt76: mt76u: add mt76_skb_adjust_pad utility routine
mt76: mt7615: sdio code must access rate/key regs in preocess context
mt76: mt7615: introduce mt7663-common module
Sean Wang (2):
mt76: introduce mt76_sdio module
mt76: mt7615: introduce mt7663s support
drivers/net/wireless/mediatek/mt76/Kconfig | 4 + drivers/net/wireless/mediatek/mt76/Makefile | 2 + drivers/net/wireless/mediatek/mt76/mac80211.c | 6 +- drivers/net/wireless/mediatek/mt76/mt76.h | 34 +- .../net/wireless/mediatek/mt76/mt7615/Kconfig | 17 +- .../wireless/mediatek/mt76/mt7615/Makefile | 6 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 20 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 6 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 42 +- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 10 + .../net/wireless/mediatek/mt76/mt7615/mmio.c | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 20 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 12 + .../net/wireless/mediatek/mt76/mt7615/sdio.c | 204 ++++ .../wireless/mediatek/mt76/mt7615/sdio_mcu.c | 161 +++ .../net/wireless/mediatek/mt76/mt7615/usb.c | 253 +---- .../wireless/mediatek/mt76/mt7615/usb_init.c | 145 --- .../wireless/mediatek/mt76/mt7615/usb_mcu.c | 3 +- .../wireless/mediatek/mt76/mt7615/usb_sdio.c | 394 ++++++++ .../wireless/mediatek/mt76/mt76x02_usb_core.c | 3 +- drivers/net/wireless/mediatek/mt76/sdio.c | 948 ++++++++++++++++++ drivers/net/wireless/mediatek/mt76/sdio.h | 111 ++ drivers/net/wireless/mediatek/mt76/tx.c | 29 + drivers/net/wireless/mediatek/mt76/usb.c | 29 - 24 files changed, 2026 insertions(+), 434 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/sdio.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c delete mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/usb_init.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c create mode 100644 drivers/net/wireless/mediatek/mt76/sdio.c create mode 100644 drivers/net/wireless/mediatek/mt76/sdio.h
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 1/6 mt76: mt7615: take into account sdio bus configuring txwi
usb and sdio relies on SF architecture. This is a preliminary patch to add SDIO support to mt76 driver
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +9 -9
@@ -529,18 +529,18 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, struct ieee80211_sta *sta, int pid, struct ieee80211_key_conf *key, bool beacon) { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +u8 fc_type, fc_stype, p_fmt, q_idx, omac_idx =0 , wmm_idx =0 ;struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb);struct ieee80211_tx_rate *rate = &info->control.rates[0 ]; -struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +bool ext_phy = info->hw_queue &MT_TX_HW_QUEUE_EXT_PHY ;bool multicast =is_multicast_ether_addr (hdr->addr1);struct ieee80211_vif *vif = info->control.vif; +bool is_mmio =mt76_is_mmio (&dev->mt76); +u32 val, sz_txd = is_mmio ?MT_TXD_SIZE :MT_USB_TXD_SIZE ;struct mt76_phy *mphy = &dev->mphy; -bool ext_phy = info->hw_queue &MT_TX_HW_QUEUE_EXT_PHY ; -bool is_usb =mt76_is_usb (&dev->mt76); -int tx_count =8 ; -u8 fc_type, fc_stype, p_fmt, q_idx, omac_idx =0 , wmm_idx =0 ;__le16 fc = hdr->frame_control; -u32 val, sz_txd = is_usb ?MT_USB_TXD_SIZE :MT_TXD_SIZE ; +int tx_count =8 ;u16 seqno =0 ;if (vif) {
@@ -566,10 +566,10 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, p_fmt =MT_TX_TYPE_FW ; q_idx = ext_phy ?MT_LMAC_BCN1 :MT_LMAC_BCN0 ; }else if (skb_get_queue_mapping (skb) >=MT_TXQ_PSD ) { - p_fmt = is_usb ?MT_TX_TYPE_SF :MT_TX_TYPE_CT ; + p_fmt = is_mmio ?MT_TX_TYPE_CT :MT_TX_TYPE_SF ; q_idx = ext_phy ?MT_LMAC_ALTX1 :MT_LMAC_ALTX0 ; }else { - p_fmt = is_usb ?MT_TX_TYPE_SF :MT_TX_TYPE_CT ; + p_fmt = is_mmio ?MT_TX_TYPE_CT :MT_TX_TYPE_SF ; q_idx = wmm_idx *MT7615_MAX_WMM_SETS +mt7615_lmac_mapping (dev,skb_get_queue_mapping (skb)); }
@@ -675,7 +675,7 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, txwi[7 ] =FIELD_PREP (MT_TXD7_TYPE , fc_type) |FIELD_PREP (MT_TXD7_SUB_TYPE , fc_stype) |FIELD_PREP (MT_TXD7_SPE_IDX ,0x18 ); -if (is_usb) +if (!is_mmio) txwi[8 ] =FIELD_PREP (MT_TXD8_L_TYPE , fc_type) |FIELD_PREP (MT_TXD8_L_SUB_TYPE , fc_stype);
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 2/6 mt76: mt76u: add mt76_skb_adjust_pad utility routine
In reply to Lorenzo BianconiIntroduce mt76_skb_adjust_pad to reuse the code adding sdio support to mt7615 driver and remove code duplication. Move 4B header configuration for usb devices out of mt76_skb_adjust_pad
--- drivers/net/wireless/mediatek/mt76/mt76.h | 2 +- .../net/wireless/mediatek/mt76/mt7615/usb.c | 8 +++-- .../wireless/mediatek/mt76/mt7615/usb_mcu.c | 3 +- .../wireless/mediatek/mt76/mt76x02_usb_core.c | 3 +- drivers/net/wireless/mediatek/mt76/tx.c | 29 +++++++++++++++++++ drivers/net/wireless/mediatek/mt76/usb.c | 29 ------------------- 6 files changed, 39 insertions(+), 35 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -1
@@ -1024,7 +1024,7 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,return usb_bulk_msg (udev, pipe, data, len, actual_len, timeout); } -int mt76u_skb_dma_info (struct sk_buff *skb,u32 info); +int mt76_skb_adjust_pad (struct sk_buff *skb);int mt76u_vendor_request (struct mt76_dev *dev,u8 req,u8 req_type,u16 val,u16 offset,void *buf,size_t len);
drivers/net/wireless/mediatek/mt76/mt7615/usb.c +5 -3
@@ -252,7 +252,8 @@ mt7663u_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, { struct mt7615_sta *msta = container_of(wcid, struct mt7615_sta, wcid); struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); -struct ieee80211_tx_info *info =IEEE80211_SKB_CB (tx_info->skb); +struct sk_buff *skb = tx_info->skb; +struct ieee80211_tx_info *info =IEEE80211_SKB_CB (skb);if ((info->flags &IEEE80211_TX_CTL_RATE_CTRL_PROBE ) && !msta->rate_probe) {
@@ -262,9 +263,10 @@ mt7663u_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, msta->rates);spin_unlock_bh (&dev->mt76.lock); } -mt7663u_mac_write_txwi (dev, wcid, qid, sta, tx_info->skb); +mt7663u_mac_write_txwi (dev, wcid, qid, sta, skb); -return mt76u_skb_dma_info (tx_info->skb, tx_info->skb->len); +put_unaligned_le32 (skb->len,skb_push (skb,sizeof (skb->len))); +return mt76_skb_adjust_pad (skb); }static bool mt7663u_tx_status_data (struct mt76_dev *mdev,u8 *update)
drivers/net/wireless/mediatek/mt76/mt7615/usb_mcu.c +2 -1
@@ -28,7 +28,8 @@ mt7663u_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,else ep =MT_EP_OUT_AC_BE ; - ret =mt76u_skb_dma_info (skb, skb->len); +put_unaligned_le32 (skb->len,skb_push (skb,sizeof (skb->len))); + ret =mt76_skb_adjust_pad (skb);if (ret <0 ) goto out;
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +2 -1
@@ -56,8 +56,9 @@ int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags)*/ info =FIELD_PREP (MT_TXD_INFO_LEN ,round_up (skb->len,4 )) |FIELD_PREP (MT_TXD_INFO_DPORT , port) | flags; +put_unaligned_le32 (info,skb_push (skb,sizeof (info))); -return mt76u_skb_dma_info (skb, info); +return mt76_skb_adjust_pad (skb); } int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
drivers/net/wireless/mediatek/mt76/tx.c +29 -0
@@ -677,3 +677,32 @@ u8 mt76_ac_to_hwq(u8 ac)return wmm_queue_map[ac]; }EXPORT_SYMBOL_GPL (mt76_ac_to_hwq); + +int mt76_skb_adjust_pad (struct sk_buff *skb) +{ +struct sk_buff *iter, *last = skb; +u32 pad; + +/* Add zero pad of 4 - 7 bytes */ + pad =round_up (skb->len,4 ) +4 - skb->len; + +/* First packet of a A-MSDU burst keeps track of the whole burst +* length, need to update length of it and the last packet. +*/ + skb_walk_frags(skb, iter) { + last = iter; +if (!iter->next) { + skb->data_len += pad; + skb->len += pad; +break ; + } + } + +if (skb_pad (last, pad)) +return -ENOMEM ; + +__skb_put (last, pad); + +return 0 ; +} +EXPORT_SYMBOL_GPL (mt76_skb_adjust_pad);
drivers/net/wireless/mediatek/mt76/usb.c +0 -29
@@ -904,35 +904,6 @@ mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb,return urb->num_sgs; } -int mt76u_skb_dma_info (struct sk_buff *skb,u32 info) -{ -struct sk_buff *iter, *last = skb; -u32 pad; - -put_unaligned_le32 (info,skb_push (skb,sizeof (info))); -/* Add zero pad of 4 - 7 bytes */ - pad =round_up (skb->len,4 ) +4 - skb->len; - -/* First packet of a A-MSDU burst keeps track of the whole burst -* length, need to update length of it and the last packet. -*/ - skb_walk_frags(skb, iter) { - last = iter; -if (!iter->next) { - skb->data_len += pad; - skb->len += pad; -break ; - } - } - -if (skb_pad (last, pad)) -return -ENOMEM ; -__skb_put (last, pad); - -return 0 ; -} -EXPORT_SYMBOL_GPL (mt76u_skb_dma_info); - static int mt76u_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid, struct sk_buff *skb, struct mt76_wcid *wcid,
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 3/6 mt76: mt7615: sdio code must access rate/key regs in preocess context
In reply to Lorenzo BianconiAs usb, sdio relies on mt76 workqueue to configure tx rate or upload keys to the hw. This is a preliminary patch to add SDIO support to mt76 driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/main.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +1 -1
@@ -967,7 +967,7 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,struct mt7615_rate_desc rd;u32 w5, w27, addr; -if (mt76_is_usb (&dev->mt76)) { +if (!mt76_is_mmio (&dev->mt76)) {mt7615_mac_queue_rate_update (phy, sta, probe_rate, rates);return ; }
drivers/net/wireless/mediatek/mt76/mt7615/main.c +3 -3
@@ -417,10 +417,10 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,mt76_wcid_key_setup (&dev->mt76, wcid, cmd ==SET_KEY ? key :NULL ); -if (mt76_is_usb (&dev->mt76)) - err =mt7615_queue_key_update (dev, cmd, msta, key); -else +if (mt76_is_mmio (&dev->mt76)) err =mt7615_mac_wtbl_set_key (dev, wcid, key, cmd); +else + err =mt7615_queue_key_update (dev, cmd, msta, key);mt7615_mutex_release (dev);
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 4/6 mt76: mt7615: introduce mt7663-common module
In reply to Lorenzo BianconiIntroduce mt7663-common module as container for shared code between usb and sdio driver.
--- .../net/wireless/mediatek/mt76/mt7615/Kconfig | 6 +- .../wireless/mediatek/mt76/mt7615/Makefile | 4 +- .../wireless/mediatek/mt76/mt7615/mt7615.h | 13 +- .../net/wireless/mediatek/mt76/mt7615/usb.c | 255 +----------- .../wireless/mediatek/mt76/mt7615/usb_init.c | 145 ------- .../wireless/mediatek/mt76/mt7615/usb_sdio.c | 390 ++++++++++++++++++ 6 files changed, 424 insertions(+), 389 deletions(-) delete mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/usb_init.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c
drivers/net/wireless/mediatek/mt76/mt7615/Kconfig +5 -1
@@ -28,10 +28,14 @@ config MT7622_WMAC which has the same feature set as a MT7615, but limited to 2.4 GHz only. +config MT7663_COMMON + tristate + select MT7615_COMMON + config MT7663U tristate "MediaTek MT7663U (USB) support" select MT76_USB - select MT7615_COMMON + select MT7663_COMMON depends on MAC80211 depends on USB help
drivers/net/wireless/mediatek/mt76/mt7615/Makefile +3 -1
@@ -2,6 +2,7 @@ obj-$(CONFIG_MT7615_COMMON) += mt7615-common.o obj-$(CONFIG_MT7615E) += mt7615e.o +obj-$(CONFIG_MT7663_COMMON) += mt7663-common.o obj-$(CONFIG_MT7663U) += mt7663u.o CFLAGS_trace.o := -I$(src)
@@ -13,4 +14,5 @@ mt7615-common-$(CONFIG_NL80211_TESTMODE) += testmode.o mt7615e-y := pci.o pci_init.o dma.o pci_mac.o mmio.o mt7615e-$(CONFIG_MT7622_WMAC) += soc.o -mt7663u-y := usb.o usb_mcu.o usb_init.o +mt7663-common-y := usb_sdio.o +mt7663u-y := usb.o usb_mcu.o
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +11 -2
@@ -409,6 +409,7 @@ extern struct ieee80211_rate mt7615_rates[12];extern const struct ieee80211_ops mt7615_ops;extern const u32 mt7615e_reg_map[__MT_BASE_MAX];extern const u32 mt7663e_reg_map[__MT_BASE_MAX]; +extern const u32 mt7663_usb_sdio_reg_map[__MT_BASE_MAX];extern struct pci_driver mt7615_pci_driver;extern struct platform_driver mt7622_wmac_driver;extern const struct mt76_testmode_ops mt7615_testmode_ops;
@@ -657,8 +658,16 @@ int mt7615_mcu_update_arp_filter(struct ieee80211_hw *hw,int __mt7663_load_firmware (struct mt7615_dev *dev);/* usb */ -void mt7663u_wtbl_work (struct work_struct *work); +int mt7663_usb_sdio_tx_prepare_skb (struct mt76_dev *mdev,void *txwi_ptr, +enum mt76_txq_id qid,struct mt76_wcid *wcid, +struct ieee80211_sta *sta, +struct mt76_tx_info *tx_info); +bool mt7663_usb_sdio_tx_status_data (struct mt76_dev *mdev,u8 *update); +void mt7663_usb_sdio_tx_complete_skb (struct mt76_dev *mdev, +enum mt76_txq_id qid, +struct mt76_queue_entry *e); +void mt7663_usb_sdio_wtbl_work (struct work_struct *work); +int mt7663_usb_sdio_register_device (struct mt7615_dev *dev);int mt7663u_mcu_init (struct mt7615_dev *dev); -int mt7663u_register_device (struct mt7615_dev *dev);#endif
drivers/net/wireless/mediatek/mt76/mt7615/usb.c +15 -240
289 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/usb_init.c deleted +0 -145
145 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c new file +390 -0
390 lines not on this page · raw message
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 5/6 mt76: introduce mt76_sdio module
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Introduce mt76_sdio module as common layer to add mt7663s support
--- drivers/net/wireless/mediatek/mt76/Kconfig | 4 + drivers/net/wireless/mediatek/mt76/Makefile | 2 + drivers/net/wireless/mediatek/mt76/mac80211.c | 6 +- drivers/net/wireless/mediatek/mt76/mt76.h | 32 + .../wireless/mediatek/mt76/mt7615/usb_sdio.c | 5 +- drivers/net/wireless/mediatek/mt76/sdio.c | 948 ++++++++++++++++++ drivers/net/wireless/mediatek/mt76/sdio.h | 111 ++ 7 files changed, 1106 insertions(+), 2 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/sdio.c create mode 100644 drivers/net/wireless/mediatek/mt76/sdio.h
drivers/net/wireless/mediatek/mt76/Kconfig +4 -0
@@ -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
drivers/net/wireless/mediatek/mt76/Makefile +2 -0
@@ -1,6 +1,7 @@ # 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)
drivers/net/wireless/mediatek/mt76/mac80211.c +5 -1
@@ -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 ); -ieee80211_hw_set (hw,TX_FRAG_LIST ); + +/* 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 );
drivers/net/wireless/mediatek/mt76/mt76.h +32 -0
@@ -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; +size_t 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,
@@ -441,6 +446,26 @@ struct mt76_usb { } mcu; }; +#define MT76_SDIO_RX_QUOTA 32 +struct mt76_sdio { +struct tasklet_struct rx_tasklet; + +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;
@@ -628,6 +653,7 @@ struct mt76_dev {union {struct mt76_mmio mmio;struct mt76_usb usb; +struct mt76_sdio sdio; }; };
@@ -1039,6 +1065,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); +int mt76s_alloc_queues (struct mt76_dev *dev); +void mt76s_stop_txrx (struct mt76_dev *dev); +void mt76s_deinit (struct mt76_dev *dev); +u32 mt76s_read_pcr (struct mt76_dev *dev); +struct sk_buff *mt76_mcu_msg_alloc (struct mt76_dev *dev,const void *data,int data_len);
drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c +4 -1
@@ -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 ;
drivers/net/wireless/mediatek/mt76/sdio.c new file +948 -0
948 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/sdio.h new file +111 -0
111 lines not on this page · raw message
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 6/6 mt76: mt7615: introduce mt7663s support
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Introduce support for mt7663s 802.11ac 2x2:2 chipset to mt7615 driver.
--- .../net/wireless/mediatek/mt76/mt7615/Kconfig | 11 + .../wireless/mediatek/mt76/mt7615/Makefile | 2 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 42 +++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 10 + .../net/wireless/mediatek/mt76/mt7615/mmio.c | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 7 + .../net/wireless/mediatek/mt76/mt7615/regs.h | 12 ++ .../net/wireless/mediatek/mt76/mt7615/sdio.c | 204 ++++++++++++++++++ .../wireless/mediatek/mt76/mt7615/sdio_mcu.c | 161 ++++++++++++++ .../wireless/mediatek/mt76/mt7615/usb_sdio.c | 1 + 10 files changed, 450 insertions(+), 1 deletion(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/sdio.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/Kconfig +11 -0
@@ -42,3 +42,14 @@ config MT7663U This adds support for MT7663U 802.11ac 2x2:2 wireless devices. To compile this driver as a module, choose M here. + +config MT7663S + tristate "MediaTek MT7663S (SDIO) support" + select MT76_SDIO + select MT7663_COMMON + depends on MAC80211 + depends on MMC + help + This adds support for MT7663S 802.11ac 2x2:2 wireless devices. + + To compile this driver as a module, choose M here.
drivers/net/wireless/mediatek/mt76/mt7615/Makefile +2 -0
@@ -4,6 +4,7 @@ obj-$(CONFIG_MT7615_COMMON) += mt7615-common.o obj-$(CONFIG_MT7615E) += mt7615e.o obj-$(CONFIG_MT7663_COMMON) += mt7663-common.o obj-$(CONFIG_MT7663U) += mt7663u.o +obj-$(CONFIG_MT7663S) += mt7663s.o CFLAGS_trace.o := -I$(src)
@@ -16,3 +17,4 @@ mt7615e-$(CONFIG_MT7622_WMAC) += soc.o mt7663-common-y := usb_sdio.o mt7663u-y := usb.o usb_mcu.o +mt7663s-y := sdio.o sdio_mcu.o
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +41 -1
57 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +10 -0
@@ -81,6 +81,7 @@ enum {MCU_EVENT_GENERIC =0x01 ,MCU_EVENT_ACCESS_REG =0x02 ,MCU_EVENT_MT_PATCH_SEM =0x04 , +MCU_EVENT_REG_ACCESS =0x05 ,MCU_EVENT_SCAN_DONE =0x0d ,MCU_EVENT_ROC =0x10 , MCU_EVENT_BSS_ABSENCE = 0x11,
@@ -242,6 +243,8 @@ enum {#define MCU_CMD_MASK ~(MCU_FW_PREFIX | MCU_UNI_PREFIX | \ MCU_CE_PREFIX | MCU_QUERY_PREFIX) +#define MCU_QUERY_MASK BIT(16) +enum {MCU_CMD_TARGET_ADDRESS_LEN_REQ =MCU_FW_PREFIX |0x01 ,MCU_CMD_FW_START_REQ =MCU_FW_PREFIX |0x02 ,
@@ -429,6 +432,11 @@ struct nt7615_sched_scan_done {__le16 pad; } __packed; +struct mt7615_mcu_reg_event { +__le32 reg; +__le32 val; +} __packed; +struct mt7615_mcu_bss_event {u8 bss_idx;u8 is_absent;
@@ -581,6 +589,8 @@ enum {MCU_CMD_SET_P2P_OPPPS =MCU_CE_PREFIX |0x33 ,MCU_CMD_SCHED_SCAN_ENABLE =MCU_CE_PREFIX |0x61 ,MCU_CMD_SCHED_SCAN_REQ =MCU_CE_PREFIX |0x62 , +MCU_CMD_REG_WRITE =MCU_CE_PREFIX |0xc0 , + MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0, };#define MCU_CMD_ACK BIT(0)
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +1 -0
@@ -43,6 +43,7 @@ const u32 mt7663e_reg_map[] = { [MT_CSR_BASE] = 0x07000, [MT_PLE_BASE] = 0x08000, [MT_PSE_BASE] = 0x0c000, + [MT_PP_BASE] = 0x0e000, [MT_CFG_BASE] = 0x20000, [MT_AGG_BASE] = 0x22000, [MT_TMAC_BASE] = 0x24000,
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +7 -0
@@ -656,6 +656,8 @@ int mt7615_mcu_update_arp_filter(struct ieee80211_hw *hw,struct ieee80211_vif *vif, struct ieee80211_bss_conf *info);int __mt7663_load_firmware (struct mt7615_dev *dev); +u32 mt7615_mcu_reg_rr (struct mt76_dev *dev,u32 offset); +void mt7615_mcu_reg_wr (struct mt76_dev *dev,u32 offset,u32 val);/* usb */ int mt7663_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
@@ -670,4 +672,9 @@ void mt7663_usb_sdio_wtbl_work(struct work_struct *work);int mt7663_usb_sdio_register_device (struct mt7615_dev *dev);int mt7663u_mcu_init (struct mt7615_dev *dev); +/* sdio */ +int mt7663s_mcu_init (struct mt7615_dev *dev); +int mt7663s_driver_own (struct mt7615_dev *dev); +int mt7663s_firmware_own (struct mt7615_dev *dev); +#endif
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +12 -0
@@ -28,6 +28,7 @@ enum mt7615_reg_base {MT_PCIE_REMAP_BASE2 ,MT_TOP_MISC_BASE ,MT_EFUSE_ADDR_BASE , +MT_PP_BASE , __MT_BASE_MAX, };
@@ -152,6 +153,8 @@ enum mt7615_reg_base {#define MT_PLE (ofs) ((dev)->reg_map[MT_PLE_BASE] + (ofs)) +#define MT_PLE_PG_HIF0_GROUP MT_PLE(0x110) +#define MT_HIF0_MIN_QUOTA GENMASK(11, 0)#define MT_PLE_FL_Q0_CTRL MT_PLE(0x1b0)#define MT_PLE_FL_Q1_CTRL MT_PLE(0x1b4)#define MT_PLE_FL_Q2_CTRL MT_PLE(0x1b8)
@@ -161,6 +164,10 @@ enum mt7615_reg_base { ((n) << 2))#define MT_PSE (ofs) ((dev)->reg_map[MT_PSE_BASE] + (ofs)) +#define MT_PSE_PG_HIF0_GROUP MT_PSE(0x110) +#define MT_HIF0_MIN_QUOTA GENMASK(11, 0) +#define MT_PSE_PG_HIF1_GROUP MT_PSE(0x118) +#define MT_HIF1_MIN_QUOTA GENMASK(11, 0)#define MT_PSE_QUEUE_EMPTY MT_PSE(0x0b4)#define MT_HIF_0_EMPTY_MASK BIT(16)#define MT_HIF_1_EMPTY_MASK BIT(17)
@@ -168,6 +175,11 @@ enum mt7615_reg_base {#define MT_PSE_PG_INFO MT_PSE(0x194)#define MT_PSE_SRC_CNT GENMASK(27, 16) +#define MT_PP (ofs) ((dev)->reg_map[MT_PP_BASE] + (ofs)) +#define MT_PP_TXDWCNT MT_PP(0x0) +#define MT_PP_TXDWCNT_TX0_ADD_DW_CNT GENMASK(7, 0) +#define MT_PP_TXDWCNT_TX1_ADD_DW_CNT GENMASK(15, 8) +#define MT_WF_PHY_BASE 0x82070000#define MT_WF_PHY (ofs) (MT_WF_PHY_BASE + (ofs))
drivers/net/wireless/mediatek/mt76/mt7615/sdio.c new file +204 -0
204 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/sdio_mcu.c new file +161 -0
161 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/usb_sdio.c +1 -0
@@ -24,6 +24,7 @@ const u32 mt7663_usb_sdio_reg_map[] = { [MT_TOP_MISC_BASE] = 0x81020000, [MT_PLE_BASE] = 0x82060000, [MT_PSE_BASE] = 0x82068000, + [MT_PP_BASE] = 0x8206c000, [MT_WTBL_BASE_ADDR] = 0x820e0000, [MT_CFG_BASE] = 0x820f0000, [MT_AGG_BASE] = 0x820f2000,
Signature · 1 line
2.26.2