aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAndrey Yurovsky <andrey@cozybit.com>2009-06-18 12:51:57 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-07-10 15:01:55 -0400
commitefcfd1f28f6a5c377a0e630ca2c96c54eb3f1e8f (patch)
treed929bed1f9756dbe811b2f065951eebdbab25cf1 /drivers/net
parentce8d096dac70e92a506d2f686ae4f724f42052cf (diff)
libertas: correct card cleanup order in SPI driver
The SPI driver does a couple of card cleanup steps in the wrong order on module removal. If IEEE PS is enabled, this results in the card being left in IEEE PS mode and subsequent failures to reload the module. The problem is that the surpriseremoved flag is set before calling lbs_remove_card, but that function needs to issue a command to exit IEEE PS mode (the flag blocks the command path). In addition, lbs_stop_card should be called first because it clears out any pending commands. Tested on a GSPI device with V9 firmware by confirming that we can reload the module with or without IEEE PS enabled. Also fix a warning from the wrong uint format in a printk. V2: use z modifier, thanks Sebastian. Signed-off-by: Andrey Yurovsky <andrey@cozybit.com> Acked-by: Dan Williams <dcbw@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/libertas/if_spi.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c
index b213de437ae6..963c20125fc9 100644
--- a/drivers/net/wireless/libertas/if_spi.c
+++ b/drivers/net/wireless/libertas/if_spi.c
@@ -737,7 +737,7 @@ static int if_spi_c2h_data(struct if_spi_card *card)
737 goto out; 737 goto out;
738 } else if (len > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) { 738 } else if (len > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
739 lbs_pr_err("%s: error: card has %d bytes of data, but " 739 lbs_pr_err("%s: error: card has %d bytes of data, but "
740 "our maximum skb size is %lu\n", 740 "our maximum skb size is %zu\n",
741 __func__, len, MRVDRV_ETH_RX_PACKET_BUFFER_SIZE); 741 __func__, len, MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
742 err = -EINVAL; 742 err = -EINVAL;
743 goto out; 743 goto out;
@@ -1170,12 +1170,13 @@ static int __devexit libertas_spi_remove(struct spi_device *spi)
1170 1170
1171 lbs_deb_spi("libertas_spi_remove\n"); 1171 lbs_deb_spi("libertas_spi_remove\n");
1172 lbs_deb_enter(LBS_DEB_SPI); 1172 lbs_deb_enter(LBS_DEB_SPI);
1173 priv->surpriseremoved = 1;
1174 1173
1175 lbs_stop_card(priv); 1174 lbs_stop_card(priv);
1175 lbs_remove_card(priv); /* will call free_netdev */
1176
1177 priv->surpriseremoved = 1;
1176 free_irq(spi->irq, card); 1178 free_irq(spi->irq, card);
1177 if_spi_terminate_spi_thread(card); 1179 if_spi_terminate_spi_thread(card);
1178 lbs_remove_card(priv); /* will call free_netdev */
1179 if (card->pdata->teardown) 1180 if (card->pdata->teardown)
1180 card->pdata->teardown(spi); 1181 card->pdata->teardown(spi);
1181 free_if_spi_card(card); 1182 free_if_spi_card(card);