Lines Matching refs:ch
74 static int mvs_sata_connect(struct mvs_channel *ch);
117 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_attach() local
121 ch->dev = dev; in mvs_ch_attach()
122 ch->unit = (intptr_t)device_get_ivars(dev); in mvs_ch_attach()
123 ch->quirks = ctlr->quirks; in mvs_ch_attach()
124 mtx_init(&ch->mtx, "MVS channel lock", NULL, MTX_DEF); in mvs_ch_attach()
125 ch->pm_level = 0; in mvs_ch_attach()
127 device_get_unit(dev), "pm_level", &ch->pm_level); in mvs_ch_attach()
128 if (ch->pm_level > 3) in mvs_ch_attach()
129 callout_init_mtx(&ch->pm_timer, &ch->mtx, 0); in mvs_ch_attach()
130 callout_init_mtx(&ch->reset_timer, &ch->mtx, 0); in mvs_ch_attach()
134 ch->user[i].revision = sata_rev; in mvs_ch_attach()
135 ch->user[i].mode = 0; in mvs_ch_attach()
136 ch->user[i].bytecount = (ch->quirks & MVS_Q_GENIIE) ? 8192 : 2048; in mvs_ch_attach()
137 ch->user[i].tags = MVS_MAX_SLOTS; in mvs_ch_attach()
138 ch->curr[i] = ch->user[i]; in mvs_ch_attach()
139 if (ch->pm_level) { in mvs_ch_attach()
140 ch->user[i].caps = CTS_SATA_CAPS_H_PMREQ | in mvs_ch_attach()
144 ch->user[i].caps |= CTS_SATA_CAPS_H_AN; in mvs_ch_attach()
146 rid = ch->unit; in mvs_ch_attach()
147 if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in mvs_ch_attach()
153 mtx_lock(&ch->mtx); in mvs_ch_attach()
155 if (!(ch->r_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, in mvs_ch_attach()
161 if ((bus_setup_intr(dev, ch->r_irq, ATA_INTR_FLAGS, NULL, in mvs_ch_attach()
162 mvs_ch_intr_locked, dev, &ch->ih))) { in mvs_ch_attach()
175 ch->sim = cam_sim_alloc(mvsaction, mvspoll, "mvsch", ch, in mvs_ch_attach()
176 device_get_unit(dev), &ch->mtx, in mvs_ch_attach()
177 2, (ch->quirks & MVS_Q_GENI) ? 0 : MVS_MAX_SLOTS - 1, in mvs_ch_attach()
179 if (ch->sim == NULL) { in mvs_ch_attach()
185 if (xpt_bus_register(ch->sim, dev, 0) != CAM_SUCCESS) { in mvs_ch_attach()
190 if (xpt_create_path(&ch->path, /*periph*/NULL, cam_sim_path(ch->sim), in mvs_ch_attach()
196 if (ch->pm_level > 3) { in mvs_ch_attach()
197 callout_reset(&ch->pm_timer, in mvs_ch_attach()
198 (ch->pm_level == 4) ? hz / 1000 : hz / 8, in mvs_ch_attach()
201 mtx_unlock(&ch->mtx); in mvs_ch_attach()
205 xpt_bus_deregister(cam_sim_path(ch->sim)); in mvs_ch_attach()
207 cam_sim_free(ch->sim, /*free_devq*/TRUE); in mvs_ch_attach()
209 bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq); in mvs_ch_attach()
211 bus_release_resource(dev, SYS_RES_MEMORY, ch->unit, ch->r_mem); in mvs_ch_attach()
212 mtx_unlock(&ch->mtx); in mvs_ch_attach()
213 mtx_destroy(&ch->mtx); in mvs_ch_attach()
220 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_detach() local
222 mtx_lock(&ch->mtx); in mvs_ch_detach()
223 xpt_async(AC_LOST_DEVICE, ch->path, NULL); in mvs_ch_detach()
225 if (ch->resetting) { in mvs_ch_detach()
226 ch->resetting = 0; in mvs_ch_detach()
227 xpt_release_simq(ch->sim, TRUE); in mvs_ch_detach()
229 xpt_free_path(ch->path); in mvs_ch_detach()
230 xpt_bus_deregister(cam_sim_path(ch->sim)); in mvs_ch_detach()
231 cam_sim_free(ch->sim, /*free_devq*/TRUE); in mvs_ch_detach()
232 mtx_unlock(&ch->mtx); in mvs_ch_detach()
234 if (ch->pm_level > 3) in mvs_ch_detach()
235 callout_drain(&ch->pm_timer); in mvs_ch_detach()
236 callout_drain(&ch->reset_timer); in mvs_ch_detach()
237 bus_teardown_intr(dev, ch->r_irq, ch->ih); in mvs_ch_detach()
238 bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq); in mvs_ch_detach()
244 bus_release_resource(dev, SYS_RES_MEMORY, ch->unit, ch->r_mem); in mvs_ch_detach()
245 mtx_destroy(&ch->mtx); in mvs_ch_detach()
252 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_init() local
256 ATA_OUTL(ch->r_mem, EDMA_IEM, 0); in mvs_ch_init()
258 ch->curr_mode = MVS_EDMA_UNKNOWN; in mvs_ch_init()
261 ATA_OUTL(ch->r_mem, SATA_FISIC, 0); in mvs_ch_init()
262 reg = ATA_INL(ch->r_mem, SATA_FISC); in mvs_ch_init()
264 ATA_OUTL(ch->r_mem, SATA_FISC, reg); in mvs_ch_init()
265 reg = ATA_INL(ch->r_mem, SATA_FISIM); in mvs_ch_init()
267 ATA_OUTL(ch->r_mem, SATA_FISC, reg); in mvs_ch_init()
269 ATA_OUTL(ch->r_mem, SATA_SE, 0xffffffff); in mvs_ch_init()
271 ATA_OUTL(ch->r_mem, EDMA_IEC, 0); in mvs_ch_init()
273 ATA_OUTL(ch->r_mem, EDMA_IEM, ~EDMA_IE_TRANSIENT); in mvs_ch_init()
280 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_deinit() local
285 ATA_OUTL(ch->r_mem, EDMA_IEM, 0); in mvs_ch_deinit()
292 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_suspend() local
294 mtx_lock(&ch->mtx); in mvs_ch_suspend()
295 xpt_freeze_simq(ch->sim, 1); in mvs_ch_suspend()
296 while (ch->oslots) in mvs_ch_suspend()
297 msleep(ch, &ch->mtx, PRIBIO, "mvssusp", hz/100); in mvs_ch_suspend()
299 if (ch->resetting) { in mvs_ch_suspend()
300 ch->resetting = 0; in mvs_ch_suspend()
301 callout_stop(&ch->reset_timer); in mvs_ch_suspend()
302 xpt_release_simq(ch->sim, TRUE); in mvs_ch_suspend()
305 mtx_unlock(&ch->mtx); in mvs_ch_suspend()
312 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_resume() local
314 mtx_lock(&ch->mtx); in mvs_ch_resume()
317 xpt_release_simq(ch->sim, TRUE); in mvs_ch_resume()
318 mtx_unlock(&ch->mtx); in mvs_ch_resume()
330 struct mvs_channel *ch = device_get_softc(dev); in mvs_dmainit() local
337 0, NULL, NULL, &ch->dma.workrq_tag)) in mvs_dmainit()
339 if (bus_dmamem_alloc(ch->dma.workrq_tag, (void **)&ch->dma.workrq, 0, in mvs_dmainit()
340 &ch->dma.workrq_map)) in mvs_dmainit()
342 if (bus_dmamap_load(ch->dma.workrq_tag, ch->dma.workrq_map, in mvs_dmainit()
343 ch->dma.workrq, MVS_WORKRQ_SIZE, mvs_dmasetupc_cb, &dcba, 0) || in mvs_dmainit()
345 bus_dmamem_free(ch->dma.workrq_tag, in mvs_dmainit()
346 ch->dma.workrq, ch->dma.workrq_map); in mvs_dmainit()
349 ch->dma.workrq_bus = dcba.maddr; in mvs_dmainit()
354 0, NULL, NULL, &ch->dma.workrp_tag)) in mvs_dmainit()
356 if (bus_dmamem_alloc(ch->dma.workrp_tag, (void **)&ch->dma.workrp, 0, in mvs_dmainit()
357 &ch->dma.workrp_map)) in mvs_dmainit()
359 if (bus_dmamap_load(ch->dma.workrp_tag, ch->dma.workrp_map, in mvs_dmainit()
360 ch->dma.workrp, MVS_WORKRP_SIZE, mvs_dmasetupc_cb, &dcba, 0) || in mvs_dmainit()
362 bus_dmamem_free(ch->dma.workrp_tag, in mvs_dmainit()
363 ch->dma.workrp, ch->dma.workrp_map); in mvs_dmainit()
366 ch->dma.workrp_bus = dcba.maddr; in mvs_dmainit()
372 0, busdma_lock_mutex, &ch->mtx, &ch->dma.data_tag)) { in mvs_dmainit()
394 struct mvs_channel *ch = device_get_softc(dev); in mvs_dmafini() local
396 if (ch->dma.data_tag) { in mvs_dmafini()
397 bus_dma_tag_destroy(ch->dma.data_tag); in mvs_dmafini()
398 ch->dma.data_tag = NULL; in mvs_dmafini()
400 if (ch->dma.workrp_bus) { in mvs_dmafini()
401 bus_dmamap_unload(ch->dma.workrp_tag, ch->dma.workrp_map); in mvs_dmafini()
402 bus_dmamem_free(ch->dma.workrp_tag, in mvs_dmafini()
403 ch->dma.workrp, ch->dma.workrp_map); in mvs_dmafini()
404 ch->dma.workrp_bus = 0; in mvs_dmafini()
405 ch->dma.workrp = NULL; in mvs_dmafini()
407 if (ch->dma.workrp_tag) { in mvs_dmafini()
408 bus_dma_tag_destroy(ch->dma.workrp_tag); in mvs_dmafini()
409 ch->dma.workrp_tag = NULL; in mvs_dmafini()
411 if (ch->dma.workrq_bus) { in mvs_dmafini()
412 bus_dmamap_unload(ch->dma.workrq_tag, ch->dma.workrq_map); in mvs_dmafini()
413 bus_dmamem_free(ch->dma.workrq_tag, in mvs_dmafini()
414 ch->dma.workrq, ch->dma.workrq_map); in mvs_dmafini()
415 ch->dma.workrq_bus = 0; in mvs_dmafini()
416 ch->dma.workrq = NULL; in mvs_dmafini()
418 if (ch->dma.workrq_tag) { in mvs_dmafini()
419 bus_dma_tag_destroy(ch->dma.workrq_tag); in mvs_dmafini()
420 ch->dma.workrq_tag = NULL; in mvs_dmafini()
427 struct mvs_channel *ch = device_get_softc(dev); in mvs_slotsalloc() local
431 bzero(ch->slot, sizeof(ch->slot)); in mvs_slotsalloc()
433 struct mvs_slot *slot = &ch->slot[i]; in mvs_slotsalloc()
440 callout_init_mtx(&slot->timeout, &ch->mtx, 0); in mvs_slotsalloc()
442 if (bus_dmamap_create(ch->dma.data_tag, 0, &slot->dma.data_map)) in mvs_slotsalloc()
443 device_printf(ch->dev, "FAILURE - create data_map\n"); in mvs_slotsalloc()
450 struct mvs_channel *ch = device_get_softc(dev); in mvs_slotsfree() local
455 struct mvs_slot *slot = &ch->slot[i]; in mvs_slotsfree()
459 bus_dmamap_destroy(ch->dma.data_tag, slot->dma.data_map); in mvs_slotsfree()
468 struct mvs_channel *ch = device_get_softc(dev); in mvs_setup_edma_queues() local
472 work = ch->dma.workrq_bus; in mvs_setup_edma_queues()
473 ATA_OUTL(ch->r_mem, EDMA_REQQBAH, work >> 32); in mvs_setup_edma_queues()
474 ATA_OUTL(ch->r_mem, EDMA_REQQIP, work & 0xffffffff); in mvs_setup_edma_queues()
475 ATA_OUTL(ch->r_mem, EDMA_REQQOP, work & 0xffffffff); in mvs_setup_edma_queues()
476 bus_dmamap_sync(ch->dma.workrq_tag, ch->dma.workrq_map, in mvs_setup_edma_queues()
479 memset(ch->dma.workrp, 0xff, MVS_WORKRP_SIZE); in mvs_setup_edma_queues()
480 work = ch->dma.workrp_bus; in mvs_setup_edma_queues()
481 ATA_OUTL(ch->r_mem, EDMA_RESQBAH, work >> 32); in mvs_setup_edma_queues()
482 ATA_OUTL(ch->r_mem, EDMA_RESQIP, work & 0xffffffff); in mvs_setup_edma_queues()
483 ATA_OUTL(ch->r_mem, EDMA_RESQOP, work & 0xffffffff); in mvs_setup_edma_queues()
484 bus_dmamap_sync(ch->dma.workrp_tag, ch->dma.workrp_map, in mvs_setup_edma_queues()
486 ch->out_idx = 0; in mvs_setup_edma_queues()
487 ch->in_idx = 0; in mvs_setup_edma_queues()
493 struct mvs_channel *ch = device_get_softc(dev); in mvs_set_edma_mode() local
497 if (mode == ch->curr_mode) in mvs_set_edma_mode()
500 if (ch->curr_mode != MVS_EDMA_OFF) { in mvs_set_edma_mode()
501 ATA_OUTL(ch->r_mem, EDMA_CMD, EDMA_CMD_EDSEDMA); in mvs_set_edma_mode()
503 while (ATA_INL(ch->r_mem, EDMA_CMD) & EDMA_CMD_EENEDMA) { in mvs_set_edma_mode()
511 ch->curr_mode = mode; in mvs_set_edma_mode()
512 ch->fbs_enabled = 0; in mvs_set_edma_mode()
513 ch->fake_busy = 0; in mvs_set_edma_mode()
518 if (ch->pm_present) { in mvs_set_edma_mode()
520 if (ch->quirks & MVS_Q_GENIIE) { in mvs_set_edma_mode()
522 ch->fbs_enabled = 1; in mvs_set_edma_mode()
525 if (ch->quirks & MVS_Q_GENI) in mvs_set_edma_mode()
527 else if (ch->quirks & MVS_Q_GENII) in mvs_set_edma_mode()
529 if (ch->quirks & MVS_Q_CT) in mvs_set_edma_mode()
537 ATA_OUTL(ch->r_mem, EDMA_CFG, ecfg); in mvs_set_edma_mode()
539 if (ch->quirks & MVS_Q_GENIIE) { in mvs_set_edma_mode()
541 fcfg = ATA_INL(ch->r_mem, SATA_FISC); in mvs_set_edma_mode()
542 ltm = ATA_INL(ch->r_mem, SATA_LTM); in mvs_set_edma_mode()
543 hc = ATA_INL(ch->r_mem, EDMA_HC); in mvs_set_edma_mode()
544 if (ch->fbs_enabled) { in mvs_set_edma_mode()
560 ATA_OUTL(ch->r_mem, SATA_FISC, fcfg); in mvs_set_edma_mode()
561 ATA_OUTL(ch->r_mem, SATA_LTM, ltm); in mvs_set_edma_mode()
562 ATA_OUTL(ch->r_mem, EDMA_HC, hc); in mvs_set_edma_mode()
565 unkn = ATA_INL(ch->r_mem, EDMA_UNKN_RESD); in mvs_set_edma_mode()
570 ATA_OUTL(ch->r_mem, EDMA_UNKN_RESD, unkn); in mvs_set_edma_mode()
574 ATA_OUTL(ch->r_mem, EDMA_CMD, EDMA_CMD_EENEDMA); in mvs_set_edma_mode()
596 struct mvs_channel *ch = device_get_softc(dev); in mvs_phy_check_events() local
598 if (ch->pm_level == 0) { in mvs_phy_check_events()
599 u_int32_t status = ATA_INL(ch->r_mem, SATA_SS); in mvs_phy_check_events()
614 cam_sim_path(ch->sim), in mvs_phy_check_events()
626 struct mvs_channel *ch = device_get_softc(dev); in mvs_notify_events() local
632 fis = ATA_INL(ch->r_mem, SATA_FISDW0); in mvs_notify_events()
636 d = ch->pm_present ? 15 : 0; in mvs_notify_events()
640 xpt_path_path_id(ch->path), d, 0) == CAM_REQ_CMP) { in mvs_notify_events()
651 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_intr_locked() local
653 mtx_lock(&ch->mtx); in mvs_ch_intr_locked()
655 mtx_unlock(&ch->mtx); in mvs_ch_intr_locked()
662 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_pm() local
665 if (ch->numrslots != 0) in mvs_ch_pm()
668 work = ATA_INL(ch->r_mem, SATA_SC); in mvs_ch_pm()
670 if (ch->pm_level == 4) in mvs_ch_pm()
674 ATA_OUTL(ch->r_mem, SATA_SC, work); in mvs_ch_pm()
680 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_pm_wake() local
684 work = ATA_INL(ch->r_mem, SATA_SS); in mvs_ch_pm_wake()
688 work = ATA_INL(ch->r_mem, SATA_SC); in mvs_ch_pm_wake()
691 ATA_OUTL(ch->r_mem, SATA_SC, work); in mvs_ch_pm_wake()
693 while ((ATA_INL(ch->r_mem, SATA_SS) & SATA_SS_IPM_ACTIVE) == 0 && in mvs_ch_pm_wake()
704 struct mvs_channel *ch = device_get_softc(dev); in mvs_ch_intr() local
708 int edma = (ch->numtslots != 0 || ch->numdslots != 0); in mvs_ch_intr()
715 iec = ATA_INL(ch->r_mem, EDMA_IEC); in mvs_ch_intr()
717 serr = ATA_INL(ch->r_mem, SATA_SE); in mvs_ch_intr()
718 ATA_OUTL(ch->r_mem, SATA_SE, serr); in mvs_ch_intr()
726 if (ch->quirks & MVS_Q_GENI) in mvs_ch_intr()
729 else if (ch->quirks & MVS_Q_GENII) in mvs_ch_intr()
732 fisic = ATA_INL(ch->r_mem, SATA_FISIC); in mvs_ch_intr()
735 ch->curr_mode = MVS_EDMA_UNKNOWN; in mvs_ch_intr()
736 ATA_OUTL(ch->r_mem, EDMA_IEC, ~iec); in mvs_ch_intr()
740 if (ch->numpslots != 0) { in mvs_ch_intr()
743 if (ch->quirks & MVS_Q_GENIIE) in mvs_ch_intr()
744 ccs = EDMA_S_EIOID(ATA_INL(ch->r_mem, EDMA_S)); in mvs_ch_intr()
746 ccs = EDMA_S_EDEVQUETAG(ATA_INL(ch->r_mem, EDMA_S)); in mvs_ch_intr()
748 if (ch->fbs_enabled) { in mvs_ch_intr()
751 if (ch->numrslotspd[i] == 0) in mvs_ch_intr()
764 uint16_t p = ATA_INL(ch->r_mem, SATA_SATAITC) >> 16; in mvs_ch_intr()
774 if (((ch->rslots >> i) & 1) == 0) in mvs_ch_intr()
777 ch->slot[i].ccb->ccb_h.target_id != port) in mvs_ch_intr()
781 if (ch->numtslots == 0) { in mvs_ch_intr()
793 ch->fatalerr = 1; in mvs_ch_intr()
796 if (ch->numtslots == 0 && in mvs_ch_intr()
803 mvs_end_transaction(&ch->slot[i], et); in mvs_ch_intr()
810 ATA_OUTL(ch->r_mem, SATA_FISIC, ~fisic); in mvs_ch_intr()
824 struct mvs_channel *ch = device_get_softc(dev); in mvs_getstatus() local
825 uint8_t status = ATA_INB(ch->r_mem, clear ? ATA_STATUS : ATA_ALTSTAT); in mvs_getstatus()
827 if (ch->fake_busy) { in mvs_getstatus()
829 ch->fake_busy = 0; in mvs_getstatus()
839 struct mvs_channel *ch = device_get_softc(dev); in mvs_legacy_intr() local
840 struct mvs_slot *slot = &ch->slot[0]; /* PIO is always in slot 0. */ in mvs_legacy_intr()
876 xpt_freeze_simq(ch->sim, 1); in mvs_legacy_intr()
877 ch->toslots |= (1 << slot->slot); in mvs_legacy_intr()
880 ATA_INSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_intr()
881 (uint16_t *)(ccb->ataio.data_ptr + ch->donecount), in mvs_legacy_intr()
882 ch->transfersize / 2); in mvs_legacy_intr()
885 ch->donecount += ch->transfersize; in mvs_legacy_intr()
887 if (ccb->ataio.dxfer_len > ch->donecount) { in mvs_legacy_intr()
889 ch->transfersize = min(ccb->ataio.dxfer_len - ch->donecount, in mvs_legacy_intr()
890 ch->transfersize); in mvs_legacy_intr()
897 xpt_freeze_simq(ch->sim, 1); in mvs_legacy_intr()
898 ch->toslots |= (1 << slot->slot); in mvs_legacy_intr()
901 ATA_OUTSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_intr()
902 (uint16_t *)(ccb->ataio.data_ptr + ch->donecount), in mvs_legacy_intr()
903 ch->transfersize / 2); in mvs_legacy_intr()
911 } else if (ch->basic_dma) { /* ATAPI DMA */ in mvs_legacy_intr()
914 else if (ATA_INL(ch->r_mem, DMA_S) & DMA_S_ERR) in mvs_legacy_intr()
917 ATA_OUTL(ch->r_mem, DMA_C, 0); in mvs_legacy_intr()
920 length = ATA_INB(ch->r_mem,ATA_CYL_LSB) | in mvs_legacy_intr()
921 (ATA_INB(ch->r_mem,ATA_CYL_MSB) << 8); in mvs_legacy_intr()
922 size = min(ch->transfersize, length); in mvs_legacy_intr()
923 ireason = ATA_INB(ch->r_mem,ATA_IREASON); in mvs_legacy_intr()
938 ATA_OUTSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_intr()
939 (uint16_t *)(ccb->csio.data_ptr + ch->donecount), in mvs_legacy_intr()
941 for (resid = ch->transfersize + (size & 1); in mvs_legacy_intr()
943 ATA_OUTW(ch->r_mem, ATA_DATA, 0); in mvs_legacy_intr()
944 ch->donecount += length; in mvs_legacy_intr()
946 ch->transfersize = min(ccb->csio.dxfer_len - ch->donecount, in mvs_legacy_intr()
947 ch->curr[ccb->ccb_h.target_id].bytecount); in mvs_legacy_intr()
958 ATA_INSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_intr()
959 (uint16_t *)(ccb->csio.data_ptr + ch->donecount), in mvs_legacy_intr()
963 ATA_INSW_STRM(ch->r_mem, ATA_DATA, (void*)buf, 1); in mvs_legacy_intr()
964 ((uint8_t *)ccb->csio.data_ptr + ch->donecount + in mvs_legacy_intr()
967 for (resid = ch->transfersize + (size & 1); in mvs_legacy_intr()
969 ATA_INW(ch->r_mem, ATA_DATA); in mvs_legacy_intr()
970 ch->donecount += length; in mvs_legacy_intr()
972 ch->transfersize = min(ccb->csio.dxfer_len - ch->donecount, in mvs_legacy_intr()
973 ch->curr[ccb->ccb_h.target_id].bytecount); in mvs_legacy_intr()
981 ATA_INSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_intr()
982 (uint16_t *)(ccb->csio.data_ptr + ch->donecount), in mvs_legacy_intr()
984 ch->donecount += length; in mvs_legacy_intr()
987 ATA_OUTSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_intr()
988 (uint16_t *)(ccb->csio.data_ptr + ch->donecount), in mvs_legacy_intr()
990 ch->donecount += length; in mvs_legacy_intr()
1017 struct mvs_channel *ch = device_get_softc(dev); in mvs_crbq_intr() local
1024 val = ATA_INL(ch->r_mem, EDMA_RESQIP); in mvs_crbq_intr()
1026 val = ATA_INL(ch->r_mem, EDMA_RESQIP); in mvs_crbq_intr()
1029 bus_dmamap_sync(ch->dma.workrp_tag, ch->dma.workrp_map, in mvs_crbq_intr()
1031 fin_idx = cin_idx = ch->in_idx; in mvs_crbq_intr()
1032 ch->in_idx = in_idx; in mvs_crbq_intr()
1035 (ch->dma.workrp + MVS_CRPB_OFFSET + in mvs_crbq_intr()
1047 cin_idx, fin_idx, in_idx, slot, flags, ch->rslots); in mvs_crbq_intr()
1050 if (ch->numtslots != 0 || in mvs_crbq_intr()
1056 if (ch->slot[slot].state >= MVS_SLOT_RUNNING) { in mvs_crbq_intr()
1057 ccb = ch->slot[slot].ccb; in mvs_crbq_intr()
1061 mvs_end_transaction(&ch->slot[slot], MVS_ERR_NONE); in mvs_crbq_intr()
1066 ch->rslots); in mvs_crbq_intr()
1075 bus_dmamap_sync(ch->dma.workrp_tag, ch->dma.workrp_map, in mvs_crbq_intr()
1077 if (cin_idx == ch->in_idx) { in mvs_crbq_intr()
1078 ATA_OUTL(ch->r_mem, EDMA_RESQOP, in mvs_crbq_intr()
1079 ch->dma.workrp_bus | (cin_idx << EDMA_RESQP_ERPQP_SHIFT)); in mvs_crbq_intr()
1087 struct mvs_channel *ch = device_get_softc(dev); in mvs_check_collision() local
1093 if (ch->numdslots != 0) in mvs_check_collision()
1096 if (ch->numpslots != 0) in mvs_check_collision()
1099 if (!ch->fbs_enabled) { in mvs_check_collision()
1101 if (ch->numtslots != 0 && in mvs_check_collision()
1102 ch->taggedtarget != ccb->ccb_h.target_id) in mvs_check_collision()
1108 if (ch->numtslots != 0) in mvs_check_collision()
1111 if (ch->numpslots != 0) in mvs_check_collision()
1116 if (ch->numrslots != 0) in mvs_check_collision()
1121 if (ch->numrslots != 0) in mvs_check_collision()
1126 if (ch->numrslots != 0) in mvs_check_collision()
1130 if (ch->aslots != 0) in mvs_check_collision()
1138 struct mvs_channel *ch = device_get_softc(dev); in mvs_tfd_read() local
1141 res->status = ATA_INB(ch->r_mem, ATA_ALTSTAT); in mvs_tfd_read()
1142 res->error = ATA_INB(ch->r_mem, ATA_ERROR); in mvs_tfd_read()
1143 res->device = ATA_INB(ch->r_mem, ATA_DRIVE); in mvs_tfd_read()
1144 ATA_OUTB(ch->r_mem, ATA_CONTROL, ATA_A_HOB); in mvs_tfd_read()
1145 res->sector_count_exp = ATA_INB(ch->r_mem, ATA_COUNT); in mvs_tfd_read()
1146 res->lba_low_exp = ATA_INB(ch->r_mem, ATA_SECTOR); in mvs_tfd_read()
1147 res->lba_mid_exp = ATA_INB(ch->r_mem, ATA_CYL_LSB); in mvs_tfd_read()
1148 res->lba_high_exp = ATA_INB(ch->r_mem, ATA_CYL_MSB); in mvs_tfd_read()
1149 ATA_OUTB(ch->r_mem, ATA_CONTROL, 0); in mvs_tfd_read()
1150 res->sector_count = ATA_INB(ch->r_mem, ATA_COUNT); in mvs_tfd_read()
1151 res->lba_low = ATA_INB(ch->r_mem, ATA_SECTOR); in mvs_tfd_read()
1152 res->lba_mid = ATA_INB(ch->r_mem, ATA_CYL_LSB); in mvs_tfd_read()
1153 res->lba_high = ATA_INB(ch->r_mem, ATA_CYL_MSB); in mvs_tfd_read()
1159 struct mvs_channel *ch = device_get_softc(dev); in mvs_tfd_write() local
1162 ATA_OUTB(ch->r_mem, ATA_DRIVE, cmd->device); in mvs_tfd_write()
1163 ATA_OUTB(ch->r_mem, ATA_CONTROL, cmd->control); in mvs_tfd_write()
1164 ATA_OUTB(ch->r_mem, ATA_FEATURE, cmd->features_exp); in mvs_tfd_write()
1165 ATA_OUTB(ch->r_mem, ATA_FEATURE, cmd->features); in mvs_tfd_write()
1166 ATA_OUTB(ch->r_mem, ATA_COUNT, cmd->sector_count_exp); in mvs_tfd_write()
1167 ATA_OUTB(ch->r_mem, ATA_COUNT, cmd->sector_count); in mvs_tfd_write()
1168 ATA_OUTB(ch->r_mem, ATA_SECTOR, cmd->lba_low_exp); in mvs_tfd_write()
1169 ATA_OUTB(ch->r_mem, ATA_SECTOR, cmd->lba_low); in mvs_tfd_write()
1170 ATA_OUTB(ch->r_mem, ATA_CYL_LSB, cmd->lba_mid_exp); in mvs_tfd_write()
1171 ATA_OUTB(ch->r_mem, ATA_CYL_LSB, cmd->lba_mid); in mvs_tfd_write()
1172 ATA_OUTB(ch->r_mem, ATA_CYL_MSB, cmd->lba_high_exp); in mvs_tfd_write()
1173 ATA_OUTB(ch->r_mem, ATA_CYL_MSB, cmd->lba_high); in mvs_tfd_write()
1174 ATA_OUTB(ch->r_mem, ATA_COMMAND, cmd->command); in mvs_tfd_write()
1181 struct mvs_channel *ch = device_get_softc(dev); in mvs_begin_transaction() local
1185 if (ch->pm_level > 0) in mvs_begin_transaction()
1194 slotn = ffs(~ch->oslots) - 1; in mvs_begin_transaction()
1197 if (ch->quirks & MVS_Q_GENIIE) in mvs_begin_transaction()
1198 tag = ffs(~ch->otagspd[ccb->ccb_h.target_id]) - 1; in mvs_begin_transaction()
1204 slot = &ch->slot[slotn]; in mvs_begin_transaction()
1208 if (ch->numrslots == 0 && ch->pm_level > 3) in mvs_begin_transaction()
1209 callout_stop(&ch->pm_timer); in mvs_begin_transaction()
1211 ch->oslots |= (1 << slot->slot); in mvs_begin_transaction()
1212 ch->numrslots++; in mvs_begin_transaction()
1213 ch->numrslotspd[ccb->ccb_h.target_id]++; in mvs_begin_transaction()
1216 ch->otagspd[ccb->ccb_h.target_id] |= (1 << slot->tag); in mvs_begin_transaction()
1217 ch->numtslots++; in mvs_begin_transaction()
1218 ch->numtslotspd[ccb->ccb_h.target_id]++; in mvs_begin_transaction()
1219 ch->taggedtarget = ccb->ccb_h.target_id; in mvs_begin_transaction()
1222 ch->numdslots++; in mvs_begin_transaction()
1225 ch->numpslots++; in mvs_begin_transaction()
1230 ch->aslots |= (1 << slot->slot); in mvs_begin_transaction()
1235 ch->numpslots++; in mvs_begin_transaction()
1238 ch->curr[ccb->ccb_h.target_id].mode >= ATA_DMA && in mvs_begin_transaction()
1239 (ch->quirks & MVS_Q_SOC) == 0 && in mvs_begin_transaction()
1249 ch->basic_dma = 1; in mvs_begin_transaction()
1253 if (ch->numpslots == 0 || ch->basic_dma) { in mvs_begin_transaction()
1255 bus_dmamap_load_ccb(ch->dma.data_tag, slot->dma.data_map, in mvs_begin_transaction()
1266 struct mvs_channel *ch = device_get_softc(slot->dev); in mvs_dmasetprd() local
1277 if (nsegs == 1 && ch->basic_dma == 0 && (ch->quirks & MVS_Q_GENIIE)) { in mvs_dmasetprd()
1283 eprd = (struct mvs_eprd *)(ch->dma.workrq + slot->eprd_offset); in mvs_dmasetprd()
1292 bus_dmamap_sync(ch->dma.data_tag, slot->dma.data_map, in mvs_dmasetprd()
1295 if (ch->basic_dma) in mvs_dmasetprd()
1305 struct mvs_channel *ch = device_get_softc(dev); in mvs_legacy_execute_transaction() local
1312 ch->rslots |= (1 << slot->slot); in mvs_legacy_execute_transaction()
1313 ATA_OUTB(ch->r_mem, SATA_SATAICTL, port << SATA_SATAICTL_PMPTX_SHIFT); in mvs_legacy_execute_transaction()
1321 ccb->ataio.res.status = ATA_INB(ch->r_mem, ATA_STATUS); in mvs_legacy_execute_transaction()
1326 ch->donecount = 0; in mvs_legacy_execute_transaction()
1331 ch->transfersize = min(ccb->ataio.dxfer_len, in mvs_legacy_execute_transaction()
1332 ch->curr[port].bytecount); in mvs_legacy_execute_transaction()
1334 ch->transfersize = min(ccb->ataio.dxfer_len, 512); in mvs_legacy_execute_transaction()
1336 ch->fake_busy = 1; in mvs_legacy_execute_transaction()
1342 xpt_freeze_simq(ch->sim, 1); in mvs_legacy_execute_transaction()
1343 ch->toslots |= (1 << slot->slot); in mvs_legacy_execute_transaction()
1347 ATA_OUTSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_execute_transaction()
1348 (uint16_t *)(ccb->ataio.data_ptr + ch->donecount), in mvs_legacy_execute_transaction()
1349 ch->transfersize / 2); in mvs_legacy_execute_transaction()
1352 ch->donecount = 0; in mvs_legacy_execute_transaction()
1353 ch->transfersize = min(ccb->csio.dxfer_len, in mvs_legacy_execute_transaction()
1354 ch->curr[port].bytecount); in mvs_legacy_execute_transaction()
1356 if (ch->basic_dma) { in mvs_legacy_execute_transaction()
1357 ATA_OUTB(ch->r_mem, ATA_FEATURE, ATA_F_DMA); in mvs_legacy_execute_transaction()
1358 ATA_OUTB(ch->r_mem, ATA_CYL_LSB, 0); in mvs_legacy_execute_transaction()
1359 ATA_OUTB(ch->r_mem, ATA_CYL_MSB, 0); in mvs_legacy_execute_transaction()
1361 ATA_OUTB(ch->r_mem, ATA_FEATURE, 0); in mvs_legacy_execute_transaction()
1362 ATA_OUTB(ch->r_mem, ATA_CYL_LSB, ch->transfersize); in mvs_legacy_execute_transaction()
1363 ATA_OUTB(ch->r_mem, ATA_CYL_MSB, ch->transfersize >> 8); in mvs_legacy_execute_transaction()
1365 ATA_OUTB(ch->r_mem, ATA_COMMAND, ATA_PACKET_CMD); in mvs_legacy_execute_transaction()
1366 ch->fake_busy = 1; in mvs_legacy_execute_transaction()
1370 xpt_freeze_simq(ch->sim, 1); in mvs_legacy_execute_transaction()
1371 ch->toslots |= (1 << slot->slot); in mvs_legacy_execute_transaction()
1377 int reason = ATA_INB(ch->r_mem, ATA_IREASON); in mvs_legacy_execute_transaction()
1378 int status = ATA_INB(ch->r_mem, ATA_STATUS); in mvs_legacy_execute_transaction()
1388 xpt_freeze_simq(ch->sim, 1); in mvs_legacy_execute_transaction()
1389 ch->toslots |= (1 << slot->slot); in mvs_legacy_execute_transaction()
1394 ATA_OUTSW_STRM(ch->r_mem, ATA_DATA, in mvs_legacy_execute_transaction()
1397 ch->curr[port].atapi / 2); in mvs_legacy_execute_transaction()
1399 if (ch->basic_dma) { in mvs_legacy_execute_transaction()
1401 eprd = ch->dma.workrq_bus + slot->eprd_offset; in mvs_legacy_execute_transaction()
1402 ATA_OUTL(ch->r_mem, DMA_DTLBA, eprd); in mvs_legacy_execute_transaction()
1403 ATA_OUTL(ch->r_mem, DMA_DTHBA, (eprd >> 16) >> 16); in mvs_legacy_execute_transaction()
1404 ATA_OUTL(ch->r_mem, DMA_C, DMA_C_START | in mvs_legacy_execute_transaction()
1419 struct mvs_channel *ch = device_get_softc(dev); in mvs_execute_transaction() local
1428 eprd = ch->dma.workrq_bus + slot->eprd_offset; in mvs_execute_transaction()
1430 if (ch->quirks & MVS_Q_GENIIE) { in mvs_execute_transaction()
1432 (ch->dma.workrq + MVS_CRQB_OFFSET + (MVS_CRQB_SIZE * ch->out_idx)); in mvs_execute_transaction()
1469 (ch->dma.workrq + MVS_CRQB_OFFSET + (MVS_CRQB_SIZE * ch->out_idx)); in mvs_execute_transaction()
1514 bus_dmamap_sync(ch->dma.workrq_tag, ch->dma.workrq_map, in mvs_execute_transaction()
1516 bus_dmamap_sync(ch->dma.workrp_tag, ch->dma.workrp_map, in mvs_execute_transaction()
1519 ch->rslots |= (1 << slot->slot); in mvs_execute_transaction()
1521 ch->out_idx = (ch->out_idx + 1) & (MVS_MAX_SLOTS - 1); in mvs_execute_transaction()
1522 ATA_OUTL(ch->r_mem, EDMA_REQQIP, in mvs_execute_transaction()
1523 ch->dma.workrq_bus + MVS_CRQB_OFFSET + (MVS_CRQB_SIZE * ch->out_idx)); in mvs_execute_transaction()
1534 struct mvs_channel *ch = device_get_softc(dev); in mvs_process_timeout() local
1537 mtx_assert(&ch->mtx, MA_OWNED); in mvs_process_timeout()
1541 if (ch->slot[i].state < MVS_SLOT_RUNNING) in mvs_process_timeout()
1543 mvs_end_transaction(&ch->slot[i], MVS_ERR_TIMEOUT); in mvs_process_timeout()
1551 struct mvs_channel *ch = device_get_softc(dev); in mvs_rearm_timeout() local
1554 mtx_assert(&ch->mtx, MA_OWNED); in mvs_rearm_timeout()
1556 struct mvs_slot *slot = &ch->slot[i]; in mvs_rearm_timeout()
1561 if ((ch->toslots & (1 << i)) == 0) in mvs_rearm_timeout()
1575 struct mvs_channel *ch = device_get_softc(dev); in mvs_timeout() local
1583 ATA_INL(ch->r_mem, EDMA_IEC), in mvs_timeout()
1584 ATA_INL(ch->r_mem, SATA_SS), ATA_INL(ch->r_mem, SATA_SE), in mvs_timeout()
1585 ATA_INL(ch->r_mem, EDMA_S), ATA_INL(ch->r_mem, DMA_C), in mvs_timeout()
1586 ATA_INL(ch->r_mem, DMA_S), ch->rslots, in mvs_timeout()
1587 ATA_INB(ch->r_mem, ATA_ALTSTAT)); in mvs_timeout()
1591 if (ch->toslots == 0) in mvs_timeout()
1592 xpt_freeze_simq(ch->sim, 1); in mvs_timeout()
1593 ch->toslots |= (1 << slot->slot); in mvs_timeout()
1594 if ((ch->rslots & ~ch->toslots) == 0) in mvs_timeout()
1598 ch->rslots & ~ch->toslots); in mvs_timeout()
1606 struct mvs_channel *ch = device_get_softc(dev); in mvs_end_transaction() local
1610 bus_dmamap_sync(ch->dma.workrq_tag, ch->dma.workrq_map, in mvs_end_transaction()
1626 ch->basic_dma == 0) in mvs_end_transaction()
1627 ccb->csio.resid = ccb->csio.dxfer_len - ch->donecount; in mvs_end_transaction()
1629 if (ch->numpslots == 0 || ch->basic_dma) { in mvs_end_transaction()
1631 bus_dmamap_sync(ch->dma.data_tag, slot->dma.data_map, in mvs_end_transaction()
1634 bus_dmamap_unload(ch->dma.data_tag, slot->dma.data_map); in mvs_end_transaction()
1638 ch->eslots |= (1 << slot->slot); in mvs_end_transaction()
1640 if ((et != MVS_ERR_NONE) && (!ch->recoverycmd) && in mvs_end_transaction()
1654 ch->fatalerr = 1; in mvs_end_transaction()
1670 ch->fatalerr = 1; in mvs_end_transaction()
1671 if (!ch->recoverycmd) { in mvs_end_transaction()
1672 xpt_freeze_simq(ch->sim, 1); in mvs_end_transaction()
1679 if (!ch->recoverycmd) { in mvs_end_transaction()
1680 xpt_freeze_simq(ch->sim, 1); in mvs_end_transaction()
1687 ch->fatalerr = 1; in mvs_end_transaction()
1691 ch->oslots &= ~(1 << slot->slot); in mvs_end_transaction()
1692 ch->rslots &= ~(1 << slot->slot); in mvs_end_transaction()
1693 ch->aslots &= ~(1 << slot->slot); in mvs_end_transaction()
1697 ch->numrslots--; in mvs_end_transaction()
1698 ch->numrslotspd[ccb->ccb_h.target_id]--; in mvs_end_transaction()
1701 ch->otagspd[ccb->ccb_h.target_id] &= ~(1 << slot->tag); in mvs_end_transaction()
1702 ch->numtslots--; in mvs_end_transaction()
1703 ch->numtslotspd[ccb->ccb_h.target_id]--; in mvs_end_transaction()
1705 ch->numdslots--; in mvs_end_transaction()
1707 ch->numpslots--; in mvs_end_transaction()
1710 ch->numpslots--; in mvs_end_transaction()
1711 ch->basic_dma = 0; in mvs_end_transaction()
1715 lastto = (ch->toslots == (1 << slot->slot)); in mvs_end_transaction()
1716 ch->toslots &= ~(1 << slot->slot); in mvs_end_transaction()
1718 xpt_release_simq(ch->sim, TRUE); in mvs_end_transaction()
1730 ch->hold[slot->slot] = ccb; in mvs_end_transaction()
1731 ch->holdtag[slot->slot] = slot->tag; in mvs_end_transaction()
1732 ch->numhslots++; in mvs_end_transaction()
1736 if (ch->rslots == 0) { in mvs_end_transaction()
1738 if (ch->toslots != 0 || ch->fatalerr) { in mvs_end_transaction()
1742 if (ch->eslots != 0) { in mvs_end_transaction()
1744 ch->eslots = 0; in mvs_end_transaction()
1747 if (!ch->recoverycmd && ch->numhslots) in mvs_end_transaction()
1751 } else if ((ch->rslots & ~ch->toslots) == 0 && in mvs_end_transaction()
1755 if (ch->frozen && !mvs_check_collision(dev, ch->frozen)) { in mvs_end_transaction()
1756 union ccb *fccb = ch->frozen; in mvs_end_transaction()
1757 ch->frozen = NULL; in mvs_end_transaction()
1759 xpt_release_simq(ch->sim, TRUE); in mvs_end_transaction()
1762 if (ch->numrslots == 0 && ch->pm_level > 3 && in mvs_end_transaction()
1763 (ch->curr[ch->pm_present ? 15 : 0].caps & CTS_SATA_CAPS_D_PMREQ)) { in mvs_end_transaction()
1764 callout_schedule(&ch->pm_timer, in mvs_end_transaction()
1765 (ch->pm_level == 4) ? hz / 1000 : hz / 8); in mvs_end_transaction()
1772 struct mvs_channel *ch = device_get_softc(dev); in mvs_issue_recovery() local
1780 if (ch->hold[i]) in mvs_issue_recovery()
1789 if (ch->hold[i] == NULL) in mvs_issue_recovery()
1791 ch->hold[i]->ccb_h.status &= ~CAM_STATUS_MASK; in mvs_issue_recovery()
1792 ch->hold[i]->ccb_h.status |= CAM_RESRC_UNAVAIL; in mvs_issue_recovery()
1793 xpt_done(ch->hold[i]); in mvs_issue_recovery()
1794 ch->hold[i] = NULL; in mvs_issue_recovery()
1795 ch->numhslots--; in mvs_issue_recovery()
1800 xpt_setup_ccb(&ccb->ccb_h, ch->hold[i]->ccb_h.path, in mvs_issue_recovery()
1801 ch->hold[i]->ccb_h.pinfo.priority); in mvs_issue_recovery()
1834 csio->data_ptr = (void *)&ch->hold[i]->csio.sense_data; in mvs_issue_recovery()
1835 csio->dxfer_len = ch->hold[i]->csio.sense_len; in mvs_issue_recovery()
1842 ch->recoverycmd = 1; in mvs_issue_recovery()
1843 xpt_freeze_simq(ch->sim, 1); in mvs_issue_recovery()
1850 struct mvs_channel *ch = device_get_softc(dev); in mvs_process_read_log() local
1855 ch->recoverycmd = 0; in mvs_process_read_log()
1861 if (!ch->hold[i]) in mvs_process_read_log()
1863 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in mvs_process_read_log()
1865 if ((data[0] & 0x1F) == ch->holdtag[i]) { in mvs_process_read_log()
1866 res = &ch->hold[i]->ataio.res; in mvs_process_read_log()
1879 ch->hold[i]->ccb_h.status &= ~CAM_STATUS_MASK; in mvs_process_read_log()
1880 ch->hold[i]->ccb_h.status |= CAM_REQUEUE_REQ; in mvs_process_read_log()
1882 xpt_done(ch->hold[i]); in mvs_process_read_log()
1883 ch->hold[i] = NULL; in mvs_process_read_log()
1884 ch->numhslots--; in mvs_process_read_log()
1894 if (!ch->hold[i]) in mvs_process_read_log()
1896 if (ch->hold[i]->ccb_h.target_id != ccb->ccb_h.target_id) in mvs_process_read_log()
1898 xpt_done(ch->hold[i]); in mvs_process_read_log()
1899 ch->hold[i] = NULL; in mvs_process_read_log()
1900 ch->numhslots--; in mvs_process_read_log()
1905 xpt_release_simq(ch->sim, TRUE); in mvs_process_read_log()
1911 struct mvs_channel *ch = device_get_softc(dev); in mvs_process_request_sense() local
1914 ch->recoverycmd = 0; in mvs_process_request_sense()
1918 ch->hold[i]->ccb_h.status |= CAM_AUTOSNS_VALID; in mvs_process_request_sense()
1920 ch->hold[i]->ccb_h.status &= ~CAM_STATUS_MASK; in mvs_process_request_sense()
1921 ch->hold[i]->ccb_h.status |= CAM_AUTOSENSE_FAIL; in mvs_process_request_sense()
1923 xpt_done(ch->hold[i]); in mvs_process_request_sense()
1924 ch->hold[i] = NULL; in mvs_process_request_sense()
1925 ch->numhslots--; in mvs_process_request_sense()
1927 xpt_release_simq(ch->sim, TRUE); in mvs_process_request_sense()
1951 struct mvs_channel *ch = device_get_softc(dev); in mvs_requeue_frozen() local
1952 union ccb *fccb = ch->frozen; in mvs_requeue_frozen()
1955 ch->frozen = NULL; in mvs_requeue_frozen()
1969 struct mvs_channel *ch = device_get_softc(dev); in mvs_reset_to() local
1972 if (ch->resetting == 0) in mvs_reset_to()
1974 ch->resetting--; in mvs_reset_to()
1979 (310 - ch->resetting) * 100); in mvs_reset_to()
1981 ch->resetting = 0; in mvs_reset_to()
1982 xpt_release_simq(ch->sim, TRUE); in mvs_reset_to()
1985 if (ch->resetting == 0) { in mvs_reset_to()
1988 xpt_release_simq(ch->sim, TRUE); in mvs_reset_to()
1991 callout_schedule(&ch->reset_timer, hz / 10); in mvs_reset_to()
1997 struct mvs_channel *ch = device_get_softc(dev); in mvs_errata() local
2000 if (ch->quirks & MVS_Q_SOC65) { in mvs_errata()
2001 val = ATA_INL(ch->r_mem, SATA_PHYM3); in mvs_errata()
2006 ATA_OUTL(ch->r_mem, SATA_PHYM3, val); in mvs_errata()
2008 val = ATA_INL(ch->r_mem, SATA_PHYM4); in mvs_errata()
2011 ATA_OUTL(ch->r_mem, SATA_PHYM4, val); in mvs_errata()
2013 val = ATA_INL(ch->r_mem, SATA_PHYM9_GEN2); in mvs_errata()
2017 ATA_OUTL(ch->r_mem, SATA_PHYM9_GEN2, val); in mvs_errata()
2019 val = ATA_INL(ch->r_mem, SATA_PHYM9_GEN1); in mvs_errata()
2023 ATA_OUTL(ch->r_mem, SATA_PHYM9_GEN1, val); in mvs_errata()
2030 struct mvs_channel *ch = device_get_softc(dev); in mvs_reset() local
2033 xpt_freeze_simq(ch->sim, 1); in mvs_reset()
2037 if (ch->resetting) { in mvs_reset()
2038 ch->resetting = 0; in mvs_reset()
2039 callout_stop(&ch->reset_timer); in mvs_reset()
2040 xpt_release_simq(ch->sim, TRUE); in mvs_reset()
2046 ATA_OUTL(ch->r_mem, DMA_C, 0); in mvs_reset()
2049 if (ch->slot[i].state < MVS_SLOT_RUNNING) in mvs_reset()
2052 mvs_end_transaction(&ch->slot[i], MVS_ERR_INNOCENT); in mvs_reset()
2055 if (!ch->hold[i]) in mvs_reset()
2057 xpt_done(ch->hold[i]); in mvs_reset()
2058 ch->hold[i] = NULL; in mvs_reset()
2059 ch->numhslots--; in mvs_reset()
2061 if (ch->toslots != 0) in mvs_reset()
2062 xpt_release_simq(ch->sim, TRUE); in mvs_reset()
2063 ch->eslots = 0; in mvs_reset()
2064 ch->toslots = 0; in mvs_reset()
2065 ch->fatalerr = 0; in mvs_reset()
2066 ch->fake_busy = 0; in mvs_reset()
2068 xpt_async(AC_BUS_RESET, ch->path, NULL); in mvs_reset()
2069 ATA_OUTL(ch->r_mem, EDMA_IEM, 0); in mvs_reset()
2070 ATA_OUTL(ch->r_mem, EDMA_CMD, EDMA_CMD_EATARST); in mvs_reset()
2072 ATA_OUTL(ch->r_mem, EDMA_CMD, 0); in mvs_reset()
2078 ch->devices = 0; in mvs_reset()
2079 ATA_OUTL(ch->r_mem, SATA_SE, 0xffffffff); in mvs_reset()
2080 ATA_OUTL(ch->r_mem, EDMA_IEC, 0); in mvs_reset()
2081 ATA_OUTL(ch->r_mem, EDMA_IEM, ~EDMA_IE_TRANSIENT); in mvs_reset()
2082 xpt_release_simq(ch->sim, TRUE); in mvs_reset()
2094 ch->resetting = 310; in mvs_reset()
2097 ch->devices = 1; in mvs_reset()
2098 ATA_OUTL(ch->r_mem, SATA_SE, 0xffffffff); in mvs_reset()
2099 ATA_OUTL(ch->r_mem, EDMA_IEC, 0); in mvs_reset()
2100 ATA_OUTL(ch->r_mem, EDMA_IEM, ~EDMA_IE_TRANSIENT); in mvs_reset()
2101 if (ch->resetting) in mvs_reset()
2102 callout_reset(&ch->reset_timer, hz / 10, mvs_reset_to, dev); in mvs_reset()
2104 xpt_release_simq(ch->sim, TRUE); in mvs_reset()
2110 struct mvs_channel *ch = device_get_softc(dev); in mvs_softreset() local
2116 ATA_OUTB(ch->r_mem, SATA_SATAICTL, port << SATA_SATAICTL_PMPTX_SHIFT); in mvs_softreset()
2117 ATA_OUTB(ch->r_mem, ATA_CONTROL, ATA_A_RESET); in mvs_softreset()
2119 ATA_OUTB(ch->r_mem, ATA_CONTROL, 0); in mvs_softreset()
2142 if (stuck && ch->pm_present && port != 15) { in mvs_softreset()
2143 ATA_OUTB(ch->r_mem, SATA_SATAICTL, in mvs_softreset()
2145 ATA_OUTB(ch->r_mem, ATA_CONTROL, ATA_A_RESET); in mvs_softreset()
2147 ATA_OUTB(ch->r_mem, ATA_CONTROL, 0); in mvs_softreset()
2155 mvs_sata_connect(struct mvs_channel *ch) in mvs_sata_connect() argument
2162 status = ATA_INL(ch->r_mem, SATA_SS); in mvs_sata_connect()
2171 device_printf(ch->dev, "SATA offline status=%08x\n", in mvs_sata_connect()
2182 device_printf(ch->dev, in mvs_sata_connect()
2189 device_printf(ch->dev, "SATA connect time=%dus status=%08x\n", in mvs_sata_connect()
2193 ATA_OUTL(ch->r_mem, SATA_SE, 0xffffffff); in mvs_sata_connect()
2200 struct mvs_channel *ch = device_get_softc(dev); in mvs_sata_phy_reset() local
2204 sata_rev = ch->user[ch->pm_present ? 15 : 0].revision; in mvs_sata_phy_reset()
2213 ATA_OUTL(ch->r_mem, SATA_SC, in mvs_sata_phy_reset()
2217 ATA_OUTL(ch->r_mem, SATA_SC, in mvs_sata_phy_reset()
2218 SATA_SC_DET_IDLE | val | ((ch->pm_level > 0) ? 0 : in mvs_sata_phy_reset()
2220 if (!mvs_sata_connect(ch)) { in mvs_sata_phy_reset()
2221 if (ch->pm_level > 0) in mvs_sata_phy_reset()
2222 ATA_OUTL(ch->r_mem, SATA_SC, SATA_SC_DET_DISABLE); in mvs_sata_phy_reset()
2231 struct mvs_channel *ch = device_get_softc(dev); in mvs_check_ids() local
2233 if (ccb->ccb_h.target_id > ((ch->quirks & MVS_Q_GENI) ? 0 : 15)) { in mvs_check_ids()
2256 struct mvs_channel *ch; in mvsaction() local
2261 ch = (struct mvs_channel *)cam_sim_softc(sim); in mvsaction()
2262 dev = ch->dev; in mvsaction()
2269 if (ch->devices == 0 || in mvsaction()
2270 (ch->pm_present == 0 && in mvsaction()
2279 ch->frozen = ccb; in mvsaction()
2281 xpt_freeze_simq(ch->sim, 1); in mvsaction()
2298 d = &ch->curr[ccb->ccb_h.target_id]; in mvsaction()
2300 d = &ch->user[ccb->ccb_h.target_id]; in mvsaction()
2306 d->bytecount = min((ch->quirks & MVS_Q_GENIIE) ? 8192 : 2048, in mvsaction()
2312 ch->pm_present = cts->xport_specific.sata.pm_present; in mvsaction()
2330 d = &ch->curr[ccb->ccb_h.target_id]; in mvsaction()
2332 d = &ch->user[ccb->ccb_h.target_id]; in mvsaction()
2341 (ccb->ccb_h.target_id == 0 && !ch->pm_present))) { in mvsaction()
2342 status = ATA_INL(ch->r_mem, SATA_SS) & SATA_SS_SPD_MASK; in mvsaction()
2354 ch->user[ccb->ccb_h.target_id].caps; in mvsaction()
2369 cts->xport_specific.sata.pm_present = ch->pm_present; in mvsaction()
2394 if (!(ch->quirks & MVS_Q_GENI)) { in mvsaction()
2397 if ((ch->quirks & MVS_Q_GENIIE) || ch->pm_present == 0) in mvsaction()
2403 if (!(ch->quirks & MVS_Q_GENI)) in mvsaction()
2420 if ((ch->quirks & MVS_Q_SOC) == 0) { in mvsaction()
2439 struct mvs_channel *ch = (struct mvs_channel *)cam_sim_softc(sim); in mvspoll() local
2442 arg.arg = ch->dev; in mvspoll()
2445 if (ch->resetting != 0 && in mvspoll()
2446 (--ch->resetpolldiv <= 0 || !callout_pending(&ch->reset_timer))) { in mvspoll()
2447 ch->resetpolldiv = 1000; in mvspoll()
2448 mvs_reset_to(ch->dev); in mvspoll()