Skip to content

Commit

Permalink
[PATCH] orinoco: delay FID allocation after firmware initialization
Browse files Browse the repository at this point in the history
This is needed to identify the card before possible allocation problems,
so that the user at least can report the firmware version that fails.

Signed-off-by: Pavel Roskin <proski@gnu.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Pavel Roskin authored and John W. Linville committed Apr 24, 2006
1 parent 2c1bd26 commit 37a6c61
Showing 1 changed file with 22 additions and 6 deletions.
28 changes: 22 additions & 6 deletions drivers/net/wireless/orinoco.c
Original file line number Diff line number Diff line change
Expand Up @@ -1345,16 +1345,12 @@ int __orinoco_down(struct net_device *dev)
return 0;
}

int orinoco_reinit_firmware(struct net_device *dev)
static int orinoco_allocate_fid(struct net_device *dev)
{
struct orinoco_private *priv = netdev_priv(dev);
struct hermes *hw = &priv->hw;
int err;

err = hermes_init(hw);
if (err)
return err;

err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);
if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) {
/* Try workaround for old Symbol firmware bug */
Expand All @@ -1373,6 +1369,19 @@ int orinoco_reinit_firmware(struct net_device *dev)
return err;
}

int orinoco_reinit_firmware(struct net_device *dev)
{
struct orinoco_private *priv = netdev_priv(dev);
struct hermes *hw = &priv->hw;
int err;

err = hermes_init(hw);
if (!err)
err = orinoco_allocate_fid(dev);

return err;
}

static int __orinoco_hw_set_bitrate(struct orinoco_private *priv)
{
hermes_t *hw = &priv->hw;
Expand Down Expand Up @@ -2224,7 +2233,7 @@ static int orinoco_init(struct net_device *dev)
priv->nicbuf_size = IEEE80211_FRAME_LEN + ETH_HLEN;

/* Initialize the firmware */
err = orinoco_reinit_firmware(dev);
err = hermes_init(hw);
if (err != 0) {
printk(KERN_ERR "%s: failed to initialize firmware (err = %d)\n",
dev->name, err);
Expand Down Expand Up @@ -2282,6 +2291,13 @@ static int orinoco_init(struct net_device *dev)

printk(KERN_DEBUG "%s: Station name \"%s\"\n", dev->name, priv->nick);

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

/* Get allowed channels */
err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_CHANNELLIST,
&priv->channel_mask);
Expand Down

0 comments on commit 37a6c61

Please sign in to comment.