• Home
  • Raw
  • Download

Lines Matching +full:4 +full:ln +full:- +full:config +full:- +full:sel

6  * (SCSI chip set used Tekram ASIC TRM-S1040)
11 * (C) Copyright 1995-1999 Tekram Technology Co., Ltd.
14 * (C) 1999-2000 Kurt Garloff
71 #define DC395X_BANNER "Tekram DC395(U/UW/F), DC315(U) - ASIC TRM-S1040"
74 /*---------------------------------------------------------------------------
76 ---------------------------------------------------------------------------*/
85 /*---------------------------------------------------------------------------
87 ---------------------------------------------------------------------------*/
117 * print a debug message - this is formated with KERN_DEBUG, then the
152 #define DC395x_LOCK_IO(dev,flags) spin_lock_irqsave(((struct Scsi_Host *)dev)->host_lock, flags)
153 #define DC395x_UNLOCK_IO(dev,flags) spin_unlock_irqrestore(((struct Scsi_Host *)dev)->host_lock, f…
155 #define DC395x_read8(acb,address) (u8)(inb(acb->io_port_base + (address)))
156 #define DC395x_read16(acb,address) (u16)(inw(acb->io_port_base + (address)))
157 #define DC395x_read32(acb,address) (u32)(inl(acb->io_port_base + (address)))
158 #define DC395x_write8(acb,address,value) outb((value), acb->io_port_base + (address))
159 #define DC395x_write16(acb,address,value) outw((value), acb->io_port_base + (address))
160 #define DC395x_write32(acb,address,value) outl((value), acb->io_port_base + (address))
162 /* cmd->result */
181 * srb->segement_x is the hw sg list. It is always allocated as a
204 u8 sub_class; /* 4 Sub Class */
244 * (srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1] and the
321 u8 config; member
340 /*---------------------------------------------------------------------------
342 ---------------------------------------------------------------------------*/
400 /*---------------------------------------------------------------------------
402 ---------------------------------------------------------------------------*/
410 nop0, /* phase:4 PH_BUS_FREE .. initial phase */
421 nop1, /* phase:4 PH_BUS_FREE .. initial phase */
453 /*---------------------------------------------------------------------------
455 ---------------------------------------------------------------------------*/
470 #define CFG_TAGS 4
480 #define CFG_PARAM_UNSET -1
506 4, /* 6.7Hmz */
554 MODULE_PARM_DESC(adapter_id, "Adapter SCSI ID. Default 7 (0-15)");
557 …ESC(max_speed, "Maximum bus speed. Default 1 (0-7) Speeds: 0=20, 1=13.3, 2=10, 3=8, 4=6.7, 5=5.8, …
566 MODULE_PARM_DESC(tags, "Number of tags (1<<x). Default 3 (0-5)");
569 MODULE_PARM_DESC(reset_delay, "Reset delay in seconds. Default 1 (0-180)");
573 * set_safe_settings - if the use_safe_settings option is set then
592 * fix_settings - reset any boot parameters which are out of range
627 * eeprom_index_to_delay - Take the eeprom delay setting and convert it
634 eeprom->delay_time = eeprom_index_to_delay_map[eeprom->delay_time]; in eeprom_index_to_delay()
639 * delay_to_eeprom_index - Take a delay in seconds and return the
655 * eeprom_override - Override the eeprom settings, in the provided
667 eeprom->scsi_id = (u8)cfg_data[CFG_ADAPTER_ID].value; in eeprom_override()
670 eeprom->channel_cfg = (u8)cfg_data[CFG_ADAPTER_MODE].value; in eeprom_override()
673 eeprom->delay_time = delay_to_eeprom_index( in eeprom_override()
677 eeprom->max_tag = (u8)cfg_data[CFG_TAGS].value; in eeprom_override()
682 eeprom->target[id].cfg0 = in eeprom_override()
686 eeprom->target[id].period = in eeprom_override()
693 /*---------------------------------------------------------------------------
694 ---------------------------------------------------------------------------*/
737 if (srb->tag_number < 255) { in free_tag()
738 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */ in free_tag()
739 srb->tag_number = 255; in free_tag()
750 if (i->cmd == cmd) in find_cmd()
758 if (timer_pending(&acb->waiting_timer)) in waiting_set_timer()
760 if (time_before(jiffies + to, acb->last_reset - HZ / 2)) in waiting_set_timer()
761 acb->waiting_timer.expires = in waiting_set_timer()
762 acb->last_reset - HZ / 2 + 1; in waiting_set_timer()
764 acb->waiting_timer.expires = jiffies + to + 1; in waiting_set_timer()
765 add_timer(&acb->waiting_timer); in waiting_set_timer()
776 struct list_head *dcb_list_head = &acb->dcb_list; in waiting_process_next()
778 if (acb->active_dcb in waiting_process_next()
779 || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) in waiting_process_next()
782 if (timer_pending(&acb->waiting_timer)) in waiting_process_next()
783 del_timer(&acb->waiting_timer); in waiting_process_next()
793 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
799 start = list_entry(dcb_list_head->next, typeof(*start), list); in waiting_process_next()
800 acb->dcb_run_robin = start; in waiting_process_next()
810 struct list_head *waiting_list_head = &pos->srb_waiting_list; in waiting_process_next()
813 acb->dcb_run_robin = dcb_get_next(dcb_list_head, in waiting_process_next()
814 acb->dcb_run_robin); in waiting_process_next()
817 pos->max_command <= list_size(&pos->srb_going_list)) { in waiting_process_next()
821 srb = list_entry(waiting_list_head->next, in waiting_process_next()
826 list_move(&srb->list, &pos->srb_going_list); in waiting_process_next()
842 DC395x_LOCK_IO(acb->scsi_host, flags); in waiting_timeout()
844 DC395x_UNLOCK_IO(acb->scsi_host, flags); in waiting_timeout()
851 return acb->children[id][lun]; in find_dcb()
858 struct DeviceCtlBlk *dcb = srb->dcb; in send_srb()
860 if (dcb->max_command <= list_size(&dcb->srb_going_list) || in send_srb()
861 acb->active_dcb || in send_srb()
862 (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { in send_srb()
863 list_add_tail(&srb->list, &dcb->srb_waiting_list); in send_srb()
869 list_add_tail(&srb->list, &dcb->srb_going_list); in send_srb()
871 list_add(&srb->list, &dcb->srb_waiting_list); in send_srb()
881 enum dma_data_direction dir = cmd->sc_data_direction; in build_srb()
882 dprintkdbg(DBG_0, "build_srb: (0x%p) <%02i-%i>\n", in build_srb()
883 cmd, dcb->target_id, dcb->target_lun); in build_srb()
885 srb->dcb = dcb; in build_srb()
886 srb->cmd = cmd; in build_srb()
887 srb->sg_count = 0; in build_srb()
888 srb->total_xfer_length = 0; in build_srb()
889 srb->sg_bus_addr = 0; in build_srb()
890 srb->sg_index = 0; in build_srb()
891 srb->adapter_status = 0; in build_srb()
892 srb->target_status = 0; in build_srb()
893 srb->msg_count = 0; in build_srb()
894 srb->status = 0; in build_srb()
895 srb->flag = 0; in build_srb()
896 srb->state = 0; in build_srb()
897 srb->retry_count = 0; in build_srb()
898 srb->tag_number = TAG_NONE; in build_srb()
899 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in build_srb()
900 srb->end_message = 0; in build_srb()
908 cmd->bufflen, scsi_sglist(cmd), scsi_sg_count(cmd), in build_srb()
909 srb->segment_x[0].address); in build_srb()
914 struct SGentry *sgp = srb->segment_x; in build_srb()
916 srb->sg_count = nseg; in build_srb()
921 srb->sg_count); in build_srb()
923 scsi_for_each_sg(cmd, sg, srb->sg_count, i) { in build_srb()
925 u32 seglen = (u32)sg->length; in build_srb()
928 srb->total_xfer_length += seglen; in build_srb()
930 sgp += srb->sg_count - 1; in build_srb()
936 if (srb->total_xfer_length > reqlen) { in build_srb()
937 sgp->length -= (srb->total_xfer_length - reqlen); in build_srb()
938 srb->total_xfer_length = reqlen; in build_srb()
941 /* Fixup for WIDE padding - make sure length is even */ in build_srb()
942 if (dcb->sync_period & WIDE_SYNC && in build_srb()
943 srb->total_xfer_length % 2) { in build_srb()
944 srb->total_xfer_length++; in build_srb()
945 sgp->length++; in build_srb()
948 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
949 srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE); in build_srb()
951 dprintkdbg(DBG_SG, "build_srb: [n] map sg %p->%08x(%05x)\n", in build_srb()
952 srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN); in build_srb()
955 srb->request_length = srb->total_xfer_length; in build_srb()
960 * dc395x_queue_command - queue scsi command passed from the mid
971 * Required: if struct Scsi_Host::can_queue is ever non-zero
983 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in dc395x_queue_command_lck()
984 dprintkdbg(DBG_0, "queue_command: (0x%p) <%02i-%i> cmnd=0x%02x\n", in dc395x_queue_command_lck()
985 cmd, cmd->device->id, (u8)cmd->device->lun, cmd->cmnd[0]); in dc395x_queue_command_lck()
988 cmd->result = DID_BAD_TARGET << 16; in dc395x_queue_command_lck()
991 if (cmd->device->id >= acb->scsi_host->max_id || in dc395x_queue_command_lck()
992 cmd->device->lun >= acb->scsi_host->max_lun || in dc395x_queue_command_lck()
993 cmd->device->lun >31) { in dc395x_queue_command_lck()
998 if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) { in dc395x_queue_command_lck()
999 dprintkl(KERN_INFO, "queue_command: Ignore target <%02i-%i>\n", in dc395x_queue_command_lck()
1000 cmd->device->id, (u8)cmd->device->lun); in dc395x_queue_command_lck()
1005 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
1008 dprintkl(KERN_ERR, "queue_command: No such device <%02i-%i>", in dc395x_queue_command_lck()
1009 cmd->device->id, (u8)cmd->device->lun); in dc395x_queue_command_lck()
1014 cmd->scsi_done = done; in dc395x_queue_command_lck()
1015 cmd->result = 0; in dc395x_queue_command_lck()
1017 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
1027 list_del(&srb->list); in dc395x_queue_command_lck()
1031 if (!list_empty(&dcb->srb_waiting_list)) { in dc395x_queue_command_lck()
1033 list_add_tail(&srb->list, &dcb->srb_waiting_list); in dc395x_queue_command_lck()
1059 struct pci_dev *dev = acb->dev; in DEF_SCSI_QCMD()
1062 dcb = acb->active_dcb; in DEF_SCSI_QCMD()
1064 srb = dcb->active_srb; in DEF_SCSI_QCMD()
1066 if (!srb->cmd) in DEF_SCSI_QCMD()
1068 srb, srb->cmd); in DEF_SCSI_QCMD()
1071 "cmnd=0x%02x <%02i-%i>\n", in DEF_SCSI_QCMD()
1072 srb, srb->cmd, in DEF_SCSI_QCMD()
1073 srb->cmd->cmnd[0], srb->cmd->device->id, in DEF_SCSI_QCMD()
1074 (u8)srb->cmd->device->lun); in DEF_SCSI_QCMD()
1076 srb->segment_x, srb->sg_count, srb->sg_index, in DEF_SCSI_QCMD()
1077 srb->total_xfer_length); in DEF_SCSI_QCMD()
1079 srb->state, srb->status, srb->scsi_phase, in DEF_SCSI_QCMD()
1080 (acb->active_dcb) ? "" : "not"); in DEF_SCSI_QCMD()
1084 "rselid=0x%02x ctr=0x%08x irqen=0x%02x config=0x%04x " in DEF_SCSI_QCMD()
1138 struct NvRamType *eeprom = &acb->eeprom; in reset_dev_param()
1141 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
1144 dcb->sync_mode &= ~(SYNC_NEGO_DONE + WIDE_NEGO_DONE); in reset_dev_param()
1145 dcb->sync_period = 0; in reset_dev_param()
1146 dcb->sync_offset = 0; in reset_dev_param()
1148 dcb->dev_mode = eeprom->target[dcb->target_id].cfg0; in reset_dev_param()
1149 period_index = eeprom->target[dcb->target_id].period & 0x07; in reset_dev_param()
1150 dcb->min_nego_period = clock_period[period_index]; in reset_dev_param()
1151 if (!(dcb->dev_mode & NTC_DO_WIDE_NEGO) in reset_dev_param()
1152 || !(acb->config & HCC_WIDE_CARD)) in reset_dev_param()
1153 dcb->sync_mode &= ~WIDE_NEGO_ENABLE; in reset_dev_param()
1160 * @cmd - some command for this host (for fetching hooks)
1166 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in __dc395x_eh_bus_reset()
1168 "eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n", in __dc395x_eh_bus_reset()
1169 cmd, cmd->device->id, (u8)cmd->device->lun, cmd); in __dc395x_eh_bus_reset()
1171 if (timer_pending(&acb->waiting_timer)) in __dc395x_eh_bus_reset()
1172 del_timer(&acb->waiting_timer); in __dc395x_eh_bus_reset()
1186 acb->last_reset = in __dc395x_eh_bus_reset()
1188 HZ * acb->eeprom.delay_time; in __dc395x_eh_bus_reset()
1191 * re-enable interrupt in __dc395x_eh_bus_reset()
1202 acb->active_dcb = NULL; in __dc395x_eh_bus_reset()
1203 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ in __dc395x_eh_bus_reset()
1213 spin_lock_irq(cmd->device->host->host_lock); in dc395x_eh_bus_reset()
1215 spin_unlock_irq(cmd->device->host->host_lock); in dc395x_eh_bus_reset()
1222 * @cmd - command to be aborted
1232 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in dc395x_eh_abort()
1235 dprintkl(KERN_INFO, "eh_abort: (0x%p) target=<%02i-%i> cmd=%p\n", in dc395x_eh_abort()
1236 cmd, cmd->device->id, (u8)cmd->device->lun, cmd); in dc395x_eh_abort()
1238 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1244 srb = find_cmd(cmd, &dcb->srb_waiting_list); in dc395x_eh_abort()
1246 list_del(&srb->list); in dc395x_eh_abort()
1250 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1252 cmd->result = DID_ABORT << 16; in dc395x_eh_abort()
1255 srb = find_cmd(cmd, &dcb->srb_going_list); in dc395x_eh_abort()
1270 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_sdtr()
1271 if (srb->msg_count > 1) { in build_sdtr()
1274 srb->msg_count, srb->msgout_buf[0], in build_sdtr()
1275 srb->msgout_buf[1]); in build_sdtr()
1278 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) { in build_sdtr()
1279 dcb->sync_offset = 0; in build_sdtr()
1280 dcb->min_nego_period = 200 >> 2; in build_sdtr()
1281 } else if (dcb->sync_offset == 0) in build_sdtr()
1282 dcb->sync_offset = SYNC_NEGO_OFFSET; in build_sdtr()
1287 *ptr++ = dcb->min_nego_period; /* Transfer period (in 4ns) */ in build_sdtr()
1288 *ptr++ = dcb->sync_offset; /* Transfer period (max. REQ/ACK dist) */ in build_sdtr()
1289 srb->msg_count += 5; in build_sdtr()
1290 srb->state |= SRB_DO_SYNC_NEGO; in build_sdtr()
1298 u8 wide = ((dcb->dev_mode & NTC_DO_WIDE_NEGO) & in build_wdtr()
1299 (acb->config & HCC_WIDE_CARD)) ? 1 : 0; in build_wdtr()
1300 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_wdtr()
1301 if (srb->msg_count > 1) { in build_wdtr()
1304 srb->msg_count, srb->msgout_buf[0], in build_wdtr()
1305 srb->msgout_buf[1]); in build_wdtr()
1312 srb->msg_count += 4; in build_wdtr()
1313 srb->state |= SRB_DO_WIDE_NEGO; in build_wdtr()
1324 if (timer_pending(&acb->selto_timer))
1326 acb->selto_timer.function = selection_timeout_missed;
1327 acb->selto_timer.data = (unsigned long) acb;
1329 (jiffies + HZ, acb->last_reset + HZ / 2))
1330 acb->selto_timer.expires =
1331 acb->last_reset + HZ / 2 + 1;
1333 acb->selto_timer.expires = jiffies + HZ + 1;
1334 add_timer(&acb->selto_timer);
1344 if (!acb->active_dcb || !acb->active_dcb->active_srb) {
1348 DC395x_LOCK_IO(acb->scsi_host, flags);
1349 srb = acb->active_dcb->active_srb;
1351 DC395x_UNLOCK_IO(acb->scsi_host, flags);
1362 dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> srb=%p\n", in start_scsi()
1363 dcb->target_id, dcb->target_lun, srb); in start_scsi()
1365 srb->tag_number = TAG_NONE; /* acb->tag_max_num: had error read in eeprom */ in start_scsi()
1388 if (acb->active_dcb) { in start_scsi()
1391 srb->cmd, in start_scsi()
1392 acb->active_dcb->active_srb ? in start_scsi()
1393 acb->active_dcb->active_srb->cmd : 0); in start_scsi()
1397 dprintkdbg(DBG_KG, "start_scsi: (0x%p) Failed (busy)\n", srb->cmd); in start_scsi()
1400 /* Allow starting of SCSI commands half a second before we allow the mid-level in start_scsi()
1402 if (time_before(jiffies, acb->last_reset - HZ / 2)) { in start_scsi()
1409 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in start_scsi()
1410 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1411 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1412 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1413 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1415 identify_message = dcb->identify_msg; in start_scsi()
1418 if (srb->flag & AUTO_REQSENSE) in start_scsi()
1421 if (((srb->cmd->cmnd[0] == INQUIRY) in start_scsi()
1422 || (srb->cmd->cmnd[0] == REQUEST_SENSE) in start_scsi()
1423 || (srb->flag & AUTO_REQSENSE)) in start_scsi()
1424 && (((dcb->sync_mode & WIDE_NEGO_ENABLE) in start_scsi()
1425 && !(dcb->sync_mode & WIDE_NEGO_DONE)) in start_scsi()
1426 || ((dcb->sync_mode & SYNC_NEGO_ENABLE) in start_scsi()
1427 && !(dcb->sync_mode & SYNC_NEGO_DONE))) in start_scsi()
1428 && (dcb->target_lun == 0)) { in start_scsi()
1429 srb->msgout_buf[0] = identify_message; in start_scsi()
1430 srb->msg_count = 1; in start_scsi()
1432 srb->state = SRB_MSGOUT; in start_scsi()
1434 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1435 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1440 if (dcb->sync_mode & SYNC_NEGO_ENABLE in start_scsi()
1441 && dcb->inquiry7 & SCSI_INQ_SYNC) { in start_scsi()
1445 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1446 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1450 srb->msg_count = 0; in start_scsi()
1456 srb->state = SRB_START_; in start_scsi()
1458 if ((dcb->sync_mode & EN_TAG_QUEUEING) in start_scsi()
1463 while (tag_mask & dcb->tag_mask in start_scsi()
1464 && tag_number < dcb->max_command) { in start_scsi()
1468 if (tag_number >= dcb->max_command) { in start_scsi()
1470 "Out of tags target=<%02i-%i>)\n", in start_scsi()
1471 srb->cmd, srb->cmd->device->id, in start_scsi()
1472 (u8)srb->cmd->device->lun); in start_scsi()
1473 srb->state = SRB_READY; in start_scsi()
1481 dcb->tag_mask |= tag_mask; in start_scsi()
1482 srb->tag_number = tag_number; in start_scsi()
1484 srb->state = SRB_START_; in start_scsi()
1489 dprintkdbg(DBG_KG, "start_scsi: (0x%p) <%02i-%i> cmnd=0x%02x tag=%i\n", in start_scsi()
1490 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in start_scsi()
1491 srb->cmd->cmnd[0], srb->tag_number); in start_scsi()
1492 if (srb->flag & AUTO_REQSENSE) { in start_scsi()
1494 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1500 ptr = (u8 *)srb->cmd->cmnd; in start_scsi()
1501 for (i = 0; i < srb->cmd->cmd_len; i++) in start_scsi()
1513 dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> Failed - busy\n", in start_scsi()
1514 srb->cmd, dcb->target_id, dcb->target_lun); in start_scsi()
1515 srb->state = SRB_READY; in start_scsi()
1517 srb->msg_count = 0; in start_scsi()
1525 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1526 dcb->active_srb = srb; in start_scsi()
1527 acb->active_dcb = dcb; in start_scsi()
1541 srb->state |= SRB_MSGOUT
1548 srb->msgout_buf[0] = ABORT; in enable_msgout_abort()
1549 srb->msg_count = 1; in enable_msgout_abort()
1551 srb->state &= ~SRB_MSGIN; in enable_msgout_abort()
1552 srb->state |= SRB_MSGOUT; in enable_msgout_abort()
1557 * dc395x_handle_interrupt - Handle an interrupt that has been confirmed to
1574 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1587 if (timer_pending(&acb->selto_timer)) in dc395x_handle_interrupt()
1588 del_timer(&acb->selto_timer); in dc395x_handle_interrupt()
1607 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1614 srb = dcb->active_srb; in dc395x_handle_interrupt()
1615 if (dcb->flag & ABORT_DEV_) { in dc395x_handle_interrupt()
1621 phase = (u16)srb->scsi_phase; in dc395x_handle_interrupt()
1632 /* nop0, phase:4 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1644 srb->scsi_phase = scsi_status & PHASEMASK; in dc395x_handle_interrupt()
1655 /* nop1, phase:4 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1663 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1680 /* interrupt pending - let's process it! */ in dc395x_interrupt()
1689 if (acb->active_dcb) { in dc395x_interrupt()
1690 acb->active_dcb-> flag |= ABORT_DEV_; in dc395x_interrupt()
1691 if (acb->active_dcb->active_srb) in dc395x_interrupt()
1692 enable_msgout_abort(acb, acb->active_dcb->active_srb); in dc395x_interrupt()
1709 dprintkdbg(DBG_0, "msgout_phase0: (0x%p)\n", srb->cmd); in msgout_phase0()
1710 if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT)) in msgout_phase0()
1714 srb->state &= ~SRB_MSGOUT; in msgout_phase0()
1723 dprintkdbg(DBG_0, "msgout_phase1: (0x%p)\n", srb->cmd); in msgout_phase1()
1726 if (!(srb->state & SRB_MSGOUT)) { in msgout_phase1()
1727 srb->state |= SRB_MSGOUT; in msgout_phase1()
1730 srb->cmd); /* So what ? */ in msgout_phase1()
1732 if (!srb->msg_count) { in msgout_phase1()
1734 srb->cmd); in msgout_phase1()
1740 ptr = (u8 *)srb->msgout_buf; in msgout_phase1()
1741 for (i = 0; i < srb->msg_count; i++) in msgout_phase1()
1743 srb->msg_count = 0; in msgout_phase1()
1744 if (srb->msgout_buf[0] == MSG_ABORT) in msgout_phase1()
1745 srb->state = SRB_ABORT_SENT; in msgout_phase1()
1754 dprintkdbg(DBG_0, "command_phase0: (0x%p)\n", srb->cmd); in command_phase0()
1765 dprintkdbg(DBG_0, "command_phase1: (0x%p)\n", srb->cmd); in command_phase1()
1769 if (!(srb->flag & AUTO_REQSENSE)) { in command_phase1()
1770 ptr = (u8 *)srb->cmd->cmnd; in command_phase1()
1771 for (i = 0; i < srb->cmd->cmd_len; i++) { in command_phase1()
1777 dcb = acb->active_dcb; in command_phase1()
1779 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1785 srb->state |= SRB_COMMAND; in command_phase1()
1795 * the count of remaining bytes in srb->total_xfer_length
1801 unsigned idx = srb->sg_index; in sg_verify_length()
1802 struct SGentry *psge = srb->segment_x + idx; in sg_verify_length()
1803 for (; idx < srb->sg_count; psge++, idx++) in sg_verify_length()
1804 len += psge->length; in sg_verify_length()
1805 if (len != srb->total_xfer_length) in sg_verify_length()
1808 srb->total_xfer_length, len); in sg_verify_length()
1820 u32 xferred = srb->total_xfer_length - left; /* bytes transferred */ in sg_update_list()
1821 struct SGentry *psge = srb->segment_x + srb->sg_index; in sg_update_list()
1825 xferred, srb->total_xfer_length, left); in sg_update_list()
1832 srb->total_xfer_length = left; /* update remaining count */ in sg_update_list()
1833 for (idx = srb->sg_index; idx < srb->sg_count; idx++) { in sg_update_list()
1834 if (xferred >= psge->length) { in sg_update_list()
1836 xferred -= psge->length; in sg_update_list()
1839 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1840 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1842 psge->length -= xferred; in sg_update_list()
1843 psge->address += xferred; in sg_update_list()
1844 srb->sg_index = idx; in sg_update_list()
1845 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1846 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1864 sg_update_list(srb, srb->total_xfer_length - 1); in sg_subtract_one()
1897 * Seems to be needed for unknown reasons; could be a hardware bug :-(
1899 #define DC395x_LASTPIO 4
1905 struct DeviceCtlBlk *dcb = srb->dcb; in data_out_phase0()
1908 dprintkdbg(DBG_0, "data_out_phase0: (0x%p) <%02i-%i>\n", in data_out_phase0()
1909 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase0()
1930 srb->total_xfer_length); in data_out_phase0()
1933 if (!(srb->state & SRB_XFERPAD)) { in data_out_phase0()
1935 srb->status |= PARITY_ERROR; in data_out_phase0()
1951 if (dcb->sync_period & WIDE_SYNC) in data_out_phase0()
1958 (dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_out_phase0()
1974 if (srb->total_xfer_length > DC395x_LASTPIO) in data_out_phase0()
1981 if (d_left_counter == 1 && dcb->sync_period & WIDE_SYNC in data_out_phase0()
1982 && scsi_bufflen(srb->cmd) % 2) { in data_out_phase0()
1999 srb->total_xfer_length = 0; in data_out_phase0()
2007 srb->total_xfer_length - d_left_counter; in data_out_phase0()
2009 (dcb->sync_period & WIDE_SYNC) ? 2 : 1; in data_out_phase0()
2012 if ((srb->segment_x[srb->sg_index].length == in data_out_phase0()
2013 diff && scsi_sg_count(srb->cmd)) in data_out_phase0()
2015 (PAGE_SIZE - diff)) in data_out_phase0()
2020 srb->total_xfer_length - diff; in data_out_phase0()
2022 /*srb->total_xfer_length -= diff; */ in data_out_phase0()
2023 /*srb->virt_addr += diff; */ in data_out_phase0()
2024 /*if (srb->cmd->use_sg) */ in data_out_phase0()
2025 /* srb->sg_index++; */ in data_out_phase0()
2038 dprintkdbg(DBG_0, "data_out_phase1: (0x%p) <%02i-%i>\n", in data_out_phase1()
2039 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase1()
2050 dprintkdbg(DBG_0, "data_in_phase0: (0x%p) <%02i-%i>\n", in data_in_phase0()
2051 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase0()
2066 if (!(srb->state & SRB_XFERPAD)) { in data_in_phase0()
2072 "Parity Error\n", srb->cmd); in data_in_phase0()
2073 srb->status |= PARITY_ERROR; in data_in_phase0()
2091 0x80) && --ctr); in data_in_phase0()
2092 if (ctr < 6000000 - 1) in data_in_phase0()
2109 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : in data_in_phase0()
2116 (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_in_phase0()
2121 srb->total_xfer_length, d_left_counter); in data_in_phase0()
2123 /* KG: Less than or equal to 4 bytes can not be transferred via DMA, it seems. */ in data_in_phase0()
2125 && srb->total_xfer_length <= DC395x_LASTPIO) { in data_in_phase0()
2126 size_t left_io = srb->total_xfer_length; in data_in_phase0()
2128 /*u32 addr = (srb->segment_x[srb->sg_index].address); */ in data_in_phase0()
2133 (srb->dcb->sync_period & WIDE_SYNC) ? in data_in_phase0()
2135 srb->total_xfer_length); in data_in_phase0()
2136 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2143 size_t offset = srb->request_length - left_io; in data_in_phase0()
2146 /* Assumption: it's inside one page as it's at most 4 bytes and in data_in_phase0()
2147 I just assume it's on a 4-byte boundary */ in data_in_phase0()
2148 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_in_phase0()
2149 srb->sg_count, &offset, &len); in data_in_phase0()
2152 left_io -= len; in data_in_phase0()
2162 d_left_counter--; in data_in_phase0()
2165 len--; in data_in_phase0()
2177 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { in data_in_phase0()
2179 if (srb->total_xfer_length > 0) { in data_in_phase0()
2183 srb->total_xfer_length--; in data_in_phase0()
2195 /*srb->total_xfer_length = 0; */ in data_in_phase0()
2214 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2232 } while (!(TempDMAstatus & DMAXFERCOMP) && --ctr); in data_in_phase0()
2236 srb->total_xfer_length = 0; in data_in_phase0()
2238 srb->total_xfer_length = d_left_counter; in data_in_phase0()
2261 dprintkdbg(DBG_0, "data_in_phase1: (0x%p) <%02i-%i>\n", in data_in_phase1()
2262 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase1()
2270 struct DeviceCtlBlk *dcb = srb->dcb; in data_io_transfer()
2273 "data_io_transfer: (0x%p) <%02i-%i> %c len=%i, sg=(%i/%i)\n", in data_io_transfer()
2274 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in data_io_transfer()
2276 srb->total_xfer_length, srb->sg_index, srb->sg_count); in data_io_transfer()
2277 if (srb == acb->tmp_srb) in data_io_transfer()
2279 if (srb->sg_index >= srb->sg_count) { in data_io_transfer()
2284 if (srb->total_xfer_length > DC395x_LASTPIO) { in data_io_transfer()
2301 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2303 if (scsi_sg_count(srb->cmd)) { /* with S/G */ in data_io_transfer()
2306 srb->sg_bus_addr + in data_io_transfer()
2308 srb->sg_index); in data_io_transfer()
2311 ((u32)(srb->sg_count - in data_io_transfer()
2312 srb->sg_index) << 3)); in data_io_transfer()
2316 srb->segment_x[0].address); in data_io_transfer()
2318 srb->segment_x[0].length); in data_io_transfer()
2322 srb->total_xfer_length); in data_io_transfer()
2336 else if (srb->total_xfer_length > 0) { /* The last four bytes: Do PIO */ in data_io_transfer()
2341 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2344 srb->total_xfer_length); in data_io_transfer()
2350 int ln = srb->total_xfer_length; in data_io_transfer() local
2351 size_t left_io = srb->total_xfer_length; in data_io_transfer()
2353 if (srb->dcb->sync_period & WIDE_SYNC) in data_io_transfer()
2361 size_t offset = srb->request_length - left_io; in data_io_transfer()
2364 /* Again, max 4 bytes */ in data_io_transfer()
2365 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_io_transfer()
2366 srb->sg_count, &offset, &len); in data_io_transfer()
2369 left_io -= len; in data_io_transfer()
2371 while (len--) { in data_io_transfer()
2383 if (srb->dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2384 if (ln % 2) { in data_io_transfer()
2391 /*DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, ln); */ in data_io_transfer()
2401 if (srb->sg_count) { in data_io_transfer()
2402 srb->adapter_status = H_OVER_UNDER_RUN; in data_io_transfer()
2403 srb->status |= OVER_RUN; in data_io_transfer()
2410 if (dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2420 * or chip is to blame :-( */ in data_io_transfer()
2428 * something broke :-( */ in data_io_transfer()
2434 srb->state |= SRB_XFERPAD; in data_io_transfer()
2446 dprintkdbg(DBG_0, "status_phase0: (0x%p) <%02i-%i>\n", in status_phase0()
2447 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase0()
2448 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2449 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2450 srb->state = SRB_COMPLETED; in status_phase0()
2460 dprintkdbg(DBG_0, "status_phase1: (0x%p) <%02i-%i>\n", in status_phase1()
2461 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase1()
2462 srb->state = SRB_STATUS; in status_phase1()
2486 srb->msgout_buf[0] = MESSAGE_REJECT; in msgin_reject()
2487 srb->msg_count = 1; in msgin_reject()
2489 srb->state &= ~SRB_MSGIN; in msgin_reject()
2490 srb->state |= SRB_MSGOUT; in msgin_reject()
2491 dprintkl(KERN_INFO, "msgin_reject: 0x%02x <%02i-%i>\n", in msgin_reject()
2492 srb->msgin_buf[0], in msgin_reject()
2493 srb->dcb->target_id, srb->dcb->target_lun); in msgin_reject()
2503 srb->cmd, tag, srb); in msgin_qtag()
2505 if (!(dcb->tag_mask & (1 << tag))) in msgin_qtag()
2508 dcb->tag_mask, tag); in msgin_qtag()
2510 if (list_empty(&dcb->srb_going_list)) in msgin_qtag()
2512 list_for_each_entry(i, &dcb->srb_going_list, list) { in msgin_qtag()
2513 if (i->tag_number == tag) { in msgin_qtag()
2521 dprintkdbg(DBG_0, "msgin_qtag: (0x%p) <%02i-%i>\n", in msgin_qtag()
2522 srb->cmd, srb->dcb->target_id, srb->dcb->target_lun); in msgin_qtag()
2523 if (dcb->flag & ABORT_DEV_) { in msgin_qtag()
2524 /*srb->state = SRB_ABORT_SENT; */ in msgin_qtag()
2528 if (!(srb->state & SRB_DISCONNECT)) in msgin_qtag()
2531 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2532 srb->state |= dcb->active_srb->state; in msgin_qtag()
2533 srb->state |= SRB_DATA_XFER; in msgin_qtag()
2534 dcb->active_srb = srb; in msgin_qtag()
2539 srb = acb->tmp_srb; in msgin_qtag()
2540 srb->state = SRB_UNEXPECT_RESEL; in msgin_qtag()
2541 dcb->active_srb = srb; in msgin_qtag()
2542 srb->msgout_buf[0] = MSG_ABORT_TAG; in msgin_qtag()
2543 srb->msg_count = 1; in msgin_qtag()
2545 dprintkl(KERN_DEBUG, "msgin_qtag: Unknown tag %i - abort\n", tag); in msgin_qtag()
2553 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2554 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2555 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2563 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_async()
2564 dprintkl(KERN_DEBUG, "msgin_set_async: No sync transfers <%02i-%i>\n", in msgin_set_async()
2565 dcb->target_id, dcb->target_lun); in msgin_set_async()
2567 dcb->sync_mode &= ~(SYNC_NEGO_ENABLE); in msgin_set_async()
2568 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_async()
2569 /*dcb->sync_period &= 0; */ in msgin_set_async()
2570 dcb->sync_offset = 0; in msgin_set_async()
2571 dcb->min_nego_period = 200 >> 2; /* 200ns <=> 5 MHz */ in msgin_set_async()
2572 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_async()
2574 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_async()
2575 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_async()
2586 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_sync()
2591 dcb->target_id, srb->msgin_buf[3] << 2, in msgin_set_sync()
2592 (250 / srb->msgin_buf[3]), in msgin_set_sync()
2593 ((250 % srb->msgin_buf[3]) * 10) / srb->msgin_buf[3], in msgin_set_sync()
2594 srb->msgin_buf[4]); in msgin_set_sync()
2596 if (srb->msgin_buf[4] > 15) in msgin_set_sync()
2597 srb->msgin_buf[4] = 15; in msgin_set_sync()
2598 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) in msgin_set_sync()
2599 dcb->sync_offset = 0; in msgin_set_sync()
2600 else if (dcb->sync_offset == 0) in msgin_set_sync()
2601 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2602 if (srb->msgin_buf[4] > dcb->sync_offset) in msgin_set_sync()
2603 srb->msgin_buf[4] = dcb->sync_offset; in msgin_set_sync()
2605 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2607 while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval] in msgin_set_sync()
2608 || dcb->min_nego_period > in msgin_set_sync()
2611 if (srb->msgin_buf[3] < clock_period[bval]) in msgin_set_sync()
2615 srb->msgin_buf[3] = clock_period[bval]; in msgin_set_sync()
2616 dcb->sync_period &= 0xf0; in msgin_set_sync()
2617 dcb->sync_period |= ALT_SYNC | bval; in msgin_set_sync()
2618 dcb->min_nego_period = srb->msgin_buf[3]; in msgin_set_sync()
2620 if (dcb->sync_period & WIDE_SYNC) in msgin_set_sync()
2627 dcb->target_id, (fact == 500) ? "Wide16" : "", in msgin_set_sync()
2628 dcb->min_nego_period << 2, dcb->sync_offset, in msgin_set_sync()
2629 (fact / dcb->min_nego_period), in msgin_set_sync()
2630 ((fact % dcb->min_nego_period) * 10 + in msgin_set_sync()
2631 dcb->min_nego_period / 2) / dcb->min_nego_period); in msgin_set_sync()
2633 if (!(srb->state & SRB_DO_SYNC_NEGO)) { in msgin_set_sync()
2636 srb->msgin_buf[3] << 2, srb->msgin_buf[4]); in msgin_set_sync()
2638 memcpy(srb->msgout_buf, srb->msgin_buf, 5); in msgin_set_sync()
2639 srb->msg_count = 5; in msgin_set_sync()
2641 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_sync()
2643 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_sync()
2644 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_sync()
2650 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_sync()
2651 dcb->sync_mode |= SYNC_NEGO_DONE | SYNC_NEGO_ENABLE; in msgin_set_sync()
2660 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_nowide()
2661 dprintkdbg(DBG_1, "msgin_set_nowide: <%02i>\n", dcb->target_id); in msgin_set_nowide()
2663 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_nowide()
2664 dcb->sync_mode &= ~(WIDE_NEGO_ENABLE); in msgin_set_nowide()
2665 dcb->sync_mode |= WIDE_NEGO_DONE; in msgin_set_nowide()
2666 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_nowide()
2668 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_nowide()
2669 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_nowide()
2678 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_wide()
2679 u8 wide = (dcb->dev_mode & NTC_DO_WIDE_NEGO in msgin_set_wide()
2680 && acb->config & HCC_WIDE_CARD) ? 1 : 0; in msgin_set_wide()
2681 dprintkdbg(DBG_1, "msgin_set_wide: <%02i>\n", dcb->target_id); in msgin_set_wide()
2683 if (srb->msgin_buf[3] > wide) in msgin_set_wide()
2684 srb->msgin_buf[3] = wide; in msgin_set_wide()
2686 if (!(srb->state & SRB_DO_WIDE_NEGO)) { in msgin_set_wide()
2689 dcb->target_id); in msgin_set_wide()
2690 memcpy(srb->msgout_buf, srb->msgin_buf, 4); in msgin_set_wide()
2691 srb->msg_count = 4; in msgin_set_wide()
2692 srb->state |= SRB_DO_WIDE_NEGO; in msgin_set_wide()
2696 dcb->sync_mode |= (WIDE_NEGO_ENABLE | WIDE_NEGO_DONE); in msgin_set_wide()
2697 if (srb->msgin_buf[3] > 0) in msgin_set_wide()
2698 dcb->sync_period |= WIDE_SYNC; in msgin_set_wide()
2700 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_wide()
2701 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_wide()
2702 /*dcb->sync_mode &= ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); */ in msgin_set_wide()
2705 (8 << srb->msgin_buf[3]), dcb->target_id); in msgin_set_wide()
2707 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_wide()
2708 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_wide()
2725 * 04h - 7Fh Reserved
2726 * 80h - FFh Vendor specific
2731 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0()
2732 dprintkdbg(DBG_0, "msgin_phase0: (0x%p)\n", srb->cmd); in msgin_phase0()
2734 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2735 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2737 switch (srb->msgin_buf[0]) { in msgin_phase0()
2739 srb->state = SRB_DISCONNECT; in msgin_phase0()
2747 srb->msgin_buf[1]); in msgin_phase0()
2754 if (srb->state & SRB_DO_SYNC_NEGO) { in msgin_phase0()
2759 if (srb->state & SRB_DO_WIDE_NEGO) { in msgin_phase0()
2764 /*srb->state |= SRB_ABORT_SENT */ in msgin_phase0()
2769 if (srb->msgin_buf[1] == 3 in msgin_phase0()
2770 && srb->msgin_buf[2] == EXTENDED_SDTR) { in msgin_phase0()
2775 if (srb->msgin_buf[1] == 2 in msgin_phase0()
2776 && srb->msgin_buf[2] == EXTENDED_WDTR in msgin_phase0()
2777 && srb->msgin_buf[3] <= 2) { /* sanity check ... */ in msgin_phase0()
2800 srb->cmd, srb->total_xfer_length); in msgin_phase0()
2809 "<%02i-%i> ABORT msg\n", in msgin_phase0()
2810 srb->cmd, dcb->target_id, in msgin_phase0()
2811 dcb->target_lun); in msgin_phase0()
2812 dcb->flag |= ABORT_DEV_; in msgin_phase0()
2818 if (srb->msgin_buf[0] & IDENTIFY_BASE) { in msgin_phase0()
2820 srb->msg_count = 1; in msgin_phase0()
2821 srb->msgout_buf[0] = dcb->identify_msg; in msgin_phase0()
2823 srb->state |= SRB_MSGOUT; in msgin_phase0()
2830 srb->state &= ~SRB_MSGIN; in msgin_phase0()
2831 acb->msg_len = 0; in msgin_phase0()
2842 dprintkdbg(DBG_0, "msgin_phase1: (0x%p)\n", srb->cmd); in msgin_phase1()
2845 if (!(srb->state & SRB_MSGIN)) { in msgin_phase1()
2846 srb->state &= ~SRB_DISCONNECT; in msgin_phase1()
2847 srb->state |= SRB_MSGIN; in msgin_phase1()
2872 if (dcb->identify_msg & 0x07) in set_xfer_rate()
2875 if (acb->scan_devices) { in set_xfer_rate()
2876 current_sync_offset = dcb->sync_offset; in set_xfer_rate()
2880 list_for_each_entry(i, &acb->dcb_list, list) in set_xfer_rate()
2881 if (i->target_id == dcb->target_id) { in set_xfer_rate()
2882 i->sync_period = dcb->sync_period; in set_xfer_rate()
2883 i->sync_offset = dcb->sync_offset; in set_xfer_rate()
2884 i->sync_mode = dcb->sync_mode; in set_xfer_rate()
2885 i->min_nego_period = dcb->min_nego_period; in set_xfer_rate()
2892 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect()
2899 acb->last_reset = in disconnect()
2901 HZ * acb->eeprom.delay_time; in disconnect()
2906 srb = dcb->active_srb; in disconnect()
2907 acb->active_dcb = NULL; in disconnect()
2908 dprintkdbg(DBG_0, "disconnect: (0x%p)\n", srb->cmd); in disconnect()
2910 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in disconnect()
2913 if (srb->state & SRB_UNEXPECT_RESEL) { in disconnect()
2915 "disconnect: Unexpected reselection <%02i-%i>\n", in disconnect()
2916 dcb->target_id, dcb->target_lun); in disconnect()
2917 srb->state = 0; in disconnect()
2919 } else if (srb->state & SRB_ABORT_SENT) { in disconnect()
2920 dcb->flag &= ~ABORT_DEV_; in disconnect()
2921 acb->last_reset = jiffies + HZ / 2 + 1; in disconnect()
2923 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2926 if ((srb->state & (SRB_START_ + SRB_MSGOUT)) in disconnect()
2927 || !(srb-> in disconnect()
2933 /* Unexp. Disc / Sel Timeout */ in disconnect()
2934 if (srb->state != SRB_START_ in disconnect()
2935 && srb->state != SRB_MSGOUT) { in disconnect()
2936 srb->state = SRB_READY; in disconnect()
2939 srb->cmd); in disconnect()
2940 srb->target_status = SCSI_STAT_SEL_TIMEOUT; in disconnect()
2945 "<%02i-%i> SelTO\n", srb->cmd, in disconnect()
2946 dcb->target_id, dcb->target_lun); in disconnect()
2947 if (srb->retry_count++ > DC395x_MAX_RETRIES in disconnect()
2948 || acb->scan_devices) { in disconnect()
2949 srb->target_status = in disconnect()
2954 list_move(&srb->list, &dcb->srb_waiting_list); in disconnect()
2957 srb->cmd); in disconnect()
2960 } else if (srb->state & SRB_DISCONNECT) { in disconnect()
2972 } else if (srb->state & SRB_COMPLETED) { in disconnect()
2978 dcb->active_srb = NULL; in disconnect()
2979 srb->state = SRB_FREE; in disconnect()
2988 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect()
3000 srb = dcb->active_srb; in reselect()
3008 if (!acb->scan_devices) { in reselect()
3009 dprintkdbg(DBG_KG, "reselect: (0x%p) <%02i-%i> " in reselect()
3011 srb->cmd, dcb->target_id, in reselect()
3012 dcb->target_lun, rsel_tar_lun_id, in reselect()
3015 /*srb->state |= SRB_DISCONNECT; */ in reselect()
3017 srb->state = SRB_READY; in reselect()
3019 list_move(&srb->list, &dcb->srb_waiting_list); in reselect()
3034 "<%02i-%i>\n", id, lun); in reselect()
3038 acb->active_dcb = dcb; in reselect()
3040 if (!(dcb->dev_mode & NTC_DO_DISCONNECT)) in reselect()
3042 "disconnection? <%02i-%i>\n", in reselect()
3043 dcb->target_id, dcb->target_lun); in reselect()
3045 if (dcb->sync_mode & EN_TAG_QUEUEING /*&& !arblostflag */) { in reselect()
3046 srb = acb->tmp_srb; in reselect()
3047 dcb->active_srb = srb; in reselect()
3050 srb = dcb->active_srb; in reselect()
3051 if (!srb || !(srb->state & SRB_DISCONNECT)) { in reselect()
3056 "reselect: w/o disconnected cmds <%02i-%i>\n", in reselect()
3057 dcb->target_id, dcb->target_lun); in reselect()
3058 srb = acb->tmp_srb; in reselect()
3059 srb->state = SRB_UNEXPECT_RESEL; in reselect()
3060 dcb->active_srb = srb; in reselect()
3063 if (dcb->flag & ABORT_DEV_) { in reselect()
3064 /*srb->state = SRB_ABORT_SENT; */ in reselect()
3067 srb->state = SRB_DATA_XFER; in reselect()
3071 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in reselect()
3074 dprintkdbg(DBG_0, "reselect: select <%i>\n", dcb->target_id); in reselect()
3075 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); /* host ID */ in reselect()
3076 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
3077 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
3078 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
3104 if ((ptr->Vers & 0x07) >= 2 || (ptr->RDF & 0x0F) == 2) { in disc_tagq_set()
3105 if ((ptr->Flags & SCSI_INQ_CMDQUEUE) in disc_tagq_set()
3106 && (dcb->dev_mode & NTC_DO_TAG_QUEUEING) && in disc_tagq_set()
3107 /*(dcb->dev_mode & NTC_DO_DISCONNECT) */ in disc_tagq_set()
3108 /* ((dcb->dev_type == TYPE_DISK) in disc_tagq_set()
3109 || (dcb->dev_type == TYPE_MOD)) && */ in disc_tagq_set()
3111 if (dcb->max_command == 1) in disc_tagq_set()
3112 dcb->max_command = in disc_tagq_set()
3113 dcb->acb->tag_max_num; in disc_tagq_set()
3114 dcb->sync_mode |= EN_TAG_QUEUEING; in disc_tagq_set()
3115 /*dcb->tag_mask = 0; */ in disc_tagq_set()
3117 dcb->max_command = 1; in disc_tagq_set()
3125 u8 bval1 = ptr->DevType & SCSI_DEVTYPE; in add_dev()
3126 dcb->dev_type = bval1; in add_dev()
3135 struct scsi_cmnd *cmd = srb->cmd; in pci_unmap_srb()
3136 enum dma_data_direction dir = cmd->sc_data_direction; in pci_unmap_srb()
3141 srb->sg_bus_addr, SEGMENTX_LEN); in pci_unmap_srb()
3142 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
3156 if (!(srb->flag & AUTO_REQSENSE)) in pci_unmap_srb_sense()
3160 srb->segment_x[0].address); in pci_unmap_srb_sense()
3161 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3162 srb->segment_x[0].length, DMA_FROM_DEVICE); in pci_unmap_srb_sense()
3164 srb->total_xfer_length = srb->xferred; in pci_unmap_srb_sense()
3165 srb->segment_x[0].address = in pci_unmap_srb_sense()
3166 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address; in pci_unmap_srb_sense()
3167 srb->segment_x[0].length = in pci_unmap_srb_sense()
3168 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length; in pci_unmap_srb_sense()
3180 struct scsi_cmnd *cmd = srb->cmd; in srb_done()
3181 enum dma_data_direction dir = cmd->sc_data_direction; in srb_done()
3184 dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd, in srb_done()
3185 srb->cmd->device->id, (u8)srb->cmd->device->lun); in srb_done()
3187 srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count, in srb_done()
3189 status = srb->target_status; in srb_done()
3190 if (srb->flag & AUTO_REQSENSE) { in srb_done()
3196 srb->flag &= ~AUTO_REQSENSE; in srb_done()
3197 srb->adapter_status = 0; in srb_done()
3198 srb->target_status = CHECK_CONDITION << 1; in srb_done()
3200 switch (cmd->sense_buffer[2] & 0x0f) { in srb_done()
3203 "ReqSense: NOT_READY cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3204 cmd->cmnd[0], dcb->target_id, in srb_done()
3205 dcb->target_lun, status, acb->scan_devices); in srb_done()
3209 "ReqSense: UNIT_ATTENTION cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3210 cmd->cmnd[0], dcb->target_id, in srb_done()
3211 dcb->target_lun, status, acb->scan_devices); in srb_done()
3215 "ReqSense: ILLEGAL_REQUEST cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3216 cmd->cmnd[0], dcb->target_id, in srb_done()
3217 dcb->target_lun, status, acb->scan_devices); in srb_done()
3221 "ReqSense: MEDIUM_ERROR cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3222 cmd->cmnd[0], dcb->target_id, in srb_done()
3223 dcb->target_lun, status, acb->scan_devices); in srb_done()
3227 "ReqSense: HARDWARE_ERROR cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3228 cmd->cmnd[0], dcb->target_id, in srb_done()
3229 dcb->target_lun, status, acb->scan_devices); in srb_done()
3232 if (cmd->sense_buffer[7] >= 6) in srb_done()
3235 cmd->sense_buffer[2], cmd->sense_buffer[12], in srb_done()
3236 cmd->sense_buffer[13], in srb_done()
3237 *((unsigned int *)(cmd->sense_buffer + 3)), in srb_done()
3238 *((unsigned int *)(cmd->sense_buffer + 8))); in srb_done()
3241 cmd->sense_buffer[2], in srb_done()
3242 *((unsigned int *)(cmd->sense_buffer + 3))); in srb_done()
3246 cmd->result = DID_BAD_TARGET << 16; in srb_done()
3251 if (srb->total_xfer_length in srb_done()
3252 && srb->total_xfer_length >= cmd->underflow) in srb_done()
3253 cmd->result = in srb_done()
3255 srb->end_message, CHECK_CONDITION); in srb_done()
3256 /*SET_RES_DID(cmd->result,DID_OK) */ in srb_done()
3258 cmd->result = in srb_done()
3260 srb->end_message, CHECK_CONDITION); in srb_done()
3274 tempcnt = (u8)list_size(&dcb->srb_going_list); in srb_done()
3275 dprintkl(KERN_INFO, "QUEUE_FULL for dev <%02i-%i> with %i cmnds\n", in srb_done()
3276 dcb->target_id, dcb->target_lun, tempcnt); in srb_done()
3278 tempcnt--; in srb_done()
3279 dcb->max_command = tempcnt; in srb_done()
3281 list_move(&srb->list, &dcb->srb_waiting_list); in srb_done()
3283 srb->adapter_status = 0; in srb_done()
3284 srb->target_status = 0; in srb_done()
3287 srb->adapter_status = H_SEL_TIMEOUT; in srb_done()
3288 srb->target_status = 0; in srb_done()
3289 cmd->result = DID_NO_CONNECT << 16; in srb_done()
3291 srb->adapter_status = 0; in srb_done()
3292 SET_RES_DID(cmd->result, DID_ERROR); in srb_done()
3293 SET_RES_MSG(cmd->result, srb->end_message); in srb_done()
3294 SET_RES_TARGET(cmd->result, status); in srb_done()
3301 status = srb->adapter_status; in srb_done()
3303 srb->target_status = 0; in srb_done()
3304 SET_RES_DID(cmd->result, DID_OK); in srb_done()
3305 SET_RES_MSG(cmd->result, srb->end_message); in srb_done()
3306 } else if (srb->status & PARITY_ERROR) { in srb_done()
3307 SET_RES_DID(cmd->result, DID_PARITY); in srb_done()
3308 SET_RES_MSG(cmd->result, srb->end_message); in srb_done()
3311 srb->adapter_status = 0; in srb_done()
3312 srb->target_status = 0; in srb_done()
3313 SET_RES_DID(cmd->result, DID_OK); in srb_done()
3323 if (cmd->cmnd[0] == INQUIRY) { in srb_done()
3334 if (!ckc_only && (cmd->result & RES_DID) == 0 in srb_done()
3335 && cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8 in srb_done()
3336 && dir != DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) in srb_done()
3337 dcb->inquiry7 = ptr->Flags; in srb_done()
3339 /*if( srb->cmd->cmnd[0] == INQUIRY && */ in srb_done()
3340 /* (host_byte(cmd->result) == DID_OK || status_byte(cmd->result) & CHECK_CONDITION) ) */ in srb_done()
3341 if ((cmd->result == (DID_OK << 16) || in srb_done()
3342 status_byte(cmd->result) == CHECK_CONDITION)) { in srb_done()
3343 if (!dcb->init_tcq_flag) { in srb_done()
3345 dcb->init_tcq_flag = 1; in srb_done()
3354 scsi_set_resid(cmd, srb->total_xfer_length); in srb_done()
3356 cmd->SCp.this_residual = srb->total_xfer_length; in srb_done()
3357 cmd->SCp.buffers_residual = 0; in srb_done()
3359 if (srb->total_xfer_length) in srb_done()
3360 dprintkdbg(DBG_KG, "srb_done: (0x%p) <%02i-%i> " in srb_done()
3362 cmd, cmd->device->id, (u8)cmd->device->lun, in srb_done()
3363 cmd->cmnd[0], srb->total_xfer_length); in srb_done()
3366 if (srb != acb->tmp_srb) { in srb_done()
3369 cmd, cmd->result); in srb_done()
3370 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
3375 cmd->scsi_done(cmd); in srb_done()
3387 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
3392 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) { in doing_srb_done()
3396 p = srb->cmd; in doing_srb_done()
3397 dir = p->sc_data_direction; in doing_srb_done()
3399 printk("G:%p(%02i-%i) ", p, in doing_srb_done()
3400 p->device->id, (u8)p->device->lun); in doing_srb_done()
3401 list_del(&srb->list); in doing_srb_done()
3403 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3404 p->result = result; in doing_srb_done()
3410 p->scsi_done(p); in doing_srb_done()
3413 if (!list_empty(&dcb->srb_going_list)) in doing_srb_done()
3415 "How could the ML send cmnds to the Going queue? <%02i-%i>\n", in doing_srb_done()
3416 dcb->target_id, dcb->target_lun); in doing_srb_done()
3417 if (dcb->tag_mask) in doing_srb_done()
3419 "tag_mask for <%02i-%i> should be empty, is %08x!\n", in doing_srb_done()
3420 dcb->target_id, dcb->target_lun, in doing_srb_done()
3421 dcb->tag_mask); in doing_srb_done()
3424 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) { in doing_srb_done()
3426 p = srb->cmd; in doing_srb_done()
3429 printk("W:%p<%02i-%i>", p, p->device->id, in doing_srb_done()
3430 (u8)p->device->lun); in doing_srb_done()
3431 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3432 p->result = result; in doing_srb_done()
3438 cmd->scsi_done(cmd); in doing_srb_done()
3441 if (!list_empty(&dcb->srb_waiting_list)) in doing_srb_done()
3442 dprintkl(KERN_DEBUG, "ML queued %i cmnds again to <%02i-%i>\n", in doing_srb_done()
3443 list_size(&dcb->srb_waiting_list), dcb->target_id, in doing_srb_done()
3444 dcb->target_lun); in doing_srb_done()
3445 dcb->flag &= ~ABORT_DEV_; in doing_srb_done()
3454 acb->acb_flag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in reset_scsi_bus()
3466 DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout); in set_basic_config()
3467 if (acb->config & HCC_PARITY) in set_basic_config()
3477 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in set_basic_config()
3483 /* DMA config */ in set_basic_config()
3502 if (timer_pending(&acb->waiting_timer)) in scsi_reset_detect()
3503 del_timer(&acb->waiting_timer); in scsi_reset_detect()
3510 acb->last_reset = in scsi_reset_detect()
3512 HZ * acb->eeprom.delay_time; in scsi_reset_detect()
3519 if (acb->acb_flag & RESET_DEV) { /* RESET_DETECT, RESET_DONE, RESET_DEV */ in scsi_reset_detect()
3520 acb->acb_flag |= RESET_DONE; in scsi_reset_detect()
3522 acb->acb_flag |= RESET_DETECT; in scsi_reset_detect()
3526 acb->active_dcb = NULL; in scsi_reset_detect()
3527 acb->acb_flag = 0; in scsi_reset_detect()
3536 struct scsi_cmnd *cmd = srb->cmd; in request_sense()
3537 dprintkdbg(DBG_1, "request_sense: (0x%p) <%02i-%i>\n", in request_sense()
3538 cmd, cmd->device->id, (u8)cmd->device->lun); in request_sense()
3540 srb->flag |= AUTO_REQSENSE; in request_sense()
3541 srb->adapter_status = 0; in request_sense()
3542 srb->target_status = 0; in request_sense()
3545 memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in request_sense()
3548 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address = in request_sense()
3549 srb->segment_x[0].address; in request_sense()
3550 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length = in request_sense()
3551 srb->segment_x[0].length; in request_sense()
3552 srb->xferred = srb->total_xfer_length; in request_sense()
3553 /* srb->segment_x : a one entry of S/G list table */ in request_sense()
3554 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3555 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3557 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
3558 cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE, in request_sense()
3560 dprintkdbg(DBG_SG, "request_sense: map buffer %p->%08x(%05x)\n", in request_sense()
3561 cmd->sense_buffer, srb->segment_x[0].address, in request_sense()
3563 srb->sg_count = 1; in request_sense()
3564 srb->sg_index = 0; in request_sense()
3568 "request_sense: (0x%p) failed <%02i-%i>\n", in request_sense()
3569 srb->cmd, dcb->target_id, dcb->target_lun); in request_sense()
3570 list_move(&srb->list, &dcb->srb_waiting_list); in request_sense()
3577 * device_alloc - Allocate a new device instance. This create the
3592 struct NvRamType *eeprom = &acb->eeprom; in device_alloc()
3593 u8 period_index = eeprom->target[target].period & 0x07; in device_alloc()
3597 dprintkdbg(DBG_0, "device_alloc: <%02i-%i>\n", target, lun); in device_alloc()
3600 dcb->acb = NULL; in device_alloc()
3601 INIT_LIST_HEAD(&dcb->srb_going_list); in device_alloc()
3602 INIT_LIST_HEAD(&dcb->srb_waiting_list); in device_alloc()
3603 dcb->active_srb = NULL; in device_alloc()
3604 dcb->tag_mask = 0; in device_alloc()
3605 dcb->max_command = 1; in device_alloc()
3606 dcb->target_id = target; in device_alloc()
3607 dcb->target_lun = lun; in device_alloc()
3608 dcb->dev_mode = eeprom->target[target].cfg0; in device_alloc()
3610 dcb->identify_msg = in device_alloc()
3611 IDENTIFY(dcb->dev_mode & NTC_DO_DISCONNECT, lun); in device_alloc()
3613 dcb->identify_msg = IDENTIFY(0, lun); in device_alloc()
3615 dcb->inquiry7 = 0; in device_alloc()
3616 dcb->sync_mode = 0; in device_alloc()
3617 dcb->min_nego_period = clock_period[period_index]; in device_alloc()
3618 dcb->sync_period = 0; in device_alloc()
3619 dcb->sync_offset = 0; in device_alloc()
3620 dcb->flag = 0; in device_alloc()
3623 if ((dcb->dev_mode & NTC_DO_WIDE_NEGO) in device_alloc()
3624 && (acb->config & HCC_WIDE_CARD)) in device_alloc()
3625 dcb->sync_mode |= WIDE_NEGO_ENABLE; in device_alloc()
3628 if (dcb->dev_mode & NTC_DO_SYNC_NEGO) in device_alloc()
3630 dcb->sync_mode |= SYNC_NEGO_ENABLE; in device_alloc()
3632 if (dcb->target_lun != 0) { in device_alloc()
3636 list_for_each_entry(iter, &acb->dcb_list, list) in device_alloc()
3637 if (iter->target_id == dcb->target_id) { in device_alloc()
3648 "device_alloc: <%02i-%i> copy from <%02i-%i>\n", in device_alloc()
3649 dcb->target_id, dcb->target_lun, in device_alloc()
3650 p->target_id, p->target_lun); in device_alloc()
3651 dcb->sync_mode = p->sync_mode; in device_alloc()
3652 dcb->sync_period = p->sync_period; in device_alloc()
3653 dcb->min_nego_period = p->min_nego_period; in device_alloc()
3654 dcb->sync_offset = p->sync_offset; in device_alloc()
3655 dcb->inquiry7 = p->inquiry7; in device_alloc()
3662 * adapter_add_device - Adds the device instance to the adaptor instance.
3671 dcb->acb = acb; in adapter_add_device()
3674 if (list_empty(&acb->dcb_list)) in adapter_add_device()
3675 acb->dcb_run_robin = dcb; in adapter_add_device()
3678 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3681 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3682 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3687 * adapter_remove_device - Removes the device instance from the adaptor
3700 dprintkdbg(DBG_0, "adapter_remove_device: <%02i-%i>\n", in adapter_remove_device()
3701 dcb->target_id, dcb->target_lun); in adapter_remove_device()
3704 if (acb->active_dcb == dcb) in adapter_remove_device()
3705 acb->active_dcb = NULL; in adapter_remove_device()
3706 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3707 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3710 list_for_each_entry_safe(i, tmp, &acb->dcb_list, list) in adapter_remove_device()
3712 list_del(&i->list); in adapter_remove_device()
3717 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3718 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3719 dcb->acb = NULL; in adapter_remove_device()
3724 * adapter_remove_and_free_device - Removes a single device from the adapter
3733 if (list_size(&dcb->srb_going_list) > 1) { in adapter_remove_and_free_device()
3734 dprintkdbg(DBG_1, "adapter_remove_and_free_device: <%02i-%i> " in adapter_remove_and_free_device()
3736 dcb->target_id, dcb->target_lun, in adapter_remove_and_free_device()
3737 list_size(&dcb->srb_going_list)); in adapter_remove_and_free_device()
3746 * adapter_remove_and_free_all_devices - Removes and frees all of the
3756 list_size(&acb->dcb_list)); in adapter_remove_and_free_all_devices()
3758 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3764 * dc395x_slave_alloc - Called by the scsi mid layer to tell us about a new
3772 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_alloc()
3775 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_alloc()
3777 return -ENOMEM; in dc395x_slave_alloc()
3785 * dc395x_slave_destroy - Called by the scsi mid layer to tell us about a
3792 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_slave_destroy()
3793 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_destroy()
3818 * trms1040_write_cmd - write the secified command and address to
3861 * trms1040_set_data - store a single byte in the eeprom
3917 * trms1040_write_all - write 128 bytes to the eeprom
3954 * trms1040_get_data - get a single byte from the eeprom
3995 * trms1040_read_all - read all bytes from the eeprom
4023 * check_eeprom - get and check contents of the eeprom
4053 eeprom->sub_vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM; in check_eeprom()
4054 eeprom->sub_vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8); in check_eeprom()
4055 eeprom->sub_sys_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040; in check_eeprom()
4056 eeprom->sub_sys_id[1] = in check_eeprom()
4058 eeprom->sub_class = 0x00; in check_eeprom()
4059 eeprom->vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM; in check_eeprom()
4060 eeprom->vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8); in check_eeprom()
4061 eeprom->device_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040; in check_eeprom()
4062 eeprom->device_id[1] = in check_eeprom()
4064 eeprom->reserved = 0x00; in check_eeprom()
4066 for (d_addr = 0, d_eeprom = (u32 *)eeprom->target; in check_eeprom()
4080 eeprom->cksum = 0x00; in check_eeprom()
4085 *w_eeprom = 0x1234 - cksum; in check_eeprom()
4087 eeprom->delay_time = cfg_data[CFG_RESET_DELAY].value; in check_eeprom()
4097 * print_eeprom_settings - output the eeprom settings
4105 eeprom->scsi_id, in print_eeprom_settings()
4106 eeprom->target[0].period, in print_eeprom_settings()
4107 clock_speed[eeprom->target[0].period] / 10, in print_eeprom_settings()
4108 clock_speed[eeprom->target[0].period] % 10, in print_eeprom_settings()
4109 eeprom->target[0].cfg0); in print_eeprom_settings()
4111 eeprom->channel_cfg, eeprom->max_tag, in print_eeprom_settings()
4112 1 << eeprom->max_tag, eeprom->delay_time); in print_eeprom_settings()
4123 kfree(acb->srb_array[i].segment_x); in adapter_sg_tables_free()
4134 int pages = (mem_needed+(PAGE_SIZE-1))/PAGE_SIZE; in adapter_sg_tables_alloc()
4141 acb->srb_array[i].segment_x = NULL; in adapter_sg_tables_alloc()
4144 while (pages--) { in adapter_sg_tables_alloc()
4154 acb->srb_array[srb_idx++].segment_x = in adapter_sg_tables_alloc()
4158 acb->srb.segment_x = in adapter_sg_tables_alloc()
4168 * adapter_print_config - print adapter connection and termination
4169 * config
4209 * adapter_init_params - Initialize the various parameters in the
4222 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_params()
4225 /* NOTE: acb->scsi_host is set at scsi_host/acb creation time */ in adapter_init_params()
4226 /* NOTE: acb->io_port_base is set at port registration time */ in adapter_init_params()
4227 /* NOTE: acb->io_port_len is set at port registration time */ in adapter_init_params()
4229 INIT_LIST_HEAD(&acb->dcb_list); in adapter_init_params()
4230 acb->dcb_run_robin = NULL; in adapter_init_params()
4231 acb->active_dcb = NULL; in adapter_init_params()
4233 INIT_LIST_HEAD(&acb->srb_free_list); in adapter_init_params()
4235 acb->tmp_srb = &acb->srb; in adapter_init_params()
4236 timer_setup(&acb->waiting_timer, waiting_timeout, 0); in adapter_init_params()
4237 timer_setup(&acb->selto_timer, NULL, 0); in adapter_init_params()
4239 acb->srb_count = DC395x_MAX_SRB_CNT; in adapter_init_params()
4241 acb->sel_timeout = DC395x_SEL_TIMEOUT; /* timeout=250ms */ in adapter_init_params()
4242 /* NOTE: acb->irq_level is set at IRQ registration time */ in adapter_init_params()
4244 acb->tag_max_num = 1 << eeprom->max_tag; in adapter_init_params()
4245 if (acb->tag_max_num > 30) in adapter_init_params()
4246 acb->tag_max_num = 30; in adapter_init_params()
4248 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in adapter_init_params()
4249 acb->gmode2 = eeprom->channel_cfg; in adapter_init_params()
4250 acb->config = 0; /* NOTE: actually set in adapter_init_chip */ in adapter_init_params()
4252 if (eeprom->channel_cfg & NAC_SCANLUN) in adapter_init_params()
4253 acb->lun_chk = 1; in adapter_init_params()
4254 acb->scan_devices = 1; in adapter_init_params()
4256 acb->scsi_host->this_id = eeprom->scsi_id; in adapter_init_params()
4257 acb->hostid_bit = (1 << acb->scsi_host->this_id); in adapter_init_params()
4260 acb->dcb_map[i] = 0; in adapter_init_params()
4262 acb->msg_len = 0; in adapter_init_params()
4265 for (i = 0; i < acb->srb_count - 1; i++) in adapter_init_params()
4266 list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); in adapter_init_params()
4271 * adapter_init_host - Initialize the scsi host instance based on
4284 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in adapter_init_scsi_host()
4285 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_scsi_host()
4287 host->max_cmd_len = 24; in adapter_init_scsi_host()
4288 host->can_queue = DC395x_MAX_CMD_QUEUE; in adapter_init_scsi_host()
4289 host->cmd_per_lun = DC395x_MAX_CMD_PER_LUN; in adapter_init_scsi_host()
4290 host->this_id = (int)eeprom->scsi_id; in adapter_init_scsi_host()
4291 host->io_port = acb->io_port_base; in adapter_init_scsi_host()
4292 host->n_io_port = acb->io_port_len; in adapter_init_scsi_host()
4293 host->dma_channel = -1; in adapter_init_scsi_host()
4294 host->unique_id = acb->io_port_base; in adapter_init_scsi_host()
4295 host->irq = acb->irq_level; in adapter_init_scsi_host()
4296 acb->last_reset = jiffies; in adapter_init_scsi_host()
4298 host->max_id = 16; in adapter_init_scsi_host()
4299 if (host->max_id - 1 == eeprom->scsi_id) in adapter_init_scsi_host()
4300 host->max_id--; in adapter_init_scsi_host()
4302 if (eeprom->channel_cfg & NAC_SCANLUN) in adapter_init_scsi_host()
4303 host->max_lun = 8; in adapter_init_scsi_host()
4305 host->max_lun = 1; in adapter_init_scsi_host()
4310 * adapter_init_chip - Get the chip into a know state and figure out
4314 * this function. The config will be configured correctly on return.
4320 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_chip()
4334 acb->config = HCC_AUTOTERM | HCC_PARITY; in adapter_init_chip()
4336 acb->config |= HCC_WIDE_CARD; in adapter_init_chip()
4338 if (eeprom->channel_cfg & NAC_POWERON_SCSI_RESET) in adapter_init_chip()
4339 acb->config |= HCC_SCSI_RESET; in adapter_init_chip()
4341 if (acb->config & HCC_SCSI_RESET) { in adapter_init_chip()
4349 acb->last_reset = in adapter_init_chip()
4351 HZ * acb->eeprom.delay_time; in adapter_init_chip()
4359 * init_adapter - Grab the resource for the card, setup the adapter
4379 acb->io_port_base = io_port; in adapter_init()
4380 acb->io_port_len = io_port_len; in adapter_init()
4388 acb->irq_level = irq; in adapter_init()
4391 check_eeprom(&acb->eeprom, io_port); in adapter_init()
4392 print_eeprom_settings(&acb->eeprom); in adapter_init()
4404 adapter_init_scsi_host(acb->scsi_host); in adapter_init()
4411 acb, acb->dcb_map, acb->srb_array, sizeof(struct AdapterCtlBlk), in adapter_init()
4416 if (acb->irq_level) in adapter_init()
4417 free_irq(acb->irq_level, acb); in adapter_init()
4418 if (acb->io_port_base) in adapter_init()
4419 release_region(acb->io_port_base, acb->io_port_len); in adapter_init()
4427 * adapter_uninit_chip - cleanly shut down the scsi controller chip,
4440 if (acb->config & HCC_SCSI_RESET) in adapter_uninit_chip()
4450 * adapter_uninit - Shut down the chip and release any resources that
4454 * @acb: The adapter which we are to un-initialize.
4459 DC395x_LOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4462 if (timer_pending(&acb->waiting_timer)) in adapter_uninit()
4463 del_timer(&acb->waiting_timer); in adapter_uninit()
4464 if (timer_pending(&acb->selto_timer)) in adapter_uninit()
4465 del_timer(&acb->selto_timer); in adapter_uninit()
4469 DC395x_UNLOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4471 if (acb->irq_level) in adapter_uninit()
4472 free_irq(acb->irq_level, acb); in adapter_uninit()
4473 if (acb->io_port_base) in adapter_uninit()
4474 release_region(acb->io_port_base, acb->io_port_len); in adapter_uninit()
4487 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in dc395x_show_info()
4496 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4498 seq_printf(m, "SCSI Host Nr %i, ", host->host_no); in dc395x_show_info()
4500 (acb->config & HCC_WIDE_CARD) ? "Wide" : ""); in dc395x_show_info()
4501 seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base); in dc395x_show_info()
4502 seq_printf(m, "irq_level 0x%04x, ", acb->irq_level); in dc395x_show_info()
4503 seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000); in dc395x_show_info()
4505 seq_printf(m, "MaxID %i, MaxLUN %llu, ", host->max_id, host->max_lun); in dc395x_show_info()
4506 seq_printf(m, "AdapterID %i\n", host->this_id); in dc395x_show_info()
4508 seq_printf(m, "tag_max_num %i", acb->tag_max_num); in dc395x_show_info()
4512 seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time); in dc395x_show_info()
4515 seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); in dc395x_show_info()
4516 seq_printf(m, "Map of attached LUNs: %8ph\n", &acb->dcb_map[0]); in dc395x_show_info()
4517 seq_printf(m, " %8ph\n", &acb->dcb_map[8]); in dc395x_show_info()
4523 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4525 seq_printf(m, "%02i %02i %02i ", dev, dcb->target_id, in dc395x_show_info()
4526 dcb->target_lun); in dc395x_show_info()
4527 YESNO(dcb->dev_mode & NTC_DO_PARITY_CHK); in dc395x_show_info()
4528 YESNO(dcb->sync_offset); in dc395x_show_info()
4529 YESNO(dcb->sync_period & WIDE_SYNC); in dc395x_show_info()
4530 YESNO(dcb->dev_mode & NTC_DO_DISCONNECT); in dc395x_show_info()
4531 YESNO(dcb->dev_mode & NTC_DO_SEND_START); in dc395x_show_info()
4532 YESNO(dcb->sync_mode & EN_TAG_QUEUEING); in dc395x_show_info()
4533 nego_period = clock_period[dcb->sync_period & 0x07] << 2; in dc395x_show_info()
4534 if (dcb->sync_offset) in dc395x_show_info()
4537 seq_printf(m, " (%03i ns)", (dcb->min_nego_period << 2)); in dc395x_show_info()
4539 if (dcb->sync_offset & 0x0f) { in dc395x_show_info()
4544 (dcb->sync_offset & 0x0f)); in dc395x_show_info()
4549 seq_printf(m, " %02i\n", dcb->max_command); in dc395x_show_info()
4553 if (timer_pending(&acb->waiting_timer)) in dc395x_show_info()
4558 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4560 if (!list_empty(&dcb->srb_waiting_list)) in dc395x_show_info()
4561 seq_printf(m, "DCB (%02i-%i): Waiting: %i:", in dc395x_show_info()
4562 dcb->target_id, dcb->target_lun, in dc395x_show_info()
4563 list_size(&dcb->srb_waiting_list)); in dc395x_show_info()
4564 list_for_each_entry(srb, &dcb->srb_waiting_list, list) in dc395x_show_info()
4565 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
4566 if (!list_empty(&dcb->srb_going_list)) in dc395x_show_info()
4567 seq_printf(m, "\nDCB (%02i-%i): Going : %i:", in dc395x_show_info()
4568 dcb->target_id, dcb->target_lun, in dc395x_show_info()
4569 list_size(&dcb->srb_going_list)); in dc395x_show_info()
4570 list_for_each_entry(srb, &dcb->srb_going_list, list) in dc395x_show_info()
4571 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
4572 if (!list_empty(&dcb->srb_waiting_list) || !list_empty(&dcb->srb_going_list)) in dc395x_show_info()
4578 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4579 seq_printf(m, "%p -> ", dcb); in dc395x_show_info()
4584 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4603 .dma_boundary = PAGE_SIZE - 1,
4608 * banner_display - Display banner on first instance of driver
4623 * dc395x_init_one - Initialise a single instance of the adapter.
4633 * Returns 0 on success, or an error code (-ve) on failure.
4649 return -ENODEV; in dc395x_init_one()
4653 irq = dev->irq; in dc395x_init_one()
4654 dprintkdbg(DBG_0, "IO_PORT=0x%04lx, IRQ=0x%x\n", io_port_base, dev->irq); in dc395x_init_one()
4663 acb = (struct AdapterCtlBlk*)scsi_host->hostdata; in dc395x_init_one()
4664 acb->scsi_host = scsi_host; in dc395x_init_one()
4665 acb->dev = dev; in dc395x_init_one()
4677 if (scsi_add_host(scsi_host, &dev->dev)) { in dc395x_init_one()
4692 return -ENODEV; in dc395x_init_one()
4697 * dc395x_remove_one - Called to remove a single instance of the
4705 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata); in dc395x_remove_one()
4737 MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and …