]> err.no Git - linux-2.6/commitdiff
wbsd: check for data opcode earlier
authorPierre Ossman <drzeus@drzeus.cx>
Tue, 1 May 2007 11:35:19 +0000 (13:35 +0200)
committerPierre Ossman <drzeus@drzeus.cx>
Tue, 1 May 2007 11:35:19 +0000 (13:35 +0200)
Move the check for supported data opcodes to the beginning of the
request function to avoid wedging the card.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
drivers/mmc/host/wbsd.c

index 9f7518b37c33489673c9e791d25fc068f219fa76..867ca6a69298028057f35a13409574dead8f0c8d 100644 (file)
@@ -788,24 +788,7 @@ static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)
                goto done;
        }
 
-       /*
-        * Does the request include data?
-        */
        if (cmd->data) {
-               wbsd_prepare_data(host, cmd->data);
-
-               if (cmd->data->error != MMC_ERR_NONE)
-                       goto done;
-       }
-
-       wbsd_send_command(host, cmd);
-
-       /*
-        * If this is a data transfer the request
-        * will be finished after the data has
-        * transfered.
-        */
-       if (cmd->data && (cmd->error == MMC_ERR_NONE)) {
                /*
                 * The hardware is so delightfully stupid that it has a list
                 * of "data" commands. If a command isn't on this list, it'll
@@ -837,14 +820,30 @@ static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)
                                "supported by this controller.\n",
                                mmc_hostname(host->mmc), cmd->opcode);
 #endif
-                       cmd->data->error = MMC_ERR_INVALID;
-
-                       if (cmd->data->stop)
-                               wbsd_send_command(host, cmd->data->stop);
+                       cmd->error = MMC_ERR_INVALID;
 
                        goto done;
                };
+       }
 
+       /*
+        * Does the request include data?
+        */
+       if (cmd->data) {
+               wbsd_prepare_data(host, cmd->data);
+
+               if (cmd->data->error != MMC_ERR_NONE)
+                       goto done;
+       }
+
+       wbsd_send_command(host, cmd);
+
+       /*
+        * If this is a data transfer the request
+        * will be finished after the data has
+        * transfered.
+        */
+       if (cmd->data && (cmd->error == MMC_ERR_NONE)) {
                /*
                 * Dirty fix for hardware bug.
                 */