Lines Matching full:dcb
230 struct DeviceCtlBlk *dcb; member
270 struct list_head list; /* next/prev ptrs for the dcb list */
302 struct list_head dcb_list; /* head of going dcb list */
380 static u8 start_scsi(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
384 static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb,
392 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
394 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
397 struct DeviceCtlBlk *dcb);
717 /* find supplied dcb and then select the next one */ in dcb_get_next()
736 static void free_tag(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in free_tag() argument
739 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */ in free_tag()
778 static void srb_waiting_insert(struct DeviceCtlBlk *dcb, in srb_waiting_insert() argument
782 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_waiting_insert()
783 list_add(&srb->list, &dcb->srb_waiting_list); in srb_waiting_insert()
787 static void srb_waiting_append(struct DeviceCtlBlk *dcb, in srb_waiting_append() argument
791 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_waiting_append()
792 list_add_tail(&srb->list, &dcb->srb_waiting_list); in srb_waiting_append()
796 static void srb_going_append(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in srb_going_append() argument
799 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_going_append()
800 list_add_tail(&srb->list, &dcb->srb_going_list); in srb_going_append()
804 static void srb_going_remove(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in srb_going_remove() argument
809 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_going_remove()
811 list_for_each_entry_safe(i, tmp, &dcb->srb_going_list, list) in srb_going_remove()
819 static void srb_waiting_remove(struct DeviceCtlBlk *dcb, in srb_waiting_remove() argument
825 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_waiting_remove()
827 list_for_each_entry_safe(i, tmp, &dcb->srb_waiting_list, list) in srb_waiting_remove()
835 static void srb_going_to_waiting_move(struct DeviceCtlBlk *dcb, in srb_going_to_waiting_move() argument
840 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_going_to_waiting_move()
841 list_move(&srb->list, &dcb->srb_waiting_list); in srb_going_to_waiting_move()
845 static void srb_waiting_to_going_move(struct DeviceCtlBlk *dcb, in srb_waiting_to_going_move() argument
850 srb->cmd, dcb->target_id, dcb->target_lun, srb); in srb_waiting_to_going_move()
851 list_move(&srb->list, &dcb->srb_going_list); in srb_waiting_to_going_move()
874 struct DeviceCtlBlk *dcb; in waiting_process_next() local
889 * Find the starting dcb. Need to find it again in the list in waiting_process_next()
892 list_for_each_entry(dcb, dcb_list_head, list) in waiting_process_next()
893 if (dcb == acb->dcb_run_robin) { in waiting_process_next()
894 start = dcb; in waiting_process_next()
905 * Loop over the dcb, but we start somewhere (potentially) in in waiting_process_next()
918 /* move to next dcb */ in waiting_process_next()
948 /* Get the DCB for a given ID/LUN combination */
958 struct DeviceCtlBlk *dcb = srb->dcb; in send_srb() local
960 if (dcb->max_command <= list_size(&dcb->srb_going_list) || in send_srb()
963 srb_waiting_append(dcb, srb); in send_srb()
968 if (!start_scsi(acb, dcb, srb)) in send_srb()
969 srb_going_append(dcb, srb); in send_srb()
971 srb_waiting_insert(dcb, srb); in send_srb()
976 /* Prepare SRB for being sent to Device DCB w/ command *cmd */
977 static void build_srb(struct scsi_cmnd *cmd, struct DeviceCtlBlk *dcb, in build_srb() argument
983 cmd, dcb->target_id, dcb->target_lun); in build_srb()
985 srb->dcb = dcb; in build_srb()
1042 if (dcb->sync_period & WIDE_SYNC && in build_srb()
1048 srb->sg_bus_addr = pci_map_single(dcb->acb->dev, in build_srb()
1082 struct DeviceCtlBlk *dcb; in dc395x_queue_command_lck() local
1106 /* do we have a DCB for the device */ in dc395x_queue_command_lck()
1107 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_queue_command_lck()
1108 if (!dcb) { in dc395x_queue_command_lck()
1130 build_srb(cmd, dcb, srb); in dc395x_queue_command_lck()
1132 if (!list_empty(&dcb->srb_waiting_list)) { in dc395x_queue_command_lck()
1134 srb_waiting_append(dcb, srb); in dc395x_queue_command_lck()
1189 struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in dump_register_info() argument
1194 if (!dcb) in dump_register_info()
1195 dcb = acb->active_dcb; in dump_register_info()
1196 if (!srb && dcb) in dump_register_info()
1197 srb = dcb->active_srb; in dump_register_info()
1270 struct DeviceCtlBlk *dcb; in reset_dev_param() local
1274 list_for_each_entry(dcb, &acb->dcb_list, list) { in reset_dev_param()
1277 dcb->sync_mode &= ~(SYNC_NEGO_DONE + WIDE_NEGO_DONE); in reset_dev_param()
1278 dcb->sync_period = 0; in reset_dev_param()
1279 dcb->sync_offset = 0; in reset_dev_param()
1281 dcb->dev_mode = eeprom->target[dcb->target_id].cfg0; in reset_dev_param()
1282 period_index = eeprom->target[dcb->target_id].period & 0x07; in reset_dev_param()
1283 dcb->min_nego_period = clock_period[period_index]; in reset_dev_param()
1284 if (!(dcb->dev_mode & NTC_DO_WIDE_NEGO) in reset_dev_param()
1286 dcb->sync_mode &= ~WIDE_NEGO_ENABLE; in reset_dev_param()
1366 struct DeviceCtlBlk *dcb; in dc395x_eh_abort() local
1371 dcb = find_dcb(acb, cmd->device->id, cmd->device->lun); in dc395x_eh_abort()
1372 if (!dcb) { in dc395x_eh_abort()
1377 srb = find_cmd(cmd, &dcb->srb_waiting_list); in dc395x_eh_abort()
1379 srb_waiting_remove(dcb, srb); in dc395x_eh_abort()
1382 free_tag(dcb, srb); in dc395x_eh_abort()
1388 srb = find_cmd(cmd, &dcb->srb_going_list); in dc395x_eh_abort()
1400 static void build_sdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_sdtr() argument
1411 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) { in build_sdtr()
1412 dcb->sync_offset = 0; in build_sdtr()
1413 dcb->min_nego_period = 200 >> 2; in build_sdtr()
1414 } else if (dcb->sync_offset == 0) in build_sdtr()
1415 dcb->sync_offset = SYNC_NEGO_OFFSET; in build_sdtr()
1420 *ptr++ = dcb->min_nego_period; /* Transfer period (in 4ns) */ in build_sdtr()
1421 *ptr++ = dcb->sync_offset; /* Transfer period (max. REQ/ACK dist) */ in build_sdtr()
1428 static void build_wdtr(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in build_wdtr() argument
1431 u8 wide = ((dcb->dev_mode & NTC_DO_WIDE_NEGO) & in build_wdtr()
1489 static u8 start_scsi(struct AdapterCtlBlk* acb, struct DeviceCtlBlk* dcb, in start_scsi() argument
1496 dcb->target_id, dcb->target_lun, srb); in start_scsi()
1543 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in start_scsi()
1544 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in start_scsi()
1545 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in start_scsi()
1548 identify_message = dcb->identify_msg; in start_scsi()
1557 && (((dcb->sync_mode & WIDE_NEGO_ENABLE) in start_scsi()
1558 && !(dcb->sync_mode & WIDE_NEGO_DONE)) in start_scsi()
1559 || ((dcb->sync_mode & SYNC_NEGO_ENABLE) in start_scsi()
1560 && !(dcb->sync_mode & SYNC_NEGO_DONE))) in start_scsi()
1561 && (dcb->target_lun == 0)) { in start_scsi()
1567 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1568 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1569 build_wdtr(acb, dcb, srb); in start_scsi()
1573 if (dcb->sync_mode & SYNC_NEGO_ENABLE in start_scsi()
1574 && dcb->inquiry7 & SCSI_INQ_SYNC) { in start_scsi()
1575 build_sdtr(acb, dcb, srb); in start_scsi()
1578 if (dcb->sync_mode & WIDE_NEGO_ENABLE in start_scsi()
1579 && dcb->inquiry7 & SCSI_INQ_WBUS16) { in start_scsi()
1580 build_wdtr(acb, dcb, srb); in start_scsi()
1591 if ((dcb->sync_mode & EN_TAG_QUEUEING) in start_scsi()
1596 while (tag_mask & dcb->tag_mask in start_scsi()
1597 && tag_number < dcb->max_command) { in start_scsi()
1601 if (tag_number >= dcb->max_command) { in start_scsi()
1614 dcb->tag_mask |= tag_mask; in start_scsi()
1627 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in start_scsi()
1647 srb->cmd, dcb->target_id, dcb->target_lun); in start_scsi()
1649 free_tag(dcb, srb); in start_scsi()
1659 dcb->active_srb = srb; in start_scsi()
1660 acb->active_dcb = dcb; in start_scsi()
1699 struct DeviceCtlBlk *dcb; in dc395x_handle_interrupt() local
1740 dcb = acb->active_dcb; in dc395x_handle_interrupt()
1741 if (!dcb) { in dc395x_handle_interrupt()
1747 srb = dcb->active_srb; in dc395x_handle_interrupt()
1748 if (dcb->flag & ABORT_DEV_) { in dc395x_handle_interrupt()
1895 struct DeviceCtlBlk *dcb; in command_phase1() local
1910 dcb = acb->active_dcb; in command_phase1()
1912 DC395x_write8(acb, TRM_S1040_SCSI_FIFO, (dcb->target_lun << 5)); in command_phase1()
1972 pci_dma_sync_single_for_cpu(srb->dcb-> in sg_update_list()
1980 pci_dma_sync_single_for_device(srb->dcb-> in sg_update_list()
2042 struct DeviceCtlBlk *dcb = srb->dcb; in data_out_phase0() local
2088 if (dcb->sync_period & WIDE_SYNC) in data_out_phase0()
2095 (dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_out_phase0()
2118 if (d_left_counter == 1 && dcb->sync_period & WIDE_SYNC in data_out_phase0()
2146 (dcb->sync_period & WIDE_SYNC) ? 2 : 1; in data_out_phase0()
2246 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : in data_in_phase0()
2253 (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_in_phase0()
2270 (srb->dcb->sync_period & WIDE_SYNC) ? in data_in_phase0()
2273 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2314 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { in data_in_phase0()
2351 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2407 struct DeviceCtlBlk *dcb = srb->dcb; in data_io_transfer() local
2430 dump_register_info(acb, dcb, srb); in data_io_transfer()
2490 if (srb->dcb->sync_period & WIDE_SYNC) in data_io_transfer()
2520 if (srb->dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2547 if (dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2630 srb->dcb->target_id, srb->dcb->target_lun); in msgin_reject()
2635 struct DeviceCtlBlk *dcb, u8 tag) in msgin_qtag() argument
2642 if (!(dcb->tag_mask & (1 << tag))) in msgin_qtag()
2645 dcb->tag_mask, tag); in msgin_qtag()
2647 if (list_empty(&dcb->srb_going_list)) in msgin_qtag()
2649 list_for_each_entry(i, &dcb->srb_going_list, list) { in msgin_qtag()
2659 srb->cmd, srb->dcb->target_id, srb->dcb->target_lun); in msgin_qtag()
2660 if (dcb->flag & ABORT_DEV_) { in msgin_qtag()
2668 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2669 srb->state |= dcb->active_srb->state; in msgin_qtag()
2671 dcb->active_srb = srb; in msgin_qtag()
2678 dcb->active_srb = srb; in msgin_qtag()
2688 struct DeviceCtlBlk *dcb) in reprogram_regs() argument
2690 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); in reprogram_regs()
2691 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); in reprogram_regs()
2692 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); in reprogram_regs()
2693 set_xfer_rate(acb, dcb); in reprogram_regs()
2700 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_async() local
2702 dcb->target_id, dcb->target_lun); in msgin_set_async()
2704 dcb->sync_mode &= ~(SYNC_NEGO_ENABLE); in msgin_set_async()
2705 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_async()
2706 /*dcb->sync_period &= 0; */ in msgin_set_async()
2707 dcb->sync_offset = 0; in msgin_set_async()
2708 dcb->min_nego_period = 200 >> 2; /* 200ns <=> 5 MHz */ in msgin_set_async()
2710 reprogram_regs(acb, dcb); in msgin_set_async()
2711 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_async()
2712 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_async()
2713 build_wdtr(acb, dcb, srb); in msgin_set_async()
2723 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_sync() local
2728 dcb->target_id, srb->msgin_buf[3] << 2, in msgin_set_sync()
2735 if (!(dcb->dev_mode & NTC_DO_SYNC_NEGO)) in msgin_set_sync()
2736 dcb->sync_offset = 0; in msgin_set_sync()
2737 else if (dcb->sync_offset == 0) in msgin_set_sync()
2738 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2739 if (srb->msgin_buf[4] > dcb->sync_offset) in msgin_set_sync()
2740 srb->msgin_buf[4] = dcb->sync_offset; in msgin_set_sync()
2742 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2745 || dcb->min_nego_period > in msgin_set_sync()
2753 dcb->sync_period &= 0xf0; in msgin_set_sync()
2754 dcb->sync_period |= ALT_SYNC | bval; in msgin_set_sync()
2755 dcb->min_nego_period = srb->msgin_buf[3]; in msgin_set_sync()
2757 if (dcb->sync_period & WIDE_SYNC) in msgin_set_sync()
2764 dcb->target_id, (fact == 500) ? "Wide16" : "", in msgin_set_sync()
2765 dcb->min_nego_period << 2, dcb->sync_offset, in msgin_set_sync()
2766 (fact / dcb->min_nego_period), in msgin_set_sync()
2767 ((fact % dcb->min_nego_period) * 10 + in msgin_set_sync()
2768 dcb->min_nego_period / 2) / dcb->min_nego_period); in msgin_set_sync()
2778 dcb->sync_mode |= SYNC_NEGO_DONE; in msgin_set_sync()
2780 if ((dcb->sync_mode & WIDE_NEGO_ENABLE) in msgin_set_sync()
2781 && !(dcb->sync_mode & WIDE_NEGO_DONE)) { in msgin_set_sync()
2782 build_wdtr(acb, dcb, srb); in msgin_set_sync()
2788 dcb->sync_mode |= SYNC_NEGO_DONE | SYNC_NEGO_ENABLE; in msgin_set_sync()
2790 reprogram_regs(acb, dcb); in msgin_set_sync()
2797 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_nowide() local
2798 dprintkdbg(DBG_1, "msgin_set_nowide: <%02i>\n", dcb->target_id); in msgin_set_nowide()
2800 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_nowide()
2801 dcb->sync_mode &= ~(WIDE_NEGO_ENABLE); in msgin_set_nowide()
2802 dcb->sync_mode |= WIDE_NEGO_DONE; in msgin_set_nowide()
2804 reprogram_regs(acb, dcb); in msgin_set_nowide()
2805 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_nowide()
2806 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_nowide()
2807 build_sdtr(acb, dcb, srb); in msgin_set_nowide()
2815 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_wide() local
2816 u8 wide = (dcb->dev_mode & NTC_DO_WIDE_NEGO in msgin_set_wide()
2818 dprintkdbg(DBG_1, "msgin_set_wide: <%02i>\n", dcb->target_id); in msgin_set_wide()
2826 dcb->target_id); in msgin_set_wide()
2833 dcb->sync_mode |= (WIDE_NEGO_ENABLE | WIDE_NEGO_DONE); in msgin_set_wide()
2835 dcb->sync_period |= WIDE_SYNC; in msgin_set_wide()
2837 dcb->sync_period &= ~WIDE_SYNC; in msgin_set_wide()
2839 /*dcb->sync_mode &= ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); */ in msgin_set_wide()
2842 (8 << srb->msgin_buf[3]), dcb->target_id); in msgin_set_wide()
2843 reprogram_regs(acb, dcb); in msgin_set_wide()
2844 if ((dcb->sync_mode & SYNC_NEGO_ENABLE) in msgin_set_wide()
2845 && !(dcb->sync_mode & SYNC_NEGO_DONE)) { in msgin_set_wide()
2846 build_sdtr(acb, dcb, srb); in msgin_set_wide()
2868 struct DeviceCtlBlk *dcb = acb->active_dcb; in msgin_phase0() local
2883 msgin_qtag(acb, dcb, in msgin_phase0()
2947 srb->cmd, dcb->target_id, in msgin_phase0()
2948 dcb->target_lun); in msgin_phase0()
2949 dcb->flag |= ABORT_DEV_; in msgin_phase0()
2958 srb->msgout_buf[0] = dcb->identify_msg; in msgin_phase0()
3004 static void set_xfer_rate(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb) in set_xfer_rate() argument
3009 if (dcb->identify_msg & 0x07) in set_xfer_rate()
3013 current_sync_offset = dcb->sync_offset; in set_xfer_rate()
3018 if (i->target_id == dcb->target_id) { in set_xfer_rate()
3019 i->sync_period = dcb->sync_period; in set_xfer_rate()
3020 i->sync_offset = dcb->sync_offset; in set_xfer_rate()
3021 i->sync_mode = dcb->sync_mode; in set_xfer_rate()
3022 i->min_nego_period = dcb->min_nego_period; in set_xfer_rate()
3029 struct DeviceCtlBlk *dcb = acb->active_dcb; in disconnect() local
3032 if (!dcb) { in disconnect()
3043 srb = dcb->active_srb; in disconnect()
3053 dcb->target_id, dcb->target_lun); in disconnect()
3057 dcb->flag &= ~ABORT_DEV_; in disconnect()
3083 dcb->target_id, dcb->target_lun); in disconnect()
3090 free_tag(dcb, srb); in disconnect()
3091 srb_going_to_waiting_move(dcb, srb); in disconnect()
3114 free_tag(dcb, srb); in disconnect()
3115 dcb->active_srb = NULL; in disconnect()
3117 srb_done(acb, dcb, srb); in disconnect()
3125 struct DeviceCtlBlk *dcb = acb->active_dcb; in reselect() local
3136 if (dcb) { /* Arbitration lost but Reselection win */ in reselect()
3137 srb = dcb->active_srb; in reselect()
3148 srb->cmd, dcb->target_id, in reselect()
3149 dcb->target_lun, rsel_tar_lun_id, in reselect()
3155 free_tag(dcb, srb); in reselect()
3156 srb_going_to_waiting_move(dcb, srb); in reselect()
3168 dcb = find_dcb(acb, id, lun); in reselect()
3169 if (!dcb) { in reselect()
3175 acb->active_dcb = dcb; in reselect()
3177 if (!(dcb->dev_mode & NTC_DO_DISCONNECT)) in reselect()
3180 dcb->target_id, dcb->target_lun); in reselect()
3182 if (dcb->sync_mode & EN_TAG_QUEUEING /*&& !arblostflag */) { in reselect()
3184 dcb->active_srb = srb; in reselect()
3187 srb = dcb->active_srb; in reselect()
3194 dcb->target_id, dcb->target_lun); in reselect()
3197 dcb->active_srb = srb; in reselect()
3200 if (dcb->flag & ABORT_DEV_) { in reselect()
3211 dprintkdbg(DBG_0, "reselect: select <%i>\n", dcb->target_id); in reselect()
3213 DC395x_write8(acb, TRM_S1040_SCSI_TARGETID, dcb->target_id); /* target ID */ in reselect()
3214 DC395x_write8(acb, TRM_S1040_SCSI_OFFSET, dcb->sync_offset); /* offset */ in reselect()
3215 DC395x_write8(acb, TRM_S1040_SCSI_SYNC, dcb->sync_period); /* sync period, wide */ in reselect()
3238 static void disc_tagq_set(struct DeviceCtlBlk *dcb, struct ScsiInqData *ptr) in disc_tagq_set() argument
3243 && (dcb->dev_mode & NTC_DO_TAG_QUEUEING) && in disc_tagq_set()
3244 /*(dcb->dev_mode & NTC_DO_DISCONNECT) */ in disc_tagq_set()
3245 /* ((dcb->dev_type == TYPE_DISK) in disc_tagq_set()
3246 || (dcb->dev_type == TYPE_MOD)) && */ in disc_tagq_set()
3248 if (dcb->max_command == 1) in disc_tagq_set()
3249 dcb->max_command = in disc_tagq_set()
3250 dcb->acb->tag_max_num; in disc_tagq_set()
3251 dcb->sync_mode |= EN_TAG_QUEUEING; in disc_tagq_set()
3252 /*dcb->tag_mask = 0; */ in disc_tagq_set()
3254 dcb->max_command = 1; in disc_tagq_set()
3259 static void add_dev(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in add_dev() argument
3263 dcb->dev_type = bval1; in add_dev()
3265 disc_tagq_set(dcb, ptr); in add_dev()
3314 static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in srb_done() argument
3342 cmd->cmnd[0], dcb->target_id, in srb_done()
3343 dcb->target_lun, status, acb->scan_devices); in srb_done()
3348 cmd->cmnd[0], dcb->target_id, in srb_done()
3349 dcb->target_lun, status, acb->scan_devices); in srb_done()
3354 cmd->cmnd[0], dcb->target_id, in srb_done()
3355 dcb->target_lun, status, acb->scan_devices); in srb_done()
3360 cmd->cmnd[0], dcb->target_id, in srb_done()
3361 dcb->target_lun, status, acb->scan_devices); in srb_done()
3366 cmd->cmnd[0], dcb->target_id, in srb_done()
3367 dcb->target_lun, status, acb->scan_devices); in srb_done()
3409 request_sense(acb, dcb, srb); in srb_done()
3412 tempcnt = (u8)list_size(&dcb->srb_going_list); in srb_done()
3414 dcb->target_id, dcb->target_lun, tempcnt); in srb_done()
3417 dcb->max_command = tempcnt; in srb_done()
3418 free_tag(dcb, srb); in srb_done()
3419 srb_going_to_waiting_move(dcb, srb); in srb_done()
3475 dcb->inquiry7 = ptr->Flags; in srb_done()
3481 if (!dcb->init_tcq_flag) { in srb_done()
3482 add_dev(acb, dcb, ptr); in srb_done()
3483 dcb->init_tcq_flag = 1; in srb_done()
3504 srb_going_remove(dcb, srb); in srb_done()
3523 struct DeviceCtlBlk *dcb; in doing_srb_done() local
3526 list_for_each_entry(dcb, &acb->dcb_list, list) { in doing_srb_done()
3531 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) { in doing_srb_done()
3540 srb_going_remove(dcb, srb); in doing_srb_done()
3541 free_tag(dcb, srb); in doing_srb_done()
3552 if (!list_empty(&dcb->srb_going_list)) in doing_srb_done()
3555 dcb->target_id, dcb->target_lun); in doing_srb_done()
3556 if (dcb->tag_mask) in doing_srb_done()
3559 dcb->target_id, dcb->target_lun, in doing_srb_done()
3560 dcb->tag_mask); in doing_srb_done()
3563 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) { in doing_srb_done()
3570 srb_waiting_remove(dcb, srb); in doing_srb_done()
3581 if (!list_empty(&dcb->srb_waiting_list)) in doing_srb_done()
3583 list_size(&dcb->srb_waiting_list), dcb->target_id, in doing_srb_done()
3584 dcb->target_lun); in doing_srb_done()
3585 dcb->flag &= ~ABORT_DEV_; in doing_srb_done()
3673 static void request_sense(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb, in request_sense() argument
3706 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */ in request_sense()
3709 srb->cmd, dcb->target_id, dcb->target_lun); in request_sense()
3710 srb_going_to_waiting_move(dcb, srb); in request_sense()
3734 struct DeviceCtlBlk *dcb; in device_alloc() local
3736 dcb = kmalloc(sizeof(struct DeviceCtlBlk), GFP_ATOMIC); in device_alloc()
3738 if (!dcb) in device_alloc()
3740 dcb->acb = NULL; in device_alloc()
3741 INIT_LIST_HEAD(&dcb->srb_going_list); in device_alloc()
3742 INIT_LIST_HEAD(&dcb->srb_waiting_list); in device_alloc()
3743 dcb->active_srb = NULL; in device_alloc()
3744 dcb->tag_mask = 0; in device_alloc()
3745 dcb->max_command = 1; in device_alloc()
3746 dcb->target_id = target; in device_alloc()
3747 dcb->target_lun = lun; in device_alloc()
3748 dcb->dev_mode = eeprom->target[target].cfg0; in device_alloc()
3750 dcb->identify_msg = in device_alloc()
3751 IDENTIFY(dcb->dev_mode & NTC_DO_DISCONNECT, lun); in device_alloc()
3753 dcb->identify_msg = IDENTIFY(0, lun); in device_alloc()
3755 dcb->inquiry7 = 0; in device_alloc()
3756 dcb->sync_mode = 0; in device_alloc()
3757 dcb->min_nego_period = clock_period[period_index]; in device_alloc()
3758 dcb->sync_period = 0; in device_alloc()
3759 dcb->sync_offset = 0; in device_alloc()
3760 dcb->flag = 0; in device_alloc()
3763 if ((dcb->dev_mode & NTC_DO_WIDE_NEGO) in device_alloc()
3765 dcb->sync_mode |= WIDE_NEGO_ENABLE; in device_alloc()
3768 if (dcb->dev_mode & NTC_DO_SYNC_NEGO) in device_alloc()
3770 dcb->sync_mode |= SYNC_NEGO_ENABLE; in device_alloc()
3772 if (dcb->target_lun != 0) { in device_alloc()
3776 if (p->target_id == dcb->target_id) in device_alloc()
3780 dcb->target_id, dcb->target_lun, in device_alloc()
3782 dcb->sync_mode = p->sync_mode; in device_alloc()
3783 dcb->sync_period = p->sync_period; in device_alloc()
3784 dcb->min_nego_period = p->min_nego_period; in device_alloc()
3785 dcb->sync_offset = p->sync_offset; in device_alloc()
3786 dcb->inquiry7 = p->inquiry7; in device_alloc()
3788 return dcb; in device_alloc()
3796 * @dcb: A newly created and initialised device instance to add.
3799 struct DeviceCtlBlk *dcb) in adapter_add_device() argument
3802 dcb->acb = acb; in adapter_add_device()
3806 acb->dcb_run_robin = dcb; in adapter_add_device()
3809 list_add_tail(&dcb->list, &acb->dcb_list); in adapter_add_device()
3812 acb->dcb_map[dcb->target_id] |= (1 << dcb->target_lun); in adapter_add_device()
3813 acb->children[dcb->target_id][dcb->target_lun] = dcb; in adapter_add_device()
3824 * @dcb: A device that has previously been added to the adapter.
3827 struct DeviceCtlBlk *dcb) in adapter_remove_device() argument
3832 dcb->target_id, dcb->target_lun); in adapter_remove_device()
3835 if (acb->active_dcb == dcb) in adapter_remove_device()
3837 if (acb->dcb_run_robin == dcb) in adapter_remove_device()
3838 acb->dcb_run_robin = dcb_get_next(&acb->dcb_list, dcb); in adapter_remove_device()
3842 if (dcb == i) { in adapter_remove_device()
3848 acb->dcb_map[dcb->target_id] &= ~(1 << dcb->target_lun); in adapter_remove_device()
3849 acb->children[dcb->target_id][dcb->target_lun] = NULL; in adapter_remove_device()
3850 dcb->acb = NULL; in adapter_remove_device()
3859 * @dcb: A device that has previously been added to the adapter.
3862 struct DeviceCtlBlk *dcb) in adapter_remove_and_free_device() argument
3864 if (list_size(&dcb->srb_going_list) > 1) { in adapter_remove_and_free_device()
3867 dcb->target_id, dcb->target_lun, in adapter_remove_and_free_device()
3868 list_size(&dcb->srb_going_list)); in adapter_remove_and_free_device()
3871 adapter_remove_device(acb, dcb); in adapter_remove_and_free_device()
3872 kfree(dcb); in adapter_remove_and_free_device()
3884 struct DeviceCtlBlk *dcb; in adapter_remove_and_free_all_devices() local
3889 list_for_each_entry_safe(dcb, tmp, &acb->dcb_list, list) in adapter_remove_and_free_all_devices()
3890 adapter_remove_and_free_device(acb, dcb); in adapter_remove_and_free_all_devices()
3904 struct DeviceCtlBlk *dcb; in dc395x_slave_alloc() local
3906 dcb = device_alloc(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_alloc()
3907 if (!dcb) in dc395x_slave_alloc()
3909 adapter_add_device(acb, dcb); in dc395x_slave_alloc()
3924 struct DeviceCtlBlk *dcb = find_dcb(acb, scsi_device->id, scsi_device->lun); in dc395x_slave_destroy() local
3925 if (dcb) in dc395x_slave_destroy()
3926 adapter_remove_and_free_device(acb, dcb); in dc395x_slave_destroy()
4541 "size{acb=0x%04x dcb=0x%04x srb=0x%04x}\n", in adapter_init()
4620 struct DeviceCtlBlk *dcb; in dc395x_show_info() local
4660 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4662 seq_printf(m, "%02i %02i %02i ", dev, dcb->target_id, in dc395x_show_info()
4663 dcb->target_lun); in dc395x_show_info()
4664 YESNO(dcb->dev_mode & NTC_DO_PARITY_CHK); in dc395x_show_info()
4665 YESNO(dcb->sync_offset); in dc395x_show_info()
4666 YESNO(dcb->sync_period & WIDE_SYNC); in dc395x_show_info()
4667 YESNO(dcb->dev_mode & NTC_DO_DISCONNECT); in dc395x_show_info()
4668 YESNO(dcb->dev_mode & NTC_DO_SEND_START); in dc395x_show_info()
4669 YESNO(dcb->sync_mode & EN_TAG_QUEUEING); in dc395x_show_info()
4670 nego_period = clock_period[dcb->sync_period & 0x07] << 2; in dc395x_show_info()
4671 if (dcb->sync_offset) in dc395x_show_info()
4674 seq_printf(m, " (%03i ns)", (dcb->min_nego_period << 2)); in dc395x_show_info()
4676 if (dcb->sync_offset & 0x0f) { in dc395x_show_info()
4681 (dcb->sync_offset & 0x0f)); in dc395x_show_info()
4686 seq_printf(m, " %02i\n", dcb->max_command); in dc395x_show_info()
4695 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4697 if (!list_empty(&dcb->srb_waiting_list)) in dc395x_show_info()
4698 seq_printf(m, "DCB (%02i-%i): Waiting: %i:", in dc395x_show_info()
4699 dcb->target_id, dcb->target_lun, in dc395x_show_info()
4700 list_size(&dcb->srb_waiting_list)); in dc395x_show_info()
4701 list_for_each_entry(srb, &dcb->srb_waiting_list, list) in dc395x_show_info()
4703 if (!list_empty(&dcb->srb_going_list)) in dc395x_show_info()
4705 dcb->target_id, dcb->target_lun, in dc395x_show_info()
4706 list_size(&dcb->srb_going_list)); in dc395x_show_info()
4707 list_for_each_entry(srb, &dcb->srb_going_list, list) in dc395x_show_info()
4709 if (!list_empty(&dcb->srb_waiting_list) || !list_empty(&dcb->srb_going_list)) in dc395x_show_info()
4714 seq_printf(m, "DCB list for ACB %p:\n", acb); in dc395x_show_info()
4715 list_for_each_entry(dcb, &acb->dcb_list, list) { in dc395x_show_info()
4716 seq_printf(m, "%p -> ", dcb); in dc395x_show_info()