aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-veyron/0004-fix-brcmfmac-oops-and-race-condition.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-veyron/0004-fix-brcmfmac-oops-and-race-condition.patch')
-rw-r--r--recipes-kernel/linux/linux-veyron/0004-fix-brcmfmac-oops-and-race-condition.patch114
1 files changed, 0 insertions, 114 deletions
diff --git a/recipes-kernel/linux/linux-veyron/0004-fix-brcmfmac-oops-and-race-condition.patch b/recipes-kernel/linux/linux-veyron/0004-fix-brcmfmac-oops-and-race-condition.patch
deleted file mode 100644
index 60f9f3b..0000000
--- a/recipes-kernel/linux/linux-veyron/0004-fix-brcmfmac-oops-and-race-condition.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From 6dc781566c97f06b5c0d491f34c9b23e72cb74be Mon Sep 17 00:00:00 2001
-From: Kevin Mihelich <kevin@archlinuxarm.org>
-Date: Thu, 2 Jul 2015 17:48:41 -0600
-Subject: [PATCH 4/4] fix brcmfmac oops and race condition
-
-This fixes a potential null pointer dereference by checking if null before
-freeing the vif struct.
-
-Also works around a race condition between brcm_patchram_plus loading the BT
-firmware, which exposes the wireless device, and the kernel loading bcrmfmac.
-100ms delay loops up to 1s are added around the first three initialization
-functions to hold off a failure until the device is actually ready. This is a
-hack.
-
-Signed-off-by: Kevin Mihelich <kevin@archlinuxarm.org>
----
- .../wireless-3.8/brcm80211/brcmfmac/dhd_common.c | 47 ++++++++++++++--------
- .../wireless-3.8/brcm80211/brcmfmac/dhd_linux.c | 4 +-
- 2 files changed, 32 insertions(+), 19 deletions(-)
-
-diff --git a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c
-index 05d4042..7006d19 100644
---- a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c
-+++ b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_common.c
-@@ -252,25 +252,34 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- struct brcmf_join_pref_params join_pref_params[2];
- char *ptr;
- s32 err;
-+ int i;
-
- /* retreive mac address */
-- err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
-- sizeof(ifp->mac_addr));
-- if (err < 0) {
-- brcmf_err("Retreiving cur_etheraddr failed, %d\n",
-- err);
-- goto done;
-+ for (i = 0; i < 9; i++) {
-+ err = brcmf_fil_iovar_data_get(ifp, "cur_etheraddr", ifp->mac_addr,
-+ sizeof(ifp->mac_addr));
-+ if (err < 0 && i == 9) {
-+ brcmf_err("Retreiving cur_etheraddr failed, %d\n",
-+ err);
-+ goto done;
-+ } else {
-+ msleep(100);
-+ }
- }
- memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac));
-
- /* query for 'ver' to get version info from firmware */
-- memset(buf, 0, sizeof(buf));
-- strcpy(buf, "ver");
-- err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
-- if (err < 0) {
-- brcmf_err("Retreiving version information failed, %d\n",
-- err);
-- goto done;
-+ for (i = 0; i < 10; i++) {
-+ memset(buf, 0, sizeof(buf));
-+ strcpy(buf, "ver");
-+ err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
-+ if (err < 0 && i == 9) {
-+ brcmf_err("Retreiving version information failed, %d\n",
-+ err);
-+ goto done;
-+ } else {
-+ msleep(100);
-+ }
- }
- ptr = (char *)buf;
- strsep(&ptr, "\n");
-@@ -283,10 +292,14 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
- strlcpy(ifp->drvr->fwver, ptr, sizeof(ifp->drvr->fwver));
-
- /* set mpc */
-- err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
-- if (err) {
-- brcmf_err("failed setting mpc\n");
-- goto done;
-+ for (i = 0; i < 10; i++) {
-+ err = brcmf_fil_iovar_int_set(ifp, "mpc", 1);
-+ if (err && i == 9) {
-+ brcmf_err("failed setting mpc\n");
-+ goto done;
-+ } else {
-+ msleep(100);
-+ }
- }
-
- /*
-diff --git a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c
-index 128161c..d3db8f7 100644
---- a/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c
-+++ b/drivers/net/wireless-3.8/brcm80211/brcmfmac/dhd_linux.c
-@@ -974,13 +974,13 @@ fail:
- brcmf_fws_deinit(drvr);
- }
- if (drvr->iflist[0]) {
-- if (ifp->ndev->destructor == NULL)
-+ if (ifp->ndev->destructor == NULL && ifp->vif)
- brcmf_free_vif(ifp->vif);
- free_netdev(ifp->ndev);
- drvr->iflist[0] = NULL;
- }
- if (p2p_ifp) {
-- if (p2p_ifp->ndev->destructor == NULL)
-+ if (p2p_ifp->ndev->destructor == NULL && p2p_ifp->vif)
- brcmf_free_vif(p2p_ifp->vif);
- free_netdev(p2p_ifp->ndev);
- drvr->iflist[1] = NULL;
---
-2.4.4
-