Skip to content

Commit

Permalink
orinoco: initialise independently of netdev
Browse files Browse the repository at this point in the history
Initialise the orinoco driver before registerring with netdev, which
will help when we get to cfg80211...

Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
David Kilroy authored and John W. Linville committed Jul 10, 2009
1 parent a260836 commit 8e63826
Show file tree
Hide file tree
Showing 9 changed files with 63 additions and 24 deletions.
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/airport.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,12 @@ airport_attach(struct macio_dev *mdev, const struct of_device_id *match)
}
card->irq_requested = 1;

/* Initialise the main driver */
if (orinoco_init(priv) != 0) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto failed;
}

/* Tell the stack we exist */
if (register_netdev(dev) != 0) {
printk(KERN_ERR PFX "register_netdev() failed\n");
Expand Down
44 changes: 20 additions & 24 deletions drivers/net/wireless/orinoco/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
Expand Down Expand Up @@ -2073,9 +2074,9 @@ static void orinoco_unregister_pm_notifier(struct orinoco_private *priv)
/* Initialization */
/********************************************************************/

static int orinoco_init(struct net_device *dev)
int orinoco_init(struct orinoco_private *priv)
{
struct orinoco_private *priv = netdev_priv(dev);
struct device *dev = priv->dev;
hermes_t *hw = &priv->hw;
int err = 0;

Expand All @@ -2086,15 +2087,14 @@ static int orinoco_init(struct net_device *dev)
/* Initialize the firmware */
err = hermes_init(hw);
if (err != 0) {
printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n",
dev->name, err);
dev_err(dev, "Failed to initialize firmware (err = %d)\n",
err);
goto out;
}

err = determine_fw_capabilities(priv);
if (err != 0) {
printk(KERN_ERR "%s: Incompatible firmware, aborting\n",
dev->name);
dev_err(dev, "Incompatible firmware, aborting\n");
goto out;
}

Expand All @@ -2110,27 +2110,23 @@ static int orinoco_init(struct net_device *dev)
/* Check firmware version again */
err = determine_fw_capabilities(priv);
if (err != 0) {
printk(KERN_ERR "%s: Incompatible firmware, aborting\n",
dev->name);
dev_err(dev, "Incompatible firmware, aborting\n");
goto out;
}
}

if (priv->has_port3)
printk(KERN_DEBUG "%s: Ad-hoc demo mode supported\n",
dev->name);
dev_info(dev, "Ad-hoc demo mode supported\n");
if (priv->has_ibss)
printk(KERN_DEBUG "%s: IEEE standard IBSS ad-hoc mode supported\n",
dev->name);
if (priv->has_wep) {
printk(KERN_DEBUG "%s: WEP supported, %s-bit key\n", dev->name,
priv->has_big_wep ? "104" : "40");
}
dev_info(dev, "IEEE standard IBSS ad-hoc mode supported\n");
if (priv->has_wep)
dev_info(dev, "WEP supported, %s-bit key\n",
priv->has_big_wep ? "104" : "40");
if (priv->has_wpa) {
printk(KERN_DEBUG "%s: WPA-PSK supported\n", dev->name);
dev_info(dev, "WPA-PSK supported\n");
if (orinoco_mic_init(priv)) {
printk(KERN_ERR "%s: Failed to setup MIC crypto "
"algorithm. Disabling WPA support\n", dev->name);
dev_err(dev, "Failed to setup MIC crypto algorithm. "
"Disabling WPA support\n");
priv->has_wpa = 0;
}
}
Expand All @@ -2141,14 +2137,14 @@ static int orinoco_init(struct net_device *dev)
goto out;
orinoco_bss_data_init(priv);

err = orinoco_hw_read_card_settings(priv, dev->dev_addr);
/* Netdev has not initialised, but we have allocated the buffer. */
err = orinoco_hw_read_card_settings(priv, priv->ndev->dev_addr);
if (err)
goto out;

err = orinoco_hw_allocate_fid(priv);
if (err) {
printk(KERN_ERR "%s: failed to allocate NIC buffer!\n",
dev->name);
dev_err(dev, "Failed to allocate NIC buffer!\n");
goto out;
}

Expand All @@ -2174,14 +2170,14 @@ static int orinoco_init(struct net_device *dev)
priv->hw_unavailable--;
spin_unlock_irq(&priv->lock);

printk(KERN_DEBUG "%s: ready\n", dev->name);
dev_dbg(dev, "Ready\n");

out:
return err;
}
EXPORT_SYMBOL(orinoco_init);

static const struct net_device_ops orinoco_netdev_ops = {
.ndo_init = orinoco_init,
.ndo_open = orinoco_open,
.ndo_stop = orinoco_stop,
.ndo_start_xmit = orinoco_xmit,
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/orinoco/orinoco.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ extern struct orinoco_private *alloc_orinocodev(
int (*hard_reset)(struct orinoco_private *),
int (*stop_fw)(struct orinoco_private *, int));
extern void free_orinocodev(struct orinoco_private *priv);
extern int orinoco_init(struct orinoco_private *priv);
extern int __orinoco_up(struct orinoco_private *priv);
extern int __orinoco_down(struct orinoco_private *priv);
extern int orinoco_reinit_firmware(struct orinoco_private *priv);
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/orinoco_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,12 @@ orinoco_cs_config(struct pcmcia_device *link)
dev->irq = link->irq.AssignedIRQ;
card->node.major = card->node.minor = 0;

/* Initialise the main driver */
if (orinoco_init(priv) != 0) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto failed;
}

SET_NETDEV_DEV(dev, &handle_to_dev(link));
/* Tell the stack we exist */
if (register_netdev(dev) != 0) {
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/orinoco_nortel.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,12 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_init(priv);
if (err) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto fail;
}

err = register_netdev(dev);
if (err) {
printk(KERN_ERR PFX "Cannot register network device\n");
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/orinoco_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,12 @@ static int orinoco_pci_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_init(priv);
if (err) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto fail;
}

err = register_netdev(dev);
if (err) {
printk(KERN_ERR PFX "Cannot register network device\n");
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/orinoco_plx.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,12 @@ static int orinoco_plx_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_init(priv);
if (err) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto fail;
}

err = register_netdev(dev);
if (err) {
printk(KERN_ERR PFX "Cannot register network device\n");
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/orinoco_tmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,12 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_init(priv);
if (err) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto fail;
}

err = register_netdev(dev);
if (err) {
printk(KERN_ERR PFX "Cannot register network device\n");
Expand Down
6 changes: 6 additions & 0 deletions drivers/net/wireless/orinoco/spectrum_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,12 @@ spectrum_cs_config(struct pcmcia_device *link)
if (spectrum_cs_hard_reset(priv) != 0)
goto failed;

/* Initialise the main driver */
if (orinoco_init(priv) != 0) {
printk(KERN_ERR PFX "orinoco_init() failed\n");
goto failed;
}

SET_NETDEV_DEV(dev, &handle_to_dev(link));
/* Tell the stack we exist */
if (register_netdev(dev) != 0) {
Expand Down

0 comments on commit 8e63826

Please sign in to comment.