Lines Matching refs:srb

335 	struct ScsiReqBlk srb;  member
344 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
346 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
348 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
350 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
352 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
354 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
356 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
358 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
360 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
362 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
364 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
366 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
368 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
370 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
374 struct ScsiReqBlk *srb);
377 struct ScsiReqBlk *srb, u16 io_dir);
381 struct ScsiReqBlk *srb);
383 struct ScsiReqBlk *srb);
385 struct ScsiReqBlk *srb);
389 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb);
391 struct ScsiReqBlk *srb);
393 struct ScsiReqBlk *srb);
395 struct ScsiReqBlk *srb);
736 static void free_tag(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in free_tag() argument
738 if (srb->tag_number < 255) { in free_tag()
739 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */ in free_tag()
740 srb->tag_number = 255; in free_tag()
776 struct ScsiReqBlk *srb; in waiting_process_next() local
822 srb = list_entry(waiting_list_head->next, in waiting_process_next()
826 if (!start_scsi(acb, pos, srb)) in waiting_process_next()
827 list_move(&srb->list, &pos->srb_going_list); in waiting_process_next()
857 static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in send_srb() argument
859 struct DeviceCtlBlk *dcb = srb->dcb; in send_srb()
864 list_add_tail(&srb->list, &dcb->srb_waiting_list); in send_srb()
869 if (!start_scsi(acb, dcb, srb)) { in send_srb()
870 list_add_tail(&srb->list, &dcb->srb_going_list); in send_srb()
872 list_add(&srb->list, &dcb->srb_waiting_list); in send_srb()
879 struct ScsiReqBlk *srb) in build_srb() argument
886 srb->dcb = dcb; in build_srb()
887 srb->cmd = cmd; in build_srb()
888 srb->sg_count = 0; in build_srb()
889 srb->total_xfer_length = 0; in build_srb()
890 srb->sg_bus_addr = 0; in build_srb()
891 srb->sg_index = 0; in build_srb()
892 srb->adapter_status = 0; in build_srb()
893 srb->target_status = 0; in build_srb()
894 srb->msg_count = 0; in build_srb()
895 srb->status = 0; in build_srb()
896 srb->flag = 0; in build_srb()
897 srb->state = 0; in build_srb()
898 srb->retry_count = 0; in build_srb()
899 srb->tag_number = TAG_NONE; in build_srb()
900 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in build_srb()
901 srb->end_message = 0; in build_srb()
910 srb->segment_x[0].address); in build_srb()
915 struct SGentry *sgp = srb->segment_x; in build_srb()
917 srb->sg_count = nseg; in build_srb()
922 srb->sg_count); in build_srb()
924 scsi_for_each_sg(cmd, sg, srb->sg_count, i) { in build_srb()
929 srb->total_xfer_length += seglen; in build_srb()
931 sgp += srb->sg_count - 1; in build_srb()
937 if (srb->total_xfer_length > reqlen) { in build_srb()
938 sgp->length -= (srb->total_xfer_length - reqlen); in build_srb()
939 srb->total_xfer_length = reqlen; in build_srb()
944 srb->total_xfer_length % 2) { in build_srb()
945 srb->total_xfer_length++; in build_srb()
949 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
950 srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE); in build_srb()
953 srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN); in build_srb()
956 srb->request_length = srb->total_xfer_length; in build_srb()
982 struct ScsiReqBlk *srb; in dc395x_queue_command_lck() local
1018 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
1020 if (!srb) { in dc395x_queue_command_lck()
1028 list_del(&srb->list); in dc395x_queue_command_lck()
1030 build_srb(cmd, dcb, srb); in dc395x_queue_command_lck()
1034 list_add_tail(&srb->list, &dcb->srb_waiting_list); in dc395x_queue_command_lck()
1038 send_srb(acb, srb); in dc395x_queue_command_lck()
1089 struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in dump_register_info() argument
1096 if (!srb && dcb) in dump_register_info()
1097 srb = dcb->active_srb; in dump_register_info()
1098 if (srb) { in dump_register_info()
1099 if (!srb->cmd) in dump_register_info()
1101 srb, srb->cmd); in dump_register_info()
1105 srb, srb->cmd, in dump_register_info()
1106 srb->cmd->cmnd[0], srb->cmd->device->id, in dump_register_info()
1107 (u8)srb->cmd->device->lun); in dump_register_info()
1109 srb->segment_x, srb->sg_count, srb->sg_index, in dump_register_info()
1110 srb->total_xfer_length); in dump_register_info()
1112 srb->state, srb->status, srb->scsi_phase, in dump_register_info()
1267 struct ScsiReqBlk *srb; in dc395x_eh_abort() local
1277 srb = find_cmd(cmd, &dcb->srb_waiting_list); in dc395x_eh_abort()
1278 if (srb) { in dc395x_eh_abort()
1279 list_del(&srb->list); in dc395x_eh_abort()
1280 pci_unmap_srb_sense(acb, srb); in dc395x_eh_abort()
1281 pci_unmap_srb(acb, srb); in dc395x_eh_abort()
1282 free_tag(dcb, srb); in dc395x_eh_abort()
1283 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1288 srb = find_cmd(cmd, &dcb->srb_going_list); in dc395x_eh_abort()
1289 if (srb) { in dc395x_eh_abort()
1301 struct ScsiReqBlk *srb) in build_sdtr() argument
1303 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_sdtr()
1304 if (srb->msg_count > 1) { in build_sdtr()
1307 srb->msg_count, srb->msgout_buf[0], in build_sdtr()
1308 srb->msgout_buf[1]); in build_sdtr()
1322 srb->msg_count += 5; in build_sdtr()
1323 srb->state |= SRB_DO_SYNC_NEGO; in build_sdtr()
1329 struct ScsiReqBlk *srb) in build_wdtr() argument
1333 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_wdtr()
1334 if (srb->msg_count > 1) { in build_wdtr()
1337 srb->msg_count, srb->msgout_buf[0], in build_wdtr()
1338 srb->msgout_buf[1]); in build_wdtr()
1345 srb->msg_count += 4; in build_wdtr()
1346 srb->state |= SRB_DO_WIDE_NEGO; in build_wdtr()
1375 struct ScsiReqBlk *srb;
1382 srb = acb->active_dcb->active_srb;
1390 struct ScsiReqBlk* srb) in start_scsi() argument
1396 dcb->target_id, dcb->target_lun, srb); in start_scsi()
1398 srb->tag_number = TAG_NONE; /* acb->tag_max_num: had error read in eeprom */ in start_scsi()
1424 srb->cmd, in start_scsi()
1430 dprintkdbg(DBG_KG, "start_scsi: (0x%p) Failed (busy)\n", srb->cmd); in start_scsi()
1446 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1451 if (srb->flag & AUTO_REQSENSE) in start_scsi()
1454 if (((srb->cmd->cmnd[0] == INQUIRY) in start_scsi()
1455 || (srb->cmd->cmnd[0] == REQUEST_SENSE) in start_scsi()
1456 || (srb->flag & AUTO_REQSENSE)) in start_scsi()
1462 srb->msgout_buf[0] = identify_message; in start_scsi()
1463 srb->msg_count = 1; in start_scsi()
1465 srb->state = SRB_MSGOUT; in start_scsi()
1469 build_wdtr(acb, dcb, srb); in start_scsi()
1475 build_sdtr(acb, dcb, srb); in start_scsi()
1480 build_wdtr(acb, dcb, srb); in start_scsi()
1483 srb->msg_count = 0; in start_scsi()
1489 srb->state = SRB_START_; in start_scsi()
1504 srb->cmd, srb->cmd->device->id, in start_scsi()
1505 (u8)srb->cmd->device->lun); in start_scsi()
1506 srb->state = SRB_READY; in start_scsi()
1515 srb->tag_number = tag_number; in start_scsi()
1517 srb->state = SRB_START_; in start_scsi()
1523 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in start_scsi()
1524 srb->cmd->cmnd[0], srb->tag_number); in start_scsi()
1525 if (srb->flag & AUTO_REQSENSE) { in start_scsi()
1533 ptr = (u8 *)srb->cmd->cmnd; in start_scsi()
1534 for (i = 0; i < srb->cmd->cmd_len; i++) in start_scsi()
1547 srb->cmd, dcb->target_id, dcb->target_lun); in start_scsi()
1548 srb->state = SRB_READY; in start_scsi()
1549 free_tag(dcb, srb); in start_scsi()
1550 srb->msg_count = 0; in start_scsi()
1558 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1559 dcb->active_srb = srb; in start_scsi()
1574 srb->state |= SRB_MSGOUT
1579 struct ScsiReqBlk *srb) in enable_msgout_abort() argument
1581 srb->msgout_buf[0] = ABORT; in enable_msgout_abort()
1582 srb->msg_count = 1; in enable_msgout_abort()
1584 srb->state &= ~SRB_MSGIN; in enable_msgout_abort()
1585 srb->state |= SRB_MSGOUT; in enable_msgout_abort()
1600 struct ScsiReqBlk *srb; in dc395x_handle_interrupt() local
1647 srb = dcb->active_srb; in dc395x_handle_interrupt()
1650 enable_msgout_abort(acb, srb); in dc395x_handle_interrupt()
1654 phase = (u16)srb->scsi_phase; in dc395x_handle_interrupt()
1670 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1677 srb->scsi_phase = scsi_status & PHASEMASK; in dc395x_handle_interrupt()
1693 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1739 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase0() argument
1742 dprintkdbg(DBG_0, "msgout_phase0: (0x%p)\n", srb->cmd); in msgout_phase0()
1743 if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT)) in msgout_phase0()
1747 srb->state &= ~SRB_MSGOUT; in msgout_phase0()
1751 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase1() argument
1756 dprintkdbg(DBG_0, "msgout_phase1: (0x%p)\n", srb->cmd); in msgout_phase1()
1759 if (!(srb->state & SRB_MSGOUT)) { in msgout_phase1()
1760 srb->state |= SRB_MSGOUT; in msgout_phase1()
1763 srb->cmd); /* So what ? */ in msgout_phase1()
1765 if (!srb->msg_count) { in msgout_phase1()
1767 srb->cmd); in msgout_phase1()
1773 ptr = (u8 *)srb->msgout_buf; in msgout_phase1()
1774 for (i = 0; i < srb->msg_count; i++) in msgout_phase1()
1776 srb->msg_count = 0; in msgout_phase1()
1777 if (srb->msgout_buf[0] == MSG_ABORT) in msgout_phase1()
1778 srb->state = SRB_ABORT_SENT; in msgout_phase1()
1784 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase0() argument
1787 dprintkdbg(DBG_0, "command_phase0: (0x%p)\n", srb->cmd); in command_phase0()
1792 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase1() argument
1798 dprintkdbg(DBG_0, "command_phase1: (0x%p)\n", srb->cmd); in command_phase1()
1802 if (!(srb->flag & AUTO_REQSENSE)) { in command_phase1()
1803 ptr = (u8 *)srb->cmd->cmnd; in command_phase1()
1804 for (i = 0; i < srb->cmd->cmd_len; i++) { in command_phase1()
1818 srb->state |= SRB_COMMAND; in command_phase1()
1830 static void sg_verify_length(struct ScsiReqBlk *srb) in sg_verify_length() argument
1834 unsigned idx = srb->sg_index; in sg_verify_length()
1835 struct SGentry *psge = srb->segment_x + idx; in sg_verify_length()
1836 for (; idx < srb->sg_count; psge++, idx++) in sg_verify_length()
1838 if (len != srb->total_xfer_length) in sg_verify_length()
1841 srb->total_xfer_length, len); in sg_verify_length()
1850 static void sg_update_list(struct ScsiReqBlk *srb, u32 left) in sg_update_list() argument
1853 u32 xferred = srb->total_xfer_length - left; /* bytes transferred */ in sg_update_list()
1854 struct SGentry *psge = srb->segment_x + srb->sg_index; in sg_update_list()
1858 xferred, srb->total_xfer_length, left); in sg_update_list()
1864 sg_verify_length(srb); in sg_update_list()
1865 srb->total_xfer_length = left; /* update remaining count */ in sg_update_list()
1866 for (idx = srb->sg_index; idx < srb->sg_count; idx++) { in sg_update_list()
1872 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1873 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1877 srb->sg_index = idx; in sg_update_list()
1878 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1879 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1885 sg_verify_length(srb); in sg_update_list()
1895 static void sg_subtract_one(struct ScsiReqBlk *srb) in sg_subtract_one() argument
1897 sg_update_list(srb, srb->total_xfer_length - 1); in sg_subtract_one()
1910 struct ScsiReqBlk *srb) in cleanup_after_transfer() argument
1935 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase0() argument
1938 struct DeviceCtlBlk *dcb = srb->dcb; in data_out_phase0()
1942 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase0()
1963 srb->total_xfer_length); in data_out_phase0()
1966 if (!(srb->state & SRB_XFERPAD)) { in data_out_phase0()
1968 srb->status |= PARITY_ERROR; in data_out_phase0()
2007 if (srb->total_xfer_length > DC395x_LASTPIO) in data_out_phase0()
2015 && scsi_bufflen(srb->cmd) % 2) { in data_out_phase0()
2032 srb->total_xfer_length = 0; in data_out_phase0()
2040 srb->total_xfer_length - d_left_counter; in data_out_phase0()
2043 sg_update_list(srb, d_left_counter); in data_out_phase0()
2045 if ((srb->segment_x[srb->sg_index].length == in data_out_phase0()
2046 diff && scsi_sg_count(srb->cmd)) in data_out_phase0()
2053 srb->total_xfer_length - diff; in data_out_phase0()
2054 sg_update_list(srb, d_left_counter); in data_out_phase0()
2063 cleanup_after_transfer(acb, srb); in data_out_phase0()
2068 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase1() argument
2072 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase1()
2075 data_io_transfer(acb, srb, XFERDATAOUT); in data_out_phase1()
2078 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase0() argument
2084 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase0()
2099 if (!(srb->state & SRB_XFERPAD)) { in data_in_phase0()
2105 "Parity Error\n", srb->cmd); in data_in_phase0()
2106 srb->status |= PARITY_ERROR; in data_in_phase0()
2142 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : in data_in_phase0()
2149 (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_in_phase0()
2154 srb->total_xfer_length, d_left_counter); in data_in_phase0()
2158 && srb->total_xfer_length <= DC395x_LASTPIO) { in data_in_phase0()
2159 size_t left_io = srb->total_xfer_length; in data_in_phase0()
2166 (srb->dcb->sync_period & WIDE_SYNC) ? in data_in_phase0()
2168 srb->total_xfer_length); in data_in_phase0()
2169 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2176 size_t offset = srb->request_length - left_io; in data_in_phase0()
2181 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_in_phase0()
2182 srb->sg_count, &offset, &len); in data_in_phase0()
2196 sg_subtract_one(srb); in data_in_phase0()
2210 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { in data_in_phase0()
2212 if (srb->total_xfer_length > 0) { in data_in_phase0()
2216 srb->total_xfer_length--; in data_in_phase0()
2247 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2269 srb->total_xfer_length = 0; in data_in_phase0()
2271 srb->total_xfer_length = d_left_counter; in data_in_phase0()
2281 sg_update_list(srb, d_left_counter); in data_in_phase0()
2286 cleanup_after_transfer(acb, srb); in data_in_phase0()
2291 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase1() argument
2295 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase1()
2296 data_io_transfer(acb, srb, XFERDATAIN); in data_in_phase1()
2301 struct ScsiReqBlk *srb, u16 io_dir) in data_io_transfer() argument
2303 struct DeviceCtlBlk *dcb = srb->dcb; in data_io_transfer()
2307 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in data_io_transfer()
2309 srb->total_xfer_length, srb->sg_index, srb->sg_count); in data_io_transfer()
2310 if (srb == acb->tmp_srb) in data_io_transfer()
2312 if (srb->sg_index >= srb->sg_count) { in data_io_transfer()
2317 if (srb->total_xfer_length > DC395x_LASTPIO) { in data_io_transfer()
2326 dump_register_info(acb, dcb, srb); in data_io_transfer()
2334 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2336 if (scsi_sg_count(srb->cmd)) { /* with S/G */ in data_io_transfer()
2339 srb->sg_bus_addr + in data_io_transfer()
2341 srb->sg_index); in data_io_transfer()
2344 ((u32)(srb->sg_count - in data_io_transfer()
2345 srb->sg_index) << 3)); in data_io_transfer()
2349 srb->segment_x[0].address); in data_io_transfer()
2351 srb->segment_x[0].length); in data_io_transfer()
2355 srb->total_xfer_length); in data_io_transfer()
2369 else if (srb->total_xfer_length > 0) { /* The last four bytes: Do PIO */ in data_io_transfer()
2374 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2377 srb->total_xfer_length); in data_io_transfer()
2383 int ln = srb->total_xfer_length; in data_io_transfer()
2384 size_t left_io = srb->total_xfer_length; in data_io_transfer()
2386 if (srb->dcb->sync_period & WIDE_SYNC) in data_io_transfer()
2394 size_t offset = srb->request_length - left_io; in data_io_transfer()
2398 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_io_transfer()
2399 srb->sg_count, &offset, &len); in data_io_transfer()
2410 sg_subtract_one(srb); in data_io_transfer()
2416 if (srb->dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2434 if (srb->sg_count) { in data_io_transfer()
2435 srb->adapter_status = H_OVER_UNDER_RUN; in data_io_transfer()
2436 srb->status |= OVER_RUN; in data_io_transfer()
2467 srb->state |= SRB_XFERPAD; in data_io_transfer()
2476 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase0() argument
2480 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase0()
2481 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2482 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2483 srb->state = SRB_COMPLETED; in status_phase0()
2490 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase1() argument
2494 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase1()
2495 srb->state = SRB_STATUS; in status_phase1()
2517 struct ScsiReqBlk *srb) in msgin_reject() argument
2519 srb->msgout_buf[0] = MESSAGE_REJECT; in msgin_reject()
2520 srb->msg_count = 1; in msgin_reject()
2522 srb->state &= ~SRB_MSGIN; in msgin_reject()
2523 srb->state |= SRB_MSGOUT; in msgin_reject()
2525 srb->msgin_buf[0], in msgin_reject()
2526 srb->dcb->target_id, srb->dcb->target_lun); in msgin_reject()
2533 struct ScsiReqBlk *srb = NULL; in msgin_qtag() local
2536 srb->cmd, tag, srb); in msgin_qtag()
2547 srb = i; in msgin_qtag()
2551 if (!srb) in msgin_qtag()
2555 srb->cmd, srb->dcb->target_id, srb->dcb->target_lun); in msgin_qtag()
2558 enable_msgout_abort(acb, srb); in msgin_qtag()
2561 if (!(srb->state & SRB_DISCONNECT)) in msgin_qtag()
2564 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2565 srb->state |= dcb->active_srb->state; in msgin_qtag()
2566 srb->state |= SRB_DATA_XFER; in msgin_qtag()
2567 dcb->active_srb = srb; in msgin_qtag()
2569 return srb; in msgin_qtag()
2572 srb = acb->tmp_srb; in msgin_qtag()
2573 srb->state = SRB_UNEXPECT_RESEL; in msgin_qtag()
2574 dcb->active_srb = srb; in msgin_qtag()
2575 srb->msgout_buf[0] = MSG_ABORT_TAG; in msgin_qtag()
2576 srb->msg_count = 1; in msgin_qtag()
2579 return srb; in msgin_qtag()
2594 static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_async() argument
2596 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_async()
2605 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_async()
2609 build_wdtr(acb, dcb, srb); in msgin_set_async()
2617 static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_sync() argument
2619 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_sync()
2624 dcb->target_id, srb->msgin_buf[3] << 2, in msgin_set_sync()
2625 (250 / srb->msgin_buf[3]), in msgin_set_sync()
2626 ((250 % srb->msgin_buf[3]) * 10) / srb->msgin_buf[3], in msgin_set_sync()
2627 srb->msgin_buf[4]); in msgin_set_sync()
2629 if (srb->msgin_buf[4] > 15) in msgin_set_sync()
2630 srb->msgin_buf[4] = 15; in msgin_set_sync()
2634 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2635 if (srb->msgin_buf[4] > dcb->sync_offset) in msgin_set_sync()
2636 srb->msgin_buf[4] = dcb->sync_offset; in msgin_set_sync()
2638 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2640 while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval] in msgin_set_sync()
2644 if (srb->msgin_buf[3] < clock_period[bval]) in msgin_set_sync()
2648 srb->msgin_buf[3] = clock_period[bval]; in msgin_set_sync()
2651 dcb->min_nego_period = srb->msgin_buf[3]; in msgin_set_sync()
2666 if (!(srb->state & SRB_DO_SYNC_NEGO)) { in msgin_set_sync()
2669 srb->msgin_buf[3] << 2, srb->msgin_buf[4]); in msgin_set_sync()
2671 memcpy(srb->msgout_buf, srb->msgin_buf, 5); in msgin_set_sync()
2672 srb->msg_count = 5; in msgin_set_sync()
2678 build_wdtr(acb, dcb, srb); in msgin_set_sync()
2683 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_sync()
2691 struct ScsiReqBlk *srb) in msgin_set_nowide() argument
2693 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_nowide()
2699 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_nowide()
2703 build_sdtr(acb, dcb, srb); in msgin_set_nowide()
2709 static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_wide() argument
2711 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_wide()
2716 if (srb->msgin_buf[3] > wide) in msgin_set_wide()
2717 srb->msgin_buf[3] = wide; in msgin_set_wide()
2719 if (!(srb->state & SRB_DO_WIDE_NEGO)) { in msgin_set_wide()
2723 memcpy(srb->msgout_buf, srb->msgin_buf, 4); in msgin_set_wide()
2724 srb->msg_count = 4; in msgin_set_wide()
2725 srb->state |= SRB_DO_WIDE_NEGO; in msgin_set_wide()
2730 if (srb->msgin_buf[3] > 0) in msgin_set_wide()
2734 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_wide()
2738 (8 << srb->msgin_buf[3]), dcb->target_id); in msgin_set_wide()
2742 build_sdtr(acb, dcb, srb); in msgin_set_wide()
2761 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase0() argument
2765 dprintkdbg(DBG_0, "msgin_phase0: (0x%p)\n", srb->cmd); in msgin_phase0()
2767 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2768 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2770 switch (srb->msgin_buf[0]) { in msgin_phase0()
2772 srb->state = SRB_DISCONNECT; in msgin_phase0()
2778 srb = in msgin_phase0()
2780 srb->msgin_buf[1]); in msgin_phase0()
2787 if (srb->state & SRB_DO_SYNC_NEGO) { in msgin_phase0()
2788 msgin_set_async(acb, srb); in msgin_phase0()
2792 if (srb->state & SRB_DO_WIDE_NEGO) { in msgin_phase0()
2793 msgin_set_nowide(acb, srb); in msgin_phase0()
2796 enable_msgout_abort(acb, srb); in msgin_phase0()
2802 if (srb->msgin_buf[1] == 3 in msgin_phase0()
2803 && srb->msgin_buf[2] == EXTENDED_SDTR) { in msgin_phase0()
2804 msgin_set_sync(acb, srb); in msgin_phase0()
2808 if (srb->msgin_buf[1] == 2 in msgin_phase0()
2809 && srb->msgin_buf[2] == EXTENDED_WDTR in msgin_phase0()
2810 && srb->msgin_buf[3] <= 2) { /* sanity check ... */ in msgin_phase0()
2811 msgin_set_wide(acb, srb); in msgin_phase0()
2814 msgin_reject(acb, srb); in msgin_phase0()
2833 srb->cmd, srb->total_xfer_length); in msgin_phase0()
2843 srb->cmd, dcb->target_id, in msgin_phase0()
2846 enable_msgout_abort(acb, srb); in msgin_phase0()
2851 if (srb->msgin_buf[0] & IDENTIFY_BASE) { in msgin_phase0()
2853 srb->msg_count = 1; in msgin_phase0()
2854 srb->msgout_buf[0] = dcb->identify_msg; in msgin_phase0()
2856 srb->state |= SRB_MSGOUT; in msgin_phase0()
2859 msgin_reject(acb, srb); in msgin_phase0()
2863 srb->state &= ~SRB_MSGIN; in msgin_phase0()
2872 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase1() argument
2875 dprintkdbg(DBG_0, "msgin_phase1: (0x%p)\n", srb->cmd); in msgin_phase1()
2878 if (!(srb->state & SRB_MSGIN)) { in msgin_phase1()
2879 srb->state &= ~SRB_DISCONNECT; in msgin_phase1()
2880 srb->state |= SRB_MSGIN; in msgin_phase1()
2888 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop0() argument
2894 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop1() argument
2926 struct ScsiReqBlk *srb; in disconnect() local
2939 srb = dcb->active_srb; in disconnect()
2941 dprintkdbg(DBG_0, "disconnect: (0x%p)\n", srb->cmd); in disconnect()
2943 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in disconnect()
2946 if (srb->state & SRB_UNEXPECT_RESEL) { in disconnect()
2950 srb->state = 0; in disconnect()
2952 } else if (srb->state & SRB_ABORT_SENT) { in disconnect()
2956 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2959 if ((srb->state & (SRB_START_ + SRB_MSGOUT)) in disconnect()
2960 || !(srb-> in disconnect()
2967 if (srb->state != SRB_START_ in disconnect()
2968 && srb->state != SRB_MSGOUT) { in disconnect()
2969 srb->state = SRB_READY; in disconnect()
2972 srb->cmd); in disconnect()
2973 srb->target_status = SCSI_STAT_SEL_TIMEOUT; in disconnect()
2978 "<%02i-%i> SelTO\n", srb->cmd, in disconnect()
2980 if (srb->retry_count++ > DC395x_MAX_RETRIES in disconnect()
2982 srb->target_status = in disconnect()
2986 free_tag(dcb, srb); in disconnect()
2987 list_move(&srb->list, &dcb->srb_waiting_list); in disconnect()
2990 srb->cmd); in disconnect()
2993 } else if (srb->state & SRB_DISCONNECT) { in disconnect()
3005 } else if (srb->state & SRB_COMPLETED) { in disconnect()
3010 free_tag(dcb, srb); in disconnect()
3012 srb->state = SRB_FREE; in disconnect()
3013 srb_done(acb, dcb, srb); in disconnect()
3022 struct ScsiReqBlk *srb = NULL; in reselect() local
3033 srb = dcb->active_srb; in reselect()
3034 if (!srb) { in reselect()
3044 srb->cmd, dcb->target_id, in reselect()
3050 srb->state = SRB_READY; in reselect()
3051 free_tag(dcb, srb); in reselect()
3052 list_move(&srb->list, &dcb->srb_waiting_list); in reselect()
3079 srb = acb->tmp_srb; in reselect()
3080 dcb->active_srb = srb; in reselect()
3083 srb = dcb->active_srb; in reselect()
3084 if (!srb || !(srb->state & SRB_DISCONNECT)) { in reselect()
3091 srb = acb->tmp_srb; in reselect()
3092 srb->state = SRB_UNEXPECT_RESEL; in reselect()
3093 dcb->active_srb = srb; in reselect()
3094 enable_msgout_abort(acb, srb); in reselect()
3098 enable_msgout_abort(acb, srb); in reselect()
3100 srb->state = SRB_DATA_XFER; in reselect()
3104 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in reselect()
3166 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in pci_unmap_srb() argument
3168 struct scsi_cmnd *cmd = srb->cmd; in pci_unmap_srb()
3174 srb->sg_bus_addr, SEGMENTX_LEN); in pci_unmap_srb()
3175 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
3187 struct ScsiReqBlk *srb) in pci_unmap_srb_sense() argument
3189 if (!(srb->flag & AUTO_REQSENSE)) in pci_unmap_srb_sense()
3193 srb->segment_x[0].address); in pci_unmap_srb_sense()
3194 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3195 srb->segment_x[0].length, DMA_FROM_DEVICE); in pci_unmap_srb_sense()
3197 srb->total_xfer_length = srb->xferred; in pci_unmap_srb_sense()
3198 srb->segment_x[0].address = in pci_unmap_srb_sense()
3199 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address; in pci_unmap_srb_sense()
3200 srb->segment_x[0].length = in pci_unmap_srb_sense()
3201 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length; in pci_unmap_srb_sense()
3210 struct ScsiReqBlk *srb) in srb_done() argument
3213 struct scsi_cmnd *cmd = srb->cmd; in srb_done()
3217 dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd, in srb_done()
3218 srb->cmd->device->id, (u8)srb->cmd->device->lun); in srb_done()
3220 srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count, in srb_done()
3222 status = srb->target_status; in srb_done()
3223 if (srb->flag & AUTO_REQSENSE) { in srb_done()
3225 pci_unmap_srb_sense(acb, srb); in srb_done()
3229 srb->flag &= ~AUTO_REQSENSE; in srb_done()
3230 srb->adapter_status = 0; in srb_done()
3231 srb->target_status = CHECK_CONDITION << 1; in srb_done()
3284 if (srb->total_xfer_length in srb_done()
3285 && srb->total_xfer_length >= cmd->underflow) in srb_done()
3288 srb->end_message, CHECK_CONDITION); in srb_done()
3293 srb->end_message, CHECK_CONDITION); in srb_done()
3304 request_sense(acb, dcb, srb); in srb_done()
3313 free_tag(dcb, srb); in srb_done()
3314 list_move(&srb->list, &dcb->srb_waiting_list); in srb_done()
3316 srb->adapter_status = 0; in srb_done()
3317 srb->target_status = 0; in srb_done()
3320 srb->adapter_status = H_SEL_TIMEOUT; in srb_done()
3321 srb->target_status = 0; in srb_done()
3324 srb->adapter_status = 0; in srb_done()
3326 SET_RES_MSG(cmd->result, srb->end_message); in srb_done()
3334 status = srb->adapter_status; in srb_done()
3336 srb->target_status = 0; in srb_done()
3338 SET_RES_MSG(cmd->result, srb->end_message); in srb_done()
3339 } else if (srb->status & PARITY_ERROR) { in srb_done()
3341 SET_RES_MSG(cmd->result, srb->end_message); in srb_done()
3344 srb->adapter_status = 0; in srb_done()
3345 srb->target_status = 0; in srb_done()
3354 pci_unmap_srb(acb, srb); in srb_done()
3387 scsi_set_resid(cmd, srb->total_xfer_length); in srb_done()
3389 cmd->SCp.this_residual = srb->total_xfer_length; in srb_done()
3392 if (srb->total_xfer_length) in srb_done()
3396 cmd->cmnd[0], srb->total_xfer_length); in srb_done()
3399 if (srb != acb->tmp_srb) { in srb_done()
3403 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
3421 struct ScsiReqBlk *srb; in doing_srb_done() local
3425 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) { in doing_srb_done()
3429 p = srb->cmd; in doing_srb_done()
3434 list_del(&srb->list); in doing_srb_done()
3435 free_tag(dcb, srb); in doing_srb_done()
3436 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3438 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3439 pci_unmap_srb(acb, srb); in doing_srb_done()
3457 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) { in doing_srb_done()
3459 p = srb->cmd; in doing_srb_done()
3464 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3466 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3467 pci_unmap_srb(acb, srb); in doing_srb_done()
3567 struct ScsiReqBlk *srb) in request_sense() argument
3569 struct scsi_cmnd *cmd = srb->cmd; in request_sense()
3573 srb->flag |= AUTO_REQSENSE; in request_sense()
3574 srb->adapter_status = 0; in request_sense()
3575 srb->target_status = 0; in request_sense()
3581 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address = in request_sense()
3582 srb->segment_x[0].address; in request_sense()
3583 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length = in request_sense()
3584 srb->segment_x[0].length; in request_sense()
3585 srb->xferred = srb->total_xfer_length; in request_sense()
3587 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3588 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3590 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
3594 cmd->sense_buffer, srb->segment_x[0].address, in request_sense()
3596 srb->sg_count = 1; in request_sense()
3597 srb->sg_index = 0; in request_sense()
3599 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */ in request_sense()
3602 srb->cmd, dcb->target_id, dcb->target_lun); in request_sense()
3603 list_move(&srb->list, &dcb->srb_waiting_list); in request_sense()
4182 acb->srb.segment_x = in adapter_sg_tables_alloc()
4259 acb->tmp_srb = &acb->srb; in adapter_init_params()
4589 struct ScsiReqBlk *srb; in dc395x_show_info() local
4594 list_for_each_entry(srb, &dcb->srb_waiting_list, list) in dc395x_show_info()
4595 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
4600 list_for_each_entry(srb, &dcb->srb_going_list, list) in dc395x_show_info()
4601 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()