Lines Matching refs:srb
319 struct ScsiReqBlk srb; member
328 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
330 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
332 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
334 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
336 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
338 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
340 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
342 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
344 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
346 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
348 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
350 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
352 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
354 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
358 struct ScsiReqBlk *srb);
361 struct ScsiReqBlk *srb, u16 io_dir);
365 struct ScsiReqBlk *srb);
367 struct ScsiReqBlk *srb);
369 struct ScsiReqBlk *srb);
373 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb);
375 struct ScsiReqBlk *srb);
377 struct ScsiReqBlk *srb);
379 struct ScsiReqBlk *srb);
720 static void free_tag(struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in free_tag() argument
722 if (srb->tag_number < 255) { in free_tag()
723 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */ in free_tag()
724 srb->tag_number = 255; in free_tag()
760 struct ScsiReqBlk *srb; in waiting_process_next() local
806 srb = list_entry(waiting_list_head->next, in waiting_process_next()
810 if (!start_scsi(acb, pos, srb)) in waiting_process_next()
811 list_move(&srb->list, &pos->srb_going_list); in waiting_process_next()
841 static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in send_srb() argument
843 struct DeviceCtlBlk *dcb = srb->dcb; in send_srb()
848 list_add_tail(&srb->list, &dcb->srb_waiting_list); in send_srb()
853 if (!start_scsi(acb, dcb, srb)) { in send_srb()
854 list_add_tail(&srb->list, &dcb->srb_going_list); in send_srb()
856 list_add(&srb->list, &dcb->srb_waiting_list); in send_srb()
863 struct ScsiReqBlk *srb) in build_srb() argument
870 srb->dcb = dcb; in build_srb()
871 srb->cmd = cmd; in build_srb()
872 srb->sg_count = 0; in build_srb()
873 srb->total_xfer_length = 0; in build_srb()
874 srb->sg_bus_addr = 0; in build_srb()
875 srb->sg_index = 0; in build_srb()
876 srb->adapter_status = 0; in build_srb()
877 srb->target_status = 0; in build_srb()
878 srb->msg_count = 0; in build_srb()
879 srb->status = 0; in build_srb()
880 srb->flag = 0; in build_srb()
881 srb->state = 0; in build_srb()
882 srb->retry_count = 0; in build_srb()
883 srb->tag_number = TAG_NONE; in build_srb()
884 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in build_srb()
885 srb->end_message = 0; in build_srb()
894 srb->segment_x[0].address); in build_srb()
899 struct SGentry *sgp = srb->segment_x; in build_srb()
901 srb->sg_count = nseg; in build_srb()
906 srb->sg_count); in build_srb()
908 scsi_for_each_sg(cmd, sg, srb->sg_count, i) { in build_srb()
913 srb->total_xfer_length += seglen; in build_srb()
915 sgp += srb->sg_count - 1; in build_srb()
921 if (srb->total_xfer_length > reqlen) { in build_srb()
922 sgp->length -= (srb->total_xfer_length - reqlen); in build_srb()
923 srb->total_xfer_length = reqlen; in build_srb()
928 srb->total_xfer_length % 2) { in build_srb()
929 srb->total_xfer_length++; in build_srb()
933 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev, in build_srb()
934 srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE); in build_srb()
937 srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN); in build_srb()
940 srb->request_length = srb->total_xfer_length; in build_srb()
966 struct ScsiReqBlk *srb; in dc395x_queue_command_lck() local
1003 srb = list_first_entry_or_null(&acb->srb_free_list, in dc395x_queue_command_lck()
1005 if (!srb) { in dc395x_queue_command_lck()
1013 list_del(&srb->list); in dc395x_queue_command_lck()
1015 build_srb(cmd, dcb, srb); in dc395x_queue_command_lck()
1019 list_add_tail(&srb->list, &dcb->srb_waiting_list); in dc395x_queue_command_lck()
1023 send_srb(acb, srb); in dc395x_queue_command_lck()
1042 struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb) in DEF_SCSI_QCMD()
1049 if (!srb && dcb) in DEF_SCSI_QCMD()
1050 srb = dcb->active_srb; in DEF_SCSI_QCMD()
1051 if (srb) { in DEF_SCSI_QCMD()
1052 if (!srb->cmd) in DEF_SCSI_QCMD()
1054 srb, srb->cmd); in DEF_SCSI_QCMD()
1058 srb, srb->cmd, in DEF_SCSI_QCMD()
1059 srb->cmd->cmnd[0], srb->cmd->device->id, in DEF_SCSI_QCMD()
1060 (u8)srb->cmd->device->lun); in DEF_SCSI_QCMD()
1062 srb->segment_x, srb->sg_count, srb->sg_index, in DEF_SCSI_QCMD()
1063 srb->total_xfer_length); in DEF_SCSI_QCMD()
1065 srb->state, srb->status, srb->scsi_phase, in DEF_SCSI_QCMD()
1220 struct ScsiReqBlk *srb; in dc395x_eh_abort() local
1230 srb = find_cmd(cmd, &dcb->srb_waiting_list); in dc395x_eh_abort()
1231 if (srb) { in dc395x_eh_abort()
1232 list_del(&srb->list); in dc395x_eh_abort()
1233 pci_unmap_srb_sense(acb, srb); in dc395x_eh_abort()
1234 pci_unmap_srb(acb, srb); in dc395x_eh_abort()
1235 free_tag(dcb, srb); in dc395x_eh_abort()
1236 list_add_tail(&srb->list, &acb->srb_free_list); in dc395x_eh_abort()
1241 srb = find_cmd(cmd, &dcb->srb_going_list); in dc395x_eh_abort()
1242 if (srb) { in dc395x_eh_abort()
1254 struct ScsiReqBlk *srb) in build_sdtr() argument
1256 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_sdtr()
1257 if (srb->msg_count > 1) { in build_sdtr()
1260 srb->msg_count, srb->msgout_buf[0], in build_sdtr()
1261 srb->msgout_buf[1]); in build_sdtr()
1270 srb->msg_count += spi_populate_sync_msg(ptr, dcb->min_nego_period, in build_sdtr()
1272 srb->state |= SRB_DO_SYNC_NEGO; in build_sdtr()
1278 struct ScsiReqBlk *srb) in build_wdtr() argument
1282 u8 *ptr = srb->msgout_buf + srb->msg_count; in build_wdtr()
1283 if (srb->msg_count > 1) { in build_wdtr()
1286 srb->msg_count, srb->msgout_buf[0], in build_wdtr()
1287 srb->msgout_buf[1]); in build_wdtr()
1290 srb->msg_count += spi_populate_width_msg(ptr, wide); in build_wdtr()
1291 srb->state |= SRB_DO_WIDE_NEGO; in build_wdtr()
1320 struct ScsiReqBlk *srb;
1327 srb = acb->active_dcb->active_srb;
1335 struct ScsiReqBlk* srb) in start_scsi() argument
1341 dcb->target_id, dcb->target_lun, srb); in start_scsi()
1343 srb->tag_number = TAG_NONE; /* acb->tag_max_num: had error read in eeprom */ in start_scsi()
1369 srb->cmd, in start_scsi()
1375 dprintkdbg(DBG_KG, "start_scsi: (0x%p) Failed (busy)\n", srb->cmd); in start_scsi()
1391 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1396 if (srb->flag & AUTO_REQSENSE) in start_scsi()
1399 if (((srb->cmd->cmnd[0] == INQUIRY) in start_scsi()
1400 || (srb->cmd->cmnd[0] == REQUEST_SENSE) in start_scsi()
1401 || (srb->flag & AUTO_REQSENSE)) in start_scsi()
1407 srb->msgout_buf[0] = identify_message; in start_scsi()
1408 srb->msg_count = 1; in start_scsi()
1410 srb->state = SRB_MSGOUT; in start_scsi()
1414 build_wdtr(acb, dcb, srb); in start_scsi()
1420 build_sdtr(acb, dcb, srb); in start_scsi()
1425 build_wdtr(acb, dcb, srb); in start_scsi()
1428 srb->msg_count = 0; in start_scsi()
1434 srb->state = SRB_START_; in start_scsi()
1449 srb->cmd, srb->cmd->device->id, in start_scsi()
1450 (u8)srb->cmd->device->lun); in start_scsi()
1451 srb->state = SRB_READY; in start_scsi()
1460 srb->tag_number = tag_number; in start_scsi()
1462 srb->state = SRB_START_; in start_scsi()
1468 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in start_scsi()
1469 srb->cmd->cmnd[0], srb->tag_number); in start_scsi()
1470 if (srb->flag & AUTO_REQSENSE) { in start_scsi()
1478 ptr = (u8 *)srb->cmd->cmnd; in start_scsi()
1479 for (i = 0; i < srb->cmd->cmd_len; i++) in start_scsi()
1492 srb->cmd, dcb->target_id, dcb->target_lun); in start_scsi()
1493 srb->state = SRB_READY; in start_scsi()
1494 free_tag(dcb, srb); in start_scsi()
1495 srb->msg_count = 0; in start_scsi()
1503 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in start_scsi()
1504 dcb->active_srb = srb; in start_scsi()
1519 srb->state |= SRB_MSGOUT
1524 struct ScsiReqBlk *srb) in enable_msgout_abort() argument
1526 srb->msgout_buf[0] = ABORT; in enable_msgout_abort()
1527 srb->msg_count = 1; in enable_msgout_abort()
1529 srb->state &= ~SRB_MSGIN; in enable_msgout_abort()
1530 srb->state |= SRB_MSGOUT; in enable_msgout_abort()
1545 struct ScsiReqBlk *srb; in dc395x_handle_interrupt() local
1592 srb = dcb->active_srb; in dc395x_handle_interrupt()
1595 enable_msgout_abort(acb, srb); in dc395x_handle_interrupt()
1599 phase = (u16)srb->scsi_phase; in dc395x_handle_interrupt()
1615 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1622 srb->scsi_phase = scsi_status & PHASEMASK; in dc395x_handle_interrupt()
1638 dc395x_statev(acb, srb, &scsi_status); in dc395x_handle_interrupt()
1684 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase0() argument
1687 dprintkdbg(DBG_0, "msgout_phase0: (0x%p)\n", srb->cmd); in msgout_phase0()
1688 if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT)) in msgout_phase0()
1692 srb->state &= ~SRB_MSGOUT; in msgout_phase0()
1696 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgout_phase1() argument
1701 dprintkdbg(DBG_0, "msgout_phase1: (0x%p)\n", srb->cmd); in msgout_phase1()
1704 if (!(srb->state & SRB_MSGOUT)) { in msgout_phase1()
1705 srb->state |= SRB_MSGOUT; in msgout_phase1()
1708 srb->cmd); /* So what ? */ in msgout_phase1()
1710 if (!srb->msg_count) { in msgout_phase1()
1712 srb->cmd); in msgout_phase1()
1719 ptr = (u8 *)srb->msgout_buf; in msgout_phase1()
1720 for (i = 0; i < srb->msg_count; i++) in msgout_phase1()
1722 srb->msg_count = 0; in msgout_phase1()
1723 if (srb->msgout_buf[0] == ABORT_TASK_SET) in msgout_phase1()
1724 srb->state = SRB_ABORT_SENT; in msgout_phase1()
1730 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase0() argument
1733 dprintkdbg(DBG_0, "command_phase0: (0x%p)\n", srb->cmd); in command_phase0()
1738 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in command_phase1() argument
1744 dprintkdbg(DBG_0, "command_phase1: (0x%p)\n", srb->cmd); in command_phase1()
1748 if (!(srb->flag & AUTO_REQSENSE)) { in command_phase1()
1749 ptr = (u8 *)srb->cmd->cmnd; in command_phase1()
1750 for (i = 0; i < srb->cmd->cmd_len; i++) { in command_phase1()
1764 srb->state |= SRB_COMMAND; in command_phase1()
1776 static void sg_verify_length(struct ScsiReqBlk *srb) in sg_verify_length() argument
1780 unsigned idx = srb->sg_index; in sg_verify_length()
1781 struct SGentry *psge = srb->segment_x + idx; in sg_verify_length()
1782 for (; idx < srb->sg_count; psge++, idx++) in sg_verify_length()
1784 if (len != srb->total_xfer_length) in sg_verify_length()
1787 srb->total_xfer_length, len); in sg_verify_length()
1796 static void sg_update_list(struct ScsiReqBlk *srb, u32 left) in sg_update_list() argument
1799 u32 xferred = srb->total_xfer_length - left; /* bytes transferred */ in sg_update_list()
1800 struct SGentry *psge = srb->segment_x + srb->sg_index; in sg_update_list()
1804 xferred, srb->total_xfer_length, left); in sg_update_list()
1810 sg_verify_length(srb); in sg_update_list()
1811 srb->total_xfer_length = left; /* update remaining count */ in sg_update_list()
1812 for (idx = srb->sg_index; idx < srb->sg_count; idx++) { in sg_update_list()
1818 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev, in sg_update_list()
1819 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1823 srb->sg_index = idx; in sg_update_list()
1824 dma_sync_single_for_device(&srb->dcb->acb->dev->dev, in sg_update_list()
1825 srb->sg_bus_addr, SEGMENTX_LEN, in sg_update_list()
1831 sg_verify_length(srb); in sg_update_list()
1841 static void sg_subtract_one(struct ScsiReqBlk *srb) in sg_subtract_one() argument
1843 sg_update_list(srb, srb->total_xfer_length - 1); in sg_subtract_one()
1856 struct ScsiReqBlk *srb) in cleanup_after_transfer() argument
1881 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase0() argument
1884 struct DeviceCtlBlk *dcb = srb->dcb; in data_out_phase0()
1888 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase0()
1909 srb->total_xfer_length); in data_out_phase0()
1912 if (!(srb->state & SRB_XFERPAD)) { in data_out_phase0()
1914 srb->status |= PARITY_ERROR; in data_out_phase0()
1953 if (srb->total_xfer_length > DC395x_LASTPIO) in data_out_phase0()
1961 && scsi_bufflen(srb->cmd) % 2) { in data_out_phase0()
1978 srb->total_xfer_length = 0; in data_out_phase0()
1986 srb->total_xfer_length - d_left_counter; in data_out_phase0()
1989 sg_update_list(srb, d_left_counter); in data_out_phase0()
1991 if ((srb->segment_x[srb->sg_index].length == in data_out_phase0()
1992 diff && scsi_sg_count(srb->cmd)) in data_out_phase0()
1999 srb->total_xfer_length - diff; in data_out_phase0()
2000 sg_update_list(srb, d_left_counter); in data_out_phase0()
2009 cleanup_after_transfer(acb, srb); in data_out_phase0()
2014 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_out_phase1() argument
2018 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_out_phase1()
2021 data_io_transfer(acb, srb, XFERDATAOUT); in data_out_phase1()
2024 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase0() argument
2030 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase0()
2045 if (!(srb->state & SRB_XFERPAD)) { in data_in_phase0()
2051 "Parity Error\n", srb->cmd); in data_in_phase0()
2052 srb->status |= PARITY_ERROR; in data_in_phase0()
2088 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 : in data_in_phase0()
2095 (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes", in data_in_phase0()
2100 srb->total_xfer_length, d_left_counter); in data_in_phase0()
2104 && srb->total_xfer_length <= DC395x_LASTPIO) { in data_in_phase0()
2105 size_t left_io = srb->total_xfer_length; in data_in_phase0()
2112 (srb->dcb->sync_period & WIDE_SYNC) ? in data_in_phase0()
2114 srb->total_xfer_length); in data_in_phase0()
2115 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2122 size_t offset = srb->request_length - left_io; in data_in_phase0()
2127 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_in_phase0()
2128 srb->sg_count, &offset, &len); in data_in_phase0()
2142 sg_subtract_one(srb); in data_in_phase0()
2156 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) { in data_in_phase0()
2158 if (srb->total_xfer_length > 0) { in data_in_phase0()
2162 srb->total_xfer_length--; in data_in_phase0()
2193 if (srb->dcb->sync_period & WIDE_SYNC) in data_in_phase0()
2215 srb->total_xfer_length = 0; in data_in_phase0()
2217 srb->total_xfer_length = d_left_counter; in data_in_phase0()
2227 sg_update_list(srb, d_left_counter); in data_in_phase0()
2232 cleanup_after_transfer(acb, srb); in data_in_phase0()
2237 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in data_in_phase1() argument
2241 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in data_in_phase1()
2242 data_io_transfer(acb, srb, XFERDATAIN); in data_in_phase1()
2247 struct ScsiReqBlk *srb, u16 io_dir) in data_io_transfer() argument
2249 struct DeviceCtlBlk *dcb = srb->dcb; in data_io_transfer()
2253 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun, in data_io_transfer()
2255 srb->total_xfer_length, srb->sg_index, srb->sg_count); in data_io_transfer()
2256 if (srb == acb->tmp_srb) in data_io_transfer()
2258 if (srb->sg_index >= srb->sg_count) { in data_io_transfer()
2263 if (srb->total_xfer_length > DC395x_LASTPIO) { in data_io_transfer()
2272 dump_register_info(acb, dcb, srb); in data_io_transfer()
2280 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2282 if (scsi_sg_count(srb->cmd)) { /* with S/G */ in data_io_transfer()
2285 srb->sg_bus_addr + in data_io_transfer()
2287 srb->sg_index); in data_io_transfer()
2290 ((u32)(srb->sg_count - in data_io_transfer()
2291 srb->sg_index) << 3)); in data_io_transfer()
2295 srb->segment_x[0].address); in data_io_transfer()
2297 srb->segment_x[0].length); in data_io_transfer()
2301 srb->total_xfer_length); in data_io_transfer()
2315 else if (srb->total_xfer_length > 0) { /* The last four bytes: Do PIO */ in data_io_transfer()
2320 srb->state |= SRB_DATA_XFER; in data_io_transfer()
2323 srb->total_xfer_length); in data_io_transfer()
2329 int ln = srb->total_xfer_length; in data_io_transfer()
2330 size_t left_io = srb->total_xfer_length; in data_io_transfer()
2332 if (srb->dcb->sync_period & WIDE_SYNC) in data_io_transfer()
2340 size_t offset = srb->request_length - left_io; in data_io_transfer()
2344 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd), in data_io_transfer()
2345 srb->sg_count, &offset, &len); in data_io_transfer()
2356 sg_subtract_one(srb); in data_io_transfer()
2362 if (srb->dcb->sync_period & WIDE_SYNC) { in data_io_transfer()
2379 if (srb->sg_count) { in data_io_transfer()
2380 srb->adapter_status = H_OVER_UNDER_RUN; in data_io_transfer()
2381 srb->status |= OVER_RUN; in data_io_transfer()
2412 srb->state |= SRB_XFERPAD; in data_io_transfer()
2421 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase0() argument
2425 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase0()
2426 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in status_phase0()
2427 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */ in status_phase0()
2428 srb->state = SRB_COMPLETED; in status_phase0()
2435 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in status_phase1() argument
2439 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun); in status_phase1()
2440 srb->state = SRB_STATUS; in status_phase1()
2462 struct ScsiReqBlk *srb) in msgin_reject() argument
2464 srb->msgout_buf[0] = MESSAGE_REJECT; in msgin_reject()
2465 srb->msg_count = 1; in msgin_reject()
2467 srb->state &= ~SRB_MSGIN; in msgin_reject()
2468 srb->state |= SRB_MSGOUT; in msgin_reject()
2470 srb->msgin_buf[0], in msgin_reject()
2471 srb->dcb->target_id, srb->dcb->target_lun); in msgin_reject()
2478 struct ScsiReqBlk *srb = NULL; in msgin_qtag() local
2481 srb->cmd, tag, srb); in msgin_qtag()
2492 srb = i; in msgin_qtag()
2496 if (!srb) in msgin_qtag()
2500 srb->cmd, srb->dcb->target_id, srb->dcb->target_lun); in msgin_qtag()
2503 enable_msgout_abort(acb, srb); in msgin_qtag()
2506 if (!(srb->state & SRB_DISCONNECT)) in msgin_qtag()
2509 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len); in msgin_qtag()
2510 srb->state |= dcb->active_srb->state; in msgin_qtag()
2511 srb->state |= SRB_DATA_XFER; in msgin_qtag()
2512 dcb->active_srb = srb; in msgin_qtag()
2514 return srb; in msgin_qtag()
2517 srb = acb->tmp_srb; in msgin_qtag()
2518 srb->state = SRB_UNEXPECT_RESEL; in msgin_qtag()
2519 dcb->active_srb = srb; in msgin_qtag()
2520 srb->msgout_buf[0] = ABORT_TASK; in msgin_qtag()
2521 srb->msg_count = 1; in msgin_qtag()
2524 return srb; in msgin_qtag()
2539 static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_async() argument
2541 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_async()
2550 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_async()
2554 build_wdtr(acb, dcb, srb); in msgin_set_async()
2562 static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_sync() argument
2564 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_sync()
2569 dcb->target_id, srb->msgin_buf[3] << 2, in msgin_set_sync()
2570 (250 / srb->msgin_buf[3]), in msgin_set_sync()
2571 ((250 % srb->msgin_buf[3]) * 10) / srb->msgin_buf[3], in msgin_set_sync()
2572 srb->msgin_buf[4]); in msgin_set_sync()
2574 if (srb->msgin_buf[4] > 15) in msgin_set_sync()
2575 srb->msgin_buf[4] = 15; in msgin_set_sync()
2579 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2580 if (srb->msgin_buf[4] > dcb->sync_offset) in msgin_set_sync()
2581 srb->msgin_buf[4] = dcb->sync_offset; in msgin_set_sync()
2583 dcb->sync_offset = srb->msgin_buf[4]; in msgin_set_sync()
2585 while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval] in msgin_set_sync()
2589 if (srb->msgin_buf[3] < clock_period[bval]) in msgin_set_sync()
2593 srb->msgin_buf[3] = clock_period[bval]; in msgin_set_sync()
2596 dcb->min_nego_period = srb->msgin_buf[3]; in msgin_set_sync()
2611 if (!(srb->state & SRB_DO_SYNC_NEGO)) { in msgin_set_sync()
2614 srb->msgin_buf[3] << 2, srb->msgin_buf[4]); in msgin_set_sync()
2616 memcpy(srb->msgout_buf, srb->msgin_buf, 5); in msgin_set_sync()
2617 srb->msg_count = 5; in msgin_set_sync()
2623 build_wdtr(acb, dcb, srb); in msgin_set_sync()
2628 srb->state &= ~SRB_DO_SYNC_NEGO; in msgin_set_sync()
2636 struct ScsiReqBlk *srb) in msgin_set_nowide() argument
2638 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_nowide()
2644 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_nowide()
2648 build_sdtr(acb, dcb, srb); in msgin_set_nowide()
2654 static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in msgin_set_wide() argument
2656 struct DeviceCtlBlk *dcb = srb->dcb; in msgin_set_wide()
2661 if (srb->msgin_buf[3] > wide) in msgin_set_wide()
2662 srb->msgin_buf[3] = wide; in msgin_set_wide()
2664 if (!(srb->state & SRB_DO_WIDE_NEGO)) { in msgin_set_wide()
2668 memcpy(srb->msgout_buf, srb->msgin_buf, 4); in msgin_set_wide()
2669 srb->msg_count = 4; in msgin_set_wide()
2670 srb->state |= SRB_DO_WIDE_NEGO; in msgin_set_wide()
2675 if (srb->msgin_buf[3] > 0) in msgin_set_wide()
2679 srb->state &= ~SRB_DO_WIDE_NEGO; in msgin_set_wide()
2683 (8 << srb->msgin_buf[3]), dcb->target_id); in msgin_set_wide()
2687 build_sdtr(acb, dcb, srb); in msgin_set_wide()
2706 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase0() argument
2710 dprintkdbg(DBG_0, "msgin_phase0: (0x%p)\n", srb->cmd); in msgin_phase0()
2712 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); in msgin_phase0()
2713 if (msgin_completed(srb->msgin_buf, acb->msg_len)) { in msgin_phase0()
2715 switch (srb->msgin_buf[0]) { in msgin_phase0()
2717 srb->state = SRB_DISCONNECT; in msgin_phase0()
2723 srb = in msgin_phase0()
2725 srb->msgin_buf[1]); in msgin_phase0()
2732 if (srb->state & SRB_DO_SYNC_NEGO) { in msgin_phase0()
2733 msgin_set_async(acb, srb); in msgin_phase0()
2737 if (srb->state & SRB_DO_WIDE_NEGO) { in msgin_phase0()
2738 msgin_set_nowide(acb, srb); in msgin_phase0()
2741 enable_msgout_abort(acb, srb); in msgin_phase0()
2747 if (srb->msgin_buf[1] == 3 in msgin_phase0()
2748 && srb->msgin_buf[2] == EXTENDED_SDTR) { in msgin_phase0()
2749 msgin_set_sync(acb, srb); in msgin_phase0()
2753 if (srb->msgin_buf[1] == 2 in msgin_phase0()
2754 && srb->msgin_buf[2] == EXTENDED_WDTR in msgin_phase0()
2755 && srb->msgin_buf[3] <= 2) { /* sanity check ... */ in msgin_phase0()
2756 msgin_set_wide(acb, srb); in msgin_phase0()
2759 msgin_reject(acb, srb); in msgin_phase0()
2778 srb->cmd, srb->total_xfer_length); in msgin_phase0()
2788 srb->cmd, dcb->target_id, in msgin_phase0()
2791 enable_msgout_abort(acb, srb); in msgin_phase0()
2796 if (srb->msgin_buf[0] & IDENTIFY_BASE) { in msgin_phase0()
2798 srb->msg_count = 1; in msgin_phase0()
2799 srb->msgout_buf[0] = dcb->identify_msg; in msgin_phase0()
2801 srb->state |= SRB_MSGOUT; in msgin_phase0()
2804 msgin_reject(acb, srb); in msgin_phase0()
2808 srb->state &= ~SRB_MSGIN; in msgin_phase0()
2817 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in msgin_phase1() argument
2820 dprintkdbg(DBG_0, "msgin_phase1: (0x%p)\n", srb->cmd); in msgin_phase1()
2823 if (!(srb->state & SRB_MSGIN)) { in msgin_phase1()
2824 srb->state &= ~SRB_DISCONNECT; in msgin_phase1()
2825 srb->state |= SRB_MSGIN; in msgin_phase1()
2833 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop0() argument
2839 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb, in nop1() argument
2871 struct ScsiReqBlk *srb; in disconnect() local
2884 srb = dcb->active_srb; in disconnect()
2886 dprintkdbg(DBG_0, "disconnect: (0x%p)\n", srb->cmd); in disconnect()
2888 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in disconnect()
2891 if (srb->state & SRB_UNEXPECT_RESEL) { in disconnect()
2895 srb->state = 0; in disconnect()
2897 } else if (srb->state & SRB_ABORT_SENT) { in disconnect()
2901 doing_srb_done(acb, DID_ABORT, srb->cmd, 1); in disconnect()
2904 if ((srb->state & (SRB_START_ + SRB_MSGOUT)) in disconnect()
2905 || !(srb-> in disconnect()
2912 if (srb->state != SRB_START_ in disconnect()
2913 && srb->state != SRB_MSGOUT) { in disconnect()
2914 srb->state = SRB_READY; in disconnect()
2917 srb->cmd); in disconnect()
2918 srb->target_status = SCSI_STAT_SEL_TIMEOUT; in disconnect()
2923 "<%02i-%i> SelTO\n", srb->cmd, in disconnect()
2925 if (srb->retry_count++ > DC395x_MAX_RETRIES in disconnect()
2927 srb->target_status = in disconnect()
2931 free_tag(dcb, srb); in disconnect()
2932 list_move(&srb->list, &dcb->srb_waiting_list); in disconnect()
2935 srb->cmd); in disconnect()
2938 } else if (srb->state & SRB_DISCONNECT) { in disconnect()
2950 } else if (srb->state & SRB_COMPLETED) { in disconnect()
2955 free_tag(dcb, srb); in disconnect()
2957 srb->state = SRB_FREE; in disconnect()
2958 srb_done(acb, dcb, srb); in disconnect()
2967 struct ScsiReqBlk *srb = NULL; in reselect() local
2977 srb = dcb->active_srb; in reselect()
2978 if (!srb) { in reselect()
2988 srb->cmd, dcb->target_id, in reselect()
2993 srb->state = SRB_READY; in reselect()
2994 free_tag(dcb, srb); in reselect()
2995 list_move(&srb->list, &dcb->srb_waiting_list); in reselect()
3022 srb = acb->tmp_srb; in reselect()
3023 dcb->active_srb = srb; in reselect()
3026 srb = dcb->active_srb; in reselect()
3027 if (!srb || !(srb->state & SRB_DISCONNECT)) { in reselect()
3034 srb = acb->tmp_srb; in reselect()
3035 srb->state = SRB_UNEXPECT_RESEL; in reselect()
3036 dcb->active_srb = srb; in reselect()
3037 enable_msgout_abort(acb, srb); in reselect()
3041 enable_msgout_abort(acb, srb); in reselect()
3043 srb->state = SRB_DATA_XFER; in reselect()
3047 srb->scsi_phase = PH_BUS_FREE; /* initial phase */ in reselect()
3109 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb) in pci_unmap_srb() argument
3111 struct scsi_cmnd *cmd = srb->cmd; in pci_unmap_srb()
3117 srb->sg_bus_addr, SEGMENTX_LEN); in pci_unmap_srb()
3118 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN, in pci_unmap_srb()
3130 struct ScsiReqBlk *srb) in pci_unmap_srb_sense() argument
3132 if (!(srb->flag & AUTO_REQSENSE)) in pci_unmap_srb_sense()
3136 srb->segment_x[0].address); in pci_unmap_srb_sense()
3137 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address, in pci_unmap_srb_sense()
3138 srb->segment_x[0].length, DMA_FROM_DEVICE); in pci_unmap_srb_sense()
3140 srb->total_xfer_length = srb->xferred; in pci_unmap_srb_sense()
3141 srb->segment_x[0].address = in pci_unmap_srb_sense()
3142 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address; in pci_unmap_srb_sense()
3143 srb->segment_x[0].length = in pci_unmap_srb_sense()
3144 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length; in pci_unmap_srb_sense()
3153 struct ScsiReqBlk *srb) in srb_done() argument
3156 struct scsi_cmnd *cmd = srb->cmd; in srb_done()
3160 dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd, in srb_done()
3161 srb->cmd->device->id, (u8)srb->cmd->device->lun); in srb_done()
3163 srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count, in srb_done()
3165 status = srb->target_status; in srb_done()
3168 if (srb->flag & AUTO_REQSENSE) { in srb_done()
3170 pci_unmap_srb_sense(acb, srb); in srb_done()
3174 srb->flag &= ~AUTO_REQSENSE; in srb_done()
3175 srb->adapter_status = 0; in srb_done()
3176 srb->target_status = SAM_STAT_CHECK_CONDITION; in srb_done()
3240 request_sense(acb, dcb, srb); in srb_done()
3249 free_tag(dcb, srb); in srb_done()
3250 list_move(&srb->list, &dcb->srb_waiting_list); in srb_done()
3252 srb->adapter_status = 0; in srb_done()
3253 srb->target_status = 0; in srb_done()
3256 srb->adapter_status = H_SEL_TIMEOUT; in srb_done()
3257 srb->target_status = 0; in srb_done()
3260 srb->adapter_status = 0; in srb_done()
3268 status = srb->adapter_status; in srb_done()
3270 srb->target_status = 0; in srb_done()
3271 scsi_msg_to_host_byte(cmd, srb->end_message); in srb_done()
3272 } else if (srb->status & PARITY_ERROR) { in srb_done()
3276 srb->adapter_status = 0; in srb_done()
3277 srb->target_status = 0; in srb_done()
3285 pci_unmap_srb(acb, srb); in srb_done()
3318 scsi_set_resid(cmd, srb->total_xfer_length); in srb_done()
3320 cmd->SCp.this_residual = srb->total_xfer_length; in srb_done()
3323 if (srb->total_xfer_length) in srb_done()
3327 cmd->cmnd[0], srb->total_xfer_length); in srb_done()
3330 if (srb != acb->tmp_srb) { in srb_done()
3334 list_move_tail(&srb->list, &acb->srb_free_list); in srb_done()
3352 struct ScsiReqBlk *srb; in doing_srb_done() local
3356 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) { in doing_srb_done()
3357 p = srb->cmd; in doing_srb_done()
3360 list_del(&srb->list); in doing_srb_done()
3361 free_tag(dcb, srb); in doing_srb_done()
3362 list_add_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3365 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3366 pci_unmap_srb(acb, srb); in doing_srb_done()
3384 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) { in doing_srb_done()
3385 p = srb->cmd; in doing_srb_done()
3389 list_move_tail(&srb->list, &acb->srb_free_list); in doing_srb_done()
3392 pci_unmap_srb_sense(acb, srb); in doing_srb_done()
3393 pci_unmap_srb(acb, srb); in doing_srb_done()
3493 struct ScsiReqBlk *srb) in request_sense() argument
3495 struct scsi_cmnd *cmd = srb->cmd; in request_sense()
3499 srb->flag |= AUTO_REQSENSE; in request_sense()
3500 srb->adapter_status = 0; in request_sense()
3501 srb->target_status = 0; in request_sense()
3507 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address = in request_sense()
3508 srb->segment_x[0].address; in request_sense()
3509 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length = in request_sense()
3510 srb->segment_x[0].length; in request_sense()
3511 srb->xferred = srb->total_xfer_length; in request_sense()
3513 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3514 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE; in request_sense()
3516 srb->segment_x[0].address = dma_map_single(&acb->dev->dev, in request_sense()
3520 cmd->sense_buffer, srb->segment_x[0].address, in request_sense()
3522 srb->sg_count = 1; in request_sense()
3523 srb->sg_index = 0; in request_sense()
3525 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */ in request_sense()
3528 srb->cmd, dcb->target_id, dcb->target_lun); in request_sense()
3529 list_move(&srb->list, &dcb->srb_waiting_list); in request_sense()
4108 acb->srb.segment_x = in adapter_sg_tables_alloc()
4185 acb->tmp_srb = &acb->srb; in adapter_init_params()
4510 struct ScsiReqBlk *srb; in dc395x_show_info() local
4515 list_for_each_entry(srb, &dcb->srb_waiting_list, list) in dc395x_show_info()
4516 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()
4521 list_for_each_entry(srb, &dcb->srb_going_list, list) in dc395x_show_info()
4522 seq_printf(m, " %p", srb->cmd); in dc395x_show_info()