]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
wl12xx: use the same SDIO block size for all different chips
authorLuciano Coelho <coelho@ti.com>
Thu, 3 Nov 2011 06:44:42 +0000 (08:44 +0200)
committerLuciano Coelho <coelho@ti.com>
Tue, 8 Nov 2011 13:36:53 +0000 (15:36 +0200)
The sdio driver uses a block size of 512 bytes by default.  With our
card, this doesn't work correctly because it sets the block size FBR
in the chip too early (ie. before the chip is powered on).  Thus, if
we don't set it explicitly, block mode remains disabled in the chip.
If we try to send more data than fits in one block, the sdio driver
will split it into separate blocks before sending to the chip.  This
causes problems because the chip is not expecting multiple blocks.

At the moment this is not a problem, because we use chunks of 512
bytes for firmware upload and the data is always sent in byte mode.
In the next patch, we will change the chunk size to a bigger value, so
this patch is a preparation for that.

Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/main.c

index b9a3fe4972749c71cbb98a18e4a4e83f5e9ff1c5..aa1c0f3ebeeb08d5ee9247f90296a3709f7325d5 100644 (file)
@@ -1313,7 +1313,16 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
        /* 0. read chip id from CHIP_ID */
        wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
 
-       /* 1. check if chip id is valid */
+       /*
+        * For wl127x based devices we could use the default block
+        * size (512 bytes), but due to a bug in the sdio driver, we
+        * need to set it explicitly after the chip is powered on.  To
+        * simplify the code and since the performance impact is
+        * negligible, we use the same block size for all different
+        * chip types.
+        */
+       if (!wl1271_set_block_size(wl))
+               wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
 
        switch (wl->chip.id) {
        case CHIP_ID_1271_PG10:
@@ -1343,9 +1352,6 @@ static int wl1271_chip_wakeup(struct wl1271 *wl)
                ret = wl1271_setup(wl);
                if (ret < 0)
                        goto out;
-
-               if (!wl1271_set_block_size(wl))
-                       wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
                break;
        case CHIP_ID_1283_PG10:
        default: