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
72 #define DC395X_BANNER "Tekram DC395(U/UW/F), DC315(U) - ASIC TRM-S1040"
75 /*---------------------------------------------------------------------------
77 ---------------------------------------------------------------------------*/
94 #define DC395x_LOCK_IO(dev,flags) spin_lock_irqsave(((struct Scsi_Host *)dev)->host_lock, flags)
95 #define DC395x_UNLOCK_IO(dev,flags) spin_unlock_irqrestore(((struct Scsi_Host *)dev)->host_lock, f…
97 #define DC395x_read8(acb,address) (u8)(inb(acb->io_port_base + (address)))
98 #define DC395x_read16(acb,address) (u16)(inw(acb->io_port_base + (address)))
99 #define DC395x_read32(acb,address) (u32)(inl(acb->io_port_base + (address)))
100 #define DC395x_write8(acb,address,value) outb((value), acb->io_port_base + (address))
101 #define DC395x_write16(acb,address,value) outw((value), acb->io_port_base + (address))
102 #define DC395x_write32(acb,address,value) outl((value), acb->io_port_base + (address))
107 * srb->segement_x is the hw sg list. It is always allocated as a
130 u8 sub_class; /* 4 Sub Class */
170 * (srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1] and the
247 u8 config; member
266 /*---------------------------------------------------------------------------
268 ---------------------------------------------------------------------------*/
326 /*---------------------------------------------------------------------------
328 ---------------------------------------------------------------------------*/
336 nop0, /* phase:4 PH_BUS_FREE .. initial phase */
347 nop1, /* phase:4 PH_BUS_FREE .. initial phase */
378 /*---------------------------------------------------------------------------
380 ---------------------------------------------------------------------------*/
395 #define CFG_TAGS 4
405 #define CFG_PARAM_UNSET -1
431 4, /* 6.7Hmz */
479 MODULE_PARM_DESC(adapter_id, "Adapter SCSI ID. Default 7 (0-15)");
482 …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, …
491 MODULE_PARM_DESC(tags, "Number of tags (1<<x). Default 3 (0-5)");
494 MODULE_PARM_DESC(reset_delay, "Reset delay in seconds. Default 1 (0-180)");
498 * set_safe_settings - if the use_safe_settings option is set then
516 * fix_settings - reset any boot parameters which are out of range
542 * eeprom_index_to_delay - Take the eeprom delay setting and convert it
549 eeprom->delay_time = eeprom_index_to_delay_map[eeprom->delay_time]; in eeprom_index_to_delay()
554 * delay_to_eeprom_index - Take a delay in seconds and return the
570 * eeprom_override - Override the eeprom settings, in the provided
582 eeprom->scsi_id = (u8)cfg_data[CFG_ADAPTER_ID].value; in eeprom_override()
585 eeprom->channel_cfg = (u8)cfg_data[CFG_ADAPTER_MODE].value; in eeprom_override()
588 eeprom->delay_time = delay_to_eeprom_index( in eeprom_override()
592 eeprom->max_tag = (u8)cfg_data[CFG_TAGS].value; in eeprom_override()
597 eeprom->target[id].cfg0 = in eeprom_override()
601 eeprom->target[id].period = in eeprom_override()
608 /*---------------------------------------------------------------------------
609 ---------------------------------------------------------------------------*/
652 if (srb->tag_number < 255) { in free_tag()
653 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */ in free_tag()
654 srb->tag_number = 255; in free_tag()
665 if (i->cmd == cmd) in find_cmd()
673 if (timer_pending(&acb->waiting_timer)) in waiting_set_timer()
675 if (time_before(jiffies + to, acb->last_reset - HZ / 2)) in waiting_set_timer()
676 acb->waiting_timer.expires = in waiting_set_timer()
677 acb->last_reset - HZ / 2 + 1; in waiting_set_timer()
679 acb->waiting_timer.expires = jiffies + to + 1; in waiting_set_timer()
680 add_timer(&acb->waiting_timer); in waiting_set_timer()
691 struct list_head *dcb_list_head = &acb->dcb_list; in waiting_process_next()
693 if (acb->active_dcb in waiting_process_next()
694 || (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) in waiting_process_next()
697 if (timer_pending(&acb->waiting_timer)) in waiting_process_next()
698 timer_delete(&acb->waiting_timer); in waiting_process_next()
708 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
714 start = list_entry(dcb_list_head->next, typeof(*start), list); in waiting_process_next()
715 acb->dcb_run_robin = start; in waiting_process_next()
725 struct list_head *waiting_list_head = &pos->srb_waiting_list; in waiting_process_next()
728 acb->dcb_run_robin = dcb_get_next(dcb_list_head, in waiting_process_next()
729 acb->dcb_run_robin); in waiting_process_next()
732 pos->max_command <= list_size(&pos->srb_going_list)) { in waiting_process_next()
736 srb = list_entry(waiting_list_head->next, in waiting_process_next()
741 list_move(&srb->list, &pos->srb_going_list); in waiting_process_next()
755 DC395x_LOCK_IO(acb->scsi_host, flags); in waiting_timeout()
757 DC395x_UNLOCK_IO(acb->scsi_host, flags); in waiting_timeout()
764 return acb->children[id][lun]; in find_dcb()
771 struct DeviceCtlBlk *dcb = srb->dcb; in send_srb()
773 if (dcb->max_command <= list_size(&dcb->srb_going_list) || in send_srb()
774 acb->active_dcb || in send_srb()
775 (acb->acb_flag & (RESET_DETECT + RESET_DONE + RESET_DEV))) { in send_srb()
776 list_add_tail(&srb->list, &dcb->srb_waiting_list); in send_srb()
782 list_add_tail(&srb->list, &dcb->srb_going_list); in send_srb()
784 list_add(&srb->list, &dcb->srb_waiting_list); in send_srb()
794 enum dma_data_direction dir = cmd->sc_data_direction; in build_srb()
796 srb->dcb = dcb; in build_srb()
797 srb->cmd = cmd; in build_srb()
798 srb->sg_count = 0; in build_srb()
799 srb->total_xfer_length = 0; in build_srb()
800 srb->sg_bus_addr = 0; in build_srb()
801 srb->sg_index = 0; in build_srb()
802 srb->adapter_status = 0; in build_srb()
803 srb->target_status = 0; in build_srb()
804 srb->msg_count = 0; in build_srb()
805 srb->status = 0; in build_srb()
806 srb->flag = 0; in build_srb()
807 srb->state = 0; in build_srb()
808 srb->retry_count = 0; in build_srb()
809 srb->tag_number = TAG_NONE; in build_srb()
810 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in build_srb()
811 srb->end_message = 0; in build_srb()
820 struct SGentry *sgp = srb->segment_x; in build_srb()
822 srb->sg_count = nseg; in build_srb()
824 scsi_for_each_sg(cmd, sg, srb->sg_count, i) { in build_srb()
826 u32 seglen = (u32)sg->length; in build_srb()
829 srb->total_xfer_length += seglen; in build_srb()
831 sgp += srb->sg_count - 1; in build_srb()
837 if (srb->total_xfer_length > reqlen) { in build_srb()
838 sgp->length -= (srb->total_xfer_length - reqlen); in build_srb()
839 srb->total_xfer_length = reqlen; in build_srb()
842 /* Fixup for WIDE padding - make sure length is even */ in build_srb()
843 if (dcb->sync_period & WIDE_SYNC && in build_srb()
844 srb->total_xfer_length % 2) { in build_srb()
845 srb->total_xfer_length++; in build_srb()
846 sgp->length++; in build_srb()
849 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
850 srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE); in build_srb()
854 srb->request_length = srb->total_xfer_length; in build_srb()
859 * dc395x_queue_command_lck - queue scsi command passed from the mid
869 * Required: if struct Scsi_Host::can_queue is ever non-zero
882 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in dc395x_queue_command_lck()
888 if (cmd->device->id >= acb->scsi_host->max_id || in dc395x_queue_command_lck()
889 cmd->device->lun >= acb->scsi_host->max_lun || in dc395x_queue_command_lck()
890 cmd->device->lun > 31) in dc395x_queue_command_lck()
894 if (!(acb->dcb_map[cmd->device->id] & (1 << cmd->device->lun))) in dc395x_queue_command_lck()
898 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
905 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
912 list_del(&srb->list); in dc395x_queue_command_lck()
916 if (!list_empty(&dcb->srb_waiting_list)) { in dc395x_queue_command_lck()
918 list_add_tail(&srb->list, &dcb->srb_waiting_list); in dc395x_queue_command_lck()
948 struct NvRamType *eeprom = &acb->eeprom; in reset_dev_param()
950 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
953 dcb->sync_mode &= ~(SYNC_NEGO_DONE + WIDE_NEGO_DONE); in reset_dev_param()
954 dcb->sync_period = 0; in reset_dev_param()
955 dcb->sync_offset = 0; in reset_dev_param()
957 dcb->dev_mode = eeprom->target[dcb->target_id].cfg0; in reset_dev_param()
958 period_index = eeprom->target[dcb->target_id].period & 0x07; in reset_dev_param()
959 dcb->min_nego_period = clock_period[period_index]; in reset_dev_param()
960 if (!(dcb->dev_mode & NTC_DO_WIDE_NEGO) in reset_dev_param()
961 || !(acb->config & HCC_WIDE_CARD)) in reset_dev_param()
962 dcb->sync_mode &= ~WIDE_NEGO_ENABLE; in reset_dev_param()
969 * @cmd - some command for this host (for fetching hooks)
975 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in __dc395x_eh_bus_reset()
977 if (timer_pending(&acb->waiting_timer)) in __dc395x_eh_bus_reset()
978 timer_delete(&acb->waiting_timer); in __dc395x_eh_bus_reset()
992 acb->last_reset = in __dc395x_eh_bus_reset()
994 HZ * acb->eeprom.delay_time; in __dc395x_eh_bus_reset()
997 * re-enable interrupt in __dc395x_eh_bus_reset()
1008 acb->active_dcb = NULL; in __dc395x_eh_bus_reset()
1009 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE ,RESET_DEV */ in __dc395x_eh_bus_reset()
1019 spin_lock_irq(cmd->device->host->host_lock); in dc395x_eh_bus_reset()
1021 spin_unlock_irq(cmd->device->host->host_lock); in dc395x_eh_bus_reset()
1028 * @cmd - command to be aborted
1038 (struct AdapterCtlBlk *)cmd->device->host->hostdata; in dc395x_eh_abort()
1042 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1046 srb = find_cmd(cmd, &dcb->srb_waiting_list); in dc395x_eh_abort()
1048 list_del(&srb->list); in dc395x_eh_abort()
1052 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1056 srb = find_cmd(cmd, &dcb->srb_going_list); in dc395x_eh_abort()
1068 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_sdtr()
1069 if (srb->msg_count > 1) { in build_sdtr()
1072 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) { in build_sdtr()
1073 dcb->sync_offset = 0; in build_sdtr()
1074 dcb->min_nego_period = 200 >> 2; in build_sdtr()
1075 } else if (dcb->sync_offset == 0) in build_sdtr()
1076 dcb->sync_offset = SYNC_NEGO_OFFSET; in build_sdtr()
1078 srb->msg_count += spi_populate_sync_msg(ptr, dcb->min_nego_period, in build_sdtr()
1079 dcb->sync_offset); in build_sdtr()
1080 srb->state |= SRB_DO_SYNC_NEGO; in build_sdtr()
1088 u8 wide = ((dcb->dev_mode & NTC_DO_WIDE_NEGO) & in build_wdtr()
1089 (acb->config & HCC_WIDE_CARD)) ? 1 : 0; in build_wdtr()
1090 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_wdtr()
1091 if (srb->msg_count > 1) in build_wdtr()
1094 srb->msg_count += spi_populate_width_msg(ptr, wide); in build_wdtr()
1095 srb->state |= SRB_DO_WIDE_NEGO; in build_wdtr()
1106 if (timer_pending(&acb->selto_timer))
1108 acb->selto_timer.function = selection_timeout_missed;
1109 acb->selto_timer.data = (unsigned long) acb;
1111 (jiffies + HZ, acb->last_reset + HZ / 2))
1112 acb->selto_timer.expires =
1113 acb->last_reset + HZ / 2 + 1;
1115 acb->selto_timer.expires = jiffies + HZ + 1;
1116 add_timer(&acb->selto_timer);
1125 if (!acb->active_dcb || !acb->active_dcb->active_srb)
1128 DC395x_LOCK_IO(acb->scsi_host, flags);
1129 srb = acb->active_dcb->active_srb;
1131 DC395x_UNLOCK_IO(acb->scsi_host, flags);
1143 srb->tag_number = TAG_NONE; /* acb->tag_max_num: had error read in eeprom */ in start_scsi()
1164 if (acb->active_dcb) in start_scsi()
1170 /* Allow starting of SCSI commands half a second before we allow the mid-level in start_scsi()
1172 if (time_before(jiffies, acb->last_reset - HZ / 2)) in start_scsi()
1177 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in start_scsi()
1178 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1179 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1180 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1181 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1183 identify_message = dcb->identify_msg; in start_scsi()
1186 if (srb->flag & AUTO_REQSENSE) in start_scsi()
1189 if (((srb->cmd->cmnd[0] == INQUIRY) in start_scsi()
1190 || (srb->cmd->cmnd[0] == REQUEST_SENSE) in start_scsi()
1191 || (srb->flag & AUTO_REQSENSE)) in start_scsi()
1192 && (((dcb->sync_mode & WIDE_NEGO_ENABLE) in start_scsi()
1193 && !(dcb->sync_mode & WIDE_NEGO_DONE)) in start_scsi()
1194 || ((dcb->sync_mode & SYNC_NEGO_ENABLE) in start_scsi()
1195 && !(dcb->sync_mode & SYNC_NEGO_DONE))) in start_scsi()
1196 && (dcb->target_lun == 0)) { in start_scsi()
1197 srb->msgout_buf[0] = identify_message; in start_scsi()
1198 srb->msg_count = 1; in start_scsi()
1200 srb->state = SRB_MSGOUT; in start_scsi()
1202 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1203 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1208 if (dcb->sync_mode & SYNC_NEGO_ENABLE in start_scsi()
1209 && dcb->inquiry7 & SCSI_INQ_SYNC) { in start_scsi()
1213 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1214 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1218 srb->msg_count = 0; in start_scsi()
1224 srb->state = SRB_START_; in start_scsi()
1226 if ((dcb->sync_mode & EN_TAG_QUEUEING) in start_scsi()
1231 while (tag_mask & dcb->tag_mask in start_scsi()
1232 && tag_number < dcb->max_command) { in start_scsi()
1236 if (tag_number >= dcb->max_command) { in start_scsi()
1237 srb->state = SRB_READY; in start_scsi()
1245 dcb->tag_mask |= tag_mask; in start_scsi()
1246 srb->tag_number = tag_number; in start_scsi()
1248 srb->state = SRB_START_; in start_scsi()
1253 if (srb->flag & AUTO_REQSENSE) { in start_scsi()
1255 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1261 ptr = (u8 *)srb->cmd->cmnd; in start_scsi()
1262 for (i = 0; i < srb->cmd->cmd_len; i++) in start_scsi()
1274 srb->state = SRB_READY; in start_scsi()
1276 srb->msg_count = 0; in start_scsi()
1284 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1285 dcb->active_srb = srb; in start_scsi()
1286 acb->active_dcb = dcb; in start_scsi()
1300 srb->state |= SRB_MSGOUT
1307 srb->msgout_buf[0] = ABORT; in enable_msgout_abort()
1308 srb->msg_count = 1; in enable_msgout_abort()
1310 srb->state &= ~SRB_MSGIN; in enable_msgout_abort()
1311 srb->state |= SRB_MSGOUT; in enable_msgout_abort()
1316 * dc395x_handle_interrupt - Handle an interrupt that has been confirmed to
1333 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1338 if (timer_pending(&acb->selto_timer)) in dc395x_handle_interrupt()
1339 timer_delete(&acb->selto_timer); in dc395x_handle_interrupt()
1357 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1361 srb = dcb->active_srb; in dc395x_handle_interrupt()
1362 if (dcb->flag & ABORT_DEV_) in dc395x_handle_interrupt()
1366 phase = (u16)srb->scsi_phase; in dc395x_handle_interrupt()
1377 /* nop0, phase:4 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1389 srb->scsi_phase = scsi_status & PHASEMASK; in dc395x_handle_interrupt()
1400 /* nop1, phase:4 PH_BUS_FREE .. initial phase */ in dc395x_handle_interrupt()
1408 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_handle_interrupt()
1425 /* interrupt pending - let's process it! */ in dc395x_interrupt()
1432 if (acb->active_dcb) { in dc395x_interrupt()
1433 acb->active_dcb-> flag |= ABORT_DEV_; in dc395x_interrupt()
1434 if (acb->active_dcb->active_srb) in dc395x_interrupt()
1435 enable_msgout_abort(acb, acb->active_dcb->active_srb); in dc395x_interrupt()
1451 if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT)) in msgout_phase0()
1455 srb->state &= ~SRB_MSGOUT; in msgout_phase0()
1466 if (!(srb->state & SRB_MSGOUT)) in msgout_phase1()
1467 srb->state |= SRB_MSGOUT; in msgout_phase1()
1469 if (!srb->msg_count) { in msgout_phase1()
1476 ptr = (u8 *)srb->msgout_buf; in msgout_phase1()
1477 for (i = 0; i < srb->msg_count; i++) in msgout_phase1()
1479 srb->msg_count = 0; in msgout_phase1()
1480 if (srb->msgout_buf[0] == ABORT_TASK_SET) in msgout_phase1()
1481 srb->state = SRB_ABORT_SENT; in msgout_phase1()
1503 if (!(srb->flag & AUTO_REQSENSE)) { in command_phase1()
1504 ptr = (u8 *)srb->cmd->cmnd; in command_phase1()
1505 for (i = 0; i < srb->cmd->cmd_len; i++) { in command_phase1()
1511 dcb = acb->active_dcb; in command_phase1()
1513 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1519 srb->state |= SRB_COMMAND; in command_phase1()
1534 u32 xferred = srb->total_xfer_length - left; /* bytes transferred */ in sg_update_list()
1535 struct SGentry *psge = srb->segment_x + srb->sg_index; in sg_update_list()
1542 srb->total_xfer_length = left; /* update remaining count */ in sg_update_list()
1543 for (idx = srb->sg_index; idx < srb->sg_count; idx++) { in sg_update_list()
1544 if (xferred >= psge->length) { in sg_update_list()
1546 xferred -= psge->length; in sg_update_list()
1549 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1550 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1552 psge->length -= xferred; in sg_update_list()
1553 psge->address += xferred; in sg_update_list()
1554 srb->sg_index = idx; in sg_update_list()
1555 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1556 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1573 sg_update_list(srb, srb->total_xfer_length - 1); in sg_subtract_one()
1606 * Seems to be needed for unknown reasons; could be a hardware bug :-(
1608 #define DC395x_LASTPIO 4
1614 struct DeviceCtlBlk *dcb = srb->dcb; in data_out_phase0()
1632 if (!(srb->state & SRB_XFERPAD)) { in data_out_phase0()
1634 srb->status |= PARITY_ERROR; in data_out_phase0()
1650 if (dcb->sync_period & WIDE_SYNC) in data_out_phase0()
1663 if (srb->total_xfer_length > DC395x_LASTPIO) in data_out_phase0()
1670 if (d_left_counter == 1 && dcb->sync_period & WIDE_SYNC in data_out_phase0()
1671 && scsi_bufflen(srb->cmd) % 2) { in data_out_phase0()
1685 srb->total_xfer_length = 0; in data_out_phase0()
1693 srb->total_xfer_length - d_left_counter; in data_out_phase0()
1695 (dcb->sync_period & WIDE_SYNC) ? 2 : 1; in data_out_phase0()
1698 if ((srb->segment_x[srb->sg_index].length == in data_out_phase0()
1699 diff && scsi_sg_count(srb->cmd)) in data_out_phase0()
1701 (PAGE_SIZE - diff)) in data_out_phase0()
1704 srb->total_xfer_length - diff; in data_out_phase0()
1706 /*srb->total_xfer_length -= diff; */ in data_out_phase0()
1707 /*srb->virt_addr += diff; */ in data_out_phase0()
1708 /*if (srb->cmd->use_sg) */ in data_out_phase0()
1709 /* srb->sg_index++; */ in data_out_phase0()
1745 if (!(srb->state & SRB_XFERPAD)) { in data_in_phase0()
1750 srb->status |= PARITY_ERROR; in data_in_phase0()
1766 0x80) && --ctr); in data_in_phase0()
1774 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : in data_in_phase0()
1777 /* KG: Less than or equal to 4 bytes can not be transferred via DMA, it seems. */ in data_in_phase0()
1779 && srb->total_xfer_length <= DC395x_LASTPIO) { in data_in_phase0()
1780 size_t left_io = srb->total_xfer_length; in data_in_phase0()
1782 /*u32 addr = (srb->segment_x[srb->sg_index].address); */ in data_in_phase0()
1784 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
1791 size_t offset = srb->request_length - left_io; in data_in_phase0()
1794 /* Assumption: it's inside one page as it's at most 4 bytes and in data_in_phase0()
1795 I just assume it's on a 4-byte boundary */ in data_in_phase0()
1796 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_in_phase0()
1797 srb->sg_count, &offset, &len); in data_in_phase0()
1800 left_io -= len; in data_in_phase0()
1807 d_left_counter--; in data_in_phase0()
1810 len--; in data_in_phase0()
1822 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { in data_in_phase0()
1824 if (srb->total_xfer_length > 0) { in data_in_phase0()
1828 srb->total_xfer_length--; in data_in_phase0()
1837 /*srb->total_xfer_length = 0; */ in data_in_phase0()
1854 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
1872 } while (!(TempDMAstatus & DMAXFERCOMP) && --ctr); in data_in_phase0()
1873 srb->total_xfer_length = 0; in data_in_phase0()
1875 srb->total_xfer_length = d_left_counter; in data_in_phase0()
1904 struct DeviceCtlBlk *dcb = srb->dcb; in data_io_transfer()
1907 if (srb->sg_index >= srb->sg_count) { in data_io_transfer()
1912 if (srb->total_xfer_length > DC395x_LASTPIO) { in data_io_transfer()
1926 srb->state |= SRB_DATA_XFER; in data_io_transfer()
1928 if (scsi_sg_count(srb->cmd)) { /* with S/G */ in data_io_transfer()
1931 srb->sg_bus_addr + in data_io_transfer()
1933 srb->sg_index); in data_io_transfer()
1936 ((u32)(srb->sg_count - in data_io_transfer()
1937 srb->sg_index) << 3)); in data_io_transfer()
1941 srb->segment_x[0].address); in data_io_transfer()
1943 srb->segment_x[0].length); in data_io_transfer()
1947 srb->total_xfer_length); in data_io_transfer()
1961 else if (srb->total_xfer_length > 0) { /* The last four bytes: Do PIO */ in data_io_transfer()
1966 srb->state |= SRB_DATA_XFER; in data_io_transfer()
1969 srb->total_xfer_length); in data_io_transfer()
1975 int ln = srb->total_xfer_length; in data_io_transfer() local
1976 size_t left_io = srb->total_xfer_length; in data_io_transfer()
1978 if (srb->dcb->sync_period & WIDE_SYNC) in data_io_transfer()
1986 size_t offset = srb->request_length - left_io; in data_io_transfer()
1989 /* Again, max 4 bytes */ in data_io_transfer()
1990 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_io_transfer()
1991 srb->sg_count, &offset, &len); in data_io_transfer()
1994 left_io -= len; in data_io_transfer()
1996 while (len--) { in data_io_transfer()
2005 if (srb->dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2006 if (ln % 2) { in data_io_transfer()
2011 /*DC395x_write32(acb, TRM_S1040_SCSI_COUNTER, ln); */ in data_io_transfer()
2018 if (srb->sg_count) { in data_io_transfer()
2019 srb->adapter_status = H_OVER_UNDER_RUN; in data_io_transfer()
2020 srb->status |= OVER_RUN; in data_io_transfer()
2027 if (dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2037 * or chip is to blame :-( */ in data_io_transfer()
2045 * something broke :-( */ in data_io_transfer()
2051 srb->state |= SRB_XFERPAD; in data_io_transfer()
2063 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2064 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2065 srb->state = SRB_COMPLETED; in status_phase0()
2075 srb->state = SRB_STATUS; in status_phase1()
2099 srb->msgout_buf[0] = MESSAGE_REJECT; in msgin_reject()
2100 srb->msg_count = 1; in msgin_reject()
2102 srb->state &= ~SRB_MSGIN; in msgin_reject()
2103 srb->state |= SRB_MSGOUT; in msgin_reject()
2113 if (list_empty(&dcb->srb_going_list)) in msgin_qtag()
2115 list_for_each_entry(i, &dcb->srb_going_list, list) { in msgin_qtag()
2116 if (i->tag_number == tag) { in msgin_qtag()
2124 if (dcb->flag & ABORT_DEV_) { in msgin_qtag()
2125 /*srb->state = SRB_ABORT_SENT; */ in msgin_qtag()
2129 if (!(srb->state & SRB_DISCONNECT)) in msgin_qtag()
2132 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2133 srb->state |= dcb->active_srb->state; in msgin_qtag()
2134 srb->state |= SRB_DATA_XFER; in msgin_qtag()
2135 dcb->active_srb = srb; in msgin_qtag()
2140 srb = acb->tmp_srb; in msgin_qtag()
2141 srb->state = SRB_UNEXPECT_RESEL; in msgin_qtag()
2142 dcb->active_srb = srb; in msgin_qtag()
2143 srb->msgout_buf[0] = ABORT_TASK; in msgin_qtag()
2144 srb->msg_count = 1; in msgin_qtag()
2153 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2154 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2155 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2163 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_async()
2165 dcb->sync_mode &= ~(SYNC_NEGO_ENABLE); in msgin_set_async()
2166 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_async()
2167 /*dcb->sync_period &= 0; */ in msgin_set_async()
2168 dcb->sync_offset = 0; in msgin_set_async()
2169 dcb->min_nego_period = 200 >> 2; /* 200ns <=> 5 MHz */ in msgin_set_async()
2170 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_async()
2172 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_async()
2173 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_async()
2183 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_sync()
2187 if (srb->msgin_buf[4] > 15) in msgin_set_sync()
2188 srb->msgin_buf[4] = 15; in msgin_set_sync()
2189 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) in msgin_set_sync()
2190 dcb->sync_offset = 0; in msgin_set_sync()
2191 else if (dcb->sync_offset == 0) in msgin_set_sync()
2192 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2193 if (srb->msgin_buf[4] > dcb->sync_offset) in msgin_set_sync()
2194 srb->msgin_buf[4] = dcb->sync_offset; in msgin_set_sync()
2196 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2198 while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval] in msgin_set_sync()
2199 || dcb->min_nego_period > in msgin_set_sync()
2203 srb->msgin_buf[3] = clock_period[bval]; in msgin_set_sync()
2204 dcb->sync_period &= 0xf0; in msgin_set_sync()
2205 dcb->sync_period |= ALT_SYNC | bval; in msgin_set_sync()
2206 dcb->min_nego_period = srb->msgin_buf[3]; in msgin_set_sync()
2208 if (dcb->sync_period & WIDE_SYNC) in msgin_set_sync()
2213 if (!(srb->state & SRB_DO_SYNC_NEGO)) { in msgin_set_sync()
2216 memcpy(srb->msgout_buf, srb->msgin_buf, 5); in msgin_set_sync()
2217 srb->msg_count = 5; in msgin_set_sync()
2219 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_sync()
2221 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_sync()
2222 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_sync()
2227 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_sync()
2228 dcb->sync_mode |= SYNC_NEGO_DONE | SYNC_NEGO_ENABLE; in msgin_set_sync()
2237 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_nowide()
2239 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_nowide()
2240 dcb->sync_mode &= ~(WIDE_NEGO_ENABLE); in msgin_set_nowide()
2241 dcb->sync_mode |= WIDE_NEGO_DONE; in msgin_set_nowide()
2242 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_nowide()
2244 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_nowide()
2245 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_nowide()
2253 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_wide()
2254 u8 wide = (dcb->dev_mode & NTC_DO_WIDE_NEGO in msgin_set_wide()
2255 && acb->config & HCC_WIDE_CARD) ? 1 : 0; in msgin_set_wide()
2257 if (srb->msgin_buf[3] > wide) in msgin_set_wide()
2258 srb->msgin_buf[3] = wide; in msgin_set_wide()
2260 if (!(srb->state & SRB_DO_WIDE_NEGO)) { in msgin_set_wide()
2261 memcpy(srb->msgout_buf, srb->msgin_buf, 4); in msgin_set_wide()
2262 srb->msg_count = 4; in msgin_set_wide()
2263 srb->state |= SRB_DO_WIDE_NEGO; in msgin_set_wide()
2267 dcb->sync_mode |= (WIDE_NEGO_ENABLE | WIDE_NEGO_DONE); in msgin_set_wide()
2268 if (srb->msgin_buf[3] > 0) in msgin_set_wide()
2269 dcb->sync_period |= WIDE_SYNC; in msgin_set_wide()
2271 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_wide()
2272 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_wide()
2273 /*dcb->sync_mode &= ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); */ in msgin_set_wide()
2275 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_wide()
2276 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_wide()
2292 * 04h - 7Fh Reserved
2293 * 80h - FFh Vendor specific
2298 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0()
2300 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2301 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2303 switch (srb->msgin_buf[0]) { in msgin_phase0()
2305 srb->state = SRB_DISCONNECT; in msgin_phase0()
2313 srb->msgin_buf[1]); in msgin_phase0()
2320 if (srb->state & SRB_DO_SYNC_NEGO) { in msgin_phase0()
2325 if (srb->state & SRB_DO_WIDE_NEGO) { in msgin_phase0()
2330 /*srb->state |= SRB_ABORT_SENT */ in msgin_phase0()
2335 if (srb->msgin_buf[1] == 3 in msgin_phase0()
2336 && srb->msgin_buf[2] == EXTENDED_SDTR) { in msgin_phase0()
2341 if (srb->msgin_buf[1] == 2 in msgin_phase0()
2342 && srb->msgin_buf[2] == EXTENDED_WDTR in msgin_phase0()
2343 && srb->msgin_buf[3] <= 2) { /* sanity check ... */ in msgin_phase0()
2369 dcb->flag |= ABORT_DEV_; in msgin_phase0()
2375 if (srb->msgin_buf[0] & IDENTIFY_BASE) { in msgin_phase0()
2376 srb->msg_count = 1; in msgin_phase0()
2377 srb->msgout_buf[0] = dcb->identify_msg; in msgin_phase0()
2379 srb->state |= SRB_MSGOUT; in msgin_phase0()
2386 srb->state &= ~SRB_MSGIN; in msgin_phase0()
2387 acb->msg_len = 0; in msgin_phase0()
2400 if (!(srb->state & SRB_MSGIN)) { in msgin_phase1()
2401 srb->state &= ~SRB_DISCONNECT; in msgin_phase1()
2402 srb->state |= SRB_MSGIN; in msgin_phase1()
2427 if (dcb->identify_msg & 0x07) in set_xfer_rate()
2430 if (acb->scan_devices) { in set_xfer_rate()
2431 current_sync_offset = dcb->sync_offset; in set_xfer_rate()
2435 list_for_each_entry(i, &acb->dcb_list, list) in set_xfer_rate()
2436 if (i->target_id == dcb->target_id) { in set_xfer_rate()
2437 i->sync_period = dcb->sync_period; in set_xfer_rate()
2438 i->sync_offset = dcb->sync_offset; in set_xfer_rate()
2439 i->sync_mode = dcb->sync_mode; in set_xfer_rate()
2440 i->min_nego_period = dcb->min_nego_period; in set_xfer_rate()
2447 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect()
2453 acb->last_reset = in disconnect()
2455 HZ * acb->eeprom.delay_time; in disconnect()
2460 srb = dcb->active_srb; in disconnect()
2461 acb->active_dcb = NULL; in disconnect()
2463 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in disconnect()
2466 if (srb->state & SRB_UNEXPECT_RESEL) { in disconnect()
2467 srb->state = 0; in disconnect()
2469 } else if (srb->state & SRB_ABORT_SENT) { in disconnect()
2470 dcb->flag &= ~ABORT_DEV_; in disconnect()
2471 acb->last_reset = jiffies + HZ / 2 + 1; in disconnect()
2472 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2475 if ((srb->state & (SRB_START_ + SRB_MSGOUT)) in disconnect()
2476 || !(srb-> in disconnect()
2482 /* Unexp. Disc / Sel Timeout */ in disconnect()
2483 if (srb->state != SRB_START_ in disconnect()
2484 && srb->state != SRB_MSGOUT) { in disconnect()
2485 srb->state = SRB_READY; in disconnect()
2486 srb->target_status = SCSI_STAT_SEL_TIMEOUT; in disconnect()
2490 if (srb->retry_count++ > DC395x_MAX_RETRIES in disconnect()
2491 || acb->scan_devices) { in disconnect()
2492 srb->target_status = in disconnect()
2497 list_move(&srb->list, &dcb->srb_waiting_list); in disconnect()
2500 } else if (srb->state & SRB_DISCONNECT) { in disconnect()
2509 } else if (srb->state & SRB_COMPLETED) { in disconnect()
2515 dcb->active_srb = NULL; in disconnect()
2516 srb->state = SRB_FREE; in disconnect()
2525 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect()
2535 srb = dcb->active_srb; in reselect()
2541 if (!acb->scan_devices) { in reselect()
2542 /*srb->state |= SRB_DISCONNECT; */ in reselect()
2544 srb->state = SRB_READY; in reselect()
2546 list_move(&srb->list, &dcb->srb_waiting_list); in reselect()
2560 acb->active_dcb = dcb; in reselect()
2562 if (dcb->sync_mode & EN_TAG_QUEUEING) { in reselect()
2563 srb = acb->tmp_srb; in reselect()
2564 dcb->active_srb = srb; in reselect()
2567 srb = dcb->active_srb; in reselect()
2568 if (!srb || !(srb->state & SRB_DISCONNECT)) { in reselect()
2572 srb = acb->tmp_srb; in reselect()
2573 srb->state = SRB_UNEXPECT_RESEL; in reselect()
2574 dcb->active_srb = srb; in reselect()
2577 if (dcb->flag & ABORT_DEV_) { in reselect()
2578 /*srb->state = SRB_ABORT_SENT; */ in reselect()
2581 srb->state = SRB_DATA_XFER; in reselect()
2585 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in reselect()
2588 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); /* host ID */ in reselect()
2589 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
2590 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
2591 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
2617 if ((ptr->Vers & 0x07) >= 2 || (ptr->RDF & 0x0F) == 2) { in disc_tagq_set()
2618 if ((ptr->Flags & SCSI_INQ_CMDQUEUE) in disc_tagq_set()
2619 && (dcb->dev_mode & NTC_DO_TAG_QUEUEING) && in disc_tagq_set()
2620 /*(dcb->dev_mode & NTC_DO_DISCONNECT) */ in disc_tagq_set()
2621 /* ((dcb->dev_type == TYPE_DISK) in disc_tagq_set()
2622 || (dcb->dev_type == TYPE_MOD)) && */ in disc_tagq_set()
2624 if (dcb->max_command == 1) in disc_tagq_set()
2625 dcb->max_command = in disc_tagq_set()
2626 dcb->acb->tag_max_num; in disc_tagq_set()
2627 dcb->sync_mode |= EN_TAG_QUEUEING; in disc_tagq_set()
2628 /*dcb->tag_mask = 0; */ in disc_tagq_set()
2630 dcb->max_command = 1; in disc_tagq_set()
2638 u8 bval1 = ptr->DevType & SCSI_DEVTYPE; in add_dev()
2639 dcb->dev_type = bval1; in add_dev()
2648 struct scsi_cmnd *cmd = srb->cmd; in pci_unmap_srb()
2649 enum dma_data_direction dir = cmd->sc_data_direction; in pci_unmap_srb()
2653 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
2665 if (!(srb->flag & AUTO_REQSENSE)) in pci_unmap_srb_sense()
2668 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
2669 srb->segment_x[0].length, DMA_FROM_DEVICE); in pci_unmap_srb_sense()
2671 srb->total_xfer_length = srb->xferred; in pci_unmap_srb_sense()
2672 srb->segment_x[0].address = in pci_unmap_srb_sense()
2673 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address; in pci_unmap_srb_sense()
2674 srb->segment_x[0].length = in pci_unmap_srb_sense()
2675 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length; in pci_unmap_srb_sense()
2687 struct scsi_cmnd *cmd = srb->cmd; in srb_done()
2688 enum dma_data_direction dir = cmd->sc_data_direction; in srb_done()
2691 status = srb->target_status; in srb_done()
2694 if (srb->flag & AUTO_REQSENSE) { in srb_done()
2699 srb->flag &= ~AUTO_REQSENSE; in srb_done()
2700 srb->adapter_status = 0; in srb_done()
2701 srb->target_status = SAM_STAT_CHECK_CONDITION; in srb_done()
2722 tempcnt = (u8)list_size(&dcb->srb_going_list); in srb_done()
2724 tempcnt--; in srb_done()
2725 dcb->max_command = tempcnt; in srb_done()
2727 list_move(&srb->list, &dcb->srb_waiting_list); in srb_done()
2729 srb->adapter_status = 0; in srb_done()
2730 srb->target_status = 0; in srb_done()
2733 srb->adapter_status = H_SEL_TIMEOUT; in srb_done()
2734 srb->target_status = 0; in srb_done()
2737 srb->adapter_status = 0; in srb_done()
2745 status = srb->adapter_status; in srb_done()
2747 srb->target_status = 0; in srb_done()
2748 scsi_msg_to_host_byte(cmd, srb->end_message); in srb_done()
2749 } else if (srb->status & PARITY_ERROR) { in srb_done()
2753 srb->adapter_status = 0; in srb_done()
2754 srb->target_status = 0; in srb_done()
2764 if (cmd->cmnd[0] == INQUIRY) { in srb_done()
2776 && cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8 in srb_done()
2777 && dir != DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2) in srb_done()
2778 dcb->inquiry7 = ptr->Flags; in srb_done()
2780 /*if( srb->cmd->cmnd[0] == INQUIRY && */ in srb_done()
2781 /* (host_byte(cmd->result) == DID_OK || status_byte(cmd->result) & CHECK_CONDITION) ) */ in srb_done()
2784 if (!dcb->init_tcq_flag) { in srb_done()
2786 dcb->init_tcq_flag = 1; in srb_done()
2795 scsi_set_resid(cmd, srb->total_xfer_length); in srb_done()
2797 if (srb != acb->tmp_srb) { in srb_done()
2799 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
2813 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
2818 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) { in doing_srb_done()
2819 p = srb->cmd; in doing_srb_done()
2820 printk("G:%p(%02i-%i) ", p, in doing_srb_done()
2821 p->device->id, (u8)p->device->lun); in doing_srb_done()
2822 list_del(&srb->list); in doing_srb_done()
2824 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
2837 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) { in doing_srb_done()
2838 p = srb->cmd; in doing_srb_done()
2840 printk("W:%p<%02i-%i>", p, p->device->id, in doing_srb_done()
2841 (u8)p->device->lun); in doing_srb_done()
2842 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
2853 dcb->flag &= ~ABORT_DEV_; in doing_srb_done()
2860 acb->acb_flag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in reset_scsi_bus()
2872 DC395x_write8(acb, TRM_S1040_SCSI_TIMEOUT, acb->sel_timeout); in set_basic_config()
2873 if (acb->config & HCC_PARITY) in set_basic_config()
2883 DC395x_write8(acb, TRM_S1040_SCSI_HOSTID, acb->scsi_host->this_id); in set_basic_config()
2889 /* DMA config */ in set_basic_config()
2907 if (timer_pending(&acb->waiting_timer)) in scsi_reset_detect()
2908 timer_delete(&acb->waiting_timer); in scsi_reset_detect()
2915 acb->last_reset = in scsi_reset_detect()
2917 HZ * acb->eeprom.delay_time; in scsi_reset_detect()
2924 if (acb->acb_flag & RESET_DEV) { /* RESET_DETECT, RESET_DONE, RESET_DEV */ in scsi_reset_detect()
2925 acb->acb_flag |= RESET_DONE; in scsi_reset_detect()
2927 acb->acb_flag |= RESET_DETECT; in scsi_reset_detect()
2931 acb->active_dcb = NULL; in scsi_reset_detect()
2932 acb->acb_flag = 0; in scsi_reset_detect()
2941 struct scsi_cmnd *cmd = srb->cmd; in request_sense()
2943 srb->flag |= AUTO_REQSENSE; in request_sense()
2944 srb->adapter_status = 0; in request_sense()
2945 srb->target_status = 0; in request_sense()
2948 memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); in request_sense()
2951 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address = in request_sense()
2952 srb->segment_x[0].address; in request_sense()
2953 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length = in request_sense()
2954 srb->segment_x[0].length; in request_sense()
2955 srb->xferred = srb->total_xfer_length; in request_sense()
2956 /* srb->segment_x : a one entry of S/G list table */ in request_sense()
2957 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE; in request_sense()
2958 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE; in request_sense()
2960 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
2961 cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE, in request_sense()
2963 srb->sg_count = 1; in request_sense()
2964 srb->sg_index = 0; in request_sense()
2967 list_move(&srb->list, &dcb->srb_waiting_list); in request_sense()
2974 * device_alloc - Allocate a new device instance. This create the
2989 struct NvRamType *eeprom = &acb->eeprom; in device_alloc()
2990 u8 period_index = eeprom->target[target].period & 0x07; in device_alloc()
2996 dcb->acb = NULL; in device_alloc()
2997 INIT_LIST_HEAD(&dcb->srb_going_list); in device_alloc()
2998 INIT_LIST_HEAD(&dcb->srb_waiting_list); in device_alloc()
2999 dcb->active_srb = NULL; in device_alloc()
3000 dcb->tag_mask = 0; in device_alloc()
3001 dcb->max_command = 1; in device_alloc()
3002 dcb->target_id = target; in device_alloc()
3003 dcb->target_lun = lun; in device_alloc()
3004 dcb->dev_mode = eeprom->target[target].cfg0; in device_alloc()
3006 dcb->identify_msg = in device_alloc()
3007 IDENTIFY(dcb->dev_mode & NTC_DO_DISCONNECT, lun); in device_alloc()
3009 dcb->identify_msg = IDENTIFY(0, lun); in device_alloc()
3011 dcb->inquiry7 = 0; in device_alloc()
3012 dcb->sync_mode = 0; in device_alloc()
3013 dcb->min_nego_period = clock_period[period_index]; in device_alloc()
3014 dcb->sync_period = 0; in device_alloc()
3015 dcb->sync_offset = 0; in device_alloc()
3016 dcb->flag = 0; in device_alloc()
3019 if ((dcb->dev_mode & NTC_DO_WIDE_NEGO) in device_alloc()
3020 && (acb->config & HCC_WIDE_CARD)) in device_alloc()
3021 dcb->sync_mode |= WIDE_NEGO_ENABLE; in device_alloc()
3024 if (dcb->dev_mode & NTC_DO_SYNC_NEGO) in device_alloc()
3026 dcb->sync_mode |= SYNC_NEGO_ENABLE; in device_alloc()
3028 if (dcb->target_lun != 0) { in device_alloc()
3032 list_for_each_entry(iter, &acb->dcb_list, list) in device_alloc()
3033 if (iter->target_id == dcb->target_id) { in device_alloc()
3043 dcb->sync_mode = p->sync_mode; in device_alloc()
3044 dcb->sync_period = p->sync_period; in device_alloc()
3045 dcb->min_nego_period = p->min_nego_period; in device_alloc()
3046 dcb->sync_offset = p->sync_offset; in device_alloc()
3047 dcb->inquiry7 = p->inquiry7; in device_alloc()
3054 * adapter_add_device - Adds the device instance to the adaptor instance.
3063 dcb->acb = acb; in adapter_add_device()
3066 if (list_empty(&acb->dcb_list)) in adapter_add_device()
3067 acb->dcb_run_robin = dcb; in adapter_add_device()
3070 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3073 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3074 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3079 * adapter_remove_device - Removes the device instance from the adaptor
3094 if (acb->active_dcb == dcb) in adapter_remove_device()
3095 acb->active_dcb = NULL; in adapter_remove_device()
3096 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3097 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3100 list_for_each_entry_safe(i, tmp, &acb->dcb_list, list) in adapter_remove_device()
3102 list_del(&i->list); in adapter_remove_device()
3107 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3108 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3109 dcb->acb = NULL; in adapter_remove_device()
3114 * adapter_remove_and_free_device - Removes a single device from the adapter
3123 if (list_size(&dcb->srb_going_list) > 1) { in adapter_remove_and_free_device()
3132 * adapter_remove_and_free_all_devices - Removes and frees all of the
3142 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3148 * dc395x_sdev_init - Called by the scsi mid layer to tell us about a new
3156 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_sdev_init()
3159 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_sdev_init()
3161 return -ENOMEM; in dc395x_sdev_init()
3169 * dc395x_sdev_destroy - Called by the scsi mid layer to tell us about a
3176 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)scsi_device->host->hostdata; in dc395x_sdev_destroy()
3177 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_sdev_destroy()
3202 * trms1040_write_cmd - write the secified command and address to
3245 * trms1040_set_data - store a single byte in the eeprom
3301 * trms1040_write_all - write 128 bytes to the eeprom
3338 * trms1040_get_data - get a single byte from the eeprom
3379 * trms1040_read_all - read all bytes from the eeprom
3407 * check_eeprom - get and check contents of the eeprom
3435 eeprom->sub_vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM; in check_eeprom()
3436 eeprom->sub_vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8); in check_eeprom()
3437 eeprom->sub_sys_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040; in check_eeprom()
3438 eeprom->sub_sys_id[1] = in check_eeprom()
3440 eeprom->sub_class = 0x00; in check_eeprom()
3441 eeprom->vendor_id[0] = (u8)PCI_VENDOR_ID_TEKRAM; in check_eeprom()
3442 eeprom->vendor_id[1] = (u8)(PCI_VENDOR_ID_TEKRAM >> 8); in check_eeprom()
3443 eeprom->device_id[0] = (u8)PCI_DEVICE_ID_TEKRAM_TRMS1040; in check_eeprom()
3444 eeprom->device_id[1] = in check_eeprom()
3446 eeprom->reserved = 0x00; in check_eeprom()
3448 for (d_addr = 0, d_eeprom = (u32 *)eeprom->target; in check_eeprom()
3462 eeprom->cksum = 0x00; in check_eeprom()
3467 *w_eeprom = 0x1234 - cksum; in check_eeprom()
3469 eeprom->delay_time = cfg_data[CFG_RESET_DELAY].value; in check_eeprom()
3479 * print_eeprom_settings - output the eeprom settings
3496 kfree(acb->srb_array[i].segment_x); in adapter_sg_tables_free()
3507 int pages = (mem_needed+(PAGE_SIZE-1))/PAGE_SIZE; in adapter_sg_tables_alloc()
3514 acb->srb_array[i].segment_x = NULL; in adapter_sg_tables_alloc()
3516 while (pages--) { in adapter_sg_tables_alloc()
3524 acb->srb_array[srb_idx++].segment_x = in adapter_sg_tables_alloc()
3528 acb->srb.segment_x = in adapter_sg_tables_alloc()
3536 * adapter_print_config - print adapter connection and termination
3537 * config
3575 * adapter_init_params - Initialize the various parameters in the
3588 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_params()
3591 /* NOTE: acb->scsi_host is set at scsi_host/acb creation time */ in adapter_init_params()
3592 /* NOTE: acb->io_port_base is set at port registration time */ in adapter_init_params()
3593 /* NOTE: acb->io_port_len is set at port registration time */ in adapter_init_params()
3595 INIT_LIST_HEAD(&acb->dcb_list); in adapter_init_params()
3596 acb->dcb_run_robin = NULL; in adapter_init_params()
3597 acb->active_dcb = NULL; in adapter_init_params()
3599 INIT_LIST_HEAD(&acb->srb_free_list); in adapter_init_params()
3601 acb->tmp_srb = &acb->srb; in adapter_init_params()
3602 timer_setup(&acb->waiting_timer, waiting_timeout, 0); in adapter_init_params()
3603 timer_setup(&acb->selto_timer, NULL, 0); in adapter_init_params()
3605 acb->srb_count = DC395x_MAX_SRB_CNT; in adapter_init_params()
3607 acb->sel_timeout = DC395x_SEL_TIMEOUT; /* timeout=250ms */ in adapter_init_params()
3608 /* NOTE: acb->irq_level is set at IRQ registration time */ in adapter_init_params()
3610 acb->tag_max_num = 1 << eeprom->max_tag; in adapter_init_params()
3611 if (acb->tag_max_num > 30) in adapter_init_params()
3612 acb->tag_max_num = 30; in adapter_init_params()
3614 acb->acb_flag = 0; /* RESET_DETECT, RESET_DONE, RESET_DEV */ in adapter_init_params()
3615 acb->gmode2 = eeprom->channel_cfg; in adapter_init_params()
3616 acb->config = 0; /* NOTE: actually set in adapter_init_chip */ in adapter_init_params()
3618 if (eeprom->channel_cfg & NAC_SCANLUN) in adapter_init_params()
3619 acb->lun_chk = 1; in adapter_init_params()
3620 acb->scan_devices = 1; in adapter_init_params()
3622 acb->scsi_host->this_id = eeprom->scsi_id; in adapter_init_params()
3623 acb->hostid_bit = (1 << acb->scsi_host->this_id); in adapter_init_params()
3626 acb->dcb_map[i] = 0; in adapter_init_params()
3628 acb->msg_len = 0; in adapter_init_params()
3631 for (i = 0; i < acb->srb_count - 1; i++) in adapter_init_params()
3632 list_add_tail(&acb->srb_array[i].list, &acb->srb_free_list); in adapter_init_params()
3637 * adapter_init_scsi_host - Initialize the scsi host instance based on
3650 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in adapter_init_scsi_host()
3651 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_scsi_host()
3653 host->max_cmd_len = 24; in adapter_init_scsi_host()
3654 host->can_queue = DC395x_MAX_CMD_QUEUE; in adapter_init_scsi_host()
3655 host->cmd_per_lun = DC395x_MAX_CMD_PER_LUN; in adapter_init_scsi_host()
3656 host->this_id = (int)eeprom->scsi_id; in adapter_init_scsi_host()
3657 host->io_port = acb->io_port_base; in adapter_init_scsi_host()
3658 host->n_io_port = acb->io_port_len; in adapter_init_scsi_host()
3659 host->dma_channel = -1; in adapter_init_scsi_host()
3660 host->unique_id = acb->io_port_base; in adapter_init_scsi_host()
3661 host->irq = acb->irq_level; in adapter_init_scsi_host()
3662 acb->last_reset = jiffies; in adapter_init_scsi_host()
3664 host->max_id = 16; in adapter_init_scsi_host()
3665 if (host->max_id - 1 == eeprom->scsi_id) in adapter_init_scsi_host()
3666 host->max_id--; in adapter_init_scsi_host()
3668 if (eeprom->channel_cfg & NAC_SCANLUN) in adapter_init_scsi_host()
3669 host->max_lun = 8; in adapter_init_scsi_host()
3671 host->max_lun = 1; in adapter_init_scsi_host()
3676 * adapter_init_chip - Get the chip into a know state and figure out
3680 * this function. The config will be configured correctly on return.
3686 struct NvRamType *eeprom = &acb->eeprom; in adapter_init_chip()
3700 acb->config = HCC_AUTOTERM | HCC_PARITY; in adapter_init_chip()
3702 acb->config |= HCC_WIDE_CARD; in adapter_init_chip()
3704 if (eeprom->channel_cfg & NAC_POWERON_SCSI_RESET) in adapter_init_chip()
3705 acb->config |= HCC_SCSI_RESET; in adapter_init_chip()
3707 if (acb->config & HCC_SCSI_RESET) { in adapter_init_chip()
3714 acb->last_reset = in adapter_init_chip()
3716 HZ * acb->eeprom.delay_time; in adapter_init_chip()
3724 * adapter_init - Grab the resource for the card, setup the adapter
3744 acb->io_port_base = io_port; in adapter_init()
3745 acb->io_port_len = io_port_len; in adapter_init()
3752 acb->irq_level = irq; in adapter_init()
3755 check_eeprom(&acb->eeprom, io_port); in adapter_init()
3756 print_eeprom_settings(&acb->eeprom); in adapter_init()
3767 adapter_init_scsi_host(acb->scsi_host); in adapter_init()
3774 if (acb->irq_level) in adapter_init()
3775 free_irq(acb->irq_level, acb); in adapter_init()
3776 if (acb->io_port_base) in adapter_init()
3777 release_region(acb->io_port_base, acb->io_port_len); in adapter_init()
3785 * adapter_uninit_chip - cleanly shut down the scsi controller chip,
3798 if (acb->config & HCC_SCSI_RESET) in adapter_uninit_chip()
3808 * adapter_uninit - Shut down the chip and release any resources that
3812 * @acb: The adapter which we are to un-initialize.
3817 DC395x_LOCK_IO(acb->scsi_host, flags); in adapter_uninit()
3820 if (timer_pending(&acb->waiting_timer)) in adapter_uninit()
3821 timer_delete(&acb->waiting_timer); in adapter_uninit()
3822 if (timer_pending(&acb->selto_timer)) in adapter_uninit()
3823 timer_delete(&acb->selto_timer); in adapter_uninit()
3827 DC395x_UNLOCK_IO(acb->scsi_host, flags); in adapter_uninit()
3829 if (acb->irq_level) in adapter_uninit()
3830 free_irq(acb->irq_level, acb); in adapter_uninit()
3831 if (acb->io_port_base) in adapter_uninit()
3832 release_region(acb->io_port_base, acb->io_port_len); in adapter_uninit()
3845 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; in dc395x_show_info()
3854 DC395x_LOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
3856 seq_printf(m, "SCSI Host Nr %i, ", host->host_no); in dc395x_show_info()
3858 (acb->config & HCC_WIDE_CARD) ? "Wide" : ""); in dc395x_show_info()
3859 seq_printf(m, "io_port_base 0x%04lx, ", acb->io_port_base); in dc395x_show_info()
3860 seq_printf(m, "irq_level 0x%04x, ", acb->irq_level); in dc395x_show_info()
3861 seq_printf(m, " SelTimeout %ims\n", (1638 * acb->sel_timeout) / 1000); in dc395x_show_info()
3863 seq_printf(m, "MaxID %i, MaxLUN %llu, ", host->max_id, host->max_lun); in dc395x_show_info()
3864 seq_printf(m, "AdapterID %i\n", host->this_id); in dc395x_show_info()
3866 seq_printf(m, "tag_max_num %i", acb->tag_max_num); in dc395x_show_info()
3870 seq_printf(m, ", DelayReset %is\n", acb->eeprom.delay_time); in dc395x_show_info()
3873 seq_printf(m, "Nr of DCBs: %i\n", list_size(&acb->dcb_list)); in dc395x_show_info()
3874 seq_printf(m, "Map of attached LUNs: %8ph\n", &acb->dcb_map[0]); in dc395x_show_info()
3875 seq_printf(m, " %8ph\n", &acb->dcb_map[8]); in dc395x_show_info()
3881 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
3883 seq_printf(m, "%02i %02i %02i ", dev, dcb->target_id, in dc395x_show_info()
3884 dcb->target_lun); in dc395x_show_info()
3885 YESNO(dcb->dev_mode & NTC_DO_PARITY_CHK); in dc395x_show_info()
3886 YESNO(dcb->sync_offset); in dc395x_show_info()
3887 YESNO(dcb->sync_period & WIDE_SYNC); in dc395x_show_info()
3888 YESNO(dcb->dev_mode & NTC_DO_DISCONNECT); in dc395x_show_info()
3889 YESNO(dcb->dev_mode & NTC_DO_SEND_START); in dc395x_show_info()
3890 YESNO(dcb->sync_mode & EN_TAG_QUEUEING); in dc395x_show_info()
3891 nego_period = clock_period[dcb->sync_period & 0x07] << 2; in dc395x_show_info()
3892 if (dcb->sync_offset) in dc395x_show_info()
3895 seq_printf(m, " (%03i ns)", (dcb->min_nego_period << 2)); in dc395x_show_info()
3897 if (dcb->sync_offset & 0x0f) { in dc395x_show_info()
3902 (dcb->sync_offset & 0x0f)); in dc395x_show_info()
3907 seq_printf(m, " %02i\n", dcb->max_command); in dc395x_show_info()
3911 if (timer_pending(&acb->waiting_timer)) in dc395x_show_info()
3916 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
3918 if (!list_empty(&dcb->srb_waiting_list)) in dc395x_show_info()
3919 seq_printf(m, "DCB (%02i-%i): Waiting: %i:", in dc395x_show_info()
3920 dcb->target_id, dcb->target_lun, in dc395x_show_info()
3921 list_size(&dcb->srb_waiting_list)); in dc395x_show_info()
3922 list_for_each_entry(srb, &dcb->srb_waiting_list, list) in dc395x_show_info()
3923 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
3924 if (!list_empty(&dcb->srb_going_list)) in dc395x_show_info()
3925 seq_printf(m, "\nDCB (%02i-%i): Going : %i:", in dc395x_show_info()
3926 dcb->target_id, dcb->target_lun, in dc395x_show_info()
3927 list_size(&dcb->srb_going_list)); in dc395x_show_info()
3928 list_for_each_entry(srb, &dcb->srb_going_list, list) in dc395x_show_info()
3929 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
3930 if (!list_empty(&dcb->srb_waiting_list) || !list_empty(&dcb->srb_going_list)) in dc395x_show_info()
3934 DC395x_UNLOCK_IO(acb->scsi_host, flags); in dc395x_show_info()
3953 .dma_boundary = PAGE_SIZE - 1,
3958 * dc395x_init_one - Initialise a single instance of the adapter.
3968 * Returns 0 on success, or an error code (-ve) on failure.
3979 return -ENODEV; in dc395x_init_one()
3983 irq = dev->irq; in dc395x_init_one()
3991 acb = (struct AdapterCtlBlk*)scsi_host->hostdata; in dc395x_init_one()
3992 acb->scsi_host = scsi_host; in dc395x_init_one()
3993 acb->dev = dev; in dc395x_init_one()
4004 if (scsi_add_host(scsi_host, &dev->dev)) in dc395x_init_one()
4018 return -ENODEV; in dc395x_init_one()
4023 * dc395x_remove_one - Called to remove a single instance of the
4031 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)(scsi_host->hostdata); in dc395x_remove_one()
4061 MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and …