diff options
Diffstat (limited to 'drivers/message/fusion/mptspi.c')
-rw-r--r-- | drivers/message/fusion/mptspi.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 0e2803155ae2..8f61ba6aac23 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c | |||
@@ -780,7 +780,7 @@ static int mptspi_slave_configure(struct scsi_device *sdev) | |||
780 | } | 780 | } |
781 | 781 | ||
782 | static int | 782 | static int |
783 | mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) | 783 | mptspi_qcmd_lck(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) |
784 | { | 784 | { |
785 | struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host); | 785 | struct _MPT_SCSI_HOST *hd = shost_priv(SCpnt->device->host); |
786 | VirtDevice *vdevice = SCpnt->device->hostdata; | 786 | VirtDevice *vdevice = SCpnt->device->hostdata; |
@@ -805,6 +805,8 @@ mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) | |||
805 | return mptscsih_qcmd(SCpnt,done); | 805 | return mptscsih_qcmd(SCpnt,done); |
806 | } | 806 | } |
807 | 807 | ||
808 | static DEF_SCSI_QCMD(mptspi_qcmd) | ||
809 | |||
808 | static void mptspi_slave_destroy(struct scsi_device *sdev) | 810 | static void mptspi_slave_destroy(struct scsi_device *sdev) |
809 | { | 811 | { |
810 | struct scsi_target *starget = scsi_target(sdev); | 812 | struct scsi_target *starget = scsi_target(sdev); |
@@ -865,6 +867,10 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget, | |||
865 | struct _x_config_parms cfg; | 867 | struct _x_config_parms cfg; |
866 | struct _CONFIG_PAGE_HEADER hdr; | 868 | struct _CONFIG_PAGE_HEADER hdr; |
867 | int err = -EBUSY; | 869 | int err = -EBUSY; |
870 | u32 nego_parms; | ||
871 | u32 period; | ||
872 | struct scsi_device *sdev; | ||
873 | int i; | ||
868 | 874 | ||
869 | /* don't allow updating nego parameters on RAID devices */ | 875 | /* don't allow updating nego parameters on RAID devices */ |
870 | if (starget->channel == 0 && | 876 | if (starget->channel == 0 && |
@@ -902,6 +908,24 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget, | |||
902 | pg1->Header.PageNumber = hdr.PageNumber; | 908 | pg1->Header.PageNumber = hdr.PageNumber; |
903 | pg1->Header.PageType = hdr.PageType; | 909 | pg1->Header.PageType = hdr.PageType; |
904 | 910 | ||
911 | nego_parms = le32_to_cpu(pg1->RequestedParameters); | ||
912 | period = (nego_parms & MPI_SCSIDEVPAGE1_RP_MIN_SYNC_PERIOD_MASK) >> | ||
913 | MPI_SCSIDEVPAGE1_RP_SHIFT_MIN_SYNC_PERIOD; | ||
914 | if (period == 8) { | ||
915 | /* Turn on inline data padding for TAPE when running U320 */ | ||
916 | for (i = 0 ; i < 16; i++) { | ||
917 | sdev = scsi_device_lookup_by_target(starget, i); | ||
918 | if (sdev && sdev->type == TYPE_TAPE) { | ||
919 | sdev_printk(KERN_DEBUG, sdev, MYIOC_s_FMT | ||
920 | "IDP:ON\n", ioc->name); | ||
921 | nego_parms |= MPI_SCSIDEVPAGE1_RP_IDP; | ||
922 | pg1->RequestedParameters = | ||
923 | cpu_to_le32(nego_parms); | ||
924 | break; | ||
925 | } | ||
926 | } | ||
927 | } | ||
928 | |||
905 | mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters)); | 929 | mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters)); |
906 | 930 | ||
907 | if (mpt_config(ioc, &cfg)) { | 931 | if (mpt_config(ioc, &cfg)) { |