]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mt76: mt7921: allow chip reset during device restart
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 18 Jun 2021 10:30:47 +0000 (12:30 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sat, 19 Jun 2021 07:22:52 +0000 (09:22 +0200)
Disable chip full reset just during device probing but allow
it during hw restart.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7921/init.c
drivers/net/wireless/mediatek/mt76/mt7921/mac.c
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h

index 9925c15ac9df8d2ded5d26871f4a11f3669b18e3..a9ce10b9882731315d5954c094de7fb9ac489f33 100644 (file)
@@ -236,7 +236,13 @@ int mt7921_register_device(struct mt7921_dev *dev)
        if (ret)
                return ret;
 
-       return mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable);
+       ret = mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable);
+       if (ret)
+               return ret;
+
+       dev->hw_init_done = true;
+
+       return 0;
 }
 
 void mt7921_unregister_device(struct mt7921_dev *dev)
index 143dae97ef772e25105a6f1c446d5b0c92c3cf4b..7fe2e3a50428fe2ef5665edcfc79dfa17d284573 100644 (file)
@@ -1390,11 +1390,13 @@ void mt7921_reset(struct mt76_dev *mdev)
 {
        struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
 
-       if (!test_bit(MT76_STATE_RUNNING, &dev->mphy.state))
+       if (!dev->hw_init_done)
                return;
 
-       if (!dev->hw_full_reset)
-               queue_work(dev->mt76.wq, &dev->reset_work);
+       if (dev->hw_full_reset)
+               return;
+
+       queue_work(dev->mt76.wq, &dev->reset_work);
 }
 
 static void
index 92cf38444b465986c210c336eda3bbcbd90c4b3a..2d8bd6bfc820acb27ae9bc9e7f8a43f1bcbcd798 100644 (file)
@@ -160,7 +160,8 @@ struct mt7921_dev {
        u16 chainmask;
 
        struct work_struct reset_work;
-       bool hw_full_reset;
+       bool hw_full_reset:1;
+       bool hw_init_done:1;
 
        struct list_head sta_poll_list;
        spinlock_t sta_poll_lock;