Lines Matching refs:acb
155 #define DC395x_read8(acb,address) (u8)(inb(acb->io_port_base + (address))) argument
156 #define DC395x_read16(acb,address) (u16)(inw(acb->io_port_base + (address))) argument
157 #define DC395x_read32(acb,address) (u32)(inl(acb->io_port_base + (address))) argument
158 #define DC395x_write8(acb,address,value) outb((value), acb->io_port_base + (address)) argument
159 #define DC395x_write16(acb,address,value) outw((value), acb->io_port_base + (address)) argument
160 #define DC395x_write32(acb,address,value) outl((value), acb->io_port_base + (address)) argument
270 struct AdapterCtlBlk *acb; member
343 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
345 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
347 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
349 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
351 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
353 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
355 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
357 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
359 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
361 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
363 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
365 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
367 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
369 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
371 static void set_basic_config(struct AdapterCtlBlk *acb);
372 static void cleanup_after_transfer(struct AdapterCtlBlk *acb,
374 static void reset_scsi_bus(struct AdapterCtlBlk *acb);
375 static void data_io_transfer(struct AdapterCtlBlk *acb,
377 static void disconnect(struct AdapterCtlBlk *acb);
378 static void reselect(struct AdapterCtlBlk *acb);
379 static u8 start_scsi(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
381 static inline void enable_msgout_abort(struct AdapterCtlBlk *acb,
385 static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_code,
387 static void scsi_reset_detect(struct AdapterCtlBlk *acb);
388 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb);
389 static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb,
391 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
393 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
395 static void set_xfer_rate(struct AdapterCtlBlk *acb,
756 static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) in waiting_set_timer() argument
758 if (timer_pending(&acb->waiting_timer)) in waiting_set_timer()
760 if (time_before(jiffies + to, acb->last_reset - HZ / 2)) in waiting_set_timer()
761 acb->waiting_timer.expires = in waiting_set_timer()
762 acb->last_reset - HZ / 2 + 1; in waiting_set_timer()
764 acb->waiting_timer.expires = jiffies + to + 1; in waiting_set_timer()
765 add_timer(&acb->waiting_timer); in waiting_set_timer()
770 static void waiting_process_next(struct AdapterCtlBlk *acb) in waiting_process_next() argument
776 struct list_head *dcb_list_head = &acb->dcb_list; in waiting_process_next()
778 if (acb->active_dcb in waiting_process_next()
779 || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) in waiting_process_next()
782 if (timer_pending(&acb->waiting_timer)) in waiting_process_next()
783 del_timer(&acb->waiting_timer); in waiting_process_next()
793 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
800 acb->dcb_run_robin = start; in waiting_process_next()
813 acb->dcb_run_robin = dcb_get_next(dcb_list_head, in waiting_process_next()
814 acb->dcb_run_robin); in waiting_process_next()
825 if (!start_scsi(acb, pos, srb)) in waiting_process_next()
828 waiting_set_timer(acb, HZ/50); in waiting_process_next()
839 struct AdapterCtlBlk *acb = from_timer(acb, t, waiting_timer); in waiting_timeout() local
841 "waiting_timeout: Queue woken up by timer. acb=%p\n", acb); in waiting_timeout()
842 DC395x_LOCK_IO(acb->scsi_host, flags); in waiting_timeout()
843 waiting_process_next(acb); in waiting_timeout()
844 DC395x_UNLOCK_IO(acb->scsi_host, flags); in waiting_timeout()
849 static struct DeviceCtlBlk *find_dcb(struct AdapterCtlBlk *acb, u8 id, u8 lun) in find_dcb() argument
851 return acb->children[id][lun]; in find_dcb()
856 static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in send_srb() argument
861 acb->active_dcb || in send_srb()
862 (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { in send_srb()
864 waiting_process_next(acb); in send_srb()
868 if (!start_scsi(acb, dcb, srb)) { in send_srb()
872 waiting_set_timer(acb, HZ / 50); in send_srb()
948 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
982 struct AdapterCtlBlk *acb = in dc395x_queue_command_lck() local
991 if (cmd->device->id >= acb->scsi_host->max_id || in dc395x_queue_command_lck()
992 cmd->device->lun >= acb->scsi_host->max_lun || in dc395x_queue_command_lck()
998 if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) { in dc395x_queue_command_lck()
1005 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
1017 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
1034 waiting_process_next(acb); in dc395x_queue_command_lck()
1037 send_srb(acb, srb); in dc395x_queue_command_lck()
1055 static void dump_register_info(struct AdapterCtlBlk *acb, in DEF_SCSI_QCMD()
1059 struct pci_dev *dev = acb->dev; in DEF_SCSI_QCMD()
1062 dcb = acb->active_dcb; in DEF_SCSI_QCMD()
1080 (acb->active_dcb) ? "" : "not"); in DEF_SCSI_QCMD()
1086 DC395x_read16(acb, TRM_S1040_SCSI_STATUS), in DEF_SCSI_QCMD()
1087 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in DEF_SCSI_QCMD()
1088 DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL), in DEF_SCSI_QCMD()
1089 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS), in DEF_SCSI_QCMD()
1090 DC395x_read8(acb, TRM_S1040_SCSI_SYNC), in DEF_SCSI_QCMD()
1091 DC395x_read8(acb, TRM_S1040_SCSI_TARGETID), in DEF_SCSI_QCMD()
1092 DC395x_read8(acb, TRM_S1040_SCSI_IDMSG), in DEF_SCSI_QCMD()
1093 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), in DEF_SCSI_QCMD()
1094 DC395x_read8(acb, TRM_S1040_SCSI_INTEN), in DEF_SCSI_QCMD()
1095 DC395x_read16(acb, TRM_S1040_SCSI_CONFIG0), in DEF_SCSI_QCMD()
1096 DC395x_read8(acb, TRM_S1040_SCSI_CONFIG2), in DEF_SCSI_QCMD()
1097 DC395x_read8(acb, TRM_S1040_SCSI_COMMAND), in DEF_SCSI_QCMD()
1098 DC395x_read8(acb, TRM_S1040_SCSI_TIMEOUT)); in DEF_SCSI_QCMD()
1102 DC395x_read16(acb, TRM_S1040_DMA_COMMAND), in DEF_SCSI_QCMD()
1103 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in DEF_SCSI_QCMD()
1104 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in DEF_SCSI_QCMD()
1105 DC395x_read8(acb, TRM_S1040_DMA_STATUS), in DEF_SCSI_QCMD()
1106 DC395x_read8(acb, TRM_S1040_DMA_INTEN), in DEF_SCSI_QCMD()
1107 DC395x_read16(acb, TRM_S1040_DMA_CONFIG), in DEF_SCSI_QCMD()
1108 DC395x_read32(acb, TRM_S1040_DMA_XCNT), in DEF_SCSI_QCMD()
1109 DC395x_read32(acb, TRM_S1040_DMA_CXCNT), in DEF_SCSI_QCMD()
1110 DC395x_read32(acb, TRM_S1040_DMA_XHIGHADDR), in DEF_SCSI_QCMD()
1111 DC395x_read32(acb, TRM_S1040_DMA_XLOWADDR)); in DEF_SCSI_QCMD()
1114 DC395x_read8(acb, TRM_S1040_GEN_CONTROL), in DEF_SCSI_QCMD()
1115 DC395x_read8(acb, TRM_S1040_GEN_STATUS), in DEF_SCSI_QCMD()
1116 DC395x_read8(acb, TRM_S1040_GEN_TIMER), in DEF_SCSI_QCMD()
1121 static inline void clear_fifo(struct AdapterCtlBlk *acb, char *txt) in clear_fifo() argument
1124 u8 lines = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in clear_fifo()
1125 u8 fifocnt = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in clear_fifo()
1131 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); in clear_fifo()
1135 static void reset_dev_param(struct AdapterCtlBlk *acb) in reset_dev_param() argument
1138 struct NvRamType *eeprom = &acb->eeprom; in reset_dev_param()
1139 dprintkdbg(DBG_0, "reset_dev_param: acb=%p\n", acb); in reset_dev_param()
1141 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
1152 || !(acb->config & HCC_WIDE_CARD)) in reset_dev_param()
1165 struct AdapterCtlBlk *acb = in __dc395x_eh_bus_reset() local
1171 if (timer_pending(&acb->waiting_timer)) in __dc395x_eh_bus_reset()
1172 del_timer(&acb->waiting_timer); in __dc395x_eh_bus_reset()
1177 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); in __dc395x_eh_bus_reset()
1178 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); in __dc395x_eh_bus_reset()
1179 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in __dc395x_eh_bus_reset()
1180 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in __dc395x_eh_bus_reset()
1182 reset_scsi_bus(acb); in __dc395x_eh_bus_reset()
1186 acb->last_reset = in __dc395x_eh_bus_reset()
1188 HZ * acb->eeprom.delay_time; in __dc395x_eh_bus_reset()
1194 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in __dc395x_eh_bus_reset()
1195 clear_fifo(acb, "eh_bus_reset"); in __dc395x_eh_bus_reset()
1197 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in __dc395x_eh_bus_reset()
1198 set_basic_config(acb); in __dc395x_eh_bus_reset()
1200 reset_dev_param(acb); in __dc395x_eh_bus_reset()
1201 doing_srb_done(acb, DID_RESET, cmd, 0); in __dc395x_eh_bus_reset()
1202 acb->active_dcb = NULL; in __dc395x_eh_bus_reset()
1203 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ in __dc395x_eh_bus_reset()
1204 waiting_process_next(acb); in __dc395x_eh_bus_reset()
1231 struct AdapterCtlBlk *acb = in dc395x_eh_abort() local
1238 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1247 pci_unmap_srb_sense(acb, srb); in dc395x_eh_abort()
1248 pci_unmap_srb(acb, srb); in dc395x_eh_abort()
1250 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1267 static void build_sdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_sdtr() argument
1295 static void build_wdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_wdtr() argument
1299 (acb->config & HCC_WIDE_CARD)) ? 1 : 0; in build_wdtr()
1322 static void selto_timer(struct AdapterCtlBlk *acb)
1324 if (timer_pending(&acb->selto_timer))
1326 acb->selto_timer.function = selection_timeout_missed;
1327 acb->selto_timer.data = (unsigned long) acb;
1329 (jiffies + HZ, acb->last_reset + HZ / 2))
1330 acb->selto_timer.expires =
1331 acb->last_reset + HZ / 2 + 1;
1333 acb->selto_timer.expires = jiffies + HZ + 1;
1334 add_timer(&acb->selto_timer);
1341 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)ptr;
1344 if (!acb->active_dcb || !acb->active_dcb->active_srb) {
1348 DC395x_LOCK_IO(acb->scsi_host, flags);
1349 srb = acb->active_dcb->active_srb;
1350 disconnect(acb);
1351 DC395x_UNLOCK_IO(acb->scsi_host, flags);
1356 static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb, in start_scsi() argument
1367 s_stat = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in start_scsi()
1369 s_stat2 = DC395x_read16(acb, TRM_S1040_SCSI_STATUS); in start_scsi()
1388 if (acb->active_dcb) { in start_scsi()
1392 acb->active_dcb->active_srb ? in start_scsi()
1393 acb->active_dcb->active_srb->cmd : 0); in start_scsi()
1396 if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { in start_scsi()
1402 if (time_before(jiffies, acb->last_reset - HZ / 2)) { in start_scsi()
1408 clear_fifo(acb, "start_scsi"); in start_scsi()
1409 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in start_scsi()
1410 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1411 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1412 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1436 build_wdtr(acb, dcb, srb); in start_scsi()
1442 build_sdtr(acb, dcb, srb); in start_scsi()
1447 build_wdtr(acb, dcb, srb); in start_scsi()
1453 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, identify_message); in start_scsi()
1474 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1479 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, MSG_SIMPLE_QTAG); in start_scsi()
1480 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, tag_number); in start_scsi()
1493 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE); in start_scsi()
1494 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1495 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1496 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1497 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE); in start_scsi()
1498 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1502 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++); in start_scsi()
1505 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1507 if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { in start_scsi()
1527 acb->active_dcb = dcb; in start_scsi()
1530 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1533 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, scsicommand); in start_scsi()
1540 DC395x_write16 (acb, TRM_S1040_SCSI_CONTROL, DO_SETATN); \
1545 static inline void enable_msgout_abort(struct AdapterCtlBlk *acb, in enable_msgout_abort() argument
1563 static void dc395x_handle_interrupt(struct AdapterCtlBlk *acb, in dc395x_handle_interrupt() argument
1574 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1577 scsi_intstatus = DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in dc395x_handle_interrupt()
1587 if (timer_pending(&acb->selto_timer)) in dc395x_handle_interrupt()
1588 del_timer(&acb->selto_timer); in dc395x_handle_interrupt()
1591 disconnect(acb); /* bus free interrupt */ in dc395x_handle_interrupt()
1595 reselect(acb); in dc395x_handle_interrupt()
1603 scsi_reset_detect(acb); in dc395x_handle_interrupt()
1607 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1617 enable_msgout_abort(acb, srb); in dc395x_handle_interrupt()
1637 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1660 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1663 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1669 struct AdapterCtlBlk *acb = dev_id; in dc395x_interrupt() local
1677 scsi_status = DC395x_read16(acb, TRM_S1040_SCSI_STATUS); in dc395x_interrupt()
1678 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS); in dc395x_interrupt()
1681 dc395x_handle_interrupt(acb, scsi_status); in dc395x_interrupt()
1689 if (acb->active_dcb) { in dc395x_interrupt()
1690 acb->active_dcb-> flag |= ABORT_DEV_; in dc395x_interrupt()
1691 if (acb->active_dcb->active_srb) in dc395x_interrupt()
1692 enable_msgout_abort(acb, acb->active_dcb->active_srb); in dc395x_interrupt()
1694 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, ABORTXFER | CLRXFIFO); in dc395x_interrupt()
1697 acb = NULL; in dc395x_interrupt()
1706 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase0() argument
1713 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgout_phase0()
1718 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase1() argument
1725 clear_fifo(acb, "msgout_phase1"); in msgout_phase1()
1735 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, MSG_NOP); in msgout_phase1()
1736 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgout_phase1()
1737 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in msgout_phase1()
1742 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++); in msgout_phase1()
1747 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in msgout_phase1()
1751 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase0() argument
1755 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in command_phase0()
1759 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase1() argument
1767 clear_fifo(acb, "command_phase1"); in command_phase1()
1768 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRATN); in command_phase1()
1772 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr); in command_phase1()
1776 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE); in command_phase1()
1777 dcb = acb->active_dcb; in command_phase1()
1779 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1780 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1781 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1782 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE); in command_phase1()
1783 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1787 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in command_phase1()
1789 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in command_phase1()
1839 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1845 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1876 static void cleanup_after_transfer(struct AdapterCtlBlk *acb, in cleanup_after_transfer() argument
1880 if (DC395x_read16(acb, TRM_S1040_DMA_COMMAND) & 0x0001) { /* read */ in cleanup_after_transfer()
1881 if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40)) in cleanup_after_transfer()
1882 clear_fifo(acb, "cleanup/in"); in cleanup_after_transfer()
1883 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) in cleanup_after_transfer()
1884 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in cleanup_after_transfer()
1886 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) in cleanup_after_transfer()
1887 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in cleanup_after_transfer()
1888 if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40)) in cleanup_after_transfer()
1889 clear_fifo(acb, "cleanup/out"); in cleanup_after_transfer()
1891 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in cleanup_after_transfer()
1902 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase0() argument
1926 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_out_phase0()
1927 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_out_phase0()
1928 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
1929 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), scsi_status, in data_out_phase0()
1931 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, STOPDMAXFER | CLRXFIFO); in data_out_phase0()
1949 (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & in data_out_phase0()
1957 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
1959 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
1960 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), in data_out_phase0()
1961 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_out_phase0()
1962 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_out_phase0()
1963 DC395x_read32(acb, TRM_S1040_DMA_CXCNT)); in data_out_phase0()
1976 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); in data_out_phase0()
2030 cleanup_after_transfer(acb, srb); in data_out_phase0()
2035 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase1() argument
2040 clear_fifo(acb, "data_out_phase1"); in data_out_phase1()
2042 data_io_transfer(acb, srb, XFERDATAOUT); in data_out_phase1()
2045 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase0() argument
2081 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) { in data_in_phase0()
2090 (DC395x_read16(acb, TRM_S1040_DMA_FIFOSTAT) & in data_in_phase0()
2102 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_in_phase0()
2103 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT)); in data_in_phase0()
2106 sc = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); in data_in_phase0()
2107 fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in data_in_phase0()
2119 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_in_phase0()
2120 DC395x_read32(acb, TRM_S1040_DMA_CXCNT), in data_in_phase0()
2137 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_in_phase0()
2156 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_in_phase0()
2167 fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in data_in_phase0()
2180 u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_in_phase0()
2188 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_in_phase0()
2212 (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & in data_in_phase0()
2231 DC395x_read8(acb, TRM_S1040_DMA_STATUS); in data_in_phase0()
2253 cleanup_after_transfer(acb, srb); in data_in_phase0()
2258 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase1() argument
2263 data_io_transfer(acb, srb, XFERDATAIN); in data_in_phase1()
2267 static void data_io_transfer(struct AdapterCtlBlk *acb, in data_io_transfer() argument
2277 if (srb == acb->tmp_srb) in data_io_transfer()
2285 u8 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS); in data_io_transfer()
2293 dump_register_info(acb, dcb, srb); in data_io_transfer()
2294 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in data_io_transfer()
2302 DC395x_write32(acb, TRM_S1040_DMA_XHIGHADDR, 0); in data_io_transfer()
2305 DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR, in data_io_transfer()
2310 DC395x_write32(acb, TRM_S1040_DMA_XCNT, in data_io_transfer()
2315 DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR, in data_io_transfer()
2317 DC395x_write32(acb, TRM_S1040_DMA_XCNT, in data_io_transfer()
2321 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, in data_io_transfer()
2323 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2325 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2327 DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir); in data_io_transfer()
2329 DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir); in data_io_transfer()
2330 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2343 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, in data_io_transfer()
2345 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2347 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2354 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_io_transfer()
2375 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *virt++); in data_io_transfer()
2385 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in data_io_transfer()
2389 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_io_transfer()
2394 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2411 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 2); in data_io_transfer()
2412 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_io_transfer()
2415 data = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2416 data2 = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2421 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K'); in data_io_transfer()
2422 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'G'); in data_io_transfer()
2424 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_io_transfer()
2426 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1); in data_io_transfer()
2430 data = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2432 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K'); in data_io_transfer()
2435 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2438 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, bval); in data_io_transfer()
2443 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase0() argument
2448 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2449 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2452 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in status_phase0()
2453 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in status_phase0()
2457 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase1() argument
2463 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in status_phase1()
2464 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_COMP); in status_phase1()
2483 static inline void msgin_reject(struct AdapterCtlBlk *acb, in msgin_reject() argument
2497 static struct ScsiReqBlk *msgin_qtag(struct AdapterCtlBlk *acb, in msgin_qtag() argument
2525 enable_msgout_abort(acb, srb); in msgin_qtag()
2531 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2539 srb = acb->tmp_srb; in msgin_qtag()
2550 static inline void reprogram_regs(struct AdapterCtlBlk *acb, in reprogram_regs() argument
2553 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2554 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2555 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2556 set_xfer_rate(acb, dcb); in reprogram_regs()
2561 static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_async() argument
2573 reprogram_regs(acb, dcb); in msgin_set_async()
2576 build_wdtr(acb, dcb, srb); in msgin_set_async()
2584 static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_sync() argument
2645 build_wdtr(acb, dcb, srb); in msgin_set_sync()
2653 reprogram_regs(acb, dcb); in msgin_set_sync()
2657 static inline void msgin_set_nowide(struct AdapterCtlBlk *acb, in msgin_set_nowide() argument
2667 reprogram_regs(acb, dcb); in msgin_set_nowide()
2670 build_sdtr(acb, dcb, srb); in msgin_set_nowide()
2676 static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_wide() argument
2680 && acb->config & HCC_WIDE_CARD) ? 1 : 0; in msgin_set_wide()
2706 reprogram_regs(acb, dcb); in msgin_set_wide()
2709 build_sdtr(acb, dcb, srb); in msgin_set_wide()
2728 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase0() argument
2731 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0()
2734 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2735 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2746 msgin_qtag(acb, dcb, in msgin_phase0()
2751 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in msgin_phase0()
2755 msgin_set_async(acb, srb); in msgin_phase0()
2760 msgin_set_nowide(acb, srb); in msgin_phase0()
2763 enable_msgout_abort(acb, srb); in msgin_phase0()
2771 msgin_set_sync(acb, srb); in msgin_phase0()
2778 msgin_set_wide(acb, srb); in msgin_phase0()
2781 msgin_reject(acb, srb); in msgin_phase0()
2813 enable_msgout_abort(acb, srb); in msgin_phase0()
2826 msgin_reject(acb, srb); in msgin_phase0()
2831 acb->msg_len = 0; in msgin_phase0()
2834 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important ... you know! */ in msgin_phase0()
2835 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in msgin_phase0()
2839 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase1() argument
2843 clear_fifo(acb, "msgin_phase1"); in msgin_phase1()
2844 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1); in msgin_phase1()
2849 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgin_phase1()
2851 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_IN); in msgin_phase1()
2855 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop0() argument
2861 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop1() argument
2867 static void set_xfer_rate(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb) in set_xfer_rate() argument
2875 if (acb->scan_devices) { in set_xfer_rate()
2880 list_for_each_entry(i, &acb->dcb_list, list) in set_xfer_rate()
2890 static void disconnect(struct AdapterCtlBlk *acb) in disconnect() argument
2892 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect()
2899 acb->last_reset = in disconnect()
2901 HZ * acb->eeprom.delay_time; in disconnect()
2902 clear_fifo(acb, "disconnectEx"); in disconnect()
2903 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); in disconnect()
2907 acb->active_dcb = NULL; in disconnect()
2911 clear_fifo(acb, "disconnect"); in disconnect()
2912 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); in disconnect()
2918 waiting_process_next(acb); in disconnect()
2921 acb->last_reset = jiffies + HZ / 2 + 1; in disconnect()
2923 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2924 waiting_process_next(acb); in disconnect()
2948 || acb->scan_devices) { in disconnect()
2958 waiting_set_timer(acb, HZ / 20); in disconnect()
2961 u8 bval = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in disconnect()
2971 waiting_process_next(acb); in disconnect()
2980 srb_done(acb, dcb, srb); in disconnect()
2986 static void reselect(struct AdapterCtlBlk *acb) in reselect() argument
2988 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect()
2993 dprintkdbg(DBG_0, "reselect: acb=%p\n", acb); in reselect()
2995 clear_fifo(acb, "reselect"); in reselect()
2998 rsel_tar_lun_id = DC395x_read16(acb, TRM_S1040_SCSI_TARGETID); in reselect()
3004 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3008 if (!acb->scan_devices) { in reselect()
3013 DC395x_read16(acb, TRM_S1040_SCSI_STATUS)); in reselect()
3020 waiting_set_timer(acb, HZ / 20); in reselect()
3031 dcb = find_dcb(acb, id, lun); in reselect()
3035 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3038 acb->active_dcb = dcb; in reselect()
3046 srb = acb->tmp_srb; in reselect()
3058 srb = acb->tmp_srb; in reselect()
3061 enable_msgout_abort(acb, srb); in reselect()
3065 enable_msgout_abort(acb, srb); in reselect()
3075 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); /* host ID */ in reselect()
3076 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
3077 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
3078 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
3079 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3081 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in reselect()
3113 dcb->acb->tag_max_num; in disc_tagq_set()
3122 static void add_dev(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in add_dev() argument
3133 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in pci_unmap_srb() argument
3142 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
3153 static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb, in pci_unmap_srb_sense() argument
3161 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3176 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in srb_done() argument
3192 pci_unmap_srb_sense(acb, srb); in srb_done()
3205 dcb->target_lun, status, acb->scan_devices); in srb_done()
3211 dcb->target_lun, status, acb->scan_devices); in srb_done()
3217 dcb->target_lun, status, acb->scan_devices); in srb_done()
3223 dcb->target_lun, status, acb->scan_devices); in srb_done()
3229 dcb->target_lun, status, acb->scan_devices); in srb_done()
3271 request_sense(acb, dcb, srb); in srb_done()
3282 waiting_set_timer(acb, HZ / 20); in srb_done()
3321 pci_unmap_srb(acb, srb); in srb_done()
3344 add_dev(acb, dcb, ptr); in srb_done()
3366 if (srb != acb->tmp_srb) { in srb_done()
3370 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
3376 waiting_process_next(acb); in srb_done()
3381 static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, in doing_srb_done() argument
3387 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
3403 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3405 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3406 pci_unmap_srb(acb, srb); in doing_srb_done()
3431 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3433 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3434 pci_unmap_srb(acb, srb); in doing_srb_done()
3451 static void reset_scsi_bus(struct AdapterCtlBlk *acb) in reset_scsi_bus() argument
3453 dprintkdbg(DBG_0, "reset_scsi_bus: acb=%p\n", acb); in reset_scsi_bus()
3454 acb->acb_flag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in reset_scsi_bus()
3455 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); in reset_scsi_bus()
3457 while (!(DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET)) in reset_scsi_bus()
3462 static void set_basic_config(struct AdapterCtlBlk *acb) in set_basic_config() argument
3466 DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout); in set_basic_config()
3467 if (acb->config & HCC_PARITY) in set_basic_config()
3472 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG0, bval); in set_basic_config()
3475 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG1, 0x03); /* was 0x13: default */ in set_basic_config()
3477 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in set_basic_config()
3479 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, 0x00); in set_basic_config()
3481 wval = DC395x_read16(acb, TRM_S1040_GEN_CONTROL) & 0x7F; in set_basic_config()
3482 DC395x_write16(acb, TRM_S1040_GEN_CONTROL, wval); in set_basic_config()
3484 wval = DC395x_read16(acb, TRM_S1040_DMA_CONFIG) & ~DMA_FIFO_CTRL; in set_basic_config()
3487 DC395x_write16(acb, TRM_S1040_DMA_CONFIG, wval); in set_basic_config()
3489 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in set_basic_config()
3491 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x7F); in set_basic_config()
3492 DC395x_write8(acb, TRM_S1040_DMA_INTEN, EN_SCSIINTR | EN_DMAXFERERROR in set_basic_config()
3498 static void scsi_reset_detect(struct AdapterCtlBlk *acb) in scsi_reset_detect() argument
3500 dprintkl(KERN_INFO, "scsi_reset_detect: acb=%p\n", acb); in scsi_reset_detect()
3502 if (timer_pending(&acb->waiting_timer)) in scsi_reset_detect()
3503 del_timer(&acb->waiting_timer); in scsi_reset_detect()
3505 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in scsi_reset_detect()
3506 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in scsi_reset_detect()
3510 acb->last_reset = in scsi_reset_detect()
3512 HZ * acb->eeprom.delay_time; in scsi_reset_detect()
3514 clear_fifo(acb, "scsi_reset_detect"); in scsi_reset_detect()
3515 set_basic_config(acb); in scsi_reset_detect()
3519 if (acb->acb_flag & RESET_DEV) { /* RESET_DETECT, RESET_DONE, RESET_DEV */ in scsi_reset_detect()
3520 acb->acb_flag |= RESET_DONE; in scsi_reset_detect()
3522 acb->acb_flag |= RESET_DETECT; in scsi_reset_detect()
3523 reset_dev_param(acb); in scsi_reset_detect()
3524 doing_srb_done(acb, DID_RESET, NULL, 1); in scsi_reset_detect()
3526 acb->active_dcb = NULL; in scsi_reset_detect()
3527 acb->acb_flag = 0; in scsi_reset_detect()
3528 waiting_process_next(acb); in scsi_reset_detect()
3533 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in request_sense() argument
3557 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
3566 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */ in request_sense()
3571 waiting_set_timer(acb, HZ / 100); in request_sense()
3589 static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb, in device_alloc() argument
3592 struct NvRamType *eeprom = &acb->eeprom; in device_alloc()
3600 dcb->acb = NULL; in device_alloc()
3624 && (acb->config & HCC_WIDE_CARD)) in device_alloc()
3636 list_for_each_entry(iter, &acb->dcb_list, list) in device_alloc()
3667 static void adapter_add_device(struct AdapterCtlBlk *acb, in adapter_add_device() argument
3671 dcb->acb = acb; in adapter_add_device()
3674 if (list_empty(&acb->dcb_list)) in adapter_add_device()
3675 acb->dcb_run_robin = dcb; in adapter_add_device()
3678 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3681 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3682 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3695 static void adapter_remove_device(struct AdapterCtlBlk *acb, in adapter_remove_device() argument
3704 if (acb->active_dcb == dcb) in adapter_remove_device()
3705 acb->active_dcb = NULL; in adapter_remove_device()
3706 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3707 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3710 list_for_each_entry_safe(i, tmp, &acb->dcb_list, list) in adapter_remove_device()
3717 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3718 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3719 dcb->acb = NULL; in adapter_remove_device()
3730 static void adapter_remove_and_free_device(struct AdapterCtlBlk *acb, in adapter_remove_and_free_device() argument
3740 adapter_remove_device(acb, dcb); in adapter_remove_and_free_device()
3751 static void adapter_remove_and_free_all_devices(struct AdapterCtlBlk* acb) in adapter_remove_and_free_all_devices() argument
3756 list_size(&acb->dcb_list)); in adapter_remove_and_free_all_devices()
3758 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3759 adapter_remove_and_free_device(acb, dcb); in adapter_remove_and_free_all_devices()
3772 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_alloc() local
3775 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_alloc()
3778 adapter_add_device(acb, dcb); in dc395x_slave_alloc()
3792 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_destroy() local
3793 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_destroy()
3795 adapter_remove_and_free_device(acb, dcb); in dc395x_slave_destroy()
4117 static void adapter_sg_tables_free(struct AdapterCtlBlk *acb) in adapter_sg_tables_free() argument
4123 kfree(acb->srb_array[i].segment_x); in adapter_sg_tables_free()
4130 static int adapter_sg_tables_alloc(struct AdapterCtlBlk *acb) in adapter_sg_tables_alloc() argument
4141 acb->srb_array[i].segment_x = NULL; in adapter_sg_tables_alloc()
4147 adapter_sg_tables_free(acb); in adapter_sg_tables_alloc()
4154 acb->srb_array[srb_idx++].segment_x = in adapter_sg_tables_alloc()
4158 acb->srb.segment_x = in adapter_sg_tables_alloc()
4176 static void adapter_print_config(struct AdapterCtlBlk *acb) in adapter_print_config() argument
4180 bval = DC395x_read8(acb, TRM_S1040_GEN_STATUS); in adapter_print_config()
4192 bval = DC395x_read8(acb, TRM_S1040_GEN_CONTROL); in adapter_print_config()
4220 static void adapter_init_params(struct AdapterCtlBlk *acb) in adapter_init_params() argument
4222 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_params()
4229 INIT_LIST_HEAD(&acb->dcb_list); in adapter_init_params()
4230 acb->dcb_run_robin = NULL; in adapter_init_params()
4231 acb->active_dcb = NULL; in adapter_init_params()
4233 INIT_LIST_HEAD(&acb->srb_free_list); in adapter_init_params()
4235 acb->tmp_srb = &acb->srb; in adapter_init_params()
4236 timer_setup(&acb->waiting_timer, waiting_timeout, 0); in adapter_init_params()
4237 timer_setup(&acb->selto_timer, NULL, 0); in adapter_init_params()
4239 acb->srb_count = DC395x_MAX_SRB_CNT; in adapter_init_params()
4241 acb->sel_timeout = DC395x_SEL_TIMEOUT; /* timeout=250ms */ in adapter_init_params()
4244 acb->tag_max_num = 1 << eeprom->max_tag; in adapter_init_params()
4245 if (acb->tag_max_num > 30) in adapter_init_params()
4246 acb->tag_max_num = 30; in adapter_init_params()
4248 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in adapter_init_params()
4249 acb->gmode2 = eeprom->channel_cfg; in adapter_init_params()
4250 acb->config = 0; /* NOTE: actually set in adapter_init_chip */ in adapter_init_params()
4253 acb->lun_chk = 1; in adapter_init_params()
4254 acb->scan_devices = 1; in adapter_init_params()
4256 acb->scsi_host->this_id = eeprom->scsi_id; in adapter_init_params()
4257 acb->hostid_bit = (1 << acb->scsi_host->this_id); in adapter_init_params()
4260 acb->dcb_map[i] = 0; in adapter_init_params()
4262 acb->msg_len = 0; in adapter_init_params()
4265 for (i = 0; i < acb->srb_count - 1; i++) in adapter_init_params()
4266 list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); in adapter_init_params()
4284 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in adapter_init_scsi_host() local
4285 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_scsi_host()
4291 host->io_port = acb->io_port_base; in adapter_init_scsi_host()
4292 host->n_io_port = acb->io_port_len; in adapter_init_scsi_host()
4294 host->unique_id = acb->io_port_base; in adapter_init_scsi_host()
4295 host->irq = acb->irq_level; in adapter_init_scsi_host()
4296 acb->last_reset = jiffies; in adapter_init_scsi_host()
4318 static void adapter_init_chip(struct AdapterCtlBlk *acb) in adapter_init_chip() argument
4320 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_chip()
4323 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); in adapter_init_chip()
4324 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); in adapter_init_chip()
4327 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in adapter_init_chip()
4330 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in adapter_init_chip()
4334 acb->config = HCC_AUTOTERM | HCC_PARITY; in adapter_init_chip()
4335 if (DC395x_read8(acb, TRM_S1040_GEN_STATUS) & WIDESCSI) in adapter_init_chip()
4336 acb->config |= HCC_WIDE_CARD; in adapter_init_chip()
4339 acb->config |= HCC_SCSI_RESET; in adapter_init_chip()
4341 if (acb->config & HCC_SCSI_RESET) { in adapter_init_chip()
4343 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); in adapter_init_chip()
4349 acb->last_reset = in adapter_init_chip()
4351 HZ * acb->eeprom.delay_time; in adapter_init_chip()
4371 static int adapter_init(struct AdapterCtlBlk *acb, unsigned long io_port, in adapter_init() argument
4379 acb->io_port_base = io_port; in adapter_init()
4380 acb->io_port_len = io_port_len; in adapter_init()
4382 if (request_irq(irq, dc395x_interrupt, IRQF_SHARED, DC395X_NAME, acb)) { in adapter_init()
4388 acb->irq_level = irq; in adapter_init()
4391 check_eeprom(&acb->eeprom, io_port); in adapter_init()
4392 print_eeprom_settings(&acb->eeprom); in adapter_init()
4395 adapter_init_params(acb); in adapter_init()
4398 adapter_print_config(acb); in adapter_init()
4400 if (adapter_sg_tables_alloc(acb)) { in adapter_init()
4404 adapter_init_scsi_host(acb->scsi_host); in adapter_init()
4405 adapter_init_chip(acb); in adapter_init()
4406 set_basic_config(acb); in adapter_init()
4411 acb, acb->dcb_map, acb->srb_array, sizeof(struct AdapterCtlBlk), in adapter_init()
4416 if (acb->irq_level) in adapter_init()
4417 free_irq(acb->irq_level, acb); in adapter_init()
4418 if (acb->io_port_base) in adapter_init()
4419 release_region(acb->io_port_base, acb->io_port_len); in adapter_init()
4420 adapter_sg_tables_free(acb); in adapter_init()
4433 static void adapter_uninit_chip(struct AdapterCtlBlk *acb) in adapter_uninit_chip() argument
4436 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0); in adapter_uninit_chip()
4437 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0); in adapter_uninit_chip()
4440 if (acb->config & HCC_SCSI_RESET) in adapter_uninit_chip()
4441 reset_scsi_bus(acb); in adapter_uninit_chip()
4444 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in adapter_uninit_chip()
4456 static void adapter_uninit(struct AdapterCtlBlk *acb) in adapter_uninit() argument
4459 DC395x_LOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4462 if (timer_pending(&acb->waiting_timer)) in adapter_uninit()
4463 del_timer(&acb->waiting_timer); in adapter_uninit()
4464 if (timer_pending(&acb->selto_timer)) in adapter_uninit()
4465 del_timer(&acb->selto_timer); in adapter_uninit()
4467 adapter_uninit_chip(acb); in adapter_uninit()
4468 adapter_remove_and_free_all_devices(acb); in adapter_uninit()
4469 DC395x_UNLOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4471 if (acb->irq_level) in adapter_uninit()
4472 free_irq(acb->irq_level, acb); in adapter_uninit()
4473 if (acb->io_port_base) in adapter_uninit()
4474 release_region(acb->io_port_base, acb->io_port_len); in adapter_uninit()
4476 adapter_sg_tables_free(acb); in adapter_uninit()
4487 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in dc395x_show_info() local
4496 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4500 (acb->config & HCC_WIDE_CARD) ? "Wide" : ""); in dc395x_show_info()
4501 seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base); in dc395x_show_info()
4502 seq_printf(m, "irq_level 0x%04x, ", acb->irq_level); in dc395x_show_info()
4503 seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000); in dc395x_show_info()
4508 seq_printf(m, "tag_max_num %i", acb->tag_max_num); in dc395x_show_info()
4511 DC395x_read8(acb, TRM_S1040_SCSI_CONFIG1)); in dc395x_show_info()
4512 seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time); in dc395x_show_info()
4515 seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); in dc395x_show_info()
4516 seq_printf(m, "Map of attached LUNs: %8ph\n", &acb->dcb_map[0]); in dc395x_show_info()
4517 seq_printf(m, " %8ph\n", &acb->dcb_map[8]); in dc395x_show_info()
4523 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4553 if (timer_pending(&acb->waiting_timer)) in dc395x_show_info()
4558 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4577 seq_printf(m, "DCB list for ACB %p:\n", acb); in dc395x_show_info()
4578 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4584 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4638 struct AdapterCtlBlk *acb = NULL; in dc395x_init_one() local
4663 acb = (struct AdapterCtlBlk*)scsi_host->hostdata; in dc395x_init_one()
4664 acb->scsi_host = scsi_host; in dc395x_init_one()
4665 acb->dev = dev; in dc395x_init_one()
4668 if (adapter_init(acb, io_port_base, io_port_len, irq)) { in dc395x_init_one()
4670 acb = NULL; in dc395x_init_one()
4687 if (acb != NULL) in dc395x_init_one()
4688 adapter_uninit(acb); in dc395x_init_one()
4705 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata); in dc395x_remove_one() local
4707 dprintkdbg(DBG_0, "dc395x_remove_one: acb=%p\n", acb); in dc395x_remove_one()
4710 adapter_uninit(acb); in dc395x_remove_one()