OSDN Git Service

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 1c9eb18..40fa472 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 076b772..1616c14 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) {