Skip to content

Commit

Permalink
orinoco: Move FID allocation to hw.c
Browse files Browse the repository at this point in the history
This is part of refactorring the initialisation code so that we can
load the firmware before registerring with netdev.

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 e9e3d01 commit 42a51b9
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 23 deletions.
23 changes: 23 additions & 0 deletions drivers/net/wireless/orinoco/hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@

#define SYMBOL_MAX_VER_LEN (14)

/* Symbol firmware has a bug allocating buffers larger than this */
#define TX_NICBUF_SIZE_BUG 1585

/********************************************************************/
/* Data tables */
/********************************************************************/
Expand Down Expand Up @@ -364,6 +367,26 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr)
return err;
}

int orinoco_hw_allocate_fid(struct orinoco_private *priv)
{
struct net_device *dev = priv->ndev;
struct hermes *hw = &priv->hw;
int 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 */
priv->nicbuf_size = TX_NICBUF_SIZE_BUG;
err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);

printk(KERN_WARNING "%s: firmware ALLOC bug detected "
"(old Symbol firmware?). Work around %s\n",
dev->name, err ? "failed!" : "ok.");
}

return err;
}

int orinoco_get_bitratemode(int bitrate, int automatic)
{
int ratemode = -1;
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/orinoco/hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ struct dev_addr_list;

int determine_fw_capabilities(struct orinoco_private *priv);
int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr);
int orinoco_hw_allocate_fid(struct orinoco_private *priv);
int orinoco_get_bitratemode(int bitrate, int automatic);
void orinoco_get_ratemode_cfg(int ratemode, int *bitrate, int *automatic);

Expand Down
25 changes: 2 additions & 23 deletions drivers/net/wireless/orinoco/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ static const u8 encaps_hdr[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};
* how many events the
* device could
* legitimately generate */
#define TX_NICBUF_SIZE_BUG 1585 /* Bug in Symbol firmware */

#define DUMMY_FID 0xFFFF

Expand Down Expand Up @@ -1574,26 +1573,6 @@ int __orinoco_down(struct net_device *dev)
}
EXPORT_SYMBOL(__orinoco_down);

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_allocate(hw, priv->nicbuf_size, &priv->txfid);
if (err == -EIO && priv->nicbuf_size > TX_NICBUF_SIZE_BUG) {
/* Try workaround for old Symbol firmware bug */
priv->nicbuf_size = TX_NICBUF_SIZE_BUG;
err = hermes_allocate(hw, priv->nicbuf_size, &priv->txfid);

printk(KERN_WARNING "%s: firmware ALLOC bug detected "
"(old Symbol firmware?). Work around %s\n",
dev->name, err ? "failed!" : "ok.");
}

return err;
}

int orinoco_reinit_firmware(struct net_device *dev)
{
struct orinoco_private *priv = netdev_priv(dev);
Expand All @@ -1607,7 +1586,7 @@ int orinoco_reinit_firmware(struct net_device *dev)
priv->do_fw_download = 0;
}
if (!err)
err = orinoco_allocate_fid(dev);
err = orinoco_hw_allocate_fid(priv);

return err;
}
Expand Down Expand Up @@ -2167,7 +2146,7 @@ static int orinoco_init(struct net_device *dev)
if (err)
goto out;

err = orinoco_allocate_fid(dev);
err = orinoco_hw_allocate_fid(priv);
if (err) {
printk(KERN_ERR "%s: failed to allocate NIC buffer!\n",
dev->name);
Expand Down

0 comments on commit 42a51b9

Please sign in to comment.