Lines Matching refs:acb

156 #define DC395x_read8(acb,address)		(u8)(inb(acb->io_port_base + (address)))  argument
157 #define DC395x_read16(acb,address) (u16)(inw(acb->io_port_base + (address))) argument
158 #define DC395x_read32(acb,address) (u32)(inl(acb->io_port_base + (address))) argument
159 #define DC395x_write8(acb,address,value) outb((value), acb->io_port_base + (address)) argument
160 #define DC395x_write16(acb,address,value) outw((value), acb->io_port_base + (address)) argument
161 #define DC395x_write32(acb,address,value) outl((value), acb->io_port_base + (address)) argument
255 struct AdapterCtlBlk *acb; member
328 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
330 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
332 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
334 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
336 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
338 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
340 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
342 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
344 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
346 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
348 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
350 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
352 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
354 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
356 static void set_basic_config(struct AdapterCtlBlk *acb);
357 static void cleanup_after_transfer(struct AdapterCtlBlk *acb,
359 static void reset_scsi_bus(struct AdapterCtlBlk *acb);
360 static void data_io_transfer(struct AdapterCtlBlk *acb,
362 static void disconnect(struct AdapterCtlBlk *acb);
363 static void reselect(struct AdapterCtlBlk *acb);
364 static u8 start_scsi(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
366 static inline void enable_msgout_abort(struct AdapterCtlBlk *acb,
370 static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_code,
372 static void scsi_reset_detect(struct AdapterCtlBlk *acb);
373 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb);
374 static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb,
376 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
378 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
380 static void set_xfer_rate(struct AdapterCtlBlk *acb,
741 static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) in waiting_set_timer() argument
743 if (timer_pending(&acb->waiting_timer)) in waiting_set_timer()
745 if (time_before(jiffies + to, acb->last_reset - HZ / 2)) in waiting_set_timer()
746 acb->waiting_timer.expires = in waiting_set_timer()
747 acb->last_reset - HZ / 2 + 1; in waiting_set_timer()
749 acb->waiting_timer.expires = jiffies + to + 1; in waiting_set_timer()
750 add_timer(&acb->waiting_timer); in waiting_set_timer()
755 static void waiting_process_next(struct AdapterCtlBlk *acb) in waiting_process_next() argument
761 struct list_head *dcb_list_head = &acb->dcb_list; in waiting_process_next()
763 if (acb->active_dcb in waiting_process_next()
764 || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) in waiting_process_next()
767 if (timer_pending(&acb->waiting_timer)) in waiting_process_next()
768 del_timer(&acb->waiting_timer); in waiting_process_next()
778 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
785 acb->dcb_run_robin = start; in waiting_process_next()
798 acb->dcb_run_robin = dcb_get_next(dcb_list_head, in waiting_process_next()
799 acb->dcb_run_robin); in waiting_process_next()
810 if (!start_scsi(acb, pos, srb)) in waiting_process_next()
813 waiting_set_timer(acb, HZ/50); in waiting_process_next()
824 struct AdapterCtlBlk *acb = from_timer(acb, t, waiting_timer); in waiting_timeout() local
826 "waiting_timeout: Queue woken up by timer. acb=%p\n", acb); in waiting_timeout()
827 DC395x_LOCK_IO(acb->scsi_host, flags); in waiting_timeout()
828 waiting_process_next(acb); in waiting_timeout()
829 DC395x_UNLOCK_IO(acb->scsi_host, flags); in waiting_timeout()
834 static struct DeviceCtlBlk *find_dcb(struct AdapterCtlBlk *acb, u8 id, u8 lun) in find_dcb() argument
836 return acb->children[id][lun]; in find_dcb()
841 static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in send_srb() argument
846 acb->active_dcb || in send_srb()
847 (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { in send_srb()
849 waiting_process_next(acb); in send_srb()
853 if (!start_scsi(acb, dcb, srb)) { in send_srb()
857 waiting_set_timer(acb, HZ / 50); in send_srb()
933 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
967 struct AdapterCtlBlk *acb = in dc395x_queue_command_lck() local
976 if (cmd->device->id >= acb->scsi_host->max_id || in dc395x_queue_command_lck()
977 cmd->device->lun >= acb->scsi_host->max_lun || in dc395x_queue_command_lck()
983 if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) { in dc395x_queue_command_lck()
990 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
1001 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
1018 waiting_process_next(acb); in dc395x_queue_command_lck()
1021 send_srb(acb, srb); in dc395x_queue_command_lck()
1039 static void dump_register_info(struct AdapterCtlBlk *acb, in DEF_SCSI_QCMD()
1043 struct pci_dev *dev = acb->dev; in DEF_SCSI_QCMD()
1046 dcb = acb->active_dcb; in DEF_SCSI_QCMD()
1064 (acb->active_dcb) ? "" : "not"); in DEF_SCSI_QCMD()
1070 DC395x_read16(acb, TRM_S1040_SCSI_STATUS), in DEF_SCSI_QCMD()
1071 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in DEF_SCSI_QCMD()
1072 DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL), in DEF_SCSI_QCMD()
1073 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS), in DEF_SCSI_QCMD()
1074 DC395x_read8(acb, TRM_S1040_SCSI_SYNC), in DEF_SCSI_QCMD()
1075 DC395x_read8(acb, TRM_S1040_SCSI_TARGETID), in DEF_SCSI_QCMD()
1076 DC395x_read8(acb, TRM_S1040_SCSI_IDMSG), in DEF_SCSI_QCMD()
1077 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), in DEF_SCSI_QCMD()
1078 DC395x_read8(acb, TRM_S1040_SCSI_INTEN), in DEF_SCSI_QCMD()
1079 DC395x_read16(acb, TRM_S1040_SCSI_CONFIG0), in DEF_SCSI_QCMD()
1080 DC395x_read8(acb, TRM_S1040_SCSI_CONFIG2), in DEF_SCSI_QCMD()
1081 DC395x_read8(acb, TRM_S1040_SCSI_COMMAND), in DEF_SCSI_QCMD()
1082 DC395x_read8(acb, TRM_S1040_SCSI_TIMEOUT)); in DEF_SCSI_QCMD()
1086 DC395x_read16(acb, TRM_S1040_DMA_COMMAND), in DEF_SCSI_QCMD()
1087 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in DEF_SCSI_QCMD()
1088 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in DEF_SCSI_QCMD()
1089 DC395x_read8(acb, TRM_S1040_DMA_STATUS), in DEF_SCSI_QCMD()
1090 DC395x_read8(acb, TRM_S1040_DMA_INTEN), in DEF_SCSI_QCMD()
1091 DC395x_read16(acb, TRM_S1040_DMA_CONFIG), in DEF_SCSI_QCMD()
1092 DC395x_read32(acb, TRM_S1040_DMA_XCNT), in DEF_SCSI_QCMD()
1093 DC395x_read32(acb, TRM_S1040_DMA_CXCNT), in DEF_SCSI_QCMD()
1094 DC395x_read32(acb, TRM_S1040_DMA_XHIGHADDR), in DEF_SCSI_QCMD()
1095 DC395x_read32(acb, TRM_S1040_DMA_XLOWADDR)); in DEF_SCSI_QCMD()
1098 DC395x_read8(acb, TRM_S1040_GEN_CONTROL), in DEF_SCSI_QCMD()
1099 DC395x_read8(acb, TRM_S1040_GEN_STATUS), in DEF_SCSI_QCMD()
1100 DC395x_read8(acb, TRM_S1040_GEN_TIMER), in DEF_SCSI_QCMD()
1105 static inline void clear_fifo(struct AdapterCtlBlk *acb, char *txt) in clear_fifo() argument
1108 u8 lines = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in clear_fifo()
1109 u8 fifocnt = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in clear_fifo()
1115 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); in clear_fifo()
1119 static void reset_dev_param(struct AdapterCtlBlk *acb) in reset_dev_param() argument
1122 struct NvRamType *eeprom = &acb->eeprom; in reset_dev_param()
1123 dprintkdbg(DBG_0, "reset_dev_param: acb=%p\n", acb); in reset_dev_param()
1125 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
1136 || !(acb->config & HCC_WIDE_CARD)) in reset_dev_param()
1149 struct AdapterCtlBlk *acb = in __dc395x_eh_bus_reset() local
1155 if (timer_pending(&acb->waiting_timer)) in __dc395x_eh_bus_reset()
1156 del_timer(&acb->waiting_timer); in __dc395x_eh_bus_reset()
1161 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); in __dc395x_eh_bus_reset()
1162 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); in __dc395x_eh_bus_reset()
1163 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in __dc395x_eh_bus_reset()
1164 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in __dc395x_eh_bus_reset()
1166 reset_scsi_bus(acb); in __dc395x_eh_bus_reset()
1170 acb->last_reset = in __dc395x_eh_bus_reset()
1172 HZ * acb->eeprom.delay_time; in __dc395x_eh_bus_reset()
1178 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in __dc395x_eh_bus_reset()
1179 clear_fifo(acb, "eh_bus_reset"); in __dc395x_eh_bus_reset()
1181 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in __dc395x_eh_bus_reset()
1182 set_basic_config(acb); in __dc395x_eh_bus_reset()
1184 reset_dev_param(acb); in __dc395x_eh_bus_reset()
1185 doing_srb_done(acb, DID_RESET, cmd, 0); in __dc395x_eh_bus_reset()
1186 acb->active_dcb = NULL; in __dc395x_eh_bus_reset()
1187 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ in __dc395x_eh_bus_reset()
1188 waiting_process_next(acb); in __dc395x_eh_bus_reset()
1215 struct AdapterCtlBlk *acb = in dc395x_eh_abort() local
1222 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1231 pci_unmap_srb_sense(acb, srb); in dc395x_eh_abort()
1232 pci_unmap_srb(acb, srb); in dc395x_eh_abort()
1234 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1251 static void build_sdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_sdtr() argument
1275 static void build_wdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_wdtr() argument
1279 (acb->config & HCC_WIDE_CARD)) ? 1 : 0; in build_wdtr()
1298 static void selto_timer(struct AdapterCtlBlk *acb)
1300 if (timer_pending(&acb->selto_timer))
1302 acb->selto_timer.function = selection_timeout_missed;
1303 acb->selto_timer.data = (unsigned long) acb;
1305 (jiffies + HZ, acb->last_reset + HZ / 2))
1306 acb->selto_timer.expires =
1307 acb->last_reset + HZ / 2 + 1;
1309 acb->selto_timer.expires = jiffies + HZ + 1;
1310 add_timer(&acb->selto_timer);
1317 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)ptr;
1320 if (!acb->active_dcb || !acb->active_dcb->active_srb) {
1324 DC395x_LOCK_IO(acb->scsi_host, flags);
1325 srb = acb->active_dcb->active_srb;
1326 disconnect(acb);
1327 DC395x_UNLOCK_IO(acb->scsi_host, flags);
1332 static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb, in start_scsi() argument
1343 s_stat = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in start_scsi()
1345 s_stat2 = DC395x_read16(acb, TRM_S1040_SCSI_STATUS); in start_scsi()
1364 if (acb->active_dcb) { in start_scsi()
1368 acb->active_dcb->active_srb ? in start_scsi()
1369 acb->active_dcb->active_srb->cmd : 0); in start_scsi()
1372 if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { in start_scsi()
1378 if (time_before(jiffies, acb->last_reset - HZ / 2)) { in start_scsi()
1384 clear_fifo(acb, "start_scsi"); in start_scsi()
1385 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in start_scsi()
1386 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1387 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1388 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1412 build_wdtr(acb, dcb, srb); in start_scsi()
1418 build_sdtr(acb, dcb, srb); in start_scsi()
1423 build_wdtr(acb, dcb, srb); in start_scsi()
1429 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, identify_message); in start_scsi()
1450 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1455 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SIMPLE_QUEUE_TAG); in start_scsi()
1456 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, tag_number); in start_scsi()
1469 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE); in start_scsi()
1470 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1471 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1472 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1473 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE); in start_scsi()
1474 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1478 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++); in start_scsi()
1481 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1483 if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { in start_scsi()
1503 acb->active_dcb = dcb; in start_scsi()
1506 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1509 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, scsicommand); in start_scsi()
1516 DC395x_write16 (acb, TRM_S1040_SCSI_CONTROL, DO_SETATN); \
1521 static inline void enable_msgout_abort(struct AdapterCtlBlk *acb, in enable_msgout_abort() argument
1539 static void dc395x_handle_interrupt(struct AdapterCtlBlk *acb, in dc395x_handle_interrupt() argument
1550 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1553 scsi_intstatus = DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in dc395x_handle_interrupt()
1563 if (timer_pending(&acb->selto_timer)) in dc395x_handle_interrupt()
1564 del_timer(&acb->selto_timer); in dc395x_handle_interrupt()
1567 disconnect(acb); /* bus free interrupt */ in dc395x_handle_interrupt()
1571 reselect(acb); in dc395x_handle_interrupt()
1579 scsi_reset_detect(acb); in dc395x_handle_interrupt()
1583 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1593 enable_msgout_abort(acb, srb); in dc395x_handle_interrupt()
1613 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1636 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1639 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1645 struct AdapterCtlBlk *acb = dev_id; in dc395x_interrupt() local
1653 scsi_status = DC395x_read16(acb, TRM_S1040_SCSI_STATUS); in dc395x_interrupt()
1654 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS); in dc395x_interrupt()
1657 dc395x_handle_interrupt(acb, scsi_status); in dc395x_interrupt()
1665 if (acb->active_dcb) { in dc395x_interrupt()
1666 acb->active_dcb-> flag |= ABORT_DEV_; in dc395x_interrupt()
1667 if (acb->active_dcb->active_srb) in dc395x_interrupt()
1668 enable_msgout_abort(acb, acb->active_dcb->active_srb); in dc395x_interrupt()
1670 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, ABORTXFER | CLRXFIFO); in dc395x_interrupt()
1673 acb = NULL; in dc395x_interrupt()
1682 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase0() argument
1689 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgout_phase0()
1694 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase1() argument
1701 clear_fifo(acb, "msgout_phase1"); in msgout_phase1()
1711 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, NOP); in msgout_phase1()
1712 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in msgout_phase1()
1714 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in msgout_phase1()
1719 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++); in msgout_phase1()
1724 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in msgout_phase1()
1728 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase0() argument
1732 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in command_phase0()
1736 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase1() argument
1744 clear_fifo(acb, "command_phase1"); in command_phase1()
1745 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRATN); in command_phase1()
1749 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr); in command_phase1()
1753 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE); in command_phase1()
1754 dcb = acb->active_dcb; in command_phase1()
1756 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1757 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1758 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1759 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE); in command_phase1()
1760 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1764 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in command_phase1()
1766 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in command_phase1()
1816 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1822 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1853 static void cleanup_after_transfer(struct AdapterCtlBlk *acb, in cleanup_after_transfer() argument
1857 if (DC395x_read16(acb, TRM_S1040_DMA_COMMAND) & 0x0001) { /* read */ in cleanup_after_transfer()
1858 if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40)) in cleanup_after_transfer()
1859 clear_fifo(acb, "cleanup/in"); in cleanup_after_transfer()
1860 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) in cleanup_after_transfer()
1861 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in cleanup_after_transfer()
1863 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) in cleanup_after_transfer()
1864 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in cleanup_after_transfer()
1865 if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40)) in cleanup_after_transfer()
1866 clear_fifo(acb, "cleanup/out"); in cleanup_after_transfer()
1868 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in cleanup_after_transfer()
1879 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase0() argument
1903 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_out_phase0()
1904 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_out_phase0()
1905 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
1906 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), scsi_status, in data_out_phase0()
1908 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, STOPDMAXFER | CLRXFIFO); in data_out_phase0()
1926 (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & in data_out_phase0()
1934 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
1936 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
1937 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), in data_out_phase0()
1938 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_out_phase0()
1939 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_out_phase0()
1940 DC395x_read32(acb, TRM_S1040_DMA_CXCNT)); in data_out_phase0()
1953 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); in data_out_phase0()
2007 cleanup_after_transfer(acb, srb); in data_out_phase0()
2012 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase1() argument
2017 clear_fifo(acb, "data_out_phase1"); in data_out_phase1()
2019 data_io_transfer(acb, srb, XFERDATAOUT); in data_out_phase1()
2022 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase0() argument
2058 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) { in data_in_phase0()
2067 (DC395x_read16(acb, TRM_S1040_DMA_FIFOSTAT) & in data_in_phase0()
2079 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_in_phase0()
2080 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT)); in data_in_phase0()
2083 sc = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); in data_in_phase0()
2084 fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in data_in_phase0()
2096 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_in_phase0()
2097 DC395x_read32(acb, TRM_S1040_DMA_CXCNT), in data_in_phase0()
2114 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_in_phase0()
2133 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_in_phase0()
2144 fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in data_in_phase0()
2157 u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_in_phase0()
2165 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_in_phase0()
2189 (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & in data_in_phase0()
2208 DC395x_read8(acb, TRM_S1040_DMA_STATUS); in data_in_phase0()
2230 cleanup_after_transfer(acb, srb); in data_in_phase0()
2235 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase1() argument
2240 data_io_transfer(acb, srb, XFERDATAIN); in data_in_phase1()
2244 static void data_io_transfer(struct AdapterCtlBlk *acb, in data_io_transfer() argument
2254 if (srb == acb->tmp_srb) in data_io_transfer()
2262 u8 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS); in data_io_transfer()
2270 dump_register_info(acb, dcb, srb); in data_io_transfer()
2271 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in data_io_transfer()
2279 DC395x_write32(acb, TRM_S1040_DMA_XHIGHADDR, 0); in data_io_transfer()
2282 DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR, in data_io_transfer()
2287 DC395x_write32(acb, TRM_S1040_DMA_XCNT, in data_io_transfer()
2292 DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR, in data_io_transfer()
2294 DC395x_write32(acb, TRM_S1040_DMA_XCNT, in data_io_transfer()
2298 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, in data_io_transfer()
2300 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2302 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2304 DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir); in data_io_transfer()
2306 DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir); in data_io_transfer()
2307 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2320 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, in data_io_transfer()
2322 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2324 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2331 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_io_transfer()
2352 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *virt++); in data_io_transfer()
2362 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in data_io_transfer()
2366 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_io_transfer()
2371 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2387 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 2); in data_io_transfer()
2388 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_io_transfer()
2391 DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2392 DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2397 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K'); in data_io_transfer()
2398 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'G'); in data_io_transfer()
2400 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_io_transfer()
2402 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1); in data_io_transfer()
2406 DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2408 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K'); in data_io_transfer()
2411 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2414 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, bval); in data_io_transfer()
2419 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase0() argument
2424 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2425 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2428 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in status_phase0()
2429 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in status_phase0()
2433 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase1() argument
2439 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in status_phase1()
2440 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_COMP); in status_phase1()
2459 static inline void msgin_reject(struct AdapterCtlBlk *acb, in msgin_reject() argument
2473 static struct ScsiReqBlk *msgin_qtag(struct AdapterCtlBlk *acb, in msgin_qtag() argument
2501 enable_msgout_abort(acb, srb); in msgin_qtag()
2507 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2515 srb = acb->tmp_srb; in msgin_qtag()
2526 static inline void reprogram_regs(struct AdapterCtlBlk *acb, in reprogram_regs() argument
2529 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2530 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2531 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2532 set_xfer_rate(acb, dcb); in reprogram_regs()
2537 static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_async() argument
2549 reprogram_regs(acb, dcb); in msgin_set_async()
2552 build_wdtr(acb, dcb, srb); in msgin_set_async()
2560 static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_sync() argument
2621 build_wdtr(acb, dcb, srb); in msgin_set_sync()
2629 reprogram_regs(acb, dcb); in msgin_set_sync()
2633 static inline void msgin_set_nowide(struct AdapterCtlBlk *acb, in msgin_set_nowide() argument
2643 reprogram_regs(acb, dcb); in msgin_set_nowide()
2646 build_sdtr(acb, dcb, srb); in msgin_set_nowide()
2652 static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_wide() argument
2656 && acb->config & HCC_WIDE_CARD) ? 1 : 0; in msgin_set_wide()
2682 reprogram_regs(acb, dcb); in msgin_set_wide()
2685 build_sdtr(acb, dcb, srb); in msgin_set_wide()
2704 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase0() argument
2707 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0()
2710 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2711 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2722 msgin_qtag(acb, dcb, in msgin_phase0()
2727 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in msgin_phase0()
2731 msgin_set_async(acb, srb); in msgin_phase0()
2736 msgin_set_nowide(acb, srb); in msgin_phase0()
2739 enable_msgout_abort(acb, srb); in msgin_phase0()
2747 msgin_set_sync(acb, srb); in msgin_phase0()
2754 msgin_set_wide(acb, srb); in msgin_phase0()
2757 msgin_reject(acb, srb); in msgin_phase0()
2789 enable_msgout_abort(acb, srb); in msgin_phase0()
2802 msgin_reject(acb, srb); in msgin_phase0()
2807 acb->msg_len = 0; in msgin_phase0()
2810 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important ... you know! */ in msgin_phase0()
2811 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in msgin_phase0()
2815 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase1() argument
2819 clear_fifo(acb, "msgin_phase1"); in msgin_phase1()
2820 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1); in msgin_phase1()
2825 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgin_phase1()
2827 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_IN); in msgin_phase1()
2831 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop0() argument
2837 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop1() argument
2843 static void set_xfer_rate(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb) in set_xfer_rate() argument
2851 if (acb->scan_devices) { in set_xfer_rate()
2856 list_for_each_entry(i, &acb->dcb_list, list) in set_xfer_rate()
2866 static void disconnect(struct AdapterCtlBlk *acb) in disconnect() argument
2868 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect()
2875 acb->last_reset = in disconnect()
2877 HZ * acb->eeprom.delay_time; in disconnect()
2878 clear_fifo(acb, "disconnectEx"); in disconnect()
2879 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); in disconnect()
2883 acb->active_dcb = NULL; in disconnect()
2887 clear_fifo(acb, "disconnect"); in disconnect()
2888 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); in disconnect()
2894 waiting_process_next(acb); in disconnect()
2897 acb->last_reset = jiffies + HZ / 2 + 1; in disconnect()
2899 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2900 waiting_process_next(acb); in disconnect()
2924 || acb->scan_devices) { in disconnect()
2934 waiting_set_timer(acb, HZ / 20); in disconnect()
2937 u8 bval = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in disconnect()
2947 waiting_process_next(acb); in disconnect()
2956 srb_done(acb, dcb, srb); in disconnect()
2962 static void reselect(struct AdapterCtlBlk *acb) in reselect() argument
2964 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect()
2968 dprintkdbg(DBG_0, "reselect: acb=%p\n", acb); in reselect()
2970 clear_fifo(acb, "reselect"); in reselect()
2973 rsel_tar_lun_id = DC395x_read16(acb, TRM_S1040_SCSI_TARGETID); in reselect()
2979 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
2983 if (!acb->scan_devices) { in reselect()
2988 DC395x_read16(acb, TRM_S1040_SCSI_STATUS)); in reselect()
2994 waiting_set_timer(acb, HZ / 20); in reselect()
3005 dcb = find_dcb(acb, id, lun); in reselect()
3009 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3012 acb->active_dcb = dcb; in reselect()
3020 srb = acb->tmp_srb; in reselect()
3032 srb = acb->tmp_srb; in reselect()
3035 enable_msgout_abort(acb, srb); in reselect()
3039 enable_msgout_abort(acb, srb); in reselect()
3049 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); /* host ID */ in reselect()
3050 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
3051 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
3052 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
3053 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3055 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in reselect()
3087 dcb->acb->tag_max_num; in disc_tagq_set()
3096 static void add_dev(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in add_dev() argument
3107 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in pci_unmap_srb() argument
3116 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
3127 static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb, in pci_unmap_srb_sense() argument
3135 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3150 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in srb_done() argument
3168 pci_unmap_srb_sense(acb, srb); in srb_done()
3181 dcb->target_lun, status, acb->scan_devices); in srb_done()
3187 dcb->target_lun, status, acb->scan_devices); in srb_done()
3193 dcb->target_lun, status, acb->scan_devices); in srb_done()
3199 dcb->target_lun, status, acb->scan_devices); in srb_done()
3205 dcb->target_lun, status, acb->scan_devices); in srb_done()
3238 request_sense(acb, dcb, srb); in srb_done()
3249 waiting_set_timer(acb, HZ / 20); in srb_done()
3283 pci_unmap_srb(acb, srb); in srb_done()
3306 add_dev(acb, dcb, ptr); in srb_done()
3325 if (srb != acb->tmp_srb) { in srb_done()
3329 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
3335 waiting_process_next(acb); in srb_done()
3340 static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, in doing_srb_done() argument
3346 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
3357 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3360 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3361 pci_unmap_srb(acb, srb); in doing_srb_done()
3384 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3387 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3388 pci_unmap_srb(acb, srb); in doing_srb_done()
3405 static void reset_scsi_bus(struct AdapterCtlBlk *acb) in reset_scsi_bus() argument
3407 dprintkdbg(DBG_0, "reset_scsi_bus: acb=%p\n", acb); in reset_scsi_bus()
3408 acb->acb_flag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in reset_scsi_bus()
3409 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); in reset_scsi_bus()
3411 while (!(DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET)) in reset_scsi_bus()
3416 static void set_basic_config(struct AdapterCtlBlk *acb) in set_basic_config() argument
3420 DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout); in set_basic_config()
3421 if (acb->config & HCC_PARITY) in set_basic_config()
3426 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG0, bval); in set_basic_config()
3429 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG1, 0x03); /* was 0x13: default */ in set_basic_config()
3431 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in set_basic_config()
3433 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, 0x00); in set_basic_config()
3435 wval = DC395x_read16(acb, TRM_S1040_GEN_CONTROL) & 0x7F; in set_basic_config()
3436 DC395x_write16(acb, TRM_S1040_GEN_CONTROL, wval); in set_basic_config()
3438 wval = DC395x_read16(acb, TRM_S1040_DMA_CONFIG) & ~DMA_FIFO_CTRL; in set_basic_config()
3441 DC395x_write16(acb, TRM_S1040_DMA_CONFIG, wval); in set_basic_config()
3443 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in set_basic_config()
3445 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x7F); in set_basic_config()
3446 DC395x_write8(acb, TRM_S1040_DMA_INTEN, EN_SCSIINTR | EN_DMAXFERERROR in set_basic_config()
3452 static void scsi_reset_detect(struct AdapterCtlBlk *acb) in scsi_reset_detect() argument
3454 dprintkl(KERN_INFO, "scsi_reset_detect: acb=%p\n", acb); in scsi_reset_detect()
3456 if (timer_pending(&acb->waiting_timer)) in scsi_reset_detect()
3457 del_timer(&acb->waiting_timer); in scsi_reset_detect()
3459 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in scsi_reset_detect()
3460 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in scsi_reset_detect()
3464 acb->last_reset = in scsi_reset_detect()
3466 HZ * acb->eeprom.delay_time; in scsi_reset_detect()
3468 clear_fifo(acb, "scsi_reset_detect"); in scsi_reset_detect()
3469 set_basic_config(acb); in scsi_reset_detect()
3473 if (acb->acb_flag & RESET_DEV) { /* RESET_DETECT, RESET_DONE, RESET_DEV */ in scsi_reset_detect()
3474 acb->acb_flag |= RESET_DONE; in scsi_reset_detect()
3476 acb->acb_flag |= RESET_DETECT; in scsi_reset_detect()
3477 reset_dev_param(acb); in scsi_reset_detect()
3478 doing_srb_done(acb, DID_RESET, NULL, 1); in scsi_reset_detect()
3480 acb->active_dcb = NULL; in scsi_reset_detect()
3481 acb->acb_flag = 0; in scsi_reset_detect()
3482 waiting_process_next(acb); in scsi_reset_detect()
3487 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in request_sense() argument
3511 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
3520 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */ in request_sense()
3525 waiting_set_timer(acb, HZ / 100); in request_sense()
3543 static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb, in device_alloc() argument
3546 struct NvRamType *eeprom = &acb->eeprom; in device_alloc()
3554 dcb->acb = NULL; in device_alloc()
3578 && (acb->config & HCC_WIDE_CARD)) in device_alloc()
3590 list_for_each_entry(iter, &acb->dcb_list, list) in device_alloc()
3621 static void adapter_add_device(struct AdapterCtlBlk *acb, in adapter_add_device() argument
3625 dcb->acb = acb; in adapter_add_device()
3628 if (list_empty(&acb->dcb_list)) in adapter_add_device()
3629 acb->dcb_run_robin = dcb; in adapter_add_device()
3632 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3635 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3636 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3649 static void adapter_remove_device(struct AdapterCtlBlk *acb, in adapter_remove_device() argument
3658 if (acb->active_dcb == dcb) in adapter_remove_device()
3659 acb->active_dcb = NULL; in adapter_remove_device()
3660 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3661 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3664 list_for_each_entry_safe(i, tmp, &acb->dcb_list, list) in adapter_remove_device()
3671 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3672 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3673 dcb->acb = NULL; in adapter_remove_device()
3684 static void adapter_remove_and_free_device(struct AdapterCtlBlk *acb, in adapter_remove_and_free_device() argument
3694 adapter_remove_device(acb, dcb); in adapter_remove_and_free_device()
3705 static void adapter_remove_and_free_all_devices(struct AdapterCtlBlk* acb) in adapter_remove_and_free_all_devices() argument
3710 list_size(&acb->dcb_list)); in adapter_remove_and_free_all_devices()
3712 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3713 adapter_remove_and_free_device(acb, dcb); in adapter_remove_and_free_all_devices()
3726 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_alloc() local
3729 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_alloc()
3732 adapter_add_device(acb, dcb); in dc395x_slave_alloc()
3746 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_destroy() local
3747 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_destroy()
3749 adapter_remove_and_free_device(acb, dcb); in dc395x_slave_destroy()
4071 static void adapter_sg_tables_free(struct AdapterCtlBlk *acb) in adapter_sg_tables_free() argument
4077 kfree(acb->srb_array[i].segment_x); in adapter_sg_tables_free()
4084 static int adapter_sg_tables_alloc(struct AdapterCtlBlk *acb) in adapter_sg_tables_alloc() argument
4095 acb->srb_array[i].segment_x = NULL; in adapter_sg_tables_alloc()
4101 adapter_sg_tables_free(acb); in adapter_sg_tables_alloc()
4108 acb->srb_array[srb_idx++].segment_x = in adapter_sg_tables_alloc()
4112 acb->srb.segment_x = in adapter_sg_tables_alloc()
4130 static void adapter_print_config(struct AdapterCtlBlk *acb) in adapter_print_config() argument
4134 bval = DC395x_read8(acb, TRM_S1040_GEN_STATUS); in adapter_print_config()
4146 bval = DC395x_read8(acb, TRM_S1040_GEN_CONTROL); in adapter_print_config()
4174 static void adapter_init_params(struct AdapterCtlBlk *acb) in adapter_init_params() argument
4176 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_params()
4183 INIT_LIST_HEAD(&acb->dcb_list); in adapter_init_params()
4184 acb->dcb_run_robin = NULL; in adapter_init_params()
4185 acb->active_dcb = NULL; in adapter_init_params()
4187 INIT_LIST_HEAD(&acb->srb_free_list); in adapter_init_params()
4189 acb->tmp_srb = &acb->srb; in adapter_init_params()
4190 timer_setup(&acb->waiting_timer, waiting_timeout, 0); in adapter_init_params()
4191 timer_setup(&acb->selto_timer, NULL, 0); in adapter_init_params()
4193 acb->srb_count = DC395x_MAX_SRB_CNT; in adapter_init_params()
4195 acb->sel_timeout = DC395x_SEL_TIMEOUT; /* timeout=250ms */ in adapter_init_params()
4198 acb->tag_max_num = 1 << eeprom->max_tag; in adapter_init_params()
4199 if (acb->tag_max_num > 30) in adapter_init_params()
4200 acb->tag_max_num = 30; in adapter_init_params()
4202 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in adapter_init_params()
4203 acb->gmode2 = eeprom->channel_cfg; in adapter_init_params()
4204 acb->config = 0; /* NOTE: actually set in adapter_init_chip */ in adapter_init_params()
4207 acb->lun_chk = 1; in adapter_init_params()
4208 acb->scan_devices = 1; in adapter_init_params()
4210 acb->scsi_host->this_id = eeprom->scsi_id; in adapter_init_params()
4211 acb->hostid_bit = (1 << acb->scsi_host->this_id); in adapter_init_params()
4214 acb->dcb_map[i] = 0; in adapter_init_params()
4216 acb->msg_len = 0; in adapter_init_params()
4219 for (i = 0; i < acb->srb_count - 1; i++) in adapter_init_params()
4220 list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); in adapter_init_params()
4238 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in adapter_init_scsi_host() local
4239 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_scsi_host()
4245 host->io_port = acb->io_port_base; in adapter_init_scsi_host()
4246 host->n_io_port = acb->io_port_len; in adapter_init_scsi_host()
4248 host->unique_id = acb->io_port_base; in adapter_init_scsi_host()
4249 host->irq = acb->irq_level; in adapter_init_scsi_host()
4250 acb->last_reset = jiffies; in adapter_init_scsi_host()
4272 static void adapter_init_chip(struct AdapterCtlBlk *acb) in adapter_init_chip() argument
4274 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_chip()
4277 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); in adapter_init_chip()
4278 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); in adapter_init_chip()
4281 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in adapter_init_chip()
4284 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in adapter_init_chip()
4288 acb->config = HCC_AUTOTERM | HCC_PARITY; in adapter_init_chip()
4289 if (DC395x_read8(acb, TRM_S1040_GEN_STATUS) & WIDESCSI) in adapter_init_chip()
4290 acb->config |= HCC_WIDE_CARD; in adapter_init_chip()
4293 acb->config |= HCC_SCSI_RESET; in adapter_init_chip()
4295 if (acb->config & HCC_SCSI_RESET) { in adapter_init_chip()
4297 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); in adapter_init_chip()
4303 acb->last_reset = in adapter_init_chip()
4305 HZ * acb->eeprom.delay_time; in adapter_init_chip()
4326 static int adapter_init(struct AdapterCtlBlk *acb, unsigned long io_port, in adapter_init() argument
4334 acb->io_port_base = io_port; in adapter_init()
4335 acb->io_port_len = io_port_len; in adapter_init()
4337 if (request_irq(irq, dc395x_interrupt, IRQF_SHARED, DC395X_NAME, acb)) { in adapter_init()
4343 acb->irq_level = irq; in adapter_init()
4346 check_eeprom(&acb->eeprom, io_port); in adapter_init()
4347 print_eeprom_settings(&acb->eeprom); in adapter_init()
4350 adapter_init_params(acb); in adapter_init()
4353 adapter_print_config(acb); in adapter_init()
4355 if (adapter_sg_tables_alloc(acb)) { in adapter_init()
4359 adapter_init_scsi_host(acb->scsi_host); in adapter_init()
4360 adapter_init_chip(acb); in adapter_init()
4361 set_basic_config(acb); in adapter_init()
4366 acb, acb->dcb_map, acb->srb_array, sizeof(struct AdapterCtlBlk), in adapter_init()
4371 if (acb->irq_level) in adapter_init()
4372 free_irq(acb->irq_level, acb); in adapter_init()
4373 if (acb->io_port_base) in adapter_init()
4374 release_region(acb->io_port_base, acb->io_port_len); in adapter_init()
4375 adapter_sg_tables_free(acb); in adapter_init()
4388 static void adapter_uninit_chip(struct AdapterCtlBlk *acb) in adapter_uninit_chip() argument
4391 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0); in adapter_uninit_chip()
4392 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0); in adapter_uninit_chip()
4395 if (acb->config & HCC_SCSI_RESET) in adapter_uninit_chip()
4396 reset_scsi_bus(acb); in adapter_uninit_chip()
4399 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in adapter_uninit_chip()
4411 static void adapter_uninit(struct AdapterCtlBlk *acb) in adapter_uninit() argument
4414 DC395x_LOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4417 if (timer_pending(&acb->waiting_timer)) in adapter_uninit()
4418 del_timer(&acb->waiting_timer); in adapter_uninit()
4419 if (timer_pending(&acb->selto_timer)) in adapter_uninit()
4420 del_timer(&acb->selto_timer); in adapter_uninit()
4422 adapter_uninit_chip(acb); in adapter_uninit()
4423 adapter_remove_and_free_all_devices(acb); in adapter_uninit()
4424 DC395x_UNLOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4426 if (acb->irq_level) in adapter_uninit()
4427 free_irq(acb->irq_level, acb); in adapter_uninit()
4428 if (acb->io_port_base) in adapter_uninit()
4429 release_region(acb->io_port_base, acb->io_port_len); in adapter_uninit()
4431 adapter_sg_tables_free(acb); in adapter_uninit()
4442 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in dc395x_show_info() local
4451 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4455 (acb->config & HCC_WIDE_CARD) ? "Wide" : ""); in dc395x_show_info()
4456 seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base); in dc395x_show_info()
4457 seq_printf(m, "irq_level 0x%04x, ", acb->irq_level); in dc395x_show_info()
4458 seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000); in dc395x_show_info()
4463 seq_printf(m, "tag_max_num %i", acb->tag_max_num); in dc395x_show_info()
4466 DC395x_read8(acb, TRM_S1040_SCSI_CONFIG1)); in dc395x_show_info()
4467 seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time); in dc395x_show_info()
4470 seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); in dc395x_show_info()
4471 seq_printf(m, "Map of attached LUNs: %8ph\n", &acb->dcb_map[0]); in dc395x_show_info()
4472 seq_printf(m, " %8ph\n", &acb->dcb_map[8]); in dc395x_show_info()
4478 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4508 if (timer_pending(&acb->waiting_timer)) in dc395x_show_info()
4513 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4532 seq_printf(m, "DCB list for ACB %p:\n", acb); in dc395x_show_info()
4533 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4539 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4593 struct AdapterCtlBlk *acb = NULL; in dc395x_init_one() local
4618 acb = (struct AdapterCtlBlk*)scsi_host->hostdata; in dc395x_init_one()
4619 acb->scsi_host = scsi_host; in dc395x_init_one()
4620 acb->dev = dev; in dc395x_init_one()
4623 if (adapter_init(acb, io_port_base, io_port_len, irq)) { in dc395x_init_one()
4625 acb = NULL; in dc395x_init_one()
4642 if (acb != NULL) in dc395x_init_one()
4643 adapter_uninit(acb); in dc395x_init_one()
4660 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata); in dc395x_remove_one() local
4662 dprintkdbg(DBG_0, "dc395x_remove_one: acb=%p\n", acb); in dc395x_remove_one()
4665 adapter_uninit(acb); in dc395x_remove_one()