Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / brcm80211 / brcmfmac / fweh.c
index e9d6f91a1f2beb5b9f2315c5394f3e69096b3ddd..5a64280e64850867e2a4590050f024687e28749e 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "dhd.h"
 #include "dhd_dbg.h"
+#include "tracepoint.h"
+#include "fwsignal.h"
 #include "fweh.h"
 #include "fwil.h"
 
@@ -154,7 +156,7 @@ static int brcmf_fweh_call_event_handler(struct brcmf_if *ifp,
                fweh = &ifp->drvr->fweh;
 
                /* handle the event if valid interface and handler */
-               if (ifp->ndev && fweh->evt_handler[code])
+               if (fweh->evt_handler[code])
                        err = fweh->evt_handler[code](ifp, emsg, data);
                else
                        brcmf_err("unhandled event %d ignored\n", code);
@@ -179,9 +181,9 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr,
        struct brcmf_if *ifp;
        int err = 0;
 
-       brcmf_dbg(EVENT, "action: %u idx: %u bsscfg: %u flags: %u\n",
-                 ifevent->action, ifevent->ifidx,
-                 ifevent->bssidx, ifevent->flags);
+       brcmf_dbg(EVENT, "action: %u idx: %u bsscfg: %u flags: %u role: %u\n",
+                 ifevent->action, ifevent->ifidx, ifevent->bssidx,
+                 ifevent->flags, ifevent->role);
 
        if (ifevent->ifidx >= BRCMF_MAX_IFS) {
                brcmf_err("invalid interface index: %u\n",
@@ -198,15 +200,20 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr,
                                   emsg->ifname, emsg->addr);
                if (IS_ERR(ifp))
                        return;
-
+               brcmf_fws_add_interface(ifp);
                if (!drvr->fweh.evt_handler[BRCMF_E_IF])
                        err = brcmf_net_attach(ifp, false);
        }
 
+       if (ifevent->action == BRCMF_E_IF_CHANGE)
+               brcmf_fws_reset_interface(ifp);
+
        err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data);
 
-       if (ifevent->action == BRCMF_E_IF_DEL)
+       if (ifevent->action == BRCMF_E_IF_DEL) {
+               brcmf_fws_del_interface(ifp);
                brcmf_del_if(drvr, ifevent->bssidx);
+       }
 }
 
 /**
@@ -400,13 +407,12 @@ int brcmf_fweh_activate_events(struct brcmf_if *ifp)
  *
  * @drvr: driver information object.
  * @event_packet: event packet to process.
- * @ifidx: index of the firmware interface (may change).
  *
  * If the packet buffer contains a firmware event message it will
  * dispatch the event to a registered handler (using worker).
  */
 void brcmf_fweh_process_event(struct brcmf_pub *drvr,
-                             struct brcmf_event *event_packet, u8 *ifidx)
+                             struct brcmf_event *event_packet)
 {
        enum brcmf_fweh_event_code code;
        struct brcmf_fweh_info *fweh = &drvr->fweh;
@@ -418,7 +424,6 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,
        /* get event info */
        code = get_unaligned_be32(&event_packet->msg.event_type);
        datalen = get_unaligned_be32(&event_packet->msg.datalen);
-       *ifidx = event_packet->msg.ifidx;
        data = &event_packet[1];
 
        if (code >= BRCMF_E_LAST)
@@ -435,7 +440,7 @@ void brcmf_fweh_process_event(struct brcmf_pub *drvr,
                return;
 
        event->code = code;
-       event->ifidx = *ifidx;
+       event->ifidx = event_packet->msg.ifidx;
 
        /* use memcpy to get aligned event message */
        memcpy(&event->emsg, &event_packet->msg, sizeof(event->emsg));