Lines Matching refs:host

179 static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp,
181 static int acornscsi_reconnect_finish(AS_Host *host);
182 static void acornscsi_dma_cleanup(AS_Host *host);
183 static void acornscsi_abortcmd(AS_Host *host, unsigned char tag);
198 static inline void sbic_arm_write(AS_Host *host, unsigned int reg, unsigned int value) in sbic_arm_write() argument
200 writeb(reg, host->base + SBIC_REGIDX); in sbic_arm_write()
201 writeb(value, host->base + SBIC_REGVAL); in sbic_arm_write()
204 static inline int sbic_arm_read(AS_Host *host, unsigned int reg) in sbic_arm_read() argument
207 return readl(host->base + SBIC_REGIDX) & 255; in sbic_arm_read()
208 writeb(reg, host->base + SBIC_REGIDX); in sbic_arm_read()
209 return readl(host->base + SBIC_REGVAL) & 255; in sbic_arm_read()
212 #define sbic_arm_writenext(host, val) writeb((val), (host)->base + SBIC_REGVAL) argument
213 #define sbic_arm_readnext(host) readb((host)->base + SBIC_REGVAL) argument
216 #define dmac_read(host,reg) \ argument
217 readb((host)->base + DMAC_OFFSET + ((reg) << 2))
219 #define dmac_write(host,reg,value) \ argument
220 ({ writeb((value), (host)->base + DMAC_OFFSET + ((reg) << 2)); })
222 #define dmac_clearintr(host) writeb(0, (host)->fast + INT_REG) argument
224 static inline unsigned int dmac_address(AS_Host *host) in dmac_address() argument
226 return dmac_read(host, DMAC_TXADRHI) << 16 | in dmac_address()
227 dmac_read(host, DMAC_TXADRMD) << 8 | in dmac_address()
228 dmac_read(host, DMAC_TXADRLO); in dmac_address()
232 void acornscsi_dumpdma(AS_Host *host, char *where) in acornscsi_dumpdma() argument
236 mode = dmac_read(host, DMAC_MODECON); in acornscsi_dumpdma()
237 addr = dmac_address(host); in acornscsi_dumpdma()
238 len = dmac_read(host, DMAC_TXCNTHI) << 8 | in acornscsi_dumpdma()
239 dmac_read(host, DMAC_TXCNTLO); in acornscsi_dumpdma()
242 host->host->host_no, where, in acornscsi_dumpdma()
244 dmac_read(host, DMAC_MASKREG)); in acornscsi_dumpdma()
246 printk("DMA @%06x, ", host->dma.start_addr); in acornscsi_dumpdma()
247 printk("BH @%p +%04x, ", host->scsi.SCp.ptr, in acornscsi_dumpdma()
248 host->scsi.SCp.this_residual); in acornscsi_dumpdma()
249 printk("DT @+%04x ST @+%04x", host->dma.transferred, in acornscsi_dumpdma()
250 host->scsi.SCp.scsi_xferred); in acornscsi_dumpdma()
256 unsigned long acornscsi_sbic_xfcount(AS_Host *host) in acornscsi_sbic_xfcount() argument
260 length = sbic_arm_read(host, SBIC_TRANSCNTH) << 16; in acornscsi_sbic_xfcount()
261 length |= sbic_arm_readnext(host) << 8; in acornscsi_sbic_xfcount()
262 length |= sbic_arm_readnext(host); in acornscsi_sbic_xfcount()
268 acornscsi_sbic_wait(AS_Host *host, int stat_mask, int stat, int timeout, char *msg) in acornscsi_sbic_wait() argument
273 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbic_wait()
281 printk("scsi%d: timeout while %s\n", host->host->host_no, msg); in acornscsi_sbic_wait()
287 int acornscsi_sbic_issuecmd(AS_Host *host, int command) in acornscsi_sbic_issuecmd() argument
289 if (acornscsi_sbic_wait(host, ASR_CIP, 0, 1000, "issuing command")) in acornscsi_sbic_issuecmd()
292 sbic_arm_write(host, SBIC_CMND, command); in acornscsi_sbic_issuecmd()
313 void acornscsi_resetcard(AS_Host *host) in acornscsi_resetcard() argument
318 host->card.page_reg = 0x80; in acornscsi_resetcard()
319 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_resetcard()
324 host->card.page_reg = 0; in acornscsi_resetcard()
325 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_resetcard()
332 if (readb(host->fast + INT_REG) & 8) in acornscsi_resetcard()
339 host->host->host_no); in acornscsi_resetcard()
341 sbic_arm_read(host, SBIC_ASR); in acornscsi_resetcard()
342 sbic_arm_read(host, SBIC_SSR); in acornscsi_resetcard()
345 sbic_arm_write(host, SBIC_OWNID, OWNID_EAF | host->host->this_id); in acornscsi_resetcard()
346 sbic_arm_write(host, SBIC_CMND, CMND_RESET); in acornscsi_resetcard()
353 if (readb(host->fast + INT_REG) & 8) in acornscsi_resetcard()
360 host->host->host_no); in acornscsi_resetcard()
362 sbic_arm_read(host, SBIC_ASR); in acornscsi_resetcard()
363 if (sbic_arm_read(host, SBIC_SSR) != 0x01) in acornscsi_resetcard()
365 host->host->host_no); in acornscsi_resetcard()
367 sbic_arm_write(host, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); in acornscsi_resetcard()
368 sbic_arm_write(host, SBIC_TIMEOUT, TIMEOUT_TIME); in acornscsi_resetcard()
369 sbic_arm_write(host, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); in acornscsi_resetcard()
370 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_resetcard()
372 host->card.page_reg = 0x40; in acornscsi_resetcard()
373 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_resetcard()
376 dmac_write(host, DMAC_INIT, 0); in acornscsi_resetcard()
378 dmac_write(host, DMAC_INIT, INIT_8BIT); in acornscsi_resetcard()
379 dmac_write(host, DMAC_CHANNEL, CHANNEL_0); in acornscsi_resetcard()
380 dmac_write(host, DMAC_DEVCON0, INIT_DEVCON0); in acornscsi_resetcard()
381 dmac_write(host, DMAC_DEVCON1, INIT_DEVCON1); in acornscsi_resetcard()
384 host->SCpnt = NULL; in acornscsi_resetcard()
385 host->scsi.phase = PHASE_IDLE; in acornscsi_resetcard()
386 host->scsi.disconnectable = 0; in acornscsi_resetcard()
388 memset(host->busyluns, 0, sizeof(host->busyluns)); in acornscsi_resetcard()
391 host->device[i].sync_state = SYNC_NEGOCIATE; in acornscsi_resetcard()
392 host->device[i].disconnect_ok = 1; in acornscsi_resetcard()
498 acornscsi_dumplogline(AS_Host *host, int target, int line) in acornscsi_dumplogline() argument
503 ptr = host->status_ptr[target] - STATUS_BUFFER_TO_PRINT; in acornscsi_dumplogline()
510 prev = host->status[target][ptr].when; in acornscsi_dumplogline()
512 for (; ptr != host->status_ptr[target]; ptr = (ptr + 1) & (STATUS_BUFFER_SIZE - 1)) { in acornscsi_dumplogline()
515 if (!host->status[target][ptr].when) in acornscsi_dumplogline()
520 printk("%c%02X", host->status[target][ptr].irq ? '-' : ' ', in acornscsi_dumplogline()
521 host->status[target][ptr].ph); in acornscsi_dumplogline()
525 printk(" %02X", host->status[target][ptr].ssr); in acornscsi_dumplogline()
529 time_diff = host->status[target][ptr].when - prev; in acornscsi_dumplogline()
530 prev = host->status[target][ptr].when; in acornscsi_dumplogline()
545 void acornscsi_dumplog(AS_Host *host, int target) in acornscsi_dumplog() argument
548 acornscsi_dumplogline(host, target, 0); in acornscsi_dumplog()
549 acornscsi_dumplogline(host, target, 1); in acornscsi_dumplog()
550 acornscsi_dumplogline(host, target, 2); in acornscsi_dumplog()
560 char acornscsi_target(AS_Host *host) in acornscsi_target() argument
562 if (host->SCpnt) in acornscsi_target()
563 return '0' + host->SCpnt->device->id; in acornscsi_target()
697 intr_ret_t acornscsi_kick(AS_Host *host) in acornscsi_kick() argument
703 SCpnt = host->origSCpnt; in acornscsi_kick()
704 host->origSCpnt = NULL; in acornscsi_kick()
708 SCpnt = queue_remove_exclude(&host->queues.issue, host->busyluns); in acornscsi_kick()
715 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_kick()
716 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_kick()
717 host->scsi.disconnectable = 0; in acornscsi_kick()
719 DBG(host->SCpnt, printk("scsi%d.%c: moved command to disconnected queue\n", in acornscsi_kick()
720 host->host->host_no, acornscsi_target(host))); in acornscsi_kick()
722 host->SCpnt = NULL; in acornscsi_kick()
729 if (!(sbic_arm_read(host, SBIC_ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) { in acornscsi_kick()
730 sbic_arm_write(host, SBIC_DESTID, SCpnt->device->id); in acornscsi_kick()
731 sbic_arm_write(host, SBIC_CMND, CMND_SELWITHATN); in acornscsi_kick()
738 host->scsi.phase = PHASE_CONNECTING; in acornscsi_kick()
739 host->SCpnt = SCpnt; in acornscsi_kick()
740 host->scsi.SCp = SCpnt->SCp; in acornscsi_kick()
741 host->dma.xfer_setup = 0; in acornscsi_kick()
742 host->dma.xfer_required = 0; in acornscsi_kick()
743 host->dma.xfer_done = 0; in acornscsi_kick()
747 host->host->host_no, '0' + SCpnt->device->id, in acornscsi_kick()
764 (u8)(SCpnt->device->lun & 0x07), host->busyluns); in acornscsi_kick()
766 host->stats.removes += 1; in acornscsi_kick()
770 host->stats.writes += 1; in acornscsi_kick()
773 host->stats.reads += 1; in acornscsi_kick()
776 host->stats.miscs += 1; in acornscsi_kick()
790 static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, in acornscsi_done() argument
796 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_done()
798 host->stats.fins += 1; in acornscsi_done()
803 acornscsi_dma_cleanup(host); in acornscsi_done()
805 SCpnt->result = result << 16 | host->scsi.SCp.Message << 8 | host->scsi.SCp.Status; in acornscsi_done()
819 if (host->scsi.SCp.ptr && in acornscsi_done()
823 if (host->scsi.SCp.scsi_xferred < SCpnt->underflow || in acornscsi_done()
824 host->scsi.SCp.scsi_xferred != host->dma.transferred) in acornscsi_done()
840 if (host->dma.xfer_done) in acornscsi_done()
857 acornscsi_dumpdma(host, "done"); in acornscsi_done()
858 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_done()
865 panic("scsi%d.H: null scsi_done function in acornscsi_done", host->host->host_no); in acornscsi_done()
868 (u8)(SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_done()
872 printk("scsi%d: null command in acornscsi_done", host->host->host_no); in acornscsi_done()
874 host->scsi.phase = PHASE_IDLE; in acornscsi_done()
885 void acornscsi_data_updateptr(AS_Host *host, struct scsi_pointer *SCp, unsigned int length) in acornscsi_data_updateptr() argument
891 host->dma.xfer_done = 1; in acornscsi_data_updateptr()
905 void acornscsi_data_read(AS_Host *host, char *ptr, in acornscsi_data_read() argument
914 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
924 __acornscsi_in(host->base + (offset << 1), ptr, this_len); in acornscsi_data_read()
933 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
936 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
950 void acornscsi_data_write(AS_Host *host, char *ptr, in acornscsi_data_write() argument
959 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
969 __acornscsi_out(host->base + (offset << 1), ptr, this_len); in acornscsi_data_write()
978 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
981 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
996 void acornscsi_dma_stop(AS_Host *host) in acornscsi_dma_stop() argument
998 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_stop()
999 dmac_clearintr(host); in acornscsi_dma_stop()
1002 DBG(host->SCpnt, acornscsi_dumpdma(host, "stop")); in acornscsi_dma_stop()
1015 void acornscsi_dma_setup(AS_Host *host, dmadir_t direction) in acornscsi_dma_setup() argument
1019 host->dma.direction = direction; in acornscsi_dma_setup()
1021 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_setup()
1025 if (NO_WRITE & (1 << host->SCpnt->device->id)) { in acornscsi_dma_setup()
1027 host->host->host_no, acornscsi_target(host)); in acornscsi_dma_setup()
1038 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_setup()
1040 host->dma.start_addr = address = host->dma.free_addr; in acornscsi_dma_setup()
1041 host->dma.free_addr = (host->dma.free_addr + length) & in acornscsi_dma_setup()
1048 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_setup()
1052 dmac_write(host, DMAC_TXCNTLO, length); in acornscsi_dma_setup()
1053 dmac_write(host, DMAC_TXCNTHI, length >> 8); in acornscsi_dma_setup()
1054 dmac_write(host, DMAC_TXADRLO, address); in acornscsi_dma_setup()
1055 dmac_write(host, DMAC_TXADRMD, address >> 8); in acornscsi_dma_setup()
1056 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_setup()
1057 dmac_write(host, DMAC_MODECON, mode); in acornscsi_dma_setup()
1058 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_setup()
1061 DBG(host->SCpnt, acornscsi_dumpdma(host, "strt")); in acornscsi_dma_setup()
1063 host->dma.xfer_setup = 1; in acornscsi_dma_setup()
1076 void acornscsi_dma_cleanup(AS_Host *host) in acornscsi_dma_cleanup() argument
1078 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_cleanup()
1079 dmac_clearintr(host); in acornscsi_dma_cleanup()
1084 if (host->dma.xfer_required) { in acornscsi_dma_cleanup()
1085 host->dma.xfer_required = 0; in acornscsi_dma_cleanup()
1086 if (host->dma.direction == DMA_IN) in acornscsi_dma_cleanup()
1087 acornscsi_data_read(host, host->dma.xfer_ptr, in acornscsi_dma_cleanup()
1088 host->dma.xfer_start, host->dma.xfer_length); in acornscsi_dma_cleanup()
1094 if (host->dma.xfer_setup) { in acornscsi_dma_cleanup()
1097 host->dma.xfer_setup = 0; in acornscsi_dma_cleanup()
1100 DBG(host->SCpnt, acornscsi_dumpdma(host, "cupi")); in acornscsi_dma_cleanup()
1106 transferred = dmac_address(host) - host->dma.start_addr; in acornscsi_dma_cleanup()
1107 host->dma.transferred += transferred; in acornscsi_dma_cleanup()
1109 if (host->dma.direction == DMA_IN) in acornscsi_dma_cleanup()
1110 acornscsi_data_read(host, host->scsi.SCp.ptr, in acornscsi_dma_cleanup()
1111 host->dma.start_addr, transferred); in acornscsi_dma_cleanup()
1116 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_cleanup()
1118 DBG(host->SCpnt, acornscsi_dumpdma(host, "cupo")); in acornscsi_dma_cleanup()
1134 void acornscsi_dma_intr(AS_Host *host) in acornscsi_dma_intr() argument
1139 DBG(host->SCpnt, acornscsi_dumpdma(host, "inti")); in acornscsi_dma_intr()
1142 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_intr()
1143 dmac_clearintr(host); in acornscsi_dma_intr()
1148 transferred = dmac_address(host) - host->dma.start_addr; in acornscsi_dma_intr()
1149 host->dma.transferred += transferred; in acornscsi_dma_intr()
1154 if (host->dma.direction == DMA_IN) { in acornscsi_dma_intr()
1155 host->dma.xfer_start = host->dma.start_addr; in acornscsi_dma_intr()
1156 host->dma.xfer_length = transferred; in acornscsi_dma_intr()
1157 host->dma.xfer_ptr = host->scsi.SCp.ptr; in acornscsi_dma_intr()
1158 host->dma.xfer_required = 1; in acornscsi_dma_intr()
1161 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_intr()
1166 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_intr()
1168 host->dma.start_addr = address = host->dma.free_addr; in acornscsi_dma_intr()
1169 host->dma.free_addr = (host->dma.free_addr + length) & in acornscsi_dma_intr()
1175 if (host->dma.direction == DMA_OUT) in acornscsi_dma_intr()
1176 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_intr()
1180 dmac_write(host, DMAC_TXCNTLO, length); in acornscsi_dma_intr()
1181 dmac_write(host, DMAC_TXCNTHI, length >> 8); in acornscsi_dma_intr()
1182 dmac_write(host, DMAC_TXADRLO, address); in acornscsi_dma_intr()
1183 dmac_write(host, DMAC_TXADRMD, address >> 8); in acornscsi_dma_intr()
1184 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_intr()
1185 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_intr()
1188 DBG(host->SCpnt, acornscsi_dumpdma(host, "into")); in acornscsi_dma_intr()
1191 host->dma.xfer_setup = 0; in acornscsi_dma_intr()
1199 if (dmac_read(host, DMAC_STATUS) & STATUS_RQ0) { in acornscsi_dma_intr()
1200 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_dma_intr()
1202 dmac_write(host, DMAC_TXCNTLO, 0); in acornscsi_dma_intr()
1203 dmac_write(host, DMAC_TXCNTHI, 0); in acornscsi_dma_intr()
1204 dmac_write(host, DMAC_TXADRLO, 0); in acornscsi_dma_intr()
1205 dmac_write(host, DMAC_TXADRMD, 0); in acornscsi_dma_intr()
1206 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_intr()
1207 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_intr()
1219 void acornscsi_dma_xfer(AS_Host *host) in acornscsi_dma_xfer() argument
1221 host->dma.xfer_required = 0; in acornscsi_dma_xfer()
1223 if (host->dma.direction == DMA_IN) in acornscsi_dma_xfer()
1224 acornscsi_data_read(host, host->dma.xfer_ptr, in acornscsi_dma_xfer()
1225 host->dma.xfer_start, host->dma.xfer_length); in acornscsi_dma_xfer()
1235 void acornscsi_dma_adjust(AS_Host *host) in acornscsi_dma_adjust() argument
1237 if (host->dma.xfer_setup) { in acornscsi_dma_adjust()
1240 DBG(host->SCpnt, acornscsi_dumpdma(host, "adji")); in acornscsi_dma_adjust()
1253 transferred = host->scsi.SCp.scsi_xferred - host->dma.transferred; in acornscsi_dma_adjust()
1256 host->host->host_no, acornscsi_target(host), transferred); in acornscsi_dma_adjust()
1258 host->dma.xfer_setup = 0; in acornscsi_dma_adjust()
1260 transferred += host->dma.start_addr; in acornscsi_dma_adjust()
1261 dmac_write(host, DMAC_TXADRLO, transferred); in acornscsi_dma_adjust()
1262 dmac_write(host, DMAC_TXADRMD, transferred >> 8); in acornscsi_dma_adjust()
1263 dmac_write(host, DMAC_TXADRHI, transferred >> 16); in acornscsi_dma_adjust()
1265 DBG(host->SCpnt, acornscsi_dumpdma(host, "adjo")); in acornscsi_dma_adjust()
1276 acornscsi_write_pio(AS_Host *host, char *bytes, int *ptr, int len, unsigned int max_timeout) in acornscsi_write_pio() argument
1282 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_write_pio()
1287 sbic_arm_write(host, SBIC_DATA, bytes[my_ptr++]); in acornscsi_write_pio()
1306 acornscsi_sendcommand(AS_Host *host) in acornscsi_sendcommand() argument
1308 struct scsi_cmnd *SCpnt = host->SCpnt; in acornscsi_sendcommand()
1310 sbic_arm_write(host, SBIC_TRANSCNTH, 0); in acornscsi_sendcommand()
1311 sbic_arm_writenext(host, 0); in acornscsi_sendcommand()
1312 sbic_arm_writenext(host, SCpnt->cmd_len - host->scsi.SCp.sent_command); in acornscsi_sendcommand()
1314 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_sendcommand()
1316 if (acornscsi_write_pio(host, SCpnt->cmnd, in acornscsi_sendcommand()
1317 (int *)&host->scsi.SCp.sent_command, SCpnt->cmd_len, 1000000)) in acornscsi_sendcommand()
1318 printk("scsi%d: timeout while sending command\n", host->host->host_no); in acornscsi_sendcommand()
1320 host->scsi.phase = PHASE_COMMAND; in acornscsi_sendcommand()
1324 void acornscsi_sendmessage(AS_Host *host) in acornscsi_sendmessage() argument
1326 unsigned int message_length = msgqueue_msglength(&host->scsi.msgs); in acornscsi_sendmessage()
1332 host->host->host_no, acornscsi_target(host)); in acornscsi_sendmessage()
1337 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_sendmessage()
1339 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 1"); in acornscsi_sendmessage()
1341 sbic_arm_write(host, SBIC_DATA, NOP); in acornscsi_sendmessage()
1343 host->scsi.last_message = NOP; in acornscsi_sendmessage()
1350 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_sendmessage()
1351 msg = msgqueue_getmsg(&host->scsi.msgs, 0); in acornscsi_sendmessage()
1353 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 2"); in acornscsi_sendmessage()
1355 sbic_arm_write(host, SBIC_DATA, msg->msg[0]); in acornscsi_sendmessage()
1357 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1372 sbic_arm_write(host, SBIC_TRANSCNTH, 0); in acornscsi_sendmessage()
1373 sbic_arm_writenext(host, 0); in acornscsi_sendmessage()
1374 sbic_arm_writenext(host, message_length); in acornscsi_sendmessage()
1375 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_sendmessage()
1378 while ((msg = msgqueue_getmsg(&host->scsi.msgs, msgnr++)) != NULL) { in acornscsi_sendmessage()
1384 if (acornscsi_write_pio(host, msg->msg, &i, msg->length, 1000000)) in acornscsi_sendmessage()
1385 printk("scsi%d: timeout while sending message\n", host->host->host_no); in acornscsi_sendmessage()
1387 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1389 host->scsi.last_message |= msg->msg[2] << 8; in acornscsi_sendmessage()
1407 void acornscsi_readstatusbyte(AS_Host *host) in acornscsi_readstatusbyte() argument
1409 acornscsi_sbic_issuecmd(host, CMND_XFERINFO|CMND_SBT); in acornscsi_readstatusbyte()
1410 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "reading status byte"); in acornscsi_readstatusbyte()
1411 host->scsi.SCp.Status = sbic_arm_read(host, SBIC_DATA); in acornscsi_readstatusbyte()
1420 unsigned char acornscsi_readmessagebyte(AS_Host *host) in acornscsi_readmessagebyte() argument
1424 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_readmessagebyte()
1426 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "for message byte"); in acornscsi_readmessagebyte()
1428 message = sbic_arm_read(host, SBIC_DATA); in acornscsi_readmessagebyte()
1431 acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after message byte"); in acornscsi_readmessagebyte()
1433 sbic_arm_read(host, SBIC_SSR); in acornscsi_readmessagebyte()
1444 void acornscsi_message(AS_Host *host) in acornscsi_message() argument
1450 message[msgidx] = acornscsi_readmessagebyte(host); in acornscsi_message()
1466 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_message()
1469 acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after negate ack"); in acornscsi_message()
1470 sbic_arm_read(host, SBIC_SSR); in acornscsi_message()
1476 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1481 if (host->scsi.phase == PHASE_RECONNECTED) { in acornscsi_message()
1489 host->scsi.reconnected.tag = message[1]; in acornscsi_message()
1490 if (acornscsi_reconnect_finish(host)) in acornscsi_message()
1491 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1498 if (host->scsi.phase != PHASE_STATUSIN) { in acornscsi_message()
1500 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1501 acornscsi_dumplog(host, host->SCpnt->device->id); in acornscsi_message()
1503 host->scsi.phase = PHASE_DONE; in acornscsi_message()
1504 host->scsi.SCp.Message = message[0]; in acornscsi_message()
1514 acornscsi_dma_cleanup(host); in acornscsi_message()
1515 host->SCpnt->SCp = host->scsi.SCp; in acornscsi_message()
1516 host->SCpnt->SCp.sent_command = 0; in acornscsi_message()
1517 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1530 acornscsi_dma_cleanup(host); in acornscsi_message()
1531 host->scsi.SCp = host->SCpnt->SCp; in acornscsi_message()
1532 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1545 acornscsi_dma_cleanup(host); in acornscsi_message()
1546 host->scsi.phase = PHASE_DISCONNECT; in acornscsi_message()
1557 if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) in acornscsi_message()
1558 host->device[host->SCpnt->device->id].sync_state = SYNC_NEGOCIATE; in acornscsi_message()
1564 if (msgqueue_msglength(&host->scsi.msgs)) in acornscsi_message()
1565 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1567 switch (host->scsi.last_message) { in acornscsi_message()
1579 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1580 host->SCpnt->device->simple_tags = 0; in acornscsi_message()
1581 set_bit(host->SCpnt->device->id * 8 + in acornscsi_message()
1582 (u8)(host->SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_message()
1590 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1591 host->device[host->SCpnt->device->id].sync_xfer = SYNCHTRANSFER_2DBA; in acornscsi_message()
1592 host->device[host->SCpnt->device->id].sync_state = SYNC_ASYNCHRONOUS; in acornscsi_message()
1593 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_message()
1608 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1616 if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) { in acornscsi_message()
1623 host->device[host->SCpnt->device->id].sync_state = SYNC_COMPLETED; in acornscsi_message()
1625 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1627 host->device[host->SCpnt->device->id].sync_xfer = in acornscsi_message()
1635 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1638 msgqueue_addmsg(&host->scsi.msgs, 5, EXTENDED_MESSAGE, 3, in acornscsi_message()
1640 host->device[host->SCpnt->device->id].sync_xfer = in acornscsi_message()
1643 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_message()
1656 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1657 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1658 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1665 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1667 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1668 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1669 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1670 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1673 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_message()
1682 void acornscsi_buildmessages(AS_Host *host) in acornscsi_buildmessages() argument
1687 msgqueue_addmsg(&host->scsi.msgs, 1, BUS_DEVICE_RESET); in acornscsi_buildmessages()
1692 msgqueue_addmsg(&host->scsi.msgs, 1, in acornscsi_buildmessages()
1693 IDENTIFY(host->device[host->SCpnt->device->id].disconnect_ok, in acornscsi_buildmessages()
1694 host->SCpnt->device->lun)); in acornscsi_buildmessages()
1699 acornscsi_abortcmd(host->SCpnt->tag); in acornscsi_buildmessages()
1705 if (host->SCpnt->tag) { in acornscsi_buildmessages()
1708 if (host->SCpnt->cmnd[0] == REQUEST_SENSE || in acornscsi_buildmessages()
1709 host->SCpnt->cmnd[0] == TEST_UNIT_READY || in acornscsi_buildmessages()
1710 host->SCpnt->cmnd[0] == INQUIRY) in acornscsi_buildmessages()
1714 msgqueue_addmsg(&host->scsi.msgs, 2, tag_type, host->SCpnt->tag); in acornscsi_buildmessages()
1719 if (host->device[host->SCpnt->device->id].sync_state == SYNC_NEGOCIATE) { in acornscsi_buildmessages()
1720 host->device[host->SCpnt->device->id].sync_state = SYNC_SENT_REQUEST; in acornscsi_buildmessages()
1721 msgqueue_addmsg(&host->scsi.msgs, 5, in acornscsi_buildmessages()
1735 int acornscsi_starttransfer(AS_Host *host) in acornscsi_starttransfer() argument
1739 if (!host->scsi.SCp.ptr /*&& host->scsi.SCp.this_residual*/) { in acornscsi_starttransfer()
1741 host->host->host_no, acornscsi_target(host)); in acornscsi_starttransfer()
1745 residual = scsi_bufflen(host->SCpnt) - host->scsi.SCp.scsi_xferred; in acornscsi_starttransfer()
1747 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_starttransfer()
1748 sbic_arm_writenext(host, residual >> 16); in acornscsi_starttransfer()
1749 sbic_arm_writenext(host, residual >> 8); in acornscsi_starttransfer()
1750 sbic_arm_writenext(host, residual); in acornscsi_starttransfer()
1751 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_starttransfer()
1767 int acornscsi_reconnect(AS_Host *host) in acornscsi_reconnect() argument
1771 target = sbic_arm_read(host, SBIC_SOURCEID); in acornscsi_reconnect()
1776 host->host->host_no); in acornscsi_reconnect()
1780 if (host->SCpnt && !host->scsi.disconnectable) { in acornscsi_reconnect()
1783 host->host->host_no, target, host->SCpnt->device->id); in acornscsi_reconnect()
1784 host->SCpnt = NULL; in acornscsi_reconnect()
1787 lun = sbic_arm_read(host, SBIC_DATA) & 7; in acornscsi_reconnect()
1789 host->scsi.reconnected.target = target; in acornscsi_reconnect()
1790 host->scsi.reconnected.lun = lun; in acornscsi_reconnect()
1791 host->scsi.reconnected.tag = 0; in acornscsi_reconnect()
1793 if (host->scsi.disconnectable && host->SCpnt && in acornscsi_reconnect()
1794 host->SCpnt->device->id == target && host->SCpnt->device->lun == lun) in acornscsi_reconnect()
1797 if (!ok && queue_probetgtlun(&host->queues.disconnected, target, lun)) in acornscsi_reconnect()
1800 ADD_STATUS(target, 0x81, host->scsi.phase, 0); in acornscsi_reconnect()
1803 host->scsi.phase = PHASE_RECONNECTED; in acornscsi_reconnect()
1808 host->host->host_no, '0' + target); in acornscsi_reconnect()
1809 acornscsi_dumplog(host, target); in acornscsi_reconnect()
1810 acornscsi_abortcmd(host, 0); in acornscsi_reconnect()
1811 if (host->SCpnt) { in acornscsi_reconnect()
1812 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_reconnect()
1813 host->SCpnt = NULL; in acornscsi_reconnect()
1816 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_reconnect()
1827 int acornscsi_reconnect_finish(AS_Host *host) in acornscsi_reconnect_finish() argument
1829 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_reconnect_finish()
1830 host->scsi.disconnectable = 0; in acornscsi_reconnect_finish()
1831 if (host->SCpnt->device->id == host->scsi.reconnected.target && in acornscsi_reconnect_finish()
1832 host->SCpnt->device->lun == host->scsi.reconnected.lun && in acornscsi_reconnect_finish()
1833 host->SCpnt->tag == host->scsi.reconnected.tag) { in acornscsi_reconnect_finish()
1835 DBG(host->SCpnt, printk("scsi%d.%c: reconnected", in acornscsi_reconnect_finish()
1836 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1839 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_reconnect_finish()
1841 DBG(host->SCpnt, printk("scsi%d.%c: had to move command " in acornscsi_reconnect_finish()
1843 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1845 host->SCpnt = NULL; in acornscsi_reconnect_finish()
1848 if (!host->SCpnt) { in acornscsi_reconnect_finish()
1849 host->SCpnt = queue_remove_tgtluntag(&host->queues.disconnected, in acornscsi_reconnect_finish()
1850 host->scsi.reconnected.target, in acornscsi_reconnect_finish()
1851 host->scsi.reconnected.lun, in acornscsi_reconnect_finish()
1852 host->scsi.reconnected.tag); in acornscsi_reconnect_finish()
1854 DBG(host->SCpnt, printk("scsi%d.%c: had to get command", in acornscsi_reconnect_finish()
1855 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1859 if (!host->SCpnt) in acornscsi_reconnect_finish()
1860 acornscsi_abortcmd(host, host->scsi.reconnected.tag); in acornscsi_reconnect_finish()
1865 host->scsi.SCp = host->SCpnt->SCp; in acornscsi_reconnect_finish()
1868 host->scsi.SCp.ptr, host->scsi.SCp.this_residual); in acornscsi_reconnect_finish()
1875 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_reconnect_finish()
1877 return host->SCpnt != NULL; in acornscsi_reconnect_finish()
1886 void acornscsi_disconnect_unexpected(AS_Host *host) in acornscsi_disconnect_unexpected() argument
1889 host->host->host_no, acornscsi_target(host)); in acornscsi_disconnect_unexpected()
1891 acornscsi_dumplog(host, 8); in acornscsi_disconnect_unexpected()
1894 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_disconnect_unexpected()
1904 void acornscsi_abortcmd(AS_Host *host, unsigned char tag) in acornscsi_abortcmd() argument
1906 host->scsi.phase = PHASE_ABORTED; in acornscsi_abortcmd()
1907 sbic_arm_write(host, SBIC_CMND, CMND_ASSERTATN); in acornscsi_abortcmd()
1909 msgqueue_flush(&host->scsi.msgs); in acornscsi_abortcmd()
1912 msgqueue_addmsg(&host->scsi.msgs, 2, ABORT_TAG, tag); in acornscsi_abortcmd()
1915 msgqueue_addmsg(&host->scsi.msgs, 1, ABORT); in acornscsi_abortcmd()
1930 intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) in acornscsi_sbicintr() argument
1934 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbicintr()
1938 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_sbicintr()
1941 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_sbicintr()
1944 ADD_STATUS(8, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1946 if (host->SCpnt && !host->scsi.disconnectable) in acornscsi_sbicintr()
1947 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1952 host->host->host_no); in acornscsi_sbicintr()
1954 sbic_arm_write(host, SBIC_OWNID, OWNID_EAF | host->host->this_id); in acornscsi_sbicintr()
1955 sbic_arm_write(host, SBIC_CMND, CMND_RESET); in acornscsi_sbicintr()
1959 sbic_arm_write(host, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); in acornscsi_sbicintr()
1960 sbic_arm_write(host, SBIC_TIMEOUT, TIMEOUT_TIME); in acornscsi_sbicintr()
1961 sbic_arm_write(host, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); in acornscsi_sbicintr()
1962 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_sbicintr()
1963 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1967 acornscsi_disconnect_unexpected(host); in acornscsi_sbicintr()
1971 switch (host->scsi.phase) { in acornscsi_sbicintr()
1976 host->scsi.phase = PHASE_CONNECTED; in acornscsi_sbicintr()
1977 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1978 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_sbicintr()
1980 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbicintr()
1983 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_sbicintr()
1984 ADD_STATUS(8, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1985 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1990 acornscsi_done(host, &host->SCpnt, DID_NO_CONNECT); in acornscsi_sbicintr()
1995 host->origSCpnt = host->SCpnt; in acornscsi_sbicintr()
1996 host->SCpnt = NULL; in acornscsi_sbicintr()
1997 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1998 acornscsi_reconnect(host); in acornscsi_sbicintr()
2003 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2004 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2005 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2015 acornscsi_sendcommand(host); in acornscsi_sbicintr()
2020 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2021 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2027 host->scsi.phase = PHASE_MSGOUT; in acornscsi_sbicintr()
2028 acornscsi_buildmessages(host); in acornscsi_sbicintr()
2029 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2034 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_sbicintr()
2039 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2040 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2041 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2054 acornscsi_sendcommand(host); in acornscsi_sbicintr()
2060 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2061 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2066 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2072 acornscsi_message(host); in acornscsi_sbicintr()
2077 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2078 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2086 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2087 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2088 acornscsi_dma_setup(host, DMA_OUT); in acornscsi_sbicintr()
2089 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2090 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2091 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2096 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2097 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2098 acornscsi_dma_setup(host, DMA_IN); in acornscsi_sbicintr()
2099 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2100 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2101 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2106 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2107 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2112 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2117 acornscsi_message(host); in acornscsi_sbicintr()
2122 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2123 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2129 host->scsi.disconnectable = 1; in acornscsi_sbicintr()
2130 host->scsi.reconnected.tag = 0; in acornscsi_sbicintr()
2131 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2132 host->stats.disconnects += 1; in acornscsi_sbicintr()
2135 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2136 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2142 acornscsi_reconnect(host); in acornscsi_sbicintr()
2145 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2146 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2159 if (ssr != 0x8f && !acornscsi_reconnect_finish(host)) in acornscsi_sbicintr()
2161 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
2166 acornscsi_dma_setup(host, DMA_OUT); in acornscsi_sbicintr()
2167 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2168 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2169 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2175 acornscsi_dma_setup(host, DMA_IN); in acornscsi_sbicintr()
2176 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2177 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2178 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2183 acornscsi_sendcommand(host);/* -> PHASE_COMMAND, PHASE_COMMANDPAUSED */ in acornscsi_sbicintr()
2189 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2190 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2196 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2200 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2205 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2206 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2218 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2225 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2226 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2227 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2228 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2229 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2236 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2237 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2238 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2239 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2246 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2247 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2248 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2249 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2254 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2255 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2267 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2274 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2275 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2276 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2277 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2278 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2279 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2286 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2287 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2288 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2289 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2290 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2297 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2298 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2299 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2300 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2301 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2306 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2307 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2316 acornscsi_message(host); in acornscsi_sbicintr()
2322 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2327 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2328 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2338 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2345 acornscsi_message(host); in acornscsi_sbicintr()
2350 host->host->host_no, acornscsi_target(host)); in acornscsi_sbicintr()
2351 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2352 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_sbicintr()
2357 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2358 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2365 acornscsi_done(host, &host->SCpnt, DID_OK); in acornscsi_sbicintr()
2370 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2375 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2376 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2383 if (host->SCpnt) in acornscsi_sbicintr()
2384 acornscsi_done(host, &host->SCpnt, DID_ABORT); in acornscsi_sbicintr()
2386 clear_bit(host->scsi.reconnected.target * 8 + host->scsi.reconnected.lun, in acornscsi_sbicintr()
2387 host->busyluns); in acornscsi_sbicintr()
2388 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2396 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2401 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2402 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2408 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2409 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2423 AS_Host *host = (AS_Host *)dev_id; in acornscsi_intr() local
2431 iostatus = readb(host->fast + INT_REG); in acornscsi_intr()
2434 acornscsi_dma_intr(host); in acornscsi_intr()
2435 iostatus = readb(host->fast + INT_REG); in acornscsi_intr()
2439 ret = acornscsi_sbicintr(host, in_irq); in acornscsi_intr()
2446 if (host->dma.xfer_required) in acornscsi_intr()
2447 acornscsi_dma_xfer(host); in acornscsi_intr()
2450 ret = acornscsi_kick(host); in acornscsi_intr()
2472 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; in acornscsi_queuecmd_lck() local
2477 host->host->host_no, SCpnt); in acornscsi_queuecmd_lck()
2484 host->host->host_no, '0' + SCpnt->device->id); in acornscsi_queuecmd_lck()
2501 host->stats.queues += 1; in acornscsi_queuecmd_lck()
2506 if (!queue_add_cmd_ordered(&host->queues.issue, SCpnt)) { in acornscsi_queuecmd_lck()
2512 if (host->scsi.phase == PHASE_IDLE) in acornscsi_queuecmd_lck()
2513 acornscsi_kick(host); in acornscsi_queuecmd_lck()
2554 static enum res_abort acornscsi_do_abort(AS_Host *host, struct scsi_cmnd *SCpnt) in acornscsi_do_abort() argument
2558 if (queue_remove_cmd(&host->queues.issue, SCpnt)) { in acornscsi_do_abort()
2569 } else if (queue_remove_cmd(&host->queues.disconnected, SCpnt)) { in acornscsi_do_abort()
2581 } else if (host->SCpnt == SCpnt) { in acornscsi_do_abort()
2589 switch (host->scsi.phase) { in acornscsi_do_abort()
2599 if (host->scsi.disconnectable) { in acornscsi_do_abort()
2600 host->scsi.disconnectable = 0; in acornscsi_do_abort()
2601 host->SCpnt = NULL; in acornscsi_do_abort()
2612 sbic_arm_write(host, SBIC_CMND, CMND_DISCONNECT); in acornscsi_do_abort()
2613 host->SCpnt = NULL; in acornscsi_do_abort()
2618 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_do_abort()
2622 } else if (host->origSCpnt == SCpnt) { in acornscsi_do_abort()
2629 host->origSCpnt = NULL; in acornscsi_do_abort()
2648 AS_Host *host = (AS_Host *) SCpnt->device->host->hostdata; in acornscsi_abort() local
2651 host->stats.aborts += 1; in acornscsi_abort()
2656 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_abort()
2657 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_abort()
2660 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_abort()
2661 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_abort()
2665 printk("scsi%d: ", host->host->host_no); in acornscsi_abort()
2667 switch (acornscsi_do_abort(host, SCpnt)) { in acornscsi_abort()
2678 (u8)(SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_abort()
2710 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_abort()
2729 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; in acornscsi_bus_reset() local
2732 host->stats.resets += 1; in acornscsi_bus_reset()
2738 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_bus_reset()
2739 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_bus_reset()
2742 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_bus_reset()
2743 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_bus_reset()
2747 acornscsi_dma_stop(host); in acornscsi_bus_reset()
2753 acornscsi_resetcard(host); in acornscsi_bus_reset()
2755 while ((SCptr = queue_remove(&host->queues.disconnected)) != NULL) in acornscsi_bus_reset()
2772 char *acornscsi_info(struct Scsi_Host *host) in acornscsi_info() argument
2788 , host->hostt->name, host->io_port, host->irq, in acornscsi_info()
2797 AS_Host *host; in acornscsi_show_info() local
2799 host = (AS_Host *)instance->hostdata; in acornscsi_show_info()
2814 host->base + SBIC_REGIDX, host->scsi.irq); in acornscsi_show_info()
2817 host->base + DMAC_OFFSET, host->scsi.irq); in acornscsi_show_info()
2826 host->stats.queues, host->stats.removes, in acornscsi_show_info()
2827 host->stats.fins, host->stats.reads, in acornscsi_show_info()
2828 host->stats.writes, host->stats.miscs, in acornscsi_show_info()
2829 host->stats.disconnects, host->stats.aborts, in acornscsi_show_info()
2830 host->stats.resets); in acornscsi_show_info()
2836 statptr = host->status_ptr[devidx] - 10; in acornscsi_show_info()
2841 prev = host->status[devidx][statptr].when; in acornscsi_show_info()
2843 for (; statptr != host->status_ptr[devidx]; statptr = (statptr + 1) & (STATUS_BUFFER_SIZE - 1)) { in acornscsi_show_info()
2844 if (host->status[devidx][statptr].when) { in acornscsi_show_info()
2846 host->status[devidx][statptr].irq ? '-' : ' ', in acornscsi_show_info()
2847 host->status[devidx][statptr].ph, in acornscsi_show_info()
2848 host->status[devidx][statptr].ssr, in acornscsi_show_info()
2849 (host->status[devidx][statptr].when - prev) < 100 ? in acornscsi_show_info()
2850 (host->status[devidx][statptr].when - prev) : 99); in acornscsi_show_info()
2851 prev = host->status[devidx][statptr].when; in acornscsi_show_info()
2868 if (host->device[scd->id].sync_xfer & 15) in acornscsi_show_info()
2870 host->device[scd->id].sync_xfer & 15, in acornscsi_show_info()
2871 acornscsi_getperiod(host->device[scd->id].sync_xfer)); in acornscsi_show_info()
2897 struct Scsi_Host *host; in acornscsi_probe() local
2905 host = scsi_host_alloc(&acornscsi_template, sizeof(AS_Host)); in acornscsi_probe()
2906 if (!host) { in acornscsi_probe()
2911 ashost = (AS_Host *)host->hostdata; in acornscsi_probe()
2918 host->irq = ec->irq; in acornscsi_probe()
2919 ashost->host = host; in acornscsi_probe()
2920 ashost->scsi.irq = host->irq; in acornscsi_probe()
2925 ret = request_irq(host->irq, acornscsi_intr, 0, "acornscsi", ashost); in acornscsi_probe()
2928 host->host_no, ashost->scsi.irq, ret); in acornscsi_probe()
2939 ret = scsi_add_host(host, &ec->dev); in acornscsi_probe()
2943 scsi_scan_host(host); in acornscsi_probe()
2947 free_irq(host->irq, ashost); in acornscsi_probe()
2954 scsi_host_put(host); in acornscsi_probe()
2963 struct Scsi_Host *host = ecard_get_drvdata(ec); in acornscsi_remove() local
2964 AS_Host *ashost = (AS_Host *)host->hostdata; in acornscsi_remove()
2967 scsi_remove_host(host); in acornscsi_remove()
2974 free_irq(host->irq, ashost); in acornscsi_remove()
2981 scsi_host_put(host); in acornscsi_remove()