* [PATCH] Fix 64-bit system enumeration error for Buslogic
@ 2021-04-22 6:09 王文涛
2021-04-23 2:35 ` Khalid Aziz
0 siblings, 1 reply; 2+ messages in thread
From: 王文涛 @ 2021-04-22 6:09 UTC (permalink / raw)
To: Khalid Aziz; +Cc: linux-scsi, Elaine Zhao
From: matt <wwentao@vmware.com>
Date: Tue, 20 Apr 2021 15:27:48 +0800
Subject: [PATCH] Fix 64-bit system enumeration error for Buslogic
Commit 391e2f25601e("BusLogic: Port driver to 64-bit") in Buslogic
driver 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.
This patch fixes the error.
Signed-off-by: matt <wwentao@vmware.com>
---
drivers/scsi/BusLogic.c | 6 +++---
drivers/scsi/BusLogic.h | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index ccb061ab0a0a..7231de2767a9 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -3078,11 +3078,11 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command,
ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
ccb->datalen = count * sizeof(struct blogic_sg_seg);
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));
+ (unsigned long) ccb);
else
- ccb->data = ccb->sglist;
+ ccb->data = virt_to_32bit_virt(ccb->sglist);
scsi_for_each_sg(command, sg, count, i) {
ccb->sglist[i].segbytes = sg_dma_len(sg);
diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h
index 6182cc8a0344..e081ad47d1cf 100644
--- a/drivers/scsi/BusLogic.h
+++ b/drivers/scsi/BusLogic.h
@@ -814,7 +814,7 @@ struct blogic_ccb {
unsigned char cdblen; /* Byte 2 */
unsigned char sense_datalen; /* Byte 3 */
u32 datalen; /* Bytes 4-7 */
- void *data; /* Bytes 8-11 */
+ u32 data; /* Bytes 8-11 */
unsigned char:8; /* Byte 12 */
unsigned char:8; /* Byte 13 */
enum blogic_adapter_status adapter_status; /* Byte 14 */
--
2.17.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix 64-bit system enumeration error for Buslogic
2021-04-22 6:09 [PATCH] Fix 64-bit system enumeration error for Buslogic 王文涛
@ 2021-04-23 2:35 ` Khalid Aziz
0 siblings, 0 replies; 2+ messages in thread
From: Khalid Aziz @ 2021-04-23 2:35 UTC (permalink / raw)
To: 王文涛, Martin K . Petersen; +Cc: linux-scsi, Elaine Zhao
On 4/22/21 12:09 AM, 王文涛 wrote:
> From: matt <wwentao@vmware.com>
> Date: Tue, 20 Apr 2021 15:27:48 +0800
> Subject: [PATCH] Fix 64-bit system enumeration error for Buslogic
I would update this to "scsi: BusLogic: Fix 64-bit system enumeration
error for Buslogic". Martin, if you can do that when applying it to
scsi-staging,
Acked-by: Khalid Aziz <khalid@gonehiking.org>
>
> Commit 391e2f25601e("BusLogic: Port driver to 64-bit") in Buslogic
> driver 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.
>
> This patch fixes the error.
>
> Signed-off-by: matt <wwentao@vmware.com>
> ---
> drivers/scsi/BusLogic.c | 6 +++---
> drivers/scsi/BusLogic.h | 2 +-
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
> index ccb061ab0a0a..7231de2767a9 100644
> --- a/drivers/scsi/BusLogic.c
> +++ b/drivers/scsi/BusLogic.c
> @@ -3078,11 +3078,11 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command,
> ccb->opcode = BLOGIC_INITIATOR_CCB_SG;
> ccb->datalen = count * sizeof(struct blogic_sg_seg);
> 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));
> + (unsigned long) ccb);
> else
> - ccb->data = ccb->sglist;
> + ccb->data = virt_to_32bit_virt(ccb->sglist);
>
> scsi_for_each_sg(command, sg, count, i) {
> ccb->sglist[i].segbytes = sg_dma_len(sg);
> diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h
> index 6182cc8a0344..e081ad47d1cf 100644
> --- a/drivers/scsi/BusLogic.h
> +++ b/drivers/scsi/BusLogic.h
> @@ -814,7 +814,7 @@ struct blogic_ccb {
> unsigned char cdblen; /* Byte 2 */
> unsigned char sense_datalen; /* Byte 3 */
> u32 datalen; /* Bytes 4-7 */
> - void *data; /* Bytes 8-11 */
> + u32 data; /* Bytes 8-11 */
> unsigned char:8; /* Byte 12 */
> unsigned char:8; /* Byte 13 */
> enum blogic_adapter_status adapter_status; /* Byte 14 */
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-04-23 2:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-22 6:09 [PATCH] Fix 64-bit system enumeration error for Buslogic 王文涛
2021-04-23 2:35 ` Khalid Aziz
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.