scsi: aha152x: Stop using struct scsi_pointer
Remove aha152x_cmd_priv.scsi_pointer by moving the necessary members into aha152x_cmd_priv proper. Tested with an Adaptec SlimSCSI APA-1460A card. Link: https://lore.kernel.org/r/bdc1264b6dd331150bffb737958cab8c9c068fa1.1648070977.git.fthain@linux-m68k.org Cc: Christoph Hellwig <hch@infradead.org> Suggested-by: Christoph Hellwig <hch@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Finn Thain <fthain@linux-m68k.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
0bade8e532
commit
63221571ef
@ -317,14 +317,18 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct aha152x_cmd_priv {
|
struct aha152x_cmd_priv {
|
||||||
struct scsi_pointer scsi_pointer;
|
char *ptr;
|
||||||
|
int this_residual;
|
||||||
|
struct scatterlist *buffer;
|
||||||
|
int status;
|
||||||
|
int message;
|
||||||
|
int sent_command;
|
||||||
|
int phase;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct scsi_pointer *aha152x_scsi_pointer(struct scsi_cmnd *cmd)
|
static struct aha152x_cmd_priv *aha152x_priv(struct scsi_cmnd *cmd)
|
||||||
{
|
{
|
||||||
struct aha152x_cmd_priv *acmd = scsi_cmd_priv(cmd);
|
return scsi_cmd_priv(cmd);
|
||||||
|
|
||||||
return &acmd->scsi_pointer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MODULE_AUTHOR("Jürgen Fischer");
|
MODULE_AUTHOR("Jürgen Fischer");
|
||||||
@ -890,17 +894,16 @@ 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) {
|
||||||
struct scsi_pointer *scsi_pointer =
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
aha152x_scsi_pointer(CURRENT_SC);
|
|
||||||
|
|
||||||
scsi_pointer->phase |= 1 << 16;
|
acp->phase |= 1 << 16;
|
||||||
|
|
||||||
if (scsi_pointer->phase & selecting) {
|
if (acp->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, (scsi_pointer->phase & spiordy) ? ENSPIORDY : 0);
|
SETPORT(SIMODE0, (acp->phase & spiordy) ? ENSPIORDY : 0);
|
||||||
SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
|
SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
|
||||||
}
|
}
|
||||||
} else if(STATE==seldi) {
|
} else if(STATE==seldi) {
|
||||||
@ -924,17 +927,16 @@ 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 aha152x_cmd_priv *acp = aha152x_priv(SCpnt);
|
||||||
struct Scsi_Host *shpnt = SCpnt->device->host;
|
struct Scsi_Host *shpnt = SCpnt->device->host;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
scsi_pointer->phase = not_issued | phase;
|
acp->phase = not_issued | phase;
|
||||||
scsi_pointer->Status = 0x1; /* Ilegal status by SCSI standard */
|
acp->status = 0x1; /* Illegal status by SCSI standard */
|
||||||
scsi_pointer->Message = 0;
|
acp->message = 0;
|
||||||
scsi_pointer->have_data_in = 0;
|
acp->sent_command = 0;
|
||||||
scsi_pointer->sent_command = 0;
|
|
||||||
|
|
||||||
if (scsi_pointer->phase & (resetting | check_condition)) {
|
if (acp->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;
|
||||||
@ -957,15 +959,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)) {
|
||||||
scsi_pointer->ptr = NULL;
|
acp->ptr = NULL;
|
||||||
scsi_pointer->this_residual = 0;
|
acp->this_residual = 0;
|
||||||
scsi_set_resid(SCpnt, 0);
|
scsi_set_resid(SCpnt, 0);
|
||||||
scsi_pointer->buffer = NULL;
|
acp->buffer = NULL;
|
||||||
} else {
|
} else {
|
||||||
scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
|
scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
|
||||||
scsi_pointer->buffer = scsi_sglist(SCpnt);
|
acp->buffer = scsi_sglist(SCpnt);
|
||||||
scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer);
|
acp->ptr = SG_ADDRESS(acp->buffer);
|
||||||
scsi_pointer->this_residual = scsi_pointer->buffer->length;
|
acp->this_residual = acp->buffer->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
DO_LOCK(flags);
|
DO_LOCK(flags);
|
||||||
@ -1015,7 +1017,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 (aha152x_scsi_pointer(SCpnt)->phase & resetting)
|
if (aha152x_priv(SCpnt)->phase & resetting)
|
||||||
reset_done(SCpnt);
|
reset_done(SCpnt);
|
||||||
else
|
else
|
||||||
scsi_done(SCpnt);
|
scsi_done(SCpnt);
|
||||||
@ -1101,7 +1103,7 @@ static int aha152x_device_reset(struct scsi_cmnd * SCpnt)
|
|||||||
|
|
||||||
DO_LOCK(flags);
|
DO_LOCK(flags);
|
||||||
|
|
||||||
if (aha152x_scsi_pointer(SCpnt)->phase & resetted) {
|
if (aha152x_priv(SCpnt)->phase & resetted) {
|
||||||
HOSTDATA(shpnt)->commands--;
|
HOSTDATA(shpnt)->commands--;
|
||||||
if (!HOSTDATA(shpnt)->commands)
|
if (!HOSTDATA(shpnt)->commands)
|
||||||
SETPORT(PORTA, 0);
|
SETPORT(PORTA, 0);
|
||||||
@ -1395,31 +1397,30 @@ 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 =
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
aha152x_scsi_pointer(CURRENT_SC);
|
|
||||||
|
|
||||||
#if defined(AHA152X_STAT)
|
#if defined(AHA152X_STAT)
|
||||||
action++;
|
action++;
|
||||||
#endif
|
#endif
|
||||||
scsi_pointer->phase &= ~syncneg;
|
acp->phase &= ~syncneg;
|
||||||
|
|
||||||
if (scsi_pointer->phase & completed) {
|
if (acp->phase & completed) {
|
||||||
/* target sent COMMAND COMPLETE */
|
/* target sent COMMAND COMPLETE */
|
||||||
done(shpnt, scsi_pointer->Status, DID_OK);
|
done(shpnt, acp->status, DID_OK);
|
||||||
|
|
||||||
} else if (scsi_pointer->phase & aborted) {
|
} else if (acp->phase & aborted) {
|
||||||
done(shpnt, scsi_pointer->Status, DID_ABORT);
|
done(shpnt, acp->status, DID_ABORT);
|
||||||
|
|
||||||
} else if (scsi_pointer->phase & resetted) {
|
} else if (acp->phase & resetted) {
|
||||||
done(shpnt, scsi_pointer->Status, DID_RESET);
|
done(shpnt, acp->status, DID_RESET);
|
||||||
|
|
||||||
} else if (scsi_pointer->phase & disconnected) {
|
} else if (acp->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);
|
||||||
scsi_pointer->phase |= 1 << 16;
|
acp->phase |= 1 << 16;
|
||||||
CURRENT_SC = NULL;
|
CURRENT_SC = NULL;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -1438,24 +1439,23 @@ static void busfree_run(struct Scsi_Host *shpnt)
|
|||||||
action++;
|
action++;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (aha152x_scsi_pointer(DONE_SC)->phase & check_condition) {
|
if (aha152x_priv(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);
|
||||||
|
|
||||||
aha152x_scsi_pointer(cmd)->Status = SAM_STAT_CHECK_CONDITION;
|
aha152x_priv(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 (aha152x_scsi_pointer(DONE_SC)->Status ==
|
} else if (aha152x_priv(DONE_SC)->status == SAM_STAT_CHECK_CONDITION) {
|
||||||
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(!(aha152x_scsi_pointer(DONE_SC)->phase & not_issued)) {
|
if (!(aha152x_priv(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;
|
||||||
@ -1480,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 (!(aha152x_scsi_pointer(ptr)->phase & resetting)) {
|
if (!(aha152x_priv(ptr)->phase & resetting)) {
|
||||||
kfree(ptr->host_scribble);
|
kfree(ptr->host_scribble);
|
||||||
ptr->host_scribble=NULL;
|
ptr->host_scribble=NULL;
|
||||||
}
|
}
|
||||||
@ -1503,13 +1503,12 @@ 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 =
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
aha152x_scsi_pointer(CURRENT_SC);
|
|
||||||
|
|
||||||
#if defined(AHA152X_STAT)
|
#if defined(AHA152X_STAT)
|
||||||
action++;
|
action++;
|
||||||
#endif
|
#endif
|
||||||
scsi_pointer->phase |= selecting;
|
acp->phase |= selecting;
|
||||||
|
|
||||||
/* clear selection timeout */
|
/* clear selection timeout */
|
||||||
SETPORT(SSTAT1, SELTO);
|
SETPORT(SSTAT1, SELTO);
|
||||||
@ -1537,13 +1536,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);
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
|
|
||||||
SETPORT(SCSISIG, 0);
|
SETPORT(SCSISIG, 0);
|
||||||
SETPORT(SSTAT1, CLRBUSFREE);
|
SETPORT(SSTAT1, CLRBUSFREE);
|
||||||
SETPORT(SSTAT1, CLRPHASECHG);
|
SETPORT(SSTAT1, CLRPHASECHG);
|
||||||
|
|
||||||
scsi_pointer->phase &= ~(selecting | not_issued);
|
acp->phase &= ~(selecting | not_issued);
|
||||||
|
|
||||||
SETPORT(SCSISEQ, 0);
|
SETPORT(SCSISEQ, 0);
|
||||||
|
|
||||||
@ -1558,12 +1557,12 @@ static void seldo_run(struct Scsi_Host *shpnt)
|
|||||||
|
|
||||||
ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
|
ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
|
||||||
|
|
||||||
if (scsi_pointer->phase & aborting) {
|
if (acp->phase & aborting) {
|
||||||
ADDMSGO(ABORT);
|
ADDMSGO(ABORT);
|
||||||
} else if (scsi_pointer->phase & resetting) {
|
} else if (acp->phase & resetting) {
|
||||||
ADDMSGO(BUS_DEVICE_RESET);
|
ADDMSGO(BUS_DEVICE_RESET);
|
||||||
} else if (SYNCNEG==0 && SYNCHRONOUS) {
|
} else if (SYNCNEG==0 && SYNCHRONOUS) {
|
||||||
scsi_pointer->phase |= syncneg;
|
acp->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 */
|
||||||
}
|
}
|
||||||
@ -1578,7 +1577,7 @@ 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);
|
struct aha152x_cmd_priv *acp;
|
||||||
|
|
||||||
SETPORT(SCSISEQ, 0);
|
SETPORT(SCSISEQ, 0);
|
||||||
SETPORT(SSTAT1, CLRSELTIMO);
|
SETPORT(SSTAT1, CLRSELTIMO);
|
||||||
@ -1586,9 +1585,10 @@ static void selto_run(struct Scsi_Host *shpnt)
|
|||||||
if (!CURRENT_SC)
|
if (!CURRENT_SC)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scsi_pointer->phase &= ~selecting;
|
acp = aha152x_priv(CURRENT_SC);
|
||||||
|
acp->phase &= ~selecting;
|
||||||
|
|
||||||
if (scsi_pointer->phase & aborted)
|
if (acp->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);
|
||||||
@ -1616,10 +1616,9 @@ static void seldi_run(struct Scsi_Host *shpnt)
|
|||||||
SETPORT(SSTAT1, CLRPHASECHG);
|
SETPORT(SSTAT1, CLRPHASECHG);
|
||||||
|
|
||||||
if(CURRENT_SC) {
|
if(CURRENT_SC) {
|
||||||
struct scsi_pointer *scsi_pointer =
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
aha152x_scsi_pointer(CURRENT_SC);
|
|
||||||
|
|
||||||
if (!(scsi_pointer->phase & not_issued))
|
if (!(acp->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");
|
||||||
|
|
||||||
@ -1676,7 +1675,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;
|
struct aha152x_cmd_priv *acp;
|
||||||
int sstat1 = GETPORT(SSTAT1);
|
int sstat1 = GETPORT(SSTAT1);
|
||||||
|
|
||||||
if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
|
if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
|
||||||
@ -1714,9 +1713,9 @@ static void msgi_run(struct Scsi_Host *shpnt)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
|
acp = aha152x_priv(CURRENT_SC);
|
||||||
scsi_pointer->Message = MSGI(0);
|
acp->message = MSGI(0);
|
||||||
scsi_pointer->phase &= ~disconnected;
|
acp->phase &= ~disconnected;
|
||||||
|
|
||||||
MSGILEN=0;
|
MSGILEN=0;
|
||||||
|
|
||||||
@ -1724,8 +1723,8 @@ static void msgi_run(struct Scsi_Host *shpnt)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
|
acp = aha152x_priv(CURRENT_SC);
|
||||||
scsi_pointer->Message = MSGI(0);
|
acp->message = MSGI(0);
|
||||||
|
|
||||||
switch (MSGI(0)) {
|
switch (MSGI(0)) {
|
||||||
case DISCONNECT:
|
case DISCONNECT:
|
||||||
@ -1733,11 +1732,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");
|
||||||
|
|
||||||
scsi_pointer->phase |= disconnected;
|
acp->phase |= disconnected;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case COMMAND_COMPLETE:
|
case COMMAND_COMPLETE:
|
||||||
scsi_pointer->phase |= completed;
|
acp->phase |= completed;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MESSAGE_REJECT:
|
case MESSAGE_REJECT:
|
||||||
@ -1867,11 +1866,9 @@ 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 ((scsi_pointer->phase & syncneg) && SYNCNEG==2 &&
|
if ((aha152x_priv(CURRENT_SC)->phase & syncneg) &&
|
||||||
SYNCRATE==0) {
|
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,
|
||||||
@ -1888,7 +1885,7 @@ 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);
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
|
|
||||||
while(MSGO_I<MSGOLEN) {
|
while(MSGO_I<MSGOLEN) {
|
||||||
if (TESTLO(SSTAT0, SPIORDY))
|
if (TESTLO(SSTAT0, SPIORDY))
|
||||||
@ -1901,13 +1898,13 @@ static void msgo_run(struct Scsi_Host *shpnt)
|
|||||||
|
|
||||||
|
|
||||||
if (MSGO(MSGO_I) & IDENTIFY_BASE)
|
if (MSGO(MSGO_I) & IDENTIFY_BASE)
|
||||||
scsi_pointer->phase |= identified;
|
acp->phase |= identified;
|
||||||
|
|
||||||
if (MSGO(MSGO_I)==ABORT)
|
if (MSGO(MSGO_I)==ABORT)
|
||||||
scsi_pointer->phase |= aborted;
|
acp->phase |= aborted;
|
||||||
|
|
||||||
if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
|
if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
|
||||||
scsi_pointer->phase |= resetted;
|
acp->phase |= resetted;
|
||||||
|
|
||||||
SETPORT(SCSIDAT, MSGO(MSGO_I++));
|
SETPORT(SCSIDAT, MSGO(MSGO_I++));
|
||||||
}
|
}
|
||||||
@ -1936,7 +1933,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 (aha152x_scsi_pointer(CURRENT_SC)->sent_command) {
|
if (aha152x_priv(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);
|
||||||
@ -1967,7 +1964,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
|
||||||
aha152x_scsi_pointer(CURRENT_SC)->sent_command++;
|
aha152x_priv(CURRENT_SC)->sent_command++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1979,7 +1976,7 @@ static void status_run(struct Scsi_Host *shpnt)
|
|||||||
if (TESTLO(SSTAT0, SPIORDY))
|
if (TESTLO(SSTAT0, SPIORDY))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
aha152x_scsi_pointer(CURRENT_SC)->Status = GETPORT(SCSIDAT);
|
aha152x_priv(CURRENT_SC)->status = GETPORT(SCSIDAT);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2003,7 +2000,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;
|
struct aha152x_cmd_priv *acp;
|
||||||
unsigned long the_time;
|
unsigned long the_time;
|
||||||
int fifodata, data_count;
|
int fifodata, data_count;
|
||||||
|
|
||||||
@ -2041,36 +2038,35 @@ static void datai_run(struct Scsi_Host *shpnt)
|
|||||||
fifodata = GETPORT(FIFOSTAT);
|
fifodata = GETPORT(FIFOSTAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
scsi_pointer = aha152x_scsi_pointer(CURRENT_SC);
|
acp = aha152x_priv(CURRENT_SC);
|
||||||
if (scsi_pointer->this_residual > 0) {
|
if (acp->this_residual > 0) {
|
||||||
while (fifodata > 0 && scsi_pointer->this_residual > 0) {
|
while (fifodata > 0 && acp->this_residual > 0) {
|
||||||
data_count = fifodata > scsi_pointer->this_residual ?
|
data_count = fifodata > acp->this_residual ?
|
||||||
scsi_pointer->this_residual :
|
acp->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);
|
||||||
*scsi_pointer->ptr++ = GETPORT(DATAPORT);
|
*acp->ptr++ = GETPORT(DATAPORT);
|
||||||
scsi_pointer->this_residual--;
|
acp->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, scsi_pointer->ptr, data_count);
|
insw(DATAPORT, acp->ptr, data_count);
|
||||||
scsi_pointer->ptr += 2 * data_count;
|
acp->ptr += 2 * data_count;
|
||||||
scsi_pointer->this_residual -= 2 * data_count;
|
acp->this_residual -= 2 * data_count;
|
||||||
DATA_LEN += 2 * data_count;
|
DATA_LEN += 2 * data_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scsi_pointer->this_residual == 0 &&
|
if (acp->this_residual == 0 &&
|
||||||
!sg_is_last(scsi_pointer->buffer)) {
|
!sg_is_last(acp->buffer)) {
|
||||||
/* advance to next buffer */
|
/* advance to next buffer */
|
||||||
scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
|
acp->buffer = sg_next(acp->buffer);
|
||||||
scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer);
|
acp->ptr = SG_ADDRESS(acp->buffer);
|
||||||
scsi_pointer->this_residual = scsi_pointer->buffer->length;
|
acp->this_residual = acp->buffer->length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (fifodata > 0) {
|
} else if (fifodata > 0) {
|
||||||
@ -2138,15 +2134,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);
|
struct aha152x_cmd_priv *acp = aha152x_priv(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) && scsi_pointer->this_residual > 0) {
|
while (TESTLO(DMASTAT, INTSTAT) && acp->this_residual > 0) {
|
||||||
data_count = 128;
|
data_count = 128;
|
||||||
if (data_count > scsi_pointer->this_residual)
|
if (data_count > acp->this_residual)
|
||||||
data_count = scsi_pointer->this_residual;
|
data_count = acp->this_residual;
|
||||||
|
|
||||||
if(TESTLO(DMASTAT, DFIFOEMP)) {
|
if(TESTLO(DMASTAT, DFIFOEMP)) {
|
||||||
scmd_printk(KERN_ERR, CURRENT_SC,
|
scmd_printk(KERN_ERR, CURRENT_SC,
|
||||||
@ -2157,26 +2153,25 @@ 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, *scsi_pointer->ptr++);
|
SETPORT(DATAPORT, *acp->ptr++);
|
||||||
scsi_pointer->this_residual--;
|
acp->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, scsi_pointer->ptr, data_count);
|
outsw(DATAPORT, acp->ptr, data_count);
|
||||||
scsi_pointer->ptr += 2 * data_count;
|
acp->ptr += 2 * data_count;
|
||||||
scsi_pointer->this_residual -= 2 * data_count;
|
acp->this_residual -= 2 * data_count;
|
||||||
CMD_INC_RESID(CURRENT_SC, -2 * data_count);
|
CMD_INC_RESID(CURRENT_SC, -2 * data_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scsi_pointer->this_residual == 0 &&
|
if (acp->this_residual == 0 && !sg_is_last(acp->buffer)) {
|
||||||
!sg_is_last(scsi_pointer->buffer)) {
|
|
||||||
/* advance to next buffer */
|
/* advance to next buffer */
|
||||||
scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
|
acp->buffer = sg_next(acp->buffer);
|
||||||
scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer);
|
acp->ptr = SG_ADDRESS(acp->buffer);
|
||||||
scsi_pointer->this_residual = scsi_pointer->buffer->length;
|
acp->this_residual = acp->buffer->length;
|
||||||
}
|
}
|
||||||
|
|
||||||
the_time=jiffies + 100*HZ;
|
the_time=jiffies + 100*HZ;
|
||||||
@ -2192,7 +2187,7 @@ 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);
|
struct aha152x_cmd_priv *acp = aha152x_priv(CURRENT_SC);
|
||||||
|
|
||||||
if(TESTLO(DMASTAT, DFIFOEMP)) {
|
if(TESTLO(DMASTAT, DFIFOEMP)) {
|
||||||
u32 datao_cnt = GETSTCNT();
|
u32 datao_cnt = GETSTCNT();
|
||||||
@ -2211,10 +2206,9 @@ static void datao_end(struct Scsi_Host *shpnt)
|
|||||||
sg = sg_next(sg);
|
sg = sg_next(sg);
|
||||||
}
|
}
|
||||||
|
|
||||||
scsi_pointer->buffer = sg;
|
acp->buffer = sg;
|
||||||
scsi_pointer->ptr = SG_ADDRESS(scsi_pointer->buffer) + done;
|
acp->ptr = SG_ADDRESS(acp->buffer) + done;
|
||||||
scsi_pointer->this_residual = scsi_pointer->buffer->length -
|
acp->this_residual = acp->buffer->length - done;
|
||||||
done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
|
SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
|
||||||
@ -2229,7 +2223,6 @@ 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);
|
||||||
@ -2244,7 +2237,7 @@ static int update_state(struct Scsi_Host *shpnt)
|
|||||||
} else if (stat0 & SELDI && PREVSTATE == busfree) {
|
} else if (stat0 & SELDI && PREVSTATE == busfree) {
|
||||||
STATE=seldi;
|
STATE=seldi;
|
||||||
} else if (stat0 & SELDO && CURRENT_SC &&
|
} else if (stat0 & SELDO && CURRENT_SC &&
|
||||||
(scsi_pointer->phase & selecting)) {
|
(aha152x_priv(CURRENT_SC)->phase & selecting)) {
|
||||||
STATE=seldo;
|
STATE=seldo;
|
||||||
} else if(stat1 & SELTO) {
|
} else if(stat1 & SELTO) {
|
||||||
STATE=selto;
|
STATE=selto;
|
||||||
@ -2376,8 +2369,7 @@ 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)
|
||||||
aha152x_scsi_pointer(CURRENT_SC)->phase &=
|
aha152x_priv(CURRENT_SC)->phase &= ~spiordy;
|
||||||
~spiordy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2399,8 +2391,7 @@ 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)
|
||||||
aha152x_scsi_pointer(CURRENT_SC)->phase |=
|
aha152x_priv(CURRENT_SC)->phase |= spiordy;
|
||||||
spiordy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2490,7 +2481,7 @@ 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;
|
const int phase = aha152x_priv(ptr)->phase;
|
||||||
|
|
||||||
scsi_print_command(ptr);
|
scsi_print_command(ptr);
|
||||||
scmd_printk(KERN_DEBUG, ptr,
|
scmd_printk(KERN_DEBUG, ptr,
|
||||||
@ -2538,8 +2529,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);
|
struct aha152x_cmd_priv *acp = aha152x_priv(ptr);
|
||||||
const int phase = scsi_pointer->phase;
|
const int phase = acp->phase;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
seq_printf(m, "%p: target=%d; lun=%d; cmnd=( ",
|
seq_printf(m, "%p: target=%d; lun=%d; cmnd=( ",
|
||||||
@ -2549,8 +2540,8 @@ 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), scsi_pointer->this_residual,
|
scsi_get_resid(ptr), acp->this_residual,
|
||||||
sg_nents(scsi_pointer->buffer) - 1);
|
sg_nents(acp->buffer) - 1);
|
||||||
|
|
||||||
if (phase & not_issued)
|
if (phase & not_issued)
|
||||||
seq_puts(m, "not issued|");
|
seq_puts(m, "not issued|");
|
||||||
|
Reference in New Issue
Block a user