• Home
  • Raw
  • Download

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()
698 intr_ret_t acornscsi_kick(AS_Host *host) in acornscsi_kick() argument
704 SCpnt = host->origSCpnt; in acornscsi_kick()
705 host->origSCpnt = NULL; in acornscsi_kick()
709 SCpnt = queue_remove_exclude(&host->queues.issue, host->busyluns); in acornscsi_kick()
716 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_kick()
717 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_kick()
718 host->scsi.disconnectable = 0; in acornscsi_kick()
720 DBG(host->SCpnt, printk("scsi%d.%c: moved command to disconnected queue\n", in acornscsi_kick()
721 host->host->host_no, acornscsi_target(host))); in acornscsi_kick()
723 host->SCpnt = NULL; in acornscsi_kick()
730 if (!(sbic_arm_read(host, SBIC_ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) { in acornscsi_kick()
731 sbic_arm_write(host, SBIC_DESTID, SCpnt->device->id); in acornscsi_kick()
732 sbic_arm_write(host, SBIC_CMND, CMND_SELWITHATN); in acornscsi_kick()
739 host->scsi.phase = PHASE_CONNECTING; in acornscsi_kick()
740 host->SCpnt = SCpnt; in acornscsi_kick()
741 host->scsi.SCp = SCpnt->SCp; in acornscsi_kick()
742 host->dma.xfer_setup = 0; in acornscsi_kick()
743 host->dma.xfer_required = 0; in acornscsi_kick()
744 host->dma.xfer_done = 0; in acornscsi_kick()
748 host->host->host_no, '0' + SCpnt->device->id, in acornscsi_kick()
765 (u8)(SCpnt->device->lun & 0x07), host->busyluns); in acornscsi_kick()
767 host->stats.removes += 1; in acornscsi_kick()
771 host->stats.writes += 1; in acornscsi_kick()
774 host->stats.reads += 1; in acornscsi_kick()
777 host->stats.miscs += 1; in acornscsi_kick()
791 static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp, in acornscsi_done() argument
797 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_done()
799 host->stats.fins += 1; in acornscsi_done()
804 acornscsi_dma_cleanup(host); in acornscsi_done()
806 SCpnt->result = result << 16 | host->scsi.SCp.Message << 8 | host->scsi.SCp.Status; in acornscsi_done()
820 if (host->scsi.SCp.ptr && in acornscsi_done()
824 if (host->scsi.SCp.scsi_xferred < SCpnt->underflow || in acornscsi_done()
825 host->scsi.SCp.scsi_xferred != host->dma.transferred) in acornscsi_done()
841 if (host->dma.xfer_done) in acornscsi_done()
858 acornscsi_dumpdma(host, "done"); in acornscsi_done()
859 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_done()
866 panic("scsi%d.H: null scsi_done function in acornscsi_done", host->host->host_no); in acornscsi_done()
869 (u8)(SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_done()
873 printk("scsi%d: null command in acornscsi_done", host->host->host_no); in acornscsi_done()
875 host->scsi.phase = PHASE_IDLE; in acornscsi_done()
886 void acornscsi_data_updateptr(AS_Host *host, struct scsi_pointer *SCp, unsigned int length) in acornscsi_data_updateptr() argument
892 host->dma.xfer_done = 1; in acornscsi_data_updateptr()
906 void acornscsi_data_read(AS_Host *host, char *ptr, in acornscsi_data_read() argument
915 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
925 __acornscsi_in(host->base + (offset << 1), ptr, this_len); in acornscsi_data_read()
934 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
937 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_read()
951 void acornscsi_data_write(AS_Host *host, char *ptr, in acornscsi_data_write() argument
960 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
970 __acornscsi_out(host->base + (offset << 1), ptr, this_len); in acornscsi_data_write()
979 writeb((page & 0x3f) | host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
982 writeb(host->card.page_reg, host->fast + PAGE_REG); in acornscsi_data_write()
997 void acornscsi_dma_stop(AS_Host *host) in acornscsi_dma_stop() argument
999 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_stop()
1000 dmac_clearintr(host); in acornscsi_dma_stop()
1003 DBG(host->SCpnt, acornscsi_dumpdma(host, "stop")); in acornscsi_dma_stop()
1016 void acornscsi_dma_setup(AS_Host *host, dmadir_t direction) in acornscsi_dma_setup() argument
1020 host->dma.direction = direction; in acornscsi_dma_setup()
1022 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_setup()
1026 if (NO_WRITE & (1 << host->SCpnt->device->id)) { in acornscsi_dma_setup()
1028 host->host->host_no, acornscsi_target(host)); in acornscsi_dma_setup()
1039 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_setup()
1041 host->dma.start_addr = address = host->dma.free_addr; in acornscsi_dma_setup()
1042 host->dma.free_addr = (host->dma.free_addr + length) & in acornscsi_dma_setup()
1049 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_setup()
1053 dmac_write(host, DMAC_TXCNTLO, length); in acornscsi_dma_setup()
1054 dmac_write(host, DMAC_TXCNTHI, length >> 8); in acornscsi_dma_setup()
1055 dmac_write(host, DMAC_TXADRLO, address); in acornscsi_dma_setup()
1056 dmac_write(host, DMAC_TXADRMD, address >> 8); in acornscsi_dma_setup()
1057 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_setup()
1058 dmac_write(host, DMAC_MODECON, mode); in acornscsi_dma_setup()
1059 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_setup()
1062 DBG(host->SCpnt, acornscsi_dumpdma(host, "strt")); in acornscsi_dma_setup()
1064 host->dma.xfer_setup = 1; in acornscsi_dma_setup()
1077 void acornscsi_dma_cleanup(AS_Host *host) in acornscsi_dma_cleanup() argument
1079 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_cleanup()
1080 dmac_clearintr(host); in acornscsi_dma_cleanup()
1085 if (host->dma.xfer_required) { in acornscsi_dma_cleanup()
1086 host->dma.xfer_required = 0; in acornscsi_dma_cleanup()
1087 if (host->dma.direction == DMA_IN) in acornscsi_dma_cleanup()
1088 acornscsi_data_read(host, host->dma.xfer_ptr, in acornscsi_dma_cleanup()
1089 host->dma.xfer_start, host->dma.xfer_length); in acornscsi_dma_cleanup()
1095 if (host->dma.xfer_setup) { in acornscsi_dma_cleanup()
1098 host->dma.xfer_setup = 0; in acornscsi_dma_cleanup()
1101 DBG(host->SCpnt, acornscsi_dumpdma(host, "cupi")); in acornscsi_dma_cleanup()
1107 transferred = dmac_address(host) - host->dma.start_addr; in acornscsi_dma_cleanup()
1108 host->dma.transferred += transferred; in acornscsi_dma_cleanup()
1110 if (host->dma.direction == DMA_IN) in acornscsi_dma_cleanup()
1111 acornscsi_data_read(host, host->scsi.SCp.ptr, in acornscsi_dma_cleanup()
1112 host->dma.start_addr, transferred); in acornscsi_dma_cleanup()
1117 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_cleanup()
1119 DBG(host->SCpnt, acornscsi_dumpdma(host, "cupo")); in acornscsi_dma_cleanup()
1135 void acornscsi_dma_intr(AS_Host *host) in acornscsi_dma_intr() argument
1140 DBG(host->SCpnt, acornscsi_dumpdma(host, "inti")); in acornscsi_dma_intr()
1143 dmac_write(host, DMAC_MASKREG, MASK_ON); in acornscsi_dma_intr()
1144 dmac_clearintr(host); in acornscsi_dma_intr()
1149 transferred = dmac_address(host) - host->dma.start_addr; in acornscsi_dma_intr()
1150 host->dma.transferred += transferred; in acornscsi_dma_intr()
1155 if (host->dma.direction == DMA_IN) { in acornscsi_dma_intr()
1156 host->dma.xfer_start = host->dma.start_addr; in acornscsi_dma_intr()
1157 host->dma.xfer_length = transferred; in acornscsi_dma_intr()
1158 host->dma.xfer_ptr = host->scsi.SCp.ptr; in acornscsi_dma_intr()
1159 host->dma.xfer_required = 1; in acornscsi_dma_intr()
1162 acornscsi_data_updateptr(host, &host->scsi.SCp, transferred); in acornscsi_dma_intr()
1167 length = min_t(unsigned int, host->scsi.SCp.this_residual, DMAC_BUFFER_SIZE / 2); in acornscsi_dma_intr()
1169 host->dma.start_addr = address = host->dma.free_addr; in acornscsi_dma_intr()
1170 host->dma.free_addr = (host->dma.free_addr + length) & in acornscsi_dma_intr()
1176 if (host->dma.direction == DMA_OUT) in acornscsi_dma_intr()
1177 acornscsi_data_write(host, host->scsi.SCp.ptr, host->dma.start_addr, in acornscsi_dma_intr()
1181 dmac_write(host, DMAC_TXCNTLO, length); in acornscsi_dma_intr()
1182 dmac_write(host, DMAC_TXCNTHI, length >> 8); in acornscsi_dma_intr()
1183 dmac_write(host, DMAC_TXADRLO, address); in acornscsi_dma_intr()
1184 dmac_write(host, DMAC_TXADRMD, address >> 8); in acornscsi_dma_intr()
1185 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_intr()
1186 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_intr()
1189 DBG(host->SCpnt, acornscsi_dumpdma(host, "into")); in acornscsi_dma_intr()
1192 host->dma.xfer_setup = 0; in acornscsi_dma_intr()
1200 if (dmac_read(host, DMAC_STATUS) & STATUS_RQ0) { in acornscsi_dma_intr()
1201 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_dma_intr()
1203 dmac_write(host, DMAC_TXCNTLO, 0); in acornscsi_dma_intr()
1204 dmac_write(host, DMAC_TXCNTHI, 0); in acornscsi_dma_intr()
1205 dmac_write(host, DMAC_TXADRLO, 0); in acornscsi_dma_intr()
1206 dmac_write(host, DMAC_TXADRMD, 0); in acornscsi_dma_intr()
1207 dmac_write(host, DMAC_TXADRHI, 0); in acornscsi_dma_intr()
1208 dmac_write(host, DMAC_MASKREG, MASK_OFF); in acornscsi_dma_intr()
1220 void acornscsi_dma_xfer(AS_Host *host) in acornscsi_dma_xfer() argument
1222 host->dma.xfer_required = 0; in acornscsi_dma_xfer()
1224 if (host->dma.direction == DMA_IN) in acornscsi_dma_xfer()
1225 acornscsi_data_read(host, host->dma.xfer_ptr, in acornscsi_dma_xfer()
1226 host->dma.xfer_start, host->dma.xfer_length); in acornscsi_dma_xfer()
1236 void acornscsi_dma_adjust(AS_Host *host) in acornscsi_dma_adjust() argument
1238 if (host->dma.xfer_setup) { in acornscsi_dma_adjust()
1241 DBG(host->SCpnt, acornscsi_dumpdma(host, "adji")); in acornscsi_dma_adjust()
1254 transferred = host->scsi.SCp.scsi_xferred - host->dma.transferred; in acornscsi_dma_adjust()
1257 host->host->host_no, acornscsi_target(host), transferred); in acornscsi_dma_adjust()
1259 host->dma.xfer_setup = 0; in acornscsi_dma_adjust()
1261 transferred += host->dma.start_addr; in acornscsi_dma_adjust()
1262 dmac_write(host, DMAC_TXADRLO, transferred); in acornscsi_dma_adjust()
1263 dmac_write(host, DMAC_TXADRMD, transferred >> 8); in acornscsi_dma_adjust()
1264 dmac_write(host, DMAC_TXADRHI, transferred >> 16); in acornscsi_dma_adjust()
1266 DBG(host->SCpnt, acornscsi_dumpdma(host, "adjo")); in acornscsi_dma_adjust()
1277 acornscsi_write_pio(AS_Host *host, char *bytes, int *ptr, int len, unsigned int max_timeout) in acornscsi_write_pio() argument
1283 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_write_pio()
1288 sbic_arm_write(host, SBIC_DATA, bytes[my_ptr++]); in acornscsi_write_pio()
1307 acornscsi_sendcommand(AS_Host *host) in acornscsi_sendcommand() argument
1309 struct scsi_cmnd *SCpnt = host->SCpnt; in acornscsi_sendcommand()
1311 sbic_arm_write(host, SBIC_TRANSCNTH, 0); in acornscsi_sendcommand()
1312 sbic_arm_writenext(host, 0); in acornscsi_sendcommand()
1313 sbic_arm_writenext(host, SCpnt->cmd_len - host->scsi.SCp.sent_command); in acornscsi_sendcommand()
1315 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_sendcommand()
1317 if (acornscsi_write_pio(host, SCpnt->cmnd, in acornscsi_sendcommand()
1318 (int *)&host->scsi.SCp.sent_command, SCpnt->cmd_len, 1000000)) in acornscsi_sendcommand()
1319 printk("scsi%d: timeout while sending command\n", host->host->host_no); in acornscsi_sendcommand()
1321 host->scsi.phase = PHASE_COMMAND; in acornscsi_sendcommand()
1325 void acornscsi_sendmessage(AS_Host *host) in acornscsi_sendmessage() argument
1327 unsigned int message_length = msgqueue_msglength(&host->scsi.msgs); in acornscsi_sendmessage()
1333 host->host->host_no, acornscsi_target(host)); in acornscsi_sendmessage()
1338 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_sendmessage()
1340 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 1"); in acornscsi_sendmessage()
1342 sbic_arm_write(host, SBIC_DATA, NOP); in acornscsi_sendmessage()
1344 host->scsi.last_message = NOP; in acornscsi_sendmessage()
1351 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_sendmessage()
1352 msg = msgqueue_getmsg(&host->scsi.msgs, 0); in acornscsi_sendmessage()
1354 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "sending message 2"); in acornscsi_sendmessage()
1356 sbic_arm_write(host, SBIC_DATA, msg->msg[0]); in acornscsi_sendmessage()
1358 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1373 sbic_arm_write(host, SBIC_TRANSCNTH, 0); in acornscsi_sendmessage()
1374 sbic_arm_writenext(host, 0); in acornscsi_sendmessage()
1375 sbic_arm_writenext(host, message_length); in acornscsi_sendmessage()
1376 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_sendmessage()
1379 while ((msg = msgqueue_getmsg(&host->scsi.msgs, msgnr++)) != NULL) { in acornscsi_sendmessage()
1385 if (acornscsi_write_pio(host, msg->msg, &i, msg->length, 1000000)) in acornscsi_sendmessage()
1386 printk("scsi%d: timeout while sending message\n", host->host->host_no); in acornscsi_sendmessage()
1388 host->scsi.last_message = msg->msg[0]; in acornscsi_sendmessage()
1390 host->scsi.last_message |= msg->msg[2] << 8; in acornscsi_sendmessage()
1408 void acornscsi_readstatusbyte(AS_Host *host) in acornscsi_readstatusbyte() argument
1410 acornscsi_sbic_issuecmd(host, CMND_XFERINFO|CMND_SBT); in acornscsi_readstatusbyte()
1411 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "reading status byte"); in acornscsi_readstatusbyte()
1412 host->scsi.SCp.Status = sbic_arm_read(host, SBIC_DATA); in acornscsi_readstatusbyte()
1421 unsigned char acornscsi_readmessagebyte(AS_Host *host) in acornscsi_readmessagebyte() argument
1425 acornscsi_sbic_issuecmd(host, CMND_XFERINFO | CMND_SBT); in acornscsi_readmessagebyte()
1427 acornscsi_sbic_wait(host, ASR_DBR, ASR_DBR, 1000, "for message byte"); in acornscsi_readmessagebyte()
1429 message = sbic_arm_read(host, SBIC_DATA); in acornscsi_readmessagebyte()
1432 acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after message byte"); in acornscsi_readmessagebyte()
1434 sbic_arm_read(host, SBIC_SSR); in acornscsi_readmessagebyte()
1445 void acornscsi_message(AS_Host *host) in acornscsi_message() argument
1451 message[msgidx] = acornscsi_readmessagebyte(host); in acornscsi_message()
1467 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_message()
1470 acornscsi_sbic_wait(host, ASR_INT, ASR_INT, 1000, "for interrupt after negate ack"); in acornscsi_message()
1471 sbic_arm_read(host, SBIC_SSR); in acornscsi_message()
1477 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1482 if (host->scsi.phase == PHASE_RECONNECTED) { in acornscsi_message()
1490 host->scsi.reconnected.tag = message[1]; in acornscsi_message()
1491 if (acornscsi_reconnect_finish(host)) in acornscsi_message()
1492 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1499 if (host->scsi.phase != PHASE_STATUSIN) { in acornscsi_message()
1501 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1502 acornscsi_dumplog(host, host->SCpnt->device->id); in acornscsi_message()
1504 host->scsi.phase = PHASE_DONE; in acornscsi_message()
1505 host->scsi.SCp.Message = message[0]; in acornscsi_message()
1515 acornscsi_dma_cleanup(host); in acornscsi_message()
1516 host->SCpnt->SCp = host->scsi.SCp; in acornscsi_message()
1517 host->SCpnt->SCp.sent_command = 0; in acornscsi_message()
1518 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1531 acornscsi_dma_cleanup(host); in acornscsi_message()
1532 host->scsi.SCp = host->SCpnt->SCp; in acornscsi_message()
1533 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1546 acornscsi_dma_cleanup(host); in acornscsi_message()
1547 host->scsi.phase = PHASE_DISCONNECT; in acornscsi_message()
1558 if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) in acornscsi_message()
1559 host->device[host->SCpnt->device->id].sync_state = SYNC_NEGOCIATE; in acornscsi_message()
1565 if (msgqueue_msglength(&host->scsi.msgs)) in acornscsi_message()
1566 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1568 switch (host->scsi.last_message) { in acornscsi_message()
1580 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1581 host->SCpnt->device->simple_tags = 0; in acornscsi_message()
1582 set_bit(host->SCpnt->device->id * 8 + in acornscsi_message()
1583 (u8)(host->SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_message()
1591 host->host->host_no, acornscsi_target(host)); in acornscsi_message()
1592 host->device[host->SCpnt->device->id].sync_xfer = SYNCHTRANSFER_2DBA; in acornscsi_message()
1593 host->device[host->SCpnt->device->id].sync_state = SYNC_ASYNCHRONOUS; in acornscsi_message()
1594 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_message()
1609 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1617 if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) { in acornscsi_message()
1624 host->device[host->SCpnt->device->id].sync_state = SYNC_COMPLETED; in acornscsi_message()
1626 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1628 host->device[host->SCpnt->device->id].sync_xfer = in acornscsi_message()
1636 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1639 msgqueue_addmsg(&host->scsi.msgs, 5, EXTENDED_MESSAGE, 3, in acornscsi_message()
1641 host->device[host->SCpnt->device->id].sync_xfer = in acornscsi_message()
1644 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_message()
1657 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1658 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1659 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1666 host->host->host_no, acornscsi_target(host), in acornscsi_message()
1668 acornscsi_sbic_issuecmd(host, CMND_ASSERTATN); in acornscsi_message()
1669 msgqueue_flush(&host->scsi.msgs); in acornscsi_message()
1670 msgqueue_addmsg(&host->scsi.msgs, 1, MESSAGE_REJECT); in acornscsi_message()
1671 host->scsi.phase = PHASE_MSGIN; in acornscsi_message()
1674 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_message()
1683 void acornscsi_buildmessages(AS_Host *host) in acornscsi_buildmessages() argument
1688 msgqueue_addmsg(&host->scsi.msgs, 1, BUS_DEVICE_RESET); in acornscsi_buildmessages()
1693 msgqueue_addmsg(&host->scsi.msgs, 1, in acornscsi_buildmessages()
1694 IDENTIFY(host->device[host->SCpnt->device->id].disconnect_ok, in acornscsi_buildmessages()
1695 host->SCpnt->device->lun)); in acornscsi_buildmessages()
1700 acornscsi_abortcmd(host->SCpnt->tag); in acornscsi_buildmessages()
1706 if (host->SCpnt->tag) { in acornscsi_buildmessages()
1709 if (host->SCpnt->cmnd[0] == REQUEST_SENSE || in acornscsi_buildmessages()
1710 host->SCpnt->cmnd[0] == TEST_UNIT_READY || in acornscsi_buildmessages()
1711 host->SCpnt->cmnd[0] == INQUIRY) in acornscsi_buildmessages()
1715 msgqueue_addmsg(&host->scsi.msgs, 2, tag_type, host->SCpnt->tag); in acornscsi_buildmessages()
1720 if (host->device[host->SCpnt->device->id].sync_state == SYNC_NEGOCIATE) { in acornscsi_buildmessages()
1721 host->device[host->SCpnt->device->id].sync_state = SYNC_SENT_REQUEST; in acornscsi_buildmessages()
1722 msgqueue_addmsg(&host->scsi.msgs, 5, in acornscsi_buildmessages()
1736 int acornscsi_starttransfer(AS_Host *host) in acornscsi_starttransfer() argument
1740 if (!host->scsi.SCp.ptr /*&& host->scsi.SCp.this_residual*/) { in acornscsi_starttransfer()
1742 host->host->host_no, acornscsi_target(host)); in acornscsi_starttransfer()
1746 residual = scsi_bufflen(host->SCpnt) - host->scsi.SCp.scsi_xferred; in acornscsi_starttransfer()
1748 sbic_arm_write(host, SBIC_SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer); in acornscsi_starttransfer()
1749 sbic_arm_writenext(host, residual >> 16); in acornscsi_starttransfer()
1750 sbic_arm_writenext(host, residual >> 8); in acornscsi_starttransfer()
1751 sbic_arm_writenext(host, residual); in acornscsi_starttransfer()
1752 acornscsi_sbic_issuecmd(host, CMND_XFERINFO); in acornscsi_starttransfer()
1768 int acornscsi_reconnect(AS_Host *host) in acornscsi_reconnect() argument
1772 target = sbic_arm_read(host, SBIC_SOURCEID); in acornscsi_reconnect()
1777 host->host->host_no); in acornscsi_reconnect()
1781 if (host->SCpnt && !host->scsi.disconnectable) { in acornscsi_reconnect()
1784 host->host->host_no, target, host->SCpnt->device->id); in acornscsi_reconnect()
1785 host->SCpnt = NULL; in acornscsi_reconnect()
1788 lun = sbic_arm_read(host, SBIC_DATA) & 7; in acornscsi_reconnect()
1790 host->scsi.reconnected.target = target; in acornscsi_reconnect()
1791 host->scsi.reconnected.lun = lun; in acornscsi_reconnect()
1792 host->scsi.reconnected.tag = 0; in acornscsi_reconnect()
1794 if (host->scsi.disconnectable && host->SCpnt && in acornscsi_reconnect()
1795 host->SCpnt->device->id == target && host->SCpnt->device->lun == lun) in acornscsi_reconnect()
1798 if (!ok && queue_probetgtlun(&host->queues.disconnected, target, lun)) in acornscsi_reconnect()
1801 ADD_STATUS(target, 0x81, host->scsi.phase, 0); in acornscsi_reconnect()
1804 host->scsi.phase = PHASE_RECONNECTED; in acornscsi_reconnect()
1809 host->host->host_no, '0' + target); in acornscsi_reconnect()
1810 acornscsi_dumplog(host, target); in acornscsi_reconnect()
1811 acornscsi_abortcmd(host, 0); in acornscsi_reconnect()
1812 if (host->SCpnt) { in acornscsi_reconnect()
1813 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_reconnect()
1814 host->SCpnt = NULL; in acornscsi_reconnect()
1817 acornscsi_sbic_issuecmd(host, CMND_NEGATEACK); in acornscsi_reconnect()
1828 int acornscsi_reconnect_finish(AS_Host *host) in acornscsi_reconnect_finish() argument
1830 if (host->scsi.disconnectable && host->SCpnt) { in acornscsi_reconnect_finish()
1831 host->scsi.disconnectable = 0; in acornscsi_reconnect_finish()
1832 if (host->SCpnt->device->id == host->scsi.reconnected.target && in acornscsi_reconnect_finish()
1833 host->SCpnt->device->lun == host->scsi.reconnected.lun && in acornscsi_reconnect_finish()
1834 host->SCpnt->tag == host->scsi.reconnected.tag) { in acornscsi_reconnect_finish()
1836 DBG(host->SCpnt, printk("scsi%d.%c: reconnected", in acornscsi_reconnect_finish()
1837 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1840 queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt); in acornscsi_reconnect_finish()
1842 DBG(host->SCpnt, printk("scsi%d.%c: had to move command " in acornscsi_reconnect_finish()
1844 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1846 host->SCpnt = NULL; in acornscsi_reconnect_finish()
1849 if (!host->SCpnt) { in acornscsi_reconnect_finish()
1850 host->SCpnt = queue_remove_tgtluntag(&host->queues.disconnected, in acornscsi_reconnect_finish()
1851 host->scsi.reconnected.target, in acornscsi_reconnect_finish()
1852 host->scsi.reconnected.lun, in acornscsi_reconnect_finish()
1853 host->scsi.reconnected.tag); in acornscsi_reconnect_finish()
1855 DBG(host->SCpnt, printk("scsi%d.%c: had to get command", in acornscsi_reconnect_finish()
1856 host->host->host_no, acornscsi_target(host))); in acornscsi_reconnect_finish()
1860 if (!host->SCpnt) in acornscsi_reconnect_finish()
1861 acornscsi_abortcmd(host, host->scsi.reconnected.tag); in acornscsi_reconnect_finish()
1866 host->scsi.SCp = host->SCpnt->SCp; in acornscsi_reconnect_finish()
1869 host->scsi.SCp.ptr, host->scsi.SCp.this_residual); in acornscsi_reconnect_finish()
1876 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_reconnect_finish()
1878 return host->SCpnt != NULL; in acornscsi_reconnect_finish()
1887 void acornscsi_disconnect_unexpected(AS_Host *host) in acornscsi_disconnect_unexpected() argument
1890 host->host->host_no, acornscsi_target(host)); in acornscsi_disconnect_unexpected()
1892 acornscsi_dumplog(host, 8); in acornscsi_disconnect_unexpected()
1895 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_disconnect_unexpected()
1905 void acornscsi_abortcmd(AS_Host *host, unsigned char tag) in acornscsi_abortcmd() argument
1907 host->scsi.phase = PHASE_ABORTED; in acornscsi_abortcmd()
1908 sbic_arm_write(host, SBIC_CMND, CMND_ASSERTATN); in acornscsi_abortcmd()
1910 msgqueue_flush(&host->scsi.msgs); in acornscsi_abortcmd()
1913 msgqueue_addmsg(&host->scsi.msgs, 2, ABORT_TAG, tag); in acornscsi_abortcmd()
1916 msgqueue_addmsg(&host->scsi.msgs, 1, ABORT); in acornscsi_abortcmd()
1931 intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) in acornscsi_sbicintr() argument
1935 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbicintr()
1939 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_sbicintr()
1942 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_sbicintr()
1945 ADD_STATUS(8, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1947 if (host->SCpnt && !host->scsi.disconnectable) in acornscsi_sbicintr()
1948 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
1953 host->host->host_no); in acornscsi_sbicintr()
1955 sbic_arm_write(host, SBIC_OWNID, OWNID_EAF | host->host->this_id); in acornscsi_sbicintr()
1956 sbic_arm_write(host, SBIC_CMND, CMND_RESET); in acornscsi_sbicintr()
1960 sbic_arm_write(host, SBIC_CTRL, INIT_SBICDMA | CTRL_IDI); in acornscsi_sbicintr()
1961 sbic_arm_write(host, SBIC_TIMEOUT, TIMEOUT_TIME); in acornscsi_sbicintr()
1962 sbic_arm_write(host, SBIC_SYNCHTRANSFER, SYNCHTRANSFER_2DBA); in acornscsi_sbicintr()
1963 sbic_arm_write(host, SBIC_SOURCEID, SOURCEID_ER | SOURCEID_DSP); in acornscsi_sbicintr()
1964 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1968 acornscsi_disconnect_unexpected(host); in acornscsi_sbicintr()
1972 switch (host->scsi.phase) { in acornscsi_sbicintr()
1977 host->scsi.phase = PHASE_CONNECTED; in acornscsi_sbicintr()
1978 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1979 host->dma.transferred = host->scsi.SCp.scsi_xferred; in acornscsi_sbicintr()
1981 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_sbicintr()
1984 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_sbicintr()
1985 ADD_STATUS(8, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1986 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, 1); in acornscsi_sbicintr()
1991 acornscsi_done(host, &host->SCpnt, DID_NO_CONNECT); in acornscsi_sbicintr()
1996 host->origSCpnt = host->SCpnt; in acornscsi_sbicintr()
1997 host->SCpnt = NULL; in acornscsi_sbicintr()
1998 msgqueue_flush(&host->scsi.msgs); in acornscsi_sbicintr()
1999 acornscsi_reconnect(host); in acornscsi_sbicintr()
2004 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2005 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2006 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2016 acornscsi_sendcommand(host); in acornscsi_sbicintr()
2021 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2022 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2028 host->scsi.phase = PHASE_MSGOUT; in acornscsi_sbicintr()
2029 acornscsi_buildmessages(host); in acornscsi_sbicintr()
2030 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2035 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_sbicintr()
2040 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2041 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2042 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2055 acornscsi_sendcommand(host); in acornscsi_sbicintr()
2061 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2062 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2067 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2073 acornscsi_message(host); in acornscsi_sbicintr()
2078 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2079 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2087 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2088 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2089 acornscsi_dma_setup(host, DMA_OUT); in acornscsi_sbicintr()
2090 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2091 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2092 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2097 if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len) in acornscsi_sbicintr()
2098 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2099 acornscsi_dma_setup(host, DMA_IN); in acornscsi_sbicintr()
2100 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2101 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2102 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2107 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2108 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2113 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2118 acornscsi_message(host); in acornscsi_sbicintr()
2123 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2124 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2130 host->scsi.disconnectable = 1; in acornscsi_sbicintr()
2131 host->scsi.reconnected.tag = 0; in acornscsi_sbicintr()
2132 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2133 host->stats.disconnects += 1; in acornscsi_sbicintr()
2136 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2137 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2143 acornscsi_reconnect(host); in acornscsi_sbicintr()
2146 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2147 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2160 if (ssr != 0x8f && !acornscsi_reconnect_finish(host)) in acornscsi_sbicintr()
2162 ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq); in acornscsi_sbicintr()
2167 acornscsi_dma_setup(host, DMA_OUT); in acornscsi_sbicintr()
2168 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2169 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2170 host->scsi.phase = PHASE_DATAOUT; in acornscsi_sbicintr()
2176 acornscsi_dma_setup(host, DMA_IN); in acornscsi_sbicintr()
2177 if (!acornscsi_starttransfer(host)) in acornscsi_sbicintr()
2178 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2179 host->scsi.phase = PHASE_DATAIN; in acornscsi_sbicintr()
2184 acornscsi_sendcommand(host);/* -> PHASE_COMMAND, PHASE_COMMANDPAUSED */ in acornscsi_sbicintr()
2190 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2191 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2197 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2201 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2206 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2207 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2219 acornscsi_abortcmd(host, host->SCpnt->tag); 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_readstatusbyte(host); in acornscsi_sbicintr()
2230 host->scsi.phase = PHASE_STATUSIN; 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_sendmessage(host); in acornscsi_sbicintr()
2247 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2248 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2249 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2250 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2255 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2256 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2268 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_sbicintr()
2275 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2276 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2277 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2278 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2279 acornscsi_readstatusbyte(host); in acornscsi_sbicintr()
2280 host->scsi.phase = PHASE_STATUSIN; in acornscsi_sbicintr()
2287 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2288 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2289 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2290 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2291 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2298 host->scsi.SCp.scsi_xferred = scsi_bufflen(host->SCpnt) - in acornscsi_sbicintr()
2299 acornscsi_sbic_xfcount(host); in acornscsi_sbicintr()
2300 acornscsi_dma_stop(host); in acornscsi_sbicintr()
2301 acornscsi_dma_adjust(host); in acornscsi_sbicintr()
2302 acornscsi_message(host); /* -> PHASE_MSGIN, PHASE_DISCONNECT */ in acornscsi_sbicintr()
2307 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2308 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2317 acornscsi_message(host); in acornscsi_sbicintr()
2323 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2328 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2329 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2339 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2346 acornscsi_message(host); in acornscsi_sbicintr()
2351 host->host->host_no, acornscsi_target(host)); in acornscsi_sbicintr()
2352 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2353 acornscsi_done(host, &host->SCpnt, DID_ERROR); in acornscsi_sbicintr()
2358 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2359 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2366 acornscsi_done(host, &host->SCpnt, DID_OK); in acornscsi_sbicintr()
2371 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2376 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2377 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2384 if (host->SCpnt) in acornscsi_sbicintr()
2385 acornscsi_done(host, &host->SCpnt, DID_ABORT); in acornscsi_sbicintr()
2387 clear_bit(host->scsi.reconnected.target * 8 + host->scsi.reconnected.lun, in acornscsi_sbicintr()
2388 host->busyluns); in acornscsi_sbicintr()
2389 host->scsi.phase = PHASE_IDLE; in acornscsi_sbicintr()
2397 acornscsi_sendmessage(host); in acornscsi_sbicintr()
2402 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2403 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2409 host->host->host_no, acornscsi_target(host), ssr); in acornscsi_sbicintr()
2410 acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8); in acornscsi_sbicintr()
2424 AS_Host *host = (AS_Host *)dev_id; in acornscsi_intr() local
2432 iostatus = readb(host->fast + INT_REG); in acornscsi_intr()
2435 acornscsi_dma_intr(host); in acornscsi_intr()
2436 iostatus = readb(host->fast + INT_REG); in acornscsi_intr()
2440 ret = acornscsi_sbicintr(host, in_irq); in acornscsi_intr()
2447 if (host->dma.xfer_required) in acornscsi_intr()
2448 acornscsi_dma_xfer(host); in acornscsi_intr()
2451 ret = acornscsi_kick(host); in acornscsi_intr()
2473 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; in acornscsi_queuecmd_lck() local
2478 host->host->host_no, SCpnt); in acornscsi_queuecmd_lck()
2485 host->host->host_no, '0' + SCpnt->device->id); in acornscsi_queuecmd_lck()
2502 host->stats.queues += 1; in acornscsi_queuecmd_lck()
2507 if (!queue_add_cmd_ordered(&host->queues.issue, SCpnt)) { in acornscsi_queuecmd_lck()
2513 if (host->scsi.phase == PHASE_IDLE) in acornscsi_queuecmd_lck()
2514 acornscsi_kick(host); in acornscsi_queuecmd_lck()
2555 static enum res_abort acornscsi_do_abort(AS_Host *host, struct scsi_cmnd *SCpnt) in acornscsi_do_abort() argument
2559 if (queue_remove_cmd(&host->queues.issue, SCpnt)) { in acornscsi_do_abort()
2570 } else if (queue_remove_cmd(&host->queues.disconnected, SCpnt)) { in acornscsi_do_abort()
2582 } else if (host->SCpnt == SCpnt) { in acornscsi_do_abort()
2590 switch (host->scsi.phase) { in acornscsi_do_abort()
2600 if (host->scsi.disconnectable) { in acornscsi_do_abort()
2601 host->scsi.disconnectable = 0; in acornscsi_do_abort()
2602 host->SCpnt = NULL; in acornscsi_do_abort()
2613 sbic_arm_write(host, SBIC_CMND, CMND_DISCONNECT); in acornscsi_do_abort()
2614 host->SCpnt = NULL; in acornscsi_do_abort()
2619 acornscsi_abortcmd(host, host->SCpnt->tag); in acornscsi_do_abort()
2623 } else if (host->origSCpnt == SCpnt) { in acornscsi_do_abort()
2630 host->origSCpnt = NULL; in acornscsi_do_abort()
2649 AS_Host *host = (AS_Host *) SCpnt->device->host->hostdata; in acornscsi_abort() local
2652 host->stats.aborts += 1; in acornscsi_abort()
2657 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_abort()
2658 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_abort()
2661 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_abort()
2662 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_abort()
2666 printk("scsi%d: ", host->host->host_no); in acornscsi_abort()
2668 switch (acornscsi_do_abort(host, SCpnt)) { in acornscsi_abort()
2679 (u8)(SCpnt->device->lun & 0x7), host->busyluns); in acornscsi_abort()
2711 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_abort()
2730 AS_Host *host = (AS_Host *)SCpnt->device->host->hostdata; in acornscsi_bus_reset() local
2733 host->stats.resets += 1; in acornscsi_bus_reset()
2739 asr = sbic_arm_read(host, SBIC_ASR); in acornscsi_bus_reset()
2740 ssr = sbic_arm_read(host, SBIC_SSR); in acornscsi_bus_reset()
2743 print_sbic_status(asr, ssr, host->scsi.phase); in acornscsi_bus_reset()
2744 acornscsi_dumplog(host, SCpnt->device->id); in acornscsi_bus_reset()
2748 acornscsi_dma_stop(host); in acornscsi_bus_reset()
2754 acornscsi_resetcard(host); in acornscsi_bus_reset()
2756 while ((SCptr = queue_remove(&host->queues.disconnected)) != NULL) in acornscsi_bus_reset()
2773 char *acornscsi_info(struct Scsi_Host *host) in acornscsi_info() argument
2789 , host->hostt->name, host->io_port, host->irq, in acornscsi_info()
2798 AS_Host *host; in acornscsi_show_info() local
2800 host = (AS_Host *)instance->hostdata; in acornscsi_show_info()
2815 host->base + SBIC_REGIDX, host->scsi.irq); in acornscsi_show_info()
2818 host->base + DMAC_OFFSET, host->scsi.irq); in acornscsi_show_info()
2827 host->stats.queues, host->stats.removes, in acornscsi_show_info()
2828 host->stats.fins, host->stats.reads, in acornscsi_show_info()
2829 host->stats.writes, host->stats.miscs, in acornscsi_show_info()
2830 host->stats.disconnects, host->stats.aborts, in acornscsi_show_info()
2831 host->stats.resets); in acornscsi_show_info()
2837 statptr = host->status_ptr[devidx] - 10; in acornscsi_show_info()
2842 prev = host->status[devidx][statptr].when; in acornscsi_show_info()
2844 for (; statptr != host->status_ptr[devidx]; statptr = (statptr + 1) & (STATUS_BUFFER_SIZE - 1)) { in acornscsi_show_info()
2845 if (host->status[devidx][statptr].when) { in acornscsi_show_info()
2847 host->status[devidx][statptr].irq ? '-' : ' ', in acornscsi_show_info()
2848 host->status[devidx][statptr].ph, in acornscsi_show_info()
2849 host->status[devidx][statptr].ssr, in acornscsi_show_info()
2850 (host->status[devidx][statptr].when - prev) < 100 ? in acornscsi_show_info()
2851 (host->status[devidx][statptr].when - prev) : 99); in acornscsi_show_info()
2852 prev = host->status[devidx][statptr].when; in acornscsi_show_info()
2869 if (host->device[scd->id].sync_xfer & 15) in acornscsi_show_info()
2871 host->device[scd->id].sync_xfer & 15, in acornscsi_show_info()
2872 acornscsi_getperiod(host->device[scd->id].sync_xfer)); in acornscsi_show_info()
2898 struct Scsi_Host *host; in acornscsi_probe() local
2906 host = scsi_host_alloc(&acornscsi_template, sizeof(AS_Host)); in acornscsi_probe()
2907 if (!host) { in acornscsi_probe()
2912 ashost = (AS_Host *)host->hostdata; in acornscsi_probe()
2919 host->irq = ec->irq; in acornscsi_probe()
2920 ashost->host = host; in acornscsi_probe()
2921 ashost->scsi.irq = host->irq; in acornscsi_probe()
2926 ret = request_irq(host->irq, acornscsi_intr, 0, "acornscsi", ashost); in acornscsi_probe()
2929 host->host_no, ashost->scsi.irq, ret); in acornscsi_probe()
2940 ret = scsi_add_host(host, &ec->dev); in acornscsi_probe()
2944 scsi_scan_host(host); in acornscsi_probe()
2948 free_irq(host->irq, ashost); in acornscsi_probe()
2955 scsi_host_put(host); in acornscsi_probe()
2964 struct Scsi_Host *host = ecard_get_drvdata(ec); in acornscsi_remove() local
2965 AS_Host *ashost = (AS_Host *)host->hostdata; in acornscsi_remove()
2968 scsi_remove_host(host); in acornscsi_remove()
2975 free_irq(host->irq, ashost); in acornscsi_remove()
2982 scsi_host_put(host); in acornscsi_remove()