Skip to content

Commit

Permalink
libertas: add sysfs hooks to update boot2 and persistent firmware
Browse files Browse the repository at this point in the history
To use these features, copy the boot2 and firmware images to /lib/firmware and:

echo <boot2_image_name> > /sys/class/net/ethX/lbs_flash_boot2
echo <firmware_image_name> > /sys/class/net/ethX/lbs_flash_fw

Signed-off-by: Brian Cavagnolo <brian@cozybit.com>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Brian Cavagnolo authored and John W. Linville committed Aug 22, 2008
1 parent 1556c0f commit 1ff41eb
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions drivers/net/wireless/libertas/if_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,62 @@ static void if_usb_free(struct if_usb_card *cardp);
static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
static int if_usb_reset_device(struct if_usb_card *cardp);

/* sysfs hooks */

/**
* Set function to write firmware to device's persistent memory
*/
static ssize_t if_usb_firmware_set(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct lbs_private *priv = to_net_dev(dev)->priv;
struct if_usb_card *cardp = priv->card;
char fwname[FIRMWARE_NAME_MAX];
int ret;

sscanf(buf, "%29s", fwname); /* FIRMWARE_NAME_MAX - 1 = 29 */
ret = if_usb_prog_firmware(cardp, fwname, BOOT_CMD_UPDATE_FW);
if (ret == 0)
return count;

return ret;
}

/**
* lbs_flash_fw attribute to be exported per ethX interface through sysfs
* (/sys/class/net/ethX/lbs_flash_fw). Use this like so to write firmware to
* the device's persistent memory:
* echo usb8388-5.126.0.p5.bin > /sys/class/net/ethX/lbs_flash_fw
*/
static DEVICE_ATTR(lbs_flash_fw, 0200, NULL, if_usb_firmware_set);

/**
* Set function to write firmware to device's persistent memory
*/
static ssize_t if_usb_boot2_set(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct lbs_private *priv = to_net_dev(dev)->priv;
struct if_usb_card *cardp = priv->card;
char fwname[FIRMWARE_NAME_MAX];
int ret;

sscanf(buf, "%29s", fwname); /* FIRMWARE_NAME_MAX - 1 = 29 */
ret = if_usb_prog_firmware(cardp, fwname, BOOT_CMD_UPDATE_BOOT2);
if (ret == 0)
return count;

return ret;
}

/**
* lbs_flash_boot2 attribute to be exported per ethX interface through sysfs
* (/sys/class/net/ethX/lbs_flash_boot2). Use this like so to write firmware
* to the device's persistent memory:
* echo usb8388-5.126.0.p5.bin > /sys/class/net/ethX/lbs_flash_boot2
*/
static DEVICE_ATTR(lbs_flash_boot2, 0200, NULL, if_usb_boot2_set);

/**
* @brief call back function to handle the status of the URB
* @param urb pointer to urb structure
Expand Down Expand Up @@ -263,6 +319,12 @@ static int if_usb_probe(struct usb_interface *intf,
usb_get_dev(udev);
usb_set_intfdata(intf, cardp);

if (device_create_file(&priv->dev->dev, &dev_attr_lbs_flash_fw))
lbs_pr_err("cannot register lbs_flash_fw attribute\n");

if (device_create_file(&priv->dev->dev, &dev_attr_lbs_flash_boot2))
lbs_pr_err("cannot register lbs_flash_boot2 attribute\n");

return 0;

err_start_card:
Expand All @@ -288,6 +350,9 @@ static void if_usb_disconnect(struct usb_interface *intf)

lbs_deb_enter(LBS_DEB_MAIN);

device_remove_file(&priv->dev->dev, &dev_attr_lbs_flash_boot2);
device_remove_file(&priv->dev->dev, &dev_attr_lbs_flash_fw);

cardp->surprise_removed = 1;

if (priv) {
Expand Down

0 comments on commit 1ff41eb

Please sign in to comment.