Re: [PATCH v4 3/3] scsi: 3w-9xxx: Fix endianness issues in command packets

2021-01-12 Thread Samuel Holland
On 9/2/20 10:44 PM, Samuel Holland wrote:
> The controller expects all data it sends/receives to be little-endian.
> Therefore, the packet struct definitions should use the __le16/32/64
> types. Once those are correct, sparse reports several issues with the
> driver code, which are fixed here as well.
> 
> The main issue observed was at the call to scsi_set_resid, where the
> byteswapped parameter would eventually trigger the alignment check at
> drivers/scsi/sd.c:2009. At that point, the kernel would continuously
> complain about an "Unaligned partial completion", and no further I/O
> could occur.
> 
> This gets the controller working on big endian powerpc64.
> 
> Signed-off-by: Samuel Holland 

I believe I addressed all previous comments to this series in v4.
Is there anything preventing it from being merged? Do I need to resend it?

Regards,
Samuel


[PATCH v4 3/3] scsi: 3w-9xxx: Fix endianness issues in command packets

2020-09-02 Thread Samuel Holland
The controller expects all data it sends/receives to be little-endian.
Therefore, the packet struct definitions should use the __le16/32/64
types. Once those are correct, sparse reports several issues with the
driver code, which are fixed here as well.

The main issue observed was at the call to scsi_set_resid, where the
byteswapped parameter would eventually trigger the alignment check at
drivers/scsi/sd.c:2009. At that point, the kernel would continuously
complain about an "Unaligned partial completion", and no further I/O
could occur.

This gets the controller working on big endian powerpc64.

Signed-off-by: Samuel Holland 
---

Changes since v3: None.

---
 drivers/scsi/3w-9xxx.c |  56 ++---
 drivers/scsi/3w-9xxx.h | 111 +
 2 files changed, 81 insertions(+), 86 deletions(-)

diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
index aad9b3b73e15..593863317dc7 100644
--- a/drivers/scsi/3w-9xxx.c
+++ b/drivers/scsi/3w-9xxx.c
@@ -303,10 +303,10 @@ static int twa_aen_drain_queue(TW_Device_Extension 
*tw_dev, int no_check_reset)
 
/* Initialize sglist */
memset(&sglist, 0, sizeof(TW_SG_Entry));
-   sglist[0].length = TW_SECTOR_SIZE;
-   sglist[0].address = tw_dev->generic_buffer_phys[request_id];
+   sglist[0].length = cpu_to_le32(TW_SECTOR_SIZE);
+   sglist[0].address = 
TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
 
-   if (sglist[0].address & TW_ALIGNMENT_9000_SGL) {
+   if (tw_dev->generic_buffer_phys[request_id] & TW_ALIGNMENT_9000_SGL) {
TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Found unaligned 
address during AEN drain");
goto out;
}
@@ -440,8 +440,8 @@ static int twa_aen_read_queue(TW_Device_Extension *tw_dev, 
int request_id)
 
/* Initialize sglist */
memset(&sglist, 0, sizeof(TW_SG_Entry));
-   sglist[0].length = TW_SECTOR_SIZE;
-   sglist[0].address = tw_dev->generic_buffer_phys[request_id];
+   sglist[0].length = cpu_to_le32(TW_SECTOR_SIZE);
+   sglist[0].address = 
TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
 
/* Mark internal command */
tw_dev->srb[request_id] = NULL;
@@ -501,9 +501,8 @@ static void twa_aen_sync_time(TW_Device_Extension *tw_dev, 
int request_id)
Sunday 12:00AM */
local_time = (ktime_get_real_seconds() - (sys_tz.tz_minuteswest * 60));
div_u64_rem(local_time - (3 * 86400), 604800, &schedulertime);
-   schedulertime = cpu_to_le32(schedulertime % 604800);
 
-   memcpy(param->data, &schedulertime, sizeof(u32));
+   memcpy(param->data, &(__le32){cpu_to_le32(schedulertime)}, 
sizeof(__le32));
 
/* Mark internal command */
tw_dev->srb[request_id] = NULL;
@@ -1004,19 +1003,13 @@ static int twa_fill_sense(TW_Device_Extension *tw_dev, 
int request_id, int copy_
if (print_host)
printk(KERN_WARNING "3w-9xxx: scsi%d: ERROR: 
(0x%02X:0x%04X): %s:%s.\n",
   tw_dev->host->host_no,
-  TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
-  full_command_packet->header.status_block.error,
-  error_str[0] == '\0' ?
-  twa_string_lookup(twa_error_table,
-
full_command_packet->header.status_block.error) : error_str,
+  TW_MESSAGE_SOURCE_CONTROLLER_ERROR, error,
+  error_str[0] ? error_str : 
twa_string_lookup(twa_error_table, error),
   full_command_packet->header.err_specific_desc);
else
printk(KERN_WARNING "3w-9xxx: ERROR: (0x%02X:0x%04X): 
%s:%s.\n",
-  TW_MESSAGE_SOURCE_CONTROLLER_ERROR,
-  full_command_packet->header.status_block.error,
-  error_str[0] == '\0' ?
-  twa_string_lookup(twa_error_table,
-
full_command_packet->header.status_block.error) : error_str,
+  TW_MESSAGE_SOURCE_CONTROLLER_ERROR, error,
+  error_str[0] ? error_str : 
twa_string_lookup(twa_error_table, error),
   full_command_packet->header.err_specific_desc);
}
 
@@ -1133,12 +1126,11 @@ static int twa_initconnection(TW_Device_Extension 
*tw_dev, int message_credits,
tw_initconnect->opcode__reserved = TW_OPRES_IN(0, 
TW_OP_INIT_CONNECTION);
tw_initconnect->request_id = request_id;
tw_initconnect->message_credits = cpu_to_le16(message_credits);
-   tw_initconnect->features = set_features;
 
/* Turn on 64-bit sgl support if we need to */
-   tw_initconnect->features |= sizeof(dma_addr_t) > 4 ? 1 : 0;
+   set_features |= sizeof(dma_addr_t) > 4 ?