Lines Matching refs:cm

113 xbd_cm_freeze(struct xbd_softc *sc, struct xbd_command *cm, xbdc_flag_t cm_flag)  in xbd_cm_freeze()  argument
115 if ((cm->cm_flags & XBDCF_FROZEN) != 0) in xbd_cm_freeze()
118 cm->cm_flags |= XBDCF_FROZEN|cm_flag; in xbd_cm_freeze()
123 xbd_cm_thaw(struct xbd_softc *sc, struct xbd_command *cm) in xbd_cm_thaw() argument
125 if ((cm->cm_flags & XBDCF_FROZEN) == 0) in xbd_cm_thaw()
128 cm->cm_flags &= ~XBDCF_FROZEN; in xbd_cm_thaw()
144 xbd_free_command(struct xbd_command *cm) in xbd_free_command() argument
147 KASSERT((cm->cm_flags & XBDCF_Q_MASK) == XBD_Q_NONE, in xbd_free_command()
149 cm->cm_flags & XBDCF_Q_MASK)); in xbd_free_command()
151 cm->cm_flags = XBDCF_INITIALIZER; in xbd_free_command()
152 cm->cm_bp = NULL; in xbd_free_command()
153 cm->cm_complete = NULL; in xbd_free_command()
154 xbd_enqueue_cm(cm, XBD_Q_FREE); in xbd_free_command()
155 xbd_thaw(cm->cm_sc, XBDF_CM_SHORTAGE); in xbd_free_command()
213 struct xbd_command *cm; in xbd_queue_cb() local
216 cm = arg; in xbd_queue_cb()
217 sc = cm->cm_sc; in xbd_queue_cb()
220 cm->cm_bp->bio_error = EIO; in xbd_queue_cb()
221 biodone(cm->cm_bp); in xbd_queue_cb()
222 xbd_free_command(cm); in xbd_queue_cb()
236 ring_req->id = cm->cm_id; in xbd_queue_cb()
237 ring_req->operation = cm->cm_operation; in xbd_queue_cb()
238 ring_req->sector_number = cm->cm_sector_number; in xbd_queue_cb()
241 cm->cm_nseg = nsegs; in xbd_queue_cb()
242 xbd_mksegarray(segs, nsegs, &cm->cm_gref_head, in xbd_queue_cb()
244 cm->cm_operation == BLKIF_OP_WRITE, in xbd_queue_cb()
245 cm->cm_sg_refs, ring_req->seg, in xbd_queue_cb()
254 ring_req->id = cm->cm_id; in xbd_queue_cb()
256 ring_req->indirect_op = cm->cm_operation; in xbd_queue_cb()
257 ring_req->sector_number = cm->cm_sector_number; in xbd_queue_cb()
260 cm->cm_nseg = nsegs; in xbd_queue_cb()
261 xbd_mksegarray(segs, nsegs, &cm->cm_gref_head, in xbd_queue_cb()
263 cm->cm_operation == BLKIF_OP_WRITE, in xbd_queue_cb()
264 cm->cm_sg_refs, cm->cm_indirectionpages, in xbd_queue_cb()
266 memcpy(ring_req->indirect_grefs, &cm->cm_indirectionrefs, in xbd_queue_cb()
270 if (cm->cm_operation == BLKIF_OP_READ) in xbd_queue_cb()
272 else if (cm->cm_operation == BLKIF_OP_WRITE) in xbd_queue_cb()
276 bus_dmamap_sync(sc->xbd_io_dmat, cm->cm_map, op); in xbd_queue_cb()
278 gnttab_free_grant_references(cm->cm_gref_head); in xbd_queue_cb()
280 xbd_enqueue_cm(cm, XBD_Q_BUSY); in xbd_queue_cb()
289 if ((cm->cm_flags & XBDCF_ASYNC_MAPPING) != 0) in xbd_queue_cb()
296 xbd_queue_request(struct xbd_softc *sc, struct xbd_command *cm) in xbd_queue_request() argument
300 if (cm->cm_bp != NULL) in xbd_queue_request()
301 error = bus_dmamap_load_bio(sc->xbd_io_dmat, cm->cm_map, in xbd_queue_request()
302 cm->cm_bp, xbd_queue_cb, cm, 0); in xbd_queue_request()
304 error = bus_dmamap_load(sc->xbd_io_dmat, cm->cm_map, in xbd_queue_request()
305 cm->cm_data, cm->cm_datalen, xbd_queue_cb, cm, 0); in xbd_queue_request()
313 xbd_cm_freeze(sc, cm, XBDCF_ASYNC_MAPPING); in xbd_queue_request()
337 struct xbd_command *cm; in xbd_bio_command() local
347 if ((cm = xbd_dequeue_cm(sc, XBD_Q_FREE)) == NULL) { in xbd_bio_command()
354 &cm->cm_gref_head) != 0) { in xbd_bio_command()
360 xbd_enqueue_cm(cm, XBD_Q_FREE); in xbd_bio_command()
364 cm->cm_bp = bp; in xbd_bio_command()
365 cm->cm_sector_number = in xbd_bio_command()
371 cm->cm_operation = BLKIF_OP_READ; in xbd_bio_command()
374 cm->cm_operation = BLKIF_OP_WRITE; in xbd_bio_command()
377 cm->cm_operation = BLKIF_OP_WRITE_BARRIER; in xbd_bio_command()
382 cm->cm_flags |= XBDCF_Q_FREEZE; in xbd_bio_command()
389 xbd_requeue_cm(cm, XBD_Q_READY); in xbd_bio_command()
397 cm->cm_operation = BLKIF_OP_FLUSH_DISKCACHE; in xbd_bio_command()
399 cm->cm_operation = BLKIF_OP_WRITE_BARRIER; in xbd_bio_command()
405 xbd_enqueue_cm(cm, XBD_Q_FREE); in xbd_bio_command()
409 return (cm); in xbd_bio_command()
422 struct xbd_command *cm; in xbd_startio() local
434 cm = xbd_dequeue_cm(sc, XBD_Q_READY); in xbd_startio()
436 if (cm == NULL) in xbd_startio()
437 cm = xbd_bio_command(sc); in xbd_startio()
439 if (cm == NULL) in xbd_startio()
442 if ((cm->cm_flags & XBDCF_Q_FREEZE) != 0) { in xbd_startio()
447 xbd_cm_freeze(sc, cm, XBDCF_Q_FREEZE); in xbd_startio()
450 if ((error = xbd_queue_request(sc, cm)) != 0) { in xbd_startio()
462 xbd_bio_complete(struct xbd_softc *sc, struct xbd_command *cm) in xbd_bio_complete() argument
466 bp = cm->cm_bp; in xbd_bio_complete()
468 if (__predict_false(cm->cm_status != BLKIF_RSP_OKAY)) { in xbd_bio_complete()
470 printf(" status: %x\n", cm->cm_status); in xbd_bio_complete()
479 xbd_free_command(cm); in xbd_bio_complete()
487 struct xbd_command *cm; in xbd_int() local
505 cm = &sc->xbd_shadow[bret->id]; in xbd_int()
507 xbd_remove_cm(cm, XBD_Q_BUSY); in xbd_int()
508 gnttab_end_foreign_access_references(cm->cm_nseg, in xbd_int()
509 cm->cm_sg_refs); in xbd_int()
512 if (cm->cm_operation == BLKIF_OP_READ) in xbd_int()
514 else if (cm->cm_operation == BLKIF_OP_WRITE || in xbd_int()
515 cm->cm_operation == BLKIF_OP_WRITE_BARRIER) in xbd_int()
519 bus_dmamap_sync(sc->xbd_io_dmat, cm->cm_map, op); in xbd_int()
520 bus_dmamap_unload(sc->xbd_io_dmat, cm->cm_map); in xbd_int()
526 xbd_cm_thaw(sc, cm); in xbd_int()
532 cm->cm_status = bret->status; in xbd_int()
533 if (cm->cm_bp) in xbd_int()
534 xbd_bio_complete(sc, cm); in xbd_int()
535 else if (cm->cm_complete != NULL) in xbd_int()
536 cm->cm_complete(cm); in xbd_int()
538 xbd_free_command(cm); in xbd_int()
591 xbd_dump_complete(struct xbd_command *cm) in xbd_dump_complete() argument
594 xbd_enqueue_cm(cm, XBD_Q_COMPLETE); in xbd_dump_complete()
602 struct xbd_command *cm; in xbd_dump() local
619 cm = xbd_dequeue_cm(sc, XBD_Q_FREE); in xbd_dump()
620 if (cm == NULL) { in xbd_dump()
627 &cm->cm_gref_head) != 0) { in xbd_dump()
628 xbd_free_command(cm); in xbd_dump()
636 cm->cm_data = virtual; in xbd_dump()
637 cm->cm_datalen = chunk; in xbd_dump()
638 cm->cm_operation = BLKIF_OP_WRITE; in xbd_dump()
639 cm->cm_sector_number = offset >> XBD_SECTOR_SHFT; in xbd_dump()
640 cm->cm_complete = xbd_dump_complete; in xbd_dump()
642 xbd_enqueue_cm(cm, XBD_Q_READY); in xbd_dump()
657 while ((cm = xbd_dequeue_cm(sc, XBD_Q_COMPLETE)) != NULL) { in xbd_dump()
658 if (cm->cm_status != BLKIF_RSP_OKAY) { in xbd_dump()
661 cm->cm_sector_number); in xbd_dump()
664 xbd_free_command(cm); in xbd_dump()
1072 struct xbd_command *cm; in xbd_free() local
1074 cm = &sc->xbd_shadow[i]; in xbd_free()
1075 if (cm->cm_sg_refs != NULL) { in xbd_free()
1076 free(cm->cm_sg_refs, M_XENBLOCKFRONT); in xbd_free()
1077 cm->cm_sg_refs = NULL; in xbd_free()
1080 if (cm->cm_indirectionpages != NULL) { in xbd_free()
1083 &cm->cm_indirectionrefs[0]); in xbd_free()
1084 free(cm->cm_indirectionpages, M_XENBLOCKFRONT); in xbd_free()
1085 cm->cm_indirectionpages = NULL; in xbd_free()
1088 bus_dmamap_destroy(sc->xbd_io_dmat, cm->cm_map); in xbd_free()
1358 struct xbd_command *cm; in xbd_connect() local
1361 cm = &sc->xbd_shadow[i]; in xbd_connect()
1362 cm->cm_sg_refs = malloc( in xbd_connect()
1365 if (cm->cm_sg_refs == NULL) in xbd_connect()
1367 cm->cm_id = i; in xbd_connect()
1368 cm->cm_flags = XBDCF_INITIALIZER; in xbd_connect()
1369 cm->cm_sc = sc; in xbd_connect()
1370 if (bus_dmamap_create(sc->xbd_io_dmat, 0, &cm->cm_map) != 0) in xbd_connect()
1387 &cm->cm_indirectionrefs[j])) in xbd_connect()
1394 cm->cm_indirectionpages = indirectpages; in xbd_connect()
1395 xbd_free_command(cm); in xbd_connect()