• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500-V1.0.1.40_1.0.68/src/linux/linux-2.6/drivers/scsi/aic7xxx/

Lines Matching defs:ahd

49 static __inline char *ahd_name(struct ahd_softc *ahd);
52 ahd_name(struct ahd_softc *ahd)
54 return (ahd->name);
58 static __inline void ahd_known_modes(struct ahd_softc *ahd,
60 static __inline ahd_mode_state ahd_build_mode_state(struct ahd_softc *ahd,
63 static __inline void ahd_extract_mode_state(struct ahd_softc *ahd,
66 static __inline void ahd_set_modes(struct ahd_softc *ahd, ahd_mode src,
68 static __inline void ahd_update_modes(struct ahd_softc *ahd);
69 static __inline void ahd_assert_modes(struct ahd_softc *ahd, ahd_mode srcmode,
72 static __inline ahd_mode_state ahd_save_modes(struct ahd_softc *ahd);
73 static __inline void ahd_restore_modes(struct ahd_softc *ahd,
75 static __inline int ahd_is_paused(struct ahd_softc *ahd);
76 static __inline void ahd_pause(struct ahd_softc *ahd);
77 static __inline void ahd_unpause(struct ahd_softc *ahd);
80 ahd_known_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
82 ahd->src_mode = src;
83 ahd->dst_mode = dst;
84 ahd->saved_src_mode = src;
85 ahd->saved_dst_mode = dst;
89 ahd_build_mode_state(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
95 ahd_extract_mode_state(struct ahd_softc *ahd, ahd_mode_state state,
103 ahd_set_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst)
105 if (ahd->src_mode == src && ahd->dst_mode == dst)
108 if (ahd->src_mode == AHD_MODE_UNKNOWN
109 || ahd->dst_mode == AHD_MODE_UNKNOWN)
112 printf("%s: Setting mode 0x%x\n", ahd_name(ahd),
113 ahd_build_mode_state(ahd, src, dst));
115 ahd_outb(ahd, MODE_PTR, ahd_build_mode_state(ahd, src, dst));
116 ahd->src_mode = src;
117 ahd->dst_mode = dst;
121 ahd_update_modes(struct ahd_softc *ahd)
127 mode_ptr = ahd_inb(ahd, MODE_PTR);
132 ahd_extract_mode_state(ahd, mode_ptr, &src, &dst);
133 ahd_known_modes(ahd, src, dst);
137 ahd_assert_modes(struct ahd_softc *ahd, ahd_mode srcmode,
141 if ((srcmode & AHD_MK_MSK(ahd->src_mode)) == 0
142 || (dstmode & AHD_MK_MSK(ahd->dst_mode)) == 0) {
144 ahd_name(ahd), file, line);
150 ahd_save_modes(struct ahd_softc *ahd)
152 if (ahd->src_mode == AHD_MODE_UNKNOWN
153 || ahd->dst_mode == AHD_MODE_UNKNOWN)
154 ahd_update_modes(ahd);
156 return (ahd_build_mode_state(ahd, ahd->src_mode, ahd->dst_mode));
160 ahd_restore_modes(struct ahd_softc *ahd, ahd_mode_state state)
165 ahd_extract_mode_state(ahd, state, &src, &dst);
166 ahd_set_modes(ahd, src, dst);
169 #define AHD_ASSERT_MODES(ahd, source, dest) \
170 ahd_assert_modes(ahd, source, dest, __FILE__, __LINE__);
177 ahd_is_paused(struct ahd_softc *ahd)
179 return ((ahd_inb(ahd, HCNTRL) & PAUSE) != 0);
190 ahd_pause(struct ahd_softc *ahd)
192 ahd_outb(ahd, HCNTRL, ahd->pause);
198 while (ahd_is_paused(ahd) == 0)
213 ahd_unpause(struct ahd_softc *ahd)
219 if (ahd->saved_src_mode != AHD_MODE_UNKNOWN
220 && ahd->saved_dst_mode != AHD_MODE_UNKNOWN) {
221 if ((ahd->flags & AHD_UPDATE_PEND_CMDS) != 0)
222 ahd_reset_cmds_pending(ahd);
223 ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
226 if ((ahd_inb(ahd, INTSTAT) & ~CMDCMPLT) == 0)
227 ahd_outb(ahd, HCNTRL, ahd->unpause);
229 ahd_known_modes(ahd, AHD_MODE_UNKNOWN, AHD_MODE_UNKNOWN);
233 static __inline void *ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb,
236 static __inline void ahd_setup_scb_common(struct ahd_softc *ahd,
238 static __inline void ahd_setup_data_scb(struct ahd_softc *ahd,
240 static __inline void ahd_setup_noxfer_scb(struct ahd_softc *ahd,
244 ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb,
249 && (ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
268 ahd_setup_scb_common(struct ahd_softc *ahd, struct scb *scb)
287 ahd_setup_data_scb(struct ahd_softc *ahd, struct scb *scb)
292 if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
306 if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
324 ahd_setup_noxfer_scb(struct ahd_softc *ahd, struct scb *scb)
332 static __inline size_t ahd_sg_size(struct ahd_softc *ahd);
334 ahd_sg_bus_to_virt(struct ahd_softc *ahd,
338 ahd_sg_virt_to_bus(struct ahd_softc *ahd,
341 static __inline void ahd_sync_scb(struct ahd_softc *ahd,
343 static __inline void ahd_sync_sglist(struct ahd_softc *ahd,
345 static __inline void ahd_sync_sense(struct ahd_softc *ahd,
348 ahd_targetcmd_offset(struct ahd_softc *ahd,
352 ahd_sg_size(struct ahd_softc *ahd)
354 if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0)
360 ahd_sg_bus_to_virt(struct ahd_softc *ahd, struct scb *scb, uint32_t sg_busaddr)
365 sg_offset = sg_busaddr - (scb->sg_list_busaddr - ahd_sg_size(ahd));
370 ahd_sg_virt_to_bus(struct ahd_softc *ahd, struct scb *scb, void *sg)
376 - ahd_sg_size(ahd);
382 ahd_sync_scb(struct ahd_softc *ahd, struct scb *scb, int op)
384 ahd_dmamap_sync(ahd, ahd->scb_data.hscb_dmat,
391 ahd_sync_sglist(struct ahd_softc *ahd, struct scb *scb, int op)
396 ahd_dmamap_sync(ahd, ahd->scb_data.sg_dmat,
398 /*offset*/scb->sg_list_busaddr - ahd_sg_size(ahd),
399 /*len*/ahd_sg_size(ahd) * scb->sg_count, op);
403 ahd_sync_sense(struct ahd_softc *ahd, struct scb *scb, int op)
405 ahd_dmamap_sync(ahd, ahd->scb_data.sense_dmat,
412 ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index)
414 return (((uint8_t *)&ahd->targetcmds[index])
415 - (uint8_t *)ahd->qoutfifo);
420 ahd_fetch_transinfo(struct ahd_softc *ahd,
425 ahd_inw(struct ahd_softc *ahd, u_int port);
426 static __inline void ahd_outw(struct ahd_softc *ahd, u_int port,
429 ahd_inl(struct ahd_softc *ahd, u_int port);
430 static __inline void ahd_outl(struct ahd_softc *ahd, u_int port,
433 ahd_inq(struct ahd_softc *ahd, u_int port);
434 static __inline void ahd_outq(struct ahd_softc *ahd, u_int port,
436 static __inline u_int ahd_get_scbptr(struct ahd_softc *ahd);
437 static __inline void ahd_set_scbptr(struct ahd_softc *ahd, u_int scbptr);
438 static __inline u_int ahd_get_hnscb_qoff(struct ahd_softc *ahd);
439 static __inline void ahd_set_hnscb_qoff(struct ahd_softc *ahd, u_int value);
440 static __inline u_int ahd_get_hescb_qoff(struct ahd_softc *ahd);
441 static __inline void ahd_set_hescb_qoff(struct ahd_softc *ahd, u_int value);
442 static __inline u_int ahd_get_snscb_qoff(struct ahd_softc *ahd);
443 static __inline void ahd_set_snscb_qoff(struct ahd_softc *ahd, u_int value);
444 static __inline u_int ahd_get_sescb_qoff(struct ahd_softc *ahd);
445 static __inline void ahd_set_sescb_qoff(struct ahd_softc *ahd, u_int value);
446 static __inline u_int ahd_get_sdscb_qoff(struct ahd_softc *ahd);
447 static __inline void ahd_set_sdscb_qoff(struct ahd_softc *ahd, u_int value);
448 static __inline u_int ahd_inb_scbram(struct ahd_softc *ahd, u_int offset);
449 static __inline u_int ahd_inw_scbram(struct ahd_softc *ahd, u_int offset);
451 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset);
453 ahd_inq_scbram(struct ahd_softc *ahd, u_int offset);
454 static __inline void ahd_swap_with_next_hscb(struct ahd_softc *ahd,
456 static __inline void ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb);
458 ahd_get_sense_buf(struct ahd_softc *ahd,
461 ahd_get_sense_bufaddr(struct ahd_softc *ahd,
469 ahd_fetch_transinfo(struct ahd_softc *ahd, char channel, u_int our_id,
480 *tstate = ahd->enabled_targets[our_id];
491 ahd_inw(struct ahd_softc *ahd, u_int port)
498 uint16_t r = ahd_inb(ahd, port+1) << 8;
499 return r | ahd_inb(ahd, port);
503 ahd_outw(struct ahd_softc *ahd, u_int port, u_int value)
509 ahd_outb(ahd, port, value & 0xFF);
510 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
514 ahd_inl(struct ahd_softc *ahd, u_int port)
516 return ((ahd_inb(ahd, port))
517 | (ahd_inb(ahd, port+1) << 8)
518 | (ahd_inb(ahd, port+2) << 16)
519 | (ahd_inb(ahd, port+3) << 24));
523 ahd_outl(struct ahd_softc *ahd, u_int port, uint32_t value)
525 ahd_outb(ahd, port, (value) & 0xFF);
526 ahd_outb(ahd, port+1, ((value) >> 8) & 0xFF);
527 ahd_outb(ahd, port+2, ((value) >> 16) & 0xFF);
528 ahd_outb(ahd, port+3, ((value) >> 24) & 0xFF);
532 ahd_inq(struct ahd_softc *ahd, u_int port)
534 return ((ahd_inb(ahd, port))
535 | (ahd_inb(ahd, port+1) << 8)
536 | (ahd_inb(ahd, port+2) << 16)
537 | (ahd_inb(ahd, port+3) << 24)
538 | (((uint64_t)ahd_inb(ahd, port+4)) << 32)
539 | (((uint64_t)ahd_inb(ahd, port+5)) << 40)
540 | (((uint64_t)ahd_inb(ahd, port+6)) << 48)
541 | (((uint64_t)ahd_inb(ahd, port+7)) << 56));
545 ahd_outq(struct ahd_softc *ahd, u_int port, uint64_t value)
547 ahd_outb(ahd, port, value & 0xFF);
548 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
549 ahd_outb(ahd, port+2, (value >> 16) & 0xFF);
550 ahd_outb(ahd, port+3, (value >> 24) & 0xFF);
551 ahd_outb(ahd, port+4, (value >> 32) & 0xFF);
552 ahd_outb(ahd, port+5, (value >> 40) & 0xFF);
553 ahd_outb(ahd, port+6, (value >> 48) & 0xFF);
554 ahd_outb(ahd, port+7, (value >> 56) & 0xFF);
558 ahd_get_scbptr(struct ahd_softc *ahd)
560 AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
562 return (ahd_inb(ahd, SCBPTR) | (ahd_inb(ahd, SCBPTR + 1) << 8));
566 ahd_set_scbptr(struct ahd_softc *ahd, u_int scbptr)
568 AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK),
570 ahd_outb(ahd, SCBPTR, scbptr & 0xFF);
571 ahd_outb(ahd, SCBPTR+1, (scbptr >> 8) & 0xFF);
575 ahd_get_hnscb_qoff(struct ahd_softc *ahd)
577 return (ahd_inw_atomic(ahd, HNSCB_QOFF));
581 ahd_set_hnscb_qoff(struct ahd_softc *ahd, u_int value)
583 ahd_outw_atomic(ahd, HNSCB_QOFF, value);
587 ahd_get_hescb_qoff(struct ahd_softc *ahd)
589 return (ahd_inb(ahd, HESCB_QOFF));
593 ahd_set_hescb_qoff(struct ahd_softc *ahd, u_int value)
595 ahd_outb(ahd, HESCB_QOFF, value);
599 ahd_get_snscb_qoff(struct ahd_softc *ahd)
603 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
604 oldvalue = ahd_inw(ahd, SNSCB_QOFF);
605 ahd_outw(ahd, SNSCB_QOFF, oldvalue);
610 ahd_set_snscb_qoff(struct ahd_softc *ahd, u_int value)
612 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
613 ahd_outw(ahd, SNSCB_QOFF, value);
617 ahd_get_sescb_qoff(struct ahd_softc *ahd)
619 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
620 return (ahd_inb(ahd, SESCB_QOFF));
624 ahd_set_sescb_qoff(struct ahd_softc *ahd, u_int value)
626 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
627 ahd_outb(ahd, SESCB_QOFF, value);
631 ahd_get_sdscb_qoff(struct ahd_softc *ahd)
633 AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK);
634 return (ahd_inb(ahd, SDSCB_QOFF) | (ahd_inb(ahd, SDSCB_QOFF + 1) << 8));
638 ahd_set_sdscb_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, SDSCB_QOFF, value & 0xFF);
642 ahd_outb(ahd, SDSCB_QOFF+1, (value >> 8) & 0xFF);
646 ahd_inb_scbram(struct ahd_softc *ahd, u_int offset)
650 value = ahd_inb(ahd, offset);
651 if ((ahd->bugs & AHD_PCIX_SCBRAM_RD_BUG) != 0)
652 ahd_inb(ahd, MODE_PTR);
657 ahd_inw_scbram(struct ahd_softc *ahd, u_int offset)
659 return (ahd_inb_scbram(ahd, offset)
660 | (ahd_inb_scbram(ahd, offset+1) << 8));
664 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset)
666 return (ahd_inw_scbram(ahd, offset)
667 | (ahd_inw_scbram(ahd, offset+2) << 16));
671 ahd_inq_scbram(struct ahd_softc *ahd, u_int offset)
673 return (ahd_inl_scbram(ahd, offset)
674 | ((uint64_t)ahd_inl_scbram(ahd, offset+4)) << 32);
678 ahd_lookup_scb(struct ahd_softc *ahd, u_int tag)
684 scb = ahd->scb_data.scbindex[tag];
686 ahd_sync_scb(ahd, scb,
692 ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb)
702 * HSCB to download is saved off in ahd->next_queued_hscb.
710 q_hscb = ahd->next_queued_hscb;
711 q_hscb_map = ahd->next_queued_hscb_map;
718 ahd->next_queued_hscb = scb->hscb;
719 ahd->next_queued_hscb_map = scb->hscb_map;
724 ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = scb;
731 ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb)
733 ahd_swap_with_next_hscb(ahd, scb);
742 ahd->qinfifo[AHD_QIN_WRAP(ahd->qinfifonext)] = SCB_GET_TAG(scb);
743 ahd->qinfifonext++;
746 ahd_setup_data_scb(ahd, scb);
748 ahd_setup_noxfer_scb(ahd, scb);
749 ahd_setup_scb_common(ahd, scb);
755 ahd_sync_scb(ahd, scb, BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
763 ahd_name(ahd),
772 ahd_set_hnscb_qoff(ahd, ahd->qinfifonext);
776 ahd_get_sense_buf(struct ahd_softc *ahd, struct scb *scb)
782 ahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb)
788 static __inline void ahd_sync_qoutfifo(struct ahd_softc *ahd, int op);
789 static __inline void ahd_sync_tqinfifo(struct ahd_softc *ahd, int op);
790 static __inline u_int ahd_check_cmdcmpltqueues(struct ahd_softc *ahd);
791 static __inline int ahd_intr(struct ahd_softc *ahd);
794 ahd_sync_qoutfifo(struct ahd_softc *ahd, int op)
796 ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
802 ahd_sync_tqinfifo(struct ahd_softc *ahd, int op)
805 if ((ahd->flags & AHD_TARGETROLE) != 0) {
806 ahd_dmamap_sync(ahd, ahd->shared_data_dmat,
807 ahd->shared_data_map.dmamap,
808 ahd_targetcmd_offset(ahd, 0),
822 ahd_check_cmdcmpltqueues(struct ahd_softc *ahd)
827 ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
828 /*offset*/ahd->qoutfifonext * sizeof(*ahd->qoutfifo),
829 /*len*/sizeof(*ahd->qoutfifo), BUS_DMASYNC_POSTREAD);
830 if (ahd->qoutfifo[ahd->qoutfifonext].valid_tag
831 == ahd->qoutfifonext_valid_tag)
834 if ((ahd->flags & AHD_TARGETROLE) != 0
835 && (ahd->flags & AHD_TQINFIFO_BLOCKED) == 0) {
836 ahd_dmamap_sync(ahd, ahd->shared_data_dmat,
837 ahd->shared_data_map.dmamap,
838 ahd_targetcmd_offset(ahd, ahd->tqinfifofnext),
841 if (ahd->targetcmds[ahd->tqinfifonext].cmd_valid != 0)
852 ahd_intr(struct ahd_softc *ahd)
856 if ((ahd->pause & INTEN) == 0) {
872 if ((ahd->flags & AHD_ALL_INTERRUPTS) == 0
873 && (ahd_check_cmdcmpltqueues(ahd) != 0))
876 intstat = ahd_inb(ahd, INTSTAT);
882 ahd_outb(ahd, CLRINT, CLRCMDINT);
892 if ((ahd->bugs & AHD_INTCOLLISION_BUG) != 0) {
893 if (ahd_is_paused(ahd)) {
899 if (ahd_inb(ahd, SEQINTCODE) != NO_SEQINT)
903 ahd_flush_device_writes(ahd);
905 ahd_run_qoutfifo(ahd);
906 ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket]++;
907 ahd->cmdcmplt_total++;
909 if ((ahd->flags & AHD_TARGETROLE) != 0)
910 ahd_run_tqinfifo(ahd, /*paused*/FALSE);
918 if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0) {
921 ahd_handle_hwerrint(ahd);
923 ahd->bus_intr(ahd);
927 ahd_handle_seqint(ahd, intstat);
930 ahd_handle_scsiint(ahd, intstat);