Home | History | Annotate | Download | only in iscsi

Lines Matching defs:ccb

185  * CCB management functions
190 * Get a CCB for the SCSI operation, waiting if none is available.
193 * sess The session containing this CCB
194 * waitok Whether waiting for a CCB is OK
196 * Returns: The CCB.
202 ccb_t *ccb;
207 ccb = TAILQ_FIRST(&sess->s_ccb_pool);
209 DEB(100, ("get_ccb: ccb = %p, waitok = %d\n", ccb, waitok));
211 if (ccb != NULL) {
212 TAILQ_REMOVE(&sess->s_ccb_pool, ccb, ccb_chain);
223 if (ccb == NULL) {
228 ccb->ccb_flags = 0;
229 ccb->ccb_timedout = TOUT_NONE;
230 ccb->ccb_xs = NULL;
231 ccb->ccb_temp_data = NULL;
232 ccb->ccb_text_data = NULL;
233 ccb->ccb_status = ISCSI_STATUS_SUCCESS;
234 ccb->ccb_ITT = (ccb->ccb_ITT & 0xffffff);
235 ccb->ccb_disp = CCBDISP_NOWAIT;
236 ccb->ccb_connection = conn;
237 ccb->ccb_num_timeouts = 0;
243 "get_ccb: ccb = %p, usecount = %d\n",
244 ccb, conn->c_usecount));
246 return ccb;
251 * Put a CCB back onto the free list.
253 * Parameter: The CCB.
257 free_ccb(ccb_t *ccb)
259 session_t *sess = ccb->ccb_session;
260 connection_t *conn = ccb->ccb_connection;
264 "free_ccb: ccb = %p, usecount = %d\n",
265 ccb, conn->c_usecount-1));
267 KASSERT((ccb->ccb_flags & CCBF_WAITQUEUE) == 0);
269 ccb->ccb_connection = NULL;
274 if (ccb->ccb_disp > CCBDISP_NOWAIT) {
275 DEBOUT(("Freeing CCB with disp %d\n",ccb->ccb_disp));
278 ccb->ccb_disp = CCBDISP_UNUSED;
281 if (ccb->ccb_temp_data != NULL) {
282 free(ccb->ccb_temp_data, M_TEMP);
284 if (ccb->ccb_text_data != NULL) {
285 free(ccb->ccb_text_data, M_TEMP);
288 if ((pdu = ccb->ccb_pdu_waiting) != NULL) {
289 ccb->ccb_pdu_waiting = NULL;
300 TAILQ_INSERT_TAIL(&sess->s_ccb_pool, ccb, ccb_chain);
318 ccb_t *ccb;
323 for (i = 0, ccb = sess->s_ccb; i < CCBS_PER_SESSION; i++, ccb++) {
324 ccb->ccb_ITT = i | sid;
325 ccb->ccb_session = sess;
327 callout_init(&ccb->ccb_timeout, CALLOUT_MPSAFE);
328 callout_setfunc(&ccb->ccb_timeout, ccb_timeout_co, ccb);
330 DEB(9, ("Create_ccbs: ccb %p itt %x\n", ccb, ccb->ccb_ITT));
331 TAILQ_INSERT_HEAD(&sess->s_ccb_pool, ccb, ccb_chain);
346 ccb_t *ccb;
350 for (i = 0, ccb = sess->s_ccb; i < CCBS_PER_SESSION; i++, ccb++) {
352 callout_halt(&ccb->ccb_timeout, NULL);
353 callout_destroy(&ccb->ccb_timeout);
355 DEB(9, ("destroy_ccbs: ccb %p itt %x\n", ccb, ccb->ccb_ITT));
356 KASSERT((ccb->ccb_flags & CCBF_WAITQUEUE) == 0);
357 KASSERT(ccb->ccb_disp == CCBDISP_UNUSED);
358 KASSERT(ccb->ccb_connection == NULL);
359 TAILQ_REMOVE(&sess->s_ccb_pool, ccb, ccb_chain);
365 * Put CCB on wait queue
368 suspend_ccb(ccb_t *ccb, bool yes)
372 conn = ccb->ccb_connection;
378 KASSERT((ccb->ccb_flags & CCBF_WAITQUEUE) == 0);
379 TAILQ_INSERT_TAIL(&conn->c_ccbs_waiting, ccb, ccb_chain);
380 ccb->ccb_flags |= CCBF_WAITQUEUE;
381 } else if (ccb->ccb_flags & CCBF_WAITQUEUE) {
382 TAILQ_REMOVE(&conn->c_ccbs_waiting, ccb, ccb_chain);
383 ccb->ccb_flags &= ~CCBF_WAITQUEUE;
389 * Wake up (or dispose of) a CCB. Depending on the CCB's disposition,
391 * or just free the CCB for CCBDISP_FREE.
393 * Parameter: The CCB to handle and the new status of the CCB
397 wake_ccb(ccb_t *ccb, uint32_t status)
402 conn = ccb->ccb_connection;
405 DEBC(conn, 9, ("CCB %d done, ccb = %p, disp = %d\n",
406 ccb->ccb_CmdSN, ccb, ccb->ccb_disp));
408 ccb_timeout_stop(ccb);
411 disp = ccb->ccb_disp;
418 suspend_ccb(ccb, FALSE);
421 ccb->ccb_disp = CCBDISP_BUSY;
422 ccb->ccb_status = status;
434 iscsi_done(ccb);
437 free_ccb(ccb);
440 DEBC(conn, 1, ("CCB done, ccb = %p, invalid disposition %d", ccb, disp));
441 free_ccb(ccb);