diff mbox series

mt76x0: pci: add mt76x0e_cleanup routine

Message ID 20180929172641.32440-1-lorenzo.bianconi@redhat.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show
Series mt76x0: pci: add mt76x0e_cleanup routine | expand

Commit Message

Lorenzo Bianconi Sept. 29, 2018, 5:26 p.m. UTC
Add mt76x0e_cleanup routine to tidy up the device
during netdevice removal

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 .../net/wireless/mediatek/mt76/mt76x0/pci.c   | 30 +++++++++++++++----
 .../net/wireless/mediatek/mt76/mt76x02_regs.h |  3 ++
 2 files changed, 27 insertions(+), 6 deletions(-)

Comments

Stanislaw Gruszka Oct. 1, 2018, 5:42 a.m. UTC | #1
Hi

On Sat, Sep 29, 2018 at 07:26:41PM +0200, Lorenzo Bianconi wrote:
> Add mt76x0e_cleanup routine to tidy up the device
> during netdevice removal
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
> +	mt76_wr(dev, MT_H2M_MAILBOX_CID, ~0);
> +	mt76_wr(dev, MT_H2M_MAILBOX_STATUS, ~0);

I don't think this is needed. Those are legacy communication registers,
most likely not used in new chips and stay in vendor driver, because
it wasn't cleaned up.

Regards
Stanislaw
Lorenzo Bianconi Oct. 1, 2018, 8:22 a.m. UTC | #2
On Oct 01, Stanislaw Gruszka wrote:
> Hi
> 
> On Sat, Sep 29, 2018 at 07:26:41PM +0200, Lorenzo Bianconi wrote:
> > Add mt76x0e_cleanup routine to tidy up the device
> > during netdevice removal
> > 
> > Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
> > +	mt76_wr(dev, MT_H2M_MAILBOX_CID, ~0);
> > +	mt76_wr(dev, MT_H2M_MAILBOX_STATUS, ~0);
> 
> I don't think this is needed. Those are legacy communication registers,
> most likely not used in new chips and stay in vendor driver, because
> it wasn't cleaned up.

Ack, I will remove them in v2.
Regards,

Lorenzo

> 
> Regards
> Stanislaw
>
diff mbox series

Patch

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
index 876291dd3c1e..8cf9cabcbe2f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
@@ -41,13 +41,8 @@  static int mt76x0e_start(struct ieee80211_hw *hw)
 	return 0;
 }
 
-static void mt76x0e_stop(struct ieee80211_hw *hw)
+static void mt76x0e_stop_hw(struct mt76x0_dev *dev)
 {
-	struct mt76x0_dev *dev = hw->priv;
-
-	mutex_lock(&dev->mt76.mutex);
-
-	clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
 	cancel_delayed_work_sync(&dev->cal_work);
 	cancel_delayed_work_sync(&dev->mac_work);
 
@@ -62,7 +57,15 @@  static void mt76x0e_stop(struct ieee80211_hw *hw)
 		       0, 1000))
 		dev_warn(dev->mt76.dev, "TX DMA did not stop\n");
 	mt76_clear(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_RX_DMA_EN);
+}
+
+static void mt76x0e_stop(struct ieee80211_hw *hw)
+{
+	struct mt76x0_dev *dev = hw->priv;
 
+	mutex_lock(&dev->mt76.mutex);
+	clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
+	mt76x0e_stop_hw(dev);
 	mutex_unlock(&dev->mt76.mutex);
 }
 
@@ -160,12 +163,27 @@  mt76x0e_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	return ret;
 }
 
+static void mt76x0e_cleanup(struct mt76x0_dev *dev)
+{
+	clear_bit(MT76_STATE_INITIALIZED, &dev->mt76.state);
+	mt76x0_chip_onoff(dev, false, false);
+	mt76x0e_stop_hw(dev);
+
+	mt76_wr(dev, MT_H2M_MAILBOX_CID, ~0);
+	mt76_wr(dev, MT_H2M_MAILBOX_STATUS, ~0);
+
+	mt76_dma_cleanup(&dev->mt76);
+	mt76x02_mcu_cleanup(&dev->mt76);
+}
+
 static void
 mt76x0e_remove(struct pci_dev *pdev)
 {
 	struct mt76_dev *mdev = pci_get_drvdata(pdev);
+	struct mt76x0_dev *dev = container_of(mdev, struct mt76x0_dev, mt76);
 
 	mt76_unregister_device(mdev);
+	mt76x0e_cleanup(dev);
 	ieee80211_free_hw(mdev->hw);
 }
 
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_regs.h b/drivers/net/wireless/mediatek/mt76/mt76x02_regs.h
index 24d1e6d747dd..f8003ee03a89 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_regs.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_regs.h
@@ -622,6 +622,9 @@ 
 
 #define MT_SRAM_BASE			0x4000
 
+#define MT_H2M_MAILBOX_CID		0x7014
+#define MT_H2M_MAILBOX_STATUS		0x701c
+
 #define MT_WCID_KEY_BASE		0x8000
 #define MT_WCID_KEY(_n)			(MT_WCID_KEY_BASE + (_n) * 32)