On Saturday 19 April 2008 15:13:24 Michael Buesch wrote: > On Saturday 19 April 2008 05:54:06 [EMAIL PROTECTED] wrote: > > The current code checks for the special signature that signifies > > a revision 4 SPROM. A rev. 8 SPROM with a 440-byte length has been > > found, but any special code for it is unknown. The the check should > > be relaxed. With this patch, if the CRC is incorrect for a 256-byte > > SPROM, the code will immediately check for a 440-byte SPROM. If there > > is still a CRC error, the size is set to 440 bytes, which allows dumping > > of most of any 512-byte SPROM if/when one is encountered. > > > > The code has also been modified to test for cases where the CRC check > > results in a false positive, but the revision number is wrong. > > > > Signed-off-by: Larry Finger <[EMAIL PROTECTED]> > > --- > > > > > > > > Index: wireless-testing/drivers/ssb/pci.c > > =================================================================== > > --- wireless-testing.orig/drivers/ssb/pci.c > > +++ wireless-testing/drivers/ssb/pci.c > > @@ -497,6 +497,7 @@ static int ssb_pci_sprom_get(struct ssb_ > > { > > int err = -ENOMEM; > > u16 *buf; > > + u16 revision; > > > > buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); > > if (!buf) > > @@ -504,19 +505,32 @@ static int ssb_pci_sprom_get(struct ssb_ > > bus->sprom_size = SSB_SPROMSIZE_WORDS_R123; > > sprom_do_read(bus, buf); > > err = sprom_check_crc(buf, bus->sprom_size); > > - if (err) { > > - /* check for rev 4 sprom - has special signature */ > > - if (buf[32] == 0x5372) { > > - kfree(buf); > > - buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16), > > - GFP_KERNEL); > > - if (!buf) > > - goto out; > > - bus->sprom_size = SSB_SPROMSIZE_WORDS_R4; > > - sprom_do_read(bus, buf); > > - err = sprom_check_crc(buf, bus->sprom_size); > > + if (!err) { > > + /* crc is OK - make sure we should be expecting 256 bytes */ > > + revision = buf[SSB_SPROMSIZE_WORDS_R123 - 1] & 0x00FF; > > + if (revision > 3) { > > + ssb_printk(KERN_WARNING PFX "Warning: SPROM CRC" > > + " and revision are inconsistent\n"); > > + goto sprom_440; > > } > > - if (err) > > + } else { > > + /* try for a 440 byte SPROM - revision 4 and higher */ > > +sprom_440: > > Uh, oh. I like gotos, but this is horrible. :) > > Please put > revision = buf[SSB_SPROMSIZE_WORDS_R123 - 1] & 0x00FF; > before the condition and do > if (err || revision > 3) { > if (revision > 3) > WARNING > ...
Actually, please drop this all. It doesn't really make sense. We'll simply have to live with a broken SPROM design. I will sign off on the first patch. -- Greetings Michael. _______________________________________________ Bcm43xx-dev mailing list Bcm43xx-dev@lists.berlios.de https://lists.berlios.de/mailman/listinfo/bcm43xx-dev