megaraid_sas: task management code optimizations
[cascardo/linux.git] / drivers / scsi / megaraid / megaraid_sas_base.c
index 8588202..b84756c 100644 (file)
@@ -2669,17 +2669,6 @@ blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
        return BLK_EH_RESET_TIMER;
 }
 
-/**
- * megasas_reset_device -      Device reset handler entry point
- */
-static int megasas_reset_device(struct scsi_cmnd *scmd)
-{
-       /*
-        * First wait for all commands to complete
-        */
-       return megasas_generic_reset(scmd);
-}
-
 /**
  * megasas_reset_bus_host -    Bus & host reset handler entry point
  */
@@ -2701,6 +2690,50 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
        return ret;
 }
 
+/**
+ * megasas_task_abort - Issues task abort request to firmware
+ *                     (supported only for fusion adapters)
+ * @scmd:              SCSI command pointer
+ */
+static int megasas_task_abort(struct scsi_cmnd *scmd)
+{
+       int ret;
+       struct megasas_instance *instance;
+
+       instance = (struct megasas_instance *)scmd->device->host->hostdata;
+
+       if (instance->ctrl_context)
+               ret = megasas_task_abort_fusion(scmd);
+       else {
+               sdev_printk(KERN_NOTICE, scmd->device, "TASK ABORT not supported\n");
+               ret = FAILED;
+       }
+
+       return ret;
+}
+
+/**
+ * megasas_reset_target:  Issues target reset request to firmware
+ *                        (supported only for fusion adapters)
+ * @scmd:                 SCSI command pointer
+ */
+static int megasas_reset_target(struct scsi_cmnd *scmd)
+{
+       int ret;
+       struct megasas_instance *instance;
+
+       instance = (struct megasas_instance *)scmd->device->host->hostdata;
+
+       if (instance->ctrl_context)
+               ret = megasas_reset_target_fusion(scmd);
+       else {
+               sdev_printk(KERN_NOTICE, scmd->device, "TARGET RESET not supported\n");
+               ret = FAILED;
+       }
+
+       return ret;
+}
+
 /**
  * megasas_bios_param - Returns disk geometry for a disk
  * @sdev:              device handle
@@ -2969,8 +3002,8 @@ static struct scsi_host_template megasas_template = {
        .slave_alloc = megasas_slave_alloc,
        .slave_destroy = megasas_slave_destroy,
        .queuecommand = megasas_queue_command,
-       .eh_device_reset_handler = megasas_reset_device,
-       .eh_bus_reset_handler = megasas_reset_bus_host,
+       .eh_target_reset_handler = megasas_reset_target,
+       .eh_abort_handler = megasas_task_abort,
        .eh_host_reset_handler = megasas_reset_bus_host,
        .eh_timed_out = megasas_reset_timer,
        .shost_attrs = megaraid_host_attrs,
@@ -5598,14 +5631,6 @@ static int megasas_io_attach(struct megasas_instance *instance)
        host->max_lun = MEGASAS_MAX_LUN;
        host->max_cmd_len = 16;
 
-       /* Fusion only supports host reset */
-       if (instance->ctrl_context) {
-               host->hostt->eh_device_reset_handler = NULL;
-               host->hostt->eh_bus_reset_handler = NULL;
-               host->hostt->eh_target_reset_handler = megasas_reset_target_fusion;
-               host->hostt->eh_abort_handler = megasas_task_abort_fusion;
-       }
-
        /*
         * Notify the mid-layer about the new controller
         */