p54: convert to sysdata API
Signed-off-by: Luis R. Rodriguez <mcgrof@kernel.org>
diff --git a/drivers/net/wireless/intersil/p54/eeprom.c b/drivers/net/wireless/intersil/p54/eeprom.c
index 2fe713e..983f7ae 100644
--- a/drivers/net/wireless/intersil/p54/eeprom.c
+++ b/drivers/net/wireless/intersil/p54/eeprom.c
@@ -16,7 +16,7 @@
* published by the Free Software Foundation.
*/
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <linux/sort.h>
#include <linux/slab.h>
diff --git a/drivers/net/wireless/intersil/p54/fwio.c b/drivers/net/wireless/intersil/p54/fwio.c
index 257a9ead..6bc8463 100644
--- a/drivers/net/wireless/intersil/p54/fwio.c
+++ b/drivers/net/wireless/intersil/p54/fwio.c
@@ -17,7 +17,7 @@
*/
#include <linux/slab.h>
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <linux/export.h>
@@ -27,7 +27,8 @@
#include "eeprom.h"
#include "lmac.h"
-int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
+int p54_parse_firmware(struct ieee80211_hw *dev,
+ const struct sysdata_file *fw)
{
struct p54_common *priv = dev->priv;
struct exp_if *exp_if;
diff --git a/drivers/net/wireless/intersil/p54/led.c b/drivers/net/wireless/intersil/p54/led.c
index 9a8fedd..b9f1808 100644
--- a/drivers/net/wireless/intersil/p54/led.c
+++ b/drivers/net/wireless/intersil/p54/led.c
@@ -16,7 +16,7 @@
* published by the Free Software Foundation.
*/
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <net/mac80211.h>
diff --git a/drivers/net/wireless/intersil/p54/main.c b/drivers/net/wireless/intersil/p54/main.c
index 7805864..be4870d 100644
--- a/drivers/net/wireless/intersil/p54/main.c
+++ b/drivers/net/wireless/intersil/p54/main.c
@@ -17,7 +17,7 @@
*/
#include <linux/slab.h>
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <linux/module.h>
diff --git a/drivers/net/wireless/intersil/p54/p54.h b/drivers/net/wireless/intersil/p54/p54.h
index 40b401e..e104aa5 100644
--- a/drivers/net/wireless/intersil/p54/p54.h
+++ b/drivers/net/wireless/intersil/p54/p54.h
@@ -268,7 +268,8 @@
/* interfaces for the drivers */
int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb);
void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb);
-int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw);
+int p54_parse_firmware(struct ieee80211_hw *dev,
+ const struct sysdata_file *fw);
int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len);
int p54_read_eeprom(struct ieee80211_hw *dev);
diff --git a/drivers/net/wireless/intersil/p54/p54pci.c b/drivers/net/wireless/intersil/p54/p54pci.c
index 27a4906..7dc44d1 100644
--- a/drivers/net/wireless/intersil/p54/p54pci.c
+++ b/drivers/net/wireless/intersil/p54/p54pci.c
@@ -15,7 +15,7 @@
#include <linux/pci.h>
#include <linux/slab.h>
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <linux/delay.h>
#include <linux/completion.h>
@@ -490,7 +490,7 @@
return 0;
}
-static void p54p_firmware_step2(const struct firmware *fw,
+static void p54p_firmware_step2(const struct sysdata_file *fw,
void *context)
{
struct p54p_priv *priv = context;
@@ -520,8 +520,6 @@
out:
- complete(&priv->fw_loaded);
-
if (err) {
struct device *parent = pdev->dev.parent;
@@ -542,6 +540,17 @@
pci_dev_put(pdev);
}
+static int p54p_load_firmware(struct p54p_priv *priv)
+{
+ const struct sysdata_file_desc sysdata_desc = {
+ SYSDATA_DEFAULT_ASYNC(p54p_firmware_step2, priv),
+ };
+
+ return sysdata_file_request_async("isl3886pci", &sysdata_desc,
+ &priv->pdev->dev,
+ &priv->fw_async_cookie);
+}
+
static int p54p_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
@@ -595,7 +604,6 @@
priv = dev->priv;
priv->pdev = pdev;
- init_completion(&priv->fw_loaded);
SET_IEEE80211_DEV(dev, &pdev->dev);
pci_set_drvdata(pdev, dev);
@@ -620,9 +628,7 @@
spin_lock_init(&priv->lock);
tasklet_init(&priv->tasklet, p54p_tasklet, (unsigned long)dev);
- err = request_firmware_nowait(THIS_MODULE, 1, "isl3886pci",
- &priv->pdev->dev, GFP_KERNEL,
- priv, p54p_firmware_step2);
+ err = p54p_load_firmware(priv);
if (!err)
return 0;
@@ -652,9 +658,8 @@
return;
priv = dev->priv;
- wait_for_completion(&priv->fw_loaded);
+ sysdata_synchronize_request(priv->fw_async_cookie);
p54_unregister_common(dev);
- release_firmware(priv->firmware);
pci_free_consistent(pdev, sizeof(*priv->ring_control),
priv->ring_control, priv->ring_control_dma);
iounmap(priv->map);
diff --git a/drivers/net/wireless/intersil/p54/p54pci.h b/drivers/net/wireless/intersil/p54/p54pci.h
index 68405c1..4477f6b 100644
--- a/drivers/net/wireless/intersil/p54/p54pci.h
+++ b/drivers/net/wireless/intersil/p54/p54pci.h
@@ -94,7 +94,7 @@
struct pci_dev *pdev;
struct p54p_csr __iomem *map;
struct tasklet_struct tasklet;
- const struct firmware *firmware;
+ const struct sysdata_file *firmware;
spinlock_t lock;
struct p54p_ring_control *ring_control;
dma_addr_t ring_control_dma;
@@ -105,7 +105,7 @@
struct sk_buff *tx_buf_data[32];
struct sk_buff *tx_buf_mgmt[4];
struct completion boot_comp;
- struct completion fw_loaded;
+ async_cookie_t fw_async_cookie;
};
#endif /* P54USB_H */
diff --git a/drivers/net/wireless/intersil/p54/p54spi.c b/drivers/net/wireless/intersil/p54/p54spi.c
index 7ab2f43..fa989b0 100644
--- a/drivers/net/wireless/intersil/p54/p54spi.c
+++ b/drivers/net/wireless/intersil/p54/p54spi.c
@@ -23,7 +23,7 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/spi/spi.h>
@@ -162,53 +162,67 @@
return 0;
}
+static int p54spi_request_firmware_found_cb(void *context,
+ const struct sysdata_file *sysdata) {
+ struct p54s_priv *priv = context;
+
+ return p54_parse_firmware(priv->hw, priv->firmware);
+}
+
static int p54spi_request_firmware(struct ieee80211_hw *dev)
{
struct p54s_priv *priv = dev->priv;
+ const struct sysdata_file_desc sysdata_desc = {
+ SYSDATA_DEFAULT_SYNC(p54spi_request_firmware_found_cb, priv),
+ };
int ret;
/* FIXME: should driver use it's own struct device? */
- ret = request_firmware(&priv->firmware, "3826.arm", &priv->spi->dev);
-
+ ret = sysdata_file_request("3826.arm", &sysdata_desc, &priv->spi->dev);
if (ret < 0) {
- dev_err(&priv->spi->dev, "request_firmware() failed: %d", ret);
- return ret;
+ dev_err(&priv->spi->dev,
+ "request_firmware() failed: %d", ret);
}
-
- ret = p54_parse_firmware(dev, priv->firmware);
- if (ret) {
- release_firmware(priv->firmware);
- return ret;
- }
-
- return 0;
+ return ret;
}
+#ifdef CONFIG_P54_SPI_DEFAULT_EEPROM
+static int p54spi_load_eeprom_default(void *context)
+{
+ struct p54s_priv *priv = context;
+ struct ieee80211_hw *dev = priv->hw;
+
+ dev_info(&priv->spi->dev, "loading default eeprom...\n");
+ return p54_parse_eeprom(dev, (void *) p54spi_eeprom,
+ sizeof(p54spi_eeprom));
+}
+#endif
+
+static int p54spi_load_eeprom_cb(void *context,
+ const struct sysdata_file *sysdata)
+{
+ struct p54s_priv *priv = context;
+ struct ieee80211_hw *dev = priv->hw;
+
+ dev_info(&priv->spi->dev, "loading user eeprom...\n");
+ return p54_parse_eeprom(dev, (void *) sysdata->data,
+ (int)sysdata->size);
+}
static int p54spi_request_eeprom(struct ieee80211_hw *dev)
{
struct p54s_priv *priv = dev->priv;
- const struct firmware *eeprom;
- int ret;
+ const struct sysdata_file_desc sysdata_desc = {
+ SYSDATA_DEFAULT_SYNC(p54spi_load_eeprom_cb, priv),
+#ifdef CONFIG_P54_SPI_DEFAULT_EEPROM
+ SYSDATA_SYNC_OPT_CB(p54spi_load_eeprom_default, priv),
+#endif
+ };
/* allow users to customize their eeprom.
*/
- ret = request_firmware_direct(&eeprom, "3826.eeprom", &priv->spi->dev);
- if (ret < 0) {
-#ifdef CONFIG_P54_SPI_DEFAULT_EEPROM
- dev_info(&priv->spi->dev, "loading default eeprom...\n");
- ret = p54_parse_eeprom(dev, (void *) p54spi_eeprom,
- sizeof(p54spi_eeprom));
-#else
- dev_err(&priv->spi->dev, "Failed to request user eeprom\n");
-#endif /* CONFIG_P54_SPI_DEFAULT_EEPROM */
- } else {
- dev_info(&priv->spi->dev, "loading user eeprom...\n");
- ret = p54_parse_eeprom(dev, (void *) eeprom->data,
- (int)eeprom->size);
- release_firmware(eeprom);
- }
- return ret;
+ return sysdata_file_request("3826.eeprom", &sysdata_desc,
+ &priv->spi->dev);
}
static int p54spi_upload_firmware(struct ieee80211_hw *dev)
@@ -692,7 +706,6 @@
gpio_free(p54spi_gpio_power);
gpio_free(p54spi_gpio_irq);
- release_firmware(priv->firmware);
mutex_destroy(&priv->mutex);
diff --git a/drivers/net/wireless/intersil/p54/p54spi.h b/drivers/net/wireless/intersil/p54/p54spi.h
index dfaa62a..f4f20ff 100644
--- a/drivers/net/wireless/intersil/p54/p54spi.h
+++ b/drivers/net/wireless/intersil/p54/p54spi.h
@@ -119,7 +119,7 @@
struct list_head tx_pending;
enum fw_state fw_state;
- const struct firmware *firmware;
+ const struct sysdata_file *firmware;
};
#endif /* P54SPI_H */
diff --git a/drivers/net/wireless/intersil/p54/p54usb.c b/drivers/net/wireless/intersil/p54/p54usb.c
index 043bd1c..e2b5a71 100644
--- a/drivers/net/wireless/intersil/p54/p54usb.c
+++ b/drivers/net/wireless/intersil/p54/p54usb.c
@@ -15,7 +15,7 @@
#include <linux/usb.h>
#include <linux/pci.h>
#include <linux/slab.h>
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <linux/delay.h>
#include <linux/crc32.h>
@@ -916,14 +916,13 @@
return ret;
}
-static void p54u_load_firmware_cb(const struct firmware *firmware,
+static void p54u_load_firmware_cb(const struct sysdata_file *firmware,
void *context)
{
struct p54u_priv *priv = context;
struct usb_device *udev = priv->udev;
int err;
- complete(&priv->fw_wait_load);
if (firmware) {
priv->fw = firmware;
err = p54u_start_ops(priv);
@@ -959,12 +958,14 @@
{
struct usb_device *udev = interface_to_usbdev(intf);
struct p54u_priv *priv = dev->priv;
+ const struct sysdata_file_desc sysdata_desc = {
+ SYSDATA_DEFAULT_ASYNC(p54u_load_firmware_cb, priv),
+ };
struct device *device = &udev->dev;
int err, i;
BUILD_BUG_ON(ARRAY_SIZE(p54u_fwlist) != __NUM_P54U_HWTYPES);
- init_completion(&priv->fw_wait_load);
i = p54_find_type(priv);
if (i < 0)
return i;
@@ -973,9 +974,8 @@
p54u_fwlist[i].fw);
usb_get_dev(udev);
- err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw,
- device, GFP_KERNEL, priv,
- p54u_load_firmware_cb);
+ err = sysdata_file_request_async(p54u_fwlist[i].fw, &sysdata_desc,
+ device, &priv->fw_async_cookie);
if (err) {
dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
"(%d)!\n", p54u_fwlist[i].fw, err);
@@ -1069,11 +1069,10 @@
return;
priv = dev->priv;
- wait_for_completion(&priv->fw_wait_load);
+ sysdata_synchronize_request(priv->fw_async_cookie);
p54_unregister_common(dev);
usb_put_dev(interface_to_usbdev(intf));
- release_firmware(priv->fw);
p54_free_common(dev);
}
diff --git a/drivers/net/wireless/intersil/p54/p54usb.h b/drivers/net/wireless/intersil/p54/p54usb.h
index a5f5f0f..089c62a 100644
--- a/drivers/net/wireless/intersil/p54/p54usb.h
+++ b/drivers/net/wireless/intersil/p54/p54usb.h
@@ -153,10 +153,10 @@
spinlock_t lock;
struct sk_buff_head rx_queue;
struct usb_anchor submitted;
- const struct firmware *fw;
+ const struct sysdata_file *fw;
/* asynchronous firmware callback */
- struct completion fw_wait_load;
+ async_cookie_t fw_async_cookie;
};
#endif /* P54USB_H */
diff --git a/drivers/net/wireless/intersil/p54/txrx.c b/drivers/net/wireless/intersil/p54/txrx.c
index 24e5ff9..cc0e121 100644
--- a/drivers/net/wireless/intersil/p54/txrx.c
+++ b/drivers/net/wireless/intersil/p54/txrx.c
@@ -17,7 +17,7 @@
*/
#include <linux/export.h>
-#include <linux/firmware.h>
+#include <linux/sysdata.h>
#include <linux/etherdevice.h>
#include <asm/div64.h>