Lines Matching refs:scb

147 static void initio_select_atn(struct initio_host * host, struct scsi_ctrl_blk * scb);
148 static void initio_select_atn3(struct initio_host * host, struct scsi_ctrl_blk * scb);
149 static void initio_select_atn_stop(struct initio_host * host, struct scsi_ctrl_blk * scb);
656 struct scsi_ctrl_blk *scb;
660 if ((scb = host->first_avail) != NULL) {
662 printk("find scb at %p\n", scb);
664 if ((host->first_avail = scb->next) == NULL)
666 scb->next = NULL;
667 scb->status = SCB_RENT;
670 return scb;
763 static void initio_unlink_pend_scb(struct initio_host * host, struct scsi_ctrl_blk * scb)
768 printk("unlink pend SCB %p; ", scb);
773 if (scb == tmp) { /* Unlink this SCB */
833 static void initio_unlink_busy_scb(struct initio_host * host, struct scsi_ctrl_blk * scb)
838 printk("unlink busy SCB %p; ", scb);
843 if (scb == tmp) { /* Unlink this SCB */
1002 struct scsi_ctrl_blk *scb;
1006 if ((scb = host->active) != NULL) {
1007 initio_unlink_busy_scb(host, scb);
1008 scb->hastat = HOST_BAD_PHAS;
1009 scb->tastat = 0;
1010 initio_append_done_scb(host, scb);
1019 static void initio_exec_scb(struct initio_host * host, struct scsi_ctrl_blk * scb)
1023 scb->mode = 0;
1025 scb->sgidx = 0;
1026 scb->sgmax = scb->sglen;
1030 initio_append_pend_scb(host, scb); /* Append this SCB to Pending queue */
1070 struct scsi_ctrl_blk *scb;
1076 while ((scb = initio_find_done_scb(host)) != NULL) { /* find done entry */
1077 if (scb->tastat == INI_QUEUE_FULL) {
1078 host->max_tags[scb->target] =
1079 host->act_tags[scb->target] - 1;
1080 scb->tastat = 0;
1081 initio_append_pend_scb(host, scb);
1084 if (!(scb->mode & SCM_RSENS)) { /* not in auto req. sense mode */
1085 if (scb->tastat == 2) {
1089 if (scb->flags & SCF_SENSE) {
1091 len = scb->senselen;
1094 scb->buflen = scb->senselen;
1095 scb->bufptr = scb->senseptr;
1096 scb->flags &= ~(SCF_SG | SCF_DIR); /* for xfer_data_in */
1099 scb->mode = SCM_RSENS;
1100 scb->ident &= 0xBF; /* Disable Disconnect */
1101 scb->tagmsg = 0;
1102 scb->tastat = 0;
1103 scb->cdblen = 6;
1104 scb->cdb[0] = SCSICMD_RequestSense;
1105 scb->cdb[1] = 0;
1106 scb->cdb[2] = 0;
1107 scb->cdb[3] = 0;
1108 scb->cdb[4] = len;
1109 scb->cdb[5] = 0;
1110 initio_push_pend_scb(host, scb);
1116 if (scb->tastat == 2) { /* check contition status again after sending
1118 scb->hastat = HOST_BAD_PHAS;
1120 scb->tastat = 2;
1122 scb->flags |= SCF_DONE;
1123 if (scb->flags & SCF_POST) {
1125 (*scb->post) ((u8 *) host, (u8 *) scb);
1142 struct scsi_ctrl_blk *scb;
1176 if ((scb = initio_find_first_pend_scb(host)) == NULL)
1180 outb((host->scsi_id << 4) | (scb->target & 0x0F),
1182 if (scb->opcode == ExecSCSI) {
1183 active_tc = &host->targets[scb->target];
1185 if (scb->tagmsg)
1192 initio_select_atn_stop(host, scb);
1195 initio_select_atn_stop(host, scb);
1197 if (scb->tagmsg)
1198 initio_select_atn3(host, scb);
1200 initio_select_atn(host, scb);
1203 if (scb->flags & SCF_POLL) {
1209 } else if (scb->opcode == BusDevRst) {
1210 initio_select_atn_stop(host, scb);
1211 scb->next_state = 8;
1212 if (scb->flags & SCF_POLL) {
1218 } else if (scb->opcode == AbortCmd) {
1219 if (initio_abort_srb(host, scb->srb) != 0) {
1220 initio_unlink_pend_scb(host, scb);
1221 initio_release_scb(host, scb);
1223 scb->opcode = BusDevRst;
1224 initio_select_atn_stop(host, scb);
1225 scb->next_state = 8;
1228 initio_unlink_pend_scb(host, scb);
1229 scb->hastat = 0x16; /* bad command */
1230 initio_append_done_scb(host, scb);
1293 struct scsi_ctrl_blk *scb = host->active;
1300 initio_unlink_pend_scb(host, scb);
1301 initio_append_busy_scb(host, scb);
1307 outb(scb->ident, host->addr + TUL_SFifo);
1309 if (scb->tagmsg) {
1310 outb(scb->tagmsg, host->addr + TUL_SFifo);
1311 outb(scb->tagid, host->addr + TUL_SFifo);
1348 struct scsi_ctrl_blk *scb = host->active;
1354 initio_unlink_pend_scb(host, scb);
1355 initio_append_busy_scb(host, scb);
1377 struct scsi_ctrl_blk *scb = host->active;
1387 for (i = 0; i < (int) scb->cdblen; i++)
1388 outb(scb->cdb[i], host->addr + TUL_SFifo);
1397 scb->next_state = 3;
1444 struct scsi_ctrl_blk *scb = host->active;
1449 if ((scb->flags & SCF_DIR) == SCF_NO_XF) {
1453 if (scb->buflen == 0)
1459 if ((scb->flags & SCF_DIR) != 0) /* if direction bit set then report data underrun */
1460 scb->hastat = HOST_DO_DU;
1466 scb->next_state = 0x4;
1473 scb->buflen = 0;
1474 scb->hastat = HOST_DO_DU;
1508 struct scsi_ctrl_blk *scb = host->active;
1521 scb->hastat = HOST_DO_DU;
1554 scb->buflen = 0;
1558 xcnt = (long) scb->buflen - cnt; /* xcnt== bytes already xferred */
1559 scb->buflen = (u32) cnt; /* cnt == bytes left to be xferred */
1560 if (scb->flags & SCF_SG) {
1564 sgp = &scb->sglist[scb->sgidx];
1565 for (i = scb->sgidx; i < scb->sgmax; sgp++, i++) {
1571 scb->bufptr += ((u32) (i - scb->sgidx) << 3);
1573 scb->sglen = (u8) (scb->sgmax - i);
1575 scb->sgidx = (u16) i;
1583 scb->bufptr += (u32) xcnt;
1597 struct scsi_ctrl_blk *scb = host->active;
1610 scb->next_state = 6;
1672 struct scsi_ctrl_blk *scb = host->active;
1674 if ((scb->flags & SCF_DIR) == SCF_DOUT)
1677 outl(scb->buflen, host->addr + TUL_SCnt0);
1680 if (scb->flags & SCF_SG) { /* S/G xfer */
1681 outl(((u32) scb->sglen) << 3, host->addr + TUL_XCntH);
1682 outl(scb->bufptr, host->addr + TUL_XAddH);
1685 outl(scb->buflen, host->addr + TUL_XCntH);
1686 outl(scb->bufptr, host->addr + TUL_XAddH);
1689 scb->next_state = 0x5;
1704 struct scsi_ctrl_blk *scb = host->active;
1706 if ((scb->flags & SCF_DIR) == SCF_DIN)
1709 outl(scb->buflen, host->addr + TUL_SCnt0);
1712 if (scb->flags & SCF_SG) { /* S/G xfer */
1713 outl(((u32) scb->sglen) << 3, host->addr + TUL_XCntH);
1714 outl(scb->bufptr, host->addr + TUL_XAddH);
1717 outl(scb->buflen, host->addr + TUL_XCntH);
1718 outl(scb->bufptr, host->addr + TUL_XAddH);
1722 scb->next_state = 0x5;
1728 struct scsi_ctrl_blk *scb = host->active;
1731 if ((scb->flags & SCF_DIR) != SCF_NO_DCHK)
1732 scb->hastat = HOST_DO_DU; /* over run */
1752 struct scsi_ctrl_blk *scb = host->active;
1755 if ((scb->flags & SCF_DIR) != SCF_NO_DCHK)
1756 scb->hastat = HOST_DO_DU; /* over run */
1777 struct scsi_ctrl_blk *scb = host->active;
1785 scb->tastat = inb(host->addr + TUL_SFifo);
1808 if ((scb->tastat & 0x18) == 0x10) /* No link support */
1817 if ((scb->tastat & 0x18) == 0x10)
1828 struct scsi_ctrl_blk *scb = host->active;
1830 if (scb != NULL) {
1831 if (scb->status & SCB_SELECT) { /* selection timeout */
1832 initio_unlink_pend_scb(host, scb);
1833 scb->hastat = HOST_SEL_TOUT;
1834 initio_append_done_scb(host, scb);
1836 initio_unlink_busy_scb(host, scb);
1837 scb->hastat = HOST_BUS_FREE;
1838 initio_append_done_scb(host, scb);
1862 struct scsi_ctrl_blk *scb;
1873 /* Abort all active & disconnected scb */
1874 while ((scb = initio_pop_busy_scb(host)) != NULL) {
1875 scb->hastat = HOST_BAD_PHAS;
1876 initio_append_done_scb(host, scb);
1898 struct scsi_ctrl_blk *scb;
1903 if ((scb = host->active) != NULL) {
1905 if (scb->status & SCB_SELECT) /* if waiting for selection complete */
1906 scb->status &= ~SCB_SELECT;
1946 scb = host->scb + tag;
1947 if (scb->target != tar || scb->lun != lun) {
1950 if (scb->status != SCB_BUSY) { /* 03/24/95 */
1953 host->active = scb;
1958 if ((scb = initio_find_busy_scb(host, tar | (lun << 8))) == NULL) {
1961 host->active = scb;
1980 struct scsi_ctrl_blk *scb;
1985 while ((scb = initio_pop_busy_scb(host)) != NULL) {
1986 scb->hastat = HOST_BAD_PHAS;
1987 initio_append_done_scb(host, scb);
2278 struct scsi_ctrl_blk *scb;
2286 while ((scb = initio_pop_busy_scb(host)) != NULL) {
2287 scb->hastat = HOST_BAD_PHAS;
2288 initio_append_done_scb(host, scb);
2304 static void initio_select_atn_stop(struct initio_host * host, struct scsi_ctrl_blk * scb)
2306 scb->status |= SCB_SELECT;
2307 scb->next_state = 0x1;
2308 host->active = scb;
2309 host->active_tc = &host->targets[scb->target];
2314 static void initio_select_atn(struct initio_host * host, struct scsi_ctrl_blk * scb)
2318 scb->status |= SCB_SELECT;
2319 scb->next_state = 0x2;
2321 outb(scb->ident, host->addr + TUL_SFifo);
2322 for (i = 0; i < (int) scb->cdblen; i++)
2323 outb(scb->cdb[i], host->addr + TUL_SFifo);
2324 host->active_tc = &host->targets[scb->target];
2325 host->active = scb;
2329 static void initio_select_atn3(struct initio_host * host, struct scsi_ctrl_blk * scb)
2333 scb->status |= SCB_SELECT;
2334 scb->next_state = 0x2;
2336 outb(scb->ident, host->addr + TUL_SFifo);
2337 outb(scb->tagmsg, host->addr + TUL_SFifo);
2338 outb(scb->tagid, host->addr + TUL_SFifo);
2339 for (i = 0; i < scb->cdblen; i++)
2340 outb(scb->cdb[i], host->addr + TUL_SFifo);
2341 host->active_tc = &host->targets[scb->target];
2342 host->active = scb;
2355 struct scsi_ctrl_blk *scb = host->active;
2363 initio_unlink_pend_scb(host, scb);
2364 initio_release_scb(host, scb);
2367 tar = scb->target; /* target */
2809 struct scsi_ctrl_blk *scb, *tmp, *prev = NULL /* silence gcc */;
2851 scb = kzalloc(i, GFP_KERNEL);
2852 if (scb)
2856 if (!scb) {
2867 host->scb = scb;
2868 host->next_pending = scb;
2869 host->next_avail = scb;
2870 for (i = 0, tmp = scb; i < num_scb; i++, tmp++) {
2878 host->first_avail = scb;
2913 kfree(host->scb);