On Friday 26 March 2010, Larry Finger wrote:
>Some recent BCM43XX devices lack an on-board SPROM. The pertinent data
>from the SPROM could be included in the kernel; however, this presents
>a problem in the generation of a unique, reproducible MAC address. The
>solution is to initialize the address to a known, workable value. Thus,
>the device will work without any further code. For an address that is
>preserved across reloads or reboots, a set of udev routines has been
>prepared that detect the special address and assign a random value that
>is preserved in a second udev rule file. The random address should be
>unique except for the case where a given box has more than one of these
>cards. This case is handles by adding the DEVPATH to the recognition
> rules.
>
>Signed-off-by: Larry Finger <larry.fin...@lwfinger.net>

This I assume does not do anything for the idiot vendor who ships thousands 
of bt dongles all with 11:11:11:11:11:11 set as the mac address?  I got 
stung with 2 of those things.

>---
>
>John,
>
>It has been a long path, but this solution satisfies all the criticisms
>that have been posted.
>
>I suspect it is a little to invasive for 2.6.34. In addition, it fixes
>a bug, but not a regression. As to introducing a regression, that could
>only happen if ssb_is_sprom_available() returns false for some device
>that does have an SPROM.
>
>Larry
>---
>
>V2 - make virtual SPROM loading asynchronous.
>V3 - eliminate the need for a special external utility
>   - set for unique MAC address even if a box has more than one of these
>     devices
>V4 - handle the requirements without any "firmware" routines.
>
>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);
>_______________________________________________
>Bcm43xx-dev mailing list
>Bcm43xx-dev@lists.berlios.de
>https://lists.berlios.de/mailman/listinfo/bcm43xx-dev
>


-- 
Cheers, Gene
"There are four boxes to be used in defense of liberty:
 soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author)

If at first you do succeed, try to hide your astonishment.
_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to