aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/brcm/360-v5.2-0003-brcmfmac-reset-PCIe-bus-on-a-firmware-crash.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/brcm/360-v5.2-0003-brcmfmac-reset-PCIe-bus-on-a-firmware-crash.patch')
-rw-r--r--package/kernel/mac80211/patches/brcm/360-v5.2-0003-brcmfmac-reset-PCIe-bus-on-a-firmware-crash.patch153
1 files changed, 0 insertions, 153 deletions
diff --git a/package/kernel/mac80211/patches/brcm/360-v5.2-0003-brcmfmac-reset-PCIe-bus-on-a-firmware-crash.patch b/package/kernel/mac80211/patches/brcm/360-v5.2-0003-brcmfmac-reset-PCIe-bus-on-a-firmware-crash.patch
deleted file mode 100644
index 5617d141b3..0000000000
--- a/package/kernel/mac80211/patches/brcm/360-v5.2-0003-brcmfmac-reset-PCIe-bus-on-a-firmware-crash.patch
+++ /dev/null
@@ -1,153 +0,0 @@
-From 4684997d9eea29380000e062755aa6d368d789a3 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
-Date: Tue, 26 Feb 2019 14:11:19 +0100
-Subject: [PATCH] brcmfmac: reset PCIe bus on a firmware crash
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This includes bus reset & reloading a firmware. It should be sufficient
-for a user space to (setup and) use a wireless device again.
-
-Support for reset on USB & SDIO can be added later.
-
-Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
-Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
-Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
----
- .../broadcom/brcm80211/brcmfmac/bus.h | 10 ++++++
- .../broadcom/brcm80211/brcmfmac/core.c | 12 +++++++
- .../broadcom/brcm80211/brcmfmac/core.h | 2 ++
- .../broadcom/brcm80211/brcmfmac/pcie.c | 35 +++++++++++++++++++
- 4 files changed, 59 insertions(+)
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
-@@ -91,6 +91,7 @@ struct brcmf_bus_ops {
- int (*get_fwname)(struct device *dev, const char *ext,
- unsigned char *fw_name);
- void (*debugfs_create)(struct device *dev);
-+ int (*reset)(struct device *dev);
- };
-
-
-@@ -245,6 +246,15 @@ void brcmf_bus_debugfs_create(struct brc
- return bus->ops->debugfs_create(bus->dev);
- }
-
-+static inline
-+int brcmf_bus_reset(struct brcmf_bus *bus)
-+{
-+ if (!bus->ops->reset)
-+ return -EOPNOTSUPP;
-+
-+ return bus->ops->reset(bus->dev);
-+}
-+
- /*
- * interface functions from common layer
- */
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
-@@ -1105,6 +1105,14 @@ static int brcmf_revinfo_read(struct seq
- return 0;
- }
-
-+static void brcmf_core_bus_reset(struct work_struct *work)
-+{
-+ struct brcmf_pub *drvr = container_of(work, struct brcmf_pub,
-+ bus_reset);
-+
-+ brcmf_bus_reset(drvr->bus_if);
-+}
-+
- static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
- {
- int ret = -1;
-@@ -1176,6 +1184,8 @@ static int brcmf_bus_started(struct brcm
- #endif
- #endif /* CONFIG_INET */
-
-+ INIT_WORK(&drvr->bus_reset, brcmf_core_bus_reset);
-+
- /* populate debugfs */
- brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
- brcmf_feat_debugfs_create(drvr);
-@@ -1302,6 +1312,8 @@ void brcmf_fw_crashed(struct device *dev
- bphy_err(drvr, "Firmware has halted or crashed\n");
-
- brcmf_dev_coredump(dev);
-+
-+ schedule_work(&drvr->bus_reset);
- }
-
- void brcmf_detach(struct device *dev)
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
-@@ -143,6 +143,8 @@ struct brcmf_pub {
- struct notifier_block inet6addr_notifier;
- struct brcmf_mp_device *settings;
-
-+ struct work_struct bus_reset;
-+
- u8 clmver[BRCMF_DCMD_SMLEN];
- };
-
---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
-@@ -345,6 +345,10 @@ static const u32 brcmf_ring_itemsize[BRC
- BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE
- };
-
-+static void brcmf_pcie_setup(struct device *dev, int ret,
-+ struct brcmf_fw_request *fwreq);
-+static struct brcmf_fw_request *
-+brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
-
- static u32
- brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
-@@ -1409,6 +1413,36 @@ int brcmf_pcie_get_fwname(struct device
- return 0;
- }
-
-+static int brcmf_pcie_reset(struct device *dev)
-+{
-+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
-+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
-+ struct brcmf_pciedev_info *devinfo = buspub->devinfo;
-+ struct brcmf_fw_request *fwreq;
-+ int err;
-+
-+ brcmf_detach(dev);
-+
-+ brcmf_pcie_release_irq(devinfo);
-+ brcmf_pcie_release_scratchbuffers(devinfo);
-+ brcmf_pcie_release_ringbuffers(devinfo);
-+ brcmf_pcie_reset_device(devinfo);
-+
-+ fwreq = brcmf_pcie_prepare_fw_request(devinfo);
-+ if (!fwreq) {
-+ dev_err(dev, "Failed to prepare FW request\n");
-+ return -ENOMEM;
-+ }
-+
-+ err = brcmf_fw_get_firmwares(dev, fwreq, brcmf_pcie_setup);
-+ if (err) {
-+ dev_err(dev, "Failed to prepare FW request\n");
-+ kfree(fwreq);
-+ }
-+
-+ return err;
-+}
-+
- static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
- .txdata = brcmf_pcie_tx,
- .stop = brcmf_pcie_down,
-@@ -1418,6 +1452,7 @@ static const struct brcmf_bus_ops brcmf_
- .get_ramsize = brcmf_pcie_get_ramsize,
- .get_memdump = brcmf_pcie_get_memdump,
- .get_fwname = brcmf_pcie_get_fwname,
-+ .reset = brcmf_pcie_reset,
- };
-
-