On Sun, Jan 10, 2016 at 07:21:37PM +0100, Mark Kettenis wrote:
> 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?

This closer matches the pcmcia cis code, the simplified sdio spec
"Basic Tuple Format and Tuple Chain Structure" section, and
looks fine to me. ok jsg@

> 
> 
> 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