Lines Matching defs:ida

58 #include <dev/ida/idareg.h>
59 #include <dev/ida/idavar.h>
60 #include <dev/ida/idaio.h>
63 static int ida_alloc_qcbs(struct ida_softc *ida);
64 static void ida_done(struct ida_softc *ida, struct ida_qcb *qcb);
65 static void ida_start(struct ida_softc *ida);
66 static void ida_startio(struct ida_softc *ida);
69 static int ida_wait(struct ida_softc *ida, struct ida_qcb *qcb);
75 .d_name = "ida",
79 ida_free(struct ida_softc *ida)
83 if (ida->ih != NULL)
84 bus_teardown_intr(ida->dev, ida->irq, ida->ih);
86 mtx_lock(&ida->lock);
87 callout_stop(&ida->ch);
88 mtx_unlock(&ida->lock);
89 callout_drain(&ida->ch);
91 if (ida->buffer_dmat) {
93 bus_dmamap_destroy(ida->buffer_dmat, ida->qcbs[i].dmamap);
94 bus_dma_tag_destroy(ida->buffer_dmat);
97 if (ida->hwqcb_dmat) {
98 if (ida->hwqcb_busaddr)
99 bus_dmamap_unload(ida->hwqcb_dmat, ida->hwqcb_dmamap);
100 if (ida->hwqcbs)
101 bus_dmamem_free(ida->hwqcb_dmat, ida->hwqcbs,
102 ida->hwqcb_dmamap);
103 bus_dma_tag_destroy(ida->hwqcb_dmat);
106 if (ida->qcbs != NULL)
107 free(ida->qcbs, M_DEVBUF);
109 if (ida->irq != NULL)
110 bus_release_resource(ida->dev, ida->irq_res_type,
111 0, ida->irq);
113 if (ida->parent_dmat != NULL)
114 bus_dma_tag_destroy(ida->parent_dmat);
116 if (ida->regs != NULL)
117 bus_release_resource(ida->dev, ida->regs_res_type,
118 ida->regs_res_id, ida->regs);
120 mtx_destroy(&ida->lock);
136 ida_get_qcb(struct ida_softc *ida)
140 if ((qcb = SLIST_FIRST(&ida->free_qcbs)) != NULL) {
141 SLIST_REMOVE_HEAD(&ida->free_qcbs, link.sle);
148 ida_free_qcb(struct ida_softc *ida, struct ida_qcb *qcb)
154 SLIST_INSERT_HEAD(&ida->free_qcbs, qcb, link.sle);
158 idahwqcbvtop(struct ida_softc *ida, struct ida_hardware_qcb *hwqcb)
160 return (ida->hwqcb_busaddr +
161 ((bus_addr_t)hwqcb - (bus_addr_t)ida->hwqcbs));
165 idahwqcbptov(struct ida_softc *ida, bus_addr_t hwqcb_addr)
170 ((bus_addr_t)ida->hwqcbs + (hwqcb_addr - ida->hwqcb_busaddr));
175 ida_alloc_qcbs(struct ida_softc *ida)
181 qcb = &ida->qcbs[i];
183 error = bus_dmamap_create(ida->buffer_dmat, /*flags*/0, &qcb->dmamap);
187 qcb->ida = ida;
189 qcb->hwqcb = &ida->hwqcbs[i];
191 qcb->hwqcb_busaddr = idahwqcbvtop(ida, qcb->hwqcb);
192 SLIST_INSERT_HEAD(&ida->free_qcbs, qcb, link.sle);
198 ida_setup(struct ida_softc *ida)
204 SLIST_INIT(&ida->free_qcbs);
205 STAILQ_INIT(&ida->qcb_queue);
206 bioq_init(&ida->bio_queue);
208 ida->qcbs = (struct ida_qcb *)
211 if (ida->qcbs == NULL)
220 /* parent */ ida->parent_dmat,
233 &ida->hwqcb_dmat);
239 /* parent */ ida->parent_dmat,
252 &ida->buffer_dmat);
258 error = bus_dmamem_alloc(ida->hwqcb_dmat,
259 (void **)&ida->hwqcbs, BUS_DMA_NOWAIT, &ida->hwqcb_dmamap);
264 bus_dmamap_load(ida->hwqcb_dmat, ida->hwqcb_dmamap,
265 ida->hwqcbs, IDA_QCB_MAX * sizeof(struct ida_hardware_qcb),
266 ida_dma_map_cb, &ida->hwqcb_busaddr, /*flags*/0);
268 bzero(ida->hwqcbs, IDA_QCB_MAX * sizeof(struct ida_hardware_qcb));
270 error = ida_alloc_qcbs(ida);
274 mtx_lock(&ida->lock);
275 ida->cmd.int_enable(ida, 0);
277 error = ida_command(ida, CMD_GET_CTRL_INFO, &cinfo, sizeof(cinfo),
280 mtx_unlock(&ida->lock);
281 device_printf(ida->dev, "CMD_GET_CTRL_INFO failed.\n");
285 device_printf(ida->dev, "drives=%d firm_rev=%c%c%c%c\n",
289 if (ida->flags & IDA_FIRMWARE) {
292 error = ida_command(ida, CMD_START_FIRMWARE,
295 mtx_unlock(&ida->lock);
296 device_printf(ida->dev, "CMD_START_FIRMWARE failed.\n");
301 ida->cmd.int_enable(ida, 1);
302 ida->flags |= IDA_ATTACHED;
303 mtx_unlock(&ida->lock);
306 child = device_add_child(ida->dev, /*"idad"*/NULL, -1);
311 ida->ich.ich_func = ida_startup;
312 ida->ich.ich_arg = ida;
313 if (config_intrhook_establish(&ida->ich) != 0) {
314 device_delete_children(ida->dev);
315 device_printf(ida->dev, "Cannot establish configuration hook\n");
319 unit = device_get_unit(ida->dev);
320 ida->ida_dev_t = make_dev(&ida_cdevsw, unit,
322 "ida%d", unit);
323 ida->ida_dev_t->si_drv1 = ida;
331 struct ida_softc *ida;
333 ida = arg;
335 config_intrhook_disestablish(&ida->ich);
338 bus_generic_attach(ida->dev);
345 struct ida_softc *ida;
348 ida = (struct ida_softc *)device_get_softc(dev);
369 destroy_dev(ida->ida_dev_t);
370 ida_free(ida);
378 struct ida_softc *ida;
384 ida = qcb->ida;
386 mtx_assert(&ida->lock, MA_OWNED);
389 ida_done(ida, qcb);
416 bus_dmamap_sync(ida->buffer_dmat, qcb->dmamap, op);
418 bus_dmamap_sync(ida->hwqcb_dmat, ida->hwqcb_dmamap,
421 STAILQ_INSERT_TAIL(&ida->qcb_queue, qcb, link.stqe);
422 ida_start(ida);
423 ida->flags &= ~IDA_QFROZEN;
427 ida_map_qcb(struct ida_softc *ida, struct ida_qcb *qcb, void *data,
432 if (ida->flags & IDA_INTERRUPTS)
436 error = bus_dmamap_load(ida->buffer_dmat, qcb->dmamap, data, datasize,
439 ida->flags |= IDA_QFROZEN;
446 ida_command(struct ida_softc *ida, int command, void *data, int datasize,
454 mtx_assert(&ida->lock, MA_OWNED);
455 qcb = ida_get_qcb(ida);
458 device_printf(ida->dev, "out of QCBs\n");
469 error = ida_map_qcb(ida, qcb, data, datasize);
471 error = ida_wait(ida, qcb);
481 ida_free_qcb(ida, qcb);
486 ida_submit_buf(struct ida_softc *ida, struct bio *bp)
488 mtx_lock(&ida->lock);
489 bioq_insert_tail(&ida->bio_queue, bp);
490 ida_startio(ida);
491 mtx_unlock(&ida->lock);
495 ida_startio(struct ida_softc *ida)
503 mtx_assert(&ida->lock, MA_OWNED);
505 if (ida->flags & IDA_QFROZEN)
507 bp = bioq_first(&ida->bio_queue);
511 qcb = ida_get_qcb(ida);
515 bioq_remove(&ida->bio_queue, bp);
526 error = ida_map_qcb(ida, qcb, bp->bio_data, bp->bio_bcount);
529 ida_done(ida, qcb);
535 ida_start(struct ida_softc *ida)
540 mtx_assert(&ida->lock, MA_OWNED);
541 while ((qcb = STAILQ_FIRST(&ida->qcb_queue)) != NULL) {
542 if (ida->cmd.fifo_full(ida))
544 STAILQ_REMOVE_HEAD(&ida->qcb_queue, link.stqe);
551 if (!ida->qactive && !dumping)
552 callout_reset(&ida->ch, hz * 5, ida_timeout, ida);
553 ida->qactive++;
556 ida->cmd.submit(ida, qcb);
561 ida_wait(struct ida_softc *ida, struct ida_qcb *qcb)
568 mtx_assert(&ida->lock, MA_OWNED);
569 if (ida->flags & IDA_INTERRUPTS) {
570 if (mtx_sleep(qcb, &ida->lock, PRIBIO, "idacmd", 5 * hz)) {
579 while ((completed = ida->cmd.done(ida)) == 0) {
587 qcb_done = idahwqcbptov(ida, completed & ~3);
590 ida_done(ida, qcb);
597 struct ida_softc *ida;
601 ida = (struct ida_softc *)data;
603 mtx_lock(&ida->lock);
604 if (ida->cmd.int_pending(ida) == 0) {
605 mtx_unlock(&ida->lock);
609 while ((completed = ida->cmd.done(ida)) != 0) {
610 qcb = idahwqcbptov(ida, completed & ~3);
613 device_printf(ida->dev,
620 ida_done(ida, qcb);
622 ida_startio(ida);
623 mtx_unlock(&ida->lock);
630 ida_done(struct ida_softc *ida, struct ida_qcb *qcb)
639 mtx_assert(&ida->lock, MA_OWNED);
655 bus_dmamap_sync(ida->buffer_dmat, qcb->dmamap, op);
656 bus_dmamap_unload(ida->buffer_dmat, qcb->dmamap);
659 bus_dmamap_sync(ida->hwqcb_dmat, ida->hwqcb_dmamap,
664 device_printf(ida->dev, "soft %s error\n",
668 device_printf(ida->dev, "soft error\n");
673 device_printf(ida->dev, "hard %s error\n",
677 device_printf(ida->dev, "hard error\n");
681 device_printf(ida->dev, "invalid request\n");
685 device_printf(ida->dev, "request failed to map: %d\n", qcb->error);
689 if (ida->flags & IDA_INTERRUPTS)
692 ida_free_qcb(ida, qcb);
698 ida_free_qcb(ida, qcb);
704 ida->qactive--;
706 if (ida->qactive)
707 callout_reset(&ida->ch, hz * 5, ida_timeout, ida);
709 callout_stop(&ida->ch);
715 struct ida_softc *ida;
717 ida = (struct ida_softc *)arg;
718 device_printf(ida->dev, "%s() qactive %d\n", __func__, ida->qactive);
720 if (ida->flags & IDA_INTERRUPTS)
721 device_printf(ida->dev, "IDA_INTERRUPTS\n");
723 device_printf(ida->dev, "\t R_CMD_FIFO: %08x\n"
728 ida_inl(ida, R_CMD_FIFO),
729 ida_inl(ida, R_DONE_FIFO),
730 ida_inl(ida, R_INT_MASK),
731 ida_inl(ida, R_STATUS),
732 ida_inl(ida, R_INT_PENDING));