From 8302f2e68dc86fcdbf2d7774692a9d8dd92ecbfe Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 16 Dec 2015 03:44:56 +0100 Subject: [PATCH] mt7603: restart MCU on driver unload Signed-off-by: Felix Fietkau --- mt7603.h | 1 + mt7603_mcu.c | 13 +++++++++++++ mt7603_pci.c | 1 + 3 files changed, 15 insertions(+) diff --git a/mt7603.h b/mt7603.h index 805adfb4..9dc090f4 100644 --- a/mt7603.h +++ b/mt7603.h @@ -119,6 +119,7 @@ int mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def); int mt7603_mcu_set_channel(struct mt7603_dev *dev); int mt7603_mcu_reg_read(struct mt7603_dev *dev, u32 reg, u32 *val, bool rf); int mt7603_mcu_set_eeprom(struct mt7603_dev *dev); +int mt7603_mcu_exit(struct mt7603_dev *dev); void mt7603_wtbl_init(struct mt7603_dev *dev, int idx, const u8 *addr); void mt7603_wtbl_clear(struct mt7603_dev *dev, int idx); diff --git a/mt7603_mcu.c b/mt7603_mcu.c index ee503332..cc14b34e 100644 --- a/mt7603_mcu.c +++ b/mt7603_mcu.c @@ -192,6 +192,14 @@ mt7603_mcu_start_firmware(struct mt7603_dev *dev, u32 addr) return mt7603_mcu_msg_send(dev, skb, -MCU_CMD_FW_START_REQ, MCU_Q_NA, NULL); } +static int +mt7603_mcu_restart(struct mt7603_dev *dev) +{ + struct sk_buff *skb = mt7603_mcu_msg_alloc(dev, NULL, 0); + + return mt7603_mcu_msg_send(dev, skb, -MCU_CMD_RESTART_DL_REQ, MCU_Q_NA, NULL); +} + static int mt7603_load_firmware(struct mt7603_dev *dev) { @@ -289,6 +297,11 @@ int mt7603_mcu_init(struct mt7603_dev *dev) return mt7603_load_firmware(dev); } +int mt7603_mcu_exit(struct mt7603_dev *dev) +{ + return mt7603_mcu_restart(dev); +} + int mt7603_mcu_set_eeprom(struct mt7603_dev *dev) { static const u16 req_fields[] = { diff --git a/mt7603_pci.c b/mt7603_pci.c index 7b2a47e9..fe0d819e 100644 --- a/mt7603_pci.c +++ b/mt7603_pci.c @@ -75,6 +75,7 @@ mt76pci_remove(struct pci_dev *pdev) struct mt7603_dev *dev = pci_get_drvdata(pdev); ieee80211_unregister_hw(mt76_hw(dev)); + mt7603_mcu_exit(dev); mt7603_dma_cleanup(dev); ieee80211_free_hw(mt76_hw(dev)); }