Home | History | Annotate | Download | only in ic

Lines Matching defs:ahc

56 static int	ahc_poll(struct ahc_softc *ahc, int wait);
57 static void ahc_setup_data(struct ahc_softc *ahc,
59 static void ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb);
72 ahc_attach(struct ahc_softc *ahc)
78 LIST_INIT(&ahc->pending_scbs);
80 TAILQ_INIT(&ahc->untagged_queues[i]);
82 ahc_lock(ahc, &s);
84 ahc->sc_adapter.adapt_dev = ahc->sc_dev;
85 ahc->sc_adapter.adapt_nchannels = (ahc->features & AHC_TWIN) ? 2 : 1;
87 ahc->sc_adapter.adapt_openings = ahc->scb_data->numscbs - 1;
88 ahc->sc_adapter.adapt_max_periph = 16;
90 ahc->sc_adapter.adapt_ioctl = ahc_ioctl;
91 ahc->sc_adapter.adapt_minphys = ahc_minphys;
92 ahc->sc_adapter.adapt_request = ahc_action;
94 ahc->sc_channel.chan_adapter = &ahc->sc_adapter;
95 ahc->sc_channel.chan_bustype = &scsi_bustype;
96 ahc->sc_channel.chan_channel = 0;
97 ahc->sc_channel.chan_ntargets = (ahc->features & AHC_WIDE) ? 16 : 8;
98 ahc->sc_channel.chan_nluns = 8 /*AHC_NUM_LUNS*/;
99 ahc->sc_channel.chan_id = ahc->our_id;
100 ahc->sc_channel.chan_flags |= SCSIPI_CHAN_CANGROW;
102 if (ahc->features & AHC_TWIN) {
103 ahc->sc_channel_b = ahc->sc_channel;
104 ahc->sc_channel_b.chan_id = ahc->our_id_b;
105 ahc->sc_channel_b.chan_channel = 1;
108 ahc_controller_info(ahc, ahc_info, sizeof(ahc_info));
109 printf("%s: %s\n", device_xname(ahc->sc_dev), ahc_info);
111 if ((ahc->flags & AHC_PRIMARY_CHANNEL) == 0) {
112 ahc->sc_child = config_found(ahc->sc_dev,
113 &ahc->sc_channel, scsiprint, CFARGS_NONE);
114 if (ahc->features & AHC_TWIN)
115 ahc->sc_child_b = config_found(ahc->sc_dev,
116 &ahc->sc_channel_b, scsiprint, CFARGS_NONE);
118 if (ahc->features & AHC_TWIN)
119 ahc->sc_child = config_found(ahc->sc_dev,
120 &ahc->sc_channel_b, scsiprint, CFARGS_NONE);
121 ahc->sc_child_b = config_found(ahc->sc_dev,
122 &ahc->sc_channel, scsiprint, CFARGS_NONE);
125 ahc_intr_enable(ahc, TRUE);
127 if (ahc->flags & AHC_RESET_BUS_A)
128 ahc_reset_channel(ahc, 'A', TRUE);
129 if ((ahc->features & AHC_TWIN) && ahc->flags & AHC_RESET_BUS_B)
130 ahc_reset_channel(ahc, 'B', TRUE);
132 if (!pmf_device_register1(ahc->sc_dev,
134 aprint_error_dev(ahc->sc_dev,
137 ahc_unlock(ahc, &s);
187 struct ahc_softc *ahc;
189 ahc = arg;
190 ahc_intr(ahc);
199 ahc_done(struct ahc_softc *ahc, struct scb *scb)
212 target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
213 untagged_q = &ahc->untagged_queues[target_offset];
216 ahc_run_untagged_queue(ahc, untagged_q);
228 bus_dmamap_sync(ahc->parent_dmat, scb->dmamap, 0,
230 bus_dmamap_unload(ahc->parent_dmat, scb->dmamap);
245 LIST_FOREACH(list_scb, &ahc->pending_scbs, pending_links) {
260 ahc_name(ahc), xs->status);
262 scsipi_channel_thaw(&ahc->sc_channel, 1);
263 if (ahc->features & AHC_TWIN)
264 scsipi_channel_thaw(&ahc->sc_channel_b, 1);
283 ahc_get_sense_buf(ahc, scb),
292 ahc_lock(ahc, &s);
293 ahc_free_scb(ahc, scb);
294 ahc_unlock(ahc, &s);
303 struct ahc_softc *ahc;
306 ahc = device_private(channel->chan_adapter->adapt_dev);
311 ahc_reset_channel(ahc, channel->chan_channel == 1 ? 'B' : 'A',
326 struct ahc_softc *ahc;
331 ahc = device_private(chan->chan_adapter->adapt_dev);
349 our_id = ahc->our_id;
356 ahc_lock(ahc, &ss);
357 if ((scb = ahc_get_scb(ahc)) == NULL) {
359 ahc_unlock(ahc, &ss);
363 ahc_unlock(ahc, &ss);
374 hscb->scsiid = BUILD_SCSIID(ahc, 0, target_id, our_id);
383 ahc_setup_data(ahc, xs, scb);
389 printf("%s: ADAPTER_REQ_GROW_RESOURCES\n", ahc_name(ahc));
391 chan->chan_adapter->adapt_openings += ahc_alloc_scbs(ahc);
392 if (ahc->scb_data->numscbs >= AHC_SCB_MAX_ALLOC)
411 tinfo = ahc_fetch_transinfo(ahc, channel, our_id, target_id,
425 if (ahc->inited_target[target_id] == 0) {
431 (ahc->user_tagenable & devinfo.target_mask);
433 (ahc->user_discenable & devinfo.target_mask);
434 ahc->inited_target[target_id] = 1;
444 ahc_validate_width(ahc, NULL, &width, ROLE_UNKNOWN);
447 ahc_set_width(ahc, &devinfo, width, AHC_TRANS_GOAL, FALSE);
465 (ahc->user_tagenable & devinfo.target_mask))
470 syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
472 ahc_validate_offset(ahc, NULL, syncrate, &offset,
488 ahc_set_syncrate(ahc, &devinfo, syncrate, period, offset,
522 struct ahc_softc *ahc;
534 ahc = device_private(
570 bus_dmamap_sync(ahc->parent_dmat, scb->dmamap, 0,
587 ahc_lock(ahc, &s);
595 bus_dmamap_unload(ahc->buffer_dmat, scb->dmamap);
596 ahc_free_scb(ahc, scb);
597 ahc_unlock(ahc, &s);
602 tinfo = ahc_fetch_transinfo(ahc, ahc->channel,
604 SCSIID_TARGET(ahc, scb->hscb->scsiid),
607 mask = SCB_GET_TARGET_MASK(ahc, scb);
633 LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
648 && (ahc->flags & AHC_SCB_BTT) == 0) {
652 target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
653 untagged_q = &(ahc->untagged_queues[target_offset]);
657 ahc_unlock(ahc, &s);
665 ahc->scb_data->scbindex[scb->hscb->tag] = scb;
666 ahc_pause(ahc);
667 if ((ahc->flags & AHC_PAGESCBS) == 0)
668 ahc_outb(ahc, SCBPTR, scb->hscb->tag);
669 ahc_outb(ahc, TARG_IMMEDIATE_SCB, scb->hscb->tag);
670 ahc_unpause(ahc);
672 ahc_queue_scb(ahc, scb);
676 ahc_unlock(ahc, &s);
686 if (ahc_poll(ahc, xs->timeout)) {
693 ahc_unlock(ahc, &s);
699 ahc_poll(struct ahc_softc *ahc, int wait)
703 if (ahc_inb(ahc, INTSTAT) & INT_PEND)
708 printf("%s: board is not responding\n", ahc_name(ahc));
712 ahc_intr(ahc);
717 ahc_setup_data(struct ahc_softc *ahc, struct scsipi_xfer *xs,
730 ahc_lock(ahc, &s);
731 ahc_free_scb(ahc, scb);
732 ahc_unlock(ahc, &s);
748 error = bus_dmamap_load(ahc->parent_dmat,
760 ahc_name(ahc), error);
775 ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb) {
787 scsipi_channel_freeze(&ahc->sc_channel, 1);
788 if (ahc->features & AHC_TWIN)
789 scsipi_channel_freeze(&ahc->sc_channel_b, 1);
796 LIST_FOREACH(list_scb, &ahc->pending_scbs, pending_links) {
806 struct ahc_softc *ahc;
816 ahc = scb->ahc_softc;
818 ahc_lock(ahc, &s);
820 ahc_pause_and_flushwork(ahc);
825 "Interrupts may not be functioning.\n", ahc_name(ahc));
826 ahc_unpause(ahc);
827 ahc_unlock(ahc, &s);
831 target = SCB_GET_TARGET(ahc, scb);
832 channel = SCB_GET_CHANNEL(ahc, scb);
835 ahc_print_path(ahc, scb);
837 ahc_dump_card_state(ahc);
838 last_phase = ahc_inb(ahc, LASTPHASE);
854 found = ahc_reset_channel(ahc, channel, /*Initiate Reset*/TRUE);
856 "%d SCBs aborted\n", ahc_name(ahc), channel, found);
883 saved_scbptr = ahc_inb(ahc, SCBPTR);
884 active_scb_index = ahc_inb(ahc, SCB_TAG);
886 if ((ahc_inb(ahc, SEQ_FLAGS) & NOT_IDENTIFIED) == 0
887 && (active_scb_index < ahc->scb_data->numscbs)) {
896 active_scb = ahc_lookup_scb(ahc, active_scb_index);
900 ahc_print_path(ahc, scb);
912 ahc_unpause(ahc);
913 ahc_unlock(ahc, &s);
924 ahc_abort_scbs(ahc, SCB_GET_TARGET(ahc, scb),
925 SCB_GET_CHANNEL(ahc, scb),
932 ahc_restart(ahc);
933 ahc_unlock(ahc, &s);
937 ahc_set_recoveryscb(ahc, active_scb);
938 ahc_outb(ahc, MSG_OUT, HOST_MSG);
939 ahc_outb(ahc, SCSISIGO, last_phase|ATNO);
940 ahc_print_path(ahc, active_scb);
945 ahc_unpause(ahc);
954 && (ahc_inb(ahc, SSTAT0) & TARGET) != 0) {
958 ahc_name(ahc));
959 ahc_restart(ahc);
960 ahc_unlock(ahc, &s);
964 if (ahc_search_qinfifo(ahc, target, channel, lun,
974 ahc_set_recoveryscb(ahc, scb);
1001 ahc_search_disc_list(ahc, target, channel,
1014 if ((ahc->flags & AHC_PAGESCBS) == 0) {
1015 ahc_outb(ahc, SCBPTR, scb->hscb->tag);
1016 ahc_outb(ahc, SCB_CONTROL,
1017 ahc_inb(ahc, SCB_CONTROL)
1026 ahc_search_qinfifo(ahc,
1027 SCB_GET_TARGET(ahc, scb),
1033 ahc_print_path(ahc, scb);
1035 ahc_qinfifo_requeue_tail(ahc, scb);
1036 ahc_outb(ahc, SCBPTR, saved_scbptr);
1039 ahc_unpause(ahc);
1043 ahc_set_recoveryscb(ahc, scb);
1044 ahc_print_path(ahc, scb);
1052 ahc_unlock(ahc, &s);
1056 ahc_platform_set_tags(struct ahc_softc *ahc,
1061 ahc_fetch_transinfo(ahc, devinfo->channel, devinfo->our_scsiid,
1071 ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg)
1075 ahc->platform_data = malloc(sizeof(struct ahc_platform_data), M_DEVBUF,
1081 ahc_platform_free(struct ahc_softc *ahc)
1085 free(ahc->platform_data, M_DEVBUF);
1095 ahc_detach(struct ahc_softc *ahc, int flags)
1099 ahc_intr_enable(ahc, FALSE);
1100 if (ahc->sc_child != NULL)
1101 rv = config_detach(ahc->sc_child, flags);
1102 if (rv == 0 && ahc->sc_child_b != NULL)
1103 rv = config_detach(ahc->sc_child_b, flags);
1105 pmf_device_deregister(ahc->sc_dev);
1106 ahc_free(ahc);
1113 ahc_send_async(struct ahc_softc *ahc, char channel, u_int target, u_int lun,
1122 chan = channel == 'B' ? &ahc->sc_channel_b : &ahc->sc_channel;
1125 tinfo = ahc_fetch_transinfo(ahc, channel, ahc->our_id, target,
1127 ahc_compile_devinfo(&devinfo, ahc->our_id, target, lun,