diff mbox

[V4] ssb: Implement virtual SPROM

Message ID 4bac487c.j3EXBzCzHYNAd+Ky%Larry.Finger@lwfinger.net (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Larry Finger March 26, 2010, 5:39 a.m. UTC
None
diff mbox

Patch

Index: wireless-testing/drivers/ssb/pci.c
===================================================================
--- wireless-testing.orig/drivers/ssb/pci.c
+++ wireless-testing/drivers/ssb/pci.c
@@ -613,6 +613,67 @@  static int sprom_extract(struct ssb_bus
 	return 0;
 }
 
+static void ssb_get_vsprom(struct ssb_sprom *sprom)
+{
+	/* Get values that would have been extracted from SPROM.
+	 * If sprom_extract_r8() is changed, this section must be
+	 * changed as well. For any device with 5GHz capability,
+	 * some variables will have to be changed.
+	 */
+	sprom->revision = 8;
+	sprom->boardflags_lo = 0x0A01;
+	sprom->boardflags_hi = 0x0006;
+	sprom->boardflags2_lo = 0x0000;
+	sprom->boardflags2_hi = 0x0000;
+	sprom->ant_available_a = 0x00;
+	sprom->ant_available_bg = 0x03;
+	sprom->maxpwr_bg = 0x4A;
+	sprom->itssi_bg = 0x3E;
+	sprom->maxpwr_a = 0xFF;
+	sprom->itssi_a = 0xFF;
+	sprom->maxpwr_ah = 0xFF;
+	sprom->maxpwr_al = 0xFF;
+	sprom->gpio0 = 0x83;
+	sprom->gpio1 = 0xFF;
+	sprom->gpio2 = 0xFF;
+	sprom->gpio3 = 0xFF;
+	sprom->tri2g = 0x6C;
+	sprom->tri5g = 0x00;
+	sprom->tri5gl = 0xFF;
+	sprom->tri5gh = 0xFF;
+	sprom->rxpo2g = 0xFA;
+	sprom->rxpo5g = 0xFF;
+	sprom->rssismf2g = 0x0F;
+	sprom->rssismc2g = 0x00;
+	sprom->rssisav2g = 0x00;
+	sprom->bxa2g = 0x00;
+	sprom->rssismf5g = 0x0F;
+	sprom->rssismc5g = 0x0F;
+	sprom->rssisav5g = 0x07;
+	sprom->bxa5g = 0x03;
+	sprom->pa0b0 = 0x1a57;
+	sprom->pa0b1 = 0xF98A;
+	sprom->pa0b2 = 0xFE91;
+	sprom->pa1b0 = 0xFFFF;
+	sprom->pa1b1 = 0xFFFF;
+	sprom->pa1b2 = 0xFFFF;
+	sprom->pa1lob0 = 0xFFFF;
+	sprom->pa1lob1 = 0xFFFF;
+	sprom->pa1lob2 = 0xFFFF;
+	sprom->pa1hib0 = 0xFFFF;
+	sprom->pa1hib1 = 0xFFFF;
+	sprom->pa1hib2 = 0xFFFF;
+	sprom->cck2gpo = 0xFFFF;
+	sprom->ofdm2gpo = 0x00000002;
+	sprom->ofdm5glpo = 0xFFFFFFFF;
+	sprom->ofdm5gpo = 0xFFFFFFFF;
+	sprom->ofdm5ghpo = 0xFFFFFFFF;
+	/* assign a dummy, but usable, MAC address */
+	memset(sprom->il0mac, 0x82, 6);
+	memset(sprom->et0mac, 0xFF, 6);
+	memset(sprom->et1mac, 0xFF, 6);
+}
+
 static int ssb_pci_sprom_get(struct ssb_bus *bus,
 			     struct ssb_sprom *sprom)
 {
@@ -621,8 +682,9 @@  static int ssb_pci_sprom_get(struct ssb_
 	u16 *buf;
 
 	if (!ssb_is_sprom_available(bus)) {
-		ssb_printk(KERN_ERR PFX "No SPROM available!\n");
-		return -ENODEV;
+		/* This device has no SPROM. Get values from a real SPROM */
+		ssb_get_vsprom(sprom);
+		return 0;
 	}
 
 	buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
Index: wireless-testing/drivers/net/wireless/b43/main.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/b43/main.c
+++ wireless-testing/drivers/net/wireless/b43/main.c
@@ -4395,6 +4395,7 @@  static int b43_op_add_interface(struct i
 	struct b43_wl *wl = hw_to_b43_wl(hw);
 	struct b43_wldev *dev;
 	int err = -EOPNOTSUPP;
+	u8 test_addr[] = {0x82, 0x82, 0x82, 0x82, 0x82, 0x82};
 
 	/* TODO: allow WDS/AP devices to coexist */
 
@@ -4417,6 +4418,19 @@  static int b43_op_add_interface(struct i
 	wl->if_type = vif->type;
 	memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
 
+	/* Check if address given when device has no SPROM is still present */
+	if (compare_ether_addr(wl->mac_addr, test_addr) == 0) {
+		printk(KERN_INFO "b43: **************************\n");
+		printk(KERN_INFO "     The hardware address matches the one "
+				       "assigned for devices\n");
+		printk(KERN_INFO "     with no SPROM. To ensure that your address"
+				       " is unique go to\n");
+		printk(KERN_INFO "     http://wireless.kernel.org/en/users/"
+				       "Drivers/b43");
+		printk(KERN_INFO "     to download and install the necessary"
+				       " udev rules.\n");
+		printk(KERN_INFO "     **************************\n");
+	}
 	b43_adjust_opmode(dev);
 	b43_set_pretbtt(dev);
 	b43_set_synth_pu_delay(dev, 0);