Lines Matching defs:ahd
57 ahd_name(struct ahd_softc *ahd)
59 return (ahd->name);
79 ahd_known_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
81 ahd->src_mode = src;
82 ahd->dst_mode = dst;
83 ahd->saved_src_mode = src;
84 ahd->saved_dst_mode = dst;
88 ahd_build_mode_state(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
94 ahd_extract_mode_state(struct ahd_softc *ahd, ahd_mode_state state,
102 ahd_set_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
104 if (ahd->src_mode == src && ahd->dst_mode == dst)
107 if (ahd->src_mode == AHD_MODE_UNKNOWN
108 || ahd->dst_mode == AHD_MODE_UNKNOWN)
111 printf("%s: Setting mode 0x%x\n", ahd_name(ahd),
112 ahd_build_mode_state(ahd, src, dst));
114 ahd_outb(ahd, MODE_PTR, ahd_build_mode_state(ahd, src, dst));
115 ahd->src_mode = src;
116 ahd->dst_mode = dst;
120 ahd_update_modes(struct ahd_softc *ahd)
126 mode_ptr = ahd_inb(ahd, MODE_PTR);
131 ahd_extract_mode_state(ahd, mode_ptr, &src, &dst);
132 ahd_known_modes(ahd, src, dst);
136 ahd_assert_modes(struct ahd_softc *ahd, ahd_mode srcmode,
140 if ((srcmode & AHD_MK_MSK(ahd->src_mode)) == 0
141 || (dstmode & AHD_MK_MSK(ahd->dst_mode)) == 0) {
143 ahd_name(ahd), file, line);
149 ahd_save_modes(struct ahd_softc *ahd)
151 if (ahd->src_mode == AHD_MODE_UNKNOWN
152 || ahd->dst_mode == AHD_MODE_UNKNOWN)
153 ahd_update_modes(ahd);
155 return (ahd_build_mode_state(ahd, ahd->src_mode, ahd->dst_mode));
159 ahd_restore_modes(struct ahd_softc *ahd, ahd_mode_state state)
164 ahd_extract_mode_state(ahd, state, &src, &dst);
165 ahd_set_modes(ahd, src, dst);
168 #define AHD_ASSERT_MODES(ahd, source, dest) \
169 ahd_assert_modes(ahd, source, dest, __FILE__, __LINE__);
176 ahd_is_paused(struct ahd_softc *ahd)
178 return ((ahd_inb(ahd, HCNTRL) & PAUSE) != 0);
189 ahd_pause(struct ahd_softc *ahd)
191 ahd_outb(ahd, HCNTRL, ahd->pause);
197 while (ahd_is_paused(ahd) == 0)
212 ahd_unpause(struct ahd_softc *ahd)
218 if (ahd->saved_src_mode != AHD_MODE_UNKNOWN
219 && ahd->saved_dst_mode != AHD_MODE_UNKNOWN) {
220 if ((ahd->flags & AHD_UPDATE_PEND_CMDS) != 0)
221 ahd_reset_cmds_pending(ahd);
222 ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
225 if ((ahd_inb(ahd, INTSTAT) & ~CMDCMPLT) == 0)
226 ahd_outb(ahd, HCNTRL, ahd->unpause);
228 ahd_known_modes(ahd, AHD_MODE_UNKNOWN, AHD_MODE_UNKNOWN);
239 ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb,
244 && (ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
263 ahd_setup_scb_common(struct ahd_softc *ahd, struct scb *scb)
284 ahd_setup_data_scb(struct ahd_softc *ahd, struct scb *scb)
289 if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
303 if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
321 ahd_setup_noxfer_scb(struct ahd_softc *ahd, struct scb *scb)
343 ahd_sg_size(struct ahd_softc *ahd)
345 if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0)
351 ahd_sg_bus_to_virt(struct ahd_softc *ahd, struct scb *scb, uint32_t sg_busaddr)
356 sg_offset = sg_busaddr - (scb->sg_list_busaddr - ahd_sg_size(ahd));
361 ahd_sg_virt_to_bus(struct ahd_softc *ahd, struct scb *scb, void *sg)
367 - ahd_sg_size(ahd);
373 ahd_sync_scb(struct ahd_softc *ahd, struct scb *scb, int op)
375 ahd_dmamap_sync(ahd, ahd->parent_dmat, scb->hscb_map->dmamap,
381 ahd_sync_sglist(struct ahd_softc *ahd, struct scb *scb, int op)
386 ahd_dmamap_sync(ahd, ahd->parent_dmat, scb->sg_map->dmamap,
387 /*offset*/scb->sg_list_busaddr - ahd_sg_size(ahd),
388 /*len*/ahd_sg_size(ahd) * scb->sg_count, op);
392 ahd_sync_sense(struct ahd_softc *ahd, struct scb *scb, int op)
394 ahd_dmamap_sync(ahd, ahd->parent_dmat,
401 ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index)
403 return (((uint8_t *)&ahd->targetcmds[index])
404 - (uint8_t *)ahd->qoutfifo);
439 ahd_inq_scbram(struct ahd_softc *ahd, u_int offset);
451 ahd_post_scb(struct ahd_softc *ahd, struct scb *scb)
457 ahd_handle_scb_status(ahd, scb);
459 ahd_done(ahd, scb);
463 ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb)
469 ahd_handle_scb_status(ahd, scb);
471 ahd_done(ahd, scb);
479 ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
485 ahd_calc_residual(ahd, scb);
493 ahd_fetch_transinfo(struct ahd_softc *ahd, char channel, u_int our_id,
504 *tstate = ahd->enabled_targets[our_id];
515 ahd_inw(struct ahd_softc *ahd, u_int port)
517 return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port));
521 ahd_outw(struct ahd_softc *ahd, u_int port, u_int value)
523 ahd_outb(ahd, port, value & 0xFF);
524 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
528 ahd_inl(struct ahd_softc *ahd, u_int port)
530 return ((ahd_inb(ahd, port))
531 | (ahd_inb(ahd, port+1) << 8)
532 | (ahd_inb(ahd, port+2) << 16)
533 | (ahd_inb(ahd, port+3) << 24));
537 ahd_outl(struct ahd_softc *ahd, u_int port, uint32_t value)
539 ahd_outb(ahd, port, (value) & 0xFF);
540 ahd_outb(ahd, port+1, ((value) >> 8) & 0xFF);
541 ahd_outb(ahd, port+2, ((value) >> 16) & 0xFF);
542 ahd_outb(ahd, port+3, ((value) >> 24) & 0xFF);
546 ahd_inq(struct ahd_softc *ahd, u_int port)
548 return ((ahd_inb(ahd, port))
549 | (ahd_inb(ahd, port+1) << 8)
550 | (ahd_inb(ahd, port+2) << 16)
551 | (((uint64_t)ahd_inb(ahd, port+3)) << 24)
552 | (((uint64_t)ahd_inb(ahd, port+4)) << 32)
553 | (((uint64_t)ahd_inb(ahd, port+5)) << 40)
554 | (((uint64_t)ahd_inb(ahd, port+6)) << 48)
555 | (((uint64_t)ahd_inb(ahd, port+7)) << 56));
559 ahd_outq(struct ahd_softc *ahd, u_int port, uint64_t value)
561 ahd_outb(ahd, port, value & 0xFF);
562 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
563 ahd_outb(ahd, port+2, (value >> 16) & 0xFF);
564 ahd_outb(ahd, port+3, (value >> 24) & 0xFF);
565 ahd_outb(ahd, port+4, (value >> 32) & 0xFF);
566 ahd_outb(ahd, port+5, (value >> 40) & 0xFF);
567 ahd_outb(ahd, port+6, (value >> 48) & 0xFF);
568 ahd_outb(ahd, port+7, (value >> 56) & 0xFF);
572 ahd_get_scbptr(struct ahd_softc *ahd)
574 AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
576 return (ahd_inb(ahd, SCBPTR) | (ahd_inb(ahd, SCBPTR + 1) << 8));
580 ahd_set_scbptr(struct ahd_softc *ahd, u_int scbptr)
582 AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
584 ahd_outb(ahd, SCBPTR, scbptr & 0xFF);
585 ahd_outb(ahd, SCBPTR+1, (scbptr >> 8) & 0xFF);
589 ahd_get_hnscb_qoff(struct ahd_softc *ahd)
591 return (ahd_inw_atomic(ahd, HNSCB_QOFF));
595 ahd_set_hnscb_qoff(struct ahd_softc *ahd, u_int value)
597 ahd_outw_atomic(ahd, HNSCB_QOFF, value);
601 ahd_get_hescb_qoff(struct ahd_softc *ahd)
603 return (ahd_inb(ahd, HESCB_QOFF));
607 ahd_set_hescb_qoff(struct ahd_softc *ahd, u_int value)
609 ahd_outb(ahd, HESCB_QOFF, value);
613 ahd_get_snscb_qoff(struct ahd_softc *ahd)
617 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
618 oldvalue = ahd_inw(ahd, SNSCB_QOFF);
619 ahd_outw(ahd, SNSCB_QOFF, oldvalue);
624 ahd_set_snscb_qoff(struct ahd_softc *ahd, u_int value)
626 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
627 ahd_outw(ahd, SNSCB_QOFF, value);
631 ahd_get_sescb_qoff(struct ahd_softc *ahd)
633 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
634 return (ahd_inb(ahd, SESCB_QOFF));
638 ahd_set_sescb_qoff(struct ahd_softc *ahd, u_int value)
640 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
641 ahd_outb(ahd, SESCB_QOFF, value);
645 ahd_get_sdscb_qoff(struct ahd_softc *ahd)
647 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
648 return (ahd_inb(ahd, SDSCB_QOFF) | (ahd_inb(ahd, SDSCB_QOFF + 1) << 8));
652 ahd_set_sdscb_qoff(struct ahd_softc *ahd, u_int value)
654 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
655 ahd_outb(ahd, SDSCB_QOFF, value & 0xFF);
656 ahd_outb(ahd, SDSCB_QOFF+1, (value >> 8) & 0xFF);
660 ahd_inb_scbram(struct ahd_softc *ahd, u_int offset)
678 value = ahd_inb(ahd, offset);
679 if ((ahd->flags & AHD_PCIX_SCBRAM_RD_BUG) != 0)
680 ahd_inb(ahd, MODE_PTR);
685 ahd_inw_scbram(struct ahd_softc *ahd, u_int offset)
687 return (ahd_inb_scbram(ahd, offset)
688 | (ahd_inb_scbram(ahd, offset+1) << 8));
692 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset)
694 return (ahd_inw_scbram(ahd, offset)
695 | (ahd_inw_scbram(ahd, offset+2) << 16));
699 ahd_inq_scbram(struct ahd_softc *ahd, u_int offset)
701 return (ahd_inl_scbram(ahd, offset)
702 | ((uint64_t)ahd_inl_scbram(ahd, offset+4)) << 32);
706 ahd_lookup_scb(struct ahd_softc *ahd, u_int tag)
712 scb = ahd->scb_data.scbindex[tag];
714 ahd_sync_scb(ahd, scb,
720 ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb)
730 * HSCB to download is saved off in ahd->next_queued_hscb.
738 q_hscb = ahd->next_queued_hscb;
739 q_hscb_map = ahd->next_queued_hscb_map;
746 ahd->next_queued_hscb = scb->hscb;
747 ahd->next_queued_hscb_map = scb->hscb_map;
755 ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = scb;
762 ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb)
764 ahd_swap_with_next_hscb(ahd, scb);
773 ahd->qinfifo[AHD_QIN_WRAP(ahd->qinfifonext)] = SCB_GET_TAG(scb);
774 ahd->qinfifonext++;
777 ahd_setup_data_scb(ahd, scb);
779 ahd_setup_noxfer_scb(ahd, scb);
780 ahd_setup_scb_common(ahd, scb);
786 ahd_sync_scb(ahd, scb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
794 ahd_name(ahd),
802 ahd_set_hnscb_qoff(ahd, ahd->qinfifonext);
806 ahd_get_sense_buf(struct ahd_softc *ahd, struct scb *scb)
812 ahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb)
825 ahd_sync_qoutfifo(struct ahd_softc *ahd, int op)
827 ahd_dmamap_sync(ahd, ahd->parent_dmat, ahd->shared_data_map.dmamap,
832 ahd_sync_tqinfifo(struct ahd_softc *ahd, int op)
835 if ((ahd->flags & AHD_TARGETROLE) != 0) {
836 ahd_dmamap_sync(ahd, ahd->parent_dmat /*shared_data_dmat*/,
837 ahd->shared_data_map.dmamap,
838 ahd_targetcmd_offset(ahd, 0),
852 ahd_check_cmdcmpltqueues(struct ahd_softc *ahd)
857 ahd_dmamap_sync(ahd, ahd->parent_dmat /*shared_data_dmat*/, ahd->shared_data_map.dmamap,
858 /*offset*/ahd->qoutfifonext, /*len*/2,
860 if ((ahd->qoutfifo[ahd->qoutfifonext]
861 & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag)
864 if ((ahd->flags & AHD_TARGETROLE) != 0
865 && (ahd->flags & AHD_TQINFIFO_BLOCKED) == 0) {
866 ahd_dmamap_sync(ahd, ahd->parent_dmat /*shared_data_dmat*/,
867 ahd->shared_data_map.dmamap,
868 ahd_targetcmd_offset(ahd, ahd->tqinfifofnext),
871 if (ahd->targetcmds[ahd->tqinfifonext].cmd_valid != 0)
884 struct ahd_softc *ahd = arg;
887 if ((ahd->pause & INTEN) == 0) {
903 if ((ahd->flags & AHD_ALL_INTERRUPTS) == 0
904 && (ahd_check_cmdcmpltqueues(ahd) != 0))
907 intstat = ahd_inb(ahd, INTSTAT);
913 ahd_outb(ahd, CLRINT, CLRCMDINT);
923 if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {
924 if (ahd_is_paused(ahd)) {
930 if (ahd_inb(ahd, SEQINTCODE) != NO_SEQINT)
934 ahd_flush_device_writes(ahd);
936 scsipi_channel_freeze(&ahd->sc_channel, 1);
937 ahd_run_qoutfifo(ahd);
938 scsipi_channel_thaw(&ahd->sc_channel, 1);
939 ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]++;
940 ahd->cmdcmplt_total++;
942 if ((ahd->flags & AHD_TARGETROLE) != 0)
943 ahd_run_tqinfifo(ahd, /*paused*/FALSE);
953 if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0) {
956 ahd_handle_hwerrint(ahd);
958 ahd->bus_intr(ahd);
962 ahd_handle_seqint(ahd, intstat);
965 ahd_handle_scsiint(ahd, intstat);