When calling a host reset we shouldn't rely on the command triggering
the reset, so allow megaraid_abort_and_reset() to be called with a
NULL scb.
And drop the pointless 'bus_reset' and 'target_reset' handlers, which
just call the same function as host_reset.

Signed-off-by: Hannes Reinecke <h...@suse.com>
---
 drivers/scsi/megaraid.c | 42 ++++++++++++++++--------------------------
 1 file changed, 16 insertions(+), 26 deletions(-)

diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 3c63c29..7e504d3 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -1909,7 +1909,7 @@ static DEF_SCSI_QCMD(megaraid_queue)
 
        spin_lock_irq(&adapter->lock);
 
-       rval =  megaraid_abort_and_reset(adapter, cmd, SCB_RESET);
+       rval =  megaraid_abort_and_reset(adapter, NULL, SCB_RESET);
 
        /*
         * This is required here to complete any completed requests
@@ -1948,7 +1948,7 @@ static DEF_SCSI_QCMD(megaraid_queue)
 
                scb = list_entry(pos, scb_t, list);
 
-               if (scb->cmd == cmd) { /* Found command */
+               if (!cmd || scb->cmd == cmd) { /* Found command */
 
                        scb->state |= aor;
 
@@ -1967,31 +1967,23 @@ static DEF_SCSI_QCMD(megaraid_queue)
 
                                return FAILED;
                        }
-                       else {
-
-                               /*
-                                * Not yet issued! Remove from the pending
-                                * list
-                                */
-                               dev_warn(&adapter->dev->dev,
-                                       "%s-[%x], driver owner\n",
-                                       (aor==SCB_ABORT) ? "ABORTING":"RESET",
-                                       scb->idx);
-
-                               mega_free_scb(adapter, scb);
-
-                               if( aor == SCB_ABORT ) {
-                                       cmd->result = (DID_ABORT << 16);
-                               }
-                               else {
-                                       cmd->result = (DID_RESET << 16);
-                               }
+                       /*
+                        * Not yet issued! Remove from the pending
+                        * list
+                        */
+                       dev_warn(&adapter->dev->dev,
+                                "%s-[%x], driver owner\n",
+                                (cmd) ? "ABORTING":"RESET",
+                                scb->idx);
+                       mega_free_scb(adapter, scb);
 
+                       if (cmd) {
+                               cmd->result = (DID_ABORT << 16);
                                list_add_tail(SCSI_LIST(cmd),
-                                               &adapter->completed_list);
-
-                               return SUCCESS;
+                                             &adapter->completed_list);
                        }
+
+                       return SUCCESS;
                }
        }
 
@@ -4180,8 +4172,6 @@ static inline void mega_create_proc_entry(int index, 
struct proc_dir_entry *pare
        .cmd_per_lun                    = DEF_CMD_PER_LUN,
        .use_clustering                 = ENABLE_CLUSTERING,
        .eh_abort_handler               = megaraid_abort,
-       .eh_device_reset_handler        = megaraid_reset,
-       .eh_bus_reset_handler           = megaraid_reset,
        .eh_host_reset_handler          = megaraid_reset,
        .no_write_same                  = 1,
 };
-- 
1.8.5.6

Reply via email to