Promise driver uses a custom error handling function, so we need
the fix that was applied to the libata core: the SCSI error
handling thread requires that we complete commands using a special
completion function, since the normal one doesn't work inside
the error handling thread.
#include <asm/io.h>
#define DRV_NAME "sata_promise"
-#define DRV_VERSION "0.90"
+#define DRV_VERSION "0.91"
enum {
goto out;
}
+ /* hack alert! We cannot use the supplied completion
+ * function from inside the ->eh_strategy_handler() thread.
+ * libata is the only user of ->eh_strategy_handler() in
+ * any kernel, so the default scsi_done() assumes it is
+ * not being called from the SCSI EH.
+ */
+ qc->scsidone = scsi_finish_command;
+
switch (qc->tf.protocol) {
case ATA_PROT_DMA_READ:
case ATA_PROT_DMA_WRITE: