• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/sys/dev/aic7xxx/

Lines Matching defs:ahd

51 static __inline char *ahd_name(struct ahd_softc *ahd);
54 ahd_name(struct ahd_softc *ahd)
56 return (ahd->name);
60 static __inline void ahd_known_modes(struct ahd_softc *ahd,
62 static __inline ahd_mode_state ahd_build_mode_state(struct ahd_softc *ahd,
65 static __inline void ahd_extract_mode_state(struct ahd_softc *ahd,
68 static __inline void ahd_set_modes(struct ahd_softc *ahd, ahd_mode src,
70 static __inline void ahd_update_modes(struct ahd_softc *ahd);
71 static __inline void ahd_assert_modes(struct ahd_softc *ahd, ahd_mode srcmode,
74 static __inline ahd_mode_state ahd_save_modes(struct ahd_softc *ahd);
75 static __inline void ahd_restore_modes(struct ahd_softc *ahd,
77 static __inline int ahd_is_paused(struct ahd_softc *ahd);
78 static __inline void ahd_pause(struct ahd_softc *ahd);
79 static __inline void ahd_unpause(struct ahd_softc *ahd);
82 ahd_known_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
84 ahd->src_mode = src;
85 ahd->dst_mode = dst;
86 ahd->saved_src_mode = src;
87 ahd->saved_dst_mode = dst;
91 ahd_build_mode_state(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
97 ahd_extract_mode_state(struct ahd_softc *ahd, ahd_mode_state state,
105 ahd_set_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
107 if (ahd->src_mode == src && ahd->dst_mode == dst)
110 if (ahd->src_mode == AHD_MODE_UNKNOWN
111 || ahd->dst_mode == AHD_MODE_UNKNOWN)
114 printf("%s: Setting mode 0x%x\n", ahd_name(ahd),
115 ahd_build_mode_state(ahd, src, dst));
117 ahd_outb(ahd, MODE_PTR, ahd_build_mode_state(ahd, src, dst));
118 ahd->src_mode = src;
119 ahd->dst_mode = dst;
123 ahd_update_modes(struct ahd_softc *ahd)
129 mode_ptr = ahd_inb(ahd, MODE_PTR);
134 ahd_extract_mode_state(ahd, mode_ptr, &src, &dst);
135 ahd_known_modes(ahd, src, dst);
139 ahd_assert_modes(struct ahd_softc *ahd, ahd_mode srcmode,
143 if ((srcmode & AHD_MK_MSK(ahd->src_mode)) == 0
144 || (dstmode & AHD_MK_MSK(ahd->dst_mode)) == 0) {
146 ahd_name(ahd), file, line);
152 ahd_save_modes(struct ahd_softc *ahd)
154 if (ahd->src_mode == AHD_MODE_UNKNOWN
155 || ahd->dst_mode == AHD_MODE_UNKNOWN)
156 ahd_update_modes(ahd);
158 return (ahd_build_mode_state(ahd, ahd->src_mode, ahd->dst_mode));
162 ahd_restore_modes(struct ahd_softc *ahd, ahd_mode_state state)
167 ahd_extract_mode_state(ahd, state, &src, &dst);
168 ahd_set_modes(ahd, src, dst);
171 #define AHD_ASSERT_MODES(ahd, source, dest) \
172 ahd_assert_modes(ahd, source, dest, __FILE__, __LINE__);
179 ahd_is_paused(struct ahd_softc *ahd)
181 return ((ahd_inb(ahd, HCNTRL) & PAUSE) != 0);
192 ahd_pause(struct ahd_softc *ahd)
194 ahd_outb(ahd, HCNTRL, ahd->pause);
200 while (ahd_is_paused(ahd) == 0)
215 ahd_unpause(struct ahd_softc *ahd)
221 if (ahd->saved_src_mode != AHD_MODE_UNKNOWN
222 && ahd->saved_dst_mode != AHD_MODE_UNKNOWN) {
223 if ((ahd->flags & AHD_UPDATE_PEND_CMDS) != 0)
224 ahd_reset_cmds_pending(ahd);
225 ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
228 if ((ahd_inb(ahd, INTSTAT) & ~CMDCMPLT) == 0)
229 ahd_outb(ahd, HCNTRL, ahd->unpause);
231 ahd_known_modes(ahd, AHD_MODE_UNKNOWN, AHD_MODE_UNKNOWN);
235 static __inline void *ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb,
238 static __inline void ahd_setup_scb_common(struct ahd_softc *ahd,
240 static __inline void ahd_setup_data_scb(struct ahd_softc *ahd,
242 static __inline void ahd_setup_noxfer_scb(struct ahd_softc *ahd,
246 ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb,
251 && (ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
270 ahd_setup_scb_common(struct ahd_softc *ahd, struct scb *scb)
291 ahd_setup_data_scb(struct ahd_softc *ahd, struct scb *scb)
296 if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
310 if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
328 ahd_setup_noxfer_scb(struct ahd_softc *ahd, struct scb *scb)
336 static __inline size_t ahd_sg_size(struct ahd_softc *ahd);
338 ahd_sg_bus_to_virt(struct ahd_softc *ahd,
342 ahd_sg_virt_to_bus(struct ahd_softc *ahd,
345 static __inline void ahd_sync_scb(struct ahd_softc *ahd,
347 static __inline void ahd_sync_sglist(struct ahd_softc *ahd,
349 static __inline void ahd_sync_sense(struct ahd_softc *ahd,
352 ahd_targetcmd_offset(struct ahd_softc *ahd,
356 ahd_sg_size(struct ahd_softc *ahd)
358 if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0)
364 ahd_sg_bus_to_virt(struct ahd_softc *ahd, struct scb *scb, uint32_t sg_busaddr)
369 sg_offset = sg_busaddr - (scb->sg_list_busaddr - ahd_sg_size(ahd));
374 ahd_sg_virt_to_bus(struct ahd_softc *ahd, struct scb *scb, void *sg)
380 - ahd_sg_size(ahd);
386 ahd_sync_scb(struct ahd_softc *ahd, struct scb *scb, int op)
388 aic_dmamap_sync(ahd, ahd->scb_data.hscb_dmat,
395 ahd_sync_sglist(struct ahd_softc *ahd, struct scb *scb, int op)
400 aic_dmamap_sync(ahd, ahd->scb_data.sg_dmat,
402 /*offset*/scb->sg_list_busaddr - ahd_sg_size(ahd),
403 /*len*/ahd_sg_size(ahd) * scb->sg_count, op);
407 ahd_sync_sense(struct ahd_softc *ahd, struct scb *scb, int op)
409 aic_dmamap_sync(ahd, ahd->scb_data.sense_dmat,
416 ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index)
418 return (((uint8_t *)&ahd->targetcmds[index])
419 - (uint8_t *)ahd->qoutfifo);
423 static __inline void ahd_complete_scb(struct ahd_softc *ahd,
425 static __inline void ahd_update_residual(struct ahd_softc *ahd,
428 ahd_fetch_transinfo(struct ahd_softc *ahd,
433 ahd_inw(struct ahd_softc *ahd, u_int port);
434 static __inline void ahd_outw(struct ahd_softc *ahd, u_int port,
437 ahd_inl(struct ahd_softc *ahd, u_int port);
438 static __inline void ahd_outl(struct ahd_softc *ahd, u_int port,
441 ahd_inq(struct ahd_softc *ahd, u_int port);
442 static __inline void ahd_outq(struct ahd_softc *ahd, u_int port,
444 static __inline u_int ahd_get_scbptr(struct ahd_softc *ahd);
445 static __inline void ahd_set_scbptr(struct ahd_softc *ahd, u_int scbptr);
446 static __inline u_int ahd_get_hnscb_qoff(struct ahd_softc *ahd);
447 static __inline void ahd_set_hnscb_qoff(struct ahd_softc *ahd, u_int value);
448 static __inline u_int ahd_get_hescb_qoff(struct ahd_softc *ahd);
449 static __inline void ahd_set_hescb_qoff(struct ahd_softc *ahd, u_int value);
450 static __inline u_int ahd_get_snscb_qoff(struct ahd_softc *ahd);
451 static __inline void ahd_set_snscb_qoff(struct ahd_softc *ahd, u_int value);
452 static __inline u_int ahd_get_sescb_qoff(struct ahd_softc *ahd);
453 static __inline void ahd_set_sescb_qoff(struct ahd_softc *ahd, u_int value);
454 static __inline u_int ahd_get_sdscb_qoff(struct ahd_softc *ahd);
455 static __inline void ahd_set_sdscb_qoff(struct ahd_softc *ahd, u_int value);
456 static __inline u_int ahd_inb_scbram(struct ahd_softc *ahd, u_int offset);
457 static __inline u_int ahd_inw_scbram(struct ahd_softc *ahd, u_int offset);
459 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset);
461 ahd_inq_scbram(struct ahd_softc *ahd, u_int offset);
462 static __inline void ahd_swap_with_next_hscb(struct ahd_softc *ahd,
464 static __inline void ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb);
466 ahd_get_sense_buf(struct ahd_softc *ahd,
469 ahd_get_sense_bufaddr(struct ahd_softc *ahd,
473 ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb)
479 ahd_handle_scb_status(ahd, scb);
481 ahd_done(ahd, scb);
489 ahd_update_residual(struct ahd_softc *ahd, struct scb *scb)
495 ahd_calc_residual(ahd, scb);
503 ahd_fetch_transinfo(struct ahd_softc *ahd, char channel, u_int our_id,
514 *tstate = ahd->enabled_targets[our_id];
525 ahd_inw(struct ahd_softc *ahd, u_int port)
532 return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port));
536 ahd_outw(struct ahd_softc *ahd, u_int port, u_int value)
542 ahd_outb(ahd, port, value & 0xFF);
543 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
547 ahd_inl(struct ahd_softc *ahd, u_int port)
549 return ((ahd_inb(ahd, port))
550 | (ahd_inb(ahd, port+1) << 8)
551 | (ahd_inb(ahd, port+2) << 16)
552 | (ahd_inb(ahd, port+3) << 24));
556 ahd_outl(struct ahd_softc *ahd, u_int port, uint32_t value)
558 ahd_outb(ahd, port, (value) & 0xFF);
559 ahd_outb(ahd, port+1, ((value) >> 8) & 0xFF);
560 ahd_outb(ahd, port+2, ((value) >> 16) & 0xFF);
561 ahd_outb(ahd, port+3, ((value) >> 24) & 0xFF);
565 ahd_inq(struct ahd_softc *ahd, u_int port)
567 return ((ahd_inb(ahd, port))
568 | (ahd_inb(ahd, port+1) << 8)
569 | (ahd_inb(ahd, port+2) << 16)
570 | (ahd_inb(ahd, port+3) << 24)
571 | (((uint64_t)ahd_inb(ahd, port+4)) << 32)
572 | (((uint64_t)ahd_inb(ahd, port+5)) << 40)
573 | (((uint64_t)ahd_inb(ahd, port+6)) << 48)
574 | (((uint64_t)ahd_inb(ahd, port+7)) << 56));
578 ahd_outq(struct ahd_softc *ahd, u_int port, uint64_t value)
580 ahd_outb(ahd, port, value & 0xFF);
581 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
582 ahd_outb(ahd, port+2, (value >> 16) & 0xFF);
583 ahd_outb(ahd, port+3, (value >> 24) & 0xFF);
584 ahd_outb(ahd, port+4, (value >> 32) & 0xFF);
585 ahd_outb(ahd, port+5, (value >> 40) & 0xFF);
586 ahd_outb(ahd, port+6, (value >> 48) & 0xFF);
587 ahd_outb(ahd, port+7, (value >> 56) & 0xFF);
591 ahd_get_scbptr(struct ahd_softc *ahd)
593 AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
595 return (ahd_inb(ahd, SCBPTR) | (ahd_inb(ahd, SCBPTR + 1) << 8));
599 ahd_set_scbptr(struct ahd_softc *ahd, u_int scbptr)
601 AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
603 ahd_outb(ahd, SCBPTR, scbptr & 0xFF);
604 ahd_outb(ahd, SCBPTR+1, (scbptr >> 8) & 0xFF);
608 ahd_get_hnscb_qoff(struct ahd_softc *ahd)
610 return (ahd_inw_atomic(ahd, HNSCB_QOFF));
614 ahd_set_hnscb_qoff(struct ahd_softc *ahd, u_int value)
616 ahd_outw_atomic(ahd, HNSCB_QOFF, value);
620 ahd_get_hescb_qoff(struct ahd_softc *ahd)
622 return (ahd_inb(ahd, HESCB_QOFF));
626 ahd_set_hescb_qoff(struct ahd_softc *ahd, u_int value)
628 ahd_outb(ahd, HESCB_QOFF, value);
632 ahd_get_snscb_qoff(struct ahd_softc *ahd)
636 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
637 oldvalue = ahd_inw(ahd, SNSCB_QOFF);
638 ahd_outw(ahd, SNSCB_QOFF, oldvalue);
643 ahd_set_snscb_qoff(struct ahd_softc *ahd, u_int value)
645 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
646 ahd_outw(ahd, SNSCB_QOFF, value);
650 ahd_get_sescb_qoff(struct ahd_softc *ahd)
652 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
653 return (ahd_inb(ahd, SESCB_QOFF));
657 ahd_set_sescb_qoff(struct ahd_softc *ahd, u_int value)
659 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
660 ahd_outb(ahd, SESCB_QOFF, value);
664 ahd_get_sdscb_qoff(struct ahd_softc *ahd)
666 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
667 return (ahd_inb(ahd, SDSCB_QOFF) | (ahd_inb(ahd, SDSCB_QOFF + 1) << 8));
671 ahd_set_sdscb_qoff(struct ahd_softc *ahd, u_int value)
673 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
674 ahd_outb(ahd, SDSCB_QOFF, value & 0xFF);
675 ahd_outb(ahd, SDSCB_QOFF+1, (value >> 8) & 0xFF);
679 ahd_inb_scbram(struct ahd_softc *ahd, u_int offset)
697 value = ahd_inb(ahd, offset);
698 if ((ahd->bugs & AHD_PCIX_SCBRAM_RD_BUG) != 0)
699 ahd_inb(ahd, MODE_PTR);
704 ahd_inw_scbram(struct ahd_softc *ahd, u_int offset)
706 return (ahd_inb_scbram(ahd, offset)
707 | (ahd_inb_scbram(ahd, offset+1) << 8));
711 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset)
713 return (ahd_inw_scbram(ahd, offset)
714 | (ahd_inw_scbram(ahd, offset+2) << 16));
718 ahd_inq_scbram(struct ahd_softc *ahd, u_int offset)
720 return (ahd_inl_scbram(ahd, offset)
721 | ((uint64_t)ahd_inl_scbram(ahd, offset+4)) << 32);
725 ahd_lookup_scb(struct ahd_softc *ahd, u_int tag)
731 scb = ahd->scb_data.scbindex[tag];
733 ahd_sync_scb(ahd, scb,
739 ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb)
749 * HSCB to download is saved off in ahd->next_queued_hscb.
757 q_hscb = ahd->next_queued_hscb;
758 q_hscb_map = ahd->next_queued_hscb_map;
765 ahd->next_queued_hscb = scb->hscb;
766 ahd->next_queued_hscb_map = scb->hscb_map;
771 ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = scb;
778 ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb)
780 ahd_swap_with_next_hscb(ahd, scb);
789 ahd->qinfifo[AHD_QIN_WRAP(ahd->qinfifonext)] = SCB_GET_TAG(scb);
790 ahd->qinfifonext++;
793 ahd_setup_data_scb(ahd, scb);
795 ahd_setup_noxfer_scb(ahd, scb);
796 ahd_setup_scb_common(ahd, scb);
802 ahd_sync_scb(ahd, scb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
810 ahd_name(ahd),
819 ahd_set_hnscb_qoff(ahd, ahd->qinfifonext);
823 ahd_get_sense_buf(struct ahd_softc *ahd, struct scb *scb)
829 ahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb)
835 static __inline void ahd_sync_qoutfifo(struct ahd_softc *ahd, int op);
836 static __inline void ahd_sync_tqinfifo(struct ahd_softc *ahd, int op);
837 static __inline u_int ahd_check_cmdcmpltqueues(struct ahd_softc *ahd);
838 static __inline int ahd_intr(struct ahd_softc *ahd);
841 ahd_sync_qoutfifo(struct ahd_softc *ahd, int op)
843 aic_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
849 ahd_sync_tqinfifo(struct ahd_softc *ahd, int op)
852 if ((ahd->flags & AHD_TARGETROLE) != 0) {
853 aic_dmamap_sync(ahd, ahd->shared_data_dmat,
854 ahd->shared_data_map.dmamap,
855 ahd_targetcmd_offset(ahd, 0),
869 ahd_check_cmdcmpltqueues(struct ahd_softc *ahd)
874 aic_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
875 /*offset*/ahd->qoutfifonext * sizeof(*ahd->qoutfifo),
876 /*len*/sizeof(*ahd->qoutfifo), BUS_DMASYNC_POSTREAD);
877 if (ahd->qoutfifo[ahd->qoutfifonext].valid_tag
878 == ahd->qoutfifonext_valid_tag)
881 if ((ahd->flags & AHD_TARGETROLE) != 0
882 && (ahd->flags & AHD_TQINFIFO_BLOCKED) == 0) {
883 aic_dmamap_sync(ahd, ahd->shared_data_dmat,
884 ahd->shared_data_map.dmamap,
885 ahd_targetcmd_offset(ahd, ahd->tqinfifofnext),
888 if (ahd->targetcmds[ahd->tqinfifonext].cmd_valid != 0)
899 ahd_intr(struct ahd_softc *ahd)
903 if ((ahd->pause & INTEN) == 0) {
919 if ((ahd->flags & AHD_ALL_INTERRUPTS) == 0
920 && (ahd_check_cmdcmpltqueues(ahd) != 0))
923 intstat = ahd_inb(ahd, INTSTAT);
929 ahd_outb(ahd, CLRINT, CLRCMDINT);
939 if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {
940 if (ahd_is_paused(ahd)) {
946 if (ahd_inb(ahd, SEQINTCODE) != NO_SEQINT)
950 ahd_flush_device_writes(ahd);
952 ahd_run_qoutfifo(ahd);
953 ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]++;
954 ahd->cmdcmplt_total++;
956 if ((ahd->flags & AHD_TARGETROLE) != 0)
957 ahd_run_tqinfifo(ahd, /*paused*/FALSE);
965 if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0) {
968 ahd_handle_hwerrint(ahd);
970 ahd->bus_intr(ahd);
974 ahd_handle_seqint(ahd, intstat);
977 ahd_handle_scsiint(ahd, intstat);