mwifiex: clear reset flag after reset completes

Reset handling occurs in a workqueue thread, and the reset flag is
cleared there before the actual reset handling code. This improperly
allows driver code to requeue another reset before the current reset
completes, which can lead to a panic. Instead, clear the reset flag
after reset handling is finished.

Also, clear firmware_wedge after reset handling has completed so that it
can continue to produce failures similar to an actual failure.

see b/33975835

Change-Id: Ib19dd8eb38a629a0b901d0859dd892ad7f0a3dd9
diff --git a/drivers/net/wireless/marvell/mwifiex/sdio.c b/drivers/net/wireless/marvell/mwifiex/sdio.c
index acc7afc..150ce4f 100644
--- a/drivers/net/wireless/marvell/mwifiex/sdio.c
+++ b/drivers/net/wireless/marvell/mwifiex/sdio.c
@@ -2178,13 +2178,14 @@
 	 * We run it in a totally independent workqueue.
 	 */
 
-	firmware_wedge = 0;
-	mwifiex_dbg(adapter, WARN, "Resetting card...\n");
+	mwifiex_dbg(adapter, WARN, "Resetting card start...\n");
 	mmc_remove_host(target);
 	/* 200ms delay is based on experiment with sdhci controller */
 	mdelay(200);
 	target->rescan_entered = 0; /* rescan non-removable cards */
 	mmc_add_host(target);
+	firmware_wedge = 0;
+	mwifiex_dbg(adapter, WARN, "Resetting card done...\n");
 }
 
 /* This function read/write firmware */
@@ -2489,9 +2490,12 @@
 	if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
 			       &iface_work_flags))
 		mwifiex_sdio_device_dump_work(save_adapter);
-	if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
-			       &iface_work_flags))
+	if (test_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
+		     &iface_work_flags)) {
 		mwifiex_sdio_card_reset_work(save_adapter);
+		clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
+			  &iface_work_flags);
+	}
 }
 
 static DECLARE_WORK(sdio_work, mwifiex_sdio_work);