[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>
This commit is contained in:
		
							parent
							
								
									1a87828447
								
							
						
					
					
						commit
						ee33e2b771
					
				| @ -72,7 +72,7 @@ int sci_unsolicited_frame_control_construct(struct isci_host *ihost) | ||||
| 	 */ | ||||
| 	buf_len = SCU_MAX_UNSOLICITED_FRAMES * SCU_UNSOLICITED_FRAME_BUFFER_SIZE; | ||||
| 	header_len = SCU_MAX_UNSOLICITED_FRAMES * sizeof(struct scu_unsolicited_frame_header); | ||||
| 	size = buf_len + header_len + SCU_MAX_UNSOLICITED_FRAMES * sizeof(dma_addr_t); | ||||
| 	size = buf_len + header_len + SCU_MAX_UNSOLICITED_FRAMES * sizeof(uf_control->address_table.array[0]); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * The Unsolicited Frame buffers are set at the start of the UF | ||||
|  | ||||
| @ -214,7 +214,7 @@ struct sci_uf_address_table_array { | ||||
| 	 * starting address of the UF address table. | ||||
| 	 * 64-bit pointers are required by the hardware. | ||||
| 	 */ | ||||
| 	dma_addr_t *array; | ||||
| 	u64 *array; | ||||
| 
 | ||||
| 	/**
 | ||||
| 	 * This field specifies the physical address location for the UF | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user