[PATCH] orinoco: delay FID allocation after firmware initialization
authorPavel Roskin <proski@gnu.org>
Fri, 7 Apr 2006 08:10:49 +0000 (04:10 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 24 Apr 2006 20:15:51 +0000 (16:15 -0400)
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>
drivers/net/wireless/orinoco.c

index 80cf6fba3798ddedeaecde6f9990a2e3dbaf5051..d4c13ff4d8a18ba54c3ae102a02d41654f988827 100644 (file)
@@ -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 */
@@ -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;
@@ -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);
@@ -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);