Home | History | Annotate | Download | only in iscsi

Lines Matching defs:ccb

149 	ccb_t *ccb;
188 while ((ccb = TAILQ_FIRST(&oldconn->c_ccbs_waiting)) != NULL) {
189 suspend_ccb(ccb, FALSE);
190 TAILQ_INSERT_TAIL(&old_waiting, ccb, ccb_chain);
201 while ((ccb = TAILQ_FIRST(&old_waiting)) != NULL) {
209 TAILQ_REMOVE(&old_waiting, ccb, ccb_chain);
211 /* adjust CCB and clone PDU for new connection */
213 opdu = ccb->ccb_pdu_waiting;
237 /* link new PDU into old CCB */
238 ccb->ccb_pdu_waiting = pdu;
239 /* link new CCB into new connection */
240 ccb->ccb_connection = conn;
242 ccb->ccb_num_timeouts = 0;
244 DEBC(conn, 1, ("CCB %p: Copied PDU %p to %p\n",
245 ccb, opdu, pdu));
261 /* put ready CCB into waiting list of new connection */
262 suspend_ccb(ccb, TRUE);
274 while ((ccb = TAILQ_FIRST(&old_waiting)) != NULL) {
275 TAILQ_REMOVE(&old_waiting, ccb, ccb_chain);
277 DEBC(oldconn, 1, ("Wake CCB %p for connection %d, terminating %d\n",
278 ccb, ccb->ccb_connection->c_id, oldconn->c_terminating));
280 suspend_ccb(ccb, TRUE);
282 wake_ccb(ccb, oldconn->c_terminating);
288 TAILQ_FOREACH(ccb, &conn->c_ccbs_waiting, ccb_chain) {
290 rc = send_task_management(conn, ccb, NULL, TASK_REASSIGN);
295 if (ccb->ccb_CmdSN < sess->s_ExpCmdSN) {
296 pdu = ccb->ccb_pdu_waiting;
301 ccb->ccb_CmdSN, sn));
302 ccb->ccb_CmdSN = sn;
303 pdu->pdu_hdr.pduh_p.command.CmdSN = htonl(ccb->ccb_CmdSN);
306 resend_pdu(ccb);
308 ccb_timeout_start(ccb, COMMAND_TIMEOUT);
310 DEBC(conn, 1, ("Reassign ccb %p, no_tm=%d, rc=%d\n",
311 ccb, no_tm, rc));
330 ccb_t *ccb, *nccb;
395 TAILQ_FOREACH_SAFE(ccb, &conn->c_ccbs_waiting, ccb_chain, nccb) {
396 if (!(ccb->ccb_flags & CCBF_REASSIGN) || ccb->ccb_pdu_waiting == NULL) {
397 DEBC(conn, 1, ("Terminating CCB %p (t=%p)\n",
398 ccb,&ccb->ccb_timeout));
399 wake_ccb(ccb, conn->c_terminating);
401 ccb_timeout_stop(ccb);
402 ccb->ccb_num_timeouts = 0;
412 /* if it's not attached to a waiting CCB, free it */
452 while ((ccb = TAILQ_FIRST(&conn->c_ccbs_waiting)) != NULL) {
453 KASSERT(ccb->ccb_disp >= CCBDISP_NOWAIT);
454 wake_ccb(ccb, conn->c_terminating);
455 /* NOTE: wake_ccb will remove the CCB from the queue */
470 * the disposition of its associated CCB.
473 * ccb The associated CCB. May be NULL if cdisp is CCBDISP_NOWAIT
475 * cdisp The CCB's disposition
481 send_pdu(ccb_t *ccb, pdu_t *pdu, ccb_disp_t cdisp, pdu_disp_t pdisp)
486 if (ccb != NULL) {
487 prev_cdisp = ccb->ccb_disp;
488 pdu->pdu_hdr.pduh_InitiatorTaskTag = ccb->ccb_ITT;
489 pdu->pdu_owner = ccb;
491 ccb->ccb_disp = cdisp;
496 DEBC(conn, 10, ("Send_pdu: CmdSN=%u ExpStatSN~%u ccb=%p, pdu=%p\n",
499 ccb, pdu));
503 KASSERT(ccb != NULL);
505 ccb->ccb_pdu_waiting = pdu;
524 KASSERT(ccb != NULL);
525 KASSERTMSG(ccb->ccb_connection == conn, "conn mismatch %p != %p\n", ccb->ccb_connection, conn);
528 suspend_ccb(ccb, TRUE);
531 ccb_timeout_start(ccb, COMMAND_TIMEOUT);
534 while (ccb->ccb_disp == CCBDISP_WAIT) {
535 DEBC(conn, 15, ("Send_pdu: ccb=%p cdisp=%d waiting\n",
536 ccb, ccb->ccb_disp));
538 DEBC(conn, 15, ("Send_pdu: ccb=%p cdisp=%d returned\n",
539 ccb, ccb->ccb_disp));
552 * ccb The associated CCB.
556 resend_pdu(ccb_t *ccb)
558 connection_t *conn = ccb->ccb_connection;
559 pdu_t *pdu = ccb->ccb_pdu_waiting;
573 DEBC(conn, 8, ("ReSend_pdu: CmdSN=%u ExpStatSN~%u ccb=%p, pdu=%p\n",
576 ccb, pdu));
590 ccb_timeout_start(ccb, COMMAND_TIMEOUT);
666 * ccb The CCB
671 init_login_pdu(connection_t *conn, ccb_t *ccb, pdu_t *ppdu, bool next)
680 ccb->ccb_CmdSN = get_sernum(conn->c_session, ppdu);
698 hpdu->pduh_p.login_req.CmdSN = htonl(ccb->ccb_CmdSN);
709 * tx_ccb The originally sent login CCB
806 * ccb The transmit CCB
812 init_text_pdu(connection_t *conn, ccb_t *ccb, pdu_t *ppdu, pdu_t *rx_pdu)
820 ccb->ccb_CmdSN = get_sernum(conn->c_session, ppdu);
830 hpdu->pduh_p.text_req.CmdSN = htonl(ccb->ccb_CmdSN);
841 * tx_ccb The originally sent login/text request CCB
876 ccb_t *ccb;
878 ccb = get_ccb(conn, TRUE);
879 if (ccb == NULL)
883 free_ccb(ccb);
887 if (init_text_parameters(conn, ccb)) {
888 free_ccb(ccb);
893 init_text_pdu(conn, ccb, pdu, NULL);
895 send_pdu(ccb, pdu, CCBDISP_FREE, PDUDISP_WAIT);
906 * tx_ccb The original CCB
921 /* transfer ownership of text to CCB */
966 ccb_t *ccb;
978 ccb = get_ccb(conn, TRUE);
979 if (ccb == NULL)
983 free_ccb(ccb);
987 ccb->ccb_flags |= CCBF_SENDTARGET;
990 free_ccb(ccb);
995 init_text_pdu(conn, ccb, pdu, NULL);
998 send_pdu(ccb, pdu, CCBDISP_WAIT, PDUDISP_WAIT);
1000 rc = ccb->ccb_status;
1003 sess->s_target_list = ccb->ccb_text_data;
1004 sess->s_target_list_len = ccb->ccb_text_len;
1005 ccb->ccb_text_data = NULL;
1007 free_ccb(ccb);
1027 ccb_t *ccb;
1033 ccb = NULL;
1038 ccb = get_ccb(conn, FALSE);
1039 if (ccb == NULL) {
1040 DEBOUT(("Can't get CCB in send_nop_out\n"));
1045 free_ccb(ccb);
1070 ccb->ccb_CmdSN = sn;
1077 send_pdu(ccb, ppdu, (rx_pdu != NULL) ? CCBDISP_NOWAIT : CCBDISP_FREE,
1089 * ccb The task's CCB (for Data NAK only)
1096 snack_missing(connection_t *conn, ccb_t *ccb, uint8_t type,
1109 hpdu->pduh_InitiatorTaskTag = (type == SNACK_DATA_NAK) ? ccb->ccb_ITT : 0xffffffff;
1128 * tx_ccb The original command CCB (required for Data ACK only)
1198 ccb_t *ccb;
1203 ccb = get_ccb(conn, TRUE);
1205 if (ccb == NULL)
1209 free_ccb(ccb);
1213 if ((rc = assemble_login_parameters(conn, ccb, pdu)) <= 0) {
1214 init_login_pdu(conn, ccb, pdu, !rc);
1216 send_pdu(ccb, pdu, CCBDISP_WAIT, PDUDISP_FREE);
1217 rc = ccb->ccb_status;
1221 free_ccb(ccb);
1244 ccb_t *ccb;
1249 ccb = get_ccb(conn, TRUE);
1251 if (ccb == NULL)
1255 free_ccb(ccb);
1263 ccb->ccb_CmdSN = conn->c_session->s_CmdSN;
1264 ccb->ccb_CmdSN);
1268 ccb->ccb_par = refconn;
1270 ccb->ccb_flags |= CCBF_OTHERCONN;
1277 send_pdu(ccb, ppdu, (wait) ? CCBDISP_WAIT : CCBDISP_FREE, PDUDISP_FREE);
1280 int rc = ccb->ccb_status;
1281 free_ccb (ccb);
1305 ccb_t *ccb;
1315 ccb = get_ccb(conn, xs == NULL);
1317 if (ccb == NULL) {
1318 DEBC(conn, 0, ("send_task_management, ref_ccb=%p, xs=%p, term=%d. No CCB\n",
1326 free_ccb(ccb);
1330 ccb->ccb_xs = xs;
1336 ccb->ccb_CmdSN = conn->c_session->s_CmdSN;
1337 hpdu->pduh_p.task_req.CmdSN = htonl(ccb->ccb_CmdSN);
1349 send_pdu(ccb, ppdu, (xs) ? CCBDISP_SCSIPI : CCBDISP_WAIT, PDUDISP_FREE);
1352 int rc = ccb->ccb_status;
1353 free_ccb(ccb);
1367 * tx_ccb The originally sent command CCB
1436 * CCB The CCB
1437 * disp The CCB disposition
1441 send_command(ccb_t *ccb, ccb_disp_t disp, bool waitok, bool immed)
1444 connection_t *conn = ccb->ccb_connection;
1445 session_t *sess = ccb->ccb_session;
1452 ccb->ccb_disp = disp;
1453 wake_ccb(ccb, ISCSI_STATUS_QUEUE_FULL);
1460 DEBOUT(("Invalid connection for send_command, ccb = %p\n",ccb));
1461 ccb->ccb_disp = disp;
1462 wake_ccb(ccb, ISCSI_STATUS_TARGET_BUSY);
1468 DEBOUT(("No PDU for send_command, ccb = %p\n",ccb));
1469 ccb->ccb_disp = disp;
1470 wake_ccb(ccb, ISCSI_STATUS_NO_RESOURCES);
1474 totlen = len = ccb->ccb_data_len;
1477 hpdu->pduh_LUN = htonq(ccb->ccb_lun);
1478 memcpy(hpdu->pduh_p.command.SCSI_CDB, ccb->ccb_cmd, ccb->ccb_cmdlen);
1485 if (ccb->ccb_data_in) {
1499 hpdu->pduh_Flags |= ccb->ccb_tag;
1501 if (ccb->ccb_data_in)
1502 init_sernum(&ccb->ccb_DataSN_buf);
1504 ccb->ccb_sense_len_got = 0;
1505 ccb->ccb_xfer_len = 0;
1506 ccb->ccb_residual = 0;
1507 ccb->ccb_flags |= CCBF_REASSIGN;
1510 ccb->ccb_CmdSN = get_sernum(sess, ppdu);
1513 hpdu->pduh_p.command.CmdSN = htonl(ccb->ccb_CmdSN);
1516 ccb->ccb_CmdSN, sess->s_MaxCmdSN, ccb->ccb_data_in, len, totlen));
1518 setup_tx_uio(ppdu, len, ccb->ccb_data_ptr, ccb->ccb_data_in);
1519 send_pdu(ccb, ppdu, (totlen) ? CCBDISP_DEFER : disp, PDUDISP_WAIT);
1522 send_data_out(conn, NULL, ccb, disp, waitok);
1538 ccb_t *ccb;
1571 ccb = get_ccb(conn, waitok);
1572 if (ccb == NULL) {
1574 DEBC(conn, 5, ("No CCB in run_xfer, %d in use.\n", conn->c_usecount));
1579 /* copy parameters into CCB for easier access */
1580 ccb->ccb_xs = xs;
1582 ccb->ccb_data_in = (xs->xs_control & XS_CTL_DATA_IN) != 0;
1583 ccb->ccb_data_len = (uint32_t) xs->datalen;
1584 ccb->ccb_data_ptr = xs->data;
1586 ccb->ccb_sense_len_req = sizeof(xs->sense.scsi_sense);
1587 ccb->ccb_sense_ptr = &xs->sense;
1589 ccb->ccb_lun = ((uint64_t) (uint8_t) xs->xs_periph->periph_lun) << 48;
1590 ccb->ccb_cmd = (uint8_t *) xs->cmd;
1591 ccb->ccb_cmdlen = xs->cmdlen;
1593 xs->xs_periph->periph_lun, ccb->ccb_cmd[1], xs->cmdlen));
1595 ccb->ccb_ITT |= xs->xs_tag_id << 24;
1598 ccb->ccb_tag = ATTR_ORDERED;
1601 ccb->ccb_tag = ATTR_SIMPLE;
1604 ccb->ccb_tag = ATTR_HEAD_OF_QUEUE;
1607 ccb->ccb_tag = 0;
1612 ccb->ccb_lun += 0x1000000000000LL;
1613 ccb->ccb_cmd[1] += 0x10;
1615 send_command(ccb, CCBDISP_SCSIPI, waitok, FALSE);
1636 ccb_t *ccb;
1652 ccb = get_ccb(conn, TRUE);
1653 if (ccb == NULL) {
1654 DEBOUT(("No CCB in io_command\n"));
1658 ccb->ccb_data_in = (req->flags & SCCMD_READ) != 0;
1659 ccb->ccb_data_len = (uint32_t) req->datalen;
1660 ccb->ccb_data_ptr = req->databuf;
1662 ccb->ccb_sense_len_req = req->senselen;
1663 ccb->ccb_sense_ptr = &req->sense;
1665 ccb->ccb_lun = lun;
1666 ccb->ccb_cmd = (uint8_t *) req->cmd;
1667 ccb->ccb_cmdlen = req->cmdlen;
1669 ccb->ccb_cmd[1], ccb->ccb_cmdlen));
1671 send_command(ccb, CCBDISP_WAIT, TRUE, immed);
1673 rc = ccb->ccb_status;
1675 req->senselen_used = ccb->ccb_sense_len_got;
1676 req->datalen_used = req->datalen - ccb->ccb_residual;
1678 free_ccb(ccb);
1718 * ccb The CCB
1722 ccb_timeout(ccb_t *ccb)
1724 connection_t *conn = ccb->ccb_connection;
1728 printf("ccb_timeout: num=%d total=%d disp=%d invalid ccb=%p\n",
1729 ccb->ccb_num_timeouts+1, ccb->ccb_total_tries,
1730 ccb->ccb_disp, ccb);
1734 ccb->ccb_total_tries++;
1737 ccb->ccb_num_timeouts+1, ccb->ccb_total_tries, ccb->ccb_disp));
1739 if (++ccb->ccb_num_timeouts > MAX_CCB_TIMEOUTS ||
1740 ccb->ccb_total_tries > MAX_CCB_TRIES ||
1741 ccb->ccb_disp <= CCBDISP_FREE ||
1742 !ccb->ccb_session->s_ErrorRecoveryLevel) {
1744 wake_ccb(ccb, ISCSI_STATUS_TIMEOUT);
1748 if (ccb->ccb_data_in && ccb->ccb_xfer_len < ccb->ccb_data_len) {
1750 snack_missing(conn, ccb, SNACK_DATA_NAK, 0, 0);
1755 ccb_timeout_start(ccb, COMMAND_TIMEOUT);