brcmfmac: correct detection of p2pdev interface event
authorArend van Spriel <arend@broadcom.com>
Wed, 26 Aug 2015 20:14:57 +0000 (22:14 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 29 Sep 2015 07:28:38 +0000 (10:28 +0300)
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>
drivers/net/wireless/brcm80211/brcmfmac/core.c
drivers/net/wireless/brcm80211/brcmfmac/core.h
drivers/net/wireless/brcm80211/brcmfmac/fweh.c

index 126081acda1e0cb9ec2ad8b5045422e89c26c8d9..b9ed0ed322043106204fb0148a71ffc691e45af9 100644 (file)
@@ -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))
index eb0c177be1db47667c2eab7cb5b663f6a691ea80..5fb9f4be7de0c1d1029863a6440fe738ed6883d2 100644 (file)
@@ -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,
index 4d4cc2cd76684a93ce8d556964c7f2b5aeaf75d3..1afaf97aebf7a39864a96f3577a49c80efbf198f 100644 (file)
@@ -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);