Lines Matching full:scsi

3  *  linux/drivers/acorn/scsi/acornscsi.c
5 * Acorn SCSI 3 driver
16 * state not scsi state. Should be easier to debug.
18 * Updated proc/scsi reporting.
19 * 05-Oct-1997 RMK Implemented writing to SCSI devices.
45 * SCSI-II Tagged queue support.
47 * I don't have any SCSI devices that support it, so it is totally untested
53 * cating (eg) /proc/scsi/acornscsi/0 and see if the SCSI revision is reported
58 * SCSI-II Synchronous transfer support.
78 /* only allow writing to SCSI device 0 */
89 * Define this if you want to have verbose explanation of SCSI
129 #include <scsi/scsi.h>
130 #include <scsi/scsi_cmnd.h>
131 #include <scsi/scsi_dbg.h>
132 #include <scsi/scsi_device.h>
133 #include <scsi/scsi_eh.h>
134 #include <scsi/scsi_host.h>
135 #include <scsi/scsi_tcq.h>
136 #include <scsi/scsi_transport_spi.h>
141 #include <scsi/scsicam.h>
232 printk("scsi%d: %s: DMAC %02x @%06x+%04x msk %02x, ", in acornscsi_dumpdma()
238 printk("BH @%p +%04x, ", host->scsi.SCp.ptr, in acornscsi_dumpdma()
239 host->scsi.SCp.this_residual); in acornscsi_dumpdma()
241 host->scsi.SCp.scsi_xferred); in acornscsi_dumpdma()
272 printk("scsi%d: timeout while %s\n", host->host->host_no, msg); in acornscsi_sbic_wait()
312 /* wait 3 cs. SCSI standard says 25ms. */ in acornscsi_resetcard()
329 printk("scsi%d: timeout while resetting card\n", in acornscsi_resetcard()
350 printk("scsi%d: timeout while resetting card\n", in acornscsi_resetcard()
355 printk(KERN_CRIT "scsi%d: WD33C93A didn't give enhanced reset interrupt\n", in acornscsi_resetcard()
376 host->scsi.phase = PHASE_IDLE; in acornscsi_resetcard()
377 host->scsi.disconnectable = 0; in acornscsi_resetcard()
386 /* wait 25 cs. SCSI standard says 250ms. */ in acornscsi_resetcard()
479 printk("scsi: "); in print_sbic_status()
483 printk("sbic: %02X scsi: %X:%X ph: %02X\n", in print_sbic_status()
707 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_kick()
709 host->scsi.disconnectable = 0; in acornscsi_kick()
711 DBG(host->SCpnt, printk("scsi%d.%c: moved command to disconnected queue\n", in acornscsi_kick()
730 host->scsi.phase = PHASE_CONNECTING; in acornscsi_kick()
732 host->scsi.SCp = *arm_scsi_pointer(SCpnt); in acornscsi_kick()
738 DBG(SCpnt,printk("scsi%d.%c: starting cmd %02X\n", in acornscsi_kick()
788 scsi_msg_to_host_byte(SCpnt, host->scsi.SCp.Message); in acornscsi_done()
789 set_status_byte(SCpnt, host->scsi.SCp.Status); in acornscsi_done()
803 if (host->scsi.SCp.ptr && in acornscsi_done()
807 if (host->scsi.SCp.scsi_xferred < SCpnt->underflow || in acornscsi_done()
808 host->scsi.SCp.scsi_xferred != host->dma.transferred) in acornscsi_done()
812 /* ANSI standard says: (SCSI-2 Rev 10c Sect 5.6.6) in acornscsi_done()
853 printk("scsi%d: null command in acornscsi_done", host->host->host_no); in acornscsi_done()
855 host->scsi.phase = PHASE_IDLE; in acornscsi_done()
862 * Purpose : update SCSI Data Pointer
1007 printk(KERN_CRIT "scsi%d.%c: I can't handle DMA_OUT!\n", in acornscsi_dma_setup()
1019 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_setup()
1029 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_setup()
1050 * Purpose : ensure that all DMA transfers are up-to-date & host->scsi.SCp is correct
1091 acornscsi_data_read(host, host->scsi.SCp.ptr, in acornscsi_dma_cleanup()
1095 * Update SCSI pointers in acornscsi_dma_cleanup()
1097 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_cleanup()
1138 host->dma.xfer_ptr = host->scsi.SCp.ptr; in acornscsi_dma_intr()
1142 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_intr()
1147 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_intr()
1157 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_intr()
1212 * SBIC but not SCSI bus.
1224 * Calculate correct DMA address - DMA is ahead of SCSI bus while in acornscsi_dma_adjust()
1226 * host->scsi.SCp.scsi_xferred is the number of bytes in acornscsi_dma_adjust()
1227 * actually transferred to/from the SCSI bus. in acornscsi_dma_adjust()
1231 * real_dma_addr = host->dma.start_addr + host->scsi.SCp.scsi_xferred in acornscsi_dma_adjust()
1234 transferred = host->scsi.SCp.scsi_xferred - host->dma.transferred; in acornscsi_dma_adjust()
1236 printk("scsi%d.%c: Ack! DMA write correction %ld < 0!\n", in acornscsi_dma_adjust()
1293 sbic_arm_writenext(host, SCpnt->cmd_len - host->scsi.SCp.sent_command); in acornscsi_sendcommand()
1298 (int *)&host->scsi.SCp.sent_command, SCpnt->cmd_len, 1000000)) in acornscsi_sendcommand()
1299 printk("scsi%d: timeout while sending command\n", host->host->host_no); in acornscsi_sendcommand()
1301 host->scsi.phase = PHASE_COMMAND; in acornscsi_sendcommand()
1307 unsigned int message_length = msgqueue_msglength(&host->scsi.msgs); in acornscsi_sendmessage()
1312 printk("scsi%d.%c: sending message ", in acornscsi_sendmessage()
1324 host->scsi.last_message = NOP; in acornscsi_sendmessage()
1332 msg = msgqueue_getmsg(&host->scsi.msgs, 0); in acornscsi_sendmessage()
1338 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1346 * ANSI standard says: (SCSI-2 Rev 10c Sect 5.6.14) in acornscsi_sendmessage()
1359 while ((msg = msgqueue_getmsg(&host->scsi.msgs, msgnr++)) != NULL) { in acornscsi_sendmessage()
1366 printk("scsi%d: timeout while sending message\n", host->host->host_no); in acornscsi_sendmessage()
1368 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1370 host->scsi.last_message |= msg->msg[2] << 8; in acornscsi_sendmessage()
1392 host->scsi.SCp.Status = sbic_arm_read(host, SBIC_DATA); in acornscsi_readstatusbyte()
1457 printk("scsi%d.%c: message in: ", in acornscsi_message()
1463 if (host->scsi.phase == PHASE_RECONNECTED) { in acornscsi_message()
1465 * ANSI standard says: (Section SCSI-2 Rev. 10c Sect 5.6.17) in acornscsi_message()
1471 host->scsi.reconnected.tag = message[1]; in acornscsi_message()
1473 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1480 if (host->scsi.phase != PHASE_STATUSIN) { in acornscsi_message()
1481 printk(KERN_ERR "scsi%d.%c: command complete following non-status in phase?\n", in acornscsi_message()
1485 host->scsi.phase = PHASE_DONE; in acornscsi_message()
1486 host->scsi.SCp.Message = message[0]; in acornscsi_message()
1491 * ANSI standard says: (Section SCSI-2 Rev. 10c Sect 5.6.20) in acornscsi_message()
1498 *scsi_pointer = host->scsi.SCp; in acornscsi_message()
1500 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1505 * ANSI standard says: (Section SCSI-2 Rev. 10c Sect 5.6.19) in acornscsi_message()
1514 host->scsi.SCp = *arm_scsi_pointer(host->SCpnt); in acornscsi_message()
1515 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1520 * ANSI standard says: (Section SCSI-2 Rev. 10c Sect 6.4.2) in acornscsi_message()
1529 host->scsi.phase = PHASE_DISCONNECT; in acornscsi_message()
1547 if (msgqueue_msglength(&host->scsi.msgs)) in acornscsi_message()
1550 switch (host->scsi.last_message) { in acornscsi_message()
1555 printk(KERN_NOTICE "scsi%d.%c: Using asynchronous transfer\n", in acornscsi_message()
1569 printk("scsi%d.%c: reconnect queue tag %02X\n", in acornscsi_message()
1586 printk(KERN_NOTICE "scsi%d.%c: Using synchronous transfer, offset %d, %d ns\n", in acornscsi_message()
1600 msgqueue_addmsg(&host->scsi.msgs, 5, EXTENDED_MESSAGE, 3, in acornscsi_message()
1619 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1620 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1626 printk(KERN_ERR "scsi%d.%c: unrecognised message %02X, rejecting\n", in acornscsi_message()
1630 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1631 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1632 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1649 msgqueue_addmsg(&host->scsi.msgs, 1, BUS_DEVICE_RESET); in acornscsi_buildmessages()
1654 msgqueue_addmsg(&host->scsi.msgs, 1, in acornscsi_buildmessages()
1670 msgqueue_addmsg(&host->scsi.msgs, 5, in acornscsi_buildmessages()
1688 if (!host->scsi.SCp.ptr /*&& host->scsi.SCp.this_residual*/) { in acornscsi_starttransfer()
1689 printk(KERN_ERR "scsi%d.%c: null buffer passed to acornscsi_starttransfer\n", in acornscsi_starttransfer()
1694 residual = scsi_bufflen(host->SCpnt) - host->scsi.SCp.scsi_xferred; in acornscsi_starttransfer()
1711 * Remarks : SCSI spec says:
1723 printk(KERN_ERR "scsi%d: invalid source id after reselection " in acornscsi_reconnect()
1729 if (host->SCpnt && !host->scsi.disconnectable) { in acornscsi_reconnect()
1730 printk(KERN_ERR "scsi%d.%d: reconnected while command in " in acornscsi_reconnect()
1738 host->scsi.reconnected.target = target; in acornscsi_reconnect()
1739 host->scsi.reconnected.lun = lun; in acornscsi_reconnect()
1740 host->scsi.reconnected.tag = 0; in acornscsi_reconnect()
1742 if (host->scsi.disconnectable && host->SCpnt && in acornscsi_reconnect()
1749 ADD_STATUS(target, 0x81, host->scsi.phase, 0); in acornscsi_reconnect()
1752 host->scsi.phase = PHASE_RECONNECTED; in acornscsi_reconnect()
1755 printk(KERN_ERR "scsi%d.%c: reselected with no command " in acornscsi_reconnect()
1778 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_reconnect_finish()
1779 host->scsi.disconnectable = 0; in acornscsi_reconnect_finish()
1780 if (host->SCpnt->device->id == host->scsi.reconnected.target && in acornscsi_reconnect_finish()
1781 host->SCpnt->device->lun == host->scsi.reconnected.lun && in acornscsi_reconnect_finish()
1782 scsi_cmd_to_rq(host->SCpnt)->tag == host->scsi.reconnected.tag) { in acornscsi_reconnect_finish()
1784 DBG(host->SCpnt, printk("scsi%d.%c: reconnected", in acornscsi_reconnect_finish()
1790 DBG(host->SCpnt, printk("scsi%d.%c: had to move command " in acornscsi_reconnect_finish()
1799 host->scsi.reconnected.target, in acornscsi_reconnect_finish()
1800 host->scsi.reconnected.lun, in acornscsi_reconnect_finish()
1801 host->scsi.reconnected.tag); in acornscsi_reconnect_finish()
1803 DBG(host->SCpnt, printk("scsi%d.%c: had to get command", in acornscsi_reconnect_finish()
1814 host->scsi.SCp = *arm_scsi_pointer(host->SCpnt); in acornscsi_reconnect_finish()
1817 host->scsi.SCp.ptr, host->scsi.SCp.this_residual); in acornscsi_reconnect_finish()
1824 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_reconnect_finish()
1837 printk(KERN_ERR "scsi%d.%c: unexpected disconnect\n", in acornscsi_disconnect_unexpected()
1854 host->scsi.phase = PHASE_ABORTED; in acornscsi_abortcmd()
1857 msgqueue_flush(&host->scsi.msgs); in acornscsi_abortcmd()
1858 msgqueue_addmsg(&host->scsi.msgs, 1, ABORT); in acornscsi_abortcmd()
1866 * Purpose : handle interrupts from SCSI device
1884 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_sbicintr()
1887 ADD_STATUS(8, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1889 if (host->SCpnt && !host->scsi.disconnectable) in acornscsi_sbicintr()
1890 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1894 printk(KERN_ERR "scsi%d: reset in standard mode but wanted advanced mode.\n", in acornscsi_sbicintr()
1906 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1914 switch (host->scsi.phase) { in acornscsi_sbicintr()
1919 host->scsi.phase = PHASE_CONNECTED; in acornscsi_sbicintr()
1920 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1921 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_sbicintr()
1927 ADD_STATUS(8, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1928 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1940 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1945 printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTING, SSR %02X?\n", in acornscsi_sbicintr()
1964 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
1970 host->scsi.phase = PHASE_MSGOUT; in acornscsi_sbicintr()
1981 printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTED, SSR %02X?\n", in acornscsi_sbicintr()
1990 * SCSI standard says that MESSAGE OUT phases can be followed by a in acornscsi_sbicintr()
2004 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2019 printk(KERN_ERR "scsi%d.%c: PHASE_MSGOUT, SSR %02X?\n", in acornscsi_sbicintr()
2029 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2034 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2039 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2044 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2050 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2064 printk(KERN_ERR "scsi%d.%c: PHASE_COMMAND, SSR %02X?\n", in acornscsi_sbicintr()
2072 host->scsi.disconnectable = 1; in acornscsi_sbicintr()
2073 host->scsi.reconnected.tag = 0; in acornscsi_sbicintr()
2074 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2077 printk(KERN_ERR "scsi%d.%c: PHASE_DISCONNECT, SSR %02X instead of disconnect?\n", in acornscsi_sbicintr()
2087 printk(KERN_ERR "scsi%d.%c: PHASE_IDLE, SSR %02X while idle?\n", in acornscsi_sbicintr()
2104 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
2112 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2121 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2133 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2147 printk(KERN_ERR "scsi%d.%c: PHASE_RECONNECTED, SSR %02X after reconnect?\n", in acornscsi_sbicintr()
2168 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2172 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2179 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2189 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2196 printk(KERN_ERR "scsi%d.%c: PHASE_DATAIN, SSR %02X?\n", in acornscsi_sbicintr()
2217 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2222 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2229 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2240 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2248 printk(KERN_ERR "scsi%d.%c: PHASE_DATAOUT, SSR %02X?\n", in acornscsi_sbicintr()
2269 printk(KERN_ERR "scsi%d.%c: PHASE_STATUSIN, SSR %02X instead of MESSAGE_IN?\n", in acornscsi_sbicintr()
2292 printk("scsi%d.%c: strange message in disconnection\n", in acornscsi_sbicintr()
2299 printk(KERN_ERR "scsi%d.%c: PHASE_MSGIN, SSR %02X after message in?\n", in acornscsi_sbicintr()
2317 printk(KERN_ERR "scsi%d.%c: PHASE_DONE, SSR %02X instead of disconnect?\n", in acornscsi_sbicintr()
2329 clear_bit(host->scsi.reconnected.target * 8 + host->scsi.reconnected.lun, in acornscsi_sbicintr()
2331 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2343 printk(KERN_ERR "scsi%d.%c: PHASE_ABORTED, SSR %02X?\n", in acornscsi_sbicintr()
2350 printk(KERN_ERR "scsi%d.%c: unknown driver phase %d\n", in acornscsi_sbicintr()
2359 * Purpose : handle interrupts from Acorn SCSI card
2402 * Interfaces between interrupt handler and rest of scsi code
2407 * Purpose : queues a SCSI command
2408 * Params : cmd - SCSI command
2419 printk(KERN_CRIT "scsi%d.%c: WRITE attempted with NO_WRITE flag set\n", in acornscsi_queuecmd_lck()
2446 if (host->scsi.phase == PHASE_IDLE) in acornscsi_queuecmd_lck()
2498 switch (host->scsi.phase) { in acornscsi_do_abort()
2508 if (host->scsi.disconnectable) { in acornscsi_do_abort()
2509 host->scsi.disconnectable = 0; in acornscsi_do_abort()
2569 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_abort()
2574 printk("scsi%d: ", host->host->host_no); in acornscsi_abort()
2652 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_host_reset()
2719 host->base + SBIC_REGIDX, host->scsi.irq); in acornscsi_show_info()
2722 host->base + DMAC_OFFSET, host->scsi.irq); in acornscsi_show_info()
2827 ashost->scsi.irq = host->irq; in acornscsi_probe()
2834 printk(KERN_CRIT "scsi%d: IRQ%d not free: %d\n", in acornscsi_probe()
2835 host->host_no, ashost->scsi.irq, ret); in acornscsi_probe()
2842 msgqueue_initialise(&ashost->scsi.msgs); in acornscsi_probe()
2855 msgqueue_free(&ashost->scsi.msgs); in acornscsi_probe()
2883 msgqueue_free(&ashost->scsi.msgs); in acornscsi_remove()