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