소스 검색

kernel: add a ssb backport required for a new mac80211 update

Signed-off-by: Felix Fietkau <[email protected]>

SVN-Revision: 40833
Felix Fietkau 11 년 전
부모
커밋
32d1e0ed2c

+ 3 - 3
target/linux/brcm47xx/patches-3.10/095-MIPS-BCM47XX-Fix-some-very-confused-types-and-data-c.patch

@@ -18,7 +18,7 @@ Patchwork: http://patchwork.linux-mips.org/patch/6211/
 
 --- a/arch/mips/bcm47xx/sprom.c
 +++ b/arch/mips/bcm47xx/sprom.c
-@@ -135,7 +135,7 @@ static void nvram_read_leddc(const char
+@@ -135,7 +135,7 @@ static void nvram_read_leddc(const char 
  }
  
  static void nvram_read_macaddr(const char *prefix, const char *name,
@@ -50,7 +50,7 @@ Patchwork: http://patchwork.linux-mips.org/patch/6211/
  }
  
  static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
-@@ -180,7 +180,7 @@ static void bcm47xx_fill_sprom_r1234589(
+@@ -181,7 +181,7 @@ static void bcm47xx_fill_sprom_r1234589(
  		      fallback);
  	nvram_read_s8(prefix, NULL, "ag1", &sprom->antenna_gain.a1, 0,
  		      fallback);
@@ -59,7 +59,7 @@ Patchwork: http://patchwork.linux-mips.org/patch/6211/
  }
  
  static void bcm47xx_fill_sprom_r12389(struct ssb_sprom *sprom,
-@@ -633,20 +633,20 @@ static void bcm47xx_fill_sprom_path_r45(
+@@ -634,20 +634,20 @@ static void bcm47xx_fill_sprom_path_r45(
  static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
  					const char *prefix, bool fallback)
  {

+ 20 - 2
target/linux/generic/patches-3.10/020-ssb_update.patch

@@ -169,7 +169,7 @@
  static int ssb_gpio_chipco_get_value(struct gpio_chip *chip, unsigned gpio)
  {
  	struct ssb_bus *bus = ssb_gpio_get_bus(chip);
-@@ -74,19 +98,129 @@ static void ssb_gpio_chipco_free(struct
+@@ -74,19 +98,129 @@ static void ssb_gpio_chipco_free(struct 
  	ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 0);
  }
  
@@ -596,7 +596,15 @@
  extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
 --- a/include/linux/ssb/ssb.h
 +++ b/include/linux/ssb/ssb.h
-@@ -486,6 +486,7 @@ struct ssb_bus {
+@@ -33,6 +33,7 @@ struct ssb_sprom {
+ 	u8 et1phyaddr;		/* MII address for enet1 */
+ 	u8 et0mdcport;		/* MDIO for enet0 */
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */
+@@ -486,6 +487,7 @@ struct ssb_bus {
  #endif /* EMBEDDED */
  #ifdef CONFIG_SSB_DRIVER_GPIO
  	struct gpio_chip gpio;
@@ -675,3 +683,13 @@
  #define SSB_SPROM_BASE1			0x1000
  #define SSB_SPROM_BASE31		0x0800
  #define SSB_SPROM_REVISION		0x007E
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -168,6 +168,7 @@ static void nvram_read_alpha2(const char
+ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
+ 					const char *prefix, bool fallback)
+ {
++	nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);

+ 20 - 2
target/linux/generic/patches-3.12/020-ssb_update.patch

@@ -80,7 +80,7 @@
  static int ssb_gpio_chipco_get_value(struct gpio_chip *chip, unsigned gpio)
  {
  	struct ssb_bus *bus = ssb_gpio_get_bus(chip);
-@@ -74,19 +98,129 @@ static void ssb_gpio_chipco_free(struct
+@@ -74,19 +98,129 @@ static void ssb_gpio_chipco_free(struct 
  	ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 0);
  }
  
@@ -503,7 +503,15 @@
  		ssb_bus_may_powerdown(bus);
 --- a/include/linux/ssb/ssb.h
 +++ b/include/linux/ssb/ssb.h
-@@ -486,6 +486,7 @@ struct ssb_bus {
+@@ -33,6 +33,7 @@ struct ssb_sprom {
+ 	u8 et1phyaddr;		/* MII address for enet1 */
+ 	u8 et0mdcport;		/* MDIO for enet0 */
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */
+@@ -486,6 +487,7 @@ struct ssb_bus {
  #endif /* EMBEDDED */
  #ifdef CONFIG_SSB_DRIVER_GPIO
  	struct gpio_chip gpio;
@@ -541,3 +549,13 @@
  
  #endif /* CONFIG_SSB_DRIVER_GIGE */
  #endif /* LINUX_SSB_DRIVER_GIGE_H_ */
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -168,6 +168,7 @@ static void nvram_read_alpha2(const char
+ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
+ 					const char *prefix, bool fallback)
+ {
++	nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);

+ 20 - 2
target/linux/generic/patches-3.13/020-ssb_update.patch

@@ -80,7 +80,7 @@
  static int ssb_gpio_chipco_get_value(struct gpio_chip *chip, unsigned gpio)
  {
  	struct ssb_bus *bus = ssb_gpio_get_bus(chip);
-@@ -74,19 +98,129 @@ static void ssb_gpio_chipco_free(struct
+@@ -74,19 +98,129 @@ static void ssb_gpio_chipco_free(struct 
  	ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 0);
  }
  
@@ -457,7 +457,15 @@
  		ssb_bus_may_powerdown(bus);
 --- a/include/linux/ssb/ssb.h
 +++ b/include/linux/ssb/ssb.h
-@@ -486,6 +486,7 @@ struct ssb_bus {
+@@ -33,6 +33,7 @@ struct ssb_sprom {
+ 	u8 et1phyaddr;		/* MII address for enet1 */
+ 	u8 et0mdcport;		/* MDIO for enet0 */
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */
+@@ -486,6 +487,7 @@ struct ssb_bus {
  #endif /* EMBEDDED */
  #ifdef CONFIG_SSB_DRIVER_GPIO
  	struct gpio_chip gpio;
@@ -465,3 +473,13 @@
  #endif /* DRIVER_GPIO */
  
  	/* Internal-only stuff follows. Do not touch. */
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -168,6 +168,7 @@ static void nvram_read_alpha2(const char
+ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
+ 					const char *prefix, bool fallback)
+ {
++	nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);

+ 36 - 0
target/linux/generic/patches-3.14/020-ssb_update.patch

@@ -0,0 +1,36 @@
+commit 4f4aa2ec24dc45881849833a439558d3a378028c
+Author: Rafał Miłecki <[email protected]>
+Date:   Sun May 18 00:22:38 2014 +0200
+
+    ssb: sprom: add dev_id field for value overriding standard ID
+    
+    Some devices may have different features despite sharing the same ID
+    (e.g. PCI ID). For example 14e4:4331 is usually a dual band, but this
+    can be "limited". Device with "pci/x/y/devid=0x4332" supports 2.4 GHz
+    only. Similarly 0x4333 will mean support for 5 GHz only.
+    Add entry in SPROM so info described above can be extracted and stored.
+    
+    Signed-off-by: Rafał Miłecki <[email protected]>
+    Acked-by: Hauke Mehrtens <[email protected]>
+    Signed-off-by: John W. Linville <[email protected]>
+
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -168,6 +168,7 @@ static void nvram_read_alpha2(const char
+ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
+ 					const char *prefix, bool fallback)
+ {
++	nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);
+--- a/include/linux/ssb/ssb.h
++++ b/include/linux/ssb/ssb.h
+@@ -33,6 +33,7 @@ struct ssb_sprom {
+ 	u8 et1phyaddr;		/* MII address for enet1 */
+ 	u8 et0mdcport;		/* MDIO for enet0 */
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */

+ 15 - 14
target/linux/generic/patches-3.3/020-ssb_update.patch

@@ -471,7 +471,7 @@
  	}
  
  	if (updown_tab) {
-@@ -516,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon
+@@ -516,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon 
  	pmucap = chipco_read32(cc, SSB_CHIPCO_PMU_CAP);
  	cc->pmu.rev = (pmucap & SSB_CHIPCO_PMU_CAP_REVISION);
  
@@ -1131,7 +1131,7 @@
  }
  
  static void dump_irq(struct ssb_bus *bus)
-@@ -178,9 +199,9 @@ static void ssb_mips_serial_init(struct
+@@ -178,9 +199,9 @@ static void ssb_mips_serial_init(struct 
  {
  	struct ssb_bus *bus = mcore->dev->bus;
  
@@ -1143,7 +1143,7 @@
  		mcore->nr_serial_ports = ssb_chipco_serial_init(&bus->chipco, mcore->serial_ports);
  	else
  		mcore->nr_serial_ports = 0;
-@@ -189,17 +210,42 @@ static void ssb_mips_serial_init(struct
+@@ -189,17 +210,42 @@ static void ssb_mips_serial_init(struct 
  static void ssb_mips_flash_detect(struct ssb_mipscore *mcore)
  {
  	struct ssb_bus *bus = mcore->dev->bus;
@@ -1980,7 +1980,7 @@
  	sprom_extract_r458(out, in);
  
  	/* TODO - get remaining rev 8 stuff needed */
-@@ -641,7 +753,7 @@ static int sprom_extract(struct ssb_bus
+@@ -641,7 +753,7 @@ static int sprom_extract(struct ssb_bus 
  	memset(out, 0, sizeof(*out));
  
  	out->revision = in[size - 1] & 0x00FF;
@@ -1989,7 +1989,7 @@
  	memset(out->et0mac, 0xFF, 6);		/* preset et0 and et1 mac */
  	memset(out->et1mac, 0xFF, 6);
  
-@@ -650,7 +762,7 @@ static int sprom_extract(struct ssb_bus
+@@ -650,7 +762,7 @@ static int sprom_extract(struct ssb_bus 
  		 * number stored in the SPROM.
  		 * Always extract r1. */
  		out->revision = 1;
@@ -1998,7 +1998,7 @@
  	}
  
  	switch (out->revision) {
-@@ -667,9 +779,8 @@ static int sprom_extract(struct ssb_bus
+@@ -667,9 +779,8 @@ static int sprom_extract(struct ssb_bus 
  		sprom_extract_r8(out, in);
  		break;
  	default:
@@ -2494,7 +2494,7 @@
  
  #include <linux/ssb/ssb_regs.h>
  
-@@ -16,19 +18,28 @@ struct pcmcia_device;
+@@ -16,19 +18,29 @@ struct pcmcia_device;
  struct ssb_bus;
  struct ssb_driver;
  
@@ -2516,6 +2516,7 @@
  	u8 et1phyaddr;		/* MII address for enet1 */
  	u8 et0mdcport;		/* MDIO for enet0 */
  	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
  	u16 board_rev;		/* Board revision number from SPROM. */
 +	u16 board_num;		/* Board number from SPROM. */
 +	u16 board_type;		/* Board type from SPROM. */
@@ -2528,7 +2529,7 @@
  	u8 ant_available_a;	/* 2GHz antenna available bits (up to 4) */
  	u8 ant_available_bg;	/* 5GHz antenna available bits (up to 4) */
  	u16 pa0b0;
-@@ -47,10 +58,10 @@ struct ssb_sprom {
+@@ -47,10 +59,10 @@ struct ssb_sprom {
  	u8 gpio1;		/* GPIO pin 1 */
  	u8 gpio2;		/* GPIO pin 2 */
  	u8 gpio3;		/* GPIO pin 3 */
@@ -2543,7 +2544,7 @@
  	u8 itssi_a;		/* Idle TSSI Target for A-PHY */
  	u8 itssi_bg;		/* Idle TSSI Target for B/G-PHY */
  	u8 tri2g;		/* 2.4GHz TX isolation */
-@@ -61,8 +72,8 @@ struct ssb_sprom {
+@@ -61,8 +73,8 @@ struct ssb_sprom {
  	u8 txpid5gl[4];		/* 4.9 - 5.1GHz TX power index */
  	u8 txpid5g[4];		/* 5.1 - 5.5GHz TX power index */
  	u8 txpid5gh[4];		/* 5.5 - ...GHz TX power index */
@@ -2554,7 +2555,7 @@
  	u8 rssisav2g;		/* 2GHz RSSI params */
  	u8 rssismc2g;
  	u8 rssismf2g;
-@@ -82,16 +93,13 @@ struct ssb_sprom {
+@@ -82,16 +94,13 @@ struct ssb_sprom {
  	u16 boardflags2_hi;	/* Board flags (bits 48-63) */
  	/* TODO store board flags in a single u64 */
  
@@ -2574,7 +2575,7 @@
  	} antenna_gain;
  
  	struct {
-@@ -103,14 +111,85 @@ struct ssb_sprom {
+@@ -103,14 +112,85 @@ struct ssb_sprom {
  		} ghz5;
  	} fem;
  
@@ -2662,7 +2663,7 @@
  };
  
  
-@@ -166,6 +245,7 @@ struct ssb_bus_ops {
+@@ -166,6 +246,7 @@ struct ssb_bus_ops {
  #define SSB_DEV_MINI_MACPHY	0x823
  #define SSB_DEV_ARM_1176	0x824
  #define SSB_DEV_ARM_7TDMI	0x825
@@ -2670,7 +2671,7 @@
  
  /* Vendor-ID values */
  #define SSB_VENDOR_BROADCOM	0x4243
-@@ -260,13 +340,61 @@ enum ssb_bustype {
+@@ -260,13 +341,61 @@ enum ssb_bustype {
  #define SSB_BOARDVENDOR_DELL	0x1028	/* Dell */
  #define SSB_BOARDVENDOR_HP	0x0E11	/* HP */
  /* board_type */
@@ -2735,7 +2736,7 @@
  /* chip_package */
  #define SSB_CHIPPACK_BCM4712S	1	/* Small 200pin 4712 */
  #define SSB_CHIPPACK_BCM4712M	2	/* Medium 225pin 4712 */
-@@ -354,7 +482,11 @@ struct ssb_bus {
+@@ -354,7 +483,11 @@ struct ssb_bus {
  #ifdef CONFIG_SSB_EMBEDDED
  	/* Lock for GPIO register access. */
  	spinlock_t gpio_lock;

+ 14 - 9
target/linux/generic/patches-3.6/020-ssb_update.patch

@@ -417,7 +417,7 @@
  	}
  
  	if (updown_tab) {
-@@ -523,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon
+@@ -523,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon 
  	pmucap = chipco_read32(cc, SSB_CHIPCO_PMU_CAP);
  	cc->pmu.rev = (pmucap & SSB_CHIPCO_PMU_CAP_REVISION);
  
@@ -1075,7 +1075,7 @@
  }
  
  static void dump_irq(struct ssb_bus *bus)
-@@ -178,9 +199,9 @@ static void ssb_mips_serial_init(struct
+@@ -178,9 +199,9 @@ static void ssb_mips_serial_init(struct 
  {
  	struct ssb_bus *bus = mcore->dev->bus;
  
@@ -1087,7 +1087,7 @@
  		mcore->nr_serial_ports = ssb_chipco_serial_init(&bus->chipco, mcore->serial_ports);
  	else
  		mcore->nr_serial_ports = 0;
-@@ -189,17 +210,42 @@ static void ssb_mips_serial_init(struct
+@@ -189,17 +210,42 @@ static void ssb_mips_serial_init(struct 
  static void ssb_mips_flash_detect(struct ssb_mipscore *mcore)
  {
  	struct ssb_bus *bus = mcore->dev->bus;
@@ -1715,7 +1715,7 @@
  	SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8);
  	SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0);
  	SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0);
-@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus
+@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus 
  	memset(out, 0, sizeof(*out));
  
  	out->revision = in[size - 1] & 0x00FF;
@@ -1724,7 +1724,7 @@
  	memset(out->et0mac, 0xFF, 6);		/* preset et0 and et1 mac */
  	memset(out->et1mac, 0xFF, 6);
  
-@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus
+@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus 
  		 * number stored in the SPROM.
  		 * Always extract r1. */
  		out->revision = 1;
@@ -1733,7 +1733,7 @@
  	}
  
  	switch (out->revision) {
-@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus
+@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus 
  		sprom_extract_r8(out, in);
  		break;
  	default:
@@ -2172,7 +2172,7 @@
  
  #include <linux/ssb/ssb_regs.h>
  
-@@ -24,9 +26,9 @@ struct ssb_sprom_core_pwr_info {
+@@ -24,13 +26,14 @@ struct ssb_sprom_core_pwr_info {
  
  struct ssb_sprom {
  	u8 revision;
@@ -2185,7 +2185,12 @@
  	u8 et0phyaddr;		/* MII address for enet0 */
  	u8 et1phyaddr;		/* MII address for enet1 */
  	u8 et0mdcport;		/* MDIO for enet0 */
-@@ -338,13 +340,61 @@ enum ssb_bustype {
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */
+@@ -338,13 +341,61 @@ enum ssb_bustype {
  #define SSB_BOARDVENDOR_DELL	0x1028	/* Dell */
  #define SSB_BOARDVENDOR_HP	0x0E11	/* HP */
  /* board_type */
@@ -2250,7 +2255,7 @@
  /* chip_package */
  #define SSB_CHIPPACK_BCM4712S	1	/* Small 200pin 4712 */
  #define SSB_CHIPPACK_BCM4712M	2	/* Medium 225pin 4712 */
-@@ -432,7 +482,11 @@ struct ssb_bus {
+@@ -432,7 +483,11 @@ struct ssb_bus {
  #ifdef CONFIG_SSB_EMBEDDED
  	/* Lock for GPIO register access. */
  	spinlock_t gpio_lock;

+ 24 - 9
target/linux/generic/patches-3.8/020-ssb_update.patch

@@ -104,7 +104,7 @@
  	}
  
  	if (updown_tab) {
-@@ -526,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon
+@@ -526,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon 
  	pmucap = chipco_read32(cc, SSB_CHIPCO_PMU_CAP);
  	cc->pmu.rev = (pmucap & SSB_CHIPCO_PMU_CAP_REVISION);
  
@@ -151,7 +151,7 @@
  		return 0;
  	}
  }
-@@ -692,8 +687,23 @@ void ssb_pmu_spuravoid_pllupdate(struct
+@@ -692,8 +687,23 @@ void ssb_pmu_spuravoid_pllupdate(struct 
  		pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD;
  		break;
  	case 43222:
@@ -346,7 +346,7 @@
 +}
 --- a/drivers/ssb/driver_gpio.c
 +++ b/drivers/ssb/driver_gpio.c
-@@ -74,6 +74,16 @@ static void ssb_gpio_chipco_free(struct
+@@ -74,6 +74,16 @@ static void ssb_gpio_chipco_free(struct 
  	ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 0);
  }
  
@@ -465,7 +465,7 @@
  }
  
  static void dump_irq(struct ssb_bus *bus)
-@@ -189,34 +210,43 @@ static void ssb_mips_serial_init(struct
+@@ -189,34 +210,43 @@ static void ssb_mips_serial_init(struct 
  static void ssb_mips_flash_detect(struct ssb_mipscore *mcore)
  {
  	struct ssb_bus *bus = mcore->dev->bus;
@@ -993,7 +993,7 @@
  	SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8);
  	SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0);
  	SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0);
-@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus
+@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus 
  	memset(out, 0, sizeof(*out));
  
  	out->revision = in[size - 1] & 0x00FF;
@@ -1002,7 +1002,7 @@
  	memset(out->et0mac, 0xFF, 6);		/* preset et0 and et1 mac */
  	memset(out->et1mac, 0xFF, 6);
  
-@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus
+@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus 
  		 * number stored in the SPROM.
  		 * Always extract r1. */
  		out->revision = 1;
@@ -1011,7 +1011,7 @@
  	}
  
  	switch (out->revision) {
-@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus
+@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus 
  		sprom_extract_r8(out, in);
  		break;
  	default:
@@ -1382,7 +1382,7 @@
  extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
 --- a/include/linux/ssb/ssb.h
 +++ b/include/linux/ssb/ssb.h
-@@ -26,9 +26,9 @@ struct ssb_sprom_core_pwr_info {
+@@ -26,13 +26,14 @@ struct ssb_sprom_core_pwr_info {
  
  struct ssb_sprom {
  	u8 revision;
@@ -1395,7 +1395,12 @@
  	u8 et0phyaddr;		/* MII address for enet0 */
  	u8 et1phyaddr;		/* MII address for enet1 */
  	u8 et0mdcport;		/* MDIO for enet0 */
-@@ -340,13 +340,61 @@ enum ssb_bustype {
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */
+@@ -340,13 +341,61 @@ enum ssb_bustype {
  #define SSB_BOARDVENDOR_DELL	0x1028	/* Dell */
  #define SSB_BOARDVENDOR_HP	0x0E11	/* HP */
  /* board_type */
@@ -1572,3 +1577,13 @@
  #define SSB_SPROM4_AGAIN01		0x005E	/* Antenna Gain (in dBm Q5.2) */
  #define  SSB_SPROM4_AGAIN0		0x00FF	/* Antenna 0 */
  #define  SSB_SPROM4_AGAIN0_SHIFT	0
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -168,6 +168,7 @@ static void nvram_read_alpha2(const char
+ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
+ 					const char *prefix, bool fallback)
+ {
++	nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);

+ 22 - 7
target/linux/generic/patches-3.9/020-ssb_update.patch

@@ -93,7 +93,7 @@
  	}
  
  	if (updown_tab) {
-@@ -526,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon
+@@ -526,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon 
  	pmucap = chipco_read32(cc, SSB_CHIPCO_PMU_CAP);
  	cc->pmu.rev = (pmucap & SSB_CHIPCO_PMU_CAP_REVISION);
  
@@ -140,7 +140,7 @@
  		return 0;
  	}
  }
-@@ -692,8 +687,23 @@ void ssb_pmu_spuravoid_pllupdate(struct
+@@ -692,8 +687,23 @@ void ssb_pmu_spuravoid_pllupdate(struct 
  		pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD;
  		break;
  	case 43222:
@@ -751,7 +751,7 @@
  	SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8);
  	SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0);
  	SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0);
-@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus
+@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus 
  	memset(out, 0, sizeof(*out));
  
  	out->revision = in[size - 1] & 0x00FF;
@@ -760,7 +760,7 @@
  	memset(out->et0mac, 0xFF, 6);		/* preset et0 and et1 mac */
  	memset(out->et1mac, 0xFF, 6);
  
-@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus
+@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus 
  		 * number stored in the SPROM.
  		 * Always extract r1. */
  		out->revision = 1;
@@ -769,7 +769,7 @@
  	}
  
  	switch (out->revision) {
-@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus
+@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus 
  		sprom_extract_r8(out, in);
  		break;
  	default:
@@ -1125,7 +1125,7 @@
  extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);
 --- a/include/linux/ssb/ssb.h
 +++ b/include/linux/ssb/ssb.h
-@@ -26,9 +26,9 @@ struct ssb_sprom_core_pwr_info {
+@@ -26,13 +26,14 @@ struct ssb_sprom_core_pwr_info {
  
  struct ssb_sprom {
  	u8 revision;
@@ -1138,7 +1138,12 @@
  	u8 et0phyaddr;		/* MII address for enet0 */
  	u8 et1phyaddr;		/* MII address for enet1 */
  	u8 et0mdcport;		/* MDIO for enet0 */
-@@ -340,13 +340,61 @@ enum ssb_bustype {
+ 	u8 et1mdcport;		/* MDIO for enet1 */
++	u16 dev_id;		/* Device ID overriding e.g. PCI ID */
+ 	u16 board_rev;		/* Board revision number from SPROM. */
+ 	u16 board_num;		/* Board number from SPROM. */
+ 	u16 board_type;		/* Board type from SPROM. */
+@@ -340,13 +341,61 @@ enum ssb_bustype {
  #define SSB_BOARDVENDOR_DELL	0x1028	/* Dell */
  #define SSB_BOARDVENDOR_HP	0x0E11	/* HP */
  /* board_type */
@@ -1261,3 +1266,13 @@
  #define SSB_SPROM4_AGAIN01		0x005E	/* Antenna Gain (in dBm Q5.2) */
  #define  SSB_SPROM4_AGAIN0		0x00FF	/* Antenna 0 */
  #define  SSB_SPROM4_AGAIN0_SHIFT	0
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -168,6 +168,7 @@ static void nvram_read_alpha2(const char
+ static void bcm47xx_fill_sprom_r1234589(struct ssb_sprom *sprom,
+ 					const char *prefix, bool fallback)
+ {
++	nvram_read_u16(prefix, NULL, "devid", &sprom->dev_id, 0, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh0", &sprom->gpio0, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh1", &sprom->gpio1, 0xff, fallback);
+ 	nvram_read_u8(prefix, NULL, "ledbh2", &sprom->gpio2, 0xff, fallback);