diff options
author | Dan Williams <dan.j.williams@intel.com> | 2011-07-29 20:16:45 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-08-23 22:50:27 -0400 |
commit | ee33e2b771f9e9e4aaba2bb2ace7b727fe451a8b (patch) | |
tree | d7aeaef179c98df3135d4ad5a872643d226b691c /drivers/scsi/isci | |
parent | 1a878284473284f9577d44babf16d87152a05c33 (diff) |
[SCSI] isci: fix 32-bit operation when CONFIG_HIGHMEM64G=n
The unsolicited frame control infrastructure requires a table of dma
addresses for the hardware to lookup the frame buffer location by an
index. The hardware expects the elements of this table to be 64-bit
quantities, so we cannot reference these elements as dma_addr_t. All
unsolicited frame protocols are affected, particularly SATA-PIO and SMP
which prevented direct-attached SATA drives and expander-attached drives
to not be discovered.
Cc: <stable@kernel.org>
Reported-by: Jacek Danecki <jacek.danecki@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/isci')
-rw-r--r-- | drivers/scsi/isci/unsolicited_frame_control.c | 2 | ||||
-rw-r--r-- | drivers/scsi/isci/unsolicited_frame_control.h | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/drivers/scsi/isci/unsolicited_frame_control.c b/drivers/scsi/isci/unsolicited_frame_control.c index e9e1e2abacb9..16f88ab939c8 100644 --- a/drivers/scsi/isci/unsolicited_frame_control.c +++ b/drivers/scsi/isci/unsolicited_frame_control.c | |||
@@ -72,7 +72,7 @@ int sci_unsolicited_frame_control_construct(struct isci_host *ihost) | |||
72 | */ | 72 | */ |
73 | buf_len = SCU_MAX_UNSOLICITED_FRAMES * SCU_UNSOLICITED_FRAME_BUFFER_SIZE; | 73 | buf_len = SCU_MAX_UNSOLICITED_FRAMES * SCU_UNSOLICITED_FRAME_BUFFER_SIZE; |
74 | header_len = SCU_MAX_UNSOLICITED_FRAMES * sizeof(struct scu_unsolicited_frame_header); | 74 | header_len = SCU_MAX_UNSOLICITED_FRAMES * sizeof(struct scu_unsolicited_frame_header); |
75 | size = buf_len + header_len + SCU_MAX_UNSOLICITED_FRAMES * sizeof(dma_addr_t); | 75 | size = buf_len + header_len + SCU_MAX_UNSOLICITED_FRAMES * sizeof(uf_control->address_table.array[0]); |
76 | 76 | ||
77 | /* | 77 | /* |
78 | * The Unsolicited Frame buffers are set at the start of the UF | 78 | * The Unsolicited Frame buffers are set at the start of the UF |
diff --git a/drivers/scsi/isci/unsolicited_frame_control.h b/drivers/scsi/isci/unsolicited_frame_control.h index 31cb9506f52d..75d896686f5a 100644 --- a/drivers/scsi/isci/unsolicited_frame_control.h +++ b/drivers/scsi/isci/unsolicited_frame_control.h | |||
@@ -214,7 +214,7 @@ struct sci_uf_address_table_array { | |||
214 | * starting address of the UF address table. | 214 | * starting address of the UF address table. |
215 | * 64-bit pointers are required by the hardware. | 215 | * 64-bit pointers are required by the hardware. |
216 | */ | 216 | */ |
217 | dma_addr_t *array; | 217 | u64 *array; |
218 | 218 | ||
219 | /** | 219 | /** |
220 | * This field specifies the physical address location for the UF | 220 | * This field specifies the physical address location for the UF |