diff options
author | Felix Fietkau <nbd@openwrt.org> | 2009-04-18 17:04:16 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2009-04-18 17:04:16 +0000 |
commit | be37a62e6d6e328c936beadd12a8059764fa6e12 (patch) | |
tree | cde758e42a625ac3fbcd4004200df28f03d2c8e2 /target/linux/generic-2.6/patches-2.6.29/975-ssb-fallback-sprom.patch | |
parent | 05d8459bb9f96b9e0a19b8735d3bee05484eca22 (diff) | |
download | upstream-be37a62e6d6e328c936beadd12a8059764fa6e12.tar.gz upstream-be37a62e6d6e328c936beadd12a8059764fa6e12.tar.bz2 upstream-be37a62e6d6e328c936beadd12a8059764fa6e12.zip |
add generic 2.6.29 patches and config (squashfs still untested, user space mkfs still missing)
SVN-Revision: 15251
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.29/975-ssb-fallback-sprom.patch')
-rw-r--r-- | target/linux/generic-2.6/patches-2.6.29/975-ssb-fallback-sprom.patch | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.29/975-ssb-fallback-sprom.patch b/target/linux/generic-2.6/patches-2.6.29/975-ssb-fallback-sprom.patch new file mode 100644 index 0000000000..23d1af7279 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.29/975-ssb-fallback-sprom.patch @@ -0,0 +1,107 @@ +--- a/drivers/ssb/pci.c ++++ b/drivers/ssb/pci.c +@@ -514,6 +514,7 @@ unsupported: + static int ssb_pci_sprom_get(struct ssb_bus *bus, + struct ssb_sprom *sprom) + { ++ const struct ssb_sprom *fallback; + int err = -ENOMEM; + u16 *buf; + +@@ -533,12 +534,23 @@ static int ssb_pci_sprom_get(struct ssb_ + bus->sprom_size = SSB_SPROMSIZE_WORDS_R4; + sprom_do_read(bus, buf); + err = sprom_check_crc(buf, bus->sprom_size); +- if (err) ++ if (err) { ++ /* All CRC attempts failed. ++ * Maybe there is no SPROM on the device? ++ * If we have a fallback, use that. */ ++ fallback = ssb_get_fallback_sprom(); ++ if (fallback) { ++ memcpy(sprom, fallback, sizeof(*sprom)); ++ err = 0; ++ goto out_free; ++ } + ssb_printk(KERN_WARNING PFX "WARNING: Invalid" + " SPROM CRC (corrupt SPROM)\n"); ++ } + } + err = sprom_extract(bus, sprom, buf, bus->sprom_size); + ++out_free: + kfree(buf); + out: + return err; +--- a/drivers/ssb/sprom.c ++++ b/drivers/ssb/sprom.c +@@ -14,6 +14,9 @@ + #include "ssb_private.h" + + ++static const struct ssb_sprom *fallback_sprom; ++ ++ + static int sprom2hex(const u16 *sprom, char *buf, size_t buf_len, + size_t sprom_size_words) + { +@@ -131,3 +134,36 @@ out: + return res; + return err ? err : count; + } ++ ++/** ++ * ssb_arch_set_fallback_sprom - Set a fallback SPROM for use if no SPROM is found. ++ * ++ * @sprom: The SPROM data structure to register. ++ * ++ * With this function the architecture implementation may register a fallback ++ * SPROM data structure. The fallback is only used for PCI based SSB devices, ++ * where no valid SPROM can be found in the shadow registers. ++ * ++ * This function is useful for weird architectures that have a half-assed SSB device ++ * hardwired to their PCI bus. ++ * ++ * Note that it does only work with PCI attached SSB devices. PCMCIA devices currently ++ * don't use this fallback. ++ * Architectures must provide the SPROM for native SSB devices anyway, ++ * so the fallback also isn't used for native devices. ++ * ++ * This function is available for architecture code, only. So it is not exported. ++ */ ++int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom) ++{ ++ if (fallback_sprom) ++ return -EEXIST; ++ fallback_sprom = sprom; ++ ++ return 0; ++} ++ ++const struct ssb_sprom *ssb_get_fallback_sprom(void) ++{ ++ return fallback_sprom; ++} +--- a/drivers/ssb/ssb_private.h ++++ b/drivers/ssb/ssb_private.h +@@ -131,6 +131,7 @@ ssize_t ssb_attr_sprom_store(struct ssb_ + const char *buf, size_t count, + int (*sprom_check_crc)(const u16 *sprom, size_t size), + int (*sprom_write)(struct ssb_bus *bus, const u16 *sprom)); ++extern const struct ssb_sprom *ssb_get_fallback_sprom(void); + + + /* core.c */ +--- a/include/linux/ssb/ssb.h ++++ b/include/linux/ssb/ssb.h +@@ -339,6 +339,10 @@ extern int ssb_bus_pcmciabus_register(st + + extern void ssb_bus_unregister(struct ssb_bus *bus); + ++/* Set a fallback SPROM. ++ * See kdoc at the function definition for complete documentation. */ ++extern int ssb_arch_set_fallback_sprom(const struct ssb_sprom *sprom); ++ + /* Suspend a SSB bus. + * Call this from the parent bus suspend routine. */ + extern int ssb_bus_suspend(struct ssb_bus *bus); |