brcmfmac: restrict dongle txglom disable to old SDIO core
authorFranky Lin <frankyl@broadcom.com>
Tue, 26 Jun 2012 19:26:35 +0000 (21:26 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 27 Jun 2012 19:23:17 +0000 (15:23 -0400)
txglomming is a firmware feature for sdio bus interface. For SDIO
device cores newer than revision 11, the default setting of
firmware should be used instead of disabling it from the host side.

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_common.c
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c

index 1c9eb1893d297089375568a19e0216214a60f701..40fa4726b4a8d87fce57a01d8d935d6d57ac0871 100644 (file)
@@ -801,7 +801,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
                                 "event_msgs" + '\0' + bitvec  */
        char buf[128], *ptr;
        u32 dongle_align = drvr->bus_if->align;
-       u32 glom = 0;
        u32 roaming = 1;
        uint bcn_timeout = 3;
        int scan_assoc_time = 40;
@@ -835,11 +834,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
        brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
                                  sizeof(iovbuf));
 
-       /* disable glom option per default */
-       brcmf_c_mkiovar("bus:txglom", (char *)&glom, 4, iovbuf, sizeof(iovbuf));
-       brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
-                                 sizeof(iovbuf));
-
        /* Setup timeout if Beacons are lost and roam is off to report
                 link down */
        brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf,
index 076b7720ded9ac88383de9b04a946770aea714a5..1616c14d5f0cb85a19fbe14bec885ddcf5e9fe7c 100644 (file)
@@ -4169,6 +4169,9 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
 {
        int ret;
        struct brcmf_sdio *bus;
+       struct brcmf_bus_dcmd *dlst;
+       u32 dngl_txglom;
+       u8 idx;
 
        brcmf_dbg(TRACE, "Enter\n");
 
@@ -4254,6 +4257,18 @@ void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
        brcmf_sdio_debugfs_create(bus);
        brcmf_dbg(INFO, "completed!!\n");
 
+       /* sdio bus core specific dcmd */
+       idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
+       dlst = kzalloc(sizeof(struct brcmf_bus_dcmd), GFP_KERNEL);
+       if (bus->ci->c_inf[idx].rev < 12 && dlst) {
+               /* for sdio core rev < 12, disable txgloming */
+               dngl_txglom = 0;
+               dlst->name = "bus:txglom";
+               dlst->param = (char *)&dngl_txglom;
+               dlst->param_len = sizeof(u32);
+               list_add(&dlst->list, &bus->sdiodev->bus_if->dcmd_list);
+       }
+
        /* if firmware path present try to download and bring up bus */
        ret = brcmf_bus_start(bus->sdiodev->dev);
        if (ret != 0) {