Apparently the CIS on the Broadcom BCM43341 in the ASUS X205TA has
CISTPL_NULL codes, which causes somedmesg spam:

sdmmc1: CIS parse error at 4286, tuple code 0, length 0

Handling these is simple.  They're just bytes that have to be skipped.
Diff below rearranges the parsing loop a bit to accomplish this.  As a
bonus, it also prevents us from reading beyond the CISTPL_END code.

ok?


Index: sdmmc_cis.c
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_cis.c,v
retrieving revision 1.5
diff -u -p -r1.5 sdmmc_cis.c
--- sdmmc_cis.c 24 Aug 2010 14:52:23 -0000      1.5
+++ sdmmc_cis.c 10 Jan 2016 18:16:05 -0000
@@ -77,13 +77,16 @@ sdmmc_read_cis(struct sdmmc_function *sf
 
        for (;;) {
                tplcode = sdmmc_io_read_1(sf, reg++);
-               tpllen = sdmmc_io_read_1(sf, reg++);
+               if (tplcode == SD_IO_CISTPL_END)
+                       break;
+               if (tplcode == SD_IO_CISTPL_NULL)
+                       continue;
 
-               if (tplcode == 0xff || tpllen == 0) {
-                       if (tplcode != 0xff)
-                               printf("%s: CIS parse error at %d, "
-                                   "tuple code %#x, length %d\n",
-                                   DEVNAME(sf->sc), reg, tplcode, tpllen);
+               tpllen = sdmmc_io_read_1(sf, reg++);
+               if (tpllen == 0) {
+                       printf("%s: CIS parse error at %d, "
+                           "tuple code %#x, length %d\n",
+                           DEVNAME(sf->sc), reg, tplcode, tpllen);
                        break;
                }
 
Index: sdmmc_ioreg.h
===================================================================
RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_ioreg.h,v
retrieving revision 1.4
diff -u -p -r1.4 sdmmc_ioreg.h
--- sdmmc_ioreg.h       2 Jun 2007 01:48:37 -0000       1.4
+++ sdmmc_ioreg.h       10 Jan 2016 18:16:05 -0000
@@ -82,10 +82,12 @@
 #define SD_IO_CIS_SIZE                 0x17000
 
 /* CIS tuple codes (based on PC Card 16) */
+#define SD_IO_CISTPL_NULL              0x00
 #define SD_IO_CISTPL_VERS_1            0x15
 #define SD_IO_CISTPL_MANFID            0x20
 #define SD_IO_CISTPL_FUNCID            0x21
 #define SD_IO_CISTPL_FUNCE             0x22
+#define SD_IO_CISTPL_END               0xff
 
 /* CISTPL_FUNCID codes */
 #define SDMMC_FUNCTION_WLAN            0x0c

Reply via email to