diff options
Diffstat (limited to 'drivers/ssb/pci.c')
| -rw-r--r-- | drivers/ssb/pci.c | 120 | 
1 files changed, 63 insertions, 57 deletions
diff --git a/drivers/ssb/pci.c b/drivers/ssb/pci.c index e9d94968f39..a8dc95ebf2d 100644 --- a/drivers/ssb/pci.c +++ b/drivers/ssb/pci.c @@ -56,7 +56,7 @@ int ssb_pci_switch_coreidx(struct ssb_bus *bus, u8 coreidx)  	}  	return 0;  error: -	ssb_printk(KERN_ERR PFX "Failed to switch to core %u\n", coreidx); +	ssb_err("Failed to switch to core %u\n", coreidx);  	return -ENODEV;  } @@ -67,10 +67,9 @@ int ssb_pci_switch_core(struct ssb_bus *bus,  	unsigned long flags;  #if SSB_VERBOSE_PCICORESWITCH_DEBUG -	ssb_printk(KERN_INFO PFX -		   "Switching to %s core, index %d\n", -		   ssb_core_name(dev->id.coreid), -		   dev->core_index); +	ssb_info("Switching to %s core, index %d\n", +		 ssb_core_name(dev->id.coreid), +		 dev->core_index);  #endif  	spin_lock_irqsave(&bus->bar_lock, flags); @@ -231,6 +230,15 @@ static inline u8 ssb_crc8(u8 crc, u8 data)  	return t[crc ^ data];  } +static void sprom_get_mac(char *mac, const u16 *in) +{ +	int i; +	for (i = 0; i < 3; i++) { +		*mac++ = in[i] >> 8; +		*mac++ = in[i]; +	} +} +  static u8 ssb_sprom_crc(const u16 *sprom, u16 size)  {  	int word; @@ -278,7 +286,7 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)  	u32 spromctl;  	u16 size = bus->sprom_size; -	ssb_printk(KERN_NOTICE PFX "Writing SPROM. Do NOT turn off the power! Please stand by...\n"); +	ssb_notice("Writing SPROM. Do NOT turn off the power! Please stand by...\n");  	err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl);  	if (err)  		goto err_ctlreg; @@ -286,17 +294,17 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)  	err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl);  	if (err)  		goto err_ctlreg; -	ssb_printk(KERN_NOTICE PFX "[ 0%%"); +	ssb_notice("[ 0%%");  	msleep(500);  	for (i = 0; i < size; i++) {  		if (i == size / 4) -			ssb_printk("25%%"); +			ssb_cont("25%%");  		else if (i == size / 2) -			ssb_printk("50%%"); +			ssb_cont("50%%");  		else if (i == (size * 3) / 4) -			ssb_printk("75%%"); +			ssb_cont("75%%");  		else if (i % 2) -			ssb_printk("."); +			ssb_cont(".");  		writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2));  		mmiowb();  		msleep(20); @@ -309,12 +317,12 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)  	if (err)  		goto err_ctlreg;  	msleep(500); -	ssb_printk("100%% ]\n"); -	ssb_printk(KERN_NOTICE PFX "SPROM written.\n"); +	ssb_cont("100%% ]\n"); +	ssb_notice("SPROM written\n");  	return 0;  err_ctlreg: -	ssb_printk(KERN_ERR PFX "Could not access SPROM control register.\n"); +	ssb_err("Could not access SPROM control register.\n");  	return err;  } @@ -339,10 +347,23 @@ static s8 r123_extract_antgain(u8 sprom_revision, const u16 *in,  	return (s8)gain;  } +static void sprom_extract_r23(struct ssb_sprom *out, const u16 *in) +{ +	SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0); +	SPEX(opo, SSB_SPROM2_OPO, SSB_SPROM2_OPO_VALUE, 0); +	SPEX(pa1lob0, SSB_SPROM2_PA1LOB0, 0xFFFF, 0); +	SPEX(pa1lob1, SSB_SPROM2_PA1LOB1, 0xFFFF, 0); +	SPEX(pa1lob2, SSB_SPROM2_PA1LOB2, 0xFFFF, 0); +	SPEX(pa1hib0, SSB_SPROM2_PA1HIB0, 0xFFFF, 0); +	SPEX(pa1hib1, SSB_SPROM2_PA1HIB1, 0xFFFF, 0); +	SPEX(pa1hib2, SSB_SPROM2_PA1HIB2, 0xFFFF, 0); +	SPEX(maxpwr_ah, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_HI, 0); +	SPEX(maxpwr_al, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_LO, +	     SSB_SPROM2_MAXP_A_LO_SHIFT); +} +  static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)  { -	int i; -	u16 v;  	u16 loc[3];  	if (out->revision == 3)			/* rev 3 moved MAC */ @@ -352,19 +373,10 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)  		loc[1] = SSB_SPROM1_ET0MAC;  		loc[2] = SSB_SPROM1_ET1MAC;  	} -	for (i = 0; i < 3; i++) { -		v = in[SPOFF(loc[0]) + i]; -		*(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); -	} +	sprom_get_mac(out->il0mac, &in[SPOFF(loc[0])]);  	if (out->revision < 3) { 	/* only rev 1-2 have et0, et1 */ -		for (i = 0; i < 3; i++) { -			v = in[SPOFF(loc[1]) + i]; -			*(((__be16 *)out->et0mac) + i) = cpu_to_be16(v); -		} -		for (i = 0; i < 3; i++) { -			v = in[SPOFF(loc[2]) + i]; -			*(((__be16 *)out->et1mac) + i) = cpu_to_be16(v); -		} +		sprom_get_mac(out->et0mac, &in[SPOFF(loc[1])]); +		sprom_get_mac(out->et1mac, &in[SPOFF(loc[2])]);  	}  	SPEX(et0phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0A, 0);  	SPEX(et1phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1A, @@ -372,6 +384,7 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)  	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(board_type, SSB_SPROM1_SPID, 0xFFFF, 0);  	if (out->revision == 1)  		SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE,  		     SSB_SPROM1_BINF_CCODE_SHIFT); @@ -398,8 +411,7 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)  	     SSB_SPROM1_ITSSI_A_SHIFT);  	SPEX(itssi_bg, SSB_SPROM1_ITSSI, SSB_SPROM1_ITSSI_BG, 0);  	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); @@ -410,6 +422,8 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)  	out->antenna_gain.a1 = r123_extract_antgain(out->revision, in,  						    SSB_SPROM1_AGAIN_A,  						    SSB_SPROM1_AGAIN_A_SHIFT); +	if (out->revision >= 2) +		sprom_extract_r23(out, in);  }  /* Revs 4 5 and 8 have partially shared layout */ @@ -454,23 +468,20 @@ static void sprom_extract_r458(struct ssb_sprom *out, const u16 *in)  static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)  { -	int i; -	u16 v;  	u16 il0mac_offset;  	if (out->revision == 4)  		il0mac_offset = SSB_SPROM4_IL0MAC;  	else  		il0mac_offset = SSB_SPROM5_IL0MAC; -	/* extract the MAC address */ -	for (i = 0; i < 3; i++) { -		v = in[SPOFF(il0mac_offset) + i]; -		*(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); -	} + +	sprom_get_mac(out->il0mac, &in[SPOFF(il0mac_offset)]); +  	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); +	SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0);  	if (out->revision == 4) {  		SPEX(alpha2[0], SSB_SPROM4_CCODE, 0xff00, 8);  		SPEX(alpha2[1], SSB_SPROM4_CCODE, 0x00ff, 0); @@ -530,7 +541,7 @@ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)  static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)  {  	int i; -	u16 v, o; +	u16 o;  	u16 pwr_info_offset[] = {  		SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1,  		SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3 @@ -539,11 +550,10 @@ static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)  			ARRAY_SIZE(out->core_pwr_info));  	/* extract the MAC address */ -	for (i = 0; i < 3; i++) { -		v = in[SPOFF(SSB_SPROM8_IL0MAC) + i]; -		*(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); -	} +	sprom_get_mac(out->il0mac, &in[SPOFF(SSB_SPROM8_IL0MAC)]); +  	SPEX(board_rev, SSB_SPROM8_BOARDREV, 0xFFFF, 0); +	SPEX(board_type, SSB_SPROM1_SPID, 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); @@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out,  	memset(out, 0, sizeof(*out));  	out->revision = in[size - 1] & 0x00FF; -	ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); +	ssb_dbg("SPROM revision %d detected\n", out->revision);  	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 *bus, struct ssb_sprom *out,  		 * number stored in the SPROM.  		 * Always extract r1. */  		out->revision = 1; -		ssb_dprintk(KERN_DEBUG PFX "SPROM treated as revision %d\n", out->revision); +		ssb_dbg("SPROM treated as revision %d\n", out->revision);  	}  	switch (out->revision) { @@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out,  		sprom_extract_r8(out, in);  		break;  	default: -		ssb_printk(KERN_WARNING PFX "Unsupported SPROM" -			   " revision %d detected. Will extract" -			   " v1\n", out->revision); +		ssb_warn("Unsupported SPROM revision %d detected. Will extract v1\n", +			 out->revision);  		out->revision = 1;  		sprom_extract_r123(out, in);  	} @@ -791,7 +800,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,  	u16 *buf;  	if (!ssb_is_sprom_available(bus)) { -		ssb_printk(KERN_ERR PFX "No SPROM available!\n"); +		ssb_err("No SPROM available!\n");  		return -ENODEV;  	}  	if (bus->chipco.dev) {	/* can be unavailable! */ @@ -810,7 +819,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,  	} else {  		bus->sprom_offset = SSB_SPROM_BASE1;  	} -	ssb_dprintk(KERN_INFO PFX "SPROM offset is 0x%x\n", bus->sprom_offset); +	ssb_dbg("SPROM offset is 0x%x\n", bus->sprom_offset);  	buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);  	if (!buf) @@ -835,18 +844,15 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,  			 * available for this device in some other storage */  			err = ssb_fill_sprom_with_fallback(bus, sprom);  			if (err) { -				ssb_printk(KERN_WARNING PFX "WARNING: Using" -					   " fallback SPROM failed (err %d)\n", -					   err); +				ssb_warn("WARNING: Using fallback SPROM failed (err %d)\n", +					 err);  			} else { -				ssb_dprintk(KERN_DEBUG PFX "Using SPROM" -					    " revision %d provided by" -					    " platform.\n", sprom->revision); +				ssb_dbg("Using SPROM revision %d provided by platform\n", +					sprom->revision);  				err = 0;  				goto out_free;  			} -			ssb_printk(KERN_WARNING PFX "WARNING: Invalid" -				   " SPROM CRC (corrupt SPROM)\n"); +			ssb_warn("WARNING: Invalid SPROM CRC (corrupt SPROM)\n");  		}  	}  	err = sprom_extract(bus, sprom, buf, bus->sprom_size);  |