diff options
Diffstat (limited to 'target/linux/generic/patches-2.6.39/020-ssb_update.patch')
| -rw-r--r-- | target/linux/generic/patches-2.6.39/020-ssb_update.patch | 519 | 
1 files changed, 366 insertions, 153 deletions
diff --git a/target/linux/generic/patches-2.6.39/020-ssb_update.patch b/target/linux/generic/patches-2.6.39/020-ssb_update.patch index 404201a78..e6dec49b0 100644 --- a/target/linux/generic/patches-2.6.39/020-ssb_update.patch +++ b/target/linux/generic/patches-2.6.39/020-ssb_update.patch @@ -1,3 +1,29 @@ +--- a/drivers/ssb/b43_pci_bridge.c ++++ b/drivers/ssb/b43_pci_bridge.c +@@ -5,12 +5,13 @@ +  * because of its small size we include it in the SSB core +  * instead of creating a standalone module. +  * +- * Copyright 2007  Michael Buesch <mb@bu3sch.de> ++ * Copyright 2007  Michael Buesch <m@bues.ch> +  * +  * Licensed under the GNU/GPL. See COPYING for details. +  */ +  + #include <linux/pci.h> ++#include <linux/module.h> + #include <linux/ssb/ssb.h> +  + #include "ssb_private.h" +@@ -28,6 +29,8 @@ static const struct pci_device_id b43_pc + 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) }, + 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) }, + 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4321) }, ++	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4322) }, ++	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 43222) }, + 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4324) }, + 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4325) }, + 	{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4328) },  --- a/drivers/ssb/driver_chipcommon.c  +++ b/drivers/ssb/driver_chipcommon.c  @@ -3,7 +3,7 @@ @@ -216,6 +242,17 @@  +		return 0;  +	}  +} +--- a/drivers/ssb/driver_extif.c ++++ b/drivers/ssb/driver_extif.c +@@ -3,7 +3,7 @@ +  * Broadcom EXTIF core driver +  * +  * Copyright 2005, Broadcom Corporation +- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> ++ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> +  * Copyright 2006, 2007, Felix Fietkau <nbd@openwrt.org> +  * Copyright 2007, Aurelien Jarno <aurelien@aurel32.net> +  *  --- a/drivers/ssb/driver_gige.c  +++ b/drivers/ssb/driver_gige.c  @@ -3,7 +3,7 @@ @@ -261,6 +298,27 @@   {   	struct ssb_gige *dev;   	u32 base, tmslow, tmshigh; +--- a/drivers/ssb/driver_mipscore.c ++++ b/drivers/ssb/driver_mipscore.c +@@ -3,7 +3,7 @@ +  * Broadcom MIPS core driver +  * +  * Copyright 2005, Broadcom Corporation +- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> ++ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> +  * +  * Licensed under the GNU/GPL. See COPYING for details. +  */ +@@ -208,6 +208,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m + 	struct ssb_bus *bus = mcore->dev->bus; + 	u32 pll_type, n, m, rate = 0; +  ++	if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU) ++		return ssb_pmu_get_cpu_clock(&bus->chipco); ++ + 	if (bus->extif.dev) { + 		ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m); + 	} else if (bus->chipco.dev) {  --- a/drivers/ssb/driver_pcicore.c  +++ b/drivers/ssb/driver_pcicore.c  @@ -3,7 +3,7 @@ @@ -635,6 +693,17 @@   	}   	pc->setup_done = 1;   out: +--- a/drivers/ssb/embedded.c ++++ b/drivers/ssb/embedded.c +@@ -3,7 +3,7 @@ +  * Embedded systems support code +  * +  * Copyright 2005-2008, Broadcom Corporation +- * Copyright 2006-2008, Michael Buesch <mb@bu3sch.de> ++ * Copyright 2006-2008, Michael Buesch <m@bues.ch> +  * +  * Licensed under the GNU/GPL. See COPYING for details. +  */  --- a/drivers/ssb/main.c  +++ b/drivers/ssb/main.c  @@ -3,7 +3,7 @@ @@ -929,7 +998,26 @@    * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de>    * Copyright (C) 2005 Stefano Brivio <st3@riseup.net>    * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> -@@ -331,7 +331,6 @@ static void sprom_extract_r123(struct ss +@@ -178,6 +178,18 @@ err_pci: + #define SPEX(_outvar, _offset, _mask, _shift) \ + 	SPEX16(_outvar, _offset, _mask, _shift) +  ++#define SPEX_ARRAY8(_field, _offset, _mask, _shift)	\ ++	do {	\ ++		SPEX(_field[0], _offset +  0, _mask, _shift);	\ ++		SPEX(_field[1], _offset +  2, _mask, _shift);	\ ++		SPEX(_field[2], _offset +  4, _mask, _shift);	\ ++		SPEX(_field[3], _offset +  6, _mask, _shift);	\ ++		SPEX(_field[4], _offset +  8, _mask, _shift);	\ ++		SPEX(_field[5], _offset + 10, _mask, _shift);	\ ++		SPEX(_field[6], _offset + 12, _mask, _shift);	\ ++		SPEX(_field[7], _offset + 14, _mask, _shift);	\ ++	} while (0) ++ +  + static inline u8 ssb_crc8(u8 crc, u8 data) + { +@@ -331,7 +343,6 @@ static void sprom_extract_r123(struct ss   {   	int i;   	u16 v; @@ -937,8 +1025,24 @@   	u16 loc[3];   	if (out->revision == 3)			/* rev 3 moved MAC */ -@@ -390,20 +389,12 @@ static void sprom_extract_r123(struct ss +@@ -361,8 +372,9 @@ static void sprom_extract_r123(struct ss + 	SPEX(et0mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0M, 14); + 	SPEX(et1mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1M, 15); + 	SPEX(board_rev, SSB_SPROM1_BINF, SSB_SPROM1_BINF_BREV, 0); +-	SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE, +-	     SSB_SPROM1_BINF_CCODE_SHIFT); ++	if (out->revision == 1) ++		SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE, ++		     SSB_SPROM1_BINF_CCODE_SHIFT); + 	SPEX(ant_available_a, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTA, + 	     SSB_SPROM1_BINF_ANTA_SHIFT); + 	SPEX(ant_available_bg, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTBG, +@@ -388,22 +400,16 @@ static void sprom_extract_r123(struct ss + 	SPEX(boardflags_lo, SSB_SPROM1_BFLLO, 0xFFFF, 0); + 	if (out->revision >= 2)   		SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0); ++	SPEX(alpha2[0], SSB_SPROM1_CCODE, 0xff00, 8); ++	SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0);   	/* Extract the antenna gain values. */  -	gain = r123_extract_antgain(out->revision, in, @@ -964,7 +1068,27 @@   }   /* Revs 4 5 and 8 have partially shared layout */ -@@ -504,16 +495,14 @@ static void sprom_extract_r45(struct ssb +@@ -464,14 +470,17 @@ static void sprom_extract_r45(struct ssb + 	SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0); + 	SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A, + 	     SSB_SPROM4_ETHPHY_ET1A_SHIFT); ++	SPEX(board_rev, SSB_SPROM4_BOARDREV, 0xFFFF, 0); + 	if (out->revision == 4) { +-		SPEX(country_code, SSB_SPROM4_CCODE, 0xFFFF, 0); ++		SPEX(alpha2[0], SSB_SPROM4_CCODE, 0xff00, 8); ++		SPEX(alpha2[1], SSB_SPROM4_CCODE, 0x00ff, 0); + 		SPEX(boardflags_lo, SSB_SPROM4_BFLLO, 0xFFFF, 0); + 		SPEX(boardflags_hi, SSB_SPROM4_BFLHI, 0xFFFF, 0); + 		SPEX(boardflags2_lo, SSB_SPROM4_BFL2LO, 0xFFFF, 0); + 		SPEX(boardflags2_hi, SSB_SPROM4_BFL2HI, 0xFFFF, 0); + 	} else { +-		SPEX(country_code, SSB_SPROM5_CCODE, 0xFFFF, 0); ++		SPEX(alpha2[0], SSB_SPROM5_CCODE, 0xff00, 8); ++		SPEX(alpha2[1], SSB_SPROM5_CCODE, 0x00ff, 0); + 		SPEX(boardflags_lo, SSB_SPROM5_BFLLO, 0xFFFF, 0); + 		SPEX(boardflags_hi, SSB_SPROM5_BFLHI, 0xFFFF, 0); + 		SPEX(boardflags2_lo, SSB_SPROM5_BFL2LO, 0xFFFF, 0); +@@ -504,16 +513,14 @@ static void sprom_extract_r45(struct ssb   	}   	/* Extract the antenna gain values. */ @@ -985,7 +1109,7 @@   	sprom_extract_r458(out, in); -@@ -523,7 +512,13 @@ static void sprom_extract_r45(struct ssb +@@ -523,14 +530,22 @@ static void sprom_extract_r45(struct ssb   static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)   {   	int i; @@ -1000,7 +1124,17 @@   	/* extract the MAC address */   	for (i = 0; i < 3; i++) { -@@ -596,16 +591,69 @@ static void sprom_extract_r8(struct ssb_ + 		v = in[SPOFF(SSB_SPROM8_IL0MAC) + i]; + 		*(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); + 	} +-	SPEX(country_code, SSB_SPROM8_CCODE, 0xFFFF, 0); ++	SPEX(board_rev, SSB_SPROM8_BOARDREV, 0xFFFF, 0); ++	SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8); ++	SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0); + 	SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0); + 	SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0); + 	SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, 0xFFFF, 0); +@@ -596,17 +611,127 @@ static void sprom_extract_r8(struct ssb_   	SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0);   	/* Extract the antenna gain values. */ @@ -1018,7 +1152,7 @@   	     SSB_SPROM8_AGAIN3, SSB_SPROM8_AGAIN3_SHIFT);  -	memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24,  -	       sizeof(out->antenna_gain.ghz5)); -+ +   +	/* Extract cores power info info */  +	for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) {  +		o = pwr_info_offset[i]; @@ -1073,10 +1207,68 @@  +		SSB_SROM8_FEM_TR_ISO, SSB_SROM8_FEM_TR_ISO_SHIFT);  +	SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G,  +		SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); -  ++ ++	SPEX(leddc_on_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_ON, ++	     SSB_SPROM8_LEDDC_ON_SHIFT); ++	SPEX(leddc_off_time, SSB_SPROM8_LEDDC, SSB_SPROM8_LEDDC_OFF, ++	     SSB_SPROM8_LEDDC_OFF_SHIFT); ++ ++	SPEX(txchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_TXCHAIN, ++	     SSB_SPROM8_TXRXC_TXCHAIN_SHIFT); ++	SPEX(rxchain, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_RXCHAIN, ++	     SSB_SPROM8_TXRXC_RXCHAIN_SHIFT); ++	SPEX(antswitch, SSB_SPROM8_TXRXC, SSB_SPROM8_TXRXC_SWITCH, ++	     SSB_SPROM8_TXRXC_SWITCH_SHIFT); ++ ++	SPEX(opo, SSB_SPROM8_OFDM2GPO, 0x00ff, 0); ++ ++	SPEX_ARRAY8(mcs2gpo, SSB_SPROM8_2G_MCSPO, ~0, 0); ++	SPEX_ARRAY8(mcs5gpo, SSB_SPROM8_5G_MCSPO, ~0, 0); ++	SPEX_ARRAY8(mcs5glpo, SSB_SPROM8_5GL_MCSPO, ~0, 0); ++	SPEX_ARRAY8(mcs5ghpo, SSB_SPROM8_5GH_MCSPO, ~0, 0); ++ ++	SPEX(rawtempsense, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_RAWTEMP, ++	     SSB_SPROM8_RAWTS_RAWTEMP_SHIFT); ++	SPEX(measpower, SSB_SPROM8_RAWTS, SSB_SPROM8_RAWTS_MEASPOWER, ++	     SSB_SPROM8_RAWTS_MEASPOWER_SHIFT); ++	SPEX(tempsense_slope, SSB_SPROM8_OPT_CORRX, ++	     SSB_SPROM8_OPT_CORRX_TEMP_SLOPE, ++	     SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT); ++	SPEX(tempcorrx, SSB_SPROM8_OPT_CORRX, SSB_SPROM8_OPT_CORRX_TEMPCORRX, ++	     SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT); ++	SPEX(tempsense_option, SSB_SPROM8_OPT_CORRX, ++	     SSB_SPROM8_OPT_CORRX_TEMP_OPTION, ++	     SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT); ++	SPEX(freqoffset_corr, SSB_SPROM8_HWIQ_IQSWP, ++	     SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR, ++	     SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT); ++	SPEX(iqcal_swp_dis, SSB_SPROM8_HWIQ_IQSWP, ++	     SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP, ++	     SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT); ++	SPEX(hw_iqcal_en, SSB_SPROM8_HWIQ_IQSWP, SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL, ++	     SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT); ++ ++	SPEX(bw40po, SSB_SPROM8_BW40PO, ~0, 0); ++	SPEX(cddpo, SSB_SPROM8_CDDPO, ~0, 0); ++	SPEX(stbcpo, SSB_SPROM8_STBCPO, ~0, 0); ++	SPEX(bwduppo, SSB_SPROM8_BWDUPPO, ~0, 0); ++ ++	SPEX(tempthresh, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_TRESH, ++	     SSB_SPROM8_THERMAL_TRESH_SHIFT); ++	SPEX(tempoffset, SSB_SPROM8_THERMAL, SSB_SPROM8_THERMAL_OFFSET, ++	     SSB_SPROM8_THERMAL_OFFSET_SHIFT); ++	SPEX(phycal_tempdelta, SSB_SPROM8_TEMPDELTA, ++	     SSB_SPROM8_TEMPDELTA_PHYCAL, ++	     SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT); ++	SPEX(temps_period, SSB_SPROM8_TEMPDELTA, SSB_SPROM8_TEMPDELTA_PERIOD, ++	     SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT); ++	SPEX(temps_hysteresis, SSB_SPROM8_TEMPDELTA, ++	     SSB_SPROM8_TEMPDELTA_HYSTERESIS, ++	     SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT);   	sprom_extract_r458(out, in); -@@ -662,7 +710,6 @@ static int sprom_extract(struct ssb_bus + 	/* TODO - get remaining rev 8 stuff needed */ +@@ -662,7 +787,6 @@ static int sprom_extract(struct ssb_bus   static int ssb_pci_sprom_get(struct ssb_bus *bus,   			     struct ssb_sprom *sprom)   { @@ -1084,7 +1276,7 @@   	int err;   	u16 *buf; -@@ -707,10 +754,17 @@ static int ssb_pci_sprom_get(struct ssb_ +@@ -707,10 +831,17 @@ static int ssb_pci_sprom_get(struct ssb_   		if (err) {   			/* All CRC attempts failed.   			 * Maybe there is no SPROM on the device? @@ -1106,7 +1298,7 @@   				err = 0;   				goto out_free;   			} -@@ -728,12 +782,9 @@ out_free: +@@ -728,12 +859,8 @@ out_free:   static void ssb_pci_get_boardinfo(struct ssb_bus *bus,   				  struct ssb_boardinfo *bi)   { @@ -1118,7 +1310,6 @@  -			     &bi->rev);  +	bi->vendor = bus->host_pci->subsystem_vendor;  +	bi->type = bus->host_pci->subsystem_device; -+	bi->rev = bus->host_pci->revision;   }   int ssb_pci_get_invariants(struct ssb_bus *bus, @@ -1153,6 +1344,36 @@   {   	driver->probe = ssb_pcihost_probe;   	driver->remove = ssb_pcihost_remove; +--- a/drivers/ssb/pcmcia.c ++++ b/drivers/ssb/pcmcia.c +@@ -3,7 +3,7 @@ +  * PCMCIA-Hostbus related functions +  * +  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> +- * Copyright 2007-2008 Michael Buesch <mb@bu3sch.de> ++ * Copyright 2007-2008 Michael Buesch <m@bues.ch> +  * +  * Licensed under the GNU/GPL. See COPYING for details. +  */ +@@ -676,14 +676,10 @@ static int ssb_pcmcia_do_get_invariants( + 	case SSB_PCMCIA_CIS_ANTGAIN: + 		GOTO_ERROR_ON(tuple->TupleDataLen != 2, + 			"antg tpl size"); +-		sprom->antenna_gain.ghz24.a0 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz24.a1 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz24.a2 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz24.a3 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz5.a0 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz5.a1 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz5.a2 = tuple->TupleData[1]; +-		sprom->antenna_gain.ghz5.a3 = tuple->TupleData[1]; ++		sprom->antenna_gain.a0 = tuple->TupleData[1]; ++		sprom->antenna_gain.a1 = tuple->TupleData[1]; ++		sprom->antenna_gain.a2 = tuple->TupleData[1]; ++		sprom->antenna_gain.a3 = tuple->TupleData[1]; + 		break; + 	case SSB_PCMCIA_CIS_BFLAGS: + 		GOTO_ERROR_ON((tuple->TupleDataLen != 3) &&  --- a/drivers/ssb/scan.c  +++ b/drivers/ssb/scan.c  @@ -2,7 +2,7 @@ @@ -1196,6 +1417,36 @@   	if (!bus->nr_devices)   		bus->nr_devices = chipid_to_nrcores(bus->chip_id);   	if (bus->nr_devices > ARRAY_SIZE(bus->devices)) { +--- a/drivers/ssb/sdio.c ++++ b/drivers/ssb/sdio.c +@@ -6,7 +6,7 @@ +  * +  * Based on drivers/ssb/pcmcia.c +  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> +- * Copyright 2007-2008 Michael Buesch <mb@bu3sch.de> ++ * Copyright 2007-2008 Michael Buesch <m@bues.ch> +  * +  * Licensed under the GNU/GPL. See COPYING for details. +  * +@@ -551,14 +551,10 @@ int ssb_sdio_get_invariants(struct ssb_b + 			case SSB_SDIO_CIS_ANTGAIN: + 				GOTO_ERROR_ON(tuple->size != 2, + 					      "antg tpl size"); +-				sprom->antenna_gain.ghz24.a0 = tuple->data[1]; +-				sprom->antenna_gain.ghz24.a1 = tuple->data[1]; +-				sprom->antenna_gain.ghz24.a2 = tuple->data[1]; +-				sprom->antenna_gain.ghz24.a3 = tuple->data[1]; +-				sprom->antenna_gain.ghz5.a0 = tuple->data[1]; +-				sprom->antenna_gain.ghz5.a1 = tuple->data[1]; +-				sprom->antenna_gain.ghz5.a2 = tuple->data[1]; +-				sprom->antenna_gain.ghz5.a3 = tuple->data[1]; ++				sprom->antenna_gain.a0 = tuple->data[1]; ++				sprom->antenna_gain.a1 = tuple->data[1]; ++				sprom->antenna_gain.a2 = tuple->data[1]; ++				sprom->antenna_gain.a3 = tuple->data[1]; + 				break; + 			case SSB_SDIO_CIS_BFLAGS: + 				GOTO_ERROR_ON((tuple->size != 3) &&  --- a/drivers/ssb/sprom.c  +++ b/drivers/ssb/sprom.c  @@ -2,7 +2,7 @@ @@ -1356,7 +1607,7 @@   	u8 rssisav2g;		/* 2GHz RSSI params */   	u8 rssismc2g;   	u8 rssismf2g; -@@ -80,26 +91,104 @@ struct ssb_sprom { +@@ -80,26 +91,103 @@ struct ssb_sprom {   	u16 boardflags2_hi;	/* Board flags (bits 48-63) */   	/* TODO store board flags in a single u64 */ @@ -1465,11 +1716,10 @@   	u16 vendor;   	u16 type;  -	u16 rev; -+	u8  rev;   }; -@@ -229,10 +318,9 @@ struct ssb_driver { +@@ -229,10 +317,9 @@ struct ssb_driver {   #define drv_to_ssb_drv(_drv) container_of(_drv, struct ssb_driver, drv)   extern int __ssb_driver_register(struct ssb_driver *drv, struct module *owner); @@ -1483,7 +1733,7 @@   extern void ssb_driver_unregister(struct ssb_driver *drv); -@@ -308,7 +396,7 @@ struct ssb_bus { +@@ -308,7 +395,7 @@ struct ssb_bus {   	/* ID information about the Chip. */   	u16 chip_id; @@ -1492,7 +1742,7 @@   	u16 sprom_offset;   	u16 sprom_size;		/* number of words in sprom */   	u8 chip_package; -@@ -404,7 +492,9 @@ extern bool ssb_is_sprom_available(struc +@@ -404,7 +491,9 @@ extern bool ssb_is_sprom_available(struc   /* Set a fallback SPROM.    * See kdoc at the function definition for complete documentation. */ @@ -1503,7 +1753,7 @@   /* Suspend a SSB bus.    * Call this from the parent bus suspend routine. */ -@@ -518,6 +608,7 @@ extern int ssb_bus_may_powerdown(struct +@@ -518,6 +607,7 @@ extern int ssb_bus_may_powerdown(struct    * Otherwise static always-on powercontrol will be used. */   extern int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl); @@ -1554,6 +1804,16 @@   #define SSB_CHIPCO_HW_WORKAROUND	0x01E4 /* Hardware workaround (rev >= 20) */   #define SSB_CHIPCO_UART0_DATA		0x0300   #define SSB_CHIPCO_UART0_IMR		0x0304 +--- a/include/linux/ssb/ssb_driver_gige.h ++++ b/include/linux/ssb/ssb_driver_gige.h +@@ -2,6 +2,7 @@ + #define LINUX_SSB_DRIVER_GIGE_H_ +  + #include <linux/ssb/ssb.h> ++#include <linux/bug.h> + #include <linux/pci.h> + #include <linux/spinlock.h> +   --- a/include/linux/ssb/ssb_regs.h  +++ b/include/linux/ssb/ssb_regs.h  @@ -97,7 +97,7 @@ @@ -1565,8 +1825,53 @@   #define  SSB_TMSLOW_REJECT_23	0x00000004 /* Reject (Backplane rev 2.3) */   #define  SSB_TMSLOW_CLOCK	0x00010000 /* Clock Enable */   #define  SSB_TMSLOW_FGC		0x00020000 /* Force Gated Clocks On */ -@@ -432,6 +432,56 @@ +@@ -228,6 +228,7 @@ + #define  SSB_SPROM1_AGAIN_BG_SHIFT	0 + #define  SSB_SPROM1_AGAIN_A		0xFF00	/* A-PHY */ + #define  SSB_SPROM1_AGAIN_A_SHIFT	8 ++#define SSB_SPROM1_CCODE		0x0076 +  + /* SPROM Revision 2 (inherits from rev 1) */ + #define SSB_SPROM2_BFLHI		0x0038	/* Boardflags (high 16 bits) */ +@@ -267,6 +268,7 @@ + #define  SSB_SPROM3_OFDMGPO		0x107A	/* G-PHY OFDM Power Offset (4 bytes, BigEndian) */ +  + /* SPROM Revision 4 */ ++#define SSB_SPROM4_BOARDREV		0x0042	/* Board revision */ + #define SSB_SPROM4_BFLLO		0x0044	/* Boardflags (low 16 bits) */ + #define SSB_SPROM4_BFLHI		0x0046  /* Board Flags Hi */ + #define SSB_SPROM4_BFL2LO		0x0048	/* Board flags 2 (low 16 bits) */ +@@ -389,6 +391,11 @@ + #define  SSB_SPROM8_GPIOB_P2		0x00FF	/* Pin 2 */ + #define  SSB_SPROM8_GPIOB_P3		0xFF00	/* Pin 3 */ + #define  SSB_SPROM8_GPIOB_P3_SHIFT	8 ++#define SSB_SPROM8_LEDDC		0x009A ++#define  SSB_SPROM8_LEDDC_ON		0xFF00	/* oncount */ ++#define  SSB_SPROM8_LEDDC_ON_SHIFT	8 ++#define  SSB_SPROM8_LEDDC_OFF		0x00FF	/* offcount */ ++#define  SSB_SPROM8_LEDDC_OFF_SHIFT	0 + #define SSB_SPROM8_ANTAVAIL		0x009C  /* Antenna available bitfields*/ + #define  SSB_SPROM8_ANTAVAIL_A		0xFF00	/* A-PHY bitfield */ + #define  SSB_SPROM8_ANTAVAIL_A_SHIFT	8 +@@ -404,6 +411,13 @@ + #define  SSB_SPROM8_AGAIN2_SHIFT	0 + #define  SSB_SPROM8_AGAIN3		0xFF00	/* Antenna 3 */ + #define  SSB_SPROM8_AGAIN3_SHIFT	8 ++#define SSB_SPROM8_TXRXC		0x00A2 ++#define  SSB_SPROM8_TXRXC_TXCHAIN	0x000f ++#define  SSB_SPROM8_TXRXC_TXCHAIN_SHIFT	0 ++#define  SSB_SPROM8_TXRXC_RXCHAIN	0x00f0 ++#define  SSB_SPROM8_TXRXC_RXCHAIN_SHIFT	4 ++#define  SSB_SPROM8_TXRXC_SWITCH	0xff00 ++#define  SSB_SPROM8_TXRXC_SWITCH_SHIFT	8 + #define SSB_SPROM8_RSSIPARM2G		0x00A4	/* RSSI params for 2GHz */ + #define  SSB_SPROM8_RSSISMF2G		0x000F + #define  SSB_SPROM8_RSSISMC2G		0x00F0 +@@ -430,8 +444,87 @@ + #define  SSB_SPROM8_TRI5GH_SHIFT	8 + #define SSB_SPROM8_RXPO			0x00AC  /* RX power offsets */   #define  SSB_SPROM8_RXPO2G		0x00FF	/* 2GHz RX power offset */ ++#define  SSB_SPROM8_RXPO2G_SHIFT	0   #define  SSB_SPROM8_RXPO5G		0xFF00	/* 5GHz RX power offset */   #define  SSB_SPROM8_RXPO5G_SHIFT	8  +#define SSB_SPROM8_FEM2G		0x00AE @@ -1582,10 +1887,38 @@  +#define  SSB_SROM8_FEM_ANTSWLUT		0xF800  +#define  SSB_SROM8_FEM_ANTSWLUT_SHIFT	11  +#define SSB_SPROM8_THERMAL		0x00B2 -+#define SSB_SPROM8_MPWR_RAWTS		0x00B4 -+#define SSB_SPROM8_TS_SLP_OPT_CORRX	0x00B6 -+#define SSB_SPROM8_FOC_HWIQ_IQSWP	0x00B8 -+#define SSB_SPROM8_PHYCAL_TEMPDELTA	0x00BA ++#define  SSB_SPROM8_THERMAL_OFFSET	0x00ff ++#define  SSB_SPROM8_THERMAL_OFFSET_SHIFT	0 ++#define  SSB_SPROM8_THERMAL_TRESH	0xff00 ++#define  SSB_SPROM8_THERMAL_TRESH_SHIFT	8 ++/* Temp sense related entries */ ++#define SSB_SPROM8_RAWTS		0x00B4 ++#define  SSB_SPROM8_RAWTS_RAWTEMP	0x01ff ++#define  SSB_SPROM8_RAWTS_RAWTEMP_SHIFT	0 ++#define  SSB_SPROM8_RAWTS_MEASPOWER	0xfe00 ++#define  SSB_SPROM8_RAWTS_MEASPOWER_SHIFT	9 ++#define SSB_SPROM8_OPT_CORRX		0x00B6 ++#define  SSB_SPROM8_OPT_CORRX_TEMP_SLOPE	0x00ff ++#define  SSB_SPROM8_OPT_CORRX_TEMP_SLOPE_SHIFT	0 ++#define  SSB_SPROM8_OPT_CORRX_TEMPCORRX	0xfc00 ++#define  SSB_SPROM8_OPT_CORRX_TEMPCORRX_SHIFT	10 ++#define  SSB_SPROM8_OPT_CORRX_TEMP_OPTION	0x0300 ++#define  SSB_SPROM8_OPT_CORRX_TEMP_OPTION_SHIFT	8 ++/* FOC: freiquency offset correction, HWIQ: H/W IOCAL enable, IQSWP: IQ CAL swap disable */ ++#define SSB_SPROM8_HWIQ_IQSWP		0x00B8 ++#define  SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR	0x000f ++#define  SSB_SPROM8_HWIQ_IQSWP_FREQ_CORR_SHIFT	0 ++#define  SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP	0x0010 ++#define  SSB_SPROM8_HWIQ_IQSWP_IQCAL_SWP_SHIFT	4 ++#define  SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL	0x0020 ++#define  SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT	5 ++#define SSB_SPROM8_TEMPDELTA		0x00BA ++#define  SSB_SPROM8_TEMPDELTA_PHYCAL	0x00ff ++#define  SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT	0 ++#define  SSB_SPROM8_TEMPDELTA_PERIOD	0x0f00 ++#define  SSB_SPROM8_TEMPDELTA_PERIOD_SHIFT	8 ++#define  SSB_SPROM8_TEMPDELTA_HYSTERESIS	0xf000 ++#define  SSB_SPROM8_TEMPDELTA_HYSTERESIS_SHIFT	12  +  +/* There are 4 blocks with power info sharing the same layout */  +#define SSB_SROM8_PWR_INFO_CORE0	0x00C0 @@ -1622,7 +1955,7 @@   #define SSB_SPROM8_MAXP_BG		0x00C0  /* Max Power 2GHz in path 1 */   #define  SSB_SPROM8_MAXP_BG_MASK	0x00FF  /* Mask for Max Power 2GHz */   #define  SSB_SPROM8_ITSSI_BG		0xFF00	/* Mask for path 1 itssi_bg */ -@@ -456,12 +506,53 @@ +@@ -456,12 +549,63 @@   #define SSB_SPROM8_PA1HIB0		0x00D8	/* 5.8GHz power amp settings */   #define SSB_SPROM8_PA1HIB1		0x00DA   #define SSB_SPROM8_PA1HIB2		0x00DC @@ -1633,6 +1966,16 @@   #define SSB_SPROM8_OFDM5GLPO		0x014A	/* 5.2GHz OFDM power offset */   #define SSB_SPROM8_OFDM5GHPO		0x014E	/* 5.8GHz OFDM power offset */ ++#define SSB_SPROM8_2G_MCSPO		0x0152 ++#define SSB_SPROM8_5G_MCSPO		0x0162 ++#define SSB_SPROM8_5GL_MCSPO		0x0172 ++#define SSB_SPROM8_5GH_MCSPO		0x0182 ++ ++#define SSB_SPROM8_CDDPO		0x0192 ++#define SSB_SPROM8_STBCPO		0x0194 ++#define SSB_SPROM8_BW40PO		0x0196 ++#define SSB_SPROM8_BWDUPPO		0x0198 ++  +/* Values for boardflags_lo read from SPROM */  +#define SSB_BFL_BTCOEXIST		0x0001	/* implements Bluetooth coexistance */  +#define SSB_BFL_PACTRL			0x0002	/* GPIO 9 controlling the PA */ @@ -1676,133 +2019,3 @@   /* Values for SSB_SPROM1_BINF_CCODE */   enum {   	SSB_SPROM1CCODE_WORLD = 0, ---- a/drivers/ssb/b43_pci_bridge.c -+++ b/drivers/ssb/b43_pci_bridge.c -@@ -5,12 +5,13 @@ -  * because of its small size we include it in the SSB core -  * instead of creating a standalone module. -  * -- * Copyright 2007  Michael Buesch <mb@bu3sch.de> -+ * Copyright 2007  Michael Buesch <m@bues.ch> -  * -  * Licensed under the GNU/GPL. See COPYING for details. -  */ -  - #include <linux/pci.h> -+#include <linux/module.h> - #include <linux/ssb/ssb.h> -  - #include "ssb_private.h" ---- a/drivers/ssb/driver_extif.c -+++ b/drivers/ssb/driver_extif.c -@@ -3,7 +3,7 @@ -  * Broadcom EXTIF core driver -  * -  * Copyright 2005, Broadcom Corporation -- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> -+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> -  * Copyright 2006, 2007, Felix Fietkau <nbd@openwrt.org> -  * Copyright 2007, Aurelien Jarno <aurelien@aurel32.net> -  * ---- a/drivers/ssb/driver_mipscore.c -+++ b/drivers/ssb/driver_mipscore.c -@@ -3,7 +3,7 @@ -  * Broadcom MIPS core driver -  * -  * Copyright 2005, Broadcom Corporation -- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> -+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> -  * -  * Licensed under the GNU/GPL. See COPYING for details. -  */ -@@ -208,6 +208,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m - 	struct ssb_bus *bus = mcore->dev->bus; - 	u32 pll_type, n, m, rate = 0; -  -+	if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU) -+		return ssb_pmu_get_cpu_clock(&bus->chipco); -+ - 	if (bus->extif.dev) { - 		ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m); - 	} else if (bus->chipco.dev) { ---- a/drivers/ssb/embedded.c -+++ b/drivers/ssb/embedded.c -@@ -3,7 +3,7 @@ -  * Embedded systems support code -  * -  * Copyright 2005-2008, Broadcom Corporation -- * Copyright 2006-2008, Michael Buesch <mb@bu3sch.de> -+ * Copyright 2006-2008, Michael Buesch <m@bues.ch> -  * -  * Licensed under the GNU/GPL. See COPYING for details. -  */ ---- a/drivers/ssb/pcmcia.c -+++ b/drivers/ssb/pcmcia.c -@@ -3,7 +3,7 @@ -  * PCMCIA-Hostbus related functions -  * -  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> -- * Copyright 2007-2008 Michael Buesch <mb@bu3sch.de> -+ * Copyright 2007-2008 Michael Buesch <m@bues.ch> -  * -  * Licensed under the GNU/GPL. See COPYING for details. -  */ -@@ -676,14 +676,10 @@ static int ssb_pcmcia_do_get_invariants( - 	case SSB_PCMCIA_CIS_ANTGAIN: - 		GOTO_ERROR_ON(tuple->TupleDataLen != 2, - 			"antg tpl size"); --		sprom->antenna_gain.ghz24.a0 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz24.a1 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz24.a2 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz24.a3 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz5.a0 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz5.a1 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz5.a2 = tuple->TupleData[1]; --		sprom->antenna_gain.ghz5.a3 = tuple->TupleData[1]; -+		sprom->antenna_gain.a0 = tuple->TupleData[1]; -+		sprom->antenna_gain.a1 = tuple->TupleData[1]; -+		sprom->antenna_gain.a2 = tuple->TupleData[1]; -+		sprom->antenna_gain.a3 = tuple->TupleData[1]; - 		break; - 	case SSB_PCMCIA_CIS_BFLAGS: - 		GOTO_ERROR_ON((tuple->TupleDataLen != 3) && ---- a/drivers/ssb/sdio.c -+++ b/drivers/ssb/sdio.c -@@ -6,7 +6,7 @@ -  * -  * Based on drivers/ssb/pcmcia.c -  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> -- * Copyright 2007-2008 Michael Buesch <mb@bu3sch.de> -+ * Copyright 2007-2008 Michael Buesch <m@bues.ch> -  * -  * Licensed under the GNU/GPL. See COPYING for details. -  * -@@ -551,14 +551,10 @@ int ssb_sdio_get_invariants(struct ssb_b - 			case SSB_SDIO_CIS_ANTGAIN: - 				GOTO_ERROR_ON(tuple->size != 2, - 					      "antg tpl size"); --				sprom->antenna_gain.ghz24.a0 = tuple->data[1]; --				sprom->antenna_gain.ghz24.a1 = tuple->data[1]; --				sprom->antenna_gain.ghz24.a2 = tuple->data[1]; --				sprom->antenna_gain.ghz24.a3 = tuple->data[1]; --				sprom->antenna_gain.ghz5.a0 = tuple->data[1]; --				sprom->antenna_gain.ghz5.a1 = tuple->data[1]; --				sprom->antenna_gain.ghz5.a2 = tuple->data[1]; --				sprom->antenna_gain.ghz5.a3 = tuple->data[1]; -+				sprom->antenna_gain.a0 = tuple->data[1]; -+				sprom->antenna_gain.a1 = tuple->data[1]; -+				sprom->antenna_gain.a2 = tuple->data[1]; -+				sprom->antenna_gain.a3 = tuple->data[1]; - 				break; - 			case SSB_SDIO_CIS_BFLAGS: - 				GOTO_ERROR_ON((tuple->size != 3) && ---- a/include/linux/ssb/ssb_driver_gige.h -+++ b/include/linux/ssb/ssb_driver_gige.h -@@ -2,6 +2,7 @@ - #define LINUX_SSB_DRIVER_GIGE_H_ -  - #include <linux/ssb/ssb.h> -+#include <linux/bug.h> - #include <linux/pci.h> - #include <linux/spinlock.h> -   | 
