introduce mt7921u driver
Subsystems (2)
Lorenzo Bianconi
maintainerv2 cover introduce mt7921u driver
Introduce support for MT7921U 802.11ax 2x2:2SS wireless devices.
Changes since v1:
- implement wfsys reset support
- fixed power on procedure
- fixed module unload
Lorenzo Bianconi (9):
mt76: usb: add req_type to ___mt76u_rr signature
mt76: usb: add req_type to ___mt76u_wr signature
mt76: usb: introduce __mt76u_init utility routine
mt76: mt7921: disable runtime pm for usb
mt76: mt7921: update mt7921_skb_add_usb_sdio_hdr to support usb
mt76: mt7921: move mt7921_usb_sdio_tx_prepare_skb in common mac code
mt76: mt7921: move mt7921_usb_sdio_tx_complete_skb in common mac code.
mt76: mt7921: move mt7921_usb_sdio_tx_status_data in mac common code.
mt76: mt7921: add mt7921u driver
drivers/net/wireless/mediatek/mt76/mt76.h | 12 +- .../net/wireless/mediatek/mt76/mt7615/usb.c | 68 +++- .../net/wireless/mediatek/mt76/mt76x0/usb.c | 2 +- .../net/wireless/mediatek/mt76/mt76x2/usb.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/Kconfig | 11 + .../wireless/mediatek/mt76/mt7921/Makefile | 2 + .../wireless/mediatek/mt76/mt7921/debugfs.c | 6 + .../net/wireless/mediatek/mt76/mt7921/init.c | 12 +- .../net/wireless/mediatek/mt76/mt7921/mac.c | 91 ++++++ .../net/wireless/mediatek/mt76/mt7921/mac.h | 1 + .../net/wireless/mediatek/mt76/mt7921/main.c | 3 +- .../wireless/mediatek/mt76/mt7921/mt7921.h | 34 +- .../net/wireless/mediatek/mt76/mt7921/regs.h | 50 ++- .../net/wireless/mediatek/mt76/mt7921/sdio.c | 6 +- .../wireless/mediatek/mt76/mt7921/sdio_mac.c | 83 ----- .../wireless/mediatek/mt76/mt7921/sdio_mcu.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/usb.c | 304 ++++++++++++++++++ .../wireless/mediatek/mt76/mt7921/usb_mac.c | 195 +++++++++++ drivers/net/wireless/mediatek/mt76/usb.c | 125 +++---- 19 files changed, 814 insertions(+), 195 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb_mac.c
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 1/9 mt76: usb: add req_type to ___mt76u_rr signature
This is a preliminary patch to add usb support to mt7921 driver.
--- drivers/net/wireless/mediatek/mt76/usb.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/usb.c +10 -8
@@ -62,16 +62,15 @@ int mt76u_vendor_request(struct mt76_dev *dev, u8 req, }EXPORT_SYMBOL_GPL (mt76u_vendor_request); -static u32 ___mt76u_rr (struct mt76_dev *dev,u8 req,u32 addr) +static u32 ___mt76u_rr (struct mt76_dev *dev,u8 req,u8 req_type, +u32 addr) {struct mt76_usb *usb = &dev->usb;u32 data = ~0 ;int ret; - ret =__mt76u_vendor_request (dev, req, -USB_DIR_IN |USB_TYPE_VENDOR , - addr >>16 , addr, usb->data, -sizeof (__le32)); + ret =__mt76u_vendor_request (dev, req, req_type, addr >>16 , + addr, usb->data,sizeof (__le32));if (ret ==sizeof (__le32)) data =get_unaligned_le32 (usb->data);trace_usb_reg_rr (dev, addr, data);
@@ -95,7 +94,8 @@ static u32 __mt76u_rr(struct mt76_dev *dev, u32 addr)break ; } -return ___mt76u_rr (dev, req, addr & ~MT_VEND_TYPE_MASK ); +return ___mt76u_rr (dev, req,USB_DIR_IN |USB_TYPE_VENDOR , + addr & ~MT_VEND_TYPE_MASK ); }static u32 mt76u_rr (struct mt76_dev *dev,u32 addr)
@@ -114,7 +114,8 @@ static u32 mt76u_rr_ext(struct mt76_dev *dev, u32 addr)u32 ret;mutex_lock (&dev->usb.usb_ctrl_mtx); - ret =___mt76u_rr (dev,MT_VEND_READ_EXT , addr); + ret =___mt76u_rr (dev,MT_VEND_READ_EXT , +USB_DIR_IN |USB_TYPE_VENDOR , addr);mutex_unlock (&dev->usb.usb_ctrl_mtx);return ret;
@@ -177,7 +178,8 @@ static u32 mt76u_rmw_ext(struct mt76_dev *dev, u32 addr, u32 mask, u32 val) {mutex_lock (&dev->usb.usb_ctrl_mtx); - val |=___mt76u_rr (dev,MT_VEND_READ_EXT , addr) & ~mask; + val |=___mt76u_rr (dev,MT_VEND_READ_EXT , +USB_DIR_IN |USB_TYPE_VENDOR , addr) & ~mask;___mt76u_wr (dev,MT_VEND_WRITE_EXT , addr, val);mutex_unlock (&dev->usb.usb_ctrl_mtx);
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 2/9 mt76: usb: add req_type to ___mt76u_wr signature
In reply to Lorenzo BianconiThis is a preliminary patch to add usb support to mt7921 driver.
--- drivers/net/wireless/mediatek/mt76/usb.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/usb.c +9 -8
@@ -121,16 +121,14 @@ static u32 mt76u_rr_ext(struct mt76_dev *dev, u32 addr)return ret; } -static void ___mt76u_wr (struct mt76_dev *dev,u8 req, +static void ___mt76u_wr (struct mt76_dev *dev,u8 req,u8 req_type,u32 addr,u32 val) {struct mt76_usb *usb = &dev->usb;put_unaligned_le32 (val, usb->data); -__mt76u_vendor_request (dev, req, -USB_DIR_OUT |USB_TYPE_VENDOR , - addr >>16 , addr, usb->data, -sizeof (__le32)); +__mt76u_vendor_request (dev, req, req_type, addr >>16 , + addr, usb->data,sizeof (__le32));trace_usb_reg_wr (dev, addr, val); }
@@ -146,7 +144,8 @@ static void __mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val) req =MT_VEND_MULTI_WRITE ;break ; } -___mt76u_wr (dev, req, addr & ~MT_VEND_TYPE_MASK , val); +___mt76u_wr (dev, req,USB_DIR_OUT |USB_TYPE_VENDOR , + addr & ~MT_VEND_TYPE_MASK , val); }static void mt76u_wr (struct mt76_dev *dev,u32 addr,u32 val)
@@ -159,7 +158,8 @@ static void mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val)static void mt76u_wr_ext (struct mt76_dev *dev,u32 addr,u32 val) {mutex_lock (&dev->usb.usb_ctrl_mtx); -___mt76u_wr (dev,MT_VEND_WRITE_EXT , addr, val); +___mt76u_wr (dev,MT_VEND_WRITE_EXT , +USB_DIR_OUT |USB_TYPE_VENDOR , addr, val);mutex_unlock (&dev->usb.usb_ctrl_mtx); }
@@ -180,7 +180,8 @@ static u32 mt76u_rmw_ext(struct mt76_dev *dev, u32 addr,mutex_lock (&dev->usb.usb_ctrl_mtx); val |=___mt76u_rr (dev,MT_VEND_READ_EXT ,USB_DIR_IN |USB_TYPE_VENDOR , addr) & ~mask; -___mt76u_wr (dev,MT_VEND_WRITE_EXT , addr, val); +___mt76u_wr (dev,MT_VEND_WRITE_EXT , +USB_DIR_OUT |USB_TYPE_VENDOR , addr, val);mutex_unlock (&dev->usb.usb_ctrl_mtx);return val;
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 3/9 mt76: usb: introduce __mt76u_init utility routine
In reply to Lorenzo BianconiIntroduce __mt76u_init unitility routine and move mt7615 usb bus ops into mt7615 module in order to allow specifying driver specific parameter.
This is a preliminary patch to add usb support to mt7921 driver.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 12 +- .../net/wireless/mediatek/mt76/mt7615/usb.c | 68 ++++++++++- .../net/wireless/mediatek/mt76/mt76x0/usb.c | 2 +- .../net/wireless/mediatek/mt76/mt76x2/usb.c | 2 +- drivers/net/wireless/mediatek/mt76/usb.c | 112 +++++------------- 5 files changed, 110 insertions(+), 86 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +10 -2
@@ -1274,13 +1274,21 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,void mt76_ethtool_worker (struct mt76_ethtool_worker_info *wi,struct mt76_sta_stats *stats);int mt76_skb_adjust_pad (struct sk_buff *skb,int pad); +int __mt76u_vendor_request (struct mt76_dev *dev,u8 req,u8 req_type, +u16 val,u16 offset,void *buf,size_t len);int mt76u_vendor_request (struct mt76_dev *dev,u8 req,u8 req_type,u16 val,u16 offset,void *buf,size_t len);void mt76u_single_wr (struct mt76_dev *dev,const u8 req,const u16 offset,const u32 val); -int mt76u_init (struct mt76_dev *dev,struct usb_interface *intf, -bool ext); +void mt76u_read_copy (struct mt76_dev *dev,u32 offset, +void *data,int len); +u32 ___mt76u_rr (struct mt76_dev *dev,u8 req,u8 req_type,u32 addr); +void ___mt76u_wr (struct mt76_dev *dev,u8 req,u8 req_type, +u32 addr,u32 val); +int __mt76u_init (struct mt76_dev *dev,struct usb_interface *intf, +struct mt76_bus_ops *ops); +int mt76u_init (struct mt76_dev *dev,struct usb_interface *intf);int mt76u_alloc_mcu_queue (struct mt76_dev *dev);int mt76u_alloc_queues (struct mt76_dev *dev);void mt76u_stop_tx (struct mt76_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7615/usb.c +67 -1
86 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +1 -1
@@ -245,7 +245,7 @@ static int mt76x0u_probe(struct usb_interface *usb_intf,usb_set_intfdata (usb_intf, dev);mt76x02u_init_mcu (mdev); - ret =mt76u_init (mdev, usb_intf, false); + ret =mt76u_init (mdev, usb_intf);if (ret) goto err;
drivers/net/wireless/mediatek/mt76/mt76x2/usb.c +1 -1
@@ -57,7 +57,7 @@ static int mt76x2u_probe(struct usb_interface *intf,usb_set_intfdata (intf, dev);mt76x02u_init_mcu (mdev); - err =mt76u_init (mdev, intf, false); + err =mt76u_init (mdev, intf);if (err <0 ) goto err;
drivers/net/wireless/mediatek/mt76/usb.c +31 -81
195 lines not on this page · raw message
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 4/9 mt76: mt7921: disable runtime pm for usb
In reply to Lorenzo BianconiRuntime-pm is not currently supported by usb driver
--- drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c | 6 ++++++ drivers/net/wireless/mediatek/mt76/mt7921/init.c | 10 ++++++---- 2 files changed, 12 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/debugfs.c +6 -0
@@ -267,6 +267,9 @@ mt7921_pm_set(void *data, u64 val)struct mt7921_dev *dev = data;struct mt76_connac_pm *pm = &dev->pm; +if (mt76_is_usb (&dev->mt76)) +return -EOPNOTSUPP ; +mutex_lock (&dev->mt76.mutex);if (val == pm->enable_user)
@@ -311,6 +314,9 @@ mt7921_deep_sleep_set(void *data, u64 val)bool monitor = !!(dev->mphy.hw->conf.flags &IEEE80211_CONF_MONITOR );bool enable = !!val; +if (mt76_is_usb (&dev->mt76)) +return -EOPNOTSUPP ; +mt7921_mutex_acquire (dev);if (pm->ds_enable_user == enable) goto out;
drivers/net/wireless/mediatek/mt76/mt7921/init.c +6 -4
@@ -226,10 +226,12 @@ int mt7921_register_device(struct mt7921_dev *dev) dev->pm.idle_timeout =MT7921_PM_TIMEOUT ; dev->pm.stats.last_wake_event = jiffies; dev->pm.stats.last_doze_event = jiffies; - dev->pm.enable_user = true; - dev->pm.enable = true; - dev->pm.ds_enable_user = true; - dev->pm.ds_enable = true; +if (!mt76_is_usb (&dev->mt76)) { + dev->pm.enable_user = true; + dev->pm.enable = true; + dev->pm.ds_enable_user = true; + dev->pm.ds_enable = true; + }if (mt76_is_sdio (&dev->mt76)) hw->extra_tx_headroom +=MT_SDIO_TXD_SIZE +MT_SDIO_HDR_SIZE ;
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 5/9 mt76: mt7921: update mt7921_skb_add_usb_sdio_hdr to support usb
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7921u driver support.
--- drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 10 ++++++---- drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7921/sdio_mcu.c | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +6 -4
@@ -352,12 +352,14 @@ static inline void mt7921_mcu_tx_cleanup(struct mt7921_dev *dev)mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WA ], false); } -static inline void mt7921_skb_add_sdio_hdr (struct sk_buff *skb, -enum mt7921_sdio_pkt_type type) +static inline void +mt7921_skb_add_usb_sdio_hdr (struct mt7921_dev *dev,struct sk_buff *skb, +int type) { -u32 hdr; +u32 hdr, len; - hdr =FIELD_PREP (MT7921_SDIO_HDR_TX_BYTES , skb->len +sizeof (hdr)) | + len =mt76_is_usb (&dev->mt76) ? skb->len : skb->len +sizeof (hdr); + hdr =FIELD_PREP (MT7921_SDIO_HDR_TX_BYTES , len) |FIELD_PREP (MT7921_SDIO_HDR_PKT_TYPE , type);put_unaligned_le32 (hdr,skb_push (skb,sizeof (hdr)));
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c +1 -1
@@ -183,7 +183,7 @@ int mt7921s_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, pktid =mt76_tx_status_skb_add (&dev->mt76, wcid, skb);mt7921s_write_txwi (dev, wcid, qid, sta, key, pktid, skb); -mt7921_skb_add_sdio_hdr (skb,MT7921_SDIO_DATA ); +mt7921_skb_add_usb_sdio_hdr (dev, skb,MT7921_SDIO_DATA ); pad =round_up (skb->len,4 ) - skb->len; err =mt76_skb_adjust_pad (skb, pad);
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mcu.c +1 -1
@@ -36,7 +36,7 @@ mt7921s_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,if (cmd ==MCU_CMD (FW_SCATTER )) type =MT7921_SDIO_FWDL ; -mt7921_skb_add_sdio_hdr (skb, type); +mt7921_skb_add_usb_sdio_hdr (dev, skb, type); pad =round_up (skb->len,4 ) - skb->len;__skb_put_zero (skb, pad);
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 6/9 mt76: mt7921: move mt7921_usb_sdio_tx_prepare_skb in common mac code
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7921u driver support.
--- .../net/wireless/mediatek/mt76/mt7921/mac.c | 58 +++++++++++++++++++ .../wireless/mediatek/mt76/mt7921/mt7921.h | 9 +-- .../net/wireless/mediatek/mt76/mt7921/sdio.c | 2 +- .../wireless/mediatek/mt76/mt7921/sdio_mac.c | 53 ----------------- 4 files changed, 64 insertions(+), 58 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +58 -0
@@ -1627,3 +1627,61 @@ void mt7921_coredump_work(struct work_struct *work)mt7921_reset (&dev->mt76); } + +/* usb_sdio */ +static void +mt7921_usb_sdio_write_txwi (struct mt7921_dev *dev,struct mt76_wcid *wcid, +enum mt76_txq_id qid,struct ieee80211_sta *sta, +struct ieee80211_key_conf *key,int pid, +struct sk_buff *skb) +{ +__le32 *txwi = (__le32 *)(skb->data -MT_SDIO_TXD_SIZE ); + +memset (txwi,0 ,MT_SDIO_TXD_SIZE ); +mt7921_mac_write_txwi (dev, txwi, skb, wcid, key, pid, false); +skb_push (skb,MT_SDIO_TXD_SIZE ); +} + +int mt7921_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) +{ + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); +struct ieee80211_tx_info *info =IEEE80211_SKB_CB (tx_info->skb); +struct ieee80211_key_conf *key = info->control.hw_key; +struct sk_buff *skb = tx_info->skb; +int err, pad, pktid, type; + +if (unlikely (tx_info->skb->len <=ETH_HLEN )) +return -EINVAL ; + +if (!wcid) + wcid = &dev->mt76.global_wcid; + +if (sta) { +struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; + +if (time_after (jiffies, msta->last_txs +HZ /4 )) { + info->flags |=IEEE80211_TX_CTL_REQ_TX_STATUS ; + msta->last_txs = jiffies; + } + } + + pktid =mt76_tx_status_skb_add (&dev->mt76, wcid, skb); +mt7921_usb_sdio_write_txwi (dev, wcid, qid, sta, key, pktid, skb); + + type =mt76_is_sdio (mdev) ?MT7921_SDIO_DATA :0 ; +mt7921_skb_add_usb_sdio_hdr (dev, skb, type); + pad =round_up (skb->len,4 ) - skb->len; +if (mt76_is_usb (mdev)) + pad +=4 ; + + err =mt76_skb_adjust_pad (skb, pad); +if (err) +/* Release pktid in case of error. */ +idr_remove (&wcid->pktid, pktid); + +return err; +} +EXPORT_SYMBOL_GPL (mt7921_usb_sdio_tx_prepare_skb);
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +5 -4
@@ -445,12 +445,13 @@ int mt7921e_mcu_fw_pmctrl(struct mt7921_dev *dev);int mt7921s_mcu_init (struct mt7921_dev *dev);int mt7921s_mcu_drv_pmctrl (struct mt7921_dev *dev);int mt7921s_mcu_fw_pmctrl (struct mt7921_dev *dev); -int mt7921s_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);void mt7921s_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e);bool mt7921s_tx_status_data (struct mt76_dev *mdev,u8 *update);void mt7921_mac_add_txs (struct mt7921_dev *dev,void *data);void mt7921_set_runtime_pm (struct mt7921_dev *dev); + +int mt7921_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);#endif
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c +1 -1
@@ -91,7 +91,7 @@ static int mt7921s_probe(struct sdio_func *func, .survey_flags = SURVEY_INFO_TIME_TX |SURVEY_INFO_TIME_RX | SURVEY_INFO_TIME_BSS_RX, - .tx_prepare_skb = mt7921s_tx_prepare_skb, + .tx_prepare_skb = mt7921_usb_sdio_tx_prepare_skb, .tx_complete_skb = mt7921s_tx_complete_skb, .tx_status_data = mt7921s_tx_status_data, .rx_skb = mt7921_queue_rx_skb,
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c +0 -53
59 lines not on this page · raw message
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 7/9 mt76: mt7921: move mt7921_usb_sdio_tx_complete_skb in common mac code.
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7921u driver support.
--- .../net/wireless/mediatek/mt76/mt7921/mac.c | 21 +++++++++++++++++++ .../wireless/mediatek/mt76/mt7921/mt7921.h | 3 ++- .../net/wireless/mediatek/mt76/mt7921/sdio.c | 2 +- .../wireless/mediatek/mt76/mt7921/sdio_mac.c | 19 ----------------- 4 files changed, 24 insertions(+), 21 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +21 -0
@@ -1685,3 +1685,24 @@ int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,return err; }EXPORT_SYMBOL_GPL (mt7921_usb_sdio_tx_prepare_skb); + +void mt7921_usb_sdio_tx_complete_skb (struct mt76_dev *mdev, +struct mt76_queue_entry *e) +{ +__le32 *txwi = (__le32 *)(e->skb->data +MT_SDIO_HDR_SIZE ); +unsigned int headroom =MT_SDIO_TXD_SIZE +MT_SDIO_HDR_SIZE ; +struct ieee80211_sta *sta; +struct mt76_wcid *wcid; +u16 idx; + + idx =FIELD_GET (MT_TXD1_WLAN_IDX ,le32_to_cpu (txwi[1 ])); + wcid =rcu_dereference (mdev->wcid[idx]); + sta =wcid_to_sta (wcid); + +if (sta &&likely (e->skb->protocol !=cpu_to_be16 (ETH_P_PAE ))) +mt7921_tx_check_aggr (sta, txwi); + +skb_pull (e->skb, headroom); +mt76_tx_complete_skb (mdev, e->wcid, e->skb); +} +EXPORT_SYMBOL_GPL (mt7921_usb_sdio_tx_complete_skb);
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +2 -1
@@ -445,7 +445,6 @@ int mt7921e_mcu_fw_pmctrl(struct mt7921_dev *dev);int mt7921s_mcu_init (struct mt7921_dev *dev);int mt7921s_mcu_drv_pmctrl (struct mt7921_dev *dev);int mt7921s_mcu_fw_pmctrl (struct mt7921_dev *dev); -void mt7921s_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e);bool mt7921s_tx_status_data (struct mt76_dev *mdev,u8 *update);void mt7921_mac_add_txs (struct mt7921_dev *dev,void *data);void mt7921_set_runtime_pm (struct mt7921_dev *dev);
@@ -454,4 +453,6 @@ int mt7921_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); +void mt7921_usb_sdio_tx_complete_skb (struct mt76_dev *mdev, +struct mt76_queue_entry *e);#endif
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c +1 -1
@@ -92,7 +92,7 @@ static int mt7921s_probe(struct sdio_func *func,SURVEY_INFO_TIME_RX | SURVEY_INFO_TIME_BSS_RX, .tx_prepare_skb = mt7921_usb_sdio_tx_prepare_skb, - .tx_complete_skb = mt7921s_tx_complete_skb, + .tx_complete_skb = mt7921_usb_sdio_tx_complete_skb, .tx_status_data = mt7921s_tx_status_data, .rx_skb = mt7921_queue_rx_skb, .sta_ps = mt7921_sta_ps,
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c +0 -19
@@ -141,25 +141,6 @@ int mt7921s_mac_reset(struct mt7921_dev *dev)return err; } -void mt7921s_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e) -{ -__le32 *txwi = (__le32 *)(e->skb->data +MT_SDIO_HDR_SIZE ); -unsigned int headroom =MT_SDIO_TXD_SIZE +MT_SDIO_HDR_SIZE ; -struct ieee80211_sta *sta; -struct mt76_wcid *wcid; -u16 idx; - - idx =FIELD_GET (MT_TXD1_WLAN_IDX ,le32_to_cpu (txwi[1 ])); - wcid =rcu_dereference (mdev->wcid[idx]); - sta =wcid_to_sta (wcid); - -if (sta &&likely (e->skb->protocol !=cpu_to_be16 (ETH_P_PAE ))) -mt7921_tx_check_aggr (sta, txwi); - -skb_pull (e->skb, headroom); -mt76_tx_complete_skb (mdev, e->wcid, e->skb); -} -bool mt7921s_tx_status_data (struct mt76_dev *mdev,u8 *update) { struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 8/9 mt76: mt7921: move mt7921_usb_sdio_tx_status_data in mac common code.
In reply to Lorenzo BianconiThis is a preliminary patch to add mt7921u driver support.
--- drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 12 ++++++++++++ drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h | 2 +- drivers/net/wireless/mediatek/mt76/mt7921/sdio.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c | 11 ----------- 4 files changed, 14 insertions(+), 13 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +12 -0
@@ -1706,3 +1706,15 @@ void mt7921_usb_sdio_tx_complete_skb(struct mt76_dev *mdev,mt76_tx_complete_skb (mdev, e->wcid, e->skb); }EXPORT_SYMBOL_GPL (mt7921_usb_sdio_tx_complete_skb); + +bool mt7921_usb_sdio_tx_status_data (struct mt76_dev *mdev,u8 *update) +{ + struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); + +mt7921_mutex_acquire (dev); +mt7921_mac_sta_poll (dev); +mt7921_mutex_release (dev); + +return false; +} +EXPORT_SYMBOL_GPL (mt7921_usb_sdio_tx_status_data);
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +1 -1
@@ -445,7 +445,6 @@ int mt7921e_mcu_fw_pmctrl(struct mt7921_dev *dev);int mt7921s_mcu_init (struct mt7921_dev *dev);int mt7921s_mcu_drv_pmctrl (struct mt7921_dev *dev);int mt7921s_mcu_fw_pmctrl (struct mt7921_dev *dev); -bool mt7921s_tx_status_data (struct mt76_dev *mdev,u8 *update);void mt7921_mac_add_txs (struct mt7921_dev *dev,void *data);void mt7921_set_runtime_pm (struct mt7921_dev *dev);
@@ -455,4 +454,5 @@ int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, struct mt76_tx_info *tx_info);void mt7921_usb_sdio_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e); +bool mt7921_usb_sdio_tx_status_data (struct mt76_dev *mdev,u8 *update);#endif
drivers/net/wireless/mediatek/mt76/mt7921/sdio.c +1 -1
@@ -93,7 +93,7 @@ static int mt7921s_probe(struct sdio_func *func, SURVEY_INFO_TIME_BSS_RX, .tx_prepare_skb = mt7921_usb_sdio_tx_prepare_skb, .tx_complete_skb = mt7921_usb_sdio_tx_complete_skb, - .tx_status_data = mt7921s_tx_status_data, + .tx_status_data = mt7921_usb_sdio_tx_status_data, .rx_skb = mt7921_queue_rx_skb, .sta_ps = mt7921_sta_ps, .sta_add = mt7921_mac_sta_add,
drivers/net/wireless/mediatek/mt76/mt7921/sdio_mac.c +0 -11
@@ -140,14 +140,3 @@ int mt7921s_mac_reset(struct mt7921_dev *dev)return err; } - -bool mt7921s_tx_status_data (struct mt76_dev *mdev,u8 *update) -{ - struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76); - -mt7921_mutex_acquire (dev); -mt7921_mac_sta_poll (dev); -mt7921_mutex_release (dev); - -return false; -}
Signature · 1 line
2.35.1
Lorenzo Bianconi
maintainerPATCH v2 9/9 mt76: mt7921: add mt7921u driver
In reply to Lorenzo BianconiIntroduce support for MT7921U 802.11ax 2x2:2SS wireless devices.
--- .../net/wireless/mediatek/mt76/mt7921/Kconfig | 11 + .../wireless/mediatek/mt76/mt7921/Makefile | 2 + .../net/wireless/mediatek/mt76/mt7921/init.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/mac.h | 1 + .../net/wireless/mediatek/mt76/mt7921/main.c | 3 +- .../wireless/mediatek/mt76/mt7921/mt7921.h | 10 + .../net/wireless/mediatek/mt76/mt7921/regs.h | 50 ++- .../net/wireless/mediatek/mt76/mt7921/usb.c | 304 ++++++++++++++++++ .../wireless/mediatek/mt76/mt7921/usb_mac.c | 195 +++++++++++ 9 files changed, 575 insertions(+), 3 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb.c create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb_mac.c
drivers/net/wireless/mediatek/mt76/mt7921/Kconfig +11 -0
@@ -24,3 +24,14 @@ config MT7921S This adds support for MT7921S 802.11ax 2x2:2SS wireless devices. To compile this driver as a module, choose M here. + +config MT7921U + tristate "MediaTek MT7921U (USB) support" + select MT76_USB + select MT7921_COMMON + depends on MAC80211 + depends on USB + help + This adds support for MT7921U 802.11ax 2x2:2SS wireless devices. + + To compile this driver as a module, choose M here.
drivers/net/wireless/mediatek/mt76/mt7921/Makefile +2 -0
@@ -3,6 +3,7 @@ obj-$(CONFIG_MT7921_COMMON) += mt7921-common.o obj-$(CONFIG_MT7921E) += mt7921e.o obj-$(CONFIG_MT7921S) += mt7921s.o +obj-$(CONFIG_MT7921U) += mt7921u.o CFLAGS_trace.o := -I$(src)
@@ -10,3 +11,4 @@ mt7921-common-y := mac.o mcu.o main.o init.o debugfs.o trace.o mt7921-common-$(CONFIG_NL80211_TESTMODE) += testmode.o mt7921e-y := pci.o pci_mac.o pci_mcu.o dma.o mt7921s-y := sdio.o sdio_mac.o sdio_mcu.o +mt7921u-y := usb.o usb_mac.o
drivers/net/wireless/mediatek/mt76/mt7921/init.c +1 -1
@@ -233,7 +233,7 @@ int mt7921_register_device(struct mt7921_dev *dev) dev->pm.ds_enable = true; } -if (mt76_is_sdio (&dev->mt76)) +if (!mt76_is_mmio (&dev->mt76)) hw->extra_tx_headroom +=MT_SDIO_TXD_SIZE +MT_SDIO_HDR_SIZE ; ret =mt7921_init_hardware (dev);
drivers/net/wireless/mediatek/mt76/mt7921/mac.h +1 -0
@@ -202,6 +202,7 @@ enum tx_mcu_port_q_idx {#define MT_SDIO_TXD_SIZE (MT_TXD_SIZE + 8 * 4)#define MT_SDIO_TAIL_SIZE 8#define MT_SDIO_HDR_SIZE 4 +#define MT_USB_TAIL_SIZE 4#define MT_TXD0_Q_IDX GENMASK(31, 25)#define MT_TXD0_PKT_FMT GENMASK(24, 23)
drivers/net/wireless/mediatek/mt76/mt7921/main.c +2 -1
@@ -264,7 +264,7 @@ static int mt7921_start(struct ieee80211_hw *hw)return err; } -static void mt7921_stop (struct ieee80211_hw *hw) +void mt7921_stop (struct ieee80211_hw *hw) {struct mt7921_dev *dev =mt7921_hw_dev (hw);struct mt7921_phy *phy =mt7921_hw_phy (hw);
@@ -281,6 +281,7 @@ static void mt7921_stop(struct ieee80211_hw *hw)mt76_connac_mcu_set_mac_enable (&dev->mt76,0 , false, false);mt7921_mutex_release (dev); } +EXPORT_SYMBOL_GPL (mt7921_stop);static int mt7921_add_interface (struct ieee80211_hw *hw,struct ieee80211_vif *vif)
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +10 -0
@@ -30,6 +30,7 @@#define MT7921_DRV_OWN_RETRY_COUNT 10#define MT7921_MCU_INIT_RETRY_COUNT 10 +#define MT7921_WFSYS_INIT_RETRY_COUNT 2#define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin"#define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin"
@@ -365,6 +366,7 @@ mt7921_skb_add_usb_sdio_hdr(struct mt7921_dev *dev, struct sk_buff *skb,put_unaligned_le32 (hdr,skb_push (skb,sizeof (hdr))); } +void mt7921_stop (struct ieee80211_hw *hw);int mt7921_mac_init (struct mt7921_dev *dev);bool mt7921_mac_wtbl_update (struct mt7921_dev *dev,int idx,u32 mask);void mt7921_mac_reset_counters (struct mt7921_phy *phy);
@@ -455,4 +457,12 @@ int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,void mt7921_usb_sdio_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e);bool mt7921_usb_sdio_tx_status_data (struct mt76_dev *mdev,u8 *update); + +/* usb */ +#define MT_USB_TYPE_VENDOR (USB_TYPE_VENDOR | 0x1f) +#define MT_USB_TYPE_UHW_VENDOR (USB_TYPE_VENDOR | 0x1e) + +int mt7921u_wfsys_reset (struct mt7921_dev *dev); +int mt7921u_dma_init (struct mt7921_dev *dev); +int mt7921u_init_reset (struct mt7921_dev *dev);#endif
drivers/net/wireless/mediatek/mt76/mt7921/regs.h +49 -1
91 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7921/usb.c new file +304 -0
304 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7921/usb_mac.c new file +195 -0
195 lines not on this page · raw message
Signature · 1 line
2.35.1