2cd72294b6
So far support for multiple interface was somehow broken in brcmfmac. Driver couldn't correctly match firmware and system interfaces resulting in not working APs and WARNINGs. This pending patches fixes that :) Signed-off-by: Rafał Miłecki <zajec5@gmail.com> SVN-Revision: 46734
106 lines
3.9 KiB
Diff
106 lines
3.9 KiB
Diff
From: Arend van Spriel <arend@broadcom.com>
|
|
Date: Wed, 26 Aug 2015 22:14:57 +0200
|
|
Subject: [PATCH] brcmfmac: correct detection of p2pdev interface event
|
|
|
|
The p2pdev interface is setup in firmware resulting in a interface
|
|
event. This event has role and no-if flag. When role is p2p client
|
|
and no-if flag is set it indicates that this is the p2pdev interface.
|
|
This info is used in handling the event and adding interface in the
|
|
driver.
|
|
|
|
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
|
|
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
|
|
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
|
|
Signed-off-by: Arend van Spriel <arend@broadcom.com>
|
|
---
|
|
|
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
|
|
@@ -795,7 +795,7 @@ fail:
|
|
}
|
|
|
|
struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
|
|
- char *name, u8 *mac_addr)
|
|
+ bool is_p2pdev, char *name, u8 *mac_addr)
|
|
{
|
|
struct brcmf_if *ifp;
|
|
struct net_device *ndev;
|
|
@@ -821,7 +821,7 @@ struct brcmf_if *brcmf_add_if(struct brc
|
|
}
|
|
}
|
|
|
|
- if (!brcmf_p2p_enable && bssidx == 1) {
|
|
+ if (!brcmf_p2p_enable && is_p2pdev) {
|
|
/* this is P2P_DEVICE interface */
|
|
brcmf_dbg(INFO, "allocate non-netdev interface\n");
|
|
ifp = kzalloc(sizeof(*ifp), GFP_KERNEL);
|
|
@@ -999,12 +999,12 @@ int brcmf_bus_start(struct device *dev)
|
|
brcmf_dbg(TRACE, "\n");
|
|
|
|
/* add primary networking interface */
|
|
- ifp = brcmf_add_if(drvr, 0, 0, "wlan%d", NULL);
|
|
+ ifp = brcmf_add_if(drvr, 0, 0, false, "wlan%d", NULL);
|
|
if (IS_ERR(ifp))
|
|
return PTR_ERR(ifp);
|
|
|
|
if (brcmf_p2p_enable)
|
|
- p2p_ifp = brcmf_add_if(drvr, 1, 0, "p2p%d", NULL);
|
|
+ p2p_ifp = brcmf_add_if(drvr, 1, 0, false, "p2p%d", NULL);
|
|
else
|
|
p2p_ifp = NULL;
|
|
if (IS_ERR(p2p_ifp))
|
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
|
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
|
|
@@ -205,7 +205,7 @@ char *brcmf_ifname(struct brcmf_pub *drv
|
|
struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx);
|
|
int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked);
|
|
struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bssidx, s32 ifidx,
|
|
- char *name, u8 *mac_addr);
|
|
+ bool is_p2pdev, char *name, u8 *mac_addr);
|
|
void brcmf_remove_interface(struct brcmf_if *ifp);
|
|
int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr);
|
|
void brcmf_txflowblock_if(struct brcmf_if *ifp,
|
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
|
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
|
|
@@ -179,6 +179,7 @@ static void brcmf_fweh_handle_if_event(s
|
|
{
|
|
struct brcmf_if_event *ifevent = data;
|
|
struct brcmf_if *ifp;
|
|
+ bool is_p2pdev;
|
|
int err = 0;
|
|
|
|
brcmf_dbg(EVENT, "action: %u idx: %u bsscfg: %u flags: %u role: %u\n",
|
|
@@ -186,18 +187,16 @@ static void brcmf_fweh_handle_if_event(s
|
|
ifevent->flags, ifevent->role);
|
|
|
|
/* The P2P Device interface event must not be ignored
|
|
- * contrary to what firmware tells us. The only way to
|
|
- * distinguish the P2P Device is by looking at the ifidx
|
|
- * and bssidx received.
|
|
+ * contrary to what firmware tells us.
|
|
*/
|
|
- if (!(ifevent->ifidx == 0 && ifevent->bssidx == 1) &&
|
|
- (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
|
|
+ is_p2pdev = (ifevent->flags & BRCMF_E_IF_FLAG_NOIF) &&
|
|
+ ifevent->role == BRCMF_E_IF_ROLE_P2P_CLIENT;
|
|
+ if (!is_p2pdev && (ifevent->flags & BRCMF_E_IF_FLAG_NOIF)) {
|
|
brcmf_dbg(EVENT, "event can be ignored\n");
|
|
return;
|
|
}
|
|
if (ifevent->ifidx >= BRCMF_MAX_IFS) {
|
|
- brcmf_err("invalid interface index: %u\n",
|
|
- ifevent->ifidx);
|
|
+ brcmf_err("invalid interface index: %u\n", ifevent->ifidx);
|
|
return;
|
|
}
|
|
|
|
@@ -207,7 +206,7 @@ static void brcmf_fweh_handle_if_event(s
|
|
brcmf_dbg(EVENT, "adding %s (%pM)\n", emsg->ifname,
|
|
emsg->addr);
|
|
ifp = brcmf_add_if(drvr, ifevent->bssidx, ifevent->ifidx,
|
|
- emsg->ifname, emsg->addr);
|
|
+ is_p2pdev, emsg->ifname, emsg->addr);
|
|
if (IS_ERR(ifp))
|
|
return;
|
|
brcmf_fws_add_interface(ifp);
|