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

scsi: aha152x: 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.

Link: https://lore.kernel.org/r/20220218195117.25689-16-bvanassche@acm.orgReviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
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 ea1c9475
...@@ -316,6 +316,17 @@ enum { ...@@ -316,6 +316,17 @@ enum {
check_condition = 0x0800, /* requesting sense after CHECK CONDITION */ check_condition = 0x0800, /* requesting sense after CHECK CONDITION */
}; };
struct aha152x_cmd_priv {
struct scsi_pointer scsi_pointer;
};
static struct scsi_pointer *aha152x_scsi_pointer(struct scsi_cmnd *cmd)
{
struct aha152x_cmd_priv *acmd = scsi_cmd_priv(cmd);
return &acmd->scsi_pointer;
}
MODULE_AUTHOR("Jürgen Fischer"); MODULE_AUTHOR("Jürgen Fischer");
MODULE_DESCRIPTION(AHA152X_REVID); MODULE_DESCRIPTION(AHA152X_REVID);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -879,14 +890,17 @@ void aha152x_release(struct Scsi_Host *shpnt) ...@@ -879,14 +890,17 @@ void aha152x_release(struct Scsi_Host *shpnt)
static int setup_expected_interrupts(struct Scsi_Host *shpnt) static int setup_expected_interrupts(struct Scsi_Host *shpnt)
{ {
if(CURRENT_SC) { if(CURRENT_SC) {
CURRENT_SC->SCp.phase |= 1 << 16; struct scsi_pointer *scsi_pointer =
aha152x_scsi_pointer(CURRENT_SC);
if(CURRENT_SC->SCp.phase & selecting) { scsi_pointer->phase |= 1 << 16;
if (scsi_pointer->phase & selecting) {
SETPORT(SSTAT1, SELTO); SETPORT(SSTAT1, SELTO);
SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0)); SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
SETPORT(SIMODE1, ENSELTIMO); SETPORT(SIMODE1, ENSELTIMO);
} else { } else {
SETPORT(SIMODE0, (CURRENT_SC->SCp.phase & spiordy) ? ENSPIORDY : 0); SETPORT(SIMODE0, (scsi_pointer->phase & spiordy) ? ENSPIORDY : 0);
SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE); SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
} }
} else if(STATE==seldi) { } else if(STATE==seldi) {
...@@ -910,16 +924,17 @@ static int setup_expected_interrupts(struct Scsi_Host *shpnt) ...@@ -910,16 +924,17 @@ static int setup_expected_interrupts(struct Scsi_Host *shpnt)
static int aha152x_internal_queue(struct scsi_cmnd *SCpnt, static int aha152x_internal_queue(struct scsi_cmnd *SCpnt,
struct completion *complete, int phase) struct completion *complete, int phase)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(SCpnt);
struct Scsi_Host *shpnt = SCpnt->device->host; struct Scsi_Host *shpnt = SCpnt->device->host;
unsigned long flags; unsigned long flags;
SCpnt->SCp.phase = not_issued | phase; scsi_pointer->phase = not_issued | phase;
SCpnt->SCp.Status = 0x1; /* Ilegal status by SCSI standard */ scsi_pointer->Status = 0x1; /* Ilegal status by SCSI standard */
SCpnt->SCp.Message = 0; scsi_pointer->Message = 0;
SCpnt->SCp.have_data_in = 0; scsi_pointer->have_data_in = 0;
SCpnt->SCp.sent_command = 0; scsi_pointer->sent_command = 0;
if(SCpnt->SCp.phase & (resetting|check_condition)) { if (scsi_pointer->phase & (resetting | check_condition)) {
if (!SCpnt->host_scribble || SCSEM(SCpnt) || SCNEXT(SCpnt)) { if (!SCpnt->host_scribble || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
scmd_printk(KERN_ERR, SCpnt, "cannot reuse command\n"); scmd_printk(KERN_ERR, SCpnt, "cannot reuse command\n");
return FAILED; return FAILED;
...@@ -942,15 +957,15 @@ static int aha152x_internal_queue(struct scsi_cmnd *SCpnt, ...@@ -942,15 +957,15 @@ static int aha152x_internal_queue(struct scsi_cmnd *SCpnt,
SCp.phase : current state of the command */ SCp.phase : current state of the command */
if ((phase & resetting) || !scsi_sglist(SCpnt)) { if ((phase & resetting) || !scsi_sglist(SCpnt)) {
SCpnt->SCp.ptr = NULL; scsi_pointer->ptr = NULL;
SCpnt->SCp.this_residual = 0; scsi_pointer->this_residual = 0;
scsi_set_resid(SCpnt, 0); scsi_set_resid(SCpnt, 0);
SCpnt->SCp.buffer = NULL; scsi_pointer->buffer = NULL;
} else { } else {
scsi_set_resid(SCpnt, scsi_bufflen(SCpnt)); scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
SCpnt->SCp.buffer = scsi_sglist(SCpnt); scsi_pointer->buffer = scsi_sglist(SCpnt);
SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer); scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer);
SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; scsi_pointer->this_residual = scsi_pointer->buffer->length;
} }
DO_LOCK(flags); DO_LOCK(flags);
...@@ -1000,7 +1015,7 @@ static void reset_done(struct scsi_cmnd *SCpnt) ...@@ -1000,7 +1015,7 @@ static void reset_done(struct scsi_cmnd *SCpnt)
static void aha152x_scsi_done(struct scsi_cmnd *SCpnt) static void aha152x_scsi_done(struct scsi_cmnd *SCpnt)
{ {
if (SCpnt->SCp.phase & resetting) if (aha152x_scsi_pointer(SCpnt)->phase & resetting)
reset_done(SCpnt); reset_done(SCpnt);
else else
scsi_done(SCpnt); scsi_done(SCpnt);
...@@ -1086,7 +1101,7 @@ static int aha152x_device_reset(struct scsi_cmnd * SCpnt) ...@@ -1086,7 +1101,7 @@ static int aha152x_device_reset(struct scsi_cmnd * SCpnt)
DO_LOCK(flags); DO_LOCK(flags);
if(SCpnt->SCp.phase & resetted) { if (aha152x_scsi_pointer(SCpnt)->phase & resetted) {
HOSTDATA(shpnt)->commands--; HOSTDATA(shpnt)->commands--;
if (!HOSTDATA(shpnt)->commands) if (!HOSTDATA(shpnt)->commands)
SETPORT(PORTA, 0); SETPORT(PORTA, 0);
...@@ -1380,28 +1395,31 @@ static void busfree_run(struct Scsi_Host *shpnt) ...@@ -1380,28 +1395,31 @@ static void busfree_run(struct Scsi_Host *shpnt)
SETPORT(SSTAT1, CLRBUSFREE); SETPORT(SSTAT1, CLRBUSFREE);
if(CURRENT_SC) { if(CURRENT_SC) {
struct scsi_pointer *scsi_pointer =
aha152x_scsi_pointer(CURRENT_SC);
#if defined(AHA152X_STAT) #if defined(AHA152X_STAT)
action++; action++;
#endif #endif
CURRENT_SC->SCp.phase &= ~syncneg; scsi_pointer->phase &= ~syncneg;
if(CURRENT_SC->SCp.phase & completed) { if (scsi_pointer->phase & completed) {
/* target sent COMMAND COMPLETE */ /* target sent COMMAND COMPLETE */
done(shpnt, CURRENT_SC->SCp.Status, DID_OK); done(shpnt, scsi_pointer->Status, DID_OK);
} else if(CURRENT_SC->SCp.phase & aborted) { } else if (scsi_pointer->phase & aborted) {
done(shpnt, CURRENT_SC->SCp.Status, DID_ABORT); done(shpnt, scsi_pointer->Status, DID_ABORT);
} else if(CURRENT_SC->SCp.phase & resetted) { } else if (scsi_pointer->phase & resetted) {
done(shpnt, CURRENT_SC->SCp.Status, DID_RESET); done(shpnt, scsi_pointer->Status, DID_RESET);
} else if(CURRENT_SC->SCp.phase & disconnected) { } else if (scsi_pointer->phase & disconnected) {
/* target sent DISCONNECT */ /* target sent DISCONNECT */
#if defined(AHA152X_STAT) #if defined(AHA152X_STAT)
HOSTDATA(shpnt)->disconnections++; HOSTDATA(shpnt)->disconnections++;
#endif #endif
append_SC(&DISCONNECTED_SC, CURRENT_SC); append_SC(&DISCONNECTED_SC, CURRENT_SC);
CURRENT_SC->SCp.phase |= 1 << 16; scsi_pointer->phase |= 1 << 16;
CURRENT_SC = NULL; CURRENT_SC = NULL;
} else { } else {
...@@ -1420,23 +1438,24 @@ static void busfree_run(struct Scsi_Host *shpnt) ...@@ -1420,23 +1438,24 @@ static void busfree_run(struct Scsi_Host *shpnt)
action++; action++;
#endif #endif
if(DONE_SC->SCp.phase & check_condition) { if (aha152x_scsi_pointer(DONE_SC)->phase & check_condition) {
struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC; struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
struct aha152x_scdata *sc = SCDATA(cmd); struct aha152x_scdata *sc = SCDATA(cmd);
scsi_eh_restore_cmnd(cmd, &sc->ses); scsi_eh_restore_cmnd(cmd, &sc->ses);
cmd->SCp.Status = SAM_STAT_CHECK_CONDITION; aha152x_scsi_pointer(cmd)->Status = SAM_STAT_CHECK_CONDITION;
HOSTDATA(shpnt)->commands--; HOSTDATA(shpnt)->commands--;
if (!HOSTDATA(shpnt)->commands) if (!HOSTDATA(shpnt)->commands)
SETPORT(PORTA, 0); /* turn led off */ SETPORT(PORTA, 0); /* turn led off */
} else if(DONE_SC->SCp.Status==SAM_STAT_CHECK_CONDITION) { } else if (aha152x_scsi_pointer(DONE_SC)->Status ==
SAM_STAT_CHECK_CONDITION) {
#if defined(AHA152X_STAT) #if defined(AHA152X_STAT)
HOSTDATA(shpnt)->busfree_with_check_condition++; HOSTDATA(shpnt)->busfree_with_check_condition++;
#endif #endif
if(!(DONE_SC->SCp.phase & not_issued)) { if(!(aha152x_scsi_pointer(DONE_SC)->phase & not_issued)) {
struct aha152x_scdata *sc; struct aha152x_scdata *sc;
struct scsi_cmnd *ptr = DONE_SC; struct scsi_cmnd *ptr = DONE_SC;
DONE_SC=NULL; DONE_SC=NULL;
...@@ -1461,7 +1480,7 @@ static void busfree_run(struct Scsi_Host *shpnt) ...@@ -1461,7 +1480,7 @@ static void busfree_run(struct Scsi_Host *shpnt)
if (!HOSTDATA(shpnt)->commands) if (!HOSTDATA(shpnt)->commands)
SETPORT(PORTA, 0); /* turn led off */ SETPORT(PORTA, 0); /* turn led off */
if (!(ptr->SCp.phase & resetting)) { if (!(aha152x_scsi_pointer(ptr)->phase & resetting)) {
kfree(ptr->host_scribble); kfree(ptr->host_scribble);
ptr->host_scribble=NULL; ptr->host_scribble=NULL;
} }
...@@ -1484,10 +1503,13 @@ static void busfree_run(struct Scsi_Host *shpnt) ...@@ -1484,10 +1503,13 @@ static void busfree_run(struct Scsi_Host *shpnt)
DO_UNLOCK(flags); DO_UNLOCK(flags);
if(CURRENT_SC) { if(CURRENT_SC) {
struct scsi_pointer *scsi_pointer =
aha152x_scsi_pointer(CURRENT_SC);
#if defined(AHA152X_STAT) #if defined(AHA152X_STAT)
action++; action++;
#endif #endif
CURRENT_SC->SCp.phase |= selecting; scsi_pointer->phase |= selecting;
/* clear selection timeout */ /* clear selection timeout */
SETPORT(SSTAT1, SELTO); SETPORT(SSTAT1, SELTO);
...@@ -1515,11 +1537,13 @@ static void busfree_run(struct Scsi_Host *shpnt) ...@@ -1515,11 +1537,13 @@ static void busfree_run(struct Scsi_Host *shpnt)
*/ */
static void seldo_run(struct Scsi_Host *shpnt) static void seldo_run(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
SETPORT(SCSISIG, 0); SETPORT(SCSISIG, 0);
SETPORT(SSTAT1, CLRBUSFREE); SETPORT(SSTAT1, CLRBUSFREE);
SETPORT(SSTAT1, CLRPHASECHG); SETPORT(SSTAT1, CLRPHASECHG);
CURRENT_SC->SCp.phase &= ~(selecting|not_issued); scsi_pointer->phase &= ~(selecting | not_issued);
SETPORT(SCSISEQ, 0); SETPORT(SCSISEQ, 0);
...@@ -1534,12 +1558,12 @@ static void seldo_run(struct Scsi_Host *shpnt) ...@@ -1534,12 +1558,12 @@ static void seldo_run(struct Scsi_Host *shpnt)
ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun)); ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
if (CURRENT_SC->SCp.phase & aborting) { if (scsi_pointer->phase & aborting) {
ADDMSGO(ABORT); ADDMSGO(ABORT);
} else if (CURRENT_SC->SCp.phase & resetting) { } else if (scsi_pointer->phase & resetting) {
ADDMSGO(BUS_DEVICE_RESET); ADDMSGO(BUS_DEVICE_RESET);
} else if (SYNCNEG==0 && SYNCHRONOUS) { } else if (SYNCNEG==0 && SYNCHRONOUS) {
CURRENT_SC->SCp.phase |= syncneg; scsi_pointer->phase |= syncneg;
MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8); MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
SYNCNEG=1; /* negotiation in progress */ SYNCNEG=1; /* negotiation in progress */
} }
...@@ -1554,15 +1578,17 @@ static void seldo_run(struct Scsi_Host *shpnt) ...@@ -1554,15 +1578,17 @@ static void seldo_run(struct Scsi_Host *shpnt)
*/ */
static void selto_run(struct Scsi_Host *shpnt) static void selto_run(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
SETPORT(SCSISEQ, 0); SETPORT(SCSISEQ, 0);
SETPORT(SSTAT1, CLRSELTIMO); SETPORT(SSTAT1, CLRSELTIMO);
if (!CURRENT_SC) if (!CURRENT_SC)
return; return;
CURRENT_SC->SCp.phase &= ~selecting; scsi_pointer->phase &= ~selecting;
if (CURRENT_SC->SCp.phase & aborted) if (scsi_pointer->phase & aborted)
done(shpnt, SAM_STAT_GOOD, DID_ABORT); done(shpnt, SAM_STAT_GOOD, DID_ABORT);
else if (TESTLO(SSTAT0, SELINGO)) else if (TESTLO(SSTAT0, SELINGO))
done(shpnt, SAM_STAT_GOOD, DID_BUS_BUSY); done(shpnt, SAM_STAT_GOOD, DID_BUS_BUSY);
...@@ -1590,7 +1616,10 @@ static void seldi_run(struct Scsi_Host *shpnt) ...@@ -1590,7 +1616,10 @@ static void seldi_run(struct Scsi_Host *shpnt)
SETPORT(SSTAT1, CLRPHASECHG); SETPORT(SSTAT1, CLRPHASECHG);
if(CURRENT_SC) { if(CURRENT_SC) {
if(!(CURRENT_SC->SCp.phase & not_issued)) struct scsi_pointer *scsi_pointer =
aha152x_scsi_pointer(CURRENT_SC);
if (!(scsi_pointer->phase & not_issued))
scmd_printk(KERN_ERR, CURRENT_SC, scmd_printk(KERN_ERR, CURRENT_SC,
"command should not have been issued yet\n"); "command should not have been issued yet\n");
...@@ -1647,6 +1676,7 @@ static void seldi_run(struct Scsi_Host *shpnt) ...@@ -1647,6 +1676,7 @@ static void seldi_run(struct Scsi_Host *shpnt)
static void msgi_run(struct Scsi_Host *shpnt) static void msgi_run(struct Scsi_Host *shpnt)
{ {
for(;;) { for(;;) {
struct scsi_pointer *scsi_pointer;
int sstat1 = GETPORT(SSTAT1); int sstat1 = GETPORT(SSTAT1);
if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT)) if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
...@@ -1684,8 +1714,9 @@ static void msgi_run(struct Scsi_Host *shpnt) ...@@ -1684,8 +1714,9 @@ static void msgi_run(struct Scsi_Host *shpnt)
continue; continue;
} }
CURRENT_SC->SCp.Message = MSGI(0); scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
CURRENT_SC->SCp.phase &= ~disconnected; scsi_pointer->Message = MSGI(0);
scsi_pointer->phase &= ~disconnected;
MSGILEN=0; MSGILEN=0;
...@@ -1693,7 +1724,8 @@ static void msgi_run(struct Scsi_Host *shpnt) ...@@ -1693,7 +1724,8 @@ static void msgi_run(struct Scsi_Host *shpnt)
continue; continue;
} }
CURRENT_SC->SCp.Message = MSGI(0); scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
scsi_pointer->Message = MSGI(0);
switch (MSGI(0)) { switch (MSGI(0)) {
case DISCONNECT: case DISCONNECT:
...@@ -1701,11 +1733,11 @@ static void msgi_run(struct Scsi_Host *shpnt) ...@@ -1701,11 +1733,11 @@ static void msgi_run(struct Scsi_Host *shpnt)
scmd_printk(KERN_WARNING, CURRENT_SC, scmd_printk(KERN_WARNING, CURRENT_SC,
"target was not allowed to disconnect\n"); "target was not allowed to disconnect\n");
CURRENT_SC->SCp.phase |= disconnected; scsi_pointer->phase |= disconnected;
break; break;
case COMMAND_COMPLETE: case COMMAND_COMPLETE:
CURRENT_SC->SCp.phase |= completed; scsi_pointer->phase |= completed;
break; break;
case MESSAGE_REJECT: case MESSAGE_REJECT:
...@@ -1835,8 +1867,11 @@ static void msgi_end(struct Scsi_Host *shpnt) ...@@ -1835,8 +1867,11 @@ static void msgi_end(struct Scsi_Host *shpnt)
*/ */
static void msgo_init(struct Scsi_Host *shpnt) static void msgo_init(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
if(MSGOLEN==0) { if(MSGOLEN==0) {
if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) { if ((scsi_pointer->phase & syncneg) && SYNCNEG==2 &&
SYNCRATE==0) {
ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun)); ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
} else { } else {
scmd_printk(KERN_INFO, CURRENT_SC, scmd_printk(KERN_INFO, CURRENT_SC,
...@@ -1853,6 +1888,8 @@ static void msgo_init(struct Scsi_Host *shpnt) ...@@ -1853,6 +1888,8 @@ static void msgo_init(struct Scsi_Host *shpnt)
*/ */
static void msgo_run(struct Scsi_Host *shpnt) static void msgo_run(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
while(MSGO_I<MSGOLEN) { while(MSGO_I<MSGOLEN) {
if (TESTLO(SSTAT0, SPIORDY)) if (TESTLO(SSTAT0, SPIORDY))
return; return;
...@@ -1864,13 +1901,13 @@ static void msgo_run(struct Scsi_Host *shpnt) ...@@ -1864,13 +1901,13 @@ static void msgo_run(struct Scsi_Host *shpnt)
if (MSGO(MSGO_I) & IDENTIFY_BASE) if (MSGO(MSGO_I) & IDENTIFY_BASE)
CURRENT_SC->SCp.phase |= identified; scsi_pointer->phase |= identified;
if (MSGO(MSGO_I)==ABORT) if (MSGO(MSGO_I)==ABORT)
CURRENT_SC->SCp.phase |= aborted; scsi_pointer->phase |= aborted;
if (MSGO(MSGO_I)==BUS_DEVICE_RESET) if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
CURRENT_SC->SCp.phase |= resetted; scsi_pointer->phase |= resetted;
SETPORT(SCSIDAT, MSGO(MSGO_I++)); SETPORT(SCSIDAT, MSGO(MSGO_I++));
} }
...@@ -1899,7 +1936,7 @@ static void msgo_end(struct Scsi_Host *shpnt) ...@@ -1899,7 +1936,7 @@ static void msgo_end(struct Scsi_Host *shpnt)
*/ */
static void cmd_init(struct Scsi_Host *shpnt) static void cmd_init(struct Scsi_Host *shpnt)
{ {
if (CURRENT_SC->SCp.sent_command) { if (aha152x_scsi_pointer(CURRENT_SC)->sent_command) {
scmd_printk(KERN_ERR, CURRENT_SC, scmd_printk(KERN_ERR, CURRENT_SC,
"command already sent\n"); "command already sent\n");
done(shpnt, SAM_STAT_GOOD, DID_ERROR); done(shpnt, SAM_STAT_GOOD, DID_ERROR);
...@@ -1930,7 +1967,7 @@ static void cmd_end(struct Scsi_Host *shpnt) ...@@ -1930,7 +1967,7 @@ static void cmd_end(struct Scsi_Host *shpnt)
"command sent incompletely (%d/%d)\n", "command sent incompletely (%d/%d)\n",
CMD_I, CURRENT_SC->cmd_len); CMD_I, CURRENT_SC->cmd_len);
else else
CURRENT_SC->SCp.sent_command++; aha152x_scsi_pointer(CURRENT_SC)->sent_command++;
} }
/* /*
...@@ -1942,7 +1979,7 @@ static void status_run(struct Scsi_Host *shpnt) ...@@ -1942,7 +1979,7 @@ static void status_run(struct Scsi_Host *shpnt)
if (TESTLO(SSTAT0, SPIORDY)) if (TESTLO(SSTAT0, SPIORDY))
return; return;
CURRENT_SC->SCp.Status = GETPORT(SCSIDAT); aha152x_scsi_pointer(CURRENT_SC)->Status = GETPORT(SCSIDAT);
} }
...@@ -1966,6 +2003,7 @@ static void datai_init(struct Scsi_Host *shpnt) ...@@ -1966,6 +2003,7 @@ static void datai_init(struct Scsi_Host *shpnt)
static void datai_run(struct Scsi_Host *shpnt) static void datai_run(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer;
unsigned long the_time; unsigned long the_time;
int fifodata, data_count; int fifodata, data_count;
...@@ -2003,35 +2041,36 @@ static void datai_run(struct Scsi_Host *shpnt) ...@@ -2003,35 +2041,36 @@ static void datai_run(struct Scsi_Host *shpnt)
fifodata = GETPORT(FIFOSTAT); fifodata = GETPORT(FIFOSTAT);
} }
if(CURRENT_SC->SCp.this_residual>0) { scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) { if (scsi_pointer->this_residual > 0) {
data_count = fifodata > CURRENT_SC->SCp.this_residual ? while (fifodata > 0 && scsi_pointer->this_residual > 0) {
CURRENT_SC->SCp.this_residual : data_count = fifodata > scsi_pointer->this_residual ?
scsi_pointer->this_residual :
fifodata; fifodata;
fifodata -= data_count; fifodata -= data_count;
if (data_count & 1) { if (data_count & 1) {
SETPORT(DMACNTRL0, ENDMA|_8BIT); SETPORT(DMACNTRL0, ENDMA|_8BIT);
*CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT); *scsi_pointer->ptr++ = GETPORT(DATAPORT);
CURRENT_SC->SCp.this_residual--; scsi_pointer->this_residual--;
DATA_LEN++; DATA_LEN++;
SETPORT(DMACNTRL0, ENDMA); SETPORT(DMACNTRL0, ENDMA);
} }
if (data_count > 1) { if (data_count > 1) {
data_count >>= 1; data_count >>= 1;
insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count); insw(DATAPORT, scsi_pointer->ptr, data_count);
CURRENT_SC->SCp.ptr += 2 * data_count; scsi_pointer->ptr += 2 * data_count;
CURRENT_SC->SCp.this_residual -= 2 * data_count; scsi_pointer->this_residual -= 2 * data_count;
DATA_LEN += 2 * data_count; DATA_LEN += 2 * data_count;
} }
if (CURRENT_SC->SCp.this_residual == 0 && if (scsi_pointer->this_residual == 0 &&
!sg_is_last(CURRENT_SC->SCp.buffer)) { !sg_is_last(scsi_pointer->buffer)) {
/* advance to next buffer */ /* advance to next buffer */
CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer);
CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; scsi_pointer->this_residual = scsi_pointer->buffer->length;
} }
} }
} else if (fifodata > 0) { } else if (fifodata > 0) {
...@@ -2099,14 +2138,15 @@ static void datao_init(struct Scsi_Host *shpnt) ...@@ -2099,14 +2138,15 @@ static void datao_init(struct Scsi_Host *shpnt)
static void datao_run(struct Scsi_Host *shpnt) static void datao_run(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
unsigned long the_time; unsigned long the_time;
int data_count; int data_count;
/* until phase changes or all data sent */ /* until phase changes or all data sent */
while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) { while (TESTLO(DMASTAT, INTSTAT) && scsi_pointer->this_residual > 0) {
data_count = 128; data_count = 128;
if(data_count > CURRENT_SC->SCp.this_residual) if (data_count > scsi_pointer->this_residual)
data_count=CURRENT_SC->SCp.this_residual; data_count = scsi_pointer->this_residual;
if(TESTLO(DMASTAT, DFIFOEMP)) { if(TESTLO(DMASTAT, DFIFOEMP)) {
scmd_printk(KERN_ERR, CURRENT_SC, scmd_printk(KERN_ERR, CURRENT_SC,
...@@ -2117,26 +2157,26 @@ static void datao_run(struct Scsi_Host *shpnt) ...@@ -2117,26 +2157,26 @@ static void datao_run(struct Scsi_Host *shpnt)
if(data_count & 1) { if(data_count & 1) {
SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT); SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT);
SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++); SETPORT(DATAPORT, *scsi_pointer->ptr++);
CURRENT_SC->SCp.this_residual--; scsi_pointer->this_residual--;
CMD_INC_RESID(CURRENT_SC, -1); CMD_INC_RESID(CURRENT_SC, -1);
SETPORT(DMACNTRL0,WRITE_READ|ENDMA); SETPORT(DMACNTRL0,WRITE_READ|ENDMA);
} }
if(data_count > 1) { if(data_count > 1) {
data_count >>= 1; data_count >>= 1;
outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count); outsw(DATAPORT, scsi_pointer->ptr, data_count);
CURRENT_SC->SCp.ptr += 2 * data_count; scsi_pointer->ptr += 2 * data_count;
CURRENT_SC->SCp.this_residual -= 2 * data_count; scsi_pointer->this_residual -= 2 * data_count;
CMD_INC_RESID(CURRENT_SC, -2 * data_count); CMD_INC_RESID(CURRENT_SC, -2 * data_count);
} }
if (CURRENT_SC->SCp.this_residual == 0 && if (scsi_pointer->this_residual == 0 &&
!sg_is_last(CURRENT_SC->SCp.buffer)) { !sg_is_last(scsi_pointer->buffer)) {
/* advance to next buffer */ /* advance to next buffer */
CURRENT_SC->SCp.buffer = sg_next(CURRENT_SC->SCp.buffer); scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer); scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer);
CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length; scsi_pointer->this_residual = scsi_pointer->buffer->length;
} }
the_time=jiffies + 100*HZ; the_time=jiffies + 100*HZ;
...@@ -2152,6 +2192,8 @@ static void datao_run(struct Scsi_Host *shpnt) ...@@ -2152,6 +2192,8 @@ static void datao_run(struct Scsi_Host *shpnt)
static void datao_end(struct Scsi_Host *shpnt) static void datao_end(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
if(TESTLO(DMASTAT, DFIFOEMP)) { if(TESTLO(DMASTAT, DFIFOEMP)) {
u32 datao_cnt = GETSTCNT(); u32 datao_cnt = GETSTCNT();
int datao_out = DATA_LEN - scsi_get_resid(CURRENT_SC); int datao_out = DATA_LEN - scsi_get_resid(CURRENT_SC);
...@@ -2169,9 +2211,9 @@ static void datao_end(struct Scsi_Host *shpnt) ...@@ -2169,9 +2211,9 @@ static void datao_end(struct Scsi_Host *shpnt)
sg = sg_next(sg); sg = sg_next(sg);
} }
CURRENT_SC->SCp.buffer = sg; scsi_pointer->buffer = sg;
CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) + done; scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer) + done;
CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length - scsi_pointer->this_residual = scsi_pointer->buffer->length -
done; done;
} }
...@@ -2187,6 +2229,7 @@ static void datao_end(struct Scsi_Host *shpnt) ...@@ -2187,6 +2229,7 @@ static void datao_end(struct Scsi_Host *shpnt)
*/ */
static int update_state(struct Scsi_Host *shpnt) static int update_state(struct Scsi_Host *shpnt)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
int dataphase=0; int dataphase=0;
unsigned int stat0 = GETPORT(SSTAT0); unsigned int stat0 = GETPORT(SSTAT0);
unsigned int stat1 = GETPORT(SSTAT1); unsigned int stat1 = GETPORT(SSTAT1);
...@@ -2200,7 +2243,8 @@ static int update_state(struct Scsi_Host *shpnt) ...@@ -2200,7 +2243,8 @@ static int update_state(struct Scsi_Host *shpnt)
SETPORT(SSTAT1,SCSIRSTI); SETPORT(SSTAT1,SCSIRSTI);
} else if (stat0 & SELDI && PREVSTATE == busfree) { } else if (stat0 & SELDI && PREVSTATE == busfree) {
STATE=seldi; STATE=seldi;
} else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) { } else if (stat0 & SELDO && CURRENT_SC &&
(scsi_pointer->phase & selecting)) {
STATE=seldo; STATE=seldo;
} else if(stat1 & SELTO) { } else if(stat1 & SELTO) {
STATE=selto; STATE=selto;
...@@ -2332,7 +2376,8 @@ static void is_complete(struct Scsi_Host *shpnt) ...@@ -2332,7 +2376,8 @@ static void is_complete(struct Scsi_Host *shpnt)
SETPORT(SXFRCTL0, CH1); SETPORT(SXFRCTL0, CH1);
SETPORT(DMACNTRL0, 0); SETPORT(DMACNTRL0, 0);
if(CURRENT_SC) if(CURRENT_SC)
CURRENT_SC->SCp.phase &= ~spiordy; aha152x_scsi_pointer(CURRENT_SC)->phase &=
~spiordy;
} }
/* /*
...@@ -2354,7 +2399,8 @@ static void is_complete(struct Scsi_Host *shpnt) ...@@ -2354,7 +2399,8 @@ static void is_complete(struct Scsi_Host *shpnt)
SETPORT(DMACNTRL0, 0); SETPORT(DMACNTRL0, 0);
SETPORT(SXFRCTL0, CH1|SPIOEN); SETPORT(SXFRCTL0, CH1|SPIOEN);
if(CURRENT_SC) if(CURRENT_SC)
CURRENT_SC->SCp.phase |= spiordy; aha152x_scsi_pointer(CURRENT_SC)->phase |=
spiordy;
} }
/* /*
...@@ -2444,21 +2490,23 @@ static void disp_enintr(struct Scsi_Host *shpnt) ...@@ -2444,21 +2490,23 @@ static void disp_enintr(struct Scsi_Host *shpnt)
*/ */
static void show_command(struct scsi_cmnd *ptr) static void show_command(struct scsi_cmnd *ptr)
{ {
const int phase = aha152x_scsi_pointer(ptr)->phase;
scsi_print_command(ptr); scsi_print_command(ptr);
scmd_printk(KERN_DEBUG, ptr, scmd_printk(KERN_DEBUG, ptr,
"request_bufflen=%d; resid=%d; " "request_bufflen=%d; resid=%d; "
"phase |%s%s%s%s%s%s%s%s%s; next=0x%p", "phase |%s%s%s%s%s%s%s%s%s; next=0x%p",
scsi_bufflen(ptr), scsi_get_resid(ptr), scsi_bufflen(ptr), scsi_get_resid(ptr),
(ptr->SCp.phase & not_issued) ? "not issued|" : "", phase & not_issued ? "not issued|" : "",
(ptr->SCp.phase & selecting) ? "selecting|" : "", phase & selecting ? "selecting|" : "",
(ptr->SCp.phase & identified) ? "identified|" : "", phase & identified ? "identified|" : "",
(ptr->SCp.phase & disconnected) ? "disconnected|" : "", phase & disconnected ? "disconnected|" : "",
(ptr->SCp.phase & completed) ? "completed|" : "", phase & completed ? "completed|" : "",
(ptr->SCp.phase & spiordy) ? "spiordy|" : "", phase & spiordy ? "spiordy|" : "",
(ptr->SCp.phase & syncneg) ? "syncneg|" : "", phase & syncneg ? "syncneg|" : "",
(ptr->SCp.phase & aborted) ? "aborted|" : "", phase & aborted ? "aborted|" : "",
(ptr->SCp.phase & resetted) ? "resetted|" : "", phase & resetted ? "resetted|" : "",
(SCDATA(ptr)) ? SCNEXT(ptr) : NULL); SCDATA(ptr) ? SCNEXT(ptr) : NULL);
} }
/* /*
...@@ -2490,6 +2538,8 @@ static void show_queues(struct Scsi_Host *shpnt) ...@@ -2490,6 +2538,8 @@ static void show_queues(struct Scsi_Host *shpnt)
static void get_command(struct seq_file *m, struct scsi_cmnd * ptr) static void get_command(struct seq_file *m, struct scsi_cmnd * ptr)
{ {
struct scsi_pointer *scsi_pointer = aha152x_scsi_pointer(ptr);
const int phase = scsi_pointer->phase;
int i; int i;
seq_printf(m, "%p: target=%d; lun=%d; cmnd=( ", seq_printf(m, "%p: target=%d; lun=%d; cmnd=( ",
...@@ -2499,24 +2549,24 @@ static void get_command(struct seq_file *m, struct scsi_cmnd * ptr) ...@@ -2499,24 +2549,24 @@ static void get_command(struct seq_file *m, struct scsi_cmnd * ptr)
seq_printf(m, "0x%02x ", ptr->cmnd[i]); seq_printf(m, "0x%02x ", ptr->cmnd[i]);
seq_printf(m, "); resid=%d; residual=%d; buffers=%d; phase |", seq_printf(m, "); resid=%d; residual=%d; buffers=%d; phase |",
scsi_get_resid(ptr), ptr->SCp.this_residual, scsi_get_resid(ptr), scsi_pointer->this_residual,
sg_nents(ptr->SCp.buffer) - 1); sg_nents(scsi_pointer->buffer) - 1);
if (ptr->SCp.phase & not_issued) if (phase & not_issued)
seq_puts(m, "not issued|"); seq_puts(m, "not issued|");
if (ptr->SCp.phase & selecting) if (phase & selecting)
seq_puts(m, "selecting|"); seq_puts(m, "selecting|");
if (ptr->SCp.phase & disconnected) if (phase & disconnected)
seq_puts(m, "disconnected|"); seq_puts(m, "disconnected|");
if (ptr->SCp.phase & aborted) if (phase & aborted)
seq_puts(m, "aborted|"); seq_puts(m, "aborted|");
if (ptr->SCp.phase & identified) if (phase & identified)
seq_puts(m, "identified|"); seq_puts(m, "identified|");
if (ptr->SCp.phase & completed) if (phase & completed)
seq_puts(m, "completed|"); seq_puts(m, "completed|");
if (ptr->SCp.phase & spiordy) if (phase & spiordy)
seq_puts(m, "spiordy|"); seq_puts(m, "spiordy|");
if (ptr->SCp.phase & syncneg) if (phase & syncneg)
seq_puts(m, "syncneg|"); seq_puts(m, "syncneg|");
seq_printf(m, "; next=0x%p\n", SCNEXT(ptr)); seq_printf(m, "; next=0x%p\n", SCNEXT(ptr));
} }
...@@ -2921,6 +2971,7 @@ static struct scsi_host_template aha152x_driver_template = { ...@@ -2921,6 +2971,7 @@ static struct scsi_host_template aha152x_driver_template = {
.sg_tablesize = SG_ALL, .sg_tablesize = SG_ALL,
.dma_boundary = PAGE_SIZE - 1, .dma_boundary = PAGE_SIZE - 1,
.slave_alloc = aha152x_adjust_queue, .slave_alloc = aha152x_adjust_queue,
.cmd_size = sizeof(struct aha152x_cmd_priv),
}; };
#if !defined(AHA152X_PCMCIA) #if !defined(AHA152X_PCMCIA)
......
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