From: Sasha Levin Date: Wed, 4 Sep 2019 12:48:27 +0000 (-0400) Subject: fixes for 4.19 X-Git-Tag: v4.4.191~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=88b212678429f687021f4ef2ff9238f5d17da8c7;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.19 Signed-off-by: Sasha Levin --- diff --git a/queue-4.19/mt76-mt76x0u-do-not-reset-radio-on-resume.patch b/queue-4.19/mt76-mt76x0u-do-not-reset-radio-on-resume.patch new file mode 100644 index 00000000000..d3906afe6ed --- /dev/null +++ b/queue-4.19/mt76-mt76x0u-do-not-reset-radio-on-resume.patch @@ -0,0 +1,98 @@ +From 31c69a3e94bf1ad8128a1d8090ea6021746a1cfe Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka +Date: Wed, 4 Sep 2019 10:07:10 +0200 +Subject: mt76: mt76x0u: do not reset radio on resume + +commit 8f2d163cb26da87e7d8e1677368b8ba1ba4d30b3 upstream. + +On some machines mt76x0u firmware can hung during resume, +what result on messages like below: + +[ 475.480062] mt76x0 1-8:1.0: Error: MCU response pre-completed! +[ 475.990066] mt76x0 1-8:1.0: Error: send MCU cmd failed:-110 +[ 475.990075] mt76x0 1-8:1.0: Error: MCU response pre-completed! +[ 476.500003] mt76x0 1-8:1.0: Error: send MCU cmd failed:-110 +[ 476.500012] mt76x0 1-8:1.0: Error: MCU response pre-completed! +[ 477.010046] mt76x0 1-8:1.0: Error: send MCU cmd failed:-110 +[ 477.010055] mt76x0 1-8:1.0: Error: MCU response pre-completed! +[ 477.529997] mt76x0 1-8:1.0: Error: send MCU cmd failed:-110 +[ 477.530006] mt76x0 1-8:1.0: Error: MCU response pre-completed! +[ 477.824907] mt76x0 1-8:1.0: Error: send MCU cmd failed:-71 +[ 477.824916] mt76x0 1-8:1.0: Error: MCU response pre-completed! +[ 477.825029] usb 1-8: USB disconnect, device number 6 + +and possible whole system freeze. + +This can be avoided, if we do not perform mt76x0_chip_onoff() reset. + +Cc: stable@vger.kernel.org +Fixes: 134b2d0d1fcf ("mt76x0: init files") +Signed-off-by: Stanislaw Gruszka +Signed-off-by: Kalle Valo +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/mediatek/mt76/mt76x0/init.c | 4 ++-- + drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h | 2 +- + drivers/net/wireless/mediatek/mt76/mt76x0/usb.c | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/init.c b/drivers/net/wireless/mediatek/mt76/mt76x0/init.c +index 0a3e046d78db3..da2ba51dec352 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x0/init.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x0/init.c +@@ -369,7 +369,7 @@ static void mt76x0_stop_hardware(struct mt76x0_dev *dev) + mt76x0_chip_onoff(dev, false, false); + } + +-int mt76x0_init_hardware(struct mt76x0_dev *dev) ++int mt76x0_init_hardware(struct mt76x0_dev *dev, bool reset) + { + static const u16 beacon_offsets[16] = { + /* 512 byte per beacon */ +@@ -382,7 +382,7 @@ int mt76x0_init_hardware(struct mt76x0_dev *dev) + + dev->beacon_offsets = beacon_offsets; + +- mt76x0_chip_onoff(dev, true, true); ++ mt76x0_chip_onoff(dev, true, reset); + + ret = mt76x0_wait_asic_ready(dev); + if (ret) +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h b/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +index fc9857f61771c..f9dfe5097b099 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h ++++ b/drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +@@ -279,7 +279,7 @@ void mt76x0_addr_wr(struct mt76x0_dev *dev, const u32 offset, const u8 *addr); + + /* Init */ + struct mt76x0_dev *mt76x0_alloc_device(struct device *dev); +-int mt76x0_init_hardware(struct mt76x0_dev *dev); ++int mt76x0_init_hardware(struct mt76x0_dev *dev, bool reset); + int mt76x0_register_device(struct mt76x0_dev *dev); + void mt76x0_cleanup(struct mt76x0_dev *dev); + void mt76x0_chip_onoff(struct mt76x0_dev *dev, bool enable, bool reset); +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +index 54ae1f113be23..5aacb1f6a841d 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +@@ -300,7 +300,7 @@ static int mt76x0_probe(struct usb_interface *usb_intf, + if (!(mt76_rr(dev, MT_EFUSE_CTRL) & MT_EFUSE_CTRL_SEL)) + dev_warn(dev->mt76.dev, "Warning: eFUSE not present\n"); + +- ret = mt76x0_init_hardware(dev); ++ ret = mt76x0_init_hardware(dev, true); + if (ret) + goto err; + +@@ -354,7 +354,7 @@ static int mt76x0_resume(struct usb_interface *usb_intf) + struct mt76x0_dev *dev = usb_get_intfdata(usb_intf); + int ret; + +- ret = mt76x0_init_hardware(dev); ++ ret = mt76x0_init_hardware(dev, false); + if (ret) + return ret; + +-- +2.20.1 + diff --git a/queue-4.19/series b/queue-4.19/series index 62b51ae1a28..d82b3a32ce7 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -90,3 +90,4 @@ nfs-pass-error-information-to-the-pgio-error-cleanup.patch nfs-ensure-o_direct-reports-an-error-if-the-bytes-re.patch i2c-piix4-fix-port-selection-for-amd-family-16h-mode.patch x86-ptrace-fix-up-botched-merge-of-spectrev1-fix.patch +mt76-mt76x0u-do-not-reset-radio-on-resume.patch