return 0;
 }
 
-static int bcma_sprom_valid(const u16 *sprom, size_t words)
+static int bcma_sprom_valid(struct bcma_bus *bus, const u16 *sprom,
+                           size_t words)
 {
        u16 revision;
        int err;
                return err;
 
        revision = sprom[words - 1] & SSB_SPROM_REVISION_REV;
-       if (revision != 8 && revision != 9) {
+       if (revision != 8 && revision != 9 && revision != 10) {
                pr_err("Unsupported SPROM revision: %d\n", revision);
                return -ENOENT;
        }
 
+       bus->sprom.revision = revision;
+       bcma_debug(bus, "Found SPROM revision %d\n", revision);
+
        return 0;
 }
 
        BUILD_BUG_ON(ARRAY_SIZE(pwr_info_offset) !=
                        ARRAY_SIZE(bus->sprom.core_pwr_info));
 
-       bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] &
-               SSB_SPROM_REVISION_REV;
-
        for (i = 0; i < 3; i++) {
                v = sprom[SPOFF(SSB_SPROM8_IL0MAC) + i];
                *(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v);
 {
        u16 offset = BCMA_CC_SPROM;
        u16 *sprom;
-       size_t sprom_sizes[] = { SSB_SPROMSIZE_WORDS_R4, };
+       size_t sprom_sizes[] = { SSB_SPROMSIZE_WORDS_R4,
+                                SSB_SPROMSIZE_WORDS_R10, };
        int i, err = 0;
 
        if (!bus->drv_cc.core)
                        return -ENOMEM;
 
                bcma_sprom_read(bus, offset, sprom, words);
-               err = bcma_sprom_valid(sprom, words);
+               err = bcma_sprom_valid(bus, sprom, words);
                if (!err)
                        break;
 
 
 #define SSB_SPROMSIZE_WORDS_R4         220
 #define SSB_SPROMSIZE_BYTES_R123       (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16))
 #define SSB_SPROMSIZE_BYTES_R4         (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16))
+#define SSB_SPROMSIZE_WORDS_R10                230
 #define SSB_SPROM_BASE1                        0x1000
 #define SSB_SPROM_BASE31               0x0800
 #define SSB_SPROM_REVISION             0x007E