introduce mt7921u driver
Subsystems (2)
Lorenzo Bianconi
maintainercover introduce mt7921u driver
Introduce support for MT7921U 802.11ax 2x2:2SS wireless devices.
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 | 25 +- .../net/wireless/mediatek/mt76/mt7921/regs.h | 36 +- .../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 | 397 ++++++++++++++++++ drivers/net/wireless/mediatek/mt76/usb.c | 125 ++---- 18 files changed, 689 insertions(+), 195 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb.c
Signature · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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
@@ -268,6 +268,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)
@@ -312,6 +315,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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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
@@ -1630,3 +1630,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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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
@@ -1688,3 +1688,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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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
@@ -1709,3 +1709,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 · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
Lorenzo Bianconi
maintainerPATCH 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 | 1 + .../net/wireless/mediatek/mt76/mt7921/regs.h | 36 +- .../net/wireless/mediatek/mt76/mt7921/usb.c | 397 ++++++++++++++++++ 8 files changed, 450 insertions(+), 3 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb.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
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 +1 -0
@@ -365,6 +365,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);
drivers/net/wireless/mediatek/mt76/mt7921/regs.h +35 -1
@@ -354,6 +354,7 @@#define MT_WFDMA0_GLO_CFG_RX_DMA_EN BIT(2)#define MT_WFDMA0_GLO_CFG_RX_DMA_BUSY BIT(3)#define MT_WFDMA0_GLO_CFG_TX_WB_DDONE BIT(6) +#define MT_WFDMA0_GLO_CFG_FW_DWLD_BYPASS_DMASHDL BIT(9)#define MT_WFDMA0_GLO_CFG_FIFO_LITTLE_ENDIAN BIT(12)#define MT_WFDMA0_GLO_CFG_CSR_DISP_BASE_PTR_CHAIN_EN BIT(15)#define MT_WFDMA0_GLO_CFG_OMIT_RX_INFO_PFET2 BIT(21)
@@ -378,6 +379,9 @@#define MT_WFDMA0_TX_RING16_EXT_CTRL MT_WFDMA0(0x640)#define MT_WFDMA0_TX_RING17_EXT_CTRL MT_WFDMA0(0x644) +#define MT_WPDMA0_MAX_CNT_MASK GENMASK(7, 0) +#define MT_WPDMA0_BASE_PTR_MASK GENMASK(31, 16) +#define MT_WFDMA0_RX_RING0_EXT_CTRL MT_WFDMA0(0x680)#define MT_WFDMA0_RX_RING1_EXT_CTRL MT_WFDMA0(0x684)#define MT_WFDMA0_RX_RING2_EXT_CTRL MT_WFDMA0(0x688)
@@ -434,12 +438,14 @@#define MT_PCIE_MAC (ofs) (MT_PCIE_MAC_BASE + (ofs))#define MT_PCIE_MAC_INT_ENABLE MT_PCIE_MAC(0x188) -#define MT_DMA_SHDL (ofs) (0xd6000 + (ofs)) +#define MT_DMA_SHDL (ofs) (0x7c026000 + (ofs))#define MT_DMASHDL_SW_CONTROL MT_DMA_SHDL(0x004)#define MT_DMASHDL_DMASHDL_BYPASS BIT(28)#define MT_DMASHDL_OPTIONAL MT_DMA_SHDL(0x008)#define MT_DMASHDL_PAGE MT_DMA_SHDL(0x00c) +#define MT_DMASHDL_GROUP_SEQ_ORDER BIT(16)#define MT_DMASHDL_REFILL MT_DMA_SHDL(0x010) +#define MT_DMASHDL_REFILL_MASK GENMASK(31, 16)#define MT_DMASHDL_PKT_MAX_SIZE MT_DMA_SHDL(0x01c)#define MT_DMASHDL_PKT_MAX_SIZE_PLE GENMASK(11, 0)#define MT_DMASHDL_PKT_MAX_SIZE_PSE GENMASK(27, 16)
@@ -454,6 +460,33 @@#define MT_DMASHDL_SCHED_SET (_n) MT_DMA_SHDL(0x070 + ((_n) << 2)) +#define MT_UMAC (ofs) (0x74000000 + (ofs)) +#define MT_UDMA_TX_QSEL MT_UMAC(0x008) +#define MT_FW_DL_EN BIT(3) + +#define MT_UDMA_WLCFG_1 MT_UMAC(0x00c) +#define MT_WL_RX_AGG_PKT_LMT GENMASK(7, 0) +#define MT_WL_TX_TMOUT_LMT GENMASK(27, 8) + +#define MT_UDMA_WLCFG_0 MT_UMAC(0x18) +#define MT_WL_RX_AGG_TO GENMASK(7, 0) +#define MT_WL_RX_AGG_LMT GENMASK(15, 8) +#define MT_WL_TX_TMOUT_FUNC_EN BIT(16) +#define MT_WL_TX_DPH_CHK_EN BIT(17) +#define MT_WL_RX_MPSZ_PAD0 BIT(18) +#define MT_WL_RX_FLUSH BIT(19) +#define MT_TICK_1US_EN BIT(20) +#define MT_WL_RX_AGG_EN BIT(21) +#define MT_WL_RX_EN BIT(22) +#define MT_WL_TX_EN BIT(23) +#define MT_WL_RX_BUSY BIT(30) +#define MT_WL_TX_BUSY BIT(31) + +#define MT_UWFDMA0 (ofs) (0x7c024000 + (ofs)) +#define MT_UWFDMA0_GLO_CFG MT_UWFDMA0(0x208) +#define MT_UWFDMA0_GLO_CFG_EXT0 MT_UWFDMA0(0x2b0) +#define MT_UWFDMA0_TX_RING_EXT_CTRL (_n) MT_UWFDMA0(0x600 + ((_n) << 2)) +#define MT_CONN_STATUS 0x7c053c10#define MT_WIFI_PATCH_DL_STATE BIT(0)
@@ -467,6 +500,7 @@#define WFSYS_SW_INIT_DONE BIT(4)#define MT_CONN_ON_MISC 0x7c0600f0 +#define MT_TOP_MISC2_FW_PWR_ON BIT(0)#define MT_TOP_MISC2_FW_N9_RDY GENMASK(1, 0)#endif
drivers/net/wireless/mediatek/mt76/mt7921/usb.c new file +397 -0
397 lines not on this page · raw message
Signature · 7 lines
2.35.1 _______________________________________________ Linux-mediatek mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-mediatek
From: Sean Wang <[email protected]>
Quoted 2 lines
Introduce support for MT7921U 802.11ax 2x2:2SS wireless devices.
Tested the whole series with sta and monitor mode and it is working well.
Quoted 31 lines
Lorenzo Bianconi (9):
mt76: usb: addreq_typeto___mt76u_rrsignature
mt76: usb: addreq_typeto___mt76u_wrsignature
mt76: usb: introduce__mt76u_initutility routine
mt76: mt7921: disable runtime pm for usb
mt76: mt7921: updatemt7921_skb_add_usb_sdio_hdrto support usb
mt76: mt7921: movemt7921_usb_sdio_tx_prepare_skbin common mac code
mt76: mt7921: movemt7921_usb_sdio_tx_complete_skbin common mac code.
mt76: mt7921: movemt7921_usb_sdio_tx_status_datain mac common code.
mt76: mt7921: add mt7921u driverdrivers/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 | 25 +- .../net/wireless/mediatek/mt76/mt7921/regs.h | 36 +- .../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 | 397 ++++++++++++++++++ drivers/net/wireless/mediatek/mt76/usb.c | 125 ++---- 18 files changed, 689 insertions(+), 195 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb.c
Quoted 4 lines
--
2.35.1
_______________________________________________
Linux-mediatek mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-mediatek
Quoted 8 lines · Sean Wang
From: Sean Wang <[email protected]>
Quoted 2 lines
Introduce support for MT7921U 802.11ax 2x2:2SS wireless devices.
Tested the whole series with sta and monitor mode and it is working well.
Tested-by Sean Wang <[email protected]>
thx Sean for testing. I will post v2 with some fixes.
Regards,
Lorenzo
Quoted 38 lines
Quoted 36 lines
Lorenzo Bianconi (9):
mt76: usb: addreq_typeto___mt76u_rrsignature
mt76: usb: addreq_typeto___mt76u_wrsignature
mt76: usb: introduce__mt76u_initutility routine
mt76: mt7921: disable runtime pm for usb
mt76: mt7921: updatemt7921_skb_add_usb_sdio_hdrto support usb
mt76: mt7921: movemt7921_usb_sdio_tx_prepare_skbin common mac code
mt76: mt7921: movemt7921_usb_sdio_tx_complete_skbin common mac code.
mt76: mt7921: movemt7921_usb_sdio_tx_status_datain mac common code.
mt76: mt7921: add mt7921u driverdrivers/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 | 25 +- .../net/wireless/mediatek/mt76/mt7921/regs.h | 36 +- .../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 | 397 ++++++++++++++++++ drivers/net/wireless/mediatek/mt76/usb.c | 125 ++---- 18 files changed, 689 insertions(+), 195 deletions(-) create mode 100644 drivers/net/wireless/mediatek/mt76/mt7921/usb.c--
2.35.1