Lines Matching refs:srb

166  * srb->segement_x is the hw sg list. It is always allocated as a
213 struct list_head list; /* next/prev ptrs for srb lists */
229 * (srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1] and the
256 struct list_head srb_going_list; /* head of going srb list */
257 struct list_head srb_waiting_list; /* head of waiting srb list */
290 struct list_head srb_free_list; /* head of free srb list */
319 struct ScsiReqBlk srb;
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)
722 if (srb->tag_number < 255) {
723 dcb->tag_mask &= ~(1 << srb->tag_number); /* free tag mask */
724 srb->tag_number = 255;
760 struct ScsiReqBlk *srb;
806 srb = list_entry(waiting_list_head->next,
810 if (!start_scsi(acb, pos, srb))
811 list_move(&srb->list, &pos->srb_going_list);
840 /* Send SCSI Request Block (srb) to adapter (acb) */
841 static void send_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
843 struct DeviceCtlBlk *dcb = srb->dcb;
848 list_add_tail(&srb->list, &dcb->srb_waiting_list);
853 if (!start_scsi(acb, dcb, srb)) {
854 list_add_tail(&srb->list, &dcb->srb_going_list);
856 list_add(&srb->list, &dcb->srb_waiting_list);
863 struct ScsiReqBlk *srb)
870 srb->dcb = dcb;
871 srb->cmd = cmd;
872 srb->sg_count = 0;
873 srb->total_xfer_length = 0;
874 srb->sg_bus_addr = 0;
875 srb->sg_index = 0;
876 srb->adapter_status = 0;
877 srb->target_status = 0;
878 srb->msg_count = 0;
879 srb->status = 0;
880 srb->flag = 0;
881 srb->state = 0;
882 srb->retry_count = 0;
883 srb->tag_number = TAG_NONE;
884 srb->scsi_phase = PH_BUS_FREE; /* initial phase */
885 srb->end_message = 0;
894 srb->segment_x[0].address);
899 struct SGentry *sgp = srb->segment_x;
901 srb->sg_count = nseg;
906 srb->sg_count);
908 scsi_for_each_sg(cmd, sg, srb->sg_count, i) {
913 srb->total_xfer_length += seglen;
915 sgp += srb->sg_count - 1;
921 if (srb->total_xfer_length > reqlen) {
922 sgp->length -= (srb->total_xfer_length - reqlen);
923 srb->total_xfer_length = reqlen;
928 srb->total_xfer_length % 2) {
929 srb->total_xfer_length++;
933 srb->sg_bus_addr = dma_map_single(&dcb->acb->dev->dev,
934 srb->segment_x, SEGMENTX_LEN, DMA_TO_DEVICE);
937 srb->segment_x, srb->sg_bus_addr, SEGMENTX_LEN);
940 srb->request_length = srb->total_xfer_length;
966 struct ScsiReqBlk *srb;
1001 srb = list_first_entry_or_null(&acb->srb_free_list,
1003 if (!srb) {
1008 dprintkdbg(DBG_0, "queue_command: No free srb's\n");
1011 list_del(&srb->list);
1013 build_srb(cmd, dcb, srb);
1017 list_add_tail(&srb->list, &dcb->srb_waiting_list);
1021 send_srb(acb, srb);
1040 struct DeviceCtlBlk *dcb, struct ScsiReqBlk *srb)
1047 if (!srb && dcb)
1048 srb = dcb->active_srb;
1049 if (srb) {
1050 if (!srb->cmd)
1051 dprintkl(KERN_INFO, "dump: srb=%p cmd=%p OOOPS!\n",
1052 srb, srb->cmd);
1054 dprintkl(KERN_INFO, "dump: srb=%p cmd=%p "
1056 srb, srb->cmd,
1057 srb->cmd->cmnd[0], srb->cmd->device->id,
1058 (u8)srb->cmd->device->lun);
1060 srb->segment_x, srb->sg_count, srb->sg_index,
1061 srb->total_xfer_length);
1063 srb->state, srb->status, srb->scsi_phase,
1218 struct ScsiReqBlk *srb;
1228 srb = find_cmd(cmd, &dcb->srb_waiting_list);
1229 if (srb) {
1230 list_del(&srb->list);
1231 pci_unmap_srb_sense(acb, srb);
1232 pci_unmap_srb(acb, srb);
1233 free_tag(dcb, srb);
1234 list_add_tail(&srb->list, &acb->srb_free_list);
1239 srb = find_cmd(cmd, &dcb->srb_going_list);
1240 if (srb) {
1252 struct ScsiReqBlk *srb)
1254 u8 *ptr = srb->msgout_buf + srb->msg_count;
1255 if (srb->msg_count > 1) {
1258 srb->msg_count, srb->msgout_buf[0],
1259 srb->msgout_buf[1]);
1268 srb->msg_count += spi_populate_sync_msg(ptr, dcb->min_nego_period,
1270 srb->state |= SRB_DO_SYNC_NEGO;
1276 struct ScsiReqBlk *srb)
1280 u8 *ptr = srb->msgout_buf + srb->msg_count;
1281 if (srb->msg_count > 1) {
1284 srb->msg_count, srb->msgout_buf[0],
1285 srb->msgout_buf[1]);
1288 srb->msg_count += spi_populate_width_msg(ptr, wide);
1289 srb->state |= SRB_DO_WIDE_NEGO;
1318 struct ScsiReqBlk *srb;
1325 srb = acb->active_dcb->active_srb;
1333 struct ScsiReqBlk* srb)
1338 dprintkdbg(DBG_0, "start_scsi: (0x%p) <%02i-%i> srb=%p\n",
1339 dcb->target_id, dcb->target_lun, srb);
1341 srb->tag_number = TAG_NONE; /* acb->tag_max_num: had error read in eeprom */
1367 srb->cmd,
1373 dprintkdbg(DBG_KG, "start_scsi: (0x%p) Failed (busy)\n", srb->cmd);
1389 srb->scsi_phase = PH_BUS_FREE; /* initial phase */
1394 if (srb->flag & AUTO_REQSENSE)
1397 if (((srb->cmd->cmnd[0] == INQUIRY)
1398 || (srb->cmd->cmnd[0] == REQUEST_SENSE)
1399 || (srb->flag & AUTO_REQSENSE))
1405 srb->msgout_buf[0] = identify_message;
1406 srb->msg_count = 1;
1408 srb->state = SRB_MSGOUT;
1412 build_wdtr(acb, dcb, srb);
1418 build_sdtr(acb, dcb, srb);
1423 build_wdtr(acb, dcb, srb);
1426 srb->msg_count = 0;
1432 srb->state = SRB_START_;
1447 srb->cmd, srb->cmd->device->id,
1448 (u8)srb->cmd->device->lun);
1449 srb->state = SRB_READY;
1458 srb->tag_number = tag_number;
1460 srb->state = SRB_START_;
1466 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun,
1467 srb->cmd->cmnd[0], srb->tag_number);
1468 if (srb->flag & AUTO_REQSENSE) {
1476 ptr = (u8 *)srb->cmd->cmnd;
1477 for (i = 0; i < srb->cmd->cmd_len; i++)
1490 srb->cmd, dcb->target_id, dcb->target_lun);
1491 srb->state = SRB_READY;
1492 free_tag(dcb, srb);
1493 srb->msg_count = 0;
1501 srb->scsi_phase = PH_BUS_FREE; /* initial phase */
1502 dcb->active_srb = srb;
1517 srb->state |= SRB_MSGOUT
1522 struct ScsiReqBlk *srb)
1524 srb->msgout_buf[0] = ABORT;
1525 srb->msg_count = 1;
1527 srb->state &= ~SRB_MSGIN;
1528 srb->state |= SRB_MSGOUT;
1543 struct ScsiReqBlk *srb;
1590 srb = dcb->active_srb;
1593 enable_msgout_abort(acb, srb);
1597 phase = (u16)srb->scsi_phase;
1613 dc395x_statev(acb, srb, &scsi_status);
1620 srb->scsi_phase = scsi_status & PHASEMASK;
1636 dc395x_statev(acb, srb, &scsi_status);
1682 static void msgout_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1685 dprintkdbg(DBG_0, "msgout_phase0: (0x%p)\n", srb->cmd);
1686 if (srb->state & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT))
1690 srb->state &= ~SRB_MSGOUT;
1694 static void msgout_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1699 dprintkdbg(DBG_0, "msgout_phase1: (0x%p)\n", srb->cmd);
1702 if (!(srb->state & SRB_MSGOUT)) {
1703 srb->state |= SRB_MSGOUT;
1706 srb->cmd); /* So what ? */
1708 if (!srb->msg_count) {
1710 srb->cmd);
1717 ptr = (u8 *)srb->msgout_buf;
1718 for (i = 0; i < srb->msg_count; i++)
1720 srb->msg_count = 0;
1721 if (srb->msgout_buf[0] == ABORT_TASK_SET)
1722 srb->state = SRB_ABORT_SENT;
1728 static void command_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1731 dprintkdbg(DBG_0, "command_phase0: (0x%p)\n", srb->cmd);
1736 static void command_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1742 dprintkdbg(DBG_0, "command_phase1: (0x%p)\n", srb->cmd);
1746 if (!(srb->flag & AUTO_REQSENSE)) {
1747 ptr = (u8 *)srb->cmd->cmnd;
1748 for (i = 0; i < srb->cmd->cmd_len; i++) {
1762 srb->state |= SRB_COMMAND;
1772 * the count of remaining bytes in srb->total_xfer_length
1774 static void sg_verify_length(struct ScsiReqBlk *srb)
1778 unsigned idx = srb->sg_index;
1779 struct SGentry *psge = srb->segment_x + idx;
1780 for (; idx < srb->sg_count; psge++, idx++)
1782 if (len != srb->total_xfer_length)
1785 srb->total_xfer_length, len);
1794 static void sg_update_list(struct ScsiReqBlk *srb, u32 left)
1797 u32 xferred = srb->total_xfer_length - left; /* bytes transferred */
1798 struct SGentry *psge = srb->segment_x + srb->sg_index;
1802 xferred, srb->total_xfer_length, left);
1808 sg_verify_length(srb);
1809 srb->total_xfer_length = left; /* update remaining count */
1810 for (idx = srb->sg_index; idx < srb->sg_count; idx++) {
1816 dma_sync_single_for_cpu(&srb->dcb->acb->dev->dev,
1817 srb->sg_bus_addr, SEGMENTX_LEN,
1821 srb->sg_index = idx;
1822 dma_sync_single_for_device(&srb->dcb->acb->dev->dev,
1823 srb->sg_bus_addr, SEGMENTX_LEN,
1829 sg_verify_length(srb);
1839 static void sg_subtract_one(struct ScsiReqBlk *srb)
1841 sg_update_list(srb, srb->total_xfer_length - 1);
1854 struct ScsiReqBlk *srb)
1879 static void data_out_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
1882 struct DeviceCtlBlk *dcb = srb->dcb;
1886 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
1907 srb->total_xfer_length);
1910 if (!(srb->state & SRB_XFERPAD)) {
1912 srb->status |= PARITY_ERROR;
1951 if (srb->total_xfer_length > DC395x_LASTPIO)
1959 && scsi_bufflen(srb->cmd) % 2) {
1976 srb->total_xfer_length = 0;
1984 srb->total_xfer_length - d_left_counter;
1987 sg_update_list(srb, d_left_counter);
1989 if ((srb->segment_x[srb->sg_index].length ==
1990 diff && scsi_sg_count(srb->cmd))
1997 srb->total_xfer_length - diff;
1998 sg_update_list(srb, d_left_counter);
1999 /*srb->total_xfer_length -= diff; */
2000 /*srb->virt_addr += diff; */
2001 /*if (srb->cmd->use_sg) */
2002 /* srb->sg_index++; */
2007 cleanup_after_transfer(acb, srb);
2012 static void data_out_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2016 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2019 data_io_transfer(acb, srb, XFERDATAOUT);
2022 static void data_in_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2028 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2043 if (!(srb->state & SRB_XFERPAD)) {
2049 "Parity Error\n", srb->cmd);
2050 srb->status |= PARITY_ERROR;
2086 << ((srb->dcb->sync_period & WIDE_SYNC) ? 1 :
2093 (srb->dcb->sync_period & WIDE_SYNC) ? "words" : "bytes",
2098 srb->total_xfer_length, d_left_counter);
2102 && srb->total_xfer_length <= DC395x_LASTPIO) {
2103 size_t left_io = srb->total_xfer_length;
2105 /*u32 addr = (srb->segment_x[srb->sg_index].address); */
2106 /*sg_update_list (srb, d_left_counter); */
2110 (srb->dcb->sync_period & WIDE_SYNC) ?
2112 srb->total_xfer_length);
2113 if (srb->dcb->sync_period & WIDE_SYNC)
2120 size_t offset = srb->request_length - left_io;
2125 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd),
2126 srb->sg_count, &offset, &len);
2140 sg_subtract_one(srb);
2154 if (fc == 0x40 && (srb->dcb->sync_period & WIDE_SYNC)) {
2156 if (srb->total_xfer_length > 0) {
2160 srb->total_xfer_length--;
2172 /*srb->total_xfer_length = 0; */
2191 if (srb->dcb->sync_period & WIDE_SYNC)
2213 srb->total_xfer_length = 0;
2215 srb->total_xfer_length = d_left_counter;
2225 sg_update_list(srb, d_left_counter);
2230 cleanup_after_transfer(acb, srb);
2235 static void data_in_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2239 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2240 data_io_transfer(acb, srb, XFERDATAIN);
2245 struct ScsiReqBlk *srb, u16 io_dir)
2247 struct DeviceCtlBlk *dcb = srb->dcb;
2251 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun,
2253 srb->total_xfer_length, srb->sg_index, srb->sg_count);
2254 if (srb == acb->tmp_srb)
2256 if (srb->sg_index >= srb->sg_count) {
2261 if (srb->total_xfer_length > DC395x_LASTPIO) {
2270 dump_register_info(acb, dcb, srb);
2278 srb->state |= SRB_DATA_XFER;
2280 if (scsi_sg_count(srb->cmd)) { /* with S/G */
2283 srb->sg_bus_addr +
2285 srb->sg_index);
2288 ((u32)(srb->sg_count -
2289 srb->sg_index) << 3));
2293 srb->segment_x[0].address);
2295 srb->segment_x[0].length);
2299 srb->total_xfer_length);
2313 else if (srb->total_xfer_length > 0) { /* The last four bytes: Do PIO */
2318 srb->state |= SRB_DATA_XFER;
2321 srb->total_xfer_length);
2327 int ln = srb->total_xfer_length;
2328 size_t left_io = srb->total_xfer_length;
2330 if (srb->dcb->sync_period & WIDE_SYNC)
2338 size_t offset = srb->request_length - left_io;
2342 base = scsi_kmap_atomic_sg(scsi_sglist(srb->cmd),
2343 srb->sg_count, &offset, &len);
2354 sg_subtract_one(srb);
2360 if (srb->dcb->sync_period & WIDE_SYNC) {
2377 if (srb->sg_count) {
2378 srb->adapter_status = H_OVER_UNDER_RUN;
2379 srb->status |= OVER_RUN;
2410 srb->state |= SRB_XFERPAD;
2419 static void status_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2423 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2424 srb->target_status = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2425 srb->end_message = DC395x_read8(acb, TRM_S1040_SCSI_FIFO); /* get message */
2426 srb->state = SRB_COMPLETED;
2433 static void status_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2437 srb->cmd, srb->cmd->device->id, (u8)srb->cmd->device->lun);
2438 srb->state = SRB_STATUS;
2460 struct ScsiReqBlk *srb)
2462 srb->msgout_buf[0] = MESSAGE_REJECT;
2463 srb->msg_count = 1;
2465 srb->state &= ~SRB_MSGIN;
2466 srb->state |= SRB_MSGOUT;
2468 srb->msgin_buf[0],
2469 srb->dcb->target_id, srb->dcb->target_lun);
2476 struct ScsiReqBlk *srb = NULL;
2478 dprintkdbg(DBG_0, "msgin_qtag: (0x%p) tag=%i srb=%p\n",
2479 srb->cmd, tag, srb);
2490 srb = i;
2494 if (!srb)
2498 srb->cmd, srb->dcb->target_id, srb->dcb->target_lun);
2500 /*srb->state = SRB_ABORT_SENT; */
2501 enable_msgout_abort(acb, srb);
2504 if (!(srb->state & SRB_DISCONNECT))
2507 memcpy(srb->msgin_buf, dcb->active_srb->msgin_buf, acb->msg_len);
2508 srb->state |= dcb->active_srb->state;
2509 srb->state |= SRB_DATA_XFER;
2510 dcb->active_srb = srb;
2512 return srb;
2515 srb = acb->tmp_srb;
2516 srb->state = SRB_UNEXPECT_RESEL;
2517 dcb->active_srb = srb;
2518 srb->msgout_buf[0] = ABORT_TASK;
2519 srb->msg_count = 1;
2522 return srb;
2537 static void msgin_set_async(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
2539 struct DeviceCtlBlk *dcb = srb->dcb;
2548 srb->state &= ~SRB_DO_SYNC_NEGO;
2552 build_wdtr(acb, dcb, srb);
2560 static void msgin_set_sync(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
2562 struct DeviceCtlBlk *dcb = srb->dcb;
2567 dcb->target_id, srb->msgin_buf[3] << 2,
2568 (250 / srb->msgin_buf[3]),
2569 ((250 % srb->msgin_buf[3]) * 10) / srb->msgin_buf[3],
2570 srb->msgin_buf[4]);
2572 if (srb->msgin_buf[4] > 15)
2573 srb->msgin_buf[4] = 15;
2577 dcb->sync_offset = srb->msgin_buf[4];
2578 if (srb->msgin_buf[4] > dcb->sync_offset)
2579 srb->msgin_buf[4] = dcb->sync_offset;
2581 dcb->sync_offset = srb->msgin_buf[4];
2583 while (bval < 7 && (srb->msgin_buf[3] > clock_period[bval]
2587 if (srb->msgin_buf[3] < clock_period[bval])
2591 srb->msgin_buf[3] = clock_period[bval];
2594 dcb->min_nego_period = srb->msgin_buf[3];
2609 if (!(srb->state & SRB_DO_SYNC_NEGO)) {
2612 srb->msgin_buf[3] << 2, srb->msgin_buf[4]);
2614 memcpy(srb->msgout_buf, srb->msgin_buf, 5);
2615 srb->msg_count = 5;
2621 build_wdtr(acb, dcb, srb);
2626 srb->state &= ~SRB_DO_SYNC_NEGO;
2634 struct ScsiReqBlk *srb)
2636 struct DeviceCtlBlk *dcb = srb->dcb;
2642 srb->state &= ~SRB_DO_WIDE_NEGO;
2646 build_sdtr(acb, dcb, srb);
2652 static void msgin_set_wide(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
2654 struct DeviceCtlBlk *dcb = srb->dcb;
2659 if (srb->msgin_buf[3] > wide)
2660 srb->msgin_buf[3] = wide;
2662 if (!(srb->state & SRB_DO_WIDE_NEGO)) {
2666 memcpy(srb->msgout_buf, srb->msgin_buf, 4);
2667 srb->msg_count = 4;
2668 srb->state |= SRB_DO_WIDE_NEGO;
2673 if (srb->msgin_buf[3] > 0)
2677 srb->state &= ~SRB_DO_WIDE_NEGO;
2681 (8 << srb->msgin_buf[3]), dcb->target_id);
2685 build_sdtr(acb, dcb, srb);
2704 static void msgin_phase0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2708 dprintkdbg(DBG_0, "msgin_phase0: (0x%p)\n", srb->cmd);
2710 srb->msgin_buf[acb->msg_len++] = DC395x_read8(acb, TRM_S1040_SCSI_FIFO);
2711 if (msgin_completed(srb->msgin_buf, acb->msg_len)) {
2713 switch (srb->msgin_buf[0]) {
2715 srb->state = SRB_DISCONNECT;
2721 srb =
2723 srb->msgin_buf[1]);
2730 if (srb->state & SRB_DO_SYNC_NEGO) {
2731 msgin_set_async(acb, srb);
2735 if (srb->state & SRB_DO_WIDE_NEGO) {
2736 msgin_set_nowide(acb, srb);
2739 enable_msgout_abort(acb, srb);
2740 /*srb->state |= SRB_ABORT_SENT */
2745 if (srb->msgin_buf[1] == 3
2746 && srb->msgin_buf[2] == EXTENDED_SDTR) {
2747 msgin_set_sync(acb, srb);
2751 if (srb->msgin_buf[1] == 2
2752 && srb->msgin_buf[2] == EXTENDED_WDTR
2753 && srb->msgin_buf[3] <= 2) { /* sanity check ... */
2754 msgin_set_wide(acb, srb);
2757 msgin_reject(acb, srb);
2776 srb->cmd, srb->total_xfer_length);
2786 srb->cmd, dcb->target_id,
2789 enable_msgout_abort(acb, srb);
2794 if (srb->msgin_buf[0] & IDENTIFY_BASE) {
2796 srb->msg_count = 1;
2797 srb->msgout_buf[0] = dcb->identify_msg;
2799 srb->state |= SRB_MSGOUT;
2802 msgin_reject(acb, srb);
2806 srb->state &= ~SRB_MSGIN;
2815 static void msgin_phase1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2818 dprintkdbg(DBG_0, "msgin_phase1: (0x%p)\n", srb->cmd);
2821 if (!(srb->state & SRB_MSGIN)) {
2822 srb->state &= ~SRB_DISCONNECT;
2823 srb->state |= SRB_MSGIN;
2831 static void nop0(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2837 static void nop1(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb,
2869 struct ScsiReqBlk *srb;
2882 srb = dcb->active_srb;
2884 dprintkdbg(DBG_0, "disconnect: (0x%p)\n", srb->cmd);
2886 srb->scsi_phase = PH_BUS_FREE; /* initial phase */
2889 if (srb->state & SRB_UNEXPECT_RESEL) {
2893 srb->state = 0;
2895 } else if (srb->state & SRB_ABORT_SENT) {
2899 doing_srb_done(acb, DID_ABORT, srb->cmd, 1);
2902 if ((srb->state & (SRB_START_ + SRB_MSGOUT))
2903 || !(srb->
2910 if (srb->state != SRB_START_
2911 && srb->state != SRB_MSGOUT) {
2912 srb->state = SRB_READY;
2915 srb->cmd);
2916 srb->target_status = SCSI_STAT_SEL_TIMEOUT;
2921 "<%02i-%i> SelTO\n", srb->cmd,
2923 if (srb->retry_count++ > DC395x_MAX_RETRIES
2925 srb->target_status =
2929 free_tag(dcb, srb);
2930 list_move(&srb->list, &dcb->srb_waiting_list);
2933 srb->cmd);
2936 } else if (srb->state & SRB_DISCONNECT) {
2948 } else if (srb->state & SRB_COMPLETED) {
2953 free_tag(dcb, srb);
2955 srb->state = SRB_FREE;
2956 srb_done(acb, dcb, srb);
2965 struct ScsiReqBlk *srb = NULL;
2975 srb = dcb->active_srb;
2976 if (!srb) {
2986 srb->cmd, dcb->target_id,
2989 /*srb->state |= SRB_DISCONNECT; */
2991 srb->state = SRB_READY;
2992 free_tag(dcb, srb);
2993 list_move(&srb->list, &dcb->srb_waiting_list);
3020 srb = acb->tmp_srb;
3021 dcb->active_srb = srb;
3024 srb = dcb->active_srb;
3025 if (!srb || !(srb->state & SRB_DISCONNECT)) {
3032 srb = acb->tmp_srb;
3033 srb->state = SRB_UNEXPECT_RESEL;
3034 dcb->active_srb = srb;
3035 enable_msgout_abort(acb, srb);
3038 /*srb->state = SRB_ABORT_SENT; */
3039 enable_msgout_abort(acb, srb);
3041 srb->state = SRB_DATA_XFER;
3045 srb->scsi_phase = PH_BUS_FREE; /* initial phase */
3107 static void pci_unmap_srb(struct AdapterCtlBlk *acb, struct ScsiReqBlk *srb)
3109 struct scsi_cmnd *cmd = srb->cmd;
3115 srb->sg_bus_addr, SEGMENTX_LEN);
3116 dma_unmap_single(&acb->dev->dev, srb->sg_bus_addr, SEGMENTX_LEN,
3128 struct ScsiReqBlk *srb)
3130 if (!(srb->flag & AUTO_REQSENSE))
3134 srb->segment_x[0].address);
3135 dma_unmap_single(&acb->dev->dev, srb->segment_x[0].address,
3136 srb->segment_x[0].length, DMA_FROM_DEVICE);
3138 srb->total_xfer_length = srb->xferred;
3139 srb->segment_x[0].address =
3140 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address;
3141 srb->segment_x[0].length =
3142 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length;
3151 struct ScsiReqBlk *srb)
3154 struct scsi_cmnd *cmd = srb->cmd;
3158 dprintkdbg(DBG_1, "srb_done: (0x%p) <%02i-%i>\n", srb->cmd,
3159 srb->cmd->device->id, (u8)srb->cmd->device->lun);
3160 dprintkdbg(DBG_SG, "srb_done: srb=%p sg=%i(%i/%i) buf=%p\n",
3161 srb, scsi_sg_count(cmd), srb->sg_index, srb->sg_count,
3163 status = srb->target_status;
3166 if (srb->flag & AUTO_REQSENSE) {
3168 pci_unmap_srb_sense(acb, srb);
3172 srb->flag &= ~AUTO_REQSENSE;
3173 srb->adapter_status = 0;
3174 srb->target_status = SAM_STAT_CHECK_CONDITION;
3238 request_sense(acb, dcb, srb);
3247 free_tag(dcb, srb);
3248 list_move(&srb->list, &dcb->srb_waiting_list);
3250 srb->adapter_status = 0;
3251 srb->target_status = 0;
3254 srb->adapter_status = H_SEL_TIMEOUT;
3255 srb->target_status = 0;
3258 srb->adapter_status = 0;
3266 status = srb->adapter_status;
3268 srb->target_status = 0;
3269 scsi_msg_to_host_byte(cmd, srb->end_message);
3270 } else if (srb->status & PARITY_ERROR) {
3274 srb->adapter_status = 0;
3275 srb->target_status = 0;
3283 pci_unmap_srb(acb, srb);
3301 /*if( srb->cmd->cmnd[0] == INQUIRY && */
3316 scsi_set_resid(cmd, srb->total_xfer_length);
3318 if (srb->total_xfer_length)
3322 cmd->cmnd[0], srb->total_xfer_length);
3325 if (srb != acb->tmp_srb) {
3329 list_move_tail(&srb->list, &acb->srb_free_list);
3347 struct ScsiReqBlk *srb;
3351 list_for_each_entry_safe(srb, tmp, &dcb->srb_going_list, list) {
3352 p = srb->cmd;
3355 list_del(&srb->list);
3356 free_tag(dcb, srb);
3357 list_add_tail(&srb->list, &acb->srb_free_list);
3360 pci_unmap_srb_sense(acb, srb);
3361 pci_unmap_srb(acb, srb);
3379 list_for_each_entry_safe(srb, tmp, &dcb->srb_waiting_list, list) {
3380 p = srb->cmd;
3384 list_move_tail(&srb->list, &acb->srb_free_list);
3387 pci_unmap_srb_sense(acb, srb);
3388 pci_unmap_srb(acb, srb);
3488 struct ScsiReqBlk *srb)
3490 struct scsi_cmnd *cmd = srb->cmd;
3494 srb->flag |= AUTO_REQSENSE;
3495 srb->adapter_status = 0;
3496 srb->target_status = 0;
3502 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].address =
3503 srb->segment_x[0].address;
3504 srb->segment_x[DC395x_MAX_SG_LISTENTRY - 1].length =
3505 srb->segment_x[0].length;
3506 srb->xferred = srb->total_xfer_length;
3507 /* srb->segment_x : a one entry of S/G list table */
3508 srb->total_xfer_length = SCSI_SENSE_BUFFERSIZE;
3509 srb->segment_x[0].length = SCSI_SENSE_BUFFERSIZE;
3511 srb->segment_x[0].address = dma_map_single(&acb->dev->dev,
3515 cmd->sense_buffer, srb->segment_x[0].address,
3517 srb->sg_count = 1;
3518 srb->sg_index = 0;
3520 if (start_scsi(acb, dcb, srb)) { /* Should only happen, if sb. else grabs the bus */
3523 srb->cmd, dcb->target_id, dcb->target_lun);
3524 list_move(&srb->list, &dcb->srb_waiting_list);
4112 acb->srb.segment_x =
4189 acb->tmp_srb = &acb->srb;
4218 /* link static array of srbs into the srb free list */
4365 "size{acb=0x%04x dcb=0x%04x srb=0x%04x}\n",
4514 struct ScsiReqBlk *srb;
4519 list_for_each_entry(srb, &dcb->srb_waiting_list, list)
4520 seq_printf(m, " %p", srb->cmd);
4525 list_for_each_entry(srb, &dcb->srb_going_list, list)
4526 seq_printf(m, " %p", srb->cmd);