diff options
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_ctl.c')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_ctl.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c index fa9bf83819d5..d88e9756d8f5 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c +++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * controllers | 3 | * controllers |
4 | * | 4 | * |
5 | * This code is based on drivers/scsi/mpt2sas/mpt2_ctl.c | 5 | * This code is based on drivers/scsi/mpt2sas/mpt2_ctl.c |
6 | * Copyright (C) 2007-2009 LSI Corporation | 6 | * Copyright (C) 2007-2010 LSI Corporation |
7 | * (mailto:DL-MPTFusionLinux@lsi.com) | 7 | * (mailto:DL-MPTFusionLinux@lsi.com) |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
@@ -533,7 +533,7 @@ _ctl_set_task_mid(struct MPT2SAS_ADAPTER *ioc, struct mpt2_ioctl_command *karg, | |||
533 | if (!found) { | 533 | if (!found) { |
534 | dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " | 534 | dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " |
535 | "handle(0x%04x), lun(%d), no active mid!!\n", ioc->name, | 535 | "handle(0x%04x), lun(%d), no active mid!!\n", ioc->name, |
536 | desc, tm_request->DevHandle, lun)); | 536 | desc, le16_to_cpu(tm_request->DevHandle), lun)); |
537 | tm_reply = ioc->ctl_cmds.reply; | 537 | tm_reply = ioc->ctl_cmds.reply; |
538 | tm_reply->DevHandle = tm_request->DevHandle; | 538 | tm_reply->DevHandle = tm_request->DevHandle; |
539 | tm_reply->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; | 539 | tm_reply->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; |
@@ -551,7 +551,8 @@ _ctl_set_task_mid(struct MPT2SAS_ADAPTER *ioc, struct mpt2_ioctl_command *karg, | |||
551 | 551 | ||
552 | dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " | 552 | dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: " |
553 | "handle(0x%04x), lun(%d), task_mid(%d)\n", ioc->name, | 553 | "handle(0x%04x), lun(%d), task_mid(%d)\n", ioc->name, |
554 | desc, tm_request->DevHandle, lun, tm_request->TaskMID)); | 554 | desc, le16_to_cpu(tm_request->DevHandle), lun, |
555 | le16_to_cpu(tm_request->TaskMID))); | ||
555 | return 0; | 556 | return 0; |
556 | } | 557 | } |
557 | 558 | ||
@@ -647,9 +648,9 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
647 | 648 | ||
648 | if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || | 649 | if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || |
649 | mpi_request->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) { | 650 | mpi_request->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH) { |
650 | if (!mpi_request->FunctionDependent1 || | 651 | if (!le16_to_cpu(mpi_request->FunctionDependent1) || |
651 | mpi_request->FunctionDependent1 > | 652 | le16_to_cpu(mpi_request->FunctionDependent1) > |
652 | cpu_to_le16(ioc->facts.MaxDevHandle)) { | 653 | ioc->facts.MaxDevHandle) { |
653 | ret = -EINVAL; | 654 | ret = -EINVAL; |
654 | mpt2sas_base_free_smid(ioc, smid); | 655 | mpt2sas_base_free_smid(ioc, smid); |
655 | goto out; | 656 | goto out; |
@@ -743,8 +744,11 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
743 | mpt2sas_base_get_sense_buffer_dma(ioc, smid); | 744 | mpt2sas_base_get_sense_buffer_dma(ioc, smid); |
744 | priv_sense = mpt2sas_base_get_sense_buffer(ioc, smid); | 745 | priv_sense = mpt2sas_base_get_sense_buffer(ioc, smid); |
745 | memset(priv_sense, 0, SCSI_SENSE_BUFFERSIZE); | 746 | memset(priv_sense, 0, SCSI_SENSE_BUFFERSIZE); |
746 | mpt2sas_base_put_smid_scsi_io(ioc, smid, | 747 | if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST) |
747 | le16_to_cpu(mpi_request->FunctionDependent1)); | 748 | mpt2sas_base_put_smid_scsi_io(ioc, smid, |
749 | le16_to_cpu(mpi_request->FunctionDependent1)); | ||
750 | else | ||
751 | mpt2sas_base_put_smid_default(ioc, smid); | ||
748 | break; | 752 | break; |
749 | } | 753 | } |
750 | case MPI2_FUNCTION_SCSI_TASK_MGMT: | 754 | case MPI2_FUNCTION_SCSI_TASK_MGMT: |
@@ -752,6 +756,10 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
752 | Mpi2SCSITaskManagementRequest_t *tm_request = | 756 | Mpi2SCSITaskManagementRequest_t *tm_request = |
753 | (Mpi2SCSITaskManagementRequest_t *)mpi_request; | 757 | (Mpi2SCSITaskManagementRequest_t *)mpi_request; |
754 | 758 | ||
759 | dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "TASK_MGMT: " | ||
760 | "handle(0x%04x), task_type(0x%02x)\n", ioc->name, | ||
761 | le16_to_cpu(tm_request->DevHandle), tm_request->TaskType)); | ||
762 | |||
755 | if (tm_request->TaskType == | 763 | if (tm_request->TaskType == |
756 | MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK || | 764 | MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK || |
757 | tm_request->TaskType == | 765 | tm_request->TaskType == |
@@ -762,7 +770,6 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
762 | } | 770 | } |
763 | } | 771 | } |
764 | 772 | ||
765 | mutex_lock(&ioc->tm_cmds.mutex); | ||
766 | mpt2sas_scsih_set_tm_flag(ioc, le16_to_cpu( | 773 | mpt2sas_scsih_set_tm_flag(ioc, le16_to_cpu( |
767 | tm_request->DevHandle)); | 774 | tm_request->DevHandle)); |
768 | mpt2sas_base_put_smid_hi_priority(ioc, smid); | 775 | mpt2sas_base_put_smid_hi_priority(ioc, smid); |
@@ -818,7 +825,6 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
818 | if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) { | 825 | if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) { |
819 | Mpi2SCSITaskManagementRequest_t *tm_request = | 826 | Mpi2SCSITaskManagementRequest_t *tm_request = |
820 | (Mpi2SCSITaskManagementRequest_t *)mpi_request; | 827 | (Mpi2SCSITaskManagementRequest_t *)mpi_request; |
821 | mutex_unlock(&ioc->tm_cmds.mutex); | ||
822 | mpt2sas_scsih_clear_tm_flag(ioc, le16_to_cpu( | 828 | mpt2sas_scsih_clear_tm_flag(ioc, le16_to_cpu( |
823 | tm_request->DevHandle)); | 829 | tm_request->DevHandle)); |
824 | } else if ((mpi_request->Function == MPI2_FUNCTION_SMP_PASSTHROUGH || | 830 | } else if ((mpi_request->Function == MPI2_FUNCTION_SMP_PASSTHROUGH || |
@@ -897,14 +903,13 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, | |||
897 | MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { | 903 | MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { |
898 | printk(MPT2SAS_INFO_FMT "issue target reset: handle " | 904 | printk(MPT2SAS_INFO_FMT "issue target reset: handle " |
899 | "= (0x%04x)\n", ioc->name, | 905 | "= (0x%04x)\n", ioc->name, |
900 | mpi_request->FunctionDependent1); | 906 | le16_to_cpu(mpi_request->FunctionDependent1)); |
901 | mpt2sas_halt_firmware(ioc); | 907 | mpt2sas_halt_firmware(ioc); |
902 | mutex_lock(&ioc->tm_cmds.mutex); | ||
903 | mpt2sas_scsih_issue_tm(ioc, | 908 | mpt2sas_scsih_issue_tm(ioc, |
904 | mpi_request->FunctionDependent1, 0, | 909 | le16_to_cpu(mpi_request->FunctionDependent1), 0, 0, |
905 | MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 10); | 910 | 0, MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET, 0, 10, |
911 | NULL); | ||
906 | ioc->tm_cmds.status = MPT2_CMD_NOT_USED; | 912 | ioc->tm_cmds.status = MPT2_CMD_NOT_USED; |
907 | mutex_unlock(&ioc->tm_cmds.mutex); | ||
908 | } else | 913 | } else |
909 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, | 914 | mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, |
910 | FORCE_BIG_HAMMER); | 915 | FORCE_BIG_HAMMER); |
@@ -1373,7 +1378,8 @@ _ctl_diag_register_2(struct MPT2SAS_ADAPTER *ioc, | |||
1373 | 1378 | ||
1374 | dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: diag_buffer(0x%p), " | 1379 | dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: diag_buffer(0x%p), " |
1375 | "dma(0x%llx), sz(%d)\n", ioc->name, __func__, request_data, | 1380 | "dma(0x%llx), sz(%d)\n", ioc->name, __func__, request_data, |
1376 | (unsigned long long)request_data_dma, mpi_request->BufferLength)); | 1381 | (unsigned long long)request_data_dma, |
1382 | le32_to_cpu(mpi_request->BufferLength))); | ||
1377 | 1383 | ||
1378 | for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++) | 1384 | for (i = 0; i < MPT2_PRODUCT_SPECIFIC_DWORDS; i++) |
1379 | mpi_request->ProductSpecific[i] = | 1385 | mpi_request->ProductSpecific[i] = |
@@ -2334,8 +2340,8 @@ _ctl_version_nvdata_persistent_show(struct device *cdev, | |||
2334 | struct Scsi_Host *shost = class_to_shost(cdev); | 2340 | struct Scsi_Host *shost = class_to_shost(cdev); |
2335 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); | 2341 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); |
2336 | 2342 | ||
2337 | return snprintf(buf, PAGE_SIZE, "%02xh\n", | 2343 | return snprintf(buf, PAGE_SIZE, "%08xh\n", |
2338 | le16_to_cpu(ioc->iounit_pg0.NvdataVersionPersistent.Word)); | 2344 | le32_to_cpu(ioc->iounit_pg0.NvdataVersionPersistent.Word)); |
2339 | } | 2345 | } |
2340 | static DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, | 2346 | static DEVICE_ATTR(version_nvdata_persistent, S_IRUGO, |
2341 | _ctl_version_nvdata_persistent_show, NULL); | 2347 | _ctl_version_nvdata_persistent_show, NULL); |
@@ -2354,8 +2360,8 @@ _ctl_version_nvdata_default_show(struct device *cdev, | |||
2354 | struct Scsi_Host *shost = class_to_shost(cdev); | 2360 | struct Scsi_Host *shost = class_to_shost(cdev); |
2355 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); | 2361 | struct MPT2SAS_ADAPTER *ioc = shost_priv(shost); |
2356 | 2362 | ||
2357 | return snprintf(buf, PAGE_SIZE, "%02xh\n", | 2363 | return snprintf(buf, PAGE_SIZE, "%08xh\n", |
2358 | le16_to_cpu(ioc->iounit_pg0.NvdataVersionDefault.Word)); | 2364 | le32_to_cpu(ioc->iounit_pg0.NvdataVersionDefault.Word)); |
2359 | } | 2365 | } |
2360 | static DEVICE_ATTR(version_nvdata_default, S_IRUGO, | 2366 | static DEVICE_ATTR(version_nvdata_default, S_IRUGO, |
2361 | _ctl_version_nvdata_default_show, NULL); | 2367 | _ctl_version_nvdata_default_show, NULL); |