brcmfmac: add support for bus specific data command
authorFranky Lin <frankyl@broadcom.com>
Tue, 26 Jun 2012 19:26:34 +0000 (21:26 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 27 Jun 2012 19:23:17 +0000 (15:23 -0400)
brcmfmac need to support data command setting for dongle's bus
core. A list must be placed at brcmf_bus structure before calling
brcmf_bus_start in order to be sent by brcmf_c_preinit_dcmds.

Reviewed-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_bus.h
drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c

index 3669164..537f499 100644 (file)
@@ -36,6 +36,13 @@ struct dngl_stats {
        unsigned long multicast;        /* multicast packets received */
 };
 
+struct brcmf_bus_dcmd {
+       char *name;
+       char *param;
+       int param_len;
+       struct list_head list;
+};
+
 /* interface structure between common and bus layer */
 struct brcmf_bus {
        u8 type;                /* bus type */
@@ -50,6 +57,7 @@ struct brcmf_bus {
        unsigned long tx_realloc;       /* Tx packets realloced for headroom */
        struct dngl_stats dstats;       /* Stats for dongle-based data */
        u8 align;               /* bus alignment requirement */
+       struct list_head dcmd_list;
 
        /* interface functions pointers */
        /* Stop bus module: clear pending frames, disable data flow */
index 236cb9f..1c9eb18 100644 (file)
@@ -807,6 +807,8 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
        int scan_assoc_time = 40;
        int scan_unassoc_time = 40;
        int i;
+       struct brcmf_bus_dcmd *cmdlst;
+       struct list_head *cur, *q;
 
        mutex_lock(&drvr->proto_block);
 
@@ -874,6 +876,20 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
                                                 0, true);
        }
 
+       /* set bus specific command if there is any */
+       list_for_each_safe(cur, q, &drvr->bus_if->dcmd_list) {
+               cmdlst = list_entry(cur, struct brcmf_bus_dcmd, list);
+               if (cmdlst->name && cmdlst->param && cmdlst->param_len) {
+                       brcmf_c_mkiovar(cmdlst->name, cmdlst->param,
+                                       cmdlst->param_len, iovbuf,
+                                       sizeof(iovbuf));
+                       brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR,
+                                                iovbuf, sizeof(iovbuf));
+               }
+               list_del(cur);
+               kfree(cmdlst);
+       }
+
        mutex_unlock(&drvr->proto_block);
 
        return 0;
index 01cf6c0..57bf1d7 100644 (file)
@@ -1020,6 +1020,8 @@ int brcmf_attach(uint bus_hdrlen, struct device *dev)
        INIT_WORK(&drvr->setmacaddr_work, _brcmf_set_mac_address);
        INIT_WORK(&drvr->multicast_work, _brcmf_set_multicast_list);
 
+       INIT_LIST_HEAD(&drvr->bus_if->dcmd_list);
+
        return ret;
 
 fail: