Lines Matching +full:single +full:- +full:phase
6 * (SCSI chip set used Tekram ASIC TRM-S1040)
11 * (C) Copyright 1995-1999 Tekram Technology Co., Ltd.
14 * (C) 1999-2000 Kurt Garloff
72 #define DC395X_BANNER "Tekram DC395(U/UW/F), DC315(U) - ASIC TRM-S1040"
75 /*---------------------------------------------------------------------------
77 ---------------------------------------------------------------------------*/
86 /*---------------------------------------------------------------------------
88 ---------------------------------------------------------------------------*/
118 * print a debug message - this is formated with KERN_DEBUG, then the
153 #define DC395x_LOCK_IO(dev,flags) spin_lock_irqsave(((struct Scsi_Host *)dev)->host_lock, flags)
154 #define DC395x_UNLOCK_IO(dev,flags) spin_unlock_irqrestore(((struct Scsi_Host *)dev)->host_lock, f…
156 #define DC395x_read8(acb,address) (u8)(inb(acb->io_port_base + (address)))
157 #define DC395x_read16(acb,address) (u16)(inw(acb->io_port_base + (address)))
158 #define DC395x_read32(acb,address) (u32)(inl(acb->io_port_base + (address)))
159 #define DC395x_write8(acb,address,value) outb((value), acb->io_port_base + (address))
160 #define DC395x_write16(acb,address,value) outw((value), acb->io_port_base + (address))
161 #define DC395x_write32(acb,address,value) outl((value), acb->io_port_base + (address))
166 * srb->segement_x is the hw sg list. It is always allocated as a
229 * (srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1] and the
325 /*---------------------------------------------------------------------------
327 ---------------------------------------------------------------------------*/
385 /*---------------------------------------------------------------------------
387 ---------------------------------------------------------------------------*/
391 data_out_phase0,/* phase:0 */
392 data_in_phase0, /* phase:1 */
393 command_phase0, /* phase:2 */
394 status_phase0, /* phase:3 */
395 nop0, /* phase:4 PH_BUS_FREE .. initial phase */
396 nop0, /* phase:5 PH_BUS_FREE .. initial phase */
397 msgout_phase0, /* phase:6 */
398 msgin_phase0, /* phase:7 */
402 data_out_phase1,/* phase:0 */
403 data_in_phase1, /* phase:1 */
404 command_phase1, /* phase:2 */
405 status_phase1, /* phase:3 */
406 nop1, /* phase:4 PH_BUS_FREE .. initial phase */
407 nop1, /* phase:5 PH_BUS_FREE .. initial phase */
408 msgout_phase1, /* phase:6 */
409 msgin_phase1, /* phase:7 */
438 /*---------------------------------------------------------------------------
440 ---------------------------------------------------------------------------*/
465 #define CFG_PARAM_UNSET -1
539 MODULE_PARM_DESC(adapter_id, "Adapter SCSI ID. Default 7 (0-15)");
542 MODULE_PARM_DESC(max_speed, "Maximum bus speed. Default 1 (0-7) Speeds: 0=20, 1=13.3, 2=10, 3=8, 4=…
551 MODULE_PARM_DESC(tags, "Number of tags (1<<x). Default 3 (0-5)");
554 MODULE_PARM_DESC(reset_delay, "Reset delay in seconds. Default 1 (0-180)");
558 * set_safe_settings - if the use_safe_settings option is set then
577 * fix_settings - reset any boot parameters which are out of range
612 * eeprom_index_to_delay - Take the eeprom delay setting and convert it
619 eeprom->delay_time = eeprom_index_to_delay_map[eeprom->delay_time]; in eeprom_index_to_delay()
624 * delay_to_eeprom_index - Take a delay in seconds and return the
640 * eeprom_override - Override the eeprom settings, in the provided
652 eeprom->scsi_id = (u8)cfg_data[CFG_ADAPTER_ID].value; in eeprom_override()
655 eeprom->channel_cfg = (u8)cfg_data[CFG_ADAPTER_MODE].value; in eeprom_override()
658 eeprom->delay_time = delay_to_eeprom_index( in eeprom_override()
662 eeprom->max_tag = (u8)cfg_data[CFG_TAGS].value; in eeprom_override()
667 eeprom->target[id].cfg0 = in eeprom_override()
671 eeprom->target[id].period = in eeprom_override()
678 /*---------------------------------------------------------------------------
679 ---------------------------------------------------------------------------*/
722 if (srb->tag_number < 255) { in free_tag()
723 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */ in free_tag()
724 srb->tag_number = 255; in free_tag()
735 if (i->cmd == cmd) in find_cmd()
743 if (timer_pending(&acb->waiting_timer)) in waiting_set_timer()
745 if (time_before(jiffies + to, acb->last_reset - HZ / 2)) in waiting_set_timer()
746 acb->waiting_timer.expires = in waiting_set_timer()
747 acb->last_reset - HZ / 2 + 1; in waiting_set_timer()
749 acb->waiting_timer.expires = jiffies + to + 1; in waiting_set_timer()
750 add_timer(&acb->waiting_timer); in waiting_set_timer()
761 struct list_head *dcb_list_head = &acb->dcb_list; in waiting_process_next()
763 if (acb->active_dcb in waiting_process_next()
764 || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) in waiting_process_next()
767 if (timer_pending(&acb->waiting_timer)) in waiting_process_next()
768 del_timer(&acb->waiting_timer); in waiting_process_next()
778 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
784 start = list_entry(dcb_list_head->next, typeof(*start), list); in waiting_process_next()
785 acb->dcb_run_robin = start; in waiting_process_next()
795 struct list_head *waiting_list_head = &pos->srb_waiting_list; in waiting_process_next()
798 acb->dcb_run_robin = dcb_get_next(dcb_list_head, in waiting_process_next()
799 acb->dcb_run_robin); in waiting_process_next()
802 pos->max_command <= list_size(&pos->srb_going_list)) { in waiting_process_next()
806 srb = list_entry(waiting_list_head->next, in waiting_process_next()
811 list_move(&srb->list, &pos->srb_going_list); in waiting_process_next()
827 DC395x_LOCK_IO(acb->scsi_host, flags); in waiting_timeout()
829 DC395x_UNLOCK_IO(acb->scsi_host, flags); in waiting_timeout()
836 return acb->children[id][lun]; in find_dcb()
843 struct DeviceCtlBlk *dcb = srb->dcb; in send_srb()
845 if (dcb->max_command <= list_size(&dcb->srb_going_list) || in send_srb()
846 acb->active_dcb || in send_srb()
847 (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { in send_srb()
848 list_add_tail(&srb->list, &dcb->srb_waiting_list); in send_srb()
854 list_add_tail(&srb->list, &dcb->srb_going_list); in send_srb()
856 list_add(&srb->list, &dcb->srb_waiting_list); in send_srb()
866 enum dma_data_direction dir = cmd->sc_data_direction; in build_srb()
867 dprintkdbg(DBG_0, "build_srb: (0x%p) <%02i-%i>\n", in build_srb()
868 cmd, dcb->target_id, dcb->target_lun); in build_srb()
870 srb->dcb = dcb; in build_srb()
871 srb->cmd = cmd; in build_srb()
872 srb->sg_count = 0; in build_srb()
873 srb->total_xfer_length = 0; in build_srb()
874 srb->sg_bus_addr = 0; in build_srb()
875 srb->sg_index = 0; in build_srb()
876 srb->adapter_status = 0; in build_srb()
877 srb->target_status = 0; in build_srb()
878 srb->msg_count = 0; in build_srb()
879 srb->status = 0; in build_srb()
880 srb->flag = 0; in build_srb()
881 srb->state = 0; in build_srb()
882 srb->retry_count = 0; in build_srb()
883 srb->tag_number = TAG_NONE; in build_srb()
884 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in build_srb()
885 srb->end_message = 0; in build_srb()
893 cmd->bufflen, scsi_sglist(cmd), scsi_sg_count(cmd), in build_srb()
894 srb->segment_x[0].address); in build_srb()
899 struct SGentry *sgp = srb->segment_x; in build_srb()
901 srb->sg_count = nseg; in build_srb()
906 srb->sg_count); in build_srb()
908 scsi_for_each_sg(cmd, sg, srb->sg_count, i) { in build_srb()
910 u32 seglen = (u32)sg->length; in build_srb()
913 srb->total_xfer_length += seglen; in build_srb()
915 sgp += srb->sg_count - 1; in build_srb()
921 if (srb->total_xfer_length > reqlen) { in build_srb()
922 sgp->length -= (srb->total_xfer_length - reqlen); in build_srb()
923 srb->total_xfer_length = reqlen; in build_srb()
926 /* Fixup for WIDE padding - make sure length is even */ in build_srb()
927 if (dcb->sync_period & WIDE_SYNC && in build_srb()
928 srb->total_xfer_length % 2) { in build_srb()
929 srb->total_xfer_length++; in build_srb()
930 sgp->length++; in build_srb()
933 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
934 srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE); in build_srb()
936 dprintkdbg(DBG_SG, "build_srb: [n] map sg %p->%08x(%05x)\n", in build_srb()
937 srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN); in build_srb()
940 srb->request_length = srb->total_xfer_length; in build_srb()
945 * dc395x_queue_command_lck - queue scsi command passed from the mid
955 * Required: if struct Scsi_Host::can_queue is ever non-zero
968 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in dc395x_queue_command_lck()
969 dprintkdbg(DBG_0, "queue_command: (0x%p) <%02i-%i> cmnd=0x%02x\n", in dc395x_queue_command_lck()
970 cmd, cmd->device->id, (u8)cmd->device->lun, cmd->cmnd[0]); in dc395x_queue_command_lck()
976 if (cmd->device->id >= acb->scsi_host->max_id || in dc395x_queue_command_lck()
977 cmd->device->lun >= acb->scsi_host->max_lun || in dc395x_queue_command_lck()
978 cmd->device->lun >31) { in dc395x_queue_command_lck()
983 if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) { in dc395x_queue_command_lck()
984 dprintkl(KERN_INFO, "queue_command: Ignore target <%02i-%i>\n", in dc395x_queue_command_lck()
985 cmd->device->id, (u8)cmd->device->lun); in dc395x_queue_command_lck()
990 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
993 dprintkl(KERN_ERR, "queue_command: No such device <%02i-%i>", in dc395x_queue_command_lck()
994 cmd->device->id, (u8)cmd->device->lun); in dc395x_queue_command_lck()
1001 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
1011 list_del(&srb->list); in dc395x_queue_command_lck()
1015 if (!list_empty(&dcb->srb_waiting_list)) { in dc395x_queue_command_lck()
1017 list_add_tail(&srb->list, &dcb->srb_waiting_list); in dc395x_queue_command_lck()
1043 struct pci_dev *dev = acb->dev; in DEF_SCSI_QCMD()
1046 dcb = acb->active_dcb; in DEF_SCSI_QCMD()
1048 srb = dcb->active_srb; in DEF_SCSI_QCMD()
1050 if (!srb->cmd) in DEF_SCSI_QCMD()
1052 srb, srb->cmd); in DEF_SCSI_QCMD()
1055 "cmnd=0x%02x <%02i-%i>\n", in DEF_SCSI_QCMD()
1056 srb, srb->cmd, in DEF_SCSI_QCMD()
1057 srb->cmd->cmnd[0], srb->cmd->device->id, in DEF_SCSI_QCMD()
1058 (u8)srb->cmd->device->lun); in DEF_SCSI_QCMD()
1060 srb->segment_x, srb->sg_count, srb->sg_index, in DEF_SCSI_QCMD()
1061 srb->total_xfer_length); in DEF_SCSI_QCMD()
1062 printk(" state=0x%04x status=0x%02x phase=0x%02x (%sconn.)\n", in DEF_SCSI_QCMD()
1063 srb->state, srb->status, srb->scsi_phase, in DEF_SCSI_QCMD()
1064 (acb->active_dcb) ? "" : "not"); in DEF_SCSI_QCMD()
1112 "clear_fifo: (%i bytes) on phase %02x in %s\n", in clear_fifo()
1122 struct NvRamType *eeprom = &acb->eeprom; in reset_dev_param()
1125 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
1128 dcb->sync_mode &= ~(SYNC_NEGO_DONE + WIDE_NEGO_DONE); in reset_dev_param()
1129 dcb->sync_period = 0; in reset_dev_param()
1130 dcb->sync_offset = 0; in reset_dev_param()
1132 dcb->dev_mode = eeprom->target[dcb->target_id].cfg0; in reset_dev_param()
1133 period_index = eeprom->target[dcb->target_id].period & 0x07; in reset_dev_param()
1134 dcb->min_nego_period = clock_period[period_index]; in reset_dev_param()
1135 if (!(dcb->dev_mode & NTC_DO_WIDE_NEGO) in reset_dev_param()
1136 || !(acb->config & HCC_WIDE_CARD)) in reset_dev_param()
1137 dcb->sync_mode &= ~WIDE_NEGO_ENABLE; in reset_dev_param()
1144 * @cmd - some command for this host (for fetching hooks)
1150 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in __dc395x_eh_bus_reset()
1152 "eh_bus_reset: (0%p) target=<%02i-%i> cmd=%p\n", in __dc395x_eh_bus_reset()
1153 cmd, cmd->device->id, (u8)cmd->device->lun, cmd); in __dc395x_eh_bus_reset()
1155 if (timer_pending(&acb->waiting_timer)) in __dc395x_eh_bus_reset()
1156 del_timer(&acb->waiting_timer); in __dc395x_eh_bus_reset()
1170 acb->last_reset = in __dc395x_eh_bus_reset()
1172 HZ * acb->eeprom.delay_time; in __dc395x_eh_bus_reset()
1175 * re-enable interrupt in __dc395x_eh_bus_reset()
1186 acb->active_dcb = NULL; in __dc395x_eh_bus_reset()
1187 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ in __dc395x_eh_bus_reset()
1197 spin_lock_irq(cmd->device->host->host_lock); in dc395x_eh_bus_reset()
1199 spin_unlock_irq(cmd->device->host->host_lock); in dc395x_eh_bus_reset()
1206 * @cmd - command to be aborted
1216 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in dc395x_eh_abort()
1219 dprintkl(KERN_INFO, "eh_abort: (0x%p) target=<%02i-%i> cmd=%p\n", in dc395x_eh_abort()
1220 cmd, cmd->device->id, (u8)cmd->device->lun, cmd); in dc395x_eh_abort()
1222 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1228 srb = find_cmd(cmd, &dcb->srb_waiting_list); in dc395x_eh_abort()
1230 list_del(&srb->list); in dc395x_eh_abort()
1234 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1239 srb = find_cmd(cmd, &dcb->srb_going_list); in dc395x_eh_abort()
1254 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_sdtr()
1255 if (srb->msg_count > 1) { in build_sdtr()
1258 srb->msg_count, srb->msgout_buf[0], in build_sdtr()
1259 srb->msgout_buf[1]); in build_sdtr()
1262 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) { in build_sdtr()
1263 dcb->sync_offset = 0; in build_sdtr()
1264 dcb->min_nego_period = 200 >> 2; in build_sdtr()
1265 } else if (dcb->sync_offset == 0) in build_sdtr()
1266 dcb->sync_offset = SYNC_NEGO_OFFSET; in build_sdtr()
1268 srb->msg_count += spi_populate_sync_msg(ptr, dcb->min_nego_period, in build_sdtr()
1269 dcb->sync_offset); in build_sdtr()
1270 srb->state |= SRB_DO_SYNC_NEGO; in build_sdtr()
1278 u8 wide = ((dcb->dev_mode & NTC_DO_WIDE_NEGO) & in build_wdtr()
1279 (acb->config & HCC_WIDE_CARD)) ? 1 : 0; in build_wdtr()
1280 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_wdtr()
1281 if (srb->msg_count > 1) { in build_wdtr()
1284 srb->msg_count, srb->msgout_buf[0], in build_wdtr()
1285 srb->msgout_buf[1]); in build_wdtr()
1288 srb->msg_count += spi_populate_width_msg(ptr, wide); in build_wdtr()
1289 srb->state |= SRB_DO_WIDE_NEGO; in build_wdtr()
1300 if (timer_pending(&acb->selto_timer))
1302 acb->selto_timer.function = selection_timeout_missed;
1303 acb->selto_timer.data = (unsigned long) acb;
1305 (jiffies + HZ, acb->last_reset + HZ / 2))
1306 acb->selto_timer.expires =
1307 acb->last_reset + HZ / 2 + 1;
1309 acb->selto_timer.expires = jiffies + HZ + 1;
1310 add_timer(&acb->selto_timer);
1320 if (!acb->active_dcb || !acb->active_dcb->active_srb) {
1324 DC395x_LOCK_IO(acb->scsi_host, flags);
1325 srb = acb->active_dcb->active_srb;
1327 DC395x_UNLOCK_IO(acb->scsi_host, flags);
1338 dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> srb=%p\n", in start_scsi()
1339 dcb->target_id, dcb->target_lun, srb); in start_scsi()
1341 srb->tag_number = TAG_NONE; /* acb->tag_max_num: had error read in eeprom */ in start_scsi()
1364 if (acb->active_dcb) { in start_scsi()
1367 srb->cmd, in start_scsi()
1368 acb->active_dcb->active_srb ? in start_scsi()
1369 acb->active_dcb->active_srb->cmd : NULL); in start_scsi()
1373 dprintkdbg(DBG_KG, "start_scsi: (0x%p) Failed (busy)\n", srb->cmd); in start_scsi()
1376 /* Allow starting of SCSI commands half a second before we allow the mid-level in start_scsi()
1378 if (time_before(jiffies, acb->last_reset - HZ / 2)) { in start_scsi()
1385 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in start_scsi()
1386 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1387 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1388 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1389 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1391 identify_message = dcb->identify_msg; in start_scsi()
1394 if (srb->flag & AUTO_REQSENSE) in start_scsi()
1397 if (((srb->cmd->cmnd[0] == INQUIRY) in start_scsi()
1398 || (srb->cmd->cmnd[0] == REQUEST_SENSE) in start_scsi()
1399 || (srb->flag & AUTO_REQSENSE)) in start_scsi()
1400 && (((dcb->sync_mode & WIDE_NEGO_ENABLE) in start_scsi()
1401 && !(dcb->sync_mode & WIDE_NEGO_DONE)) in start_scsi()
1402 || ((dcb->sync_mode & SYNC_NEGO_ENABLE) in start_scsi()
1403 && !(dcb->sync_mode & SYNC_NEGO_DONE))) in start_scsi()
1404 && (dcb->target_lun == 0)) { in start_scsi()
1405 srb->msgout_buf[0] = identify_message; in start_scsi()
1406 srb->msg_count = 1; in start_scsi()
1408 srb->state = SRB_MSGOUT; in start_scsi()
1410 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1411 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1416 if (dcb->sync_mode & SYNC_NEGO_ENABLE in start_scsi()
1417 && dcb->inquiry7 & SCSI_INQ_SYNC) { in start_scsi()
1421 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1422 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1426 srb->msg_count = 0; in start_scsi()
1432 srb->state = SRB_START_; in start_scsi()
1434 if ((dcb->sync_mode & EN_TAG_QUEUEING) in start_scsi()
1439 while (tag_mask & dcb->tag_mask in start_scsi()
1440 && tag_number < dcb->max_command) { in start_scsi()
1444 if (tag_number >= dcb->max_command) { in start_scsi()
1446 "Out of tags target=<%02i-%i>)\n", in start_scsi()
1447 srb->cmd, srb->cmd->device->id, in start_scsi()
1448 (u8)srb->cmd->device->lun); in start_scsi()
1449 srb->state = SRB_READY; in start_scsi()
1457 dcb->tag_mask |= tag_mask; in start_scsi()
1458 srb->tag_number = tag_number; in start_scsi()
1460 srb->state = SRB_START_; in start_scsi()
1465 dprintkdbg(DBG_KG, "start_scsi: (0x%p) <%02i-%i> cmnd=0x%02x tag=%i\n", in start_scsi()
1466 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in start_scsi()
1467 srb->cmd->cmnd[0], srb->tag_number); in start_scsi()
1468 if (srb->flag & AUTO_REQSENSE) { in start_scsi()
1470 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1476 ptr = (u8 *)srb->cmd->cmnd; in start_scsi()
1477 for (i = 0; i < srb->cmd->cmd_len; i++) in start_scsi()
1489 dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> Failed - busy\n", in start_scsi()
1490 srb->cmd, dcb->target_id, dcb->target_lun); in start_scsi()
1491 srb->state = SRB_READY; in start_scsi()
1493 srb->msg_count = 0; in start_scsi()
1501 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1502 dcb->active_srb = srb; in start_scsi()
1503 acb->active_dcb = dcb; in start_scsi()
1517 srb->state |= SRB_MSGOUT
1524 srb->msgout_buf[0] = ABORT; in enable_msgout_abort()
1525 srb->msg_count = 1; in enable_msgout_abort()
1527 srb->state &= ~SRB_MSGIN; in enable_msgout_abort()
1528 srb->state |= SRB_MSGOUT; in enable_msgout_abort()
1533 * dc395x_handle_interrupt - Handle an interrupt that has been confirmed to
1544 u16 phase; in dc395x_handle_interrupt() local
1550 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1563 if (timer_pending(&acb->selto_timer)) in dc395x_handle_interrupt()
1564 del_timer(&acb->selto_timer); in dc395x_handle_interrupt()
1583 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1590 srb = dcb->active_srb; in dc395x_handle_interrupt()
1591 if (dcb->flag & ABORT_DEV_) { in dc395x_handle_interrupt()
1597 phase = (u16)srb->scsi_phase; in dc395x_handle_interrupt()
1601 * call dc395x_scsi_phase0[]... "phase entry" in dc395x_handle_interrupt()
1602 * handle every phase before start transfer in dc395x_handle_interrupt()
1604 /* data_out_phase0, phase:0 */ in dc395x_handle_interrupt()
1605 /* data_in_phase0, phase:1 */ in dc395x_handle_interrupt()
1606 /* command_phase0, phase:2 */ in dc395x_handle_interrupt()
1607 /* status_phase0, phase:3 */ in dc395x_handle_interrupt()
1608 /* nop0, phase:4 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1609 /* nop0, phase:5 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1610 /* msgout_phase0, phase:6 */ in dc395x_handle_interrupt()
1611 /* msgin_phase0, phase:7 */ in dc395x_handle_interrupt()
1612 dc395x_statev = dc395x_scsi_phase0[phase]; in dc395x_handle_interrupt()
1617 * will be modify to bus free phase new scsi_status in dc395x_handle_interrupt()
1620 srb->scsi_phase = scsi_status & PHASEMASK; in dc395x_handle_interrupt()
1621 phase = (u16)scsi_status & PHASEMASK; in dc395x_handle_interrupt()
1624 * call dc395x_scsi_phase1[]... "phase entry" handle in dc395x_handle_interrupt()
1625 * every phase to do transfer in dc395x_handle_interrupt()
1627 /* data_out_phase1, phase:0 */ in dc395x_handle_interrupt()
1628 /* data_in_phase1, phase:1 */ in dc395x_handle_interrupt()
1629 /* command_phase1, phase:2 */ in dc395x_handle_interrupt()
1630 /* status_phase1, phase:3 */ in dc395x_handle_interrupt()
1631 /* nop1, phase:4 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1632 /* nop1, phase:5 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1633 /* msgout_phase1, phase:6 */ in dc395x_handle_interrupt()
1634 /* msgin_phase1, phase:7 */ in dc395x_handle_interrupt()
1635 dc395x_statev = dc395x_scsi_phase1[phase]; in dc395x_handle_interrupt()
1639 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1656 /* interrupt pending - let's process it! */ in dc395x_interrupt()
1665 if (acb->active_dcb) { in dc395x_interrupt()
1666 acb->active_dcb-> flag |= ABORT_DEV_; in dc395x_interrupt()
1667 if (acb->active_dcb->active_srb) in dc395x_interrupt()
1668 enable_msgout_abort(acb, acb->active_dcb->active_srb); in dc395x_interrupt()
1685 dprintkdbg(DBG_0, "msgout_phase0: (0x%p)\n", srb->cmd); in msgout_phase0()
1686 if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT)) in msgout_phase0()
1687 *pscsi_status = PH_BUS_FREE; /*.. initial phase */ in msgout_phase0()
1690 srb->state &= ~SRB_MSGOUT; in msgout_phase0()
1699 dprintkdbg(DBG_0, "msgout_phase1: (0x%p)\n", srb->cmd); in msgout_phase1()
1702 if (!(srb->state & SRB_MSGOUT)) { in msgout_phase1()
1703 srb->state |= SRB_MSGOUT; in msgout_phase1()
1705 "msgout_phase1: (0x%p) Phase unexpected\n", in msgout_phase1()
1706 srb->cmd); /* So what ? */ in msgout_phase1()
1708 if (!srb->msg_count) { in msgout_phase1()
1710 srb->cmd); in msgout_phase1()
1717 ptr = (u8 *)srb->msgout_buf; in msgout_phase1()
1718 for (i = 0; i < srb->msg_count; i++) in msgout_phase1()
1720 srb->msg_count = 0; in msgout_phase1()
1721 if (srb->msgout_buf[0] == ABORT_TASK_SET) in msgout_phase1()
1722 srb->state = SRB_ABORT_SENT; in msgout_phase1()
1731 dprintkdbg(DBG_0, "command_phase0: (0x%p)\n", srb->cmd); in command_phase0()
1742 dprintkdbg(DBG_0, "command_phase1: (0x%p)\n", srb->cmd); in command_phase1()
1746 if (!(srb->flag & AUTO_REQSENSE)) { in command_phase1()
1747 ptr = (u8 *)srb->cmd->cmnd; in command_phase1()
1748 for (i = 0; i < srb->cmd->cmd_len; i++) { in command_phase1()
1754 dcb = acb->active_dcb; in command_phase1()
1756 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1762 srb->state |= SRB_COMMAND; in command_phase1()
1772 * the count of remaining bytes in srb->total_xfer_length
1778 unsigned idx = srb->sg_index; in sg_verify_length()
1779 struct SGentry *psge = srb->segment_x + idx; in sg_verify_length()
1780 for (; idx < srb->sg_count; psge++, idx++) in sg_verify_length()
1781 len += psge->length; in sg_verify_length()
1782 if (len != srb->total_xfer_length) in sg_verify_length()
1785 srb->total_xfer_length, len); in sg_verify_length()
1797 u32 xferred = srb->total_xfer_length - left; /* bytes transferred */ in sg_update_list()
1798 struct SGentry *psge = srb->segment_x + srb->sg_index; in sg_update_list()
1802 xferred, srb->total_xfer_length, left); in sg_update_list()
1809 srb->total_xfer_length = left; /* update remaining count */ in sg_update_list()
1810 for (idx = srb->sg_index; idx < srb->sg_count; idx++) { in sg_update_list()
1811 if (xferred >= psge->length) { in sg_update_list()
1813 xferred -= psge->length; in sg_update_list()
1816 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1817 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1819 psge->length -= xferred; in sg_update_list()
1820 psge->address += xferred; in sg_update_list()
1821 srb->sg_index = idx; in sg_update_list()
1822 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1823 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1834 * We have transferred a single byte (PIO mode?) and need to update
1841 sg_update_list(srb, srb->total_xfer_length - 1); in sg_subtract_one()
1851 * Best might be to call it in DataXXPhase0, if new phase will differ
1874 * Seems to be needed for unknown reasons; could be a hardware bug :-(
1882 struct DeviceCtlBlk *dcb = srb->dcb; in data_out_phase0()
1885 dprintkdbg(DBG_0, "data_out_phase0: (0x%p) <%02i-%i>\n", in data_out_phase0()
1886 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase0()
1892 * However, the device might have been the one to stop us (phase in data_out_phase0()
1907 srb->total_xfer_length); in data_out_phase0()
1910 if (!(srb->state & SRB_XFERPAD)) { in data_out_phase0()
1912 srb->status |= PARITY_ERROR; in data_out_phase0()
1928 if (dcb->sync_period & WIDE_SYNC) in data_out_phase0()
1935 (dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_out_phase0()
1951 if (srb->total_xfer_length > DC395x_LASTPIO) in data_out_phase0()
1958 if (d_left_counter == 1 && dcb->sync_period & WIDE_SYNC in data_out_phase0()
1959 && scsi_bufflen(srb->cmd) % 2) { in data_out_phase0()
1969 * But: Why the interrupt: No phase change. No XFERCNT_2_ZERO. Or? in data_out_phase0()
1976 srb->total_xfer_length = 0; in data_out_phase0()
1984 srb->total_xfer_length - d_left_counter; in data_out_phase0()
1986 (dcb->sync_period & WIDE_SYNC) ? 2 : 1; in data_out_phase0()
1989 if ((srb->segment_x[srb->sg_index].length == in data_out_phase0()
1990 diff && scsi_sg_count(srb->cmd)) in data_out_phase0()
1992 (PAGE_SIZE - diff)) in data_out_phase0()
1997 srb->total_xfer_length - diff; in data_out_phase0()
1999 /*srb->total_xfer_length -= diff; */ in data_out_phase0()
2000 /*srb->virt_addr += diff; */ in data_out_phase0()
2001 /*if (srb->cmd->use_sg) */ in data_out_phase0()
2002 /* srb->sg_index++; */ in data_out_phase0()
2015 dprintkdbg(DBG_0, "data_out_phase1: (0x%p) <%02i-%i>\n", in data_out_phase1()
2016 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase1()
2018 /* do prepare before transfer when data out phase */ in data_out_phase1()
2027 dprintkdbg(DBG_0, "data_in_phase0: (0x%p) <%02i-%i>\n", in data_in_phase0()
2028 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase0()
2032 * and switches to another phase, the SCSI engine should be finished too. in data_in_phase0()
2043 if (!(srb->state & SRB_XFERPAD)) { in data_in_phase0()
2049 "Parity Error\n", srb->cmd); in data_in_phase0()
2050 srb->status |= PARITY_ERROR; in data_in_phase0()
2056 * sent data to the FIFO in a MsgIn phase, eg.? in data_in_phase0()
2068 0x80) && --ctr); in data_in_phase0()
2069 if (ctr < 6000000 - 1) in data_in_phase0()
2086 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : in data_in_phase0()
2093 (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_in_phase0()
2098 srb->total_xfer_length, d_left_counter); in data_in_phase0()
2102 && srb->total_xfer_length <= DC395x_LASTPIO) { in data_in_phase0()
2103 size_t left_io = srb->total_xfer_length; in data_in_phase0()
2105 /*u32 addr = (srb->segment_x[srb->sg_index].address); */ in data_in_phase0()
2110 (srb->dcb->sync_period & WIDE_SYNC) ? in data_in_phase0()
2112 srb->total_xfer_length); in data_in_phase0()
2113 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2120 size_t offset = srb->request_length - left_io; in data_in_phase0()
2124 I just assume it's on a 4-byte boundary */ in data_in_phase0()
2125 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_in_phase0()
2126 srb->sg_count, &offset, &len); in data_in_phase0()
2129 left_io -= len; in data_in_phase0()
2139 d_left_counter--; in data_in_phase0()
2142 len--; in data_in_phase0()
2154 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { in data_in_phase0()
2156 if (srb->total_xfer_length > 0) { in data_in_phase0()
2160 srb->total_xfer_length--; in data_in_phase0()
2172 /*srb->total_xfer_length = 0; */ in data_in_phase0()
2191 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2209 } while (!(TempDMAstatus & DMAXFERCOMP) && --ctr); in data_in_phase0()
2213 srb->total_xfer_length = 0; in data_in_phase0()
2215 srb->total_xfer_length = d_left_counter; in data_in_phase0()
2216 } else { /* phase changed */ in data_in_phase0()
2238 dprintkdbg(DBG_0, "data_in_phase1: (0x%p) <%02i-%i>\n", in data_in_phase1()
2239 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase1()
2247 struct DeviceCtlBlk *dcb = srb->dcb; in data_io_transfer()
2250 "data_io_transfer: (0x%p) <%02i-%i> %c len=%i, sg=(%i/%i)\n", in data_io_transfer()
2251 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in data_io_transfer()
2253 srb->total_xfer_length, srb->sg_index, srb->sg_count); in data_io_transfer()
2254 if (srb == acb->tmp_srb) in data_io_transfer()
2256 if (srb->sg_index >= srb->sg_count) { in data_io_transfer()
2261 if (srb->total_xfer_length > DC395x_LASTPIO) { in data_io_transfer()
2278 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2280 if (scsi_sg_count(srb->cmd)) { /* with S/G */ in data_io_transfer()
2283 srb->sg_bus_addr + in data_io_transfer()
2285 srb->sg_index); in data_io_transfer()
2288 ((u32)(srb->sg_count - in data_io_transfer()
2289 srb->sg_index) << 3)); in data_io_transfer()
2293 srb->segment_x[0].address); in data_io_transfer()
2295 srb->segment_x[0].length); in data_io_transfer()
2299 srb->total_xfer_length); in data_io_transfer()
2313 else if (srb->total_xfer_length > 0) { /* The last four bytes: Do PIO */ in data_io_transfer()
2318 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2321 srb->total_xfer_length); in data_io_transfer()
2327 int ln = srb->total_xfer_length; in data_io_transfer()
2328 size_t left_io = srb->total_xfer_length; in data_io_transfer()
2330 if (srb->dcb->sync_period & WIDE_SYNC) in data_io_transfer()
2338 size_t offset = srb->request_length - left_io; in data_io_transfer()
2342 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_io_transfer()
2343 srb->sg_count, &offset, &len); in data_io_transfer()
2346 left_io -= len; in data_io_transfer()
2348 while (len--) { in data_io_transfer()
2360 if (srb->dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2377 if (srb->sg_count) { in data_io_transfer()
2378 srb->adapter_status = H_OVER_UNDER_RUN; in data_io_transfer()
2379 srb->status |= OVER_RUN; in data_io_transfer()
2386 if (dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2396 * or chip is to blame :-( */ in data_io_transfer()
2404 * something broke :-( */ in data_io_transfer()
2410 srb->state |= SRB_XFERPAD; in data_io_transfer()
2422 dprintkdbg(DBG_0, "status_phase0: (0x%p) <%02i-%i>\n", in status_phase0()
2423 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase0()
2424 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2425 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2426 srb->state = SRB_COMPLETED; in status_phase0()
2427 *pscsi_status = PH_BUS_FREE; /*.. initial phase */ in status_phase0()
2436 dprintkdbg(DBG_0, "status_phase1: (0x%p) <%02i-%i>\n", in status_phase1()
2437 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase1()
2438 srb->state = SRB_STATUS; in status_phase1()
2462 srb->msgout_buf[0] = MESSAGE_REJECT; in msgin_reject()
2463 srb->msg_count = 1; in msgin_reject()
2465 srb->state &= ~SRB_MSGIN; in msgin_reject()
2466 srb->state |= SRB_MSGOUT; in msgin_reject()
2467 dprintkl(KERN_INFO, "msgin_reject: 0x%02x <%02i-%i>\n", in msgin_reject()
2468 srb->msgin_buf[0], in msgin_reject()
2469 srb->dcb->target_id, srb->dcb->target_lun); in msgin_reject()
2479 srb->cmd, tag, srb); in msgin_qtag()
2481 if (!(dcb->tag_mask & (1 << tag))) in msgin_qtag()
2484 dcb->tag_mask, tag); in msgin_qtag()
2486 if (list_empty(&dcb->srb_going_list)) in msgin_qtag()
2488 list_for_each_entry(i, &dcb->srb_going_list, list) { in msgin_qtag()
2489 if (i->tag_number == tag) { in msgin_qtag()
2497 dprintkdbg(DBG_0, "msgin_qtag: (0x%p) <%02i-%i>\n", in msgin_qtag()
2498 srb->cmd, srb->dcb->target_id, srb->dcb->target_lun); in msgin_qtag()
2499 if (dcb->flag & ABORT_DEV_) { in msgin_qtag()
2500 /*srb->state = SRB_ABORT_SENT; */ in msgin_qtag()
2504 if (!(srb->state & SRB_DISCONNECT)) in msgin_qtag()
2507 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2508 srb->state |= dcb->active_srb->state; in msgin_qtag()
2509 srb->state |= SRB_DATA_XFER; in msgin_qtag()
2510 dcb->active_srb = srb; in msgin_qtag()
2515 srb = acb->tmp_srb; in msgin_qtag()
2516 srb->state = SRB_UNEXPECT_RESEL; in msgin_qtag()
2517 dcb->active_srb = srb; in msgin_qtag()
2518 srb->msgout_buf[0] = ABORT_TASK; in msgin_qtag()
2519 srb->msg_count = 1; in msgin_qtag()
2521 dprintkl(KERN_DEBUG, "msgin_qtag: Unknown tag %i - abort\n", tag); in msgin_qtag()
2529 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2530 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2531 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2539 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_async()
2540 dprintkl(KERN_DEBUG, "msgin_set_async: No sync transfers <%02i-%i>\n", in msgin_set_async()
2541 dcb->target_id, dcb->target_lun); in msgin_set_async()
2543 dcb->sync_mode &= ~(SYNC_NEGO_ENABLE); in msgin_set_async()
2544 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_async()
2545 /*dcb->sync_period &= 0; */ in msgin_set_async()
2546 dcb->sync_offset = 0; in msgin_set_async()
2547 dcb->min_nego_period = 200 >> 2; /* 200ns <=> 5 MHz */ in msgin_set_async()
2548 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_async()
2550 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_async()
2551 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_async()
2562 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_sync()
2567 dcb->target_id, srb->msgin_buf[3] << 2, in msgin_set_sync()
2568 (250 / srb->msgin_buf[3]), in msgin_set_sync()
2569 ((250 % srb->msgin_buf[3]) * 10) / srb->msgin_buf[3], in msgin_set_sync()
2570 srb->msgin_buf[4]); in msgin_set_sync()
2572 if (srb->msgin_buf[4] > 15) in msgin_set_sync()
2573 srb->msgin_buf[4] = 15; in msgin_set_sync()
2574 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) in msgin_set_sync()
2575 dcb->sync_offset = 0; in msgin_set_sync()
2576 else if (dcb->sync_offset == 0) in msgin_set_sync()
2577 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2578 if (srb->msgin_buf[4] > dcb->sync_offset) in msgin_set_sync()
2579 srb->msgin_buf[4] = dcb->sync_offset; in msgin_set_sync()
2581 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2583 while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval] in msgin_set_sync()
2584 || dcb->min_nego_period > in msgin_set_sync()
2587 if (srb->msgin_buf[3] < clock_period[bval]) in msgin_set_sync()
2591 srb->msgin_buf[3] = clock_period[bval]; in msgin_set_sync()
2592 dcb->sync_period &= 0xf0; in msgin_set_sync()
2593 dcb->sync_period |= ALT_SYNC | bval; in msgin_set_sync()
2594 dcb->min_nego_period = srb->msgin_buf[3]; in msgin_set_sync()
2596 if (dcb->sync_period & WIDE_SYNC) in msgin_set_sync()
2603 dcb->target_id, (fact == 500) ? "Wide16" : "", in msgin_set_sync()
2604 dcb->min_nego_period << 2, dcb->sync_offset, in msgin_set_sync()
2605 (fact / dcb->min_nego_period), in msgin_set_sync()
2606 ((fact % dcb->min_nego_period) * 10 + in msgin_set_sync()
2607 dcb->min_nego_period / 2) / dcb->min_nego_period); in msgin_set_sync()
2609 if (!(srb->state & SRB_DO_SYNC_NEGO)) { in msgin_set_sync()
2612 srb->msgin_buf[3] << 2, srb->msgin_buf[4]); in msgin_set_sync()
2614 memcpy(srb->msgout_buf, srb->msgin_buf, 5); in msgin_set_sync()
2615 srb->msg_count = 5; in msgin_set_sync()
2617 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_sync()
2619 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_sync()
2620 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_sync()
2626 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_sync()
2627 dcb->sync_mode |= SYNC_NEGO_DONE | SYNC_NEGO_ENABLE; in msgin_set_sync()
2636 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_nowide()
2637 dprintkdbg(DBG_1, "msgin_set_nowide: <%02i>\n", dcb->target_id); in msgin_set_nowide()
2639 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_nowide()
2640 dcb->sync_mode &= ~(WIDE_NEGO_ENABLE); in msgin_set_nowide()
2641 dcb->sync_mode |= WIDE_NEGO_DONE; in msgin_set_nowide()
2642 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_nowide()
2644 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_nowide()
2645 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_nowide()
2654 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_wide()
2655 u8 wide = (dcb->dev_mode & NTC_DO_WIDE_NEGO in msgin_set_wide()
2656 && acb->config & HCC_WIDE_CARD) ? 1 : 0; in msgin_set_wide()
2657 dprintkdbg(DBG_1, "msgin_set_wide: <%02i>\n", dcb->target_id); in msgin_set_wide()
2659 if (srb->msgin_buf[3] > wide) in msgin_set_wide()
2660 srb->msgin_buf[3] = wide; in msgin_set_wide()
2662 if (!(srb->state & SRB_DO_WIDE_NEGO)) { in msgin_set_wide()
2665 dcb->target_id); in msgin_set_wide()
2666 memcpy(srb->msgout_buf, srb->msgin_buf, 4); in msgin_set_wide()
2667 srb->msg_count = 4; in msgin_set_wide()
2668 srb->state |= SRB_DO_WIDE_NEGO; in msgin_set_wide()
2672 dcb->sync_mode |= (WIDE_NEGO_ENABLE | WIDE_NEGO_DONE); in msgin_set_wide()
2673 if (srb->msgin_buf[3] > 0) in msgin_set_wide()
2674 dcb->sync_period |= WIDE_SYNC; in msgin_set_wide()
2676 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_wide()
2677 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_wide()
2678 /*dcb->sync_mode &= ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); */ in msgin_set_wide()
2681 (8 << srb->msgin_buf[3]), dcb->target_id); in msgin_set_wide()
2683 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_wide()
2684 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_wide()
2701 * 04h - 7Fh Reserved
2702 * 80h - FFh Vendor specific
2707 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0()
2708 dprintkdbg(DBG_0, "msgin_phase0: (0x%p)\n", srb->cmd); in msgin_phase0()
2710 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2711 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2713 switch (srb->msgin_buf[0]) { in msgin_phase0()
2715 srb->state = SRB_DISCONNECT; in msgin_phase0()
2723 srb->msgin_buf[1]); in msgin_phase0()
2730 if (srb->state & SRB_DO_SYNC_NEGO) { in msgin_phase0()
2735 if (srb->state & SRB_DO_WIDE_NEGO) { in msgin_phase0()
2740 /*srb->state |= SRB_ABORT_SENT */ in msgin_phase0()
2745 if (srb->msgin_buf[1] == 3 in msgin_phase0()
2746 && srb->msgin_buf[2] == EXTENDED_SDTR) { in msgin_phase0()
2751 if (srb->msgin_buf[1] == 2 in msgin_phase0()
2752 && srb->msgin_buf[2] == EXTENDED_WDTR in msgin_phase0()
2753 && srb->msgin_buf[3] <= 2) { /* sanity check ... */ in msgin_phase0()
2776 srb->cmd, srb->total_xfer_length); in msgin_phase0()
2785 "<%02i-%i> ABORT msg\n", in msgin_phase0()
2786 srb->cmd, dcb->target_id, in msgin_phase0()
2787 dcb->target_lun); in msgin_phase0()
2788 dcb->flag |= ABORT_DEV_; in msgin_phase0()
2794 if (srb->msgin_buf[0] & IDENTIFY_BASE) { in msgin_phase0()
2796 srb->msg_count = 1; in msgin_phase0()
2797 srb->msgout_buf[0] = dcb->identify_msg; in msgin_phase0()
2799 srb->state |= SRB_MSGOUT; in msgin_phase0()
2806 srb->state &= ~SRB_MSGIN; in msgin_phase0()
2807 acb->msg_len = 0; in msgin_phase0()
2818 dprintkdbg(DBG_0, "msgin_phase1: (0x%p)\n", srb->cmd); in msgin_phase1()
2821 if (!(srb->state & SRB_MSGIN)) { in msgin_phase1()
2822 srb->state &= ~SRB_DISCONNECT; in msgin_phase1()
2823 srb->state |= SRB_MSGIN; in msgin_phase1()
2848 if (dcb->identify_msg & 0x07) in set_xfer_rate()
2851 if (acb->scan_devices) { in set_xfer_rate()
2852 current_sync_offset = dcb->sync_offset; in set_xfer_rate()
2856 list_for_each_entry(i, &acb->dcb_list, list) in set_xfer_rate()
2857 if (i->target_id == dcb->target_id) { in set_xfer_rate()
2858 i->sync_period = dcb->sync_period; in set_xfer_rate()
2859 i->sync_offset = dcb->sync_offset; in set_xfer_rate()
2860 i->sync_mode = dcb->sync_mode; in set_xfer_rate()
2861 i->min_nego_period = dcb->min_nego_period; in set_xfer_rate()
2868 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect()
2875 acb->last_reset = in disconnect()
2877 HZ * acb->eeprom.delay_time; in disconnect()
2882 srb = dcb->active_srb; in disconnect()
2883 acb->active_dcb = NULL; in disconnect()
2884 dprintkdbg(DBG_0, "disconnect: (0x%p)\n", srb->cmd); in disconnect()
2886 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in disconnect()
2889 if (srb->state & SRB_UNEXPECT_RESEL) { in disconnect()
2891 "disconnect: Unexpected reselection <%02i-%i>\n", in disconnect()
2892 dcb->target_id, dcb->target_lun); in disconnect()
2893 srb->state = 0; in disconnect()
2895 } else if (srb->state & SRB_ABORT_SENT) { in disconnect()
2896 dcb->flag &= ~ABORT_DEV_; in disconnect()
2897 acb->last_reset = jiffies + HZ / 2 + 1; in disconnect()
2899 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2902 if ((srb->state & (SRB_START_ + SRB_MSGOUT)) in disconnect()
2903 || !(srb-> in disconnect()
2910 if (srb->state != SRB_START_ in disconnect()
2911 && srb->state != SRB_MSGOUT) { in disconnect()
2912 srb->state = SRB_READY; in disconnect()
2915 srb->cmd); in disconnect()
2916 srb->target_status = SCSI_STAT_SEL_TIMEOUT; in disconnect()
2921 "<%02i-%i> SelTO\n", srb->cmd, in disconnect()
2922 dcb->target_id, dcb->target_lun); in disconnect()
2923 if (srb->retry_count++ > DC395x_MAX_RETRIES in disconnect()
2924 || acb->scan_devices) { in disconnect()
2925 srb->target_status = in disconnect()
2930 list_move(&srb->list, &dcb->srb_waiting_list); in disconnect()
2933 srb->cmd); in disconnect()
2936 } else if (srb->state & SRB_DISCONNECT) { in disconnect()
2948 } else if (srb->state & SRB_COMPLETED) { in disconnect()
2954 dcb->active_srb = NULL; in disconnect()
2955 srb->state = SRB_FREE; in disconnect()
2964 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect()
2975 srb = dcb->active_srb; in reselect()
2983 if (!acb->scan_devices) { in reselect()
2984 dprintkdbg(DBG_KG, "reselect: (0x%p) <%02i-%i> " in reselect()
2986 srb->cmd, dcb->target_id, in reselect()
2987 dcb->target_lun, rsel_tar_lun_id, in reselect()
2989 /*srb->state |= SRB_DISCONNECT; */ in reselect()
2991 srb->state = SRB_READY; in reselect()
2993 list_move(&srb->list, &dcb->srb_waiting_list); in reselect()
3008 "<%02i-%i>\n", id, lun); in reselect()
3012 acb->active_dcb = dcb; in reselect()
3014 if (!(dcb->dev_mode & NTC_DO_DISCONNECT)) in reselect()
3016 "disconnection? <%02i-%i>\n", in reselect()
3017 dcb->target_id, dcb->target_lun); in reselect()
3019 if (dcb->sync_mode & EN_TAG_QUEUEING) { in reselect()
3020 srb = acb->tmp_srb; in reselect()
3021 dcb->active_srb = srb; in reselect()
3024 srb = dcb->active_srb; in reselect()
3025 if (!srb || !(srb->state & SRB_DISCONNECT)) { in reselect()
3030 "reselect: w/o disconnected cmds <%02i-%i>\n", in reselect()
3031 dcb->target_id, dcb->target_lun); in reselect()
3032 srb = acb->tmp_srb; in reselect()
3033 srb->state = SRB_UNEXPECT_RESEL; in reselect()
3034 dcb->active_srb = srb; in reselect()
3037 if (dcb->flag & ABORT_DEV_) { in reselect()
3038 /*srb->state = SRB_ABORT_SENT; */ in reselect()
3041 srb->state = SRB_DATA_XFER; in reselect()
3045 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in reselect()
3048 dprintkdbg(DBG_0, "reselect: select <%i>\n", dcb->target_id); in reselect()
3049 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); /* host ID */ in reselect()
3050 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
3051 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
3052 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
3078 if ((ptr->Vers & 0x07) >= 2 || (ptr->RDF & 0x0F) == 2) { in disc_tagq_set()
3079 if ((ptr->Flags & SCSI_INQ_CMDQUEUE) in disc_tagq_set()
3080 && (dcb->dev_mode & NTC_DO_TAG_QUEUEING) && in disc_tagq_set()
3081 /*(dcb->dev_mode & NTC_DO_DISCONNECT) */ in disc_tagq_set()
3082 /* ((dcb->dev_type == TYPE_DISK) in disc_tagq_set()
3083 || (dcb->dev_type == TYPE_MOD)) && */ in disc_tagq_set()
3085 if (dcb->max_command == 1) in disc_tagq_set()
3086 dcb->max_command = in disc_tagq_set()
3087 dcb->acb->tag_max_num; in disc_tagq_set()
3088 dcb->sync_mode |= EN_TAG_QUEUEING; in disc_tagq_set()
3089 /*dcb->tag_mask = 0; */ in disc_tagq_set()
3091 dcb->max_command = 1; in disc_tagq_set()
3099 u8 bval1 = ptr->DevType & SCSI_DEVTYPE; in add_dev()
3100 dcb->dev_type = bval1; in add_dev()
3109 struct scsi_cmnd *cmd = srb->cmd; in pci_unmap_srb()
3110 enum dma_data_direction dir = cmd->sc_data_direction; in pci_unmap_srb()
3115 srb->sg_bus_addr, SEGMENTX_LEN); in pci_unmap_srb()
3116 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
3130 if (!(srb->flag & AUTO_REQSENSE)) in pci_unmap_srb_sense()
3134 srb->segment_x[0].address); in pci_unmap_srb_sense()
3135 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3136 srb->segment_x[0].length, DMA_FROM_DEVICE); in pci_unmap_srb_sense()
3138 srb->total_xfer_length = srb->xferred; in pci_unmap_srb_sense()
3139 srb->segment_x[0].address = in pci_unmap_srb_sense()
3140 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address; in pci_unmap_srb_sense()
3141 srb->segment_x[0].length = in pci_unmap_srb_sense()
3142 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length; in pci_unmap_srb_sense()
3154 struct scsi_cmnd *cmd = srb->cmd; in srb_done()
3155 enum dma_data_direction dir = cmd->sc_data_direction; in srb_done()
3158 dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd, in srb_done()
3159 srb->cmd->device->id, (u8)srb->cmd->device->lun); in srb_done()
3161 srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count, in srb_done()
3163 status = srb->target_status; in srb_done()
3166 if (srb->flag & AUTO_REQSENSE) { in srb_done()
3172 srb->flag &= ~AUTO_REQSENSE; in srb_done()
3173 srb->adapter_status = 0; in srb_done()
3174 srb->target_status = SAM_STAT_CHECK_CONDITION; in srb_done()
3176 switch (cmd->sense_buffer[2] & 0x0f) { in srb_done()
3179 "ReqSense: NOT_READY cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3180 cmd->cmnd[0], dcb->target_id, in srb_done()
3181 dcb->target_lun, status, acb->scan_devices); in srb_done()
3185 "ReqSense: UNIT_ATTENTION cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3186 cmd->cmnd[0], dcb->target_id, in srb_done()
3187 dcb->target_lun, status, acb->scan_devices); in srb_done()
3191 "ReqSense: ILLEGAL_REQUEST cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3192 cmd->cmnd[0], dcb->target_id, in srb_done()
3193 dcb->target_lun, status, acb->scan_devices); in srb_done()
3197 "ReqSense: MEDIUM_ERROR cmnd=0x%02x <%02i-%i> stat=%i scan=%i ", in srb_done()
3198 cmd->cmnd[0], dcb->target_id, in srb_done()
3199 dcb->target_lun, status, acb->scan_devices); in srb_done()
3203 "ReqSense: HARDWARE_ERROR 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()
3208 if (cmd->sense_buffer[7] >= 6) in srb_done()
3211 cmd->sense_buffer[2], cmd->sense_buffer[12], in srb_done()
3212 cmd->sense_buffer[13], in srb_done()
3213 *((unsigned int *)(cmd->sense_buffer + 3)), in srb_done()
3214 *((unsigned int *)(cmd->sense_buffer + 8))); in srb_done()
3217 cmd->sense_buffer[2], in srb_done()
3218 *((unsigned int *)(cmd->sense_buffer + 3))); in srb_done()
3241 tempcnt = (u8)list_size(&dcb->srb_going_list); in srb_done()
3242 dprintkl(KERN_INFO, "QUEUE_FULL for dev <%02i-%i> with %i cmnds\n", in srb_done()
3243 dcb->target_id, dcb->target_lun, tempcnt); in srb_done()
3245 tempcnt--; in srb_done()
3246 dcb->max_command = tempcnt; in srb_done()
3248 list_move(&srb->list, &dcb->srb_waiting_list); in srb_done()
3250 srb->adapter_status = 0; in srb_done()
3251 srb->target_status = 0; in srb_done()
3254 srb->adapter_status = H_SEL_TIMEOUT; in srb_done()
3255 srb->target_status = 0; in srb_done()
3258 srb->adapter_status = 0; in srb_done()
3266 status = srb->adapter_status; in srb_done()
3268 srb->target_status = 0; in srb_done()
3269 scsi_msg_to_host_byte(cmd, srb->end_message); in srb_done()
3270 } else if (srb->status & PARITY_ERROR) { in srb_done()
3274 srb->adapter_status = 0; in srb_done()
3275 srb->target_status = 0; in srb_done()
3285 if (cmd->cmnd[0] == INQUIRY) { in srb_done()
3297 && cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8 in srb_done()
3298 && dir != DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) in srb_done()
3299 dcb->inquiry7 = ptr->Flags; in srb_done()
3301 /*if( srb->cmd->cmnd[0] == INQUIRY && */ in srb_done()
3302 /* (host_byte(cmd->result) == DID_OK || status_byte(cmd->result) & CHECK_CONDITION) ) */ in srb_done()
3305 if (!dcb->init_tcq_flag) { in srb_done()
3307 dcb->init_tcq_flag = 1; in srb_done()
3316 scsi_set_resid(cmd, srb->total_xfer_length); in srb_done()
3318 if (srb->total_xfer_length) in srb_done()
3319 dprintkdbg(DBG_KG, "srb_done: (0x%p) <%02i-%i> " in srb_done()
3321 cmd, cmd->device->id, (u8)cmd->device->lun, in srb_done()
3322 cmd->cmnd[0], srb->total_xfer_length); in srb_done()
3325 if (srb != acb->tmp_srb) { in srb_done()
3328 cmd, cmd->result); in srb_done()
3329 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
3346 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
3351 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) { in doing_srb_done()
3352 p = srb->cmd; in doing_srb_done()
3353 printk("G:%p(%02i-%i) ", p, in doing_srb_done()
3354 p->device->id, (u8)p->device->lun); in doing_srb_done()
3355 list_del(&srb->list); in doing_srb_done()
3357 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3368 if (!list_empty(&dcb->srb_going_list)) in doing_srb_done()
3370 "How could the ML send cmnds to the Going queue? <%02i-%i>\n", in doing_srb_done()
3371 dcb->target_id, dcb->target_lun); in doing_srb_done()
3372 if (dcb->tag_mask) in doing_srb_done()
3374 "tag_mask for <%02i-%i> should be empty, is %08x!\n", in doing_srb_done()
3375 dcb->target_id, dcb->target_lun, in doing_srb_done()
3376 dcb->tag_mask); in doing_srb_done()
3379 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) { in doing_srb_done()
3380 p = srb->cmd; in doing_srb_done()
3382 printk("W:%p<%02i-%i>", p, p->device->id, in doing_srb_done()
3383 (u8)p->device->lun); in doing_srb_done()
3384 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3395 if (!list_empty(&dcb->srb_waiting_list)) in doing_srb_done()
3396 dprintkl(KERN_DEBUG, "ML queued %i cmnds again to <%02i-%i>\n", in doing_srb_done()
3397 list_size(&dcb->srb_waiting_list), dcb->target_id, in doing_srb_done()
3398 dcb->target_lun); in doing_srb_done()
3399 dcb->flag &= ~ABORT_DEV_; in doing_srb_done()
3408 acb->acb_flag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in reset_scsi_bus()
3420 DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout); in set_basic_config()
3421 if (acb->config & HCC_PARITY) in set_basic_config()
3431 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in set_basic_config()
3456 if (timer_pending(&acb->waiting_timer)) in scsi_reset_detect()
3457 del_timer(&acb->waiting_timer); in scsi_reset_detect()
3464 acb->last_reset = in scsi_reset_detect()
3466 HZ * acb->eeprom.delay_time; in scsi_reset_detect()
3473 if (acb->acb_flag & RESET_DEV) { /* RESET_DETECT, RESET_DONE, RESET_DEV */ in scsi_reset_detect()
3474 acb->acb_flag |= RESET_DONE; in scsi_reset_detect()
3476 acb->acb_flag |= RESET_DETECT; in scsi_reset_detect()
3480 acb->active_dcb = NULL; in scsi_reset_detect()
3481 acb->acb_flag = 0; in scsi_reset_detect()
3490 struct scsi_cmnd *cmd = srb->cmd; in request_sense()
3491 dprintkdbg(DBG_1, "request_sense: (0x%p) <%02i-%i>\n", in request_sense()
3492 cmd, cmd->device->id, (u8)cmd->device->lun); in request_sense()
3494 srb->flag |= AUTO_REQSENSE; in request_sense()
3495 srb->adapter_status = 0; in request_sense()
3496 srb->target_status = 0; in request_sense()
3499 memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in request_sense()
3502 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address = in request_sense()
3503 srb->segment_x[0].address; in request_sense()
3504 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length = in request_sense()
3505 srb->segment_x[0].length; in request_sense()
3506 srb->xferred = srb->total_xfer_length; in request_sense()
3507 /* srb->segment_x : a one entry of S/G list table */ in request_sense()
3508 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3509 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3511 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
3512 cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE, in request_sense()
3514 dprintkdbg(DBG_SG, "request_sense: map buffer %p->%08x(%05x)\n", in request_sense()
3515 cmd->sense_buffer, srb->segment_x[0].address, in request_sense()
3517 srb->sg_count = 1; in request_sense()
3518 srb->sg_index = 0; in request_sense()
3522 "request_sense: (0x%p) failed <%02i-%i>\n", in request_sense()
3523 srb->cmd, dcb->target_id, dcb->target_lun); in request_sense()
3524 list_move(&srb->list, &dcb->srb_waiting_list); in request_sense()
3531 * device_alloc - Allocate a new device instance. This create the
3546 struct NvRamType *eeprom = &acb->eeprom; in device_alloc()
3547 u8 period_index = eeprom->target[target].period & 0x07; in device_alloc()
3551 dprintkdbg(DBG_0, "device_alloc: <%02i-%i>\n", target, lun); in device_alloc()
3554 dcb->acb = NULL; in device_alloc()
3555 INIT_LIST_HEAD(&dcb->srb_going_list); in device_alloc()
3556 INIT_LIST_HEAD(&dcb->srb_waiting_list); in device_alloc()
3557 dcb->active_srb = NULL; in device_alloc()
3558 dcb->tag_mask = 0; in device_alloc()
3559 dcb->max_command = 1; in device_alloc()
3560 dcb->target_id = target; in device_alloc()
3561 dcb->target_lun = lun; in device_alloc()
3562 dcb->dev_mode = eeprom->target[target].cfg0; in device_alloc()
3564 dcb->identify_msg = in device_alloc()
3565 IDENTIFY(dcb->dev_mode & NTC_DO_DISCONNECT, lun); in device_alloc()
3567 dcb->identify_msg = IDENTIFY(0, lun); in device_alloc()
3569 dcb->inquiry7 = 0; in device_alloc()
3570 dcb->sync_mode = 0; in device_alloc()
3571 dcb->min_nego_period = clock_period[period_index]; in device_alloc()
3572 dcb->sync_period = 0; in device_alloc()
3573 dcb->sync_offset = 0; in device_alloc()
3574 dcb->flag = 0; in device_alloc()
3577 if ((dcb->dev_mode & NTC_DO_WIDE_NEGO) in device_alloc()
3578 && (acb->config & HCC_WIDE_CARD)) in device_alloc()
3579 dcb->sync_mode |= WIDE_NEGO_ENABLE; in device_alloc()
3582 if (dcb->dev_mode & NTC_DO_SYNC_NEGO) in device_alloc()
3584 dcb->sync_mode |= SYNC_NEGO_ENABLE; in device_alloc()
3586 if (dcb->target_lun != 0) { in device_alloc()
3590 list_for_each_entry(iter, &acb->dcb_list, list) in device_alloc()
3591 if (iter->target_id == dcb->target_id) { in device_alloc()
3602 "device_alloc: <%02i-%i> copy from <%02i-%i>\n", in device_alloc()
3603 dcb->target_id, dcb->target_lun, in device_alloc()
3604 p->target_id, p->target_lun); in device_alloc()
3605 dcb->sync_mode = p->sync_mode; in device_alloc()
3606 dcb->sync_period = p->sync_period; in device_alloc()
3607 dcb->min_nego_period = p->min_nego_period; in device_alloc()
3608 dcb->sync_offset = p->sync_offset; in device_alloc()
3609 dcb->inquiry7 = p->inquiry7; in device_alloc()
3616 * adapter_add_device - Adds the device instance to the adaptor instance.
3625 dcb->acb = acb; in adapter_add_device()
3628 if (list_empty(&acb->dcb_list)) in adapter_add_device()
3629 acb->dcb_run_robin = dcb; in adapter_add_device()
3632 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3635 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3636 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3641 * adapter_remove_device - Removes the device instance from the adaptor
3654 dprintkdbg(DBG_0, "adapter_remove_device: <%02i-%i>\n", in adapter_remove_device()
3655 dcb->target_id, dcb->target_lun); in adapter_remove_device()
3658 if (acb->active_dcb == dcb) in adapter_remove_device()
3659 acb->active_dcb = NULL; in adapter_remove_device()
3660 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3661 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3664 list_for_each_entry_safe(i, tmp, &acb->dcb_list, list) in adapter_remove_device()
3666 list_del(&i->list); in adapter_remove_device()
3671 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3672 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3673 dcb->acb = NULL; in adapter_remove_device()
3678 * adapter_remove_and_free_device - Removes a single device from the adapter
3687 if (list_size(&dcb->srb_going_list) > 1) { in adapter_remove_and_free_device()
3688 dprintkdbg(DBG_1, "adapter_remove_and_free_device: <%02i-%i> " in adapter_remove_and_free_device()
3690 dcb->target_id, dcb->target_lun, in adapter_remove_and_free_device()
3691 list_size(&dcb->srb_going_list)); in adapter_remove_and_free_device()
3700 * adapter_remove_and_free_all_devices - Removes and frees all of the
3710 list_size(&acb->dcb_list)); in adapter_remove_and_free_all_devices()
3712 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3718 * dc395x_sdev_init - Called by the scsi mid layer to tell us about a new
3726 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_sdev_init()
3729 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_sdev_init()
3731 return -ENOMEM; in dc395x_sdev_init()
3739 * dc395x_sdev_destroy - Called by the scsi mid layer to tell us about a
3746 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_sdev_destroy()
3747 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_sdev_destroy()
3772 * trms1040_write_cmd - write the secified command and address to
3815 * trms1040_set_data - store a single byte in the eeprom
3817 * Called from write all to write a single byte into the SSEEPROM
3871 * trms1040_write_all - write 128 bytes to the eeprom
3908 * trms1040_get_data - get a single byte from the eeprom
3910 * Called from read all to read a single byte into the SSEEPROM
3949 * trms1040_read_all - read all bytes from the eeprom
3977 * check_eeprom - get and check contents of the eeprom
4007 eeprom->sub_vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM; in check_eeprom()
4008 eeprom->sub_vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8); in check_eeprom()
4009 eeprom->sub_sys_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040; in check_eeprom()
4010 eeprom->sub_sys_id[1] = in check_eeprom()
4012 eeprom->sub_class = 0x00; in check_eeprom()
4013 eeprom->vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM; in check_eeprom()
4014 eeprom->vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8); in check_eeprom()
4015 eeprom->device_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040; in check_eeprom()
4016 eeprom->device_id[1] = in check_eeprom()
4018 eeprom->reserved = 0x00; in check_eeprom()
4020 for (d_addr = 0, d_eeprom = (u32 *)eeprom->target; in check_eeprom()
4034 eeprom->cksum = 0x00; in check_eeprom()
4039 *w_eeprom = 0x1234 - cksum; in check_eeprom()
4041 eeprom->delay_time = cfg_data[CFG_RESET_DELAY].value; in check_eeprom()
4051 * print_eeprom_settings - output the eeprom settings
4059 eeprom->scsi_id, in print_eeprom_settings()
4060 eeprom->target[0].period, in print_eeprom_settings()
4061 clock_speed[eeprom->target[0].period] / 10, in print_eeprom_settings()
4062 clock_speed[eeprom->target[0].period] % 10, in print_eeprom_settings()
4063 eeprom->target[0].cfg0); in print_eeprom_settings()
4065 eeprom->channel_cfg, eeprom->max_tag, in print_eeprom_settings()
4066 1 << eeprom->max_tag, eeprom->delay_time); in print_eeprom_settings()
4077 kfree(acb->srb_array[i].segment_x); in adapter_sg_tables_free()
4088 int pages = (mem_needed+(PAGE_SIZE-1))/PAGE_SIZE; in adapter_sg_tables_alloc()
4095 acb->srb_array[i].segment_x = NULL; in adapter_sg_tables_alloc()
4098 while (pages--) { in adapter_sg_tables_alloc()
4108 acb->srb_array[srb_idx++].segment_x = in adapter_sg_tables_alloc()
4112 acb->srb.segment_x = in adapter_sg_tables_alloc()
4122 * adapter_print_config - print adapter connection and termination
4163 * adapter_init_params - Initialize the various parameters in the
4176 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_params()
4179 /* NOTE: acb->scsi_host is set at scsi_host/acb creation time */ in adapter_init_params()
4180 /* NOTE: acb->io_port_base is set at port registration time */ in adapter_init_params()
4181 /* NOTE: acb->io_port_len is set at port registration time */ in adapter_init_params()
4183 INIT_LIST_HEAD(&acb->dcb_list); in adapter_init_params()
4184 acb->dcb_run_robin = NULL; in adapter_init_params()
4185 acb->active_dcb = NULL; in adapter_init_params()
4187 INIT_LIST_HEAD(&acb->srb_free_list); in adapter_init_params()
4189 acb->tmp_srb = &acb->srb; in adapter_init_params()
4190 timer_setup(&acb->waiting_timer, waiting_timeout, 0); in adapter_init_params()
4191 timer_setup(&acb->selto_timer, NULL, 0); in adapter_init_params()
4193 acb->srb_count = DC395x_MAX_SRB_CNT; in adapter_init_params()
4195 acb->sel_timeout = DC395x_SEL_TIMEOUT; /* timeout=250ms */ in adapter_init_params()
4196 /* NOTE: acb->irq_level is set at IRQ registration time */ in adapter_init_params()
4198 acb->tag_max_num = 1 << eeprom->max_tag; in adapter_init_params()
4199 if (acb->tag_max_num > 30) in adapter_init_params()
4200 acb->tag_max_num = 30; in adapter_init_params()
4202 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in adapter_init_params()
4203 acb->gmode2 = eeprom->channel_cfg; in adapter_init_params()
4204 acb->config = 0; /* NOTE: actually set in adapter_init_chip */ in adapter_init_params()
4206 if (eeprom->channel_cfg & NAC_SCANLUN) in adapter_init_params()
4207 acb->lun_chk = 1; in adapter_init_params()
4208 acb->scan_devices = 1; in adapter_init_params()
4210 acb->scsi_host->this_id = eeprom->scsi_id; in adapter_init_params()
4211 acb->hostid_bit = (1 << acb->scsi_host->this_id); in adapter_init_params()
4214 acb->dcb_map[i] = 0; in adapter_init_params()
4216 acb->msg_len = 0; in adapter_init_params()
4219 for (i = 0; i < acb->srb_count - 1; i++) in adapter_init_params()
4220 list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); in adapter_init_params()
4225 * adapter_init_scsi_host - Initialize the scsi host instance based on
4238 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in adapter_init_scsi_host()
4239 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_scsi_host()
4241 host->max_cmd_len = 24; in adapter_init_scsi_host()
4242 host->can_queue = DC395x_MAX_CMD_QUEUE; in adapter_init_scsi_host()
4243 host->cmd_per_lun = DC395x_MAX_CMD_PER_LUN; in adapter_init_scsi_host()
4244 host->this_id = (int)eeprom->scsi_id; in adapter_init_scsi_host()
4245 host->io_port = acb->io_port_base; in adapter_init_scsi_host()
4246 host->n_io_port = acb->io_port_len; in adapter_init_scsi_host()
4247 host->dma_channel = -1; in adapter_init_scsi_host()
4248 host->unique_id = acb->io_port_base; in adapter_init_scsi_host()
4249 host->irq = acb->irq_level; in adapter_init_scsi_host()
4250 acb->last_reset = jiffies; in adapter_init_scsi_host()
4252 host->max_id = 16; in adapter_init_scsi_host()
4253 if (host->max_id - 1 == eeprom->scsi_id) in adapter_init_scsi_host()
4254 host->max_id--; in adapter_init_scsi_host()
4256 if (eeprom->channel_cfg & NAC_SCANLUN) in adapter_init_scsi_host()
4257 host->max_lun = 8; in adapter_init_scsi_host()
4259 host->max_lun = 1; in adapter_init_scsi_host()
4264 * adapter_init_chip - Get the chip into a know state and figure out
4274 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_chip()
4288 acb->config = HCC_AUTOTERM | HCC_PARITY; in adapter_init_chip()
4290 acb->config |= HCC_WIDE_CARD; in adapter_init_chip()
4292 if (eeprom->channel_cfg & NAC_POWERON_SCSI_RESET) in adapter_init_chip()
4293 acb->config |= HCC_SCSI_RESET; in adapter_init_chip()
4295 if (acb->config & HCC_SCSI_RESET) { in adapter_init_chip()
4303 acb->last_reset = in adapter_init_chip()
4305 HZ * acb->eeprom.delay_time; in adapter_init_chip()
4313 * adapter_init - Grab the resource for the card, setup the adapter
4334 acb->io_port_base = io_port; in adapter_init()
4335 acb->io_port_len = io_port_len; in adapter_init()
4343 acb->irq_level = irq; in adapter_init()
4346 check_eeprom(&acb->eeprom, io_port); in adapter_init()
4347 print_eeprom_settings(&acb->eeprom); in adapter_init()
4359 adapter_init_scsi_host(acb->scsi_host); in adapter_init()
4366 acb, acb->dcb_map, acb->srb_array, sizeof(struct AdapterCtlBlk), in adapter_init()
4371 if (acb->irq_level) in adapter_init()
4372 free_irq(acb->irq_level, acb); in adapter_init()
4373 if (acb->io_port_base) in adapter_init()
4374 release_region(acb->io_port_base, acb->io_port_len); in adapter_init()
4382 * adapter_uninit_chip - cleanly shut down the scsi controller chip,
4395 if (acb->config & HCC_SCSI_RESET) in adapter_uninit_chip()
4405 * adapter_uninit - Shut down the chip and release any resources that
4409 * @acb: The adapter which we are to un-initialize.
4414 DC395x_LOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4417 if (timer_pending(&acb->waiting_timer)) in adapter_uninit()
4418 del_timer(&acb->waiting_timer); in adapter_uninit()
4419 if (timer_pending(&acb->selto_timer)) in adapter_uninit()
4420 del_timer(&acb->selto_timer); in adapter_uninit()
4424 DC395x_UNLOCK_IO(acb->scsi_host, flags); in adapter_uninit()
4426 if (acb->irq_level) in adapter_uninit()
4427 free_irq(acb->irq_level, acb); in adapter_uninit()
4428 if (acb->io_port_base) in adapter_uninit()
4429 release_region(acb->io_port_base, acb->io_port_len); in adapter_uninit()
4442 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in dc395x_show_info()
4451 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4453 seq_printf(m, "SCSI Host Nr %i, ", host->host_no); in dc395x_show_info()
4455 (acb->config & HCC_WIDE_CARD) ? "Wide" : ""); in dc395x_show_info()
4456 seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base); in dc395x_show_info()
4457 seq_printf(m, "irq_level 0x%04x, ", acb->irq_level); in dc395x_show_info()
4458 seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000); in dc395x_show_info()
4460 seq_printf(m, "MaxID %i, MaxLUN %llu, ", host->max_id, host->max_lun); in dc395x_show_info()
4461 seq_printf(m, "AdapterID %i\n", host->this_id); in dc395x_show_info()
4463 seq_printf(m, "tag_max_num %i", acb->tag_max_num); in dc395x_show_info()
4467 seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time); in dc395x_show_info()
4470 seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); in dc395x_show_info()
4471 seq_printf(m, "Map of attached LUNs: %8ph\n", &acb->dcb_map[0]); in dc395x_show_info()
4472 seq_printf(m, " %8ph\n", &acb->dcb_map[8]); in dc395x_show_info()
4478 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4480 seq_printf(m, "%02i %02i %02i ", dev, dcb->target_id, in dc395x_show_info()
4481 dcb->target_lun); in dc395x_show_info()
4482 YESNO(dcb->dev_mode & NTC_DO_PARITY_CHK); in dc395x_show_info()
4483 YESNO(dcb->sync_offset); in dc395x_show_info()
4484 YESNO(dcb->sync_period & WIDE_SYNC); in dc395x_show_info()
4485 YESNO(dcb->dev_mode & NTC_DO_DISCONNECT); in dc395x_show_info()
4486 YESNO(dcb->dev_mode & NTC_DO_SEND_START); in dc395x_show_info()
4487 YESNO(dcb->sync_mode & EN_TAG_QUEUEING); in dc395x_show_info()
4488 nego_period = clock_period[dcb->sync_period & 0x07] << 2; in dc395x_show_info()
4489 if (dcb->sync_offset) in dc395x_show_info()
4492 seq_printf(m, " (%03i ns)", (dcb->min_nego_period << 2)); in dc395x_show_info()
4494 if (dcb->sync_offset & 0x0f) { in dc395x_show_info()
4499 (dcb->sync_offset & 0x0f)); in dc395x_show_info()
4504 seq_printf(m, " %02i\n", dcb->max_command); in dc395x_show_info()
4508 if (timer_pending(&acb->waiting_timer)) in dc395x_show_info()
4513 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4515 if (!list_empty(&dcb->srb_waiting_list)) in dc395x_show_info()
4516 seq_printf(m, "DCB (%02i-%i): Waiting: %i:", in dc395x_show_info()
4517 dcb->target_id, dcb->target_lun, in dc395x_show_info()
4518 list_size(&dcb->srb_waiting_list)); in dc395x_show_info()
4519 list_for_each_entry(srb, &dcb->srb_waiting_list, list) in dc395x_show_info()
4520 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
4521 if (!list_empty(&dcb->srb_going_list)) in dc395x_show_info()
4522 seq_printf(m, "\nDCB (%02i-%i): Going : %i:", in dc395x_show_info()
4523 dcb->target_id, dcb->target_lun, in dc395x_show_info()
4524 list_size(&dcb->srb_going_list)); in dc395x_show_info()
4525 list_for_each_entry(srb, &dcb->srb_going_list, list) in dc395x_show_info()
4526 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
4527 if (!list_empty(&dcb->srb_waiting_list) || !list_empty(&dcb->srb_going_list)) in dc395x_show_info()
4533 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4534 seq_printf(m, "%p -> ", dcb); in dc395x_show_info()
4539 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
4558 .dma_boundary = PAGE_SIZE - 1,
4563 * banner_display - Display banner on first instance of driver
4578 * dc395x_init_one - Initialise a single instance of the adapter.
4588 * Returns 0 on success, or an error code (-ve) on failure.
4604 return -ENODEV; in dc395x_init_one()
4608 irq = dev->irq; in dc395x_init_one()
4609 dprintkdbg(DBG_0, "IO_PORT=0x%04lx, IRQ=0x%x\n", io_port_base, dev->irq); in dc395x_init_one()
4618 acb = (struct AdapterCtlBlk*)scsi_host->hostdata; in dc395x_init_one()
4619 acb->scsi_host = scsi_host; in dc395x_init_one()
4620 acb->dev = dev; in dc395x_init_one()
4632 if (scsi_add_host(scsi_host, &dev->dev)) { in dc395x_init_one()
4647 return -ENODEV; in dc395x_init_one()
4652 * dc395x_remove_one - Called to remove a single instance of the
4660 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata); in dc395x_remove_one()
4692 MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and …