From: Michael Buesch <mb@bu3sch.de>
To: Larry Finger <Larry.Finger@lwfinger.net>
Cc: John W Linville <linville@tuxdriver.com>,
bcm43xx-dev@lists.berlios.de, linux-wireless@vger.kernel.org
Subject: Re: [PATCH] ssb: Implement virtual SPROM on disk
Date: Sun, 21 Mar 2010 10:40:30 +0100 [thread overview]
Message-ID: <201003211040.31118.mb@bu3sch.de> (raw)
In-Reply-To: <4ba564fb.PfAZePu8tStyxs44%Larry.Finger@lwfinger.net>
On Sunday 21 March 2010 01:14:51 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 has been to create a utility that generates a virtual SPROM
> image with a random MAC address. This image is stored in the firmware
> area, and loaded using the asyncronous firmware load facility.
>
> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
> ---
>
> Michael,
>
> I think this patch eliminates the need for the fallback sprom code; however,
> I have not touched that facility yet.
>
> Larry
> ---
>
> Index: wireless-testing/drivers/ssb/pci.c
> ===================================================================
> --- wireless-testing.orig/drivers/ssb/pci.c
> +++ wireless-testing/drivers/ssb/pci.c
> @@ -19,6 +19,7 @@
> #include <linux/ssb/ssb_regs.h>
> #include <linux/pci.h>
> #include <linux/delay.h>
> +#include <linux/firmware.h>
>
> #include "ssb_private.h"
>
> @@ -613,6 +614,39 @@ static int sprom_extract(struct ssb_bus
> return 0;
> }
>
> +static int ssb_get_vsprom(struct device *dev, u16 *buf, size_t size)
> +{
> + /* Use the firmware load facility to get the disk image of an SPROM */
> + const struct firmware *blob;
> + int err;
> + int i;
> +
> + err = request_firmware(&blob, "ssb/vsprom_image", dev);
Well, this has the problem every synchronous firmware fetching mechanism has:
bootup with builtin module.
I think it should be done asynchronously.
> + if (err) {
> + printk(KERN_ERR "ssb: The BCM43XX device does not have an "
> + "SPROM built in, and the virtual SPROM file is not"
> + " available.\n");
> + printk(KERN_ERR "ssb: Please go to "
> + "http://wireless.kernel.org/en/users/Drivers/b43 "
> + "and download the utility to create the file.\n");
> + return err;
> + }
> + if (blob->size != size * 2) {
> + printk(KERN_ERR "ssb: The virtual SPROM file has the wrong"
> + " size\n");
> + return -ENOENT;
> + }
> + for (i = 0; i < size; i++)
> + buf[i] = blob->data[2 * i + 1] << 8 | blob->data[2 * i];
> + err = sprom_check_crc(buf, size);
> + if (err) {
> + printk(KERN_ERR "ssb: Invalid CRC for virtual SPROM\n");
> + return err;
> + }
> +
> + return 0;
> +}
> +
> static int ssb_pci_sprom_get(struct ssb_bus *bus,
> struct ssb_sprom *sprom)
> {
> @@ -620,8 +654,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)) {
> + buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
> + GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> + bus->sprom_size = SSB_SPROMSIZE_WORDS_R4;
> + if (ssb_get_vsprom(&bus->host_pci->dev, buf, bus->sprom_size)) {
> + err = -ENODEV;
> + goto out_free;
> + }
> + goto extract;
> + }
>
> buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
> if (!buf)
> @@ -653,6 +697,7 @@ static int ssb_pci_sprom_get(struct ssb_
> " SPROM CRC (corrupt SPROM)\n");
> }
> }
> +extract:
> err = sprom_extract(bus, sprom, buf, bus->sprom_size);
>
> out_free:
>
>
--
Greetings, Michael.
prev parent reply other threads:[~2010-03-21 9:40 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-21 0:14 [PATCH] ssb: Implement virtual SPROM on disk Larry Finger
2010-03-21 9:40 ` Michael Buesch [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201003211040.31118.mb@bu3sch.de \
--to=mb@bu3sch.de \
--cc=Larry.Finger@lwfinger.net \
--cc=bcm43xx-dev@lists.berlios.de \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.