Lines Matching defs:adw

78 static __inline struct acb*	adwgetacb(struct adw_softc *adw);
79 static __inline void adwfreeacb(struct adw_softc *adw,
85 adwallocsgmap(struct adw_softc *adw);
86 static int adwallocacbs(struct adw_softc *adw);
91 static void adw_intr_locked(struct adw_softc *adw);
95 static void adwprocesserror(struct adw_softc *adw, struct acb *acb);
97 static void adw_handle_device_reset(struct adw_softc *adw,
99 static void adw_handle_bus_reset(struct adw_softc *adw,
103 adwgetacb(struct adw_softc *adw)
108 mtx_assert(&adw->lock, MA_OWNED);
109 if ((acb = SLIST_FIRST(&adw->free_acb_list)) != NULL) {
110 SLIST_REMOVE_HEAD(&adw->free_acb_list, links);
111 } else if (adw->num_acbs < adw->max_acbs) {
112 adwallocacbs(adw);
113 acb = SLIST_FIRST(&adw->free_acb_list);
115 device_printf(adw->device, "Can't malloc ACB\n");
117 SLIST_REMOVE_HEAD(&adw->free_acb_list, links);
125 adwfreeacb(struct adw_softc *adw, struct acb *acb)
129 mtx_assert(&adw->lock, MA_OWNED);
134 else if ((adw->state & ADW_RESOURCE_SHORTAGE) != 0
137 adw->state &= ~ADW_RESOURCE_SHORTAGE;
140 SLIST_INSERT_HEAD(&adw->free_acb_list, acb, links);
153 adwallocsgmap(struct adw_softc *adw)
163 if (bus_dmamem_alloc(adw->sg_dmat, (void **)&sg_map->sg_vaddr,
169 SLIST_INSERT_HEAD(&adw->sg_maps, sg_map, links);
171 bus_dmamap_load(adw->sg_dmat, sg_map->sg_dmamap, sg_map->sg_vaddr,
182 adwallocacbs(struct adw_softc *adw)
191 next_acb = &adw->acbs[adw->num_acbs];
192 sg_map = adwallocsgmap(adw);
201 for (i = 0; adw->num_acbs < adw->max_acbs && i < newcount; i++) {
204 error = bus_dmamap_create(adw->buffer_dmat, /*flags*/0,
208 next_acb->queue.scsi_req_baddr = acbvtob(adw, next_acb);
209 next_acb->queue.scsi_req_bo = acbvtobo(adw, next_acb);
211 acbvtob(adw, next_acb) + offsetof(struct acb, sense_data);
215 callout_init_mtx(&next_acb->timer, &adw->lock, 0);
216 SLIST_INSERT_HEAD(&adw->free_acb_list, next_acb, links);
220 adw->num_acbs++;
230 struct adw_softc *adw;
234 adw = (struct adw_softc *)ccb->ccb_h.ccb_adw_ptr;
237 mtx_assert(&adw->lock, MA_OWNED);
240 device_printf(adw->device, "Unexepected error 0x%x "
246 adwfreeacb(adw, acb);
302 bus_dmamap_sync(adw->buffer_dmat, acb->dmamap, op);
316 bus_dmamap_unload(adw->buffer_dmat, acb->dmamap);
317 adwfreeacb(adw, acb);
324 LIST_INSERT_HEAD(&adw->pending_ccbs, &ccb->ccb_h, sim_links.le);
328 adw_send_acb(adw, acb, acbvtob(adw, acb));
334 struct adw_softc *adw;
338 adw = (struct adw_softc *)cam_sim_softc(sim);
340 mtx_assert(&adw->lock, MA_OWNED);
359 if ((acb = adwgetacb(adw)) == NULL) {
360 adw->state |= ADW_RESOURCE_SHORTAGE;
370 ccb->ccb_h.ccb_adw_ptr = adw;
413 adwfreeacb(adw, acb);
422 error = bus_dmamap_load_ccb(adw->buffer_dmat,
441 status = adw_idle_cmd_send(adw, ADW_IDLE_CMD_DEVICE_RESET,
474 sdtrdone = adw_lram_read_16(adw, ADW_MC_SDTR_DONE);
479 adw_lram_read_16(adw, ADW_MC_DISC_ENABLE);
486 adw_lram_write_16(adw, ADW_MC_DISC_ENABLE,
493 adw->tagenb |= target_mask;
495 adw->tagenb &= ~target_mask;
504 adw_lram_read_16(adw, ADW_MC_WDTR_ABLE);
506 wdtrdone = adw_lram_read_16(adw,
519 adw_lram_write_16(adw,
523 adw_lram_write_16(adw,
528 adw_lram_write_16(adw,
541 sdtr = adw_get_chip_sdtr(adw,
544 sdtrable = adw_lram_read_16(adw,
552 adw_find_sdtr(adw,
568 adw_set_chip_sdtr(adw,
572 adw_lram_write_16(adw, ADW_MC_SDTR_ABLE,
574 adw_lram_write_16(adw, ADW_MC_SDTR_DONE,
605 if ((adw->user_discenb & target_mask) != 0)
608 if ((adw->user_tagenb & target_mask) != 0)
611 if ((adw->user_wdtr & target_mask) != 0)
616 mc_sdtr = adw_get_user_sdtr(adw, ccb->ccb_h.target_id);
617 spi->sync_period = adw_find_period(adw, mc_sdtr);
628 if ((adw_lram_read_16(adw, ADW_MC_DISC_ENABLE)
632 if ((adw->tagenb & target_mask) != 0)
636 adw_lram_read_16(adw,
679 failure = adw_reset_bus(adw);
684 xpt_print_path(adw->path);
708 cpi->initiator_id = adw->initiator_id;
744 struct adw_softc *adw;
746 adw = device_get_softc(dev);
747 LIST_INIT(&adw->pending_ccbs);
748 SLIST_INIT(&adw->sg_maps);
749 mtx_init(&adw->lock, "adw", NULL, MTX_DEF);
750 adw->device = dev;
751 adw->regs_res_type = regs_type;
752 adw->regs_res_id = regs_id;
753 adw->regs = regs;
754 return(adw);
758 adw_free(struct adw_softc *adw)
760 switch (adw->init_level) {
765 while ((sg_map = SLIST_FIRST(&adw->sg_maps)) != NULL) {
766 SLIST_REMOVE_HEAD(&adw->sg_maps, links);
767 bus_dmamap_unload(adw->sg_dmat,
769 bus_dmamem_free(adw->sg_dmat, sg_map->sg_vaddr,
773 bus_dma_tag_destroy(adw->sg_dmat);
776 bus_dmamap_unload(adw->acb_dmat, adw->acb_dmamap);
778 bus_dmamem_free(adw->acb_dmat, adw->acbs,
779 adw->acb_dmamap);
781 bus_dma_tag_destroy(adw->acb_dmat);
783 bus_dmamap_unload(adw->carrier_dmat, adw->carrier_dmamap);
785 bus_dmamem_free(adw->carrier_dmat, adw->carriers,
786 adw->carrier_dmamap);
788 bus_dma_tag_destroy(adw->carrier_dmat);
790 bus_dma_tag_destroy(adw->buffer_dmat);
792 bus_dma_tag_destroy(adw->parent_dmat);
797 if (adw->regs != NULL)
798 bus_release_resource(adw->device,
799 adw->regs_res_type,
800 adw->regs_res_id,
801 adw->regs);
803 if (adw->irq != NULL)
804 bus_release_resource(adw->device,
805 adw->irq_res_type,
806 0, adw->irq);
808 if (adw->sim != NULL) {
809 if (adw->path != NULL) {
810 xpt_async(AC_LOST_DEVICE, adw->path, NULL);
811 xpt_free_path(adw->path);
813 xpt_bus_deregister(cam_sim_path(adw->sim));
814 cam_sim_free(adw->sim, /*free_devq*/TRUE);
816 mtx_destroy(&adw->lock);
820 adw_init(struct adw_softc *adw)
828 checksum = adw_eeprom_read(adw, &eep_config);
829 bcopy(eep_config.serial_number, adw->serial_number,
830 sizeof(adw->serial_number));
834 adw->flags |= ADW_EEPROM_FAILED;
835 device_printf(adw->device,
844 bcopy(adw->default_eeprom, &eep_config, sizeof(eep_config));
845 bcopy(adw->serial_number, eep_config.serial_number,
847 adw_eeprom_write(adw, &eep_config);
851 adw->bios_ctrl = eep_config.bios_ctrl;
852 adw->user_wdtr = eep_config.wdtr_able;
858 if ((adw->features & ADW_ULTRA) != 0) {
891 adw_set_user_sdtr(adw, tid, mc_sdtr);
893 adw->user_tagenb = eep_config.tagqng_able;
894 adw->user_discenb = eep_config.disc_enable;
895 adw->max_acbs = eep_config.max_host_qng;
896 adw->initiator_id = (eep_config.adapter_scsi_id & ADW_MAX_TID);
901 if (adw->max_acbs > ADW_DEF_MAX_HOST_QNG)
902 adw->max_acbs = ADW_DEF_MAX_HOST_QNG;
903 else if (adw->max_acbs < ADW_DEF_MIN_HOST_QNG) {
905 if (adw->max_acbs == 0)
906 adw->max_acbs = ADW_DEF_MAX_HOST_QNG;
908 adw->max_acbs = ADW_DEF_MIN_HOST_QNG;
912 if ((adw->features & ADW_ULTRA2) != 0) {
915 device_printf(adw->device,
917 device_printf(adw->device,
936 device_printf(adw->device,
938 device_printf(adw->device,
953 device_printf(adw->device, "SCSI ID %d, ", adw->initiator_id);
957 /* parent */ adw->parent_dmat,
969 /* lockarg */ &adw->lock,
970 &adw->buffer_dmat) != 0) {
974 adw->init_level++;
978 /* parent */ adw->parent_dmat,
985 /* maxsize */ (adw->max_acbs +
993 &adw->carrier_dmat) != 0) {
997 adw->init_level++;
1000 if (bus_dmamem_alloc(adw->carrier_dmat, (void **)&adw->carriers,
1001 BUS_DMA_NOWAIT, &adw->carrier_dmamap) != 0) {
1005 adw->init_level++;
1008 bus_dmamap_load(adw->carrier_dmat, adw->carrier_dmamap,
1009 adw->carriers,
1010 (adw->max_acbs + ADW_NUM_CARRIER_QUEUES + 1)
1012 adwmapmem, &adw->carrier_busbase, /*flags*/0);
1015 bzero(adw->carriers, (adw->max_acbs + ADW_NUM_CARRIER_QUEUES + 1)
1019 adw->free_carriers = adw->carriers;
1020 for (i = 0; i < adw->max_acbs + ADW_NUM_CARRIER_QUEUES; i++) {
1021 adw->carriers[i].carr_offset =
1022 carriervtobo(adw, &adw->carriers[i]);
1023 adw->carriers[i].carr_ba =
1024 carriervtob(adw, &adw->carriers[i]);
1025 adw->carriers[i].areq_ba = 0;
1026 adw->carriers[i].next_ba =
1027 carriervtobo(adw, &adw->carriers[i+1]);
1030 adw->carriers[i].carr_offset =
1031 carriervtobo(adw, &adw->carriers[i]);
1032 adw->carriers[i].carr_ba =
1033 carriervtob(adw, &adw->carriers[i]);
1034 adw->carriers[i].areq_ba = 0;
1035 adw->carriers[i].next_ba = ~0;
1037 adw->init_level++;
1041 /* parent */ adw->parent_dmat,
1048 /* maxsize */ adw->max_acbs * sizeof(struct acb),
1054 &adw->acb_dmat) != 0) {
1058 adw->init_level++;
1061 if (bus_dmamem_alloc(adw->acb_dmat, (void **)&adw->acbs,
1062 BUS_DMA_NOWAIT, &adw->acb_dmamap) != 0)
1065 adw->init_level++;
1068 bus_dmamap_load(adw->acb_dmat, adw->acb_dmamap,
1069 adw->acbs,
1070 adw->max_acbs * sizeof(struct acb),
1071 adwmapmem, &adw->acb_busbase, /*flags*/0);
1074 bzero(adw->acbs, adw->max_acbs * sizeof(struct acb));
1078 /* parent */ adw->parent_dmat,
1091 &adw->sg_dmat) != 0) {
1095 adw->init_level++;
1098 mtx_lock(&adw->lock);
1099 if (adwallocacbs(adw) == 0) {
1100 mtx_unlock(&adw->lock);
1104 if (adw_init_chip(adw, scsicfg1) != 0) {
1105 mtx_unlock(&adw->lock);
1109 printf("Queue Depth %d\n", adw->max_acbs);
1110 mtx_unlock(&adw->lock);
1119 adw_attach(struct adw_softc *adw)
1126 error = bus_setup_intr(adw->device, adw->irq,
1127 INTR_TYPE_CAM | INTR_ENTROPY | INTR_MPSAFE, NULL, adw_intr, adw,
1128 &adw->ih);
1130 device_printf(adw->device, "bus_setup_intr() failed: %d\n",
1136 adw_outw(adw, ADW_RISC_CSR, ADW_RISC_CSR_RUN);
1141 devq = cam_simq_alloc(adw->max_acbs);
1148 adw->sim = cam_sim_alloc(adw_action, adw_poll, "adw", adw,
1149 device_get_unit(adw->device), &adw->lock, 1, adw->max_acbs, devq);
1150 if (adw->sim == NULL)
1156 mtx_lock(&adw->lock);
1157 if (xpt_bus_register(adw->sim, adw->device, 0) != CAM_SUCCESS) {
1158 cam_sim_free(adw->sim, /*free devq*/TRUE);
1163 if (xpt_create_path(&adw->path, /*periph*/NULL, cam_sim_path(adw->sim),
1166 xpt_setup_ccb(&csa.ccb_h, adw->path, /*priority*/5);
1170 csa.callback_arg = adw;
1175 mtx_unlock(&adw->lock);
1182 struct adw_softc *adw;
1184 adw = arg;
1185 mtx_lock(&adw->lock);
1186 adw_intr_locked(adw);
1187 mtx_unlock(&adw->lock);
1191 adw_intr_locked(struct adw_softc *adw)
1195 if ((adw_inw(adw, ADW_CTRL_REG) & ADW_CTRL_REG_HOST_INTR) == 0)
1199 int_stat = adw_inb(adw, ADW_INTR_STATUS_REG);
1205 intrb_code = adw_lram_read_8(adw, ADW_MC_INTRB_CODE);
1212 if (LIST_FIRST(&adw->pending_ccbs) != NULL)
1213 adw_tickle_risc(adw, ADW_TICKLE_A);
1219 device_printf(adw->device, "Someone Reset the Bus\n");
1220 adw_handle_bus_reset(adw, /*initiated*/FALSE);
1236 adw_handle_bus_reset(adw, /*initiated*/TRUE);
1248 while ((adw->responseq->next_ba & ADW_RQ_DONE) != 0) {
1255 adw->responseq->carr_offset,
1256 adw->responseq->carr_ba,
1257 adw->responseq->areq_ba,
1258 adw->responseq->next_ba);
1264 acb = acbbotov(adw, adw->responseq->areq_ba);
1271 free_carrier = adw->responseq;
1272 adw->responseq =
1273 carrierbotov(adw, free_carrier->next_ba & ADW_NEXT_BA_MASK);
1274 free_carrier->next_ba = adw->free_carriers->carr_offset;
1275 adw->free_carriers = free_carrier;
1287 bus_dmamap_sync(adw->buffer_dmat, acb->dmamap, op);
1288 bus_dmamap_unload(adw->buffer_dmat, acb->dmamap);
1316 adwfreeacb(adw, acb);
1319 adwprocesserror(adw, acb);
1325 adwprocesserror(struct adw_softc *adw, struct acb *acb)
1356 xpt_print_path(adw->path);
1358 ccb->ccb_h.status = adw->last_reset;
1369 xpt_print_path(adw->path);
1371 adw_reset_bus(adw);
1399 device_get_nameunit(adw->device),
1413 adwfreeacb(adw, acb);
1422 struct adw_softc *adw;
1428 adw = (struct adw_softc *)ccb->ccb_h.ccb_adw_ptr;
1432 mtx_assert(&adw->lock, MA_OWNED);
1445 status = adw_idle_cmd_send(adw, ADW_IDLE_CMD_DEVICE_RESET,
1448 device_printf(adw->device,
1450 adw_handle_device_reset(adw, target_id);
1452 adw_reset_bus(adw);
1453 xpt_print_path(adw->path);
1459 adw_handle_device_reset(struct adw_softc *adw, u_int target)
1464 error = xpt_create_path(&path, /*periph*/NULL, cam_sim_path(adw->sim),
1471 adw->last_reset = CAM_BDR_SENT;
1475 adw_handle_bus_reset(struct adw_softc *adw, int initiated)
1490 scsi_ctrl = adw_inw(adw, ADW_SCSI_CTRL) & ~ADW_SCSI_CTRL_RSTOUT;
1491 adw_outw(adw, ADW_SCSI_CTRL, scsi_ctrl | ADW_SCSI_CTRL_RSTOUT);
1493 adw_outw(adw, ADW_SCSI_CTRL, scsi_ctrl);
1500 xpt_async(AC_BUS_RESET, adw->path, NULL);
1501 adw->last_reset = CAM_SCSI_BUS_RESET;
1503 MODULE_DEPEND(adw, cam, 1, 1, 1);