]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ipw2100: don't return positive values to PCI probe on error
authorDan Williams <dcbw@redhat.com>
Wed, 12 Jul 2017 16:47:02 +0000 (11:47 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 28 Jul 2017 15:01:43 +0000 (18:01 +0300)
Causes the PCI stack to complain, and then eventually call the
PCI remove function, which ipw2100 is not expecting.  It then
tries to unregister an already-released netdev and other nasty
things, leading to a panic.

Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1185518
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/intel/ipw2x00/ipw2100.c

index ccbe74589eecee3a3487f154d6a076bba89f9b3a..77f3f92b3c8596b96a75ab29afacbc57fd8ca259 100644 (file)
@@ -1724,7 +1724,7 @@ static const struct libipw_geo ipw_geos[] = {
 static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
 {
        unsigned long flags;
-       int rc = 0;
+       int err = 0;
        u32 lock;
        u32 ord_len = sizeof(lock);
 
@@ -1757,33 +1757,33 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
        if (priv->status & STATUS_POWERED ||
            (priv->status & STATUS_RESET_PENDING)) {
                /* Power cycle the card ... */
-               if (ipw2100_power_cycle_adapter(priv)) {
+               err = ipw2100_power_cycle_adapter(priv);
+               if (err) {
                        printk(KERN_WARNING DRV_NAME
                               ": %s: Could not cycle adapter.\n",
                               priv->net_dev->name);
-                       rc = 1;
                        goto exit;
                }
        } else
                priv->status |= STATUS_POWERED;
 
        /* Load the firmware, start the clocks, etc. */
-       if (ipw2100_start_adapter(priv)) {
+       err = ipw2100_start_adapter(priv);
+       if (err) {
                printk(KERN_ERR DRV_NAME
                       ": %s: Failed to start the firmware.\n",
                       priv->net_dev->name);
-               rc = 1;
                goto exit;
        }
 
        ipw2100_initialize_ordinals(priv);
 
        /* Determine capabilities of this particular HW configuration */
-       if (ipw2100_get_hw_features(priv)) {
+       err = ipw2100_get_hw_features(priv);
+       if (err) {
                printk(KERN_ERR DRV_NAME
                       ": %s: Failed to determine HW features.\n",
                       priv->net_dev->name);
-               rc = 1;
                goto exit;
        }
 
@@ -1792,11 +1792,11 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
        priv->ieee->freq_band = LIBIPW_24GHZ_BAND;
 
        lock = LOCK_NONE;
-       if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
+       err = ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len);
+       if (err) {
                printk(KERN_ERR DRV_NAME
                       ": %s: Failed to clear ordinal lock.\n",
                       priv->net_dev->name);
-               rc = 1;
                goto exit;
        }
 
@@ -1820,21 +1820,21 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
 
        /* Send all of the commands that must be sent prior to
         * HOST_COMPLETE */
-       if (ipw2100_adapter_setup(priv)) {
+       err = ipw2100_adapter_setup(priv);
+       if (err) {
                printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
                       priv->net_dev->name);
-               rc = 1;
                goto exit;
        }
 
        if (!deferred) {
                /* Enable the adapter - sends HOST_COMPLETE */
-               if (ipw2100_enable_adapter(priv)) {
+               err = ipw2100_enable_adapter(priv);
+               if (err) {
                        printk(KERN_ERR DRV_NAME ": "
                               "%s: failed in call to enable adapter.\n",
                               priv->net_dev->name);
                        ipw2100_hw_stop_adapter(priv);
-                       rc = 1;
                        goto exit;
                }
 
@@ -1844,7 +1844,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
        }
 
       exit:
-       return rc;
+       return err;
 }
 
 static void ipw2100_down(struct ipw2100_priv *priv)