staging: brcm80211: removed log after kzalloc()/kmalloc() failure
[pandora-kernel.git] / drivers / staging / brcm80211 / brcmfmac / dhd_linux.c
index 07ceaf9..659a9c2 100644 (file)
 #include "wl_cfg80211.h"
 #include "bcmchip.h"
 
-#if defined(CONFIG_PM_SLEEP)
-#include <linux/suspend.h>
-atomic_t brcmf_mmc_suspend;
-#endif /*  defined(CONFIG_PM_SLEEP) */
-
 MODULE_AUTHOR("Broadcom Corporation");
 MODULE_DESCRIPTION("Broadcom 802.11n wireless LAN fullmac driver.");
 MODULE_SUPPORTED_DEVICE("Broadcom 802.11n WLAN fullmac cards");
@@ -78,11 +73,8 @@ struct brcmf_info {
 
        struct mutex proto_block;
 
-       /* Thread to issue ioctl for multicast */
-       struct task_struct *sysioc_tsk;
-       wait_queue_head_t sysioc_waitq;
-       bool set_multicast;
-       bool set_macaddress;
+       struct work_struct setmacaddr_work;
+       struct work_struct multicast_work;
        u8 macvalue[ETH_ALEN];
        atomic_t pend_8021x_cnt;
 };
@@ -90,58 +82,6 @@ struct brcmf_info {
 /* Error bits */
 module_param(brcmf_msg_level, int, 0);
 
-/* Spawn a thread for system ioctls (set mac, set mcast) */
-uint brcmf_sysioc = true;
-module_param(brcmf_sysioc, uint, 0);
-
-/* ARP offload agent mode : Enable ARP Host Auto-Reply
-and ARP Peer Auto-Reply */
-uint brcmf_arp_mode = 0xb;
-module_param(brcmf_arp_mode, uint, 0);
-
-/* ARP offload enable */
-uint brcmf_arp_enable = true;
-module_param(brcmf_arp_enable, uint, 0);
-
-/* Global Pkt filter enable control */
-uint brcmf_pkt_filter_enable = true;
-module_param(brcmf_pkt_filter_enable, uint, 0);
-
-/*  Pkt filter init setup */
-uint brcmf_pkt_filter_init;
-module_param(brcmf_pkt_filter_init, uint, 0);
-
-/* Pkt filter mode control */
-uint brcmf_master_mode = true;
-module_param(brcmf_master_mode, uint, 0);
-
-/* Contorl fw roaming */
-uint brcmf_roam = 1;
-
-/* Control radio state */
-uint brcmf_radio_up = 1;
-
-/* Network inteface name */
-char iface_name[IFNAMSIZ] = "wlan";
-module_param_string(iface_name, iface_name, IFNAMSIZ, 0);
-
-/* The following are specific to the SDIO dongle */
-
-#ifdef SDTEST
-/* Echo packet generator (pkts/s) */
-uint brcmf_pktgen;
-module_param(brcmf_pktgen, uint, 0);
-
-/* Echo packet len (0 => sawtooth, max 2040) */
-uint brcmf_pktgen_len;
-module_param(brcmf_pktgen_len, uint, 0);
-#endif
-
-static int brcmf_toe_get(struct brcmf_info *drvr_priv, int idx, u32 *toe_ol);
-static int brcmf_toe_set(struct brcmf_info *drvr_priv, int idx, u32 toe_ol);
-static int brcmf_host_event(struct brcmf_info *drvr_priv, int *ifidx, void *pktdata,
-                           struct brcmf_event_msg *event_ptr,
-                           void **data_ptr);
 
 static int brcmf_net2idx(struct brcmf_info *drvr_priv, struct net_device *net)
 {
@@ -168,7 +108,7 @@ int brcmf_ifname2idx(struct brcmf_info *drvr_priv, char *name)
                    && !strncmp(drvr_priv->iflist[i]->name, name, IFNAMSIZ))
                        break;
 
-       BRCMF_TRACE(("%s: return idx %d for \"%s\"\n", __func__, i, name));
+       brcmf_dbg(TRACE, "return idx %d for \"%s\"\n", i, name);
 
        return i;               /* default - the primary interface */
 }
@@ -178,12 +118,12 @@ char *brcmf_ifname(struct brcmf_pub *drvr, int ifidx)
        struct brcmf_info *drvr_priv = drvr->info;
 
        if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
-               BRCMF_ERROR(("%s: ifidx %d out of range\n", __func__, ifidx));
+               brcmf_dbg(ERROR, "ifidx %d out of range\n", ifidx);
                return "<if_bad>";
        }
 
        if (drvr_priv->iflist[ifidx] == NULL) {
-               BRCMF_ERROR(("%s: null i/f %d\n", __func__, ifidx));
+               brcmf_dbg(ERROR, "null i/f %d\n", ifidx);
                return "<if_null>";
        }
 
@@ -193,18 +133,23 @@ char *brcmf_ifname(struct brcmf_pub *drvr, int ifidx)
        return "<if_none>";
 }
 
-static void _brcmf_set_multicast_list(struct brcmf_info *drvr_priv, int ifidx)
+static void _brcmf_set_multicast_list(struct work_struct *work)
 {
        struct net_device *dev;
        struct netdev_hw_addr *ha;
        u32 allmulti, cnt;
+       __le32 cnt_le;
+       __le32 allmulti_le;
 
        struct brcmf_ioctl ioc;
        char *buf, *bufp;
        uint buflen;
        int ret;
 
-       dev = drvr_priv->iflist[ifidx]->net;
+       struct brcmf_info *drvr_priv = container_of(work, struct brcmf_info,
+                                                   multicast_work);
+
+       dev = drvr_priv->iflist[0]->net;
        cnt = netdev_mc_count(dev);
 
        /* Determine initial value of allmulti flag */
@@ -214,18 +159,15 @@ static void _brcmf_set_multicast_list(struct brcmf_info *drvr_priv, int ifidx)
 
        buflen = sizeof("mcast_list") + sizeof(cnt) + (cnt * ETH_ALEN);
        bufp = buf = kmalloc(buflen, GFP_ATOMIC);
-       if (!bufp) {
-               BRCMF_ERROR(("%s: out of memory for mcast_list, cnt %d\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx), cnt));
+       if (!bufp)
                return;
-       }
 
        strcpy(bufp, "mcast_list");
        bufp += strlen("mcast_list") + 1;
 
-       cnt = cpu_to_le32(cnt);
-       memcpy(bufp, &cnt, sizeof(cnt));
-       bufp += sizeof(cnt);
+       cnt_le = cpu_to_le32(cnt);
+       memcpy(bufp, &cnt_le, sizeof(cnt));
+       bufp += sizeof(cnt_le);
 
        netdev_for_each_mc_addr(ha, dev) {
                if (!cnt)
@@ -241,10 +183,10 @@ static void _brcmf_set_multicast_list(struct brcmf_info *drvr_priv, int ifidx)
        ioc.len = buflen;
        ioc.set = true;
 
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, 0, &ioc, ioc.len);
        if (ret < 0) {
-               BRCMF_ERROR(("%s: set mcast_list failed, cnt %d\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx), cnt));
+               brcmf_dbg(ERROR, "%s: set mcast_list failed, cnt %d\n",
+                         brcmf_ifname(&drvr_priv->pub, 0), cnt);
                allmulti = cnt ? true : allmulti;
        }
 
@@ -257,19 +199,17 @@ static void _brcmf_set_multicast_list(struct brcmf_info *drvr_priv, int ifidx)
 
        buflen = sizeof("allmulti") + sizeof(allmulti);
        buf = kmalloc(buflen, GFP_ATOMIC);
-       if (!buf) {
-               BRCMF_ERROR(("%s: out of memory for allmulti\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx)));
+       if (!buf)
                return;
-       }
-       allmulti = cpu_to_le32(allmulti);
+
+       allmulti_le = cpu_to_le32(allmulti);
 
        if (!brcmu_mkiovar
-           ("allmulti", (void *)&allmulti, sizeof(allmulti), buf, buflen)) {
-               BRCMF_ERROR(("%s: mkiovar failed for allmulti, datalen %d "
-                            "buflen %u\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx),
-                            (int)sizeof(allmulti), buflen));
+           ("allmulti", (void *)&allmulti_le,
+           sizeof(allmulti_le), buf, buflen)) {
+               brcmf_dbg(ERROR, "%s: mkiovar failed for allmulti, datalen %d buflen %u\n",
+                         brcmf_ifname(&drvr_priv->pub, 0),
+                         (int)sizeof(allmulti), buflen);
                kfree(buf);
                return;
        }
@@ -280,11 +220,11 @@ static void _brcmf_set_multicast_list(struct brcmf_info *drvr_priv, int ifidx)
        ioc.len = buflen;
        ioc.set = true;
 
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, 0, &ioc, ioc.len);
        if (ret < 0) {
-               BRCMF_ERROR(("%s: set allmulti %d failed\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx),
-                            le32_to_cpu(allmulti)));
+               brcmf_dbg(ERROR, "%s: set allmulti %d failed\n",
+                         brcmf_ifname(&drvr_priv->pub, 0),
+                         le32_to_cpu(allmulti_le));
        }
 
        kfree(buf);
@@ -293,34 +233,38 @@ static void _brcmf_set_multicast_list(struct brcmf_info *drvr_priv, int ifidx)
                 driver does */
 
        allmulti = (dev->flags & IFF_PROMISC) ? true : false;
-       allmulti = cpu_to_le32(allmulti);
+       allmulti_le = cpu_to_le32(allmulti);
 
        memset(&ioc, 0, sizeof(ioc));
        ioc.cmd = BRCMF_C_SET_PROMISC;
-       ioc.buf = &allmulti;
-       ioc.len = sizeof(allmulti);
+       ioc.buf = &allmulti_le;
+       ioc.len = sizeof(allmulti_le);
        ioc.set = true;
 
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, 0, &ioc, ioc.len);
        if (ret < 0) {
-               BRCMF_ERROR(("%s: set promisc %d failed\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx),
-                            le32_to_cpu(allmulti)));
+               brcmf_dbg(ERROR, "%s: set promisc %d failed\n",
+                         brcmf_ifname(&drvr_priv->pub, 0),
+                         le32_to_cpu(allmulti_le));
        }
 }
 
-static int _brcmf_set_mac_address(struct brcmf_info *drvr_priv, int ifidx, u8 *addr)
+static void
+_brcmf_set_mac_address(struct work_struct *work)
 {
        char buf[32];
        struct brcmf_ioctl ioc;
        int ret;
 
-       BRCMF_TRACE(("%s enter\n", __func__));
-       if (!brcmu_mkiovar
-           ("cur_etheraddr", (char *)addr, ETH_ALEN, buf, 32)) {
-               BRCMF_ERROR(("%s: mkiovar failed for cur_etheraddr\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx)));
-               return -1;
+       struct brcmf_info *drvr_priv = container_of(work, struct brcmf_info,
+                                                   setmacaddr_work);
+
+       brcmf_dbg(TRACE, "enter\n");
+       if (!brcmu_mkiovar("cur_etheraddr", (char *)drvr_priv->macvalue,
+                          ETH_ALEN, buf, 32)) {
+               brcmf_dbg(ERROR, "%s: mkiovar failed for cur_etheraddr\n",
+                         brcmf_ifname(&drvr_priv->pub, 0));
+               return;
        }
        memset(&ioc, 0, sizeof(ioc));
        ioc.cmd = BRCMF_C_SET_VAR;
@@ -328,20 +272,17 @@ static int _brcmf_set_mac_address(struct brcmf_info *drvr_priv, int ifidx, u8 *a
        ioc.len = 32;
        ioc.set = true;
 
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, 0, &ioc, ioc.len);
        if (ret < 0)
-               BRCMF_ERROR(("%s: set cur_etheraddr failed\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx)));
+               brcmf_dbg(ERROR, "%s: set cur_etheraddr failed\n",
+                         brcmf_ifname(&drvr_priv->pub, 0));
        else
-               memcpy(drvr_priv->iflist[ifidx]->net->dev_addr, addr, ETH_ALEN);
+               memcpy(drvr_priv->iflist[0]->net->dev_addr,
+                      drvr_priv->macvalue, ETH_ALEN);
 
-       return ret;
+       return;
 }
 
-#ifdef SOFTAP
-static struct net_device *ap_net_dev;
-#endif
-
 /* Virtual interfaces only ((ifp && ifp->info && ifp->idx == true) */
 static void brcmf_op_if(struct brcmf_if *ifp)
 {
@@ -350,7 +291,7 @@ static void brcmf_op_if(struct brcmf_if *ifp)
 
        drvr_priv = ifp->info;
 
-       BRCMF_TRACE(("%s: idx %d, state %d\n", __func__, ifp->idx, ifp->state));
+       brcmf_dbg(TRACE, "idx %d, state %d\n", ifp->idx, ifp->state);
 
        switch (ifp->state) {
        case BRCMF_E_IF_ADD:
@@ -359,52 +300,38 @@ static void brcmf_op_if(struct brcmf_if *ifp)
                 * in case we missed the BRCMF_E_IF_DEL event.
                 */
                if (ifp->net != NULL) {
-                       BRCMF_ERROR(("%s: ERROR: netdev:%s already exists, "
-                                    "try free & unregister\n",
-                                    __func__, ifp->net->name));
+                       brcmf_dbg(ERROR, "ERROR: netdev:%s already exists, try free & unregister\n",
+                                 ifp->net->name);
                        netif_stop_queue(ifp->net);
                        unregister_netdev(ifp->net);
                        free_netdev(ifp->net);
                }
-               /* Allocate etherdev, including space for private structure */
-               ifp->net = alloc_etherdev(sizeof(drvr_priv));
+               /* Allocate netdev, including space for private structure */
+               ifp->net = alloc_netdev(sizeof(drvr_priv), "wlan%d",
+                                       ether_setup);
                if (!ifp->net) {
-                       BRCMF_ERROR(("%s: OOM - alloc_etherdev\n", __func__));
+                       brcmf_dbg(ERROR, "OOM - alloc_netdev\n");
                        ret = -ENOMEM;
                }
                if (ret == 0) {
                        strcpy(ifp->net->name, ifp->name);
-                       memcpy(netdev_priv(ifp->net), &drvr_priv, sizeof(drvr_priv));
+                       memcpy(netdev_priv(ifp->net), &drvr_priv,
+                              sizeof(drvr_priv));
                        err = brcmf_net_attach(&drvr_priv->pub, ifp->idx);
                        if (err != 0) {
-                               BRCMF_ERROR(("%s: brcmf_net_attach failed, "
-                                            "err %d\n",
-                                            __func__, err));
+                               brcmf_dbg(ERROR, "brcmf_net_attach failed, err %d\n",
+                                         err);
                                ret = -EOPNOTSUPP;
                        } else {
-#ifdef SOFTAP
-                               /* semaphore that the soft AP CODE
-                                        waits on */
-                               struct semaphore ap_eth_sema;
-
-                               /* save ptr to wl0.1 netdev for use
-                                        in wl_iw.c  */
-                               ap_net_dev = ifp->net;
-                               /* signal to the SOFTAP 'sleeper' thread,
-                                        wl0.1 is ready */
-                               up(&ap_eth_sema);
-#endif
-                               BRCMF_TRACE(("\n ==== pid:%x, net_device for "
-                                            "if:%s created ===\n\n",
-                                            current->pid, ifp->net->name));
+                               brcmf_dbg(TRACE, " ==== pid:%x, net_device for if:%s created ===\n",
+                                         current->pid, ifp->net->name);
                                ifp->state = 0;
                        }
                }
                break;
        case BRCMF_E_IF_DEL:
                if (ifp->net != NULL) {
-                       BRCMF_TRACE(("\n%s: got 'WLC_E_IF_DEL' state\n",
-                                    __func__));
+                       brcmf_dbg(TRACE, "got 'WLC_E_IF_DEL' state\n");
                        netif_stop_queue(ifp->net);
                        unregister_netdev(ifp->net);
                        ret = BRCMF_DEL_IF;     /* Make sure the free_netdev()
@@ -412,7 +339,7 @@ static void brcmf_op_if(struct brcmf_if *ifp)
                }
                break;
        default:
-               BRCMF_ERROR(("%s: bad op %d\n", __func__, ifp->state));
+               brcmf_dbg(ERROR, "bad op %d\n", ifp->state);
                break;
        }
 
@@ -422,89 +349,11 @@ static void brcmf_op_if(struct brcmf_if *ifp)
 
                drvr_priv->iflist[ifp->idx] = NULL;
                kfree(ifp);
-#ifdef SOFTAP
-               if (ifp->net == ap_net_dev)
-                       ap_net_dev = NULL;      /*  NULL  SOFTAP global
-                                                        wl0.1 as well */
-#endif                         /*  SOFTAP */
-       }
-}
-
-static int _brcmf_sysioc_thread(void *data)
-{
-       struct brcmf_info *drvr_priv = (struct brcmf_info *) data;
-       int i;
-#ifdef SOFTAP
-       bool in_ap = false;
-#endif
-       DECLARE_WAITQUEUE(wait, current);
-       allow_signal(SIGTERM);
-
-       add_wait_queue(&drvr_priv->sysioc_waitq, &wait);
-       while (1) {
-               prepare_to_wait(&drvr_priv->sysioc_waitq, &wait,
-                               TASK_INTERRUPTIBLE);
-
-               /* wait for event */
-               schedule();
-
-               if (kthread_should_stop())
-                       break;
-
-               for (i = 0; i < BRCMF_MAX_IFS; i++) {
-                       struct brcmf_if *ifentry = drvr_priv->iflist[i];
-                       if (ifentry) {
-#ifdef SOFTAP
-                               in_ap = (ap_net_dev != NULL);
-#endif                         /* SOFTAP */
-                               if (ifentry->state)
-                                       brcmf_op_if(ifentry);
-#ifdef SOFTAP
-                               if (drvr_priv->iflist[i] == NULL) {
-                                       BRCMF_TRACE(("\n\n %s: interface %d "
-                                                    "removed!\n", __func__,
-                                                    i));
-                                       continue;
-                               }
-
-                               if (in_ap && drvr_priv->set_macaddress) {
-                                       BRCMF_TRACE(("attempt to set MAC for"
-                                                    " %s in AP Mode,"
-                                                    " blocked.\n",
-                                                    ifentry->net->name));
-                                       drvr_priv->set_macaddress = false;
-                                       continue;
-                               }
-
-                               if (in_ap && drvr_priv->set_multicast) {
-                                       BRCMF_TRACE(("attempt to set MULTICAST "
-                                                    "list for %s in AP Mode, "
-                                                    "blocked.\n",
-                                                    ifentry->net->name));
-                                       drvr_priv->set_multicast = false;
-                                       continue;
-                               }
-#endif                         /* SOFTAP */
-                               if (drvr_priv->set_multicast) {
-                                       drvr_priv->set_multicast = false;
-                                       _brcmf_set_multicast_list(drvr_priv, i);
-                               }
-                               if (drvr_priv->set_macaddress) {
-                                       drvr_priv->set_macaddress = false;
-                                       _brcmf_set_mac_address(drvr_priv, i,
-                                               drvr_priv->macvalue);
-                               }
-                       }
-               }
        }
-       finish_wait(&drvr_priv->sysioc_waitq, &wait);
-       return 0;
 }
 
 static int brcmf_netdev_set_mac_address(struct net_device *dev, void *addr)
 {
-       int ret = 0;
-
        struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(dev);
        struct sockaddr *sa = (struct sockaddr *)addr;
        int ifidx;
@@ -514,9 +363,8 @@ static int brcmf_netdev_set_mac_address(struct net_device *dev, void *addr)
                return -1;
 
        memcpy(&drvr_priv->macvalue, sa->sa_data, ETH_ALEN);
-       drvr_priv->set_macaddress = true;
-       wake_up(&drvr_priv->sysioc_waitq);
-       return ret;
+       schedule_work(&drvr_priv->setmacaddr_work);
+       return 0;
 }
 
 static void brcmf_netdev_set_multicast_list(struct net_device *dev)
@@ -528,8 +376,7 @@ static void brcmf_netdev_set_multicast_list(struct net_device *dev)
        if (ifidx == BRCMF_BAD_IF)
                return;
 
-       drvr_priv->set_multicast = true;
-       wake_up(&drvr_priv->sysioc_waitq);
+       schedule_work(&drvr_priv->multicast_work);
 }
 
 int brcmf_sendpkt(struct brcmf_pub *drvr, int ifidx, struct sk_buff *pktbuf)
@@ -564,20 +411,19 @@ static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *net)
        struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(net);
        int ifidx;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        /* Reject if down */
        if (!drvr_priv->pub.up || (drvr_priv->pub.busstate == BRCMF_BUS_DOWN)) {
-               BRCMF_ERROR(("%s: xmit rejected pub.up=%d busstate=%d\n",
-                            __func__, drvr_priv->pub.up,
-                            drvr_priv->pub.busstate));
+               brcmf_dbg(ERROR, "xmit rejected pub.up=%d busstate=%d\n",
+                         drvr_priv->pub.up, drvr_priv->pub.busstate);
                netif_stop_queue(net);
                return -ENODEV;
        }
 
        ifidx = brcmf_net2idx(drvr_priv, net);
        if (ifidx == BRCMF_BAD_IF) {
-               BRCMF_ERROR(("%s: bad ifidx %d\n", __func__, ifidx));
+               brcmf_dbg(ERROR, "bad ifidx %d\n", ifidx);
                netif_stop_queue(net);
                return -ENODEV;
        }
@@ -586,15 +432,15 @@ static int brcmf_netdev_start_xmit(struct sk_buff *skb, struct net_device *net)
        if (skb_headroom(skb) < drvr_priv->pub.hdrlen) {
                struct sk_buff *skb2;
 
-               BRCMF_INFO(("%s: insufficient headroom\n",
-                           brcmf_ifname(&drvr_priv->pub, ifidx)));
+               brcmf_dbg(INFO, "%s: insufficient headroom\n",
+                         brcmf_ifname(&drvr_priv->pub, ifidx));
                drvr_priv->pub.tx_realloc++;
                skb2 = skb_realloc_headroom(skb, drvr_priv->pub.hdrlen);
                dev_kfree_skb(skb);
                skb = skb2;
                if (skb == NULL) {
-                       BRCMF_ERROR(("%s: skb_realloc_headroom failed\n",
-                                    brcmf_ifname(&drvr_priv->pub, ifidx)));
+                       brcmf_dbg(ERROR, "%s: skb_realloc_headroom failed\n",
+                                 brcmf_ifname(&drvr_priv->pub, ifidx));
                        ret = -ENOMEM;
                        goto done;
                }
@@ -617,7 +463,7 @@ void brcmf_txflowcontrol(struct brcmf_pub *drvr, int ifidx, bool state)
        struct net_device *net;
        struct brcmf_info *drvr_priv = drvr->info;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        drvr->txoff = state;
        net = drvr_priv->iflist[ifidx]->net;
@@ -627,6 +473,23 @@ void brcmf_txflowcontrol(struct brcmf_pub *drvr, int ifidx, bool state)
                netif_wake_queue(net);
 }
 
+static int brcmf_host_event(struct brcmf_info *drvr_priv, int *ifidx,
+                           void *pktdata, struct brcmf_event_msg *event,
+                           void **data)
+{
+       int bcmerror = 0;
+
+       bcmerror = brcmf_c_host_event(drvr_priv, ifidx, pktdata, event, data);
+       if (bcmerror != 0)
+               return bcmerror;
+
+       if (drvr_priv->iflist[*ifidx]->net)
+               brcmf_cfg80211_event(drvr_priv->iflist[*ifidx]->net,
+                                    event, *data);
+
+       return bcmerror;
+}
+
 void brcmf_rx_frame(struct brcmf_pub *drvr, int ifidx, struct sk_buff *skb,
                  int numpkt)
 {
@@ -639,7 +502,7 @@ void brcmf_rx_frame(struct brcmf_pub *drvr, int ifidx, struct sk_buff *skb,
        struct brcmf_if *ifp;
        struct brcmf_event_msg event;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        save_pktbuf = skb;
 
@@ -731,7 +594,7 @@ static struct net_device_stats *brcmf_netdev_get_stats(struct net_device *net)
        struct brcmf_if *ifp;
        int ifidx;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        ifidx = brcmf_net2idx(drvr_priv, net);
        if (ifidx == BRCMF_BAD_IF)
@@ -773,17 +636,17 @@ static int brcmf_toe_get(struct brcmf_info *drvr_priv, int ifidx, u32 *toe_ol)
        ioc.set = false;
 
        strcpy(buf, "toe_ol");
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.len);
        if (ret < 0) {
                /* Check for older dongle image that doesn't support toe_ol */
                if (ret == -EIO) {
-                       BRCMF_ERROR(("%s: toe not supported by device\n",
-                                    brcmf_ifname(&drvr_priv->pub, ifidx)));
+                       brcmf_dbg(ERROR, "%s: toe not supported by device\n",
+                                 brcmf_ifname(&drvr_priv->pub, ifidx));
                        return -EOPNOTSUPP;
                }
 
-               BRCMF_INFO(("%s: could not get toe_ol: ret=%d\n",
-                           brcmf_ifname(&drvr_priv->pub, ifidx), ret));
+               brcmf_dbg(INFO, "%s: could not get toe_ol: ret=%d\n",
+                         brcmf_ifname(&drvr_priv->pub, ifidx), ret);
                return ret;
        }
 
@@ -811,10 +674,10 @@ static int brcmf_toe_set(struct brcmf_info *drvr_priv, int ifidx, u32 toe_ol)
        strcpy(buf, "toe_ol");
        memcpy(&buf[sizeof("toe_ol")], &toe_ol, sizeof(u32));
 
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.len);
        if (ret < 0) {
-               BRCMF_ERROR(("%s: could not set toe_ol: ret=%d\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx), ret));
+               brcmf_dbg(ERROR, "%s: could not set toe_ol: ret=%d\n",
+                         brcmf_ifname(&drvr_priv->pub, ifidx), ret);
                return ret;
        }
 
@@ -825,10 +688,10 @@ static int brcmf_toe_set(struct brcmf_info *drvr_priv, int ifidx, u32 toe_ol)
        strcpy(buf, "toe");
        memcpy(&buf[sizeof("toe")], &toe, sizeof(u32));
 
-       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.buf, ioc.len);
+       ret = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, &ioc, ioc.len);
        if (ret < 0) {
-               BRCMF_ERROR(("%s: could not set toe: ret=%d\n",
-                            brcmf_ifname(&drvr_priv->pub, ifidx), ret));
+               brcmf_dbg(ERROR, "%s: could not set toe: ret=%d\n",
+                         brcmf_ifname(&drvr_priv->pub, ifidx), ret);
                return ret;
        }
 
@@ -844,14 +707,14 @@ static void brcmf_ethtool_get_drvinfo(struct net_device *net,
        sprintf(info->version, "%lu", drvr_priv->pub.drv_version);
        sprintf(info->fw_version, "%s", BCM4329_FW_NAME);
        sprintf(info->bus_info, "%s",
-               dev_name(&brcmf_cfg80211_get_sdio_func()->dev));
+               dev_name(brcmf_bus_get_device(drvr_priv->pub.bus)));
 }
 
-struct ethtool_ops brcmf_ethtool_ops = {
+static struct ethtool_ops brcmf_ethtool_ops = {
        .get_drvinfo = brcmf_ethtool_get_drvinfo
 };
 
-static int brcmf_ethtool(struct brcmf_info *drvr_priv, void *uaddr)
+static int brcmf_ethtool(struct brcmf_info *drvr_priv, void __user *uaddr)
 {
        struct ethtool_drvinfo info;
        char drvname[sizeof(info.driver)];
@@ -860,7 +723,7 @@ static int brcmf_ethtool(struct brcmf_info *drvr_priv, void *uaddr)
        u32 toe_cmpnt, csum_dir;
        int ret;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        /* all ethtool calls start with a cmd word */
        if (copy_from_user(&cmd, uaddr, sizeof(u32)))
@@ -886,7 +749,7 @@ static int brcmf_ethtool(struct brcmf_info *drvr_priv, void *uaddr)
 
                /* otherwise, require dongle to be up */
                else if (!drvr_priv->pub.up) {
-                       BRCMF_ERROR(("%s: dongle is not up\n", __func__));
+                       brcmf_dbg(ERROR, "dongle is not up\n");
                        return -ENODEV;
                }
 
@@ -899,8 +762,8 @@ static int brcmf_ethtool(struct brcmf_info *drvr_priv, void *uaddr)
                sprintf(info.version, "%lu", drvr_priv->pub.drv_version);
                if (copy_to_user(uaddr, &info, sizeof(info)))
                        return -EFAULT;
-               BRCMF_CTL(("%s: given %*s, returning %s\n", __func__,
-                          (int)sizeof(drvname), drvname, info.driver));
+               brcmf_dbg(CTL, "given %*s, returning %s\n",
+                         (int)sizeof(drvname), drvname, info.driver);
                break;
 
                /* Get toe offload components from dongle */
@@ -966,79 +829,37 @@ static int brcmf_netdev_ioctl_entry(struct net_device *net, struct ifreq *ifr,
                                    int cmd)
 {
        struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(net);
-       struct brcmf_c_ioctl ioc;
-       int bcmerror = 0;
-       int buflen = 0;
-       void *buf = NULL;
-       uint driver = 0;
        int ifidx;
-       bool is_set_key_cmd;
 
        ifidx = brcmf_net2idx(drvr_priv, net);
-       BRCMF_TRACE(("%s: ifidx %d, cmd 0x%04x\n", __func__, ifidx, cmd));
+       brcmf_dbg(TRACE, "ifidx %d, cmd 0x%04x\n", ifidx, cmd);
 
        if (ifidx == BRCMF_BAD_IF)
                return -1;
 
        if (cmd == SIOCETHTOOL)
-               return brcmf_ethtool(drvr_priv, (void *)ifr->ifr_data);
-
-       if (cmd != SIOCDEVPRIVATE)
-               return -EOPNOTSUPP;
-
-       memset(&ioc, 0, sizeof(ioc));
-
-       /* Copy the ioc control structure part of ioctl request */
-       if (copy_from_user(&ioc, ifr->ifr_data, sizeof(struct brcmf_ioctl))) {
-               bcmerror = -EINVAL;
-               goto done;
-       }
+               return brcmf_ethtool(drvr_priv, ifr->ifr_data);
 
-       /* Copy out any buffer passed */
-       if (ioc.buf) {
-               buflen = min_t(int, ioc.len, BRCMF_IOCTL_MAXLEN);
-               /* optimization for direct ioctl calls from kernel */
-               /*
-                  if (segment_eq(get_fs(), KERNEL_DS)) {
-                  buf = ioc.buf;
-                  } else {
-                */
-               {
-                       buf = kmalloc(buflen, GFP_ATOMIC);
-                       if (!buf) {
-                               bcmerror = -ENOMEM;
-                               goto done;
-                       }
-                       if (copy_from_user(buf, ioc.buf, buflen)) {
-                               bcmerror = -EINVAL;
-                               goto done;
-                       }
-               }
-       }
+       return -EOPNOTSUPP;
+}
 
-       /* To differentiate read 4 more byes */
-       if ((copy_from_user(&driver, (char *)ifr->ifr_data +
-                           sizeof(struct brcmf_ioctl), sizeof(uint)) != 0)) {
-               bcmerror = -EINVAL;
-               goto done;
-       }
+/* called only from within this driver */
+int brcmf_netdev_ioctl_priv(struct net_device *net, struct brcmf_ioctl *ioc)
+{
+       int bcmerror = 0;
+       int buflen = 0;
+       bool is_set_key_cmd;
+       struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(net);
+       int ifidx;
 
-       if (!capable(CAP_NET_ADMIN)) {
-               bcmerror = -EPERM;
-               goto done;
-       }
+       ifidx = brcmf_net2idx(drvr_priv, net);
 
-       /* check for local brcmf ioctl and handle it */
-       if (driver == BRCMF_IOCTL_MAGIC) {
-               bcmerror = brcmf_c_ioctl((void *)&drvr_priv->pub, &ioc, buf, buflen);
-               if (bcmerror)
-                       drvr_priv->pub.bcmerror = bcmerror;
-               goto done;
-       }
+       if (ioc->buf != NULL)
+               buflen = min_t(uint, ioc->len, BRCMF_IOCTL_MAXLEN);
 
        /* send to dongle (must be up, and wl) */
        if ((drvr_priv->pub.busstate != BRCMF_BUS_DATA)) {
-               BRCMF_ERROR(("%s DONGLE_DOWN,__func__\n", __func__));
+               brcmf_dbg(ERROR, "DONGLE_DOWN\n");
                bcmerror = -EIO;
                goto done;
        }
@@ -1052,26 +873,17 @@ static int brcmf_netdev_ioctl_entry(struct net_device *net, struct ifreq *ifr,
         * Intercept BRCMF_C_SET_KEY IOCTL - serialize M4 send and
         * set key IOCTL to prevent M4 encryption.
         */
-       is_set_key_cmd = ((ioc.cmd == BRCMF_C_SET_KEY) ||
-                         ((ioc.cmd == BRCMF_C_SET_VAR) &&
-                          !(strncmp("wsec_key", ioc.buf, 9))) ||
-                         ((ioc.cmd == BRCMF_C_SET_VAR) &&
-                          !(strncmp("bsscfg:wsec_key", ioc.buf, 15))));
+       is_set_key_cmd = ((ioc->cmd == BRCMF_C_SET_KEY) ||
+                         ((ioc->cmd == BRCMF_C_SET_VAR) &&
+                          !(strncmp("wsec_key", ioc->buf, 9))) ||
+                         ((ioc->cmd == BRCMF_C_SET_VAR) &&
+                          !(strncmp("bsscfg:wsec_key", ioc->buf, 15))));
        if (is_set_key_cmd)
                brcmf_netdev_wait_pend8021x(net);
 
-       bcmerror =
-           brcmf_proto_ioctl(&drvr_priv->pub, ifidx, (struct brcmf_ioctl *)&ioc,
-                             buf, buflen);
+       bcmerror = brcmf_proto_ioctl(&drvr_priv->pub, ifidx, ioc, buflen);
 
 done:
-       if (!bcmerror && buf && ioc.buf) {
-               if (copy_to_user(ioc.buf, buf, buflen))
-                       bcmerror = -EFAULT;
-       }
-
-       kfree(buf);
-
        if (bcmerror > 0)
                bcmerror = 0;
 
@@ -1080,21 +892,16 @@ done:
 
 static int brcmf_netdev_stop(struct net_device *net)
 {
-#if !defined(IGNORE_ETH0_DOWN)
-       struct brcmf_info *drvr_priv = *(struct brcmf_info **) netdev_priv(net);
+       struct brcmf_pub *drvr = *(struct brcmf_pub **) netdev_priv(net);
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
-       brcmf_cfg80211_down();
-       if (drvr_priv->pub.up == 0)
+       brcmf_dbg(TRACE, "Enter\n");
+       brcmf_cfg80211_down(drvr->config);
+       if (drvr->up == 0)
                return 0;
 
        /* Set state and stop OS transmissions */
-       drvr_priv->pub.up = 0;
+       drvr->up = 0;
        netif_stop_queue(net);
-#else
-       BRCMF_ERROR(("BYPASS %s:due to BRCM compilation: under investigation\n",
-                    __func__));
-#endif                         /* !defined(IGNORE_ETH0_DOWN) */
 
        return 0;
 }
@@ -1106,15 +913,14 @@ static int brcmf_netdev_open(struct net_device *net)
        int ifidx = brcmf_net2idx(drvr_priv, net);
        s32 ret = 0;
 
-       BRCMF_TRACE(("%s: ifidx %d\n", __func__, ifidx));
+       brcmf_dbg(TRACE, "ifidx %d\n", ifidx);
 
        if (ifidx == 0) {       /* do it only for primary eth0 */
 
                /* try to bring up bus */
                ret = brcmf_bus_start(&drvr_priv->pub);
                if (ret != 0) {
-                       BRCMF_ERROR(("%s: failed with code %d\n",
-                                    __func__, ret));
+                       brcmf_dbg(ERROR, "failed with code %d\n", ret);
                        return -1;
                }
                atomic_set(&drvr_priv->pend_8021x_cnt, 0);
@@ -1133,9 +939,8 @@ static int brcmf_netdev_open(struct net_device *net)
        /* Allow transmit calls */
        netif_start_queue(net);
        drvr_priv->pub.up = 1;
-       if (unlikely(brcmf_cfg80211_up())) {
-               BRCMF_ERROR(("%s: failed to bring up cfg80211\n",
-                            __func__));
+       if (brcmf_cfg80211_up(drvr_priv->pub.config)) {
+               brcmf_dbg(ERROR, "failed to bring up cfg80211\n");
                return -1;
        }
 
@@ -1143,20 +948,18 @@ static int brcmf_netdev_open(struct net_device *net)
 }
 
 int
-brcmf_add_if(struct brcmf_info *drvr_priv, int ifidx, void *handle, char *name,
-          u8 *mac_addr, u32 flags, u8 bssidx)
+brcmf_add_if(struct brcmf_info *drvr_priv, int ifidx, struct net_device *net,
+            char *name, u8 *mac_addr, u32 flags, u8 bssidx)
 {
        struct brcmf_if *ifp;
 
-       BRCMF_TRACE(("%s: idx %d, handle->%p\n", __func__, ifidx, handle));
+       brcmf_dbg(TRACE, "idx %d, handle->%p\n", ifidx, net);
 
        ifp = drvr_priv->iflist[ifidx];
        if (!ifp) {
                ifp = kmalloc(sizeof(struct brcmf_if), GFP_ATOMIC);
-               if (!ifp) {
-                       BRCMF_ERROR(("%s: OOM - struct brcmf_if\n", __func__));
+               if (!ifp)
                        return -ENOMEM;
-               }
        }
 
        memset(ifp, 0, sizeof(struct brcmf_if));
@@ -1166,12 +969,12 @@ brcmf_add_if(struct brcmf_info *drvr_priv, int ifidx, void *handle, char *name,
        if (mac_addr != NULL)
                memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN);
 
-       if (handle == NULL) {
+       if (net == NULL) {
                ifp->state = BRCMF_E_IF_ADD;
                ifp->idx = ifidx;
-               wake_up(&drvr_priv->sysioc_waitq);
+               brcmf_op_if(ifp);
        } else
-               ifp->net = (struct net_device *)handle;
+               ifp->net = net;
 
        return 0;
 }
@@ -1180,17 +983,17 @@ void brcmf_del_if(struct brcmf_info *drvr_priv, int ifidx)
 {
        struct brcmf_if *ifp;
 
-       BRCMF_TRACE(("%s: idx %d\n", __func__, ifidx));
+       brcmf_dbg(TRACE, "idx %d\n", ifidx);
 
        ifp = drvr_priv->iflist[ifidx];
        if (!ifp) {
-               BRCMF_ERROR(("%s: Null interface\n", __func__));
+               brcmf_dbg(ERROR, "Null interface\n");
                return;
        }
 
        ifp->state = BRCMF_E_IF_DEL;
        ifp->idx = ifidx;
-       wake_up(&drvr_priv->sysioc_waitq);
+       brcmf_op_if(ifp);
 }
 
 struct brcmf_pub *brcmf_attach(struct brcmf_bus *bus, uint bus_hdrlen)
@@ -1198,40 +1001,26 @@ struct brcmf_pub *brcmf_attach(struct brcmf_bus *bus, uint bus_hdrlen)
        struct brcmf_info *drvr_priv = NULL;
        struct net_device *net;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
-       /* Allocate etherdev, including space for private structure */
-       net = alloc_etherdev(sizeof(drvr_priv));
+       /* Allocate netdev, including space for private structure */
+       net = alloc_netdev(sizeof(drvr_priv), "wlan%d", ether_setup);
        if (!net) {
-               BRCMF_ERROR(("%s: OOM - alloc_etherdev\n", __func__));
+               brcmf_dbg(ERROR, "OOM - alloc_netdev\n");
                goto fail;
        }
 
        /* Allocate primary brcmf_info */
        drvr_priv = kzalloc(sizeof(struct brcmf_info), GFP_ATOMIC);
-       if (!drvr_priv) {
-               BRCMF_ERROR(("%s: OOM - alloc brcmf_info\n", __func__));
+       if (!drvr_priv)
                goto fail;
-       }
 
        /*
         * Save the brcmf_info into the priv
         */
        memcpy(netdev_priv(net), &drvr_priv, sizeof(drvr_priv));
 
-       /* Set network interface name if it was provided as module parameter */
-       if (iface_name[0]) {
-               int len;
-               char ch;
-               strncpy(net->name, iface_name, IFNAMSIZ);
-               net->name[IFNAMSIZ - 1] = 0;
-               len = strlen(net->name);
-               ch = net->name[len - 1];
-               if ((ch > '9' || ch < '0') && (len < IFNAMSIZ - 2))
-                       strcat(net->name, "%d");
-       }
-
-       if (brcmf_add_if(drvr_priv, 0, (void *)net, net->name, NULL, 0, 0) ==
+       if (brcmf_add_if(drvr_priv, 0, net, net->name, NULL, 0, 0) ==
            BRCMF_BAD_IF)
                goto fail;
 
@@ -1247,36 +1036,28 @@ struct brcmf_pub *brcmf_attach(struct brcmf_bus *bus, uint bus_hdrlen)
 
        /* Attach and link in the protocol */
        if (brcmf_proto_attach(&drvr_priv->pub) != 0) {
-               BRCMF_ERROR(("brcmf_prot_attach failed\n"));
+               brcmf_dbg(ERROR, "brcmf_prot_attach failed\n");
                goto fail;
        }
 
        /* Attach and link in the cfg80211 */
-       if (unlikely(brcmf_cfg80211_attach(net, &drvr_priv->pub))) {
-               BRCMF_ERROR(("wl_cfg80211_attach failed\n"));
+       drvr_priv->pub.config =
+                       brcmf_cfg80211_attach(net,
+                                             brcmf_bus_get_device(bus),
+                                             &drvr_priv->pub);
+       if (drvr_priv->pub.config == NULL) {
+               brcmf_dbg(ERROR, "wl_cfg80211_attach failed\n");
                goto fail;
        }
 
-       if (brcmf_sysioc) {
-               init_waitqueue_head(&drvr_priv->sysioc_waitq);
-               drvr_priv->sysioc_tsk = kthread_run(_brcmf_sysioc_thread, drvr_priv,
-                                               "_brcmf_sysioc");
-               if (IS_ERR(drvr_priv->sysioc_tsk)) {
-                       printk(KERN_WARNING
-                               "_brcmf_sysioc thread failed to start\n");
-                       drvr_priv->sysioc_tsk = NULL;
-               }
-       } else
-               drvr_priv->sysioc_tsk = NULL;
+       INIT_WORK(&drvr_priv->setmacaddr_work, _brcmf_set_mac_address);
+       INIT_WORK(&drvr_priv->multicast_work, _brcmf_set_multicast_list);
 
        /*
         * Save the brcmf_info into the priv
         */
        memcpy(netdev_priv(net), &drvr_priv, sizeof(drvr_priv));
 
-#if defined(CONFIG_PM_SLEEP)
-       atomic_set(&brcmf_mmc_suspend, false);
-#endif /* defined(CONFIG_PM_SLEEP) */
        return &drvr_priv->pub;
 
 fail:
@@ -1295,19 +1076,18 @@ int brcmf_bus_start(struct brcmf_pub *drvr)
        /* Room for "event_msgs" + '\0' + bitvec */
        char iovbuf[BRCMF_EVENTING_MASK_LEN + 12];
 
-       BRCMF_TRACE(("%s:\n", __func__));
+       brcmf_dbg(TRACE, "\n");
 
        /* Bring up the bus */
        ret = brcmf_sdbrcm_bus_init(&drvr_priv->pub, true);
        if (ret != 0) {
-               BRCMF_ERROR(("%s, brcmf_sdbrcm_bus_init failed %d\n", __func__,
-                            ret));
+               brcmf_dbg(ERROR, "brcmf_sdbrcm_bus_init failed %d\n", ret);
                return ret;
        }
 
        /* If bus is not ready, can't come up */
        if (drvr_priv->pub.busstate != BRCMF_BUS_DATA) {
-               BRCMF_ERROR(("%s failed bus is not ready\n", __func__));
+               brcmf_dbg(ERROR, "failed bus is not ready\n");
                return -ENODEV;
        }
 
@@ -1367,7 +1147,7 @@ int brcmf_net_attach(struct brcmf_pub *drvr, int ifidx)
        u8 temp_addr[ETH_ALEN] = {
                0x00, 0x90, 0x4c, 0x11, 0x22, 0x33};
 
-       BRCMF_TRACE(("%s: ifidx %d\n", __func__, ifidx));
+       brcmf_dbg(TRACE, "ifidx %d\n", ifidx);
 
        net = drvr_priv->iflist[ifidx]->net;
        net->netdev_ops = &brcmf_netdev_ops_pri;
@@ -1382,7 +1162,7 @@ int brcmf_net_attach(struct brcmf_pub *drvr, int ifidx)
        }
 
        if (ifidx == 1) {
-               BRCMF_TRACE(("%s ACCESS POINT MAC:\n", __func__));
+               brcmf_dbg(TRACE, "ACCESS POINT MAC:\n");
                /*  ACCESSPOINT INTERFACE CASE */
                temp_addr[0] |= 0X02;   /* set bit 2 ,
                         - Locally Administered address  */
@@ -1397,12 +1177,11 @@ int brcmf_net_attach(struct brcmf_pub *drvr, int ifidx)
        memcpy(net->dev_addr, temp_addr, ETH_ALEN);
 
        if (register_netdev(net) != 0) {
-               BRCMF_ERROR(("%s: couldn't register the net device\n",
-                            __func__));
+               brcmf_dbg(ERROR, "couldn't register the net device\n");
                goto fail;
        }
 
-       BRCMF_INFO(("%s: Broadcom Dongle Host Driver\n", net->name));
+       brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", net->name);
 
        return 0;
 
@@ -1415,7 +1194,7 @@ static void brcmf_bus_detach(struct brcmf_pub *drvr)
 {
        struct brcmf_info *drvr_priv;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        if (drvr) {
                drvr_priv = drvr->info;
@@ -1433,7 +1212,7 @@ void brcmf_detach(struct brcmf_pub *drvr)
 {
        struct brcmf_info *drvr_priv;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        if (drvr) {
                drvr_priv = drvr->info;
@@ -1451,18 +1230,15 @@ void brcmf_detach(struct brcmf_pub *drvr)
                                unregister_netdev(ifp->net);
                        }
 
-                       if (drvr_priv->sysioc_tsk) {
-                               send_sig(SIGTERM, drvr_priv->sysioc_tsk, 1);
-                               kthread_stop(drvr_priv->sysioc_tsk);
-                               drvr_priv->sysioc_tsk = NULL;
-                       }
+                       cancel_work_sync(&drvr_priv->setmacaddr_work);
+                       cancel_work_sync(&drvr_priv->multicast_work);
 
                        brcmf_bus_detach(drvr);
 
                        if (drvr->prot)
                                brcmf_proto_detach(drvr);
 
-                       brcmf_cfg80211_detach();
+                       brcmf_cfg80211_detach(drvr->config);
 
                        free_netdev(ifp->net);
                        kfree(ifp);
@@ -1473,7 +1249,7 @@ void brcmf_detach(struct brcmf_pub *drvr)
 
 static void __exit brcmf_module_cleanup(void)
 {
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        brcmf_bus_unregister();
 }
@@ -1482,12 +1258,12 @@ static int __init brcmf_module_init(void)
 {
        int error;
 
-       BRCMF_TRACE(("%s: Enter\n", __func__));
+       brcmf_dbg(TRACE, "Enter\n");
 
        error = brcmf_bus_register();
 
        if (error) {
-               BRCMF_ERROR(("%s: brcmf_bus_register failed\n", __func__));
+               brcmf_dbg(ERROR, "brcmf_bus_register failed\n");
                goto failed;
        }
        return 0;
@@ -1522,31 +1298,6 @@ int brcmf_os_proto_unblock(struct brcmf_pub *drvr)
        return 0;
 }
 
-static int brcmf_host_event(struct brcmf_info *drvr_priv, int *ifidx, void *pktdata,
-                           struct brcmf_event_msg *event, void **data)
-{
-       int bcmerror = 0;
-
-       bcmerror = brcmf_c_host_event(drvr_priv, ifidx, pktdata, event, data);
-       if (bcmerror != 0)
-               return bcmerror;
-
-       if (drvr_priv->iflist[*ifidx]->net)
-               brcmf_cfg80211_event(drvr_priv->iflist[*ifidx]->net,
-                                    event, *data);
-
-       return bcmerror;
-}
-
-int brcmf_netdev_reset(struct net_device *dev, u8 flag)
-{
-       struct brcmf_info *drvr_priv = *(struct brcmf_info **)netdev_priv(dev);
-
-       brcmf_bus_devreset(&drvr_priv->pub, flag);
-
-       return 1;
-}
-
 static int brcmf_get_pend_8021x_cnt(struct brcmf_info *drvr_priv)
 {
        return atomic_read(&drvr_priv->pend_8021x_cnt);
@@ -1588,7 +1339,7 @@ int brcmf_write_to_file(struct brcmf_pub *drvr, u8 *buf, int size)
        /* open file to write */
        fp = filp_open("/tmp/mem_dump", O_WRONLY | O_CREAT, 0640);
        if (!fp) {
-               BRCMF_ERROR(("%s: open file error\n", __func__));
+               brcmf_dbg(ERROR, "open file error\n");
                ret = -1;
                goto exit;
        }