On Tuesday 23 March 2010 20:13:54 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 use a file in /lib/firmware/ssb, which has some "random"
> information generated by /bin/dbus-uuidgen. This file is loaded using the
> asynchronous firmware facility and a MAC address is generated from those
> data. To prevent multiple devices in a single box from having the same
> MAC address, the last two digits are replaced by the bus numbers of the
> device.
> 
> Signed-off-by: Larry Finger <larry.fin...@lwfinger.net>
> ---
> 
> John,
> 
> Unless someone comes up with a unique way to generate a MAC address using
> only udev rules, I think this is ready.

Please take a look at Calvin Walton's RFC.
It would avoid the need for abusing the firmware loading mechanism.

> +     /* Input MAC address data in ASCII - get low nibble in binary */
> +     for (i = 0 ; i < 8; i++) {
> +             u8 tmp = ascii_to_bin(fw->data[2 * i]);
> +             u8 tmp1 = ascii_to_bin(fw->data[2 * i + 1]);
> +             buf2[i] = tmp << 4 | tmp1;
> +     }

You would basically initialize the mac address to FFFFFFFFFFFF here and
udev would take care of the rest.

>  static int ssb_pci_sprom_get(struct ssb_bus *bus,
>                            struct ssb_sprom *sprom)
>  {
> @@ -620,8 +735,18 @@ static int ssb_pci_sprom_get(struct ssb_
>       int err = -ENOMEM;
>       u16 *buf;
>  
> -     if (!ssb_is_sprom_available(bus))
> -             return -ENODEV;
> +     if (!ssb_is_sprom_available(bus)) {
> +             /* This device has no SPROM. Try for a random MAC address */
> +             err = request_firmware_nowait(THIS_MODULE,
> +                     FW_ACTION_HOTPLUG, "ssb/mac_addr",
> +                     &bus->host_pci->dev, GFP_KERNEL, bus,
> +                     ssb_get_vsprom);

Well, I'm not sure how this is supposed to work. What happens if a part of ssb
or b43 uses the SPROM data structure, but ssb_get_vsprom() didn't run, yet?

So: Get rid of the firmware fetching stuff completely and do it via udev.
It reduces the headache by a few magnitudes of headachenesses.

> +             if (err) {
> +                     ssb_vsprom_load_failed();
> +                     return err;
> +             }
> +             return 0;
> +     }
>  
>       buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
>       if (!buf)
-- 
Greetings, Michael.
_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to