These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / scsi / aacraid / aachba.c
index 9b3dd6e..e4c2437 100644 (file)
@@ -259,7 +259,7 @@ MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the"
        " 0=off, 1=on");
 module_param_named(msi, aac_msi, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(msi, "IRQ handling."
-       " 0=PIC(default), 1=MSI, 2=MSI-X(unsupported, uses MSI)");
+       " 0=PIC(default), 1=MSI, 2=MSI-X)");
 module_param(startup_timeout, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(startup_timeout, "The duration of time in seconds to wait for"
        " adapter to have it's kernel up and\n"
@@ -570,7 +570,7 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
 
        status = aac_fib_send(ContainerCommand,
                  cmd_fibcontext,
-                 sizeof (struct aac_get_name),
+                 sizeof(struct aac_get_name_resp),
                  FsaNormal,
                  0, 1,
                  (fib_callback)get_container_name_callback,
@@ -1052,7 +1052,7 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
 
        status = aac_fib_send(ContainerCommand,
                  cmd_fibcontext,
-                 sizeof (struct aac_get_serial),
+                 sizeof(struct aac_get_serial_resp),
                  FsaNormal,
                  0, 1,
                  (fib_callback) get_container_serial_callback,
@@ -2977,11 +2977,16 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
                return;
 
        BUG_ON(fibptr == NULL);
-
        dev = fibptr->dev;
 
-       srbreply = (struct aac_srb_reply *) fib_data(fibptr);
+       scsi_dma_unmap(scsicmd);
 
+       /* expose physical device if expose_physicald flag is on */
+       if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
+         && expose_physicals > 0)
+               aac_expose_phy_device(scsicmd);
+
+       srbreply = (struct aac_srb_reply *) fib_data(fibptr);
        scsicmd->sense_buffer[0] = '\0';  /* Initialize sense valid flag to false */
 
        if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) {
@@ -2994,147 +2999,157 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
                 */
                scsi_set_resid(scsicmd, scsi_bufflen(scsicmd)
                                   - le32_to_cpu(srbreply->data_xfer_length));
-       }
-
-       scsi_dma_unmap(scsicmd);
-
-       /* expose physical device if expose_physicald flag is on */
-       if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01)
-         && expose_physicals > 0)
-               aac_expose_phy_device(scsicmd);
+               /*
+                * First check the fib status
+                */
 
-       /*
-        * First check the fib status
-        */
+               if (le32_to_cpu(srbreply->status) != ST_OK) {
+                       int len;
 
-       if (le32_to_cpu(srbreply->status) != ST_OK){
-               int len;
-               printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
-               len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
-                           SCSI_SENSE_BUFFERSIZE);
-               scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
-               memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
-       }
+                       printk(KERN_WARNING "aac_srb_callback: srb failed, status = %d\n", le32_to_cpu(srbreply->status));
+                       len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
+                                   SCSI_SENSE_BUFFERSIZE);
+                       scsicmd->result = DID_ERROR << 16
+                                               | COMMAND_COMPLETE << 8
+                                               | SAM_STAT_CHECK_CONDITION;
+                       memcpy(scsicmd->sense_buffer,
+                                       srbreply->sense_data, len);
+               }
 
-       /*
-        * Next check the srb status
-        */
-       switch( (le32_to_cpu(srbreply->srb_status))&0x3f){
-       case SRB_STATUS_ERROR_RECOVERY:
-       case SRB_STATUS_PENDING:
-       case SRB_STATUS_SUCCESS:
-               scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
-               break;
-       case SRB_STATUS_DATA_OVERRUN:
-               switch(scsicmd->cmnd[0]){
-               case  READ_6:
-               case  WRITE_6:
-               case  READ_10:
-               case  WRITE_10:
-               case  READ_12:
-               case  WRITE_12:
-               case  READ_16:
-               case  WRITE_16:
-                       if (le32_to_cpu(srbreply->data_xfer_length) < scsicmd->underflow) {
-                               printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
-                       } else {
-                               printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
+               /*
+                * Next check the srb status
+                */
+               switch ((le32_to_cpu(srbreply->srb_status))&0x3f) {
+               case SRB_STATUS_ERROR_RECOVERY:
+               case SRB_STATUS_PENDING:
+               case SRB_STATUS_SUCCESS:
+                       scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
+                       break;
+               case SRB_STATUS_DATA_OVERRUN:
+                       switch (scsicmd->cmnd[0]) {
+                       case  READ_6:
+                       case  WRITE_6:
+                       case  READ_10:
+                       case  WRITE_10:
+                       case  READ_12:
+                       case  WRITE_12:
+                       case  READ_16:
+                       case  WRITE_16:
+                               if (le32_to_cpu(srbreply->data_xfer_length)
+                                                       < scsicmd->underflow)
+                                       printk(KERN_WARNING"aacraid: SCSI CMD underflow\n");
+                               else
+                                       printk(KERN_WARNING"aacraid: SCSI CMD Data Overrun\n");
+                               scsicmd->result = DID_ERROR << 16
+                                                       | COMMAND_COMPLETE << 8;
+                               break;
+                       case INQUIRY: {
+                               scsicmd->result = DID_OK << 16
+                                                       | COMMAND_COMPLETE << 8;
+                               break;
+                       }
+                       default:
+                               scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
+                               break;
                        }
-                       scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8;
                        break;
-               case INQUIRY: {
-                       scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
+               case SRB_STATUS_ABORTED:
+                       scsicmd->result = DID_ABORT << 16 | ABORT << 8;
                        break;
-               }
-               default:
-                       scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8;
+               case SRB_STATUS_ABORT_FAILED:
+                       /*
+                        * Not sure about this one - but assuming the
+                        * hba was trying to abort for some reason
+                        */
+                       scsicmd->result = DID_ERROR << 16 | ABORT << 8;
+                       break;
+               case SRB_STATUS_PARITY_ERROR:
+                       scsicmd->result = DID_PARITY << 16
+                                               | MSG_PARITY_ERROR << 8;
+                       break;
+               case SRB_STATUS_NO_DEVICE:
+               case SRB_STATUS_INVALID_PATH_ID:
+               case SRB_STATUS_INVALID_TARGET_ID:
+               case SRB_STATUS_INVALID_LUN:
+               case SRB_STATUS_SELECTION_TIMEOUT:
+                       scsicmd->result = DID_NO_CONNECT << 16
+                                               | COMMAND_COMPLETE << 8;
                        break;
-               }
-               break;
-       case SRB_STATUS_ABORTED:
-               scsicmd->result = DID_ABORT << 16 | ABORT << 8;
-               break;
-       case SRB_STATUS_ABORT_FAILED:
-               // Not sure about this one - but assuming the hba was trying to abort for some reason
-               scsicmd->result = DID_ERROR << 16 | ABORT << 8;
-               break;
-       case SRB_STATUS_PARITY_ERROR:
-               scsicmd->result = DID_PARITY << 16 | MSG_PARITY_ERROR << 8;
-               break;
-       case SRB_STATUS_NO_DEVICE:
-       case SRB_STATUS_INVALID_PATH_ID:
-       case SRB_STATUS_INVALID_TARGET_ID:
-       case SRB_STATUS_INVALID_LUN:
-       case SRB_STATUS_SELECTION_TIMEOUT:
-               scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8;
-               break;
 
-       case SRB_STATUS_COMMAND_TIMEOUT:
-       case SRB_STATUS_TIMEOUT:
-               scsicmd->result = DID_TIME_OUT << 16 | COMMAND_COMPLETE << 8;
-               break;
+               case SRB_STATUS_COMMAND_TIMEOUT:
+               case SRB_STATUS_TIMEOUT:
+                       scsicmd->result = DID_TIME_OUT << 16
+                                               | COMMAND_COMPLETE << 8;
+                       break;
 
-       case SRB_STATUS_BUSY:
-               scsicmd->result = DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8;
-               break;
+               case SRB_STATUS_BUSY:
+                       scsicmd->result = DID_BUS_BUSY << 16
+                                               | COMMAND_COMPLETE << 8;
+                       break;
 
-       case SRB_STATUS_BUS_RESET:
-               scsicmd->result = DID_RESET << 16 | COMMAND_COMPLETE << 8;
-               break;
+               case SRB_STATUS_BUS_RESET:
+                       scsicmd->result = DID_RESET << 16
+                                               | COMMAND_COMPLETE << 8;
+                       break;
 
-       case SRB_STATUS_MESSAGE_REJECTED:
-               scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8;
-               break;
-       case SRB_STATUS_REQUEST_FLUSHED:
-       case SRB_STATUS_ERROR:
-       case SRB_STATUS_INVALID_REQUEST:
-       case SRB_STATUS_REQUEST_SENSE_FAILED:
-       case SRB_STATUS_NO_HBA:
-       case SRB_STATUS_UNEXPECTED_BUS_FREE:
-       case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
-       case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
-       case SRB_STATUS_DELAYED_RETRY:
-       case SRB_STATUS_BAD_FUNCTION:
-       case SRB_STATUS_NOT_STARTED:
-       case SRB_STATUS_NOT_IN_USE:
-       case SRB_STATUS_FORCE_ABORT:
-       case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
-       default:
+               case SRB_STATUS_MESSAGE_REJECTED:
+                       scsicmd->result = DID_ERROR << 16
+                                               | MESSAGE_REJECT << 8;
+                       break;
+               case SRB_STATUS_REQUEST_FLUSHED:
+               case SRB_STATUS_ERROR:
+               case SRB_STATUS_INVALID_REQUEST:
+               case SRB_STATUS_REQUEST_SENSE_FAILED:
+               case SRB_STATUS_NO_HBA:
+               case SRB_STATUS_UNEXPECTED_BUS_FREE:
+               case SRB_STATUS_PHASE_SEQUENCE_FAILURE:
+               case SRB_STATUS_BAD_SRB_BLOCK_LENGTH:
+               case SRB_STATUS_DELAYED_RETRY:
+               case SRB_STATUS_BAD_FUNCTION:
+               case SRB_STATUS_NOT_STARTED:
+               case SRB_STATUS_NOT_IN_USE:
+               case SRB_STATUS_FORCE_ABORT:
+               case SRB_STATUS_DOMAIN_VALIDATION_FAIL:
+               default:
 #ifdef AAC_DETAILED_STATUS_INFO
-               printk("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
-                       le32_to_cpu(srbreply->srb_status) & 0x3F,
-                       aac_get_status_string(
-                               le32_to_cpu(srbreply->srb_status) & 0x3F),
-                       scsicmd->cmnd[0],
-                       le32_to_cpu(srbreply->scsi_status));
+                       printk(KERN_INFO "aacraid: SRB ERROR(%u) %s scsi cmd 0x%x - scsi status 0x%x\n",
+                               le32_to_cpu(srbreply->srb_status) & 0x3F,
+                               aac_get_status_string(
+                                       le32_to_cpu(srbreply->srb_status) & 0x3F),
+                               scsicmd->cmnd[0],
+                               le32_to_cpu(srbreply->scsi_status));
 #endif
-               if ((scsicmd->cmnd[0] == ATA_12)
-                 || (scsicmd->cmnd[0] == ATA_16)) {
-                       if (scsicmd->cmnd[2] & (0x01 << 5)) {
-                               scsicmd->result = DID_OK << 16
-                                               | COMMAND_COMPLETE << 8;
+                       if ((scsicmd->cmnd[0] == ATA_12)
+                               || (scsicmd->cmnd[0] == ATA_16)) {
+                                       if (scsicmd->cmnd[2] & (0x01 << 5)) {
+                                               scsicmd->result = DID_OK << 16
+                                                       | COMMAND_COMPLETE << 8;
                                break;
+                               } else {
+                                       scsicmd->result = DID_ERROR << 16
+                                               | COMMAND_COMPLETE << 8;
+                                       break;
+                               }
                        } else {
                                scsicmd->result = DID_ERROR << 16
-                                               | COMMAND_COMPLETE << 8;
+                                       | COMMAND_COMPLETE << 8;
                                break;
                        }
-               } else {
-                       scsicmd->result = DID_ERROR << 16
-                                       | COMMAND_COMPLETE << 8;
-                       break;
                }
-       }
-       if (le32_to_cpu(srbreply->scsi_status) == SAM_STAT_CHECK_CONDITION) {
-               int len;
-               scsicmd->result |= SAM_STAT_CHECK_CONDITION;
-               len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
-                           SCSI_SENSE_BUFFERSIZE);
+               if (le32_to_cpu(srbreply->scsi_status)
+                               == SAM_STAT_CHECK_CONDITION) {
+                       int len;
+
+                       scsicmd->result |= SAM_STAT_CHECK_CONDITION;
+                       len = min_t(u32, le32_to_cpu(srbreply->sense_data_size),
+                                   SCSI_SENSE_BUFFERSIZE);
 #ifdef AAC_DETAILED_STATUS_INFO
-               printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
-                                       le32_to_cpu(srbreply->status), len);
+                       printk(KERN_WARNING "aac_srb_callback: check condition, status = %d len=%d\n",
+                                               le32_to_cpu(srbreply->status), len);
 #endif
-               memcpy(scsicmd->sense_buffer, srbreply->sense_data, len);
+                       memcpy(scsicmd->sense_buffer,
+                                       srbreply->sense_data, len);
+               }
        }
        /*
         * OR in the scsi status (already shifted up a bit)