wifi: mt76: mt792x: add common USB transport reset helpers

Add per-device USB reset work and a control-path access check helper
for mt7921u and mt7925u.

This prepares common infrastructure for transport-level recovery while
keeping the reset state per-device for correct lifetime handling.

No functional change intended.

Signed-off-by: Sean Wang <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
Sean Wang
2026-06-02 13:22:04 +02:00
committed by Felix Fietkau
parent 994443de60
commit 600dbf1233
4 changed files with 59 additions and 0 deletions
+50
View File
@@ -11,6 +11,55 @@
#include "mt792x.h"
#include "mt76_connac2_mac.h"
static int mt792xu_read32(struct mt76_dev *dev, u32 addr, void *buf)
{
return __mt76u_vendor_request(dev, MT_VEND_READ_EXT,
USB_DIR_IN | MT_USB_TYPE_VENDOR,
(u16)(addr >> 16), (u16)addr,
buf, sizeof(__le32));
}
static void mt792xu_reset_work(struct work_struct *work)
{
struct mt792x_dev *dev =
container_of(work, struct mt792x_dev, usb_reset_work);
struct usb_interface *usb_intf = to_usb_interface(dev->mt76.dev);
if (usb_intf && usb_get_intfdata(usb_intf) == dev)
usb_queue_reset_device(usb_intf);
atomic_set(&dev->usb_reset_pending, 0);
}
void mt792xu_reset_work_init(struct mt792x_dev *dev)
{
INIT_WORK(&dev->usb_reset_work, mt792xu_reset_work);
atomic_set(&dev->usb_reset_pending, 0);
}
EXPORT_SYMBOL_GPL(mt792xu_reset_work_init);
void mt792xu_reset_work_cleanup(struct mt792x_dev *dev)
{
cancel_work_sync(&dev->usb_reset_work);
atomic_set(&dev->usb_reset_pending, 0);
}
EXPORT_SYMBOL_GPL(mt792xu_reset_work_cleanup);
int mt792xu_check_bus(struct mt792x_dev *dev)
{
int ret;
mutex_lock(&dev->mt76.usb.usb_ctrl_mtx);
ret = mt792xu_read32(&dev->mt76, MT_HW_CHIPID, dev->mt76.usb.data);
mutex_unlock(&dev->mt76.usb.usb_ctrl_mtx);
if (ret == sizeof(__le32))
return 0;
return ret < 0 ? ret : -EIO;
}
EXPORT_SYMBOL_GPL(mt792xu_check_bus);
u32 mt792xu_rr(struct mt76_dev *dev, u32 addr)
{
u32 ret;
@@ -333,6 +382,7 @@ void mt792xu_disconnect(struct usb_interface *usb_intf)
{
struct mt792x_dev *dev = usb_get_intfdata(usb_intf);
mt792xu_reset_work_cleanup(dev);
cancel_work_sync(&dev->init_work);
if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state))
return;