brcmfmac: ignore IF event if it is a add for ifidx 0
authorArend van Spriel <arend@broadcom.com>
Thu, 15 Nov 2012 02:46:15 +0000 (18:46 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 16 Nov 2012 19:28:56 +0000 (14:28 -0500)
Firmware fires IF event to add the primary interface but that
is already created in the driver.

Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
drivers/net/wireless/brcm80211/brcmfmac/fweh.c

index 51cbc72..a39ea20 100644 (file)
@@ -696,12 +696,17 @@ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, int ifidx, s32 bssidx,
         * in case we missed the BRCMF_E_IF_DEL event.
         */
        if (ifp) {
-               brcmf_dbg(ERROR, "ERROR: netdev:%s already exists, try free & unregister\n",
+               brcmf_dbg(ERROR, "ERROR: netdev:%s already exists\n",
                          ifp->ndev->name);
-               netif_stop_queue(ifp->ndev);
-               unregister_netdev(ifp->ndev);
-               free_netdev(ifp->ndev);
-               drvr->iflist[ifidx] = NULL;
+               if (ifidx) {
+                       netif_stop_queue(ifp->ndev);
+                       unregister_netdev(ifp->ndev);
+                       free_netdev(ifp->ndev);
+                       drvr->iflist[ifidx] = NULL;
+               } else {
+                       brcmf_dbg(ERROR, "ignore IF event\n");
+                       return ERR_PTR(-EINVAL);
+               }
        }
 
        /* Allocate netdev, including space for private structure */
index 283acee..7b57b89 100644 (file)
@@ -402,7 +402,8 @@ int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
                return -ENOSPC;
        }
        drvr->fweh.evt_handler[code] = handler;
-       brcmf_dbg(TRACE, "event handler registered for code %d\n", code);
+       brcmf_dbg(TRACE, "event handler registered for %s\n",
+                 brcmf_fweh_event_name(code));
        return 0;
 }
 
@@ -415,7 +416,8 @@ int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
 void brcmf_fweh_unregister(struct brcmf_pub *drvr,
                           enum brcmf_fweh_event_code code)
 {
-       brcmf_dbg(TRACE, "event handler cleared for code %d\n", code);
+       brcmf_dbg(TRACE, "event handler cleared for %s\n",
+                 brcmf_fweh_event_name(code));
        drvr->fweh.evt_handler[code] = NULL;
 }
 
@@ -438,6 +440,7 @@ int brcmf_fweh_activate_events(struct brcmf_if *ifp)
        }
 
        /* want to handle IF event as well */
+       brcmf_dbg(EVENT, "enable event IF\n");
        setbit(eventmask, BRCMF_E_IF);
 
        err = brcmf_fil_iovar_data_set(ifp, "event_msgs",