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> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
1c626cf472
commit
ddddfed2f9
@ -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 brcmf_pub *drvr, s32 bssidx, s32 ifidx,
|
||||
}
|
||||
}
|
||||
|
||||
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))
|
||||
|
@ -205,7 +205,7 @@ char *brcmf_ifname(struct brcmf_pub *drvr, int idx);
|
||||
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,
|
||||
|
@ -179,6 +179,7 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr,
|
||||
{
|
||||
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(struct brcmf_pub *drvr,
|
||||
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(struct brcmf_pub *drvr,
|
||||
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user