Commit 185ffc19 authored by Dan Williams's avatar Dan Williams Committed by Kalle Valo

ipw2100: don't return positive values to PCI probe on error

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=1185518Signed-off-by: default avatarDan Williams <dcbw@redhat.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 17830147
...@@ -1724,7 +1724,7 @@ static const struct libipw_geo ipw_geos[] = { ...@@ -1724,7 +1724,7 @@ static const struct libipw_geo ipw_geos[] = {
static int ipw2100_up(struct ipw2100_priv *priv, int deferred) static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
{ {
unsigned long flags; unsigned long flags;
int rc = 0; int err = 0;
u32 lock; u32 lock;
u32 ord_len = sizeof(lock); u32 ord_len = sizeof(lock);
...@@ -1757,33 +1757,33 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) ...@@ -1757,33 +1757,33 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
if (priv->status & STATUS_POWERED || if (priv->status & STATUS_POWERED ||
(priv->status & STATUS_RESET_PENDING)) { (priv->status & STATUS_RESET_PENDING)) {
/* Power cycle the card ... */ /* Power cycle the card ... */
if (ipw2100_power_cycle_adapter(priv)) { err = ipw2100_power_cycle_adapter(priv);
if (err) {
printk(KERN_WARNING DRV_NAME printk(KERN_WARNING DRV_NAME
": %s: Could not cycle adapter.\n", ": %s: Could not cycle adapter.\n",
priv->net_dev->name); priv->net_dev->name);
rc = 1;
goto exit; goto exit;
} }
} else } else
priv->status |= STATUS_POWERED; priv->status |= STATUS_POWERED;
/* Load the firmware, start the clocks, etc. */ /* Load the firmware, start the clocks, etc. */
if (ipw2100_start_adapter(priv)) { err = ipw2100_start_adapter(priv);
if (err) {
printk(KERN_ERR DRV_NAME printk(KERN_ERR DRV_NAME
": %s: Failed to start the firmware.\n", ": %s: Failed to start the firmware.\n",
priv->net_dev->name); priv->net_dev->name);
rc = 1;
goto exit; goto exit;
} }
ipw2100_initialize_ordinals(priv); ipw2100_initialize_ordinals(priv);
/* Determine capabilities of this particular HW configuration */ /* 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 printk(KERN_ERR DRV_NAME
": %s: Failed to determine HW features.\n", ": %s: Failed to determine HW features.\n",
priv->net_dev->name); priv->net_dev->name);
rc = 1;
goto exit; goto exit;
} }
...@@ -1792,11 +1792,11 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) ...@@ -1792,11 +1792,11 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
priv->ieee->freq_band = LIBIPW_24GHZ_BAND; priv->ieee->freq_band = LIBIPW_24GHZ_BAND;
lock = LOCK_NONE; 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 printk(KERN_ERR DRV_NAME
": %s: Failed to clear ordinal lock.\n", ": %s: Failed to clear ordinal lock.\n",
priv->net_dev->name); priv->net_dev->name);
rc = 1;
goto exit; goto exit;
} }
...@@ -1820,21 +1820,21 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) ...@@ -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 /* Send all of the commands that must be sent prior to
* HOST_COMPLETE */ * 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", printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
priv->net_dev->name); priv->net_dev->name);
rc = 1;
goto exit; goto exit;
} }
if (!deferred) { if (!deferred) {
/* Enable the adapter - sends HOST_COMPLETE */ /* Enable the adapter - sends HOST_COMPLETE */
if (ipw2100_enable_adapter(priv)) { err = ipw2100_enable_adapter(priv);
if (err) {
printk(KERN_ERR DRV_NAME ": " printk(KERN_ERR DRV_NAME ": "
"%s: failed in call to enable adapter.\n", "%s: failed in call to enable adapter.\n",
priv->net_dev->name); priv->net_dev->name);
ipw2100_hw_stop_adapter(priv); ipw2100_hw_stop_adapter(priv);
rc = 1;
goto exit; goto exit;
} }
...@@ -1844,7 +1844,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred) ...@@ -1844,7 +1844,7 @@ static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
} }
exit: exit:
return rc; return err;
} }
static void ipw2100_down(struct ipw2100_priv *priv) static void ipw2100_down(struct ipw2100_priv *priv)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment