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
271 struct AdapterCtlBlk *acb; member
344 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
346 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
348 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
350 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
352 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
354 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
356 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
358 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
360 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
362 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
364 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
366 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
368 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
370 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
372 static void set_basic_config(struct AdapterCtlBlk *acb);
373 static void cleanup_after_transfer(struct AdapterCtlBlk *acb,
375 static void reset_scsi_bus(struct AdapterCtlBlk *acb);
376 static void data_io_transfer(struct AdapterCtlBlk *acb,
378 static void disconnect(struct AdapterCtlBlk *acb);
379 static void reselect(struct AdapterCtlBlk *acb);
380 static u8 start_scsi(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
382 static inline void enable_msgout_abort(struct AdapterCtlBlk *acb,
386 static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_code,
388 static void scsi_reset_detect(struct AdapterCtlBlk *acb);
389 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb);
390 static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb,
392 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
394 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
396 static void set_xfer_rate(struct AdapterCtlBlk *acb,
757 static struct ScsiReqBlk *srb_get_free(struct AdapterCtlBlk *acb) in srb_get_free() argument
759 struct list_head *head = &acb->srb_free_list; in srb_get_free()
771 static void srb_free_insert(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in srb_free_insert() argument
774 list_add_tail(&srb->list, &acb->srb_free_list); in srb_free_insert()
856 static void waiting_set_timer(struct AdapterCtlBlk *acb, unsigned long to) in waiting_set_timer() argument
858 if (timer_pending(&acb->waiting_timer)) in waiting_set_timer()
860 init_timer(&acb->waiting_timer); in waiting_set_timer()
861 acb->waiting_timer.function = waiting_timeout; in waiting_set_timer()
862 acb->waiting_timer.data = (unsigned long) acb; in waiting_set_timer()
863 if (time_before(jiffies + to, acb->last_reset - HZ / 2)) in waiting_set_timer()
864 acb->waiting_timer.expires = in waiting_set_timer()
865 acb->last_reset - HZ / 2 + 1; in waiting_set_timer()
867 acb->waiting_timer.expires = jiffies + to + 1; in waiting_set_timer()
868 add_timer(&acb->waiting_timer); in waiting_set_timer()
873 static void waiting_process_next(struct AdapterCtlBlk *acb) in waiting_process_next() argument
879 struct list_head *dcb_list_head = &acb->dcb_list; in waiting_process_next()
881 if (acb->active_dcb in waiting_process_next()
882 || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) in waiting_process_next()
885 if (timer_pending(&acb->waiting_timer)) in waiting_process_next()
886 del_timer(&acb->waiting_timer); in waiting_process_next()
896 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
903 acb->dcb_run_robin = start; in waiting_process_next()
916 acb->dcb_run_robin = dcb_get_next(dcb_list_head, in waiting_process_next()
917 acb->dcb_run_robin); in waiting_process_next()
928 if (!start_scsi(acb, pos, srb)) in waiting_process_next()
931 waiting_set_timer(acb, HZ/50); in waiting_process_next()
942 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)ptr; in waiting_timeout() local
944 "waiting_timeout: Queue woken up by timer. acb=%p\n", acb); in waiting_timeout()
945 DC395x_LOCK_IO(acb->scsi_host, flags); in waiting_timeout()
946 waiting_process_next(acb); in waiting_timeout()
947 DC395x_UNLOCK_IO(acb->scsi_host, flags); in waiting_timeout()
952 static struct DeviceCtlBlk *find_dcb(struct AdapterCtlBlk *acb, u8 id, u8 lun) in find_dcb() argument
954 return acb->children[id][lun]; in find_dcb()
959 static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in send_srb() argument
964 acb->active_dcb || in send_srb()
965 (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { in send_srb()
967 waiting_process_next(acb); in send_srb()
971 if (!start_scsi(acb, dcb, srb)) in send_srb()
975 waiting_set_timer(acb, HZ / 50); in send_srb()
1051 srb->sg_bus_addr = pci_map_single(dcb->acb->dev, in build_srb()
1087 struct AdapterCtlBlk *acb = in dc395x_queue_command_lck() local
1096 if (cmd->device->id >= acb->scsi_host->max_id || in dc395x_queue_command_lck()
1097 cmd->device->lun >= acb->scsi_host->max_lun || in dc395x_queue_command_lck()
1103 if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) { in dc395x_queue_command_lck()
1110 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
1122 srb = srb_get_free(acb); in dc395x_queue_command_lck()
1138 waiting_process_next(acb); in dc395x_queue_command_lck()
1141 send_srb(acb, srb); in dc395x_queue_command_lck()
1167 struct AdapterCtlBlk *acb; in DEF_SCSI_QCMD() local
1171 acb = (struct AdapterCtlBlk *)sdev->host->hostdata; in DEF_SCSI_QCMD()
1176 if ((acb->gmode2 & NAC_GREATER_1G) && (cylinders > 1024)) { in DEF_SCSI_QCMD()
1191 static void dump_register_info(struct AdapterCtlBlk *acb, in dump_register_info() argument
1195 struct pci_dev *dev = acb->dev; in dump_register_info()
1198 dcb = acb->active_dcb; in dump_register_info()
1216 (acb->active_dcb) ? "" : "not"); in dump_register_info()
1222 DC395x_read16(acb, TRM_S1040_SCSI_STATUS), in dump_register_info()
1223 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in dump_register_info()
1224 DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL), in dump_register_info()
1225 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS), in dump_register_info()
1226 DC395x_read8(acb, TRM_S1040_SCSI_SYNC), in dump_register_info()
1227 DC395x_read8(acb, TRM_S1040_SCSI_TARGETID), in dump_register_info()
1228 DC395x_read8(acb, TRM_S1040_SCSI_IDMSG), in dump_register_info()
1229 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), in dump_register_info()
1230 DC395x_read8(acb, TRM_S1040_SCSI_INTEN), in dump_register_info()
1231 DC395x_read16(acb, TRM_S1040_SCSI_CONFIG0), in dump_register_info()
1232 DC395x_read8(acb, TRM_S1040_SCSI_CONFIG2), in dump_register_info()
1233 DC395x_read8(acb, TRM_S1040_SCSI_COMMAND), in dump_register_info()
1234 DC395x_read8(acb, TRM_S1040_SCSI_TIMEOUT)); in dump_register_info()
1238 DC395x_read16(acb, TRM_S1040_DMA_COMMAND), in dump_register_info()
1239 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in dump_register_info()
1240 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in dump_register_info()
1241 DC395x_read8(acb, TRM_S1040_DMA_STATUS), in dump_register_info()
1242 DC395x_read8(acb, TRM_S1040_DMA_INTEN), in dump_register_info()
1243 DC395x_read16(acb, TRM_S1040_DMA_CONFIG), in dump_register_info()
1244 DC395x_read32(acb, TRM_S1040_DMA_XCNT), in dump_register_info()
1245 DC395x_read32(acb, TRM_S1040_DMA_CXCNT), in dump_register_info()
1246 DC395x_read32(acb, TRM_S1040_DMA_XHIGHADDR), in dump_register_info()
1247 DC395x_read32(acb, TRM_S1040_DMA_XLOWADDR)); in dump_register_info()
1250 DC395x_read8(acb, TRM_S1040_GEN_CONTROL), in dump_register_info()
1251 DC395x_read8(acb, TRM_S1040_GEN_STATUS), in dump_register_info()
1252 DC395x_read8(acb, TRM_S1040_GEN_TIMER), in dump_register_info()
1257 static inline void clear_fifo(struct AdapterCtlBlk *acb, char *txt) in clear_fifo() argument
1260 u8 lines = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in clear_fifo()
1261 u8 fifocnt = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in clear_fifo()
1267 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); in clear_fifo()
1271 static void reset_dev_param(struct AdapterCtlBlk *acb) in reset_dev_param() argument
1274 struct NvRamType *eeprom = &acb->eeprom; in reset_dev_param()
1275 dprintkdbg(DBG_0, "reset_dev_param: acb=%p\n", acb); in reset_dev_param()
1277 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
1288 || !(acb->config & HCC_WIDE_CARD)) in reset_dev_param()
1301 struct AdapterCtlBlk *acb = in __dc395x_eh_bus_reset() local
1307 if (timer_pending(&acb->waiting_timer)) in __dc395x_eh_bus_reset()
1308 del_timer(&acb->waiting_timer); in __dc395x_eh_bus_reset()
1313 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); in __dc395x_eh_bus_reset()
1314 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); in __dc395x_eh_bus_reset()
1315 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in __dc395x_eh_bus_reset()
1316 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in __dc395x_eh_bus_reset()
1318 reset_scsi_bus(acb); in __dc395x_eh_bus_reset()
1322 acb->last_reset = in __dc395x_eh_bus_reset()
1324 HZ * acb->eeprom.delay_time; in __dc395x_eh_bus_reset()
1330 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in __dc395x_eh_bus_reset()
1331 clear_fifo(acb, "eh_bus_reset"); in __dc395x_eh_bus_reset()
1333 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in __dc395x_eh_bus_reset()
1334 set_basic_config(acb); in __dc395x_eh_bus_reset()
1336 reset_dev_param(acb); in __dc395x_eh_bus_reset()
1337 doing_srb_done(acb, DID_RESET, cmd, 0); in __dc395x_eh_bus_reset()
1338 acb->active_dcb = NULL; in __dc395x_eh_bus_reset()
1339 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ in __dc395x_eh_bus_reset()
1340 waiting_process_next(acb); in __dc395x_eh_bus_reset()
1367 struct AdapterCtlBlk *acb = in dc395x_eh_abort() local
1374 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1383 pci_unmap_srb_sense(acb, srb); in dc395x_eh_abort()
1384 pci_unmap_srb(acb, srb); in dc395x_eh_abort()
1386 srb_free_insert(acb, srb); in dc395x_eh_abort()
1403 static void build_sdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_sdtr() argument
1431 static void build_wdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_wdtr() argument
1435 (acb->config & HCC_WIDE_CARD)) ? 1 : 0; in build_wdtr()
1458 static void selto_timer(struct AdapterCtlBlk *acb)
1460 if (timer_pending(&acb->selto_timer))
1462 acb->selto_timer.function = selection_timeout_missed;
1463 acb->selto_timer.data = (unsigned long) acb;
1465 (jiffies + HZ, acb->last_reset + HZ / 2))
1466 acb->selto_timer.expires =
1467 acb->last_reset + HZ / 2 + 1;
1469 acb->selto_timer.expires = jiffies + HZ + 1;
1470 add_timer(&acb->selto_timer);
1477 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)ptr;
1480 if (!acb->active_dcb || !acb->active_dcb->active_srb) {
1484 DC395x_LOCK_IO(acb->scsi_host, flags);
1485 srb = acb->active_dcb->active_srb;
1486 disconnect(acb);
1487 DC395x_UNLOCK_IO(acb->scsi_host, flags);
1492 static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb, in start_scsi() argument
1503 s_stat = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in start_scsi()
1505 s_stat2 = DC395x_read16(acb, TRM_S1040_SCSI_STATUS); in start_scsi()
1524 if (acb->active_dcb) { in start_scsi()
1528 acb->active_dcb->active_srb ? in start_scsi()
1529 acb->active_dcb->active_srb->cmd : 0); in start_scsi()
1532 if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { in start_scsi()
1538 if (time_before(jiffies, acb->last_reset - HZ / 2)) { in start_scsi()
1544 clear_fifo(acb, "start_scsi"); in start_scsi()
1545 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in start_scsi()
1546 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1547 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1548 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1572 build_wdtr(acb, dcb, srb); in start_scsi()
1578 build_sdtr(acb, dcb, srb); in start_scsi()
1583 build_wdtr(acb, dcb, srb); in start_scsi()
1589 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, identify_message); in start_scsi()
1610 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1615 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, MSG_SIMPLE_QTAG); in start_scsi()
1616 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, tag_number); in start_scsi()
1629 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE); in start_scsi()
1630 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1631 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1632 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1633 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE); in start_scsi()
1634 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in start_scsi()
1638 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++); in start_scsi()
1641 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1643 if (DC395x_read16(acb, TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { in start_scsi()
1663 acb->active_dcb = dcb; in start_scsi()
1666 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in start_scsi()
1669 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, scsicommand); in start_scsi()
1676 DC395x_write16 (acb, TRM_S1040_SCSI_CONTROL, DO_SETATN); \
1681 static inline void enable_msgout_abort(struct AdapterCtlBlk *acb, in enable_msgout_abort() argument
1699 static void dc395x_handle_interrupt(struct AdapterCtlBlk *acb, in dc395x_handle_interrupt() argument
1710 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1713 scsi_intstatus = DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in dc395x_handle_interrupt()
1723 if (timer_pending(&acb->selto_timer)) in dc395x_handle_interrupt()
1724 del_timer(&acb->selto_timer); in dc395x_handle_interrupt()
1727 disconnect(acb); /* bus free interrupt */ in dc395x_handle_interrupt()
1731 reselect(acb); in dc395x_handle_interrupt()
1739 scsi_reset_detect(acb); in dc395x_handle_interrupt()
1743 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1753 enable_msgout_abort(acb, srb); in dc395x_handle_interrupt()
1773 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1796 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1799 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1805 struct AdapterCtlBlk *acb = dev_id; in dc395x_interrupt() local
1813 scsi_status = DC395x_read16(acb, TRM_S1040_SCSI_STATUS); in dc395x_interrupt()
1814 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS); in dc395x_interrupt()
1817 dc395x_handle_interrupt(acb, scsi_status); in dc395x_interrupt()
1825 if (acb->active_dcb) { in dc395x_interrupt()
1826 acb->active_dcb-> flag |= ABORT_DEV_; in dc395x_interrupt()
1827 if (acb->active_dcb->active_srb) in dc395x_interrupt()
1828 enable_msgout_abort(acb, acb->active_dcb->active_srb); in dc395x_interrupt()
1830 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, ABORTXFER | CLRXFIFO); in dc395x_interrupt()
1833 acb = NULL; in dc395x_interrupt()
1842 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase0() argument
1849 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgout_phase0()
1854 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase1() argument
1861 clear_fifo(acb, "msgout_phase1"); in msgout_phase1()
1871 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, MSG_NOP); in msgout_phase1()
1872 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgout_phase1()
1873 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in msgout_phase1()
1878 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr++); in msgout_phase1()
1883 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in msgout_phase1()
1887 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase0() argument
1891 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in command_phase0()
1895 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase1() argument
1903 clear_fifo(acb, "command_phase1"); in command_phase1()
1904 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_CLRATN); in command_phase1()
1908 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *ptr); in command_phase1()
1912 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, REQUEST_SENSE); in command_phase1()
1913 dcb = acb->active_dcb; in command_phase1()
1915 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1916 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1917 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1918 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, SCSI_SENSE_BUFFERSIZE); in command_phase1()
1919 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in command_phase1()
1923 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in command_phase1()
1925 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); in command_phase1()
1979 acb->dev, in sg_update_list()
2011 static void cleanup_after_transfer(struct AdapterCtlBlk *acb, in cleanup_after_transfer() argument
2015 if (DC395x_read16(acb, TRM_S1040_DMA_COMMAND) & 0x0001) { /* read */ in cleanup_after_transfer()
2016 if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40)) in cleanup_after_transfer()
2017 clear_fifo(acb, "cleanup/in"); in cleanup_after_transfer()
2018 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) in cleanup_after_transfer()
2019 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in cleanup_after_transfer()
2021 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) in cleanup_after_transfer()
2022 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in cleanup_after_transfer()
2023 if (!(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & 0x40)) in cleanup_after_transfer()
2024 clear_fifo(acb, "cleanup/out"); in cleanup_after_transfer()
2026 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); in cleanup_after_transfer()
2037 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase0() argument
2061 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_out_phase0()
2062 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_out_phase0()
2063 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
2064 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), scsi_status, in data_out_phase0()
2066 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, STOPDMAXFER | CLRXFIFO); in data_out_phase0()
2084 (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & in data_out_phase0()
2092 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
2094 DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT), in data_out_phase0()
2095 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER), in data_out_phase0()
2096 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_out_phase0()
2097 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_out_phase0()
2098 DC395x_read32(acb, TRM_S1040_DMA_CXCNT)); in data_out_phase0()
2111 DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); in data_out_phase0()
2165 cleanup_after_transfer(acb, srb); in data_out_phase0()
2170 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase1() argument
2175 clear_fifo(acb, "data_out_phase1"); in data_out_phase1()
2177 data_io_transfer(acb, srb, XFERDATAOUT); in data_out_phase1()
2180 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase0() argument
2216 if (!(DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT) & 0x80)) { in data_in_phase0()
2225 (DC395x_read16(acb, TRM_S1040_DMA_FIFOSTAT) & in data_in_phase0()
2237 DC395x_read8(acb, TRM_S1040_DMA_FIFOCNT), in data_in_phase0()
2238 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT)); in data_in_phase0()
2241 sc = DC395x_read32(acb, TRM_S1040_SCSI_COUNTER); in data_in_phase0()
2242 fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in data_in_phase0()
2254 DC395x_read8(acb, TRM_S1040_DMA_FIFOSTAT), in data_in_phase0()
2255 DC395x_read32(acb, TRM_S1040_DMA_CXCNT), in data_in_phase0()
2272 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_in_phase0()
2291 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_in_phase0()
2302 fc = DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT); in data_in_phase0()
2315 u8 byte = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_in_phase0()
2323 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_in_phase0()
2347 (u32)(DC395x_read8(acb, TRM_S1040_SCSI_FIFOCNT) & in data_in_phase0()
2366 DC395x_read8(acb, TRM_S1040_DMA_STATUS); in data_in_phase0()
2388 cleanup_after_transfer(acb, srb); in data_in_phase0()
2393 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase1() argument
2398 data_io_transfer(acb, srb, XFERDATAIN); in data_in_phase1()
2402 static void data_io_transfer(struct AdapterCtlBlk *acb, in data_io_transfer() argument
2412 if (srb == acb->tmp_srb) in data_io_transfer()
2420 u8 dma_status = DC395x_read8(acb, TRM_S1040_DMA_STATUS); in data_io_transfer()
2428 dump_register_info(acb, dcb, srb); in data_io_transfer()
2429 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, CLRXFIFO); in data_io_transfer()
2437 DC395x_write32(acb, TRM_S1040_DMA_XHIGHADDR, 0); in data_io_transfer()
2440 DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR, in data_io_transfer()
2445 DC395x_write32(acb, TRM_S1040_DMA_XCNT, in data_io_transfer()
2450 DC395x_write32(acb, TRM_S1040_DMA_XLOWADDR, in data_io_transfer()
2452 DC395x_write32(acb, TRM_S1040_DMA_XCNT, in data_io_transfer()
2456 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, in data_io_transfer()
2458 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2460 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2462 DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir); in data_io_transfer()
2464 DC395x_write16(acb, TRM_S1040_DMA_COMMAND, io_dir); in data_io_transfer()
2465 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2478 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, in data_io_transfer()
2480 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2482 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2489 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_io_transfer()
2510 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, *virt++); in data_io_transfer()
2520 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 0); in data_io_transfer()
2524 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_io_transfer()
2529 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, in data_io_transfer()
2546 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 2); in data_io_transfer()
2547 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, in data_io_transfer()
2550 data = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2551 data2 = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2556 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K'); in data_io_transfer()
2557 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'G'); in data_io_transfer()
2559 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG2, 0); in data_io_transfer()
2561 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1); in data_io_transfer()
2565 data = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in data_io_transfer()
2567 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, 'K'); in data_io_transfer()
2570 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in data_io_transfer()
2573 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, bval); in data_io_transfer()
2578 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase0() argument
2583 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2584 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2587 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in status_phase0()
2588 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in status_phase0()
2592 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase1() argument
2598 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in status_phase1()
2599 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_COMP); in status_phase1()
2618 static inline void msgin_reject(struct AdapterCtlBlk *acb, in msgin_reject() argument
2632 static struct ScsiReqBlk *msgin_qtag(struct AdapterCtlBlk *acb, in msgin_qtag() argument
2660 enable_msgout_abort(acb, srb); in msgin_qtag()
2666 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2674 srb = acb->tmp_srb; in msgin_qtag()
2685 static inline void reprogram_regs(struct AdapterCtlBlk *acb, in reprogram_regs() argument
2688 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2689 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2690 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2691 set_xfer_rate(acb, dcb); in reprogram_regs()
2696 static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_async() argument
2708 reprogram_regs(acb, dcb); in msgin_set_async()
2711 build_wdtr(acb, dcb, srb); in msgin_set_async()
2719 static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_sync() argument
2780 build_wdtr(acb, dcb, srb); in msgin_set_sync()
2788 reprogram_regs(acb, dcb); in msgin_set_sync()
2792 static inline void msgin_set_nowide(struct AdapterCtlBlk *acb, in msgin_set_nowide() argument
2802 reprogram_regs(acb, dcb); in msgin_set_nowide()
2805 build_sdtr(acb, dcb, srb); in msgin_set_nowide()
2811 static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_wide() argument
2815 && acb->config & HCC_WIDE_CARD) ? 1 : 0; in msgin_set_wide()
2841 reprogram_regs(acb, dcb); in msgin_set_wide()
2844 build_sdtr(acb, dcb, srb); in msgin_set_wide()
2863 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase0() argument
2866 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0()
2869 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2870 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2881 msgin_qtag(acb, dcb, in msgin_phase0()
2886 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, in msgin_phase0()
2890 msgin_set_async(acb, srb); in msgin_phase0()
2895 msgin_set_nowide(acb, srb); in msgin_phase0()
2898 enable_msgout_abort(acb, srb); in msgin_phase0()
2906 msgin_set_sync(acb, srb); in msgin_phase0()
2913 msgin_set_wide(acb, srb); in msgin_phase0()
2916 msgin_reject(acb, srb); in msgin_phase0()
2948 enable_msgout_abort(acb, srb); in msgin_phase0()
2961 msgin_reject(acb, srb); in msgin_phase0()
2966 acb->msg_len = 0; in msgin_phase0()
2969 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important ... you know! */ in msgin_phase0()
2970 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in msgin_phase0()
2974 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase1() argument
2978 clear_fifo(acb, "msgin_phase1"); in msgin_phase1()
2979 DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, 1); in msgin_phase1()
2984 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in msgin_phase1()
2986 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_FIFO_IN); in msgin_phase1()
2990 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop0() argument
2996 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop1() argument
3002 static void set_xfer_rate(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb) in set_xfer_rate() argument
3010 if (acb->scan_devices) { in set_xfer_rate()
3015 list_for_each_entry(i, &acb->dcb_list, list) in set_xfer_rate()
3025 static void disconnect(struct AdapterCtlBlk *acb) in disconnect() argument
3027 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect()
3034 acb->last_reset = in disconnect()
3036 HZ * acb->eeprom.delay_time; in disconnect()
3037 clear_fifo(acb, "disconnectEx"); in disconnect()
3038 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); in disconnect()
3042 acb->active_dcb = NULL; in disconnect()
3046 clear_fifo(acb, "disconnect"); in disconnect()
3047 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); in disconnect()
3053 waiting_process_next(acb); in disconnect()
3056 acb->last_reset = jiffies + HZ / 2 + 1; in disconnect()
3058 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
3059 waiting_process_next(acb); in disconnect()
3083 || acb->scan_devices) { in disconnect()
3093 waiting_set_timer(acb, HZ / 20); in disconnect()
3096 u8 bval = DC395x_read8(acb, TRM_S1040_SCSI_SIGNAL); in disconnect()
3106 waiting_process_next(acb); in disconnect()
3115 srb_done(acb, dcb, srb); in disconnect()
3121 static void reselect(struct AdapterCtlBlk *acb) in reselect() argument
3123 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect()
3128 dprintkdbg(DBG_0, "reselect: acb=%p\n", acb); in reselect()
3130 clear_fifo(acb, "reselect"); in reselect()
3133 rsel_tar_lun_id = DC395x_read16(acb, TRM_S1040_SCSI_TARGETID); in reselect()
3139 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3143 if (!acb->scan_devices) { in reselect()
3148 DC395x_read16(acb, TRM_S1040_SCSI_STATUS)); in reselect()
3155 waiting_set_timer(acb, HZ / 20); in reselect()
3166 dcb = find_dcb(acb, id, lun); in reselect()
3170 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3173 acb->active_dcb = dcb; in reselect()
3181 srb = acb->tmp_srb; in reselect()
3193 srb = acb->tmp_srb; in reselect()
3196 enable_msgout_abort(acb, srb); in reselect()
3200 enable_msgout_abort(acb, srb); in reselect()
3210 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); /* host ID */ in reselect()
3211 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
3212 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
3213 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
3214 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ in reselect()
3216 DC395x_write8(acb, TRM_S1040_SCSI_COMMAND, SCMD_MSGACCEPT); in reselect()
3248 dcb->acb->tag_max_num; in disc_tagq_set()
3257 static void add_dev(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in add_dev() argument
3268 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in pci_unmap_srb() argument
3277 pci_unmap_single(acb->dev, srb->sg_bus_addr, in pci_unmap_srb()
3289 static void pci_unmap_srb_sense(struct AdapterCtlBlk *acb, in pci_unmap_srb_sense() argument
3297 pci_unmap_single(acb->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3312 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in srb_done() argument
3328 pci_unmap_srb_sense(acb, srb); in srb_done()
3341 dcb->target_lun, status, acb->scan_devices); in srb_done()
3347 dcb->target_lun, status, acb->scan_devices); in srb_done()
3353 dcb->target_lun, status, acb->scan_devices); in srb_done()
3359 dcb->target_lun, status, acb->scan_devices); in srb_done()
3365 dcb->target_lun, status, acb->scan_devices); in srb_done()
3407 request_sense(acb, dcb, srb); in srb_done()
3418 waiting_set_timer(acb, HZ / 20); in srb_done()
3454 pci_dma_sync_sg_for_cpu(acb->dev, scsi_sglist(cmd), in srb_done()
3483 add_dev(acb, dcb, ptr); in srb_done()
3507 if (srb == acb->tmp_srb) in srb_done()
3512 srb_free_insert(acb, srb); in srb_done()
3514 pci_unmap_srb(acb, srb); in srb_done()
3517 waiting_process_next(acb); in srb_done()
3522 static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag, in doing_srb_done() argument
3528 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
3544 srb_free_insert(acb, srb); in doing_srb_done()
3546 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3547 pci_unmap_srb(acb, srb); in doing_srb_done()
3573 srb_free_insert(acb, srb); in doing_srb_done()
3575 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3576 pci_unmap_srb(acb, srb); in doing_srb_done()
3593 static void reset_scsi_bus(struct AdapterCtlBlk *acb) in reset_scsi_bus() argument
3595 dprintkdbg(DBG_0, "reset_scsi_bus: acb=%p\n", acb); in reset_scsi_bus()
3596 acb->acb_flag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in reset_scsi_bus()
3597 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); in reset_scsi_bus()
3599 while (!(DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET)) in reset_scsi_bus()
3604 static void set_basic_config(struct AdapterCtlBlk *acb) in set_basic_config() argument
3608 DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout); in set_basic_config()
3609 if (acb->config & HCC_PARITY) in set_basic_config()
3614 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG0, bval); in set_basic_config()
3617 DC395x_write8(acb, TRM_S1040_SCSI_CONFIG1, 0x03); /* was 0x13: default */ in set_basic_config()
3619 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in set_basic_config()
3621 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, 0x00); in set_basic_config()
3623 wval = DC395x_read16(acb, TRM_S1040_GEN_CONTROL) & 0x7F; in set_basic_config()
3624 DC395x_write16(acb, TRM_S1040_GEN_CONTROL, wval); in set_basic_config()
3626 wval = DC395x_read16(acb, TRM_S1040_DMA_CONFIG) & ~DMA_FIFO_CTRL; in set_basic_config()
3629 DC395x_write16(acb, TRM_S1040_DMA_CONFIG, wval); in set_basic_config()
3631 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in set_basic_config()
3633 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x7F); in set_basic_config()
3634 DC395x_write8(acb, TRM_S1040_DMA_INTEN, EN_SCSIINTR | EN_DMAXFERERROR in set_basic_config()
3640 static void scsi_reset_detect(struct AdapterCtlBlk *acb) in scsi_reset_detect() argument
3642 dprintkl(KERN_INFO, "scsi_reset_detect: acb=%p\n", acb); in scsi_reset_detect()
3644 if (timer_pending(&acb->waiting_timer)) in scsi_reset_detect()
3645 del_timer(&acb->waiting_timer); in scsi_reset_detect()
3647 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in scsi_reset_detect()
3648 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in scsi_reset_detect()
3652 acb->last_reset = in scsi_reset_detect()
3654 HZ * acb->eeprom.delay_time; in scsi_reset_detect()
3656 clear_fifo(acb, "scsi_reset_detect"); in scsi_reset_detect()
3657 set_basic_config(acb); in scsi_reset_detect()
3661 if (acb->acb_flag & RESET_DEV) { /* RESET_DETECT, RESET_DONE, RESET_DEV */ in scsi_reset_detect()
3662 acb->acb_flag |= RESET_DONE; in scsi_reset_detect()
3664 acb->acb_flag |= RESET_DETECT; in scsi_reset_detect()
3665 reset_dev_param(acb); in scsi_reset_detect()
3666 doing_srb_done(acb, DID_RESET, NULL, 1); in scsi_reset_detect()
3668 acb->active_dcb = NULL; in scsi_reset_detect()
3669 acb->acb_flag = 0; in scsi_reset_detect()
3670 waiting_process_next(acb); in scsi_reset_detect()
3675 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in request_sense() argument
3700 pci_map_single(acb->dev, cmd->sense_buffer, in request_sense()
3708 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */ in request_sense()
3713 waiting_set_timer(acb, HZ / 100); in request_sense()
3731 static struct DeviceCtlBlk *device_alloc(struct AdapterCtlBlk *acb, in device_alloc() argument
3734 struct NvRamType *eeprom = &acb->eeprom; in device_alloc()
3742 dcb->acb = NULL; in device_alloc()
3766 && (acb->config & HCC_WIDE_CARD)) in device_alloc()
3777 list_for_each_entry(p, &acb->dcb_list, list) in device_alloc()
3800 static void adapter_add_device(struct AdapterCtlBlk *acb, in adapter_add_device() argument
3804 dcb->acb = acb; in adapter_add_device()
3807 if (list_empty(&acb->dcb_list)) in adapter_add_device()
3808 acb->dcb_run_robin = dcb; in adapter_add_device()
3811 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3814 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3815 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3828 static void adapter_remove_device(struct AdapterCtlBlk *acb, in adapter_remove_device() argument
3837 if (acb->active_dcb == dcb) in adapter_remove_device()
3838 acb->active_dcb = NULL; in adapter_remove_device()
3839 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3840 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3843 list_for_each_entry_safe(i, tmp, &acb->dcb_list, list) in adapter_remove_device()
3850 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3851 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3852 dcb->acb = NULL; in adapter_remove_device()
3863 static void adapter_remove_and_free_device(struct AdapterCtlBlk *acb, in adapter_remove_and_free_device() argument
3873 adapter_remove_device(acb, dcb); in adapter_remove_and_free_device()
3884 static void adapter_remove_and_free_all_devices(struct AdapterCtlBlk* acb) in adapter_remove_and_free_all_devices() argument
3889 list_size(&acb->dcb_list)); in adapter_remove_and_free_all_devices()
3891 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3892 adapter_remove_and_free_device(acb, dcb); in adapter_remove_and_free_all_devices()
3905 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_alloc() local
3908 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_alloc()
3911 adapter_add_device(acb, dcb); in dc395x_slave_alloc()
3925 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_destroy() local
3926 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_destroy()
3928 adapter_remove_and_free_device(acb, dcb); in dc395x_slave_destroy()
4250 static void adapter_sg_tables_free(struct AdapterCtlBlk *acb) in adapter_sg_tables_free() argument
4256 kfree(acb->srb_array[i].segment_x); in adapter_sg_tables_free()
4263 static int adapter_sg_tables_alloc(struct AdapterCtlBlk *acb) in adapter_sg_tables_alloc() argument
4274 acb->srb_array[i].segment_x = NULL; in adapter_sg_tables_alloc()
4280 adapter_sg_tables_free(acb); in adapter_sg_tables_alloc()
4287 acb->srb_array[srb_idx++].segment_x = in adapter_sg_tables_alloc()
4291 acb->srb.segment_x = in adapter_sg_tables_alloc()
4309 static void adapter_print_config(struct AdapterCtlBlk *acb) in adapter_print_config() argument
4313 bval = DC395x_read8(acb, TRM_S1040_GEN_STATUS); in adapter_print_config()
4325 bval = DC395x_read8(acb, TRM_S1040_GEN_CONTROL); in adapter_print_config()
4353 static void adapter_init_params(struct AdapterCtlBlk *acb) in adapter_init_params() argument
4355 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_params()
4362 INIT_LIST_HEAD(&acb->dcb_list); in adapter_init_params()
4363 acb->dcb_run_robin = NULL; in adapter_init_params()
4364 acb->active_dcb = NULL; in adapter_init_params()
4366 INIT_LIST_HEAD(&acb->srb_free_list); in adapter_init_params()
4368 acb->tmp_srb = &acb->srb; in adapter_init_params()
4369 init_timer(&acb->waiting_timer); in adapter_init_params()
4370 init_timer(&acb->selto_timer); in adapter_init_params()
4372 acb->srb_count = DC395x_MAX_SRB_CNT; in adapter_init_params()
4374 acb->sel_timeout = DC395x_SEL_TIMEOUT; /* timeout=250ms */ in adapter_init_params()
4377 acb->tag_max_num = 1 << eeprom->max_tag; in adapter_init_params()
4378 if (acb->tag_max_num > 30) in adapter_init_params()
4379 acb->tag_max_num = 30; in adapter_init_params()
4381 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in adapter_init_params()
4382 acb->gmode2 = eeprom->channel_cfg; in adapter_init_params()
4383 acb->config = 0; /* NOTE: actually set in adapter_init_chip */ in adapter_init_params()
4386 acb->lun_chk = 1; in adapter_init_params()
4387 acb->scan_devices = 1; in adapter_init_params()
4389 acb->scsi_host->this_id = eeprom->scsi_id; in adapter_init_params()
4390 acb->hostid_bit = (1 << acb->scsi_host->this_id); in adapter_init_params()
4393 acb->dcb_map[i] = 0; in adapter_init_params()
4395 acb->msg_len = 0; in adapter_init_params()
4398 for (i = 0; i < acb->srb_count - 1; i++) in adapter_init_params()
4399 srb_free_insert(acb, &acb->srb_array[i]); in adapter_init_params()
4417 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in adapter_init_scsi_host() local
4418 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_scsi_host()
4424 host->io_port = acb->io_port_base; in adapter_init_scsi_host()
4425 host->n_io_port = acb->io_port_len; in adapter_init_scsi_host()
4427 host->unique_id = acb->io_port_base; in adapter_init_scsi_host()
4428 host->irq = acb->irq_level; in adapter_init_scsi_host()
4429 acb->last_reset = jiffies; in adapter_init_scsi_host()
4451 static void adapter_init_chip(struct AdapterCtlBlk *acb) in adapter_init_chip() argument
4453 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_chip()
4456 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0x00); in adapter_init_chip()
4457 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0x00); in adapter_init_chip()
4460 DC395x_write16(acb, TRM_S1040_SCSI_CONTROL, DO_RSTMODULE); in adapter_init_chip()
4463 DC395x_write8(acb, TRM_S1040_DMA_CONTROL, DMARESETMODULE); in adapter_init_chip()
4467 acb->config = HCC_AUTOTERM | HCC_PARITY; in adapter_init_chip()
4468 if (DC395x_read8(acb, TRM_S1040_GEN_STATUS) & WIDESCSI) in adapter_init_chip()
4469 acb->config |= HCC_WIDE_CARD; in adapter_init_chip()
4472 acb->config |= HCC_SCSI_RESET; in adapter_init_chip()
4474 if (acb->config & HCC_SCSI_RESET) { in adapter_init_chip()
4476 DC395x_write8(acb, TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); in adapter_init_chip()
4482 acb->last_reset = in adapter_init_chip()
4484 HZ * acb->eeprom.delay_time; in adapter_init_chip()
4504 static int adapter_init(struct AdapterCtlBlk *acb, unsigned long io_port, in adapter_init() argument
4512 acb->io_port_base = io_port; in adapter_init()
4513 acb->io_port_len = io_port_len; in adapter_init()
4515 if (request_irq(irq, dc395x_interrupt, IRQF_SHARED, DC395X_NAME, acb)) { in adapter_init()
4521 acb->irq_level = irq; in adapter_init()
4524 check_eeprom(&acb->eeprom, io_port); in adapter_init()
4525 print_eeprom_settings(&acb->eeprom); in adapter_init()
4528 adapter_init_params(acb); in adapter_init()
4531 adapter_print_config(acb); in adapter_init()
4533 if (adapter_sg_tables_alloc(acb)) { in adapter_init()
4537 adapter_init_scsi_host(acb->scsi_host); in adapter_init()
4538 adapter_init_chip(acb); in adapter_init()
4539 set_basic_config(acb); in adapter_init()
4544 acb, acb->dcb_map, acb->srb_array, sizeof(struct AdapterCtlBlk), in adapter_init()
4549 if (acb->irq_level) in adapter_init()
4550 free_irq(acb->irq_level, acb); in adapter_init()
4551 if (acb->io_port_base) in adapter_init()
4552 release_region(acb->io_port_base, acb->io_port_len); in adapter_init()
4553 adapter_sg_tables_free(acb); in adapter_init()
4566 static void adapter_uninit_chip(struct AdapterCtlBlk *acb) in adapter_uninit_chip() argument
4569 DC395x_write8(acb, TRM_S1040_DMA_INTEN, 0); in adapter_uninit_chip()
4570 DC395x_write8(acb, TRM_S1040_SCSI_INTEN, 0); in adapter_uninit_chip()
4573 if (acb->config & HCC_SCSI_RESET) in adapter_uninit_chip()
4574 reset_scsi_bus(acb); in adapter_uninit_chip()
4577 DC395x_read8(acb, TRM_S1040_SCSI_INTSTATUS); in adapter_uninit_chip()
4589 static void adapter_uninit(struct AdapterCtlBlk *acb) in adapter_uninit() argument
4592 DC395x_LOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4595 if (timer_pending(&acb->waiting_timer)) in adapter_uninit()
4596 del_timer(&acb->waiting_timer); in adapter_uninit()
4597 if (timer_pending(&acb->selto_timer)) in adapter_uninit()
4598 del_timer(&acb->selto_timer); in adapter_uninit()
4600 adapter_uninit_chip(acb); in adapter_uninit()
4601 adapter_remove_and_free_all_devices(acb); in adapter_uninit()
4602 DC395x_UNLOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4604 if (acb->irq_level) in adapter_uninit()
4605 free_irq(acb->irq_level, acb); in adapter_uninit()
4606 if (acb->io_port_base) in adapter_uninit()
4607 release_region(acb->io_port_base, acb->io_port_len); in adapter_uninit()
4609 adapter_sg_tables_free(acb); in adapter_uninit()
4620 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in dc395x_show_info() local
4629 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4633 (acb->config & HCC_WIDE_CARD) ? "Wide" : ""); in dc395x_show_info()
4634 seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base); in dc395x_show_info()
4635 seq_printf(m, "irq_level 0x%04x, ", acb->irq_level); in dc395x_show_info()
4636 seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000); in dc395x_show_info()
4641 seq_printf(m, "tag_max_num %i", acb->tag_max_num); in dc395x_show_info()
4644 DC395x_read8(acb, TRM_S1040_SCSI_CONFIG1)); in dc395x_show_info()
4645 seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time); in dc395x_show_info()
4648 seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); in dc395x_show_info()
4650 acb->dcb_map[0], acb->dcb_map[1], acb->dcb_map[2], in dc395x_show_info()
4651 acb->dcb_map[3], acb->dcb_map[4], acb->dcb_map[5], in dc395x_show_info()
4652 acb->dcb_map[6], acb->dcb_map[7]); in dc395x_show_info()
4654 acb->dcb_map[8], acb->dcb_map[9], acb->dcb_map[10], in dc395x_show_info()
4655 acb->dcb_map[11], acb->dcb_map[12], acb->dcb_map[13], in dc395x_show_info()
4656 acb->dcb_map[14], acb->dcb_map[15]); in dc395x_show_info()
4662 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4692 if (timer_pending(&acb->waiting_timer)) in dc395x_show_info()
4697 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4716 seq_printf(m, "DCB list for ACB %p:\n", acb); in dc395x_show_info()
4717 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4723 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4778 struct AdapterCtlBlk *acb = NULL; in dc395x_init_one() local
4803 acb = (struct AdapterCtlBlk*)scsi_host->hostdata; in dc395x_init_one()
4804 acb->scsi_host = scsi_host; in dc395x_init_one()
4805 acb->dev = dev; in dc395x_init_one()
4808 if (adapter_init(acb, io_port_base, io_port_len, irq)) { in dc395x_init_one()
4826 if (acb != NULL) in dc395x_init_one()
4827 adapter_uninit(acb); in dc395x_init_one()
4844 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata); in dc395x_remove_one() local
4846 dprintkdbg(DBG_0, "dc395x_remove_one: acb=%p\n", acb); in dc395x_remove_one()
4849 adapter_uninit(acb); in dc395x_remove_one()