scsi: BusLogic: Fix 64-bit system enumeration error for Buslogic
[ Upstream commit 56f396146af278135c0ff958c79b5ee1bd22453d ]
Commit 391e2f2560
("[SCSI] BusLogic: Port driver to 64-bit")
introduced a serious issue for 64-bit systems. With this commit,
64-bit kernel will enumerate 8*15 non-existing disks. This is caused
by the broken CCB structure. The change from u32 data to void *data
increased CCB length on 64-bit system, which introduced an extra 4
byte offset of the CDB. This leads to incorrect response to INQUIRY
commands during enumeration.
Fix disk enumeration failure by reverting the portion of the commit
above which switched the data pointer from u32 to void.
Link: https://lore.kernel.org/r/C325637F-1166-4340-8F0F-3BCCD59D4D54@vmware.com
Acked-by: Khalid Aziz <khalid@gonehiking.org>
Signed-off-by: Matt Wang <wwentao@vmware.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
55575c0850
commit
fed34fb07c
@ -3077,11 +3077,11 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command,
|
|||||||
ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
|
ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
|
||||||
ccb->datalen = count * sizeof(struct blogic_sg_seg);
|
ccb->datalen = count * sizeof(struct blogic_sg_seg);
|
||||||
if (blogic_multimaster_type(adapter))
|
if (blogic_multimaster_type(adapter))
|
||||||
ccb->data = (void *)((unsigned int) ccb->dma_handle +
|
ccb->data = (unsigned int) ccb->dma_handle +
|
||||||
((unsigned long) &ccb->sglist -
|
((unsigned long) &ccb->sglist -
|
||||||
(unsigned long) ccb));
|
(unsigned long) ccb);
|
||||||
else
|
else
|
||||||
ccb->data = ccb->sglist;
|
ccb->data = virt_to_32bit_virt(ccb->sglist);
|
||||||
|
|
||||||
scsi_for_each_sg(command, sg, count, i) {
|
scsi_for_each_sg(command, sg, count, i) {
|
||||||
ccb->sglist[i].segbytes = sg_dma_len(sg);
|
ccb->sglist[i].segbytes = sg_dma_len(sg);
|
||||||
|
@ -814,7 +814,7 @@ struct blogic_ccb {
|
|||||||
unsigned char cdblen; /* Byte 2 */
|
unsigned char cdblen; /* Byte 2 */
|
||||||
unsigned char sense_datalen; /* Byte 3 */
|
unsigned char sense_datalen; /* Byte 3 */
|
||||||
u32 datalen; /* Bytes 4-7 */
|
u32 datalen; /* Bytes 4-7 */
|
||||||
void *data; /* Bytes 8-11 */
|
u32 data; /* Bytes 8-11 */
|
||||||
unsigned char:8; /* Byte 12 */
|
unsigned char:8; /* Byte 12 */
|
||||||
unsigned char:8; /* Byte 13 */
|
unsigned char:8; /* Byte 13 */
|
||||||
enum blogic_adapter_status adapter_status; /* Byte 14 */
|
enum blogic_adapter_status adapter_status; /* Byte 14 */
|
||||||
|
Loading…
Reference in New Issue
Block a user