Lines Matching full:host

166 static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp,
168 static int acornscsi_reconnect_finish(AS_Host *host);
169 static void acornscsi_dma_cleanup(AS_Host *host);
170 static void acornscsi_abortcmd(AS_Host *host);
185 static inline void sbic_arm_write(AS_Host *host, unsigned int reg, unsigned int value) in sbic_arm_write() argument
187 writeb(reg, host->base + SBIC_REGIDX); in sbic_arm_write()
188 writeb(value, host->base + SBIC_REGVAL); in sbic_arm_write()
191 static inline int sbic_arm_read(AS_Host *host, unsigned int reg) in sbic_arm_read() argument
194 return readl(host->base + SBIC_REGIDX) & 255; in sbic_arm_read()
195 writeb(reg, host->base + SBIC_REGIDX); in sbic_arm_read()
196 return readl(host->base + SBIC_REGVAL) & 255; in sbic_arm_read()
199 #define sbic_arm_writenext(host, val) writeb((val), (host)->base + SBIC_REGVAL) argument
200 #define sbic_arm_readnext(host) readb((host)->base + SBIC_REGVAL) argument
203 #define dmac_read(host,reg) \ argument
204 readb((host)->base + DMAC_OFFSET + ((reg) << 2))
206 #define dmac_write(host,reg,value) \ argument
207 ({ writeb((value), (host)->base + DMAC_OFFSET + ((reg) << 2)); })
209 #define dmac_clearintr(host) writeb(0, (host)->fast + INT_REG) argument
211 static inline unsigned int dmac_address(AS_Host *host) in dmac_address() argument
213 return dmac_read(host, DMAC_TXADRHI) << 16 | in dmac_address()
214 dmac_read(host, DMAC_TXADRMD) << 8 | in dmac_address()
215 dmac_read(host, DMAC_TXADRLO); in dmac_address()
219 void acornscsi_dumpdma(AS_Host *host, char *where) in acornscsi_dumpdma() argument
223 mode = dmac_read(host, DMAC_MODECON); in acornscsi_dumpdma()
224 addr = dmac_address(host); in acornscsi_dumpdma()
225 len = dmac_read(host, DMAC_TXCNTHI) << 8 | in acornscsi_dumpdma()
226 dmac_read(host, DMAC_TXCNTLO); in acornscsi_dumpdma()
229 host->host->host_no, where, in acornscsi_dumpdma()
231 dmac_read(host, DMAC_MASKREG)); in acornscsi_dumpdma()
233 printk("DMA @%06x, ", host->dma.start_addr); in acornscsi_dumpdma()
234 printk("BH @%p +%04x, ", host->scsi.SCp.ptr, in acornscsi_dumpdma()
235 host->scsi.SCp.this_residual); in acornscsi_dumpdma()
236 printk("DT @+%04x ST @+%04x", host->dma.transferred, in acornscsi_dumpdma()
237 host->scsi.SCp.scsi_xferred); in acornscsi_dumpdma()
243 unsigned long acornscsi_sbic_xfcount(AS_Host *host) in acornscsi_sbic_xfcount() argument
247 length = sbic_arm_read(host, SBIC_TRANSCNTH) << 16; in acornscsi_sbic_xfcount()
248 length |= sbic_arm_readnext(host) << 8; in acornscsi_sbic_xfcount()
249 length |= sbic_arm_readnext(host); in acornscsi_sbic_xfcount()
255 acornscsi_sbic_wait(AS_Host *host, int stat_mask, int stat, int timeout, char *msg) in acornscsi_sbic_wait() argument
260 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbic_wait()
268 printk("scsi%d: timeout while %s\n", host->host->host_no, msg); in acornscsi_sbic_wait()
274 int acornscsi_sbic_issuecmd(AS_Host *host, int command) in acornscsi_sbic_issuecmd() argument
276 if (acornscsi_sbic_wait(host, ASR_CIP, 0, 1000, "issuing command")) in acornscsi_sbic_issuecmd()
279 sbic_arm_write(host, SBIC_CMND, command); in acornscsi_sbic_issuecmd()
300 void acornscsi_resetcard(AS_Host *host) in acornscsi_resetcard() argument
305 host->card.page_reg = 0x80; in acornscsi_resetcard()
306 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_resetcard()
311 host->card.page_reg = 0; in acornscsi_resetcard()
312 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_resetcard()
319 if (readb(host->fast + INT_REG) & 8) in acornscsi_resetcard()
326 host->host->host_no); in acornscsi_resetcard()
328 sbic_arm_read(host, SBIC_ASR); in acornscsi_resetcard()
329 sbic_arm_read(host, SBIC_SSR); in acornscsi_resetcard()
332 sbic_arm_write(host, SBIC_OWNID, OWNID_EAF | host->host->this_id); in acornscsi_resetcard()
333 sbic_arm_write(host, SBIC_CMND, CMND_RESET); in acornscsi_resetcard()
340 if (readb(host->fast + INT_REG) & 8) in acornscsi_resetcard()
347 host->host->host_no); in acornscsi_resetcard()
349 sbic_arm_read(host, SBIC_ASR); in acornscsi_resetcard()
350 if (sbic_arm_read(host, SBIC_SSR) != 0x01) in acornscsi_resetcard()
352 host->host->host_no); in acornscsi_resetcard()
354 sbic_arm_write(host, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); in acornscsi_resetcard()
355 sbic_arm_write(host, SBIC_TIMEOUT, TIMEOUT_TIME); in acornscsi_resetcard()
356 sbic_arm_write(host, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); in acornscsi_resetcard()
357 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_resetcard()
359 host->card.page_reg = 0x40; in acornscsi_resetcard()
360 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_resetcard()
363 dmac_write(host, DMAC_INIT, 0); in acornscsi_resetcard()
365 dmac_write(host, DMAC_INIT, INIT_8BIT); in acornscsi_resetcard()
366 dmac_write(host, DMAC_CHANNEL, CHANNEL_0); in acornscsi_resetcard()
367 dmac_write(host, DMAC_DEVCON0, INIT_DEVCON0); in acornscsi_resetcard()
368 dmac_write(host, DMAC_DEVCON1, INIT_DEVCON1); in acornscsi_resetcard()
371 host->SCpnt = NULL; in acornscsi_resetcard()
372 host->scsi.phase = PHASE_IDLE; in acornscsi_resetcard()
373 host->scsi.disconnectable = 0; in acornscsi_resetcard()
375 memset(host->busyluns, 0, sizeof(host->busyluns)); in acornscsi_resetcard()
378 host->device[i].sync_state = SYNC_NEGOCIATE; in acornscsi_resetcard()
379 host->device[i].disconnect_ok = 1; in acornscsi_resetcard()
485 acornscsi_dumplogline(AS_Host *host, int target, int line) in acornscsi_dumplogline() argument
490 ptr = host->status_ptr[target] - STATUS_BUFFER_TO_PRINT; in acornscsi_dumplogline()
497 prev = host->status[target][ptr].when; in acornscsi_dumplogline()
499 for (; ptr != host->status_ptr[target]; ptr = (ptr + 1) & (STATUS_BUFFER_SIZE - 1)) { in acornscsi_dumplogline()
502 if (!host->status[target][ptr].when) in acornscsi_dumplogline()
507 printk("%c%02X", host->status[target][ptr].irq ? '-' : ' ', in acornscsi_dumplogline()
508 host->status[target][ptr].ph); in acornscsi_dumplogline()
512 printk(" %02X", host->status[target][ptr].ssr); in acornscsi_dumplogline()
516 time_diff = host->status[target][ptr].when - prev; in acornscsi_dumplogline()
517 prev = host->status[target][ptr].when; in acornscsi_dumplogline()
532 void acornscsi_dumplog(AS_Host *host, int target) in acornscsi_dumplog() argument
535 acornscsi_dumplogline(host, target, 0); in acornscsi_dumplog()
536 acornscsi_dumplogline(host, target, 1); in acornscsi_dumplog()
537 acornscsi_dumplogline(host, target, 2); in acornscsi_dumplog()
547 char acornscsi_target(AS_Host *host) in acornscsi_target() argument
549 if (host->SCpnt) in acornscsi_target()
550 return '0' + host->SCpnt->device->id; in acornscsi_target()
678 * Function: acornscsi_kick(AS_Host *host)
680 * Params : host - host to send command to
685 intr_ret_t acornscsi_kick(AS_Host *host) in acornscsi_kick() argument
691 SCpnt = host->origSCpnt; in acornscsi_kick()
692 host->origSCpnt = NULL; in acornscsi_kick()
696 SCpnt = queue_remove_exclude(&host->queues.issue, host->busyluns); in acornscsi_kick()
703 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_kick()
704 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_kick()
705 host->scsi.disconnectable = 0; in acornscsi_kick()
707 DBG(host->SCpnt, printk("scsi%d.%c: moved command to disconnected queue\n", in acornscsi_kick()
708 host->host->host_no, acornscsi_target(host))); in acornscsi_kick()
710 host->SCpnt = NULL; in acornscsi_kick()
717 if (!(sbic_arm_read(host, SBIC_ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) { in acornscsi_kick()
718 sbic_arm_write(host, SBIC_DESTID, SCpnt->device->id); in acornscsi_kick()
719 sbic_arm_write(host, SBIC_CMND, CMND_SELWITHATN); in acornscsi_kick()
723 * claim host busy - all of these must happen atomically wrt in acornscsi_kick()
726 host->scsi.phase = PHASE_CONNECTING; in acornscsi_kick()
727 host->SCpnt = SCpnt; in acornscsi_kick()
728 host->scsi.SCp = SCpnt->SCp; in acornscsi_kick()
729 host->dma.xfer_setup = 0; in acornscsi_kick()
730 host->dma.xfer_required = 0; in acornscsi_kick()
731 host->dma.xfer_done = 0; in acornscsi_kick()
735 host->host->host_no, '0' + SCpnt->device->id, in acornscsi_kick()
741 (u8)(SCpnt->device->lun & 0x07), host->busyluns); in acornscsi_kick()
743 host->stats.removes += 1; in acornscsi_kick()
747 host->stats.writes += 1; in acornscsi_kick()
750 host->stats.reads += 1; in acornscsi_kick()
753 host->stats.miscs += 1; in acornscsi_kick()
762 * Function: void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, unsigned int result)
764 * Params : host - interface that completed
767 static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, in acornscsi_done() argument
773 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_done()
775 host->stats.fins += 1; in acornscsi_done()
780 acornscsi_dma_cleanup(host); in acornscsi_done()
784 scsi_msg_to_host_byte(SCpnt, host->scsi.SCp.Message); in acornscsi_done()
785 set_status_byte(SCpnt, host->scsi.SCp.Status); in acornscsi_done()
799 if (host->scsi.SCp.ptr && in acornscsi_done()
803 if (host->scsi.SCp.scsi_xferred < SCpnt->underflow || in acornscsi_done()
804 host->scsi.SCp.scsi_xferred != host->dma.transferred) in acornscsi_done()
820 if (host->dma.xfer_done) in acornscsi_done()
837 acornscsi_dumpdma(host, "done"); in acornscsi_done()
838 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_done()
845 panic("scsi%d.H: null scsi_done function in acornscsi_done", host->host->host_no); in acornscsi_done()
848 (u8)(SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_done()
852 printk("scsi%d: null command in acornscsi_done", host->host->host_no); in acornscsi_done()
854 host->scsi.phase = PHASE_IDLE; in acornscsi_done()
865 void acornscsi_data_updateptr(AS_Host *host, struct scsi_pointer *SCp, unsigned int length) in acornscsi_data_updateptr() argument
871 host->dma.xfer_done = 1; in acornscsi_data_updateptr()
875 * Prototype: void acornscsi_data_read(AS_Host *host, char *ptr,
878 * Params : host - host to transfer from
880 * start_addr - host mem address
885 void acornscsi_data_read(AS_Host *host, char *ptr, in acornscsi_data_read() argument
894 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
904 __acornscsi_in(host->base + (offset << 1), ptr, this_len); in acornscsi_data_read()
913 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
916 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
920 * Prototype: void acornscsi_data_write(AS_Host *host, char *ptr,
923 * Params : host - host to transfer from
925 * start_addr - host mem address
930 void acornscsi_data_write(AS_Host *host, char *ptr, in acornscsi_data_write() argument
939 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
949 __acornscsi_out(host->base + (offset << 1), ptr, this_len); in acornscsi_data_write()
958 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
961 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
969 * Prototype: void acornscsi_dmastop(AS_Host *host)
971 * Params : host - host on which to stop DMA
976 void acornscsi_dma_stop(AS_Host *host) in acornscsi_dma_stop() argument
978 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_stop()
979 dmac_clearintr(host); in acornscsi_dma_stop()
982 DBG(host->SCpnt, acornscsi_dumpdma(host, "stop")); in acornscsi_dma_stop()
987 * Function: void acornscsi_dma_setup(AS_Host *host, dmadir_t direction)
989 * Params : host - host to setup
995 void acornscsi_dma_setup(AS_Host *host, dmadir_t direction) in acornscsi_dma_setup() argument
999 host->dma.direction = direction; in acornscsi_dma_setup()
1001 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_setup()
1005 if (NO_WRITE & (1 << host->SCpnt->device->id)) { in acornscsi_dma_setup()
1007 host->host->host_no, acornscsi_target(host)); in acornscsi_dma_setup()
1018 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_setup()
1020 host->dma.start_addr = address = host->dma.free_addr; in acornscsi_dma_setup()
1021 host->dma.free_addr = (host->dma.free_addr + length) & in acornscsi_dma_setup()
1028 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_setup()
1032 dmac_write(host, DMAC_TXCNTLO, length); in acornscsi_dma_setup()
1033 dmac_write(host, DMAC_TXCNTHI, length >> 8); in acornscsi_dma_setup()
1034 dmac_write(host, DMAC_TXADRLO, address); in acornscsi_dma_setup()
1035 dmac_write(host, DMAC_TXADRMD, address >> 8); in acornscsi_dma_setup()
1036 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_setup()
1037 dmac_write(host, DMAC_MODECON, mode); in acornscsi_dma_setup()
1038 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_setup()
1041 DBG(host->SCpnt, acornscsi_dumpdma(host, "strt")); in acornscsi_dma_setup()
1043 host->dma.xfer_setup = 1; in acornscsi_dma_setup()
1048 * Function: void acornscsi_dma_cleanup(AS_Host *host)
1049 * Purpose : ensure that all DMA transfers are up-to-date & host->scsi.SCp is correct
1050 * Params : host - host to finish
1056 void acornscsi_dma_cleanup(AS_Host *host) in acornscsi_dma_cleanup() argument
1058 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_cleanup()
1059 dmac_clearintr(host); in acornscsi_dma_cleanup()
1064 if (host->dma.xfer_required) { in acornscsi_dma_cleanup()
1065 host->dma.xfer_required = 0; in acornscsi_dma_cleanup()
1066 if (host->dma.direction == DMA_IN) in acornscsi_dma_cleanup()
1067 acornscsi_data_read(host, host->dma.xfer_ptr, in acornscsi_dma_cleanup()
1068 host->dma.xfer_start, host->dma.xfer_length); in acornscsi_dma_cleanup()
1074 if (host->dma.xfer_setup) { in acornscsi_dma_cleanup()
1077 host->dma.xfer_setup = 0; in acornscsi_dma_cleanup()
1080 DBG(host->SCpnt, acornscsi_dumpdma(host, "cupi")); in acornscsi_dma_cleanup()
1086 transferred = dmac_address(host) - host->dma.start_addr; in acornscsi_dma_cleanup()
1087 host->dma.transferred += transferred; in acornscsi_dma_cleanup()
1089 if (host->dma.direction == DMA_IN) in acornscsi_dma_cleanup()
1090 acornscsi_data_read(host, host->scsi.SCp.ptr, in acornscsi_dma_cleanup()
1091 host->dma.start_addr, transferred); in acornscsi_dma_cleanup()
1096 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_cleanup()
1098 DBG(host->SCpnt, acornscsi_dumpdma(host, "cupo")); in acornscsi_dma_cleanup()
1104 * Function: void acornscsi_dmacintr(AS_Host *host)
1106 * Params : host - host to process
1114 void acornscsi_dma_intr(AS_Host *host) in acornscsi_dma_intr() argument
1119 DBG(host->SCpnt, acornscsi_dumpdma(host, "inti")); in acornscsi_dma_intr()
1122 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_intr()
1123 dmac_clearintr(host); in acornscsi_dma_intr()
1128 transferred = dmac_address(host) - host->dma.start_addr; in acornscsi_dma_intr()
1129 host->dma.transferred += transferred; in acornscsi_dma_intr()
1134 if (host->dma.direction == DMA_IN) { in acornscsi_dma_intr()
1135 host->dma.xfer_start = host->dma.start_addr; in acornscsi_dma_intr()
1136 host->dma.xfer_length = transferred; in acornscsi_dma_intr()
1137 host->dma.xfer_ptr = host->scsi.SCp.ptr; in acornscsi_dma_intr()
1138 host->dma.xfer_required = 1; in acornscsi_dma_intr()
1141 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_intr()
1146 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_intr()
1148 host->dma.start_addr = address = host->dma.free_addr; in acornscsi_dma_intr()
1149 host->dma.free_addr = (host->dma.free_addr + length) & in acornscsi_dma_intr()
1155 if (host->dma.direction == DMA_OUT) in acornscsi_dma_intr()
1156 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_intr()
1160 dmac_write(host, DMAC_TXCNTLO, length); in acornscsi_dma_intr()
1161 dmac_write(host, DMAC_TXCNTHI, length >> 8); in acornscsi_dma_intr()
1162 dmac_write(host, DMAC_TXADRLO, address); in acornscsi_dma_intr()
1163 dmac_write(host, DMAC_TXADRMD, address >> 8); in acornscsi_dma_intr()
1164 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_intr()
1165 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_intr()
1168 DBG(host->SCpnt, acornscsi_dumpdma(host, "into")); in acornscsi_dma_intr()
1171 host->dma.xfer_setup = 0; in acornscsi_dma_intr()
1179 if (dmac_read(host, DMAC_STATUS) & STATUS_RQ0) { in acornscsi_dma_intr()
1180 acornscsi_abortcmd(host); in acornscsi_dma_intr()
1182 dmac_write(host, DMAC_TXCNTLO, 0); in acornscsi_dma_intr()
1183 dmac_write(host, DMAC_TXCNTHI, 0); in acornscsi_dma_intr()
1184 dmac_write(host, DMAC_TXADRLO, 0); in acornscsi_dma_intr()
1185 dmac_write(host, DMAC_TXADRMD, 0); in acornscsi_dma_intr()
1186 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_intr()
1187 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_intr()
1194 * Function: void acornscsi_dma_xfer(AS_Host *host)
1196 * Params : host - host to process
1199 void acornscsi_dma_xfer(AS_Host *host) in acornscsi_dma_xfer() argument
1201 host->dma.xfer_required = 0; in acornscsi_dma_xfer()
1203 if (host->dma.direction == DMA_IN) in acornscsi_dma_xfer()
1204 acornscsi_data_read(host, host->dma.xfer_ptr, in acornscsi_dma_xfer()
1205 host->dma.xfer_start, host->dma.xfer_length); in acornscsi_dma_xfer()
1209 * Function: void acornscsi_dma_adjust(AS_Host *host)
1212 * Params : host - host to adjust DMA count for
1215 void acornscsi_dma_adjust(AS_Host *host) in acornscsi_dma_adjust() argument
1217 if (host->dma.xfer_setup) { in acornscsi_dma_adjust()
1220 DBG(host->SCpnt, acornscsi_dumpdma(host, "adji")); in acornscsi_dma_adjust()
1225 * host->scsi.SCp.scsi_xferred is the number of bytes in acornscsi_dma_adjust()
1227 * host->dma.transferred is the number of bytes transferred in acornscsi_dma_adjust()
1228 * over DMA since host->dma.start_addr was last set. in acornscsi_dma_adjust()
1230 * real_dma_addr = host->dma.start_addr + host->scsi.SCp.scsi_xferred in acornscsi_dma_adjust()
1231 * - host->dma.transferred in acornscsi_dma_adjust()
1233 transferred = host->scsi.SCp.scsi_xferred - host->dma.transferred; in acornscsi_dma_adjust()
1236 host->host->host_no, acornscsi_target(host), transferred); in acornscsi_dma_adjust()
1238 host->dma.xfer_setup = 0; in acornscsi_dma_adjust()
1240 transferred += host->dma.start_addr; in acornscsi_dma_adjust()
1241 dmac_write(host, DMAC_TXADRLO, transferred); in acornscsi_dma_adjust()
1242 dmac_write(host, DMAC_TXADRMD, transferred >> 8); in acornscsi_dma_adjust()
1243 dmac_write(host, DMAC_TXADRHI, transferred >> 16); in acornscsi_dma_adjust()
1245 DBG(host->SCpnt, acornscsi_dumpdma(host, "adjo")); in acornscsi_dma_adjust()
1256 acornscsi_write_pio(AS_Host *host, char *bytes, int *ptr, int len, unsigned int max_timeout) in acornscsi_write_pio() argument
1262 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_write_pio()
1267 sbic_arm_write(host, SBIC_DATA, bytes[my_ptr++]); in acornscsi_write_pio()
1281 * Function: void acornscsi_sendcommand(AS_Host *host)
1283 * Params : host - host which is connected to target
1286 acornscsi_sendcommand(AS_Host *host) in acornscsi_sendcommand() argument
1288 struct scsi_cmnd *SCpnt = host->SCpnt; in acornscsi_sendcommand()
1290 sbic_arm_write(host, SBIC_TRANSCNTH, 0); in acornscsi_sendcommand()
1291 sbic_arm_writenext(host, 0); in acornscsi_sendcommand()
1292 sbic_arm_writenext(host, SCpnt->cmd_len - host->scsi.SCp.sent_command); in acornscsi_sendcommand()
1294 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_sendcommand()
1296 if (acornscsi_write_pio(host, SCpnt->cmnd, in acornscsi_sendcommand()
1297 (int *)&host->scsi.SCp.sent_command, SCpnt->cmd_len, 1000000)) in acornscsi_sendcommand()
1298 printk("scsi%d: timeout while sending command\n", host->host->host_no); in acornscsi_sendcommand()
1300 host->scsi.phase = PHASE_COMMAND; in acornscsi_sendcommand()
1304 void acornscsi_sendmessage(AS_Host *host) in acornscsi_sendmessage() argument
1306 unsigned int message_length = msgqueue_msglength(&host->scsi.msgs); in acornscsi_sendmessage()
1312 host->host->host_no, acornscsi_target(host)); in acornscsi_sendmessage()
1317 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_sendmessage()
1319 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 1"); in acornscsi_sendmessage()
1321 sbic_arm_write(host, SBIC_DATA, NOP); in acornscsi_sendmessage()
1323 host->scsi.last_message = NOP; in acornscsi_sendmessage()
1330 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_sendmessage()
1331 msg = msgqueue_getmsg(&host->scsi.msgs, 0); in acornscsi_sendmessage()
1333 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 2"); in acornscsi_sendmessage()
1335 sbic_arm_write(host, SBIC_DATA, msg->msg[0]); in acornscsi_sendmessage()
1337 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1352 sbic_arm_write(host, SBIC_TRANSCNTH, 0); in acornscsi_sendmessage()
1353 sbic_arm_writenext(host, 0); in acornscsi_sendmessage()
1354 sbic_arm_writenext(host, message_length); in acornscsi_sendmessage()
1355 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_sendmessage()
1358 while ((msg = msgqueue_getmsg(&host->scsi.msgs, msgnr++)) != NULL) { in acornscsi_sendmessage()
1364 if (acornscsi_write_pio(host, msg->msg, &i, msg->length, 1000000)) in acornscsi_sendmessage()
1365 printk("scsi%d: timeout while sending message\n", host->host->host_no); in acornscsi_sendmessage()
1367 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1369 host->scsi.last_message |= msg->msg[2] << 8; in acornscsi_sendmessage()
1382 * Function: void acornscsi_readstatusbyte(AS_Host *host)
1384 * Params : host - host connected to target
1387 void acornscsi_readstatusbyte(AS_Host *host) in acornscsi_readstatusbyte() argument
1389 acornscsi_sbic_issuecmd(host, CMND_XFERINFO|CMND_SBT); in acornscsi_readstatusbyte()
1390 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "reading status byte"); in acornscsi_readstatusbyte()
1391 host->scsi.SCp.Status = sbic_arm_read(host, SBIC_DATA); in acornscsi_readstatusbyte()
1395 * Function: unsigned char acornscsi_readmessagebyte(AS_Host *host)
1397 * Params : host - host connected to target
1400 unsigned char acornscsi_readmessagebyte(AS_Host *host) in acornscsi_readmessagebyte() argument
1404 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_readmessagebyte()
1406 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "for message byte"); in acornscsi_readmessagebyte()
1408 message = sbic_arm_read(host, SBIC_DATA); in acornscsi_readmessagebyte()
1411 acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after message byte"); in acornscsi_readmessagebyte()
1413 sbic_arm_read(host, SBIC_SSR); in acornscsi_readmessagebyte()
1419 * Function: void acornscsi_message(AS_Host *host)
1421 * Params : host - host connected to target
1424 void acornscsi_message(AS_Host *host) in acornscsi_message() argument
1430 message[msgidx] = acornscsi_readmessagebyte(host); in acornscsi_message()
1446 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_message()
1449 acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after negate ack"); in acornscsi_message()
1450 sbic_arm_read(host, SBIC_SSR); in acornscsi_message()
1456 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1461 if (host->scsi.phase == PHASE_RECONNECTED) { in acornscsi_message()
1469 host->scsi.reconnected.tag = message[1]; in acornscsi_message()
1470 if (acornscsi_reconnect_finish(host)) in acornscsi_message()
1471 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1478 if (host->scsi.phase != PHASE_STATUSIN) { in acornscsi_message()
1480 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1481 acornscsi_dumplog(host, host->SCpnt->device->id); in acornscsi_message()
1483 host->scsi.phase = PHASE_DONE; in acornscsi_message()
1484 host->scsi.SCp.Message = message[0]; in acornscsi_message()
1494 acornscsi_dma_cleanup(host); in acornscsi_message()
1495 host->SCpnt->SCp = host->scsi.SCp; in acornscsi_message()
1496 host->SCpnt->SCp.sent_command = 0; in acornscsi_message()
1497 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1510 acornscsi_dma_cleanup(host); in acornscsi_message()
1511 host->scsi.SCp = host->SCpnt->SCp; in acornscsi_message()
1512 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1525 acornscsi_dma_cleanup(host); in acornscsi_message()
1526 host->scsi.phase = PHASE_DISCONNECT; in acornscsi_message()
1537 if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) in acornscsi_message()
1538 host->device[host->SCpnt->device->id].sync_state = SYNC_NEGOCIATE; in acornscsi_message()
1544 if (msgqueue_msglength(&host->scsi.msgs)) in acornscsi_message()
1545 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1547 switch (host->scsi.last_message) { in acornscsi_message()
1553 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1554 host->device[host->SCpnt->device->id].sync_xfer = SYNCHTRANSFER_2DBA; in acornscsi_message()
1555 host->device[host->SCpnt->device->id].sync_state = SYNC_ASYNCHRONOUS; in acornscsi_message()
1556 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_message()
1567 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1575 if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) { in acornscsi_message()
1582 host->device[host->SCpnt->device->id].sync_state = SYNC_COMPLETED; in acornscsi_message()
1584 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1586 host->device[host->SCpnt->device->id].sync_xfer = in acornscsi_message()
1594 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1597 msgqueue_addmsg(&host->scsi.msgs, 5, EXTENDED_MESSAGE, 3, in acornscsi_message()
1599 host->device[host->SCpnt->device->id].sync_xfer = in acornscsi_message()
1602 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_message()
1615 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1616 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1617 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1624 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1626 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1627 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1628 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1629 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1632 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_message()
1636 * Function: int acornscsi_buildmessages(AS_Host *host)
1637 * Purpose : build the connection messages for a host
1638 * Params : host - host to add messages to
1641 void acornscsi_buildmessages(AS_Host *host) in acornscsi_buildmessages() argument
1646 msgqueue_addmsg(&host->scsi.msgs, 1, BUS_DEVICE_RESET); in acornscsi_buildmessages()
1651 msgqueue_addmsg(&host->scsi.msgs, 1, in acornscsi_buildmessages()
1652 IDENTIFY(host->device[host->SCpnt->device->id].disconnect_ok, in acornscsi_buildmessages()
1653 host->SCpnt->device->lun)); in acornscsi_buildmessages()
1658 acornscsi_abortcmd(host); in acornscsi_buildmessages()
1665 if (host->device[host->SCpnt->device->id].sync_state == SYNC_NEGOCIATE) { in acornscsi_buildmessages()
1666 host->device[host->SCpnt->device->id].sync_state = SYNC_SENT_REQUEST; in acornscsi_buildmessages()
1667 msgqueue_addmsg(&host->scsi.msgs, 5, in acornscsi_buildmessages()
1675 * Function: int acornscsi_starttransfer(AS_Host *host)
1677 * Params : host - host to which target is connected
1681 int acornscsi_starttransfer(AS_Host *host) in acornscsi_starttransfer() argument
1685 if (!host->scsi.SCp.ptr /*&& host->scsi.SCp.this_residual*/) { in acornscsi_starttransfer()
1687 host->host->host_no, acornscsi_target(host)); in acornscsi_starttransfer()
1691 residual = scsi_bufflen(host->SCpnt) - host->scsi.SCp.scsi_xferred; in acornscsi_starttransfer()
1693 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_starttransfer()
1694 sbic_arm_writenext(host, residual >> 16); in acornscsi_starttransfer()
1695 sbic_arm_writenext(host, residual >> 8); in acornscsi_starttransfer()
1696 sbic_arm_writenext(host, residual); in acornscsi_starttransfer()
1697 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_starttransfer()
1705 * Function : acornscsi_reconnect(AS_Host *host)
1707 * Params : host - host specific data
1713 int acornscsi_reconnect(AS_Host *host) in acornscsi_reconnect() argument
1717 target = sbic_arm_read(host, SBIC_SOURCEID); in acornscsi_reconnect()
1722 host->host->host_no); in acornscsi_reconnect()
1726 if (host->SCpnt && !host->scsi.disconnectable) { in acornscsi_reconnect()
1729 host->host->host_no, target, host->SCpnt->device->id); in acornscsi_reconnect()
1730 host->SCpnt = NULL; in acornscsi_reconnect()
1733 lun = sbic_arm_read(host, SBIC_DATA) & 7; in acornscsi_reconnect()
1735 host->scsi.reconnected.target = target; in acornscsi_reconnect()
1736 host->scsi.reconnected.lun = lun; in acornscsi_reconnect()
1737 host->scsi.reconnected.tag = 0; in acornscsi_reconnect()
1739 if (host->scsi.disconnectable && host->SCpnt && in acornscsi_reconnect()
1740 host->SCpnt->device->id == target && host->SCpnt->device->lun == lun) in acornscsi_reconnect()
1743 if (!ok && queue_probetgtlun(&host->queues.disconnected, target, lun)) in acornscsi_reconnect()
1746 ADD_STATUS(target, 0x81, host->scsi.phase, 0); in acornscsi_reconnect()
1749 host->scsi.phase = PHASE_RECONNECTED; in acornscsi_reconnect()
1754 host->host->host_no, '0' + target); in acornscsi_reconnect()
1755 acornscsi_dumplog(host, target); in acornscsi_reconnect()
1756 acornscsi_abortcmd(host); in acornscsi_reconnect()
1757 if (host->SCpnt) { in acornscsi_reconnect()
1758 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_reconnect()
1759 host->SCpnt = NULL; in acornscsi_reconnect()
1762 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_reconnect()
1767 * Function: int acornscsi_reconnect_finish(AS_Host *host)
1769 * Params : host - host to complete
1773 int acornscsi_reconnect_finish(AS_Host *host) in acornscsi_reconnect_finish() argument
1775 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_reconnect_finish()
1776 host->scsi.disconnectable = 0; in acornscsi_reconnect_finish()
1777 if (host->SCpnt->device->id == host->scsi.reconnected.target && in acornscsi_reconnect_finish()
1778 host->SCpnt->device->lun == host->scsi.reconnected.lun && in acornscsi_reconnect_finish()
1779 scsi_cmd_to_rq(host->SCpnt)->tag == host->scsi.reconnected.tag) { in acornscsi_reconnect_finish()
1781 DBG(host->SCpnt, printk("scsi%d.%c: reconnected", in acornscsi_reconnect_finish()
1782 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1785 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_reconnect_finish()
1787 DBG(host->SCpnt, printk("scsi%d.%c: had to move command " in acornscsi_reconnect_finish()
1789 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1791 host->SCpnt = NULL; in acornscsi_reconnect_finish()
1794 if (!host->SCpnt) { in acornscsi_reconnect_finish()
1795 host->SCpnt = queue_remove_tgtluntag(&host->queues.disconnected, in acornscsi_reconnect_finish()
1796 host->scsi.reconnected.target, in acornscsi_reconnect_finish()
1797 host->scsi.reconnected.lun, in acornscsi_reconnect_finish()
1798 host->scsi.reconnected.tag); in acornscsi_reconnect_finish()
1800 DBG(host->SCpnt, printk("scsi%d.%c: had to get command", in acornscsi_reconnect_finish()
1801 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1805 if (!host->SCpnt) in acornscsi_reconnect_finish()
1806 acornscsi_abortcmd(host); in acornscsi_reconnect_finish()
1811 host->scsi.SCp = host->SCpnt->SCp; in acornscsi_reconnect_finish()
1814 host->scsi.SCp.ptr, host->scsi.SCp.this_residual); in acornscsi_reconnect_finish()
1821 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_reconnect_finish()
1823 return host->SCpnt != NULL; in acornscsi_reconnect_finish()
1827 * Function: void acornscsi_disconnect_unexpected(AS_Host *host)
1829 * Params : host - host on which disconnect occurred
1832 void acornscsi_disconnect_unexpected(AS_Host *host) in acornscsi_disconnect_unexpected() argument
1835 host->host->host_no, acornscsi_target(host)); in acornscsi_disconnect_unexpected()
1837 acornscsi_dumplog(host, 8); in acornscsi_disconnect_unexpected()
1840 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_disconnect_unexpected()
1844 * Function: void acornscsi_abortcmd(AS_host *host, unsigned char tag)
1846 * Params : host - host with connected command to abort
1849 void acornscsi_abortcmd(AS_Host *host) in acornscsi_abortcmd() argument
1851 host->scsi.phase = PHASE_ABORTED; in acornscsi_abortcmd()
1852 sbic_arm_write(host, SBIC_CMND, CMND_ASSERTATN); in acornscsi_abortcmd()
1854 msgqueue_flush(&host->scsi.msgs); in acornscsi_abortcmd()
1855 msgqueue_addmsg(&host->scsi.msgs, 1, ABORT); in acornscsi_abortcmd()
1862 * Function: int acornscsi_sbicintr(AS_Host *host)
1864 * Params : host - host to process
1870 intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) in acornscsi_sbicintr() argument
1874 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbicintr()
1878 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_sbicintr()
1881 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_sbicintr()
1884 ADD_STATUS(8, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1886 if (host->SCpnt && !host->scsi.disconnectable) in acornscsi_sbicintr()
1887 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1892 host->host->host_no); in acornscsi_sbicintr()
1894 sbic_arm_write(host, SBIC_OWNID, OWNID_EAF | host->host->this_id); in acornscsi_sbicintr()
1895 sbic_arm_write(host, SBIC_CMND, CMND_RESET); in acornscsi_sbicintr()
1899 sbic_arm_write(host, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); in acornscsi_sbicintr()
1900 sbic_arm_write(host, SBIC_TIMEOUT, TIMEOUT_TIME); in acornscsi_sbicintr()
1901 sbic_arm_write(host, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); in acornscsi_sbicintr()
1902 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_sbicintr()
1903 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1907 acornscsi_disconnect_unexpected(host); in acornscsi_sbicintr()
1911 switch (host->scsi.phase) { in acornscsi_sbicintr()
1916 host->scsi.phase = PHASE_CONNECTED; in acornscsi_sbicintr()
1917 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1918 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_sbicintr()
1920 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbicintr()
1923 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_sbicintr()
1924 ADD_STATUS(8, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1925 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1930 acornscsi_done(host, &host->SCpnt, DID_NO_CONNECT); in acornscsi_sbicintr()
1935 host->origSCpnt = host->SCpnt; in acornscsi_sbicintr()
1936 host->SCpnt = NULL; in acornscsi_sbicintr()
1937 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1938 acornscsi_reconnect(host); in acornscsi_sbicintr()
1943 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
1944 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
1945 acornscsi_abortcmd(host); in acornscsi_sbicintr()
1955 acornscsi_sendcommand(host); in acornscsi_sbicintr()
1960 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
1961 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
1967 host->scsi.phase = PHASE_MSGOUT; in acornscsi_sbicintr()
1968 acornscsi_buildmessages(host); in acornscsi_sbicintr()
1969 acornscsi_sendmessage(host); in acornscsi_sbicintr()
1974 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_sbicintr()
1979 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
1980 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
1981 acornscsi_abortcmd(host); in acornscsi_sbicintr()
1994 acornscsi_sendcommand(host); in acornscsi_sbicintr()
2000 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2001 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2006 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2012 acornscsi_message(host); in acornscsi_sbicintr()
2017 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2018 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2026 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2027 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2028 acornscsi_dma_setup(host, DMA_OUT); in acornscsi_sbicintr()
2029 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2030 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2031 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2036 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2037 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2038 acornscsi_dma_setup(host, DMA_IN); in acornscsi_sbicintr()
2039 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2040 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2041 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2046 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2047 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2052 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2057 acornscsi_message(host); in acornscsi_sbicintr()
2062 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2063 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2069 host->scsi.disconnectable = 1; in acornscsi_sbicintr()
2070 host->scsi.reconnected.tag = 0; in acornscsi_sbicintr()
2071 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2072 host->stats.disconnects += 1; in acornscsi_sbicintr()
2075 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2076 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2082 acornscsi_reconnect(host); in acornscsi_sbicintr()
2085 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2086 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2099 if (ssr != 0x8f && !acornscsi_reconnect_finish(host)) in acornscsi_sbicintr()
2101 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
2106 acornscsi_dma_setup(host, DMA_OUT); in acornscsi_sbicintr()
2107 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2108 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2109 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2115 acornscsi_dma_setup(host, DMA_IN); in acornscsi_sbicintr()
2116 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2117 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2118 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2123 acornscsi_sendcommand(host);/* -> PHASE_COMMAND, PHASE_COMMANDPAUSED */ in acornscsi_sbicintr()
2129 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2130 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2136 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2140 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ 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()
2158 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2165 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2166 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2167 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2168 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2169 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2176 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2177 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2178 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2179 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2186 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2187 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2188 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2189 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2194 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2195 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2207 acornscsi_abortcmd(host); in acornscsi_sbicintr()
2214 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2215 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2216 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2217 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2218 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2219 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2226 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2227 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2228 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2229 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2230 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2237 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2238 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2239 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2240 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2241 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2246 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2247 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2256 acornscsi_message(host); in acornscsi_sbicintr()
2262 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2267 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2268 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2278 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2285 acornscsi_message(host); in acornscsi_sbicintr()
2290 host->host->host_no, acornscsi_target(host)); in acornscsi_sbicintr()
2291 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2292 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_sbicintr()
2297 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2298 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2305 acornscsi_done(host, &host->SCpnt, DID_OK); in acornscsi_sbicintr()
2310 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2315 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2316 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2323 if (host->SCpnt) in acornscsi_sbicintr()
2324 acornscsi_done(host, &host->SCpnt, DID_ABORT); in acornscsi_sbicintr()
2326 clear_bit(host->scsi.reconnected.target * 8 + host->scsi.reconnected.lun, in acornscsi_sbicintr()
2327 host->busyluns); in acornscsi_sbicintr()
2328 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2336 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2341 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2342 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2348 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2349 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2363 AS_Host *host = (AS_Host *)dev_id; in acornscsi_intr() local
2371 iostatus = readb(host->fast + INT_REG); in acornscsi_intr()
2374 acornscsi_dma_intr(host); in acornscsi_intr()
2375 iostatus = readb(host->fast + INT_REG); in acornscsi_intr()
2379 ret = acornscsi_sbicintr(host, in_irq); in acornscsi_intr()
2386 if (host->dma.xfer_required) in acornscsi_intr()
2387 acornscsi_dma_xfer(host); in acornscsi_intr()
2390 ret = acornscsi_kick(host); in acornscsi_intr()
2412 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; in acornscsi_queuecmd_lck() local
2417 host->host->host_no, SCpnt); in acornscsi_queuecmd_lck()
2424 host->host->host_no, '0' + SCpnt->device->id); in acornscsi_queuecmd_lck()
2440 host->stats.queues += 1; in acornscsi_queuecmd_lck()
2445 if (!queue_add_cmd_ordered(&host->queues.issue, SCpnt)) { in acornscsi_queuecmd_lck()
2451 if (host->scsi.phase == PHASE_IDLE) in acornscsi_queuecmd_lck()
2452 acornscsi_kick(host); in acornscsi_queuecmd_lck()
2464 * Purpose : abort a command on this host
2468 static enum res_abort acornscsi_do_abort(AS_Host *host, struct scsi_cmnd *SCpnt) in acornscsi_do_abort() argument
2472 if (queue_remove_cmd(&host->queues.issue, SCpnt)) { in acornscsi_do_abort()
2483 } else if (queue_remove_cmd(&host->queues.disconnected, SCpnt)) { in acornscsi_do_abort()
2495 } else if (host->SCpnt == SCpnt) { in acornscsi_do_abort()
2503 switch (host->scsi.phase) { in acornscsi_do_abort()
2513 if (host->scsi.disconnectable) { in acornscsi_do_abort()
2514 host->scsi.disconnectable = 0; in acornscsi_do_abort()
2515 host->SCpnt = NULL; in acornscsi_do_abort()
2526 sbic_arm_write(host, SBIC_CMND, CMND_DISCONNECT); in acornscsi_do_abort()
2527 host->SCpnt = NULL; in acornscsi_do_abort()
2532 acornscsi_abortcmd(host); in acornscsi_do_abort()
2536 } else if (host->origSCpnt == SCpnt) { in acornscsi_do_abort()
2543 host->origSCpnt = NULL; in acornscsi_do_abort()
2556 * Purpose : abort a command on this host
2562 AS_Host *host = (AS_Host *) SCpnt->device->host->hostdata; in acornscsi_abort() local
2565 host->stats.aborts += 1; in acornscsi_abort()
2570 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_abort()
2571 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_abort()
2574 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_abort()
2575 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_abort()
2579 printk("scsi%d: ", host->host->host_no); in acornscsi_abort()
2581 switch (acornscsi_do_abort(host, SCpnt)) { in acornscsi_abort()
2592 (u8)(SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_abort()
2625 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_abort()
2638 * Purpose : reset a command on this host/reset this host
2644 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; in acornscsi_host_reset() local
2647 host->stats.resets += 1; in acornscsi_host_reset()
2653 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_host_reset()
2654 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_host_reset()
2657 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_host_reset()
2659 acornscsi_dumplog(host, devidx); in acornscsi_host_reset()
2663 acornscsi_dma_stop(host); in acornscsi_host_reset()
2666 * do hard reset. This resets all devices on this host, and so we in acornscsi_host_reset()
2669 acornscsi_resetcard(host); in acornscsi_host_reset()
2671 while ((SCptr = queue_remove(&host->queues.disconnected)) != NULL) in acornscsi_host_reset()
2682 * Function: char *acornscsi_info(struct Scsi_Host *host)
2684 * Params : host - host to give information on
2688 char *acornscsi_info(struct Scsi_Host *host) in acornscsi_info() argument
2701 , host->hostt->name, host->io_port, host->irq, in acornscsi_info()
2710 AS_Host *host; in acornscsi_show_info() local
2712 host = (AS_Host *)instance->hostdata; in acornscsi_show_info()
2724 host->base + SBIC_REGIDX, host->scsi.irq); in acornscsi_show_info()
2727 host->base + DMAC_OFFSET, host->scsi.irq); in acornscsi_show_info()
2736 host->stats.queues, host->stats.removes, in acornscsi_show_info()
2737 host->stats.fins, host->stats.reads, in acornscsi_show_info()
2738 host->stats.writes, host->stats.miscs, in acornscsi_show_info()
2739 host->stats.disconnects, host->stats.aborts, in acornscsi_show_info()
2740 host->stats.resets); in acornscsi_show_info()
2746 statptr = host->status_ptr[devidx] - 10; in acornscsi_show_info()
2751 prev = host->status[devidx][statptr].when; in acornscsi_show_info()
2753 for (; statptr != host->status_ptr[devidx]; statptr = (statptr + 1) & (STATUS_BUFFER_SIZE - 1)) { in acornscsi_show_info()
2754 if (host->status[devidx][statptr].when) { in acornscsi_show_info()
2756 host->status[devidx][statptr].irq ? '-' : ' ', in acornscsi_show_info()
2757 host->status[devidx][statptr].ph, in acornscsi_show_info()
2758 host->status[devidx][statptr].ssr, in acornscsi_show_info()
2759 (host->status[devidx][statptr].when - prev) < 100 ? in acornscsi_show_info()
2760 (host->status[devidx][statptr].when - prev) : 99); in acornscsi_show_info()
2761 prev = host->status[devidx][statptr].when; in acornscsi_show_info()
2777 if (host->device[scd->id].sync_xfer & 15) in acornscsi_show_info()
2779 host->device[scd->id].sync_xfer & 15, in acornscsi_show_info()
2780 acornscsi_getperiod(host->device[scd->id].sync_xfer)); in acornscsi_show_info()
2806 struct Scsi_Host *host; in acornscsi_probe() local
2814 host = scsi_host_alloc(&acornscsi_template, sizeof(AS_Host)); in acornscsi_probe()
2815 if (!host) { in acornscsi_probe()
2820 ashost = (AS_Host *)host->hostdata; in acornscsi_probe()
2829 host->irq = ec->irq; in acornscsi_probe()
2830 ashost->host = host; in acornscsi_probe()
2831 ashost->scsi.irq = host->irq; in acornscsi_probe()
2836 ret = request_irq(host->irq, acornscsi_intr, 0, "acornscsi", ashost); in acornscsi_probe()
2839 host->host_no, ashost->scsi.irq, ret); in acornscsi_probe()
2850 ret = scsi_add_host(host, &ec->dev); in acornscsi_probe()
2854 scsi_scan_host(host); in acornscsi_probe()
2858 free_irq(host->irq, ashost); in acornscsi_probe()
2865 scsi_host_put(host); in acornscsi_probe()
2874 struct Scsi_Host *host = ecard_get_drvdata(ec); in acornscsi_remove() local
2875 AS_Host *ashost = (AS_Host *)host->hostdata; in acornscsi_remove()
2878 scsi_remove_host(host); in acornscsi_remove()
2885 free_irq(host->irq, ashost); in acornscsi_remove()
2892 scsi_host_put(host); in acornscsi_remove()