Lines Matching refs:qcb

62 static void ida_done(struct ida_softc *ida, struct ida_qcb *qcb);
67 static int ida_wait(struct ida_softc *ida, struct ida_qcb *qcb);
136 struct ida_qcb *qcb;
138 if ((qcb = SLIST_FIRST(&ida->free_qcbs)) != NULL) {
140 bzero(qcb->hwqcb, sizeof(struct ida_hdr) + sizeof(struct ida_req));
142 return (qcb);
146 ida_free_qcb(struct ida_softc *ida, struct ida_qcb *qcb)
149 qcb->state = QCB_FREE;
150 qcb->buf = NULL;
151 qcb->error = 0;
152 SLIST_INSERT_HEAD(&ida->free_qcbs, qcb, link.sle);
169 return (hwqcb->qcb);
175 struct ida_qcb *qcb;
179 qcb = &ida->qcbs[i];
181 error = bus_dmamap_create(ida->buffer_dmat, /*flags*/0, &qcb->dmamap);
185 qcb->ida = ida;
186 qcb->flags = QCB_FREE;
187 qcb->hwqcb = &ida->hwqcbs[i];
188 qcb->hwqcb->qcb = qcb;
189 qcb->hwqcb_busaddr = idahwqcbvtop(ida, qcb->hwqcb);
190 SLIST_INSERT_HEAD(&ida->free_qcbs, qcb, link.sle);
377 struct ida_qcb *qcb;
381 qcb = arg;
382 ida = qcb->ida;
386 qcb->error = error;
387 ida_done(ida, qcb);
391 hwqcb = qcb->hwqcb;
400 if (qcb->flags & DMA_DATA_TRANSFER) {
401 switch (qcb->flags & DMA_DATA_TRANSFER) {
409 KASSERT((qcb->flags & DMA_DATA_TRANSFER) ==
414 bus_dmamap_sync(ida->buffer_dmat, qcb->dmamap, op);
419 STAILQ_INSERT_TAIL(&ida->qcb_queue, qcb, link.stqe);
425 ida_map_qcb(struct ida_softc *ida, struct ida_qcb *qcb, void *data,
434 error = bus_dmamap_load(ida->buffer_dmat, qcb->dmamap, data, datasize,
435 ida_data_cb, qcb, flags);
448 struct ida_qcb *qcb;
453 qcb = ida_get_qcb(ida);
455 if (qcb == NULL) {
460 qcb->flags = flags | IDA_COMMAND;
461 hwqcb = qcb->hwqcb;
467 error = ida_map_qcb(ida, qcb, data, datasize);
469 error = ida_wait(ida, qcb);
473 error = qcb->error;
479 ida_free_qcb(ida, qcb);
496 struct ida_qcb *qcb;
509 qcb = ida_get_qcb(ida);
510 if (qcb == NULL)
514 qcb->buf = bp;
515 qcb->flags = bp->bio_cmd == BIO_READ ? DMA_DATA_IN : DMA_DATA_OUT;
517 hwqcb = qcb->hwqcb;
524 error = ida_map_qcb(ida, qcb, bp->bio_data, bp->bio_bcount);
526 qcb->error = error;
527 ida_done(ida, qcb);
535 struct ida_qcb *qcb;
539 while ((qcb = STAILQ_FIRST(&ida->qcb_queue)) != NULL) {
545 * place the qcb on an active list?
553 qcb->state = QCB_ACTIVE;
554 ida->cmd.submit(ida, qcb);
559 ida_wait(struct ida_softc *ida, struct ida_qcb *qcb)
568 if (mtx_sleep(qcb, &ida->lock, PRIBIO, "idacmd", 5 * hz)) {
569 qcb->state = QCB_TIMEDOUT;
579 qcb->state = QCB_TIMEDOUT;
586 if (qcb_done != qcb)
588 ida_done(ida, qcb);
596 struct ida_qcb *qcb;
608 qcb = idahwqcbptov(ida, completed & ~3);
610 if (qcb == NULL || qcb->state != QCB_ACTIVE) {
616 if ((completed & 3) && (qcb->hwqcb->req.error == 0))
617 qcb->hwqcb->req.error = CMD_REJECTED;
618 ida_done(ida, qcb);
628 ida_done(struct ida_softc *ida, struct ida_qcb *qcb)
638 active = (qcb->state != QCB_FREE);
639 if (qcb->flags & DMA_DATA_TRANSFER && active) {
640 switch (qcb->flags & DMA_DATA_TRANSFER) {
648 KASSERT((qcb->flags & DMA_DATA_TRANSFER) ==
653 bus_dmamap_sync(ida->buffer_dmat, qcb->dmamap, op);
654 bus_dmamap_unload(ida->buffer_dmat, qcb->dmamap);
660 if (qcb->hwqcb->req.error & SOFT_ERROR) {
661 if (qcb->buf)
663 qcb->buf->bio_cmd == BIO_READ ?
668 if (qcb->hwqcb->req.error & HARD_ERROR) {
670 if (qcb->buf)
672 qcb->buf->bio_cmd == BIO_READ ?
677 if (qcb->hwqcb->req.error & CMD_REJECTED) {
681 if (qcb->error) {
683 device_printf(ida->dev, "request failed to map: %d\n", qcb->error);
686 if (qcb->flags & IDA_COMMAND) {
688 wakeup(qcb);
689 if (qcb->state == QCB_TIMEDOUT)
690 ida_free_qcb(ida, qcb);
692 KASSERT(qcb->buf != NULL, ("ida_done(): qcb->buf is NULL!"));
694 qcb->buf->bio_flags |= BIO_ERROR;
695 idad_intr(qcb->buf);
696 ida_free_qcb(ida, qcb);