Commit dc417545 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: arm: Move the SCSI pointer to private command data

Set .cmd_size in the SCSI host template instead of using the SCSI pointer
from struct scsi_cmnd. This patch prepares for removal of the SCSI pointer
from struct scsi_cmnd. The ARM SCSI drivers have been identified as follows:
$ git grep -l '#include.*arm_scsi.h'
drivers/scsi/arm/acornscsi.c
drivers/scsi/arm/cumana_2.c
drivers/scsi/arm/eesox.c
drivers/scsi/arm/fas216.c
drivers/scsi/arm/powertec.c

Link: https://lore.kernel.org/r/20220218195117.25689-11-bvanassche@acm.org
Cc: Russell King <linux@armlinux.org.uk>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8c97e2f3
...@@ -729,7 +729,7 @@ intr_ret_t acornscsi_kick(AS_Host *host) ...@@ -729,7 +729,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
*/ */
host->scsi.phase = PHASE_CONNECTING; host->scsi.phase = PHASE_CONNECTING;
host->SCpnt = SCpnt; host->SCpnt = SCpnt;
host->scsi.SCp = SCpnt->SCp; host->scsi.SCp = *arm_scsi_pointer(SCpnt);
host->dma.xfer_setup = 0; host->dma.xfer_setup = 0;
host->dma.xfer_required = 0; host->dma.xfer_required = 0;
host->dma.xfer_done = 0; host->dma.xfer_done = 0;
...@@ -1424,6 +1424,7 @@ unsigned char acornscsi_readmessagebyte(AS_Host *host) ...@@ -1424,6 +1424,7 @@ unsigned char acornscsi_readmessagebyte(AS_Host *host)
static static
void acornscsi_message(AS_Host *host) void acornscsi_message(AS_Host *host)
{ {
struct scsi_pointer *scsi_pointer;
unsigned char message[16]; unsigned char message[16];
unsigned int msgidx = 0, msglen = 1; unsigned int msgidx = 0, msglen = 1;
...@@ -1493,8 +1494,9 @@ void acornscsi_message(AS_Host *host) ...@@ -1493,8 +1494,9 @@ void acornscsi_message(AS_Host *host)
* the saved data pointer for the current I/O process. * the saved data pointer for the current I/O process.
*/ */
acornscsi_dma_cleanup(host); acornscsi_dma_cleanup(host);
host->SCpnt->SCp = host->scsi.SCp; scsi_pointer = arm_scsi_pointer(host->SCpnt);
host->SCpnt->SCp.sent_command = 0; *scsi_pointer = host->scsi.SCp;
scsi_pointer->sent_command = 0;
host->scsi.phase = PHASE_MSGIN; host->scsi.phase = PHASE_MSGIN;
break; break;
...@@ -1509,7 +1511,7 @@ void acornscsi_message(AS_Host *host) ...@@ -1509,7 +1511,7 @@ void acornscsi_message(AS_Host *host)
* the present command and status areas.' * the present command and status areas.'
*/ */
acornscsi_dma_cleanup(host); acornscsi_dma_cleanup(host);
host->scsi.SCp = host->SCpnt->SCp; host->scsi.SCp = *arm_scsi_pointer(host->SCpnt);
host->scsi.phase = PHASE_MSGIN; host->scsi.phase = PHASE_MSGIN;
break; break;
...@@ -1809,7 +1811,7 @@ int acornscsi_reconnect_finish(AS_Host *host) ...@@ -1809,7 +1811,7 @@ int acornscsi_reconnect_finish(AS_Host *host)
/* /*
* Restore data pointer from SAVED pointers. * Restore data pointer from SAVED pointers.
*/ */
host->scsi.SCp = host->SCpnt->SCp; host->scsi.SCp = *arm_scsi_pointer(host->SCpnt);
#if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON)) #if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON))
printk(", data pointers: [%p, %X]", printk(", data pointers: [%p, %X]",
host->scsi.SCp.ptr, host->scsi.SCp.this_residual); host->scsi.SCp.ptr, host->scsi.SCp.this_residual);
...@@ -2408,6 +2410,7 @@ acornscsi_intr(int irq, void *dev_id) ...@@ -2408,6 +2410,7 @@ acornscsi_intr(int irq, void *dev_id)
*/ */
static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt) static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt)
{ {
struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt);
void (*done)(struct scsi_cmnd *) = scsi_done; void (*done)(struct scsi_cmnd *) = scsi_done;
AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata;
...@@ -2423,9 +2426,9 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt) ...@@ -2423,9 +2426,9 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt)
SCpnt->host_scribble = NULL; SCpnt->host_scribble = NULL;
SCpnt->result = 0; SCpnt->result = 0;
SCpnt->SCp.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]); scsi_pointer->phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]);
SCpnt->SCp.sent_command = 0; scsi_pointer->sent_command = 0;
SCpnt->SCp.scsi_xferred = 0; scsi_pointer->scsi_xferred = 0;
init_SCp(SCpnt); init_SCp(SCpnt);
...@@ -2791,6 +2794,7 @@ static struct scsi_host_template acornscsi_template = { ...@@ -2791,6 +2794,7 @@ static struct scsi_host_template acornscsi_template = {
.cmd_per_lun = 2, .cmd_per_lun = 2,
.dma_boundary = PAGE_SIZE - 1, .dma_boundary = PAGE_SIZE - 1,
.proc_name = "acornscsi", .proc_name = "acornscsi",
.cmd_size = sizeof(struct arm_cmd_priv),
}; };
static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id) static int acornscsi_probe(struct expansion_card *ec, const struct ecard_id *id)
......
...@@ -9,6 +9,17 @@ ...@@ -9,6 +9,17 @@
#define BELT_AND_BRACES #define BELT_AND_BRACES
struct arm_cmd_priv {
struct scsi_pointer scsi_pointer;
};
static inline struct scsi_pointer *arm_scsi_pointer(struct scsi_cmnd *cmd)
{
struct arm_cmd_priv *acmd = scsi_cmd_priv(cmd);
return &acmd->scsi_pointer;
}
/* /*
* The scatter-gather list handling. This contains all * The scatter-gather list handling. This contains all
* the yucky stuff that needs to be fixed properly. * the yucky stuff that needs to be fixed properly.
...@@ -76,16 +87,18 @@ static inline void put_next_SCp_byte(struct scsi_pointer *SCp, unsigned char c) ...@@ -76,16 +87,18 @@ static inline void put_next_SCp_byte(struct scsi_pointer *SCp, unsigned char c)
static inline void init_SCp(struct scsi_cmnd *SCpnt) static inline void init_SCp(struct scsi_cmnd *SCpnt)
{ {
memset(&SCpnt->SCp, 0, sizeof(struct scsi_pointer)); struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt);
memset(scsi_pointer, 0, sizeof(struct scsi_pointer));
if (scsi_bufflen(SCpnt)) { if (scsi_bufflen(SCpnt)) {
unsigned long len = 0; unsigned long len = 0;
SCpnt->SCp.buffer = scsi_sglist(SCpnt); scsi_pointer->buffer = scsi_sglist(SCpnt);
SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1; scsi_pointer->buffers_residual = scsi_sg_count(SCpnt) - 1;
SCpnt->SCp.ptr = sg_virt(SCpnt->SCp.buffer); scsi_pointer->ptr = sg_virt(scsi_pointer->buffer);
SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; scsi_pointer->this_residual = scsi_pointer->buffer->length;
SCpnt->SCp.phase = scsi_bufflen(SCpnt); scsi_pointer->phase = scsi_bufflen(SCpnt);
#ifdef BELT_AND_BRACES #ifdef BELT_AND_BRACES
{ /* { /*
...@@ -109,15 +122,15 @@ static inline void init_SCp(struct scsi_cmnd *SCpnt) ...@@ -109,15 +122,15 @@ static inline void init_SCp(struct scsi_cmnd *SCpnt)
* FIXME: Totaly naive fixup. We should abort * FIXME: Totaly naive fixup. We should abort
* with error * with error
*/ */
SCpnt->SCp.phase = scsi_pointer->phase =
min_t(unsigned long, len, min_t(unsigned long, len,
scsi_bufflen(SCpnt)); scsi_bufflen(SCpnt));
} }
} }
#endif #endif
} else { } else {
SCpnt->SCp.ptr = NULL; scsi_pointer->ptr = NULL;
SCpnt->SCp.this_residual = 0; scsi_pointer->this_residual = 0;
SCpnt->SCp.phase = 0; scsi_pointer->phase = 0;
} }
} }
...@@ -761,7 +761,7 @@ static void fas216_transfer(FAS216_Info *info) ...@@ -761,7 +761,7 @@ static void fas216_transfer(FAS216_Info *info)
fas216_log(info, LOG_ERROR, "null buffer passed to " fas216_log(info, LOG_ERROR, "null buffer passed to "
"fas216_starttransfer"); "fas216_starttransfer");
print_SCp(&info->scsi.SCp, "SCp: ", "\n"); print_SCp(&info->scsi.SCp, "SCp: ", "\n");
print_SCp(&info->SCpnt->SCp, "Cmnd SCp: ", "\n"); print_SCp(arm_scsi_pointer(info->SCpnt), "Cmnd SCp: ", "\n");
return; return;
} }
...@@ -1011,7 +1011,7 @@ fas216_reselected_intr(FAS216_Info *info) ...@@ -1011,7 +1011,7 @@ fas216_reselected_intr(FAS216_Info *info)
/* /*
* Restore data pointer from SAVED data pointer * Restore data pointer from SAVED data pointer
*/ */
info->scsi.SCp = info->SCpnt->SCp; info->scsi.SCp = *arm_scsi_pointer(info->SCpnt);
fas216_log(info, LOG_CONNECT, "data pointers: [%p, %X]", fas216_log(info, LOG_CONNECT, "data pointers: [%p, %X]",
info->scsi.SCp.ptr, info->scsi.SCp.this_residual); info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
...@@ -1054,6 +1054,7 @@ fas216_reselected_intr(FAS216_Info *info) ...@@ -1054,6 +1054,7 @@ fas216_reselected_intr(FAS216_Info *info)
static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int msglen) static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int msglen)
{ {
struct scsi_pointer *scsi_pointer;
int i; int i;
switch (message[0]) { switch (message[0]) {
...@@ -1078,8 +1079,9 @@ static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int ...@@ -1078,8 +1079,9 @@ static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int
* as required by the SCSI II standard. These always * as required by the SCSI II standard. These always
* point to the start of their respective areas. * point to the start of their respective areas.
*/ */
info->SCpnt->SCp = info->scsi.SCp; scsi_pointer = arm_scsi_pointer(info->SCpnt);
info->SCpnt->SCp.sent_command = 0; *scsi_pointer = info->scsi.SCp;
scsi_pointer->sent_command = 0;
fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER, fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER,
"save data pointers: [%p, %X]", "save data pointers: [%p, %X]",
info->scsi.SCp.ptr, info->scsi.SCp.this_residual); info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
...@@ -1092,7 +1094,7 @@ static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int ...@@ -1092,7 +1094,7 @@ static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int
/* /*
* Restore current data pointer from SAVED data pointer * Restore current data pointer from SAVED data pointer
*/ */
info->scsi.SCp = info->SCpnt->SCp; info->scsi.SCp = *arm_scsi_pointer(info->SCpnt);
fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER, fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER,
"restore data pointers: [%p, 0x%x]", "restore data pointers: [%p, 0x%x]",
info->scsi.SCp.ptr, info->scsi.SCp.this_residual); info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
...@@ -1770,7 +1772,7 @@ static void fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt) ...@@ -1770,7 +1772,7 @@ static void fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt)
* claim host busy * claim host busy
*/ */
info->scsi.phase = PHASE_SELECTION; info->scsi.phase = PHASE_SELECTION;
info->scsi.SCp = SCpnt->SCp; info->scsi.SCp = *arm_scsi_pointer(SCpnt);
info->SCpnt = SCpnt; info->SCpnt = SCpnt;
info->dma.transfer_type = fasdma_none; info->dma.transfer_type = fasdma_none;
...@@ -1849,7 +1851,7 @@ static void fas216_do_bus_device_reset(FAS216_Info *info, ...@@ -1849,7 +1851,7 @@ static void fas216_do_bus_device_reset(FAS216_Info *info,
* claim host busy * claim host busy
*/ */
info->scsi.phase = PHASE_SELECTION; info->scsi.phase = PHASE_SELECTION;
info->scsi.SCp = SCpnt->SCp; info->scsi.SCp = *arm_scsi_pointer(SCpnt);
info->SCpnt = SCpnt; info->SCpnt = SCpnt;
info->dma.transfer_type = fasdma_none; info->dma.transfer_type = fasdma_none;
...@@ -1999,11 +2001,13 @@ static void fas216_devicereset_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, ...@@ -1999,11 +2001,13 @@ static void fas216_devicereset_done(FAS216_Info *info, struct scsi_cmnd *SCpnt,
static void fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, static void fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt,
unsigned int result) unsigned int result)
{ {
struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt);
fas216_log_target(info, LOG_CONNECT, SCpnt->device->id, fas216_log_target(info, LOG_CONNECT, SCpnt->device->id,
"request sense complete, result=0x%04x%02x%02x", "request sense complete, result=0x%04x%02x%02x",
result, SCpnt->SCp.Message, SCpnt->SCp.Status); result, scsi_pointer->Message, scsi_pointer->Status);
if (result != DID_OK || SCpnt->SCp.Status != SAM_STAT_GOOD) if (result != DID_OK || scsi_pointer->Status != SAM_STAT_GOOD)
/* /*
* Something went wrong. Make sure that we don't * Something went wrong. Make sure that we don't
* have valid data in the sense buffer that could * have valid data in the sense buffer that could
...@@ -2033,6 +2037,8 @@ static void fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, ...@@ -2033,6 +2037,8 @@ static void fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt,
static void static void
fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result) fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result)
{ {
struct scsi_pointer *scsi_pointer = arm_scsi_pointer(SCpnt);
info->stats.fins += 1; info->stats.fins += 1;
set_host_byte(SCpnt, result); set_host_byte(SCpnt, result);
...@@ -2107,8 +2113,8 @@ fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result) ...@@ -2107,8 +2113,8 @@ fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result)
fas216_log_target(info, LOG_CONNECT, SCpnt->device->id, fas216_log_target(info, LOG_CONNECT, SCpnt->device->id,
"requesting sense"); "requesting sense");
init_SCp(SCpnt); init_SCp(SCpnt);
SCpnt->SCp.Message = 0; scsi_pointer->Message = 0;
SCpnt->SCp.Status = 0; scsi_pointer->Status = 0;
SCpnt->host_scribble = (void *)fas216_rq_sns_done; SCpnt->host_scribble = (void *)fas216_rq_sns_done;
/* /*
......
...@@ -312,6 +312,10 @@ typedef struct { ...@@ -312,6 +312,10 @@ typedef struct {
/* driver-private data per SCSI command. */ /* driver-private data per SCSI command. */
struct fas216_cmd_priv { struct fas216_cmd_priv {
/*
* @scsi_pointer must be the first member. See also arm_scsi_pointer().
*/
struct scsi_pointer scsi_pointer;
void (*scsi_done)(struct scsi_cmnd *cmd); void (*scsi_done)(struct scsi_cmnd *cmd);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment