forked from Minki/linux
scsi: acornscsi: Remove tagged queuing vestiges
The acornscsi driver has a config option to enable tagged queuing, but this option gets disabled in the driver itself with the comment 'needs to be debugged'. As this is a _really_ old driver I doubt anyone will be wanting to invest time here, so remove the tagged queue vestiges and make our lives easier. [jpg: Use scsi_cmd_to_rq()] Link: https://lore.kernel.org/r/1631696835-136198-3-git-send-email-john.garry@huawei.com Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: John Garry <john.garry@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
bc41fcbffd
commit
756fb6a895
@ -10,17 +10,6 @@ config SCSI_ACORNSCSI_3
|
||||
This enables support for the Acorn SCSI card (aka30). If you have an
|
||||
Acorn system with one of these, say Y. If unsure, say N.
|
||||
|
||||
config SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
bool "Support SCSI 2 Tagged queueing"
|
||||
depends on SCSI_ACORNSCSI_3
|
||||
help
|
||||
Say Y here to enable tagged queuing support on the Acorn SCSI card.
|
||||
|
||||
This is a feature of SCSI-2 which improves performance: the host
|
||||
adapter can send several SCSI commands to a device's queue even if
|
||||
previous commands haven't finished yet. Some SCSI devices don't
|
||||
implement this properly, so the safe answer is N.
|
||||
|
||||
config SCSI_ACORNSCSI_SYNC
|
||||
bool "Support SCSI 2 Synchronous Transfers"
|
||||
depends on SCSI_ACORNSCSI_3
|
||||
|
@ -52,12 +52,8 @@
|
||||
* You can tell if you have a device that supports tagged queueing my
|
||||
* cating (eg) /proc/scsi/acornscsi/0 and see if the SCSI revision is reported
|
||||
* as '2 TAG'.
|
||||
*
|
||||
* Also note that CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE is normally set in the config
|
||||
* scripts, but disabled here. Once debugged, remove the #undef, otherwise to debug,
|
||||
* comment out the undef.
|
||||
*/
|
||||
#undef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
|
||||
/*
|
||||
* SCSI-II Synchronous transfer support.
|
||||
*
|
||||
@ -171,7 +167,7 @@ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp,
|
||||
unsigned int result);
|
||||
static int acornscsi_reconnect_finish(AS_Host *host);
|
||||
static void acornscsi_dma_cleanup(AS_Host *host);
|
||||
static void acornscsi_abortcmd(AS_Host *host, unsigned char tag);
|
||||
static void acornscsi_abortcmd(AS_Host *host);
|
||||
|
||||
/* ====================================================================================
|
||||
* Miscellaneous
|
||||
@ -741,17 +737,6 @@ intr_ret_t acornscsi_kick(AS_Host *host)
|
||||
#endif
|
||||
|
||||
if (from_queue) {
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
/*
|
||||
* tagged queueing - allocate a new tag to this command
|
||||
*/
|
||||
if (SCpnt->device->simple_tags) {
|
||||
SCpnt->device->current_tag += 1;
|
||||
if (SCpnt->device->current_tag == 0)
|
||||
SCpnt->device->current_tag = 1;
|
||||
SCpnt->tag = SCpnt->device->current_tag;
|
||||
} else
|
||||
#endif
|
||||
set_bit(SCpnt->device->id * 8 +
|
||||
(u8)(SCpnt->device->lun & 0x07), host->busyluns);
|
||||
|
||||
@ -1192,7 +1177,7 @@ void acornscsi_dma_intr(AS_Host *host)
|
||||
* the device recognises the attention.
|
||||
*/
|
||||
if (dmac_read(host, DMAC_STATUS) & STATUS_RQ0) {
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
|
||||
dmac_write(host, DMAC_TXCNTLO, 0);
|
||||
dmac_write(host, DMAC_TXCNTHI, 0);
|
||||
@ -1560,23 +1545,6 @@ void acornscsi_message(AS_Host *host)
|
||||
acornscsi_sbic_issuecmd(host, CMND_ASSERTATN);
|
||||
|
||||
switch (host->scsi.last_message) {
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
case HEAD_OF_QUEUE_TAG:
|
||||
case ORDERED_QUEUE_TAG:
|
||||
case SIMPLE_QUEUE_TAG:
|
||||
/*
|
||||
* ANSI standard says: (Section SCSI-2 Rev. 10c Sect 5.6.17)
|
||||
* If a target does not implement tagged queuing and a queue tag
|
||||
* message is received, it shall respond with a MESSAGE REJECT
|
||||
* message and accept the I/O process as if it were untagged.
|
||||
*/
|
||||
printk(KERN_NOTICE "scsi%d.%c: disabling tagged queueing\n",
|
||||
host->host->host_no, acornscsi_target(host));
|
||||
host->SCpnt->device->simple_tags = 0;
|
||||
set_bit(host->SCpnt->device->id * 8 +
|
||||
(u8)(host->SCpnt->device->lun & 0x7), host->busyluns);
|
||||
break;
|
||||
#endif
|
||||
case EXTENDED_MESSAGE | (EXTENDED_SDTR << 8):
|
||||
/*
|
||||
* Target can't handle synchronous transfers
|
||||
@ -1687,24 +1655,11 @@ void acornscsi_buildmessages(AS_Host *host)
|
||||
#if 0
|
||||
/* does the device need the current command aborted */
|
||||
if (cmd_aborted) {
|
||||
acornscsi_abortcmd(host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
if (host->SCpnt->tag) {
|
||||
unsigned int tag_type;
|
||||
|
||||
if (host->SCpnt->cmnd[0] == REQUEST_SENSE ||
|
||||
host->SCpnt->cmnd[0] == TEST_UNIT_READY ||
|
||||
host->SCpnt->cmnd[0] == INQUIRY)
|
||||
tag_type = HEAD_OF_QUEUE_TAG;
|
||||
else
|
||||
tag_type = SIMPLE_QUEUE_TAG;
|
||||
msgqueue_addmsg(&host->scsi.msgs, 2, tag_type, host->SCpnt->tag);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
|
||||
if (host->device[host->SCpnt->device->id].sync_state == SYNC_NEGOCIATE) {
|
||||
@ -1798,7 +1753,7 @@ int acornscsi_reconnect(AS_Host *host)
|
||||
"to reconnect with\n",
|
||||
host->host->host_no, '0' + target);
|
||||
acornscsi_dumplog(host, target);
|
||||
acornscsi_abortcmd(host, 0);
|
||||
acornscsi_abortcmd(host);
|
||||
if (host->SCpnt) {
|
||||
queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt);
|
||||
host->SCpnt = NULL;
|
||||
@ -1821,7 +1776,7 @@ int acornscsi_reconnect_finish(AS_Host *host)
|
||||
host->scsi.disconnectable = 0;
|
||||
if (host->SCpnt->device->id == host->scsi.reconnected.target &&
|
||||
host->SCpnt->device->lun == host->scsi.reconnected.lun &&
|
||||
host->SCpnt->tag == host->scsi.reconnected.tag) {
|
||||
scsi_cmd_to_tag(host->SCpnt) == host->scsi.reconnected.tag) {
|
||||
#if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON))
|
||||
DBG(host->SCpnt, printk("scsi%d.%c: reconnected",
|
||||
host->host->host_no, acornscsi_target(host)));
|
||||
@ -1848,7 +1803,7 @@ int acornscsi_reconnect_finish(AS_Host *host)
|
||||
}
|
||||
|
||||
if (!host->SCpnt)
|
||||
acornscsi_abortcmd(host, host->scsi.reconnected.tag);
|
||||
acornscsi_abortcmd(host);
|
||||
else {
|
||||
/*
|
||||
* Restore data pointer from SAVED pointers.
|
||||
@ -1889,21 +1844,15 @@ void acornscsi_disconnect_unexpected(AS_Host *host)
|
||||
* Function: void acornscsi_abortcmd(AS_host *host, unsigned char tag)
|
||||
* Purpose : abort a currently executing command
|
||||
* Params : host - host with connected command to abort
|
||||
* tag - tag to abort
|
||||
*/
|
||||
static
|
||||
void acornscsi_abortcmd(AS_Host *host, unsigned char tag)
|
||||
void acornscsi_abortcmd(AS_Host *host)
|
||||
{
|
||||
host->scsi.phase = PHASE_ABORTED;
|
||||
sbic_arm_write(host, SBIC_CMND, CMND_ASSERTATN);
|
||||
|
||||
msgqueue_flush(&host->scsi.msgs);
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
if (tag)
|
||||
msgqueue_addmsg(&host->scsi.msgs, 2, ABORT_TAG, tag);
|
||||
else
|
||||
#endif
|
||||
msgqueue_addmsg(&host->scsi.msgs, 1, ABORT);
|
||||
msgqueue_addmsg(&host->scsi.msgs, 1, ABORT);
|
||||
}
|
||||
|
||||
/* ==========================================================================================
|
||||
@ -1993,7 +1942,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTING, SSR %02X?\n",
|
||||
host->host->host_no, acornscsi_target(host), ssr);
|
||||
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
}
|
||||
return INTR_PROCESSING;
|
||||
|
||||
@ -2029,7 +1978,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTED, SSR %02X?\n",
|
||||
host->host->host_no, acornscsi_target(host), ssr);
|
||||
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
}
|
||||
return INTR_PROCESSING;
|
||||
|
||||
@ -2075,20 +2024,20 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
case 0x18: /* -> PHASE_DATAOUT */
|
||||
/* COMMAND -> DATA OUT */
|
||||
if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len)
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
acornscsi_dma_setup(host, DMA_OUT);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAOUT;
|
||||
return INTR_IDLE;
|
||||
|
||||
case 0x19: /* -> PHASE_DATAIN */
|
||||
/* COMMAND -> DATA IN */
|
||||
if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len)
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
acornscsi_dma_setup(host, DMA_IN);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAIN;
|
||||
return INTR_IDLE;
|
||||
|
||||
@ -2156,7 +2105,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
/* MESSAGE IN -> DATA OUT */
|
||||
acornscsi_dma_setup(host, DMA_OUT);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAOUT;
|
||||
return INTR_IDLE;
|
||||
|
||||
@ -2165,7 +2114,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
/* MESSAGE IN -> DATA IN */
|
||||
acornscsi_dma_setup(host, DMA_IN);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAIN;
|
||||
return INTR_IDLE;
|
||||
|
||||
@ -2206,7 +2155,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
switch (ssr) {
|
||||
case 0x19: /* -> PHASE_DATAIN */
|
||||
case 0x89: /* -> PHASE_DATAIN */
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
return INTR_IDLE;
|
||||
|
||||
case 0x1b: /* -> PHASE_STATUSIN */
|
||||
@ -2255,7 +2204,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
switch (ssr) {
|
||||
case 0x18: /* -> PHASE_DATAOUT */
|
||||
case 0x88: /* -> PHASE_DATAOUT */
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
return INTR_IDLE;
|
||||
|
||||
case 0x1b: /* -> PHASE_STATUSIN */
|
||||
@ -2482,7 +2431,6 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt,
|
||||
SCpnt->scsi_done = done;
|
||||
SCpnt->host_scribble = NULL;
|
||||
SCpnt->result = 0;
|
||||
SCpnt->tag = 0;
|
||||
SCpnt->SCp.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]);
|
||||
SCpnt->SCp.sent_command = 0;
|
||||
SCpnt->SCp.scsi_xferred = 0;
|
||||
@ -2581,7 +2529,7 @@ static enum res_abort acornscsi_do_abort(AS_Host *host, struct scsi_cmnd *SCpnt)
|
||||
break;
|
||||
|
||||
default:
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
res = res_snooze;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
@ -2747,9 +2695,6 @@ char *acornscsi_info(struct Scsi_Host *host)
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
|
||||
" SYNC"
|
||||
#endif
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
" TAG"
|
||||
#endif
|
||||
#if (DEBUG & DEBUG_NO_WRITE)
|
||||
" NOWRITE (" __stringify(NO_WRITE) ")"
|
||||
#endif
|
||||
@ -2770,9 +2715,6 @@ static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
|
||||
" SYNC"
|
||||
#endif
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
" TAG"
|
||||
#endif
|
||||
#if (DEBUG & DEBUG_NO_WRITE)
|
||||
" NOWRITE (" __stringify(NO_WRITE) ")"
|
||||
#endif
|
||||
@ -2827,9 +2769,8 @@ static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)
|
||||
seq_printf(m, "Device/Lun TaggedQ Sync\n");
|
||||
seq_printf(m, " %d/%llu ", scd->id, scd->lun);
|
||||
if (scd->tagged_supported)
|
||||
seq_printf(m, "%3sabled(%3d) ",
|
||||
scd->simple_tags ? "en" : "dis",
|
||||
scd->current_tag);
|
||||
seq_printf(m, "%3sabled ",
|
||||
scd->simple_tags ? "en" : "dis");
|
||||
else
|
||||
seq_printf(m, "unsupported ");
|
||||
|
||||
|
@ -214,7 +214,7 @@ struct scsi_cmnd *queue_remove_tgtluntag(Queue_t *queue, int target, int lun,
|
||||
list_for_each(l, &queue->head) {
|
||||
QE_t *q = list_entry(l, QE_t, list);
|
||||
if (q->SCpnt->device->id == target && q->SCpnt->device->lun == lun &&
|
||||
q->SCpnt->tag == tag) {
|
||||
scsi_cmd_to_rq(q->SCpnt)->tag == tag) {
|
||||
SCpnt = __queue_remove(queue, l);
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user