Lines Matching refs:softp
128 static void iosram_set_master(struct iosramsoft *softp);
129 static int iosram_is_chosen(struct iosramsoft *softp);
130 static int iosram_tunnel_capable(struct iosramsoft *softp);
131 static int iosram_read_toc(struct iosramsoft *softp);
133 static void iosram_update_addrs(struct iosramsoft *softp);
135 static int iosram_setup_map(struct iosramsoft *softp);
136 static void iosram_remove_map(struct iosramsoft *softp);
140 static void iosram_add_instance(struct iosramsoft *softp);
142 static int iosram_switch_tunnel(iosramsoft_t *softp);
298 struct iosramsoft *softp; in iosram_attach() local
310 if (!(softp = ddi_get_soft_state(iosramsoft_statep, in iosram_attach()
315 mutex_enter(&softp->intr_mutex); in iosram_attach()
316 if (!softp->suspended) { in iosram_attach()
317 mutex_exit(&softp->intr_mutex); in iosram_attach()
321 softp->suspended = 0; in iosram_attach()
327 if (softp->sbbc_region) { in iosram_attach()
328 ddi_put32(softp->sbbc_handle, in iosram_attach()
329 &(softp->sbbc_region->int_enable.reg), in iosram_attach()
330 softp->int_enable_sav); in iosram_attach()
337 if (softp->intr_pending && !softp->intr_busy && in iosram_attach()
338 (softp->softintr_id != NULL)) { in iosram_attach()
339 ddi_trigger_softintr(softp->softintr_id); in iosram_attach()
342 mutex_exit(&softp->intr_mutex); in iosram_attach()
355 if ((softp = ddi_get_soft_state(iosramsoft_statep, instance)) == NULL) { in iosram_attach()
358 softp->dip = dip; in iosram_attach()
359 softp->instance = instance; in iosram_attach()
360 softp->sbbc_region = NULL; in iosram_attach()
365 if (iosram_tunnel_capable(softp) == 0) { in iosram_attach()
393 if (ddi_get_iblock_cookie(softp->dip, 0, &softp->real_iblk) in iosram_attach()
399 mutex_init(&softp->intr_mutex, NULL, MUTEX_DRIVER, in iosram_attach()
400 (void *)softp->real_iblk); in iosram_attach()
407 softp->state = IOSRAM_STATE_INIT; in iosram_attach()
408 iosram_add_instance(softp); in iosram_attach()
414 if (iosram_master == NULL && iosram_is_chosen(softp)) { in iosram_attach()
415 (void) iosram_switch_tunnel(softp); in iosram_attach()
424 softp->state = 0; in iosram_attach()
425 iosram_remove_instance(softp->instance); in iosram_attach()
427 mutex_destroy(&softp->intr_mutex); in iosram_attach()
452 dip, instance, softp, NULL); in iosram_attach()
470 struct iosramsoft *softp; in iosram_detach() local
473 if (!(softp = ddi_get_soft_state(iosramsoft_statep, instance))) { in iosram_detach()
478 dip, instance, softp, NULL); in iosram_detach()
485 mutex_enter(&softp->intr_mutex); in iosram_detach()
486 if (softp->suspended) { in iosram_detach()
487 mutex_exit(&softp->intr_mutex); in iosram_detach()
491 softp->suspended = 1; in iosram_detach()
495 if (softp->sbbc_region) { in iosram_detach()
497 softp->int_enable_sav = ddi_get32(softp->sbbc_handle, in iosram_detach()
498 &(softp->sbbc_region->int_enable.reg)); in iosram_detach()
499 ddi_put32(softp->sbbc_handle, in iosram_detach()
500 &(softp->sbbc_region->int_enable.reg), 0x0); in iosram_detach()
502 mutex_exit(&softp->intr_mutex); in iosram_detach()
516 softp->state |= IOSRAM_STATE_DETACH; in iosram_detach()
522 if (iosram_master == softp || (softp->state & IOSRAM_STATE_TSWITCH)) { in iosram_detach()
532 if (softp->state & IOSRAM_STATE_TSWITCH) { in iosram_detach()
533 softp->state &= ~IOSRAM_STATE_DETACH; in iosram_detach()
542 if (iosram_master == softp) { in iosram_detach()
543 softp->state &= ~IOSRAM_STATE_DETACH; in iosram_detach()
558 ASSERT((softp->state & IOSRAM_STATE_MAPPED) == 0); in iosram_detach()
563 mutex_destroy(&softp->intr_mutex); in iosram_detach()
582 struct iosramsoft *softp; in iosram_getinfo() local
592 softp = ddi_get_soft_state(iosramsoft_statep, instance); in iosram_getinfo()
593 if (softp == NULL) { in iosram_getinfo()
597 *result = softp->dip; in iosram_getinfo()
618 struct iosramsoft *softp; in iosram_open() local
622 softp = ddi_get_soft_state(iosramsoft_statep, instance); in iosram_open()
624 if (softp == NULL) { in iosram_open()
629 *dev, otype, softp->instance, softp); in iosram_open()
639 struct iosramsoft *softp; in iosram_close() local
643 softp = ddi_get_soft_state(iosramsoft_statep, instance); in iosram_close()
644 if (softp == NULL) { in iosram_close()
649 dev, otype, softp->instance, softp); in iosram_close()
1378 iosramsoft_t *softp = (iosramsoft_t *)arg; in iosram_softintr() local
1384 DPRINTF(1, ("iosram(%d): in iosram_softintr\n", softp->instance)); in iosram_softintr()
1387 arg, softp->intr_pending, softp->intr_busy, NULL); in iosram_softintr()
1390 mutex_enter(&softp->intr_mutex); in iosram_softintr()
1396 if (softp->intr_busy || !softp->intr_pending) { in iosram_softintr()
1397 mutex_exit(&softp->intr_mutex); in iosram_softintr()
1400 softp->instance, softp->intr_busy, softp->intr_pending)); in iosram_softintr()
1401 return (softp->intr_pending ? DDI_INTR_CLAIMED : in iosram_softintr()
1410 if (softp->state & IOSRAM_STATE_TSWITCH) { in iosram_softintr()
1411 mutex_exit(&softp->intr_mutex); in iosram_softintr()
1414 "state=0x%x\n", softp->instance, softp->state)); in iosram_softintr()
1421 if (!(softp->state & IOSRAM_STATE_MASTER)) { in iosram_softintr()
1422 mutex_exit(&softp->intr_mutex); in iosram_softintr()
1425 softp->instance, softp->state)); in iosram_softintr()
1436 if (softp->suspended) { in iosram_softintr()
1437 mutex_exit(&softp->intr_mutex); in iosram_softintr()
1440 softp->instance)); in iosram_softintr()
1449 softp->intr_busy = 1; in iosram_softintr()
1459 softp->instance)); in iosram_softintr()
1461 softp->intr_pending = 0; in iosram_softintr()
1463 mutex_exit(&softp->intr_mutex); in iosram_softintr()
1511 softp->instance, i, (int)flag, in iosram_softintr()
1522 softp->instance)); in iosram_softintr()
1545 softp->instance, in iosram_softintr()
1564 mutex_enter(&softp->intr_mutex); in iosram_softintr()
1566 } while (softp->intr_pending && !softp->suspended && in iosram_softintr()
1572 softp->intr_busy = 0; in iosram_softintr()
1580 mutex_exit(&softp->intr_mutex); in iosram_softintr()
1583 DPRINTF(1, ("iosram(%d): softintr exit\n", softp->instance)); in iosram_softintr()
1596 iosramsoft_t *softp = (iosramsoft_t *)arg; in iosram_intr() local
1600 DPRINTF(2, ("iosram(%d): in iosram_intr\n", softp->instance)); in iosram_intr()
1602 mutex_enter(&softp->intr_mutex); in iosram_intr()
1604 if (softp->sbbc_handle == NULL) { in iosram_intr()
1611 softp->instance)); in iosram_intr()
1612 softp->intr_pending = 1; in iosram_intr()
1613 mutex_exit(&softp->intr_mutex); in iosram_intr()
1617 int_status = ddi_get32(softp->sbbc_handle, in iosram_intr()
1618 &(softp->sbbc_region->int_status.reg)); in iosram_intr()
1632 ddi_put32(softp->sbbc_handle, in iosram_intr()
1633 &(softp->sbbc_region->int_status.reg), int_status); in iosram_intr()
1634 int_status = ddi_get32(softp->sbbc_handle, in iosram_intr()
1635 &(softp->sbbc_region->int_status.reg)); in iosram_intr()
1639 softp->intr_pending = 1; in iosram_intr()
1644 if (!softp->intr_busy && !softp->suspended && in iosram_intr()
1645 (softp->softintr_id != NULL)) { in iosram_intr()
1647 softp->instance)); in iosram_intr()
1648 ddi_trigger_softintr(softp->softintr_id); in iosram_intr()
1654 mutex_exit(&softp->intr_mutex); in iosram_intr()
1657 arg, softp->intr_pending, softp->intr_busy, NULL); in iosram_intr()
1658 DPRINTF(1, ("iosram(%d): iosram_intr exit\n", softp->instance)); in iosram_intr()
1693 struct iosramsoft *softp; in iosram_ioctl() local
1696 softp = ddi_get_soft_state(iosramsoft_statep, getminor(dev)); in iosram_ioctl()
1697 if (softp == NULL) { in iosram_ioctl()
1701 dev, cmd, arg, softp->instance); in iosram_ioctl()
1861 ddi_put32(softp->sbbc_handle, in iosram_ioctl()
1862 &(softp->sbbc_region->int_enable.reg), (int)arg); in iosram_ioctl()
1867 ddi_put32(softp->sbbc_handle, in iosram_ioctl()
1868 &(softp->sbbc_region->p0_int_gen.reg), 1); in iosram_ioctl()
1975 iosram_switch_tunnel(iosramsoft_t *softp) in iosram_switch_tunnel() argument
1978 int instance = softp->instance; in iosram_switch_tunnel()
1986 (void *)softp, instance, (void *)iosram_master, in iosram_switch_tunnel()
1989 softp, instance, iosram_master, in iosram_switch_tunnel()
1992 if (softp == NULL || (softp->state & IOSRAM_STATE_DETACH)) { in iosram_switch_tunnel()
1995 if (iosram_master == softp) { in iosram_switch_tunnel()
2006 iosram_new_master = softp; in iosram_switch_tunnel()
2007 softp->state |= IOSRAM_STATE_TSWITCH; in iosram_switch_tunnel()
2019 softp->instance)); in iosram_switch_tunnel()
2021 instance, softp, NULL, NULL); in iosram_switch_tunnel()
2023 if (iosram_setup_map(softp) != DDI_SUCCESS) { in iosram_switch_tunnel()
2025 } else if ((chunks == NULL) && (iosram_read_toc(softp) != 0)) { in iosram_switch_tunnel()
2026 iosram_remove_map(softp); in iosram_switch_tunnel()
2028 } else if (iosram_add_intr(softp) != DDI_SUCCESS) { in iosram_switch_tunnel()
2039 iosram_remove_map(softp); in iosram_switch_tunnel()
2065 instance, softp, error, NULL); in iosram_switch_tunnel()
2075 result = prom_starcat_switch_tunnel(softp->portid, in iosram_switch_tunnel()
2082 softp->portid, result, error, NULL); in iosram_switch_tunnel()
2110 (void) iosram_remove_intr(softp); in iosram_switch_tunnel()
2111 iosram_remove_map(softp); in iosram_switch_tunnel()
2123 iosram_set_master(softp); in iosram_switch_tunnel()
2145 softp->state &= ~IOSRAM_STATE_TSWITCH; in iosram_switch_tunnel()
2152 mutex_enter(&softp->intr_mutex); in iosram_switch_tunnel()
2158 mutex_exit(&softp->intr_mutex); in iosram_switch_tunnel()
2301 struct iosramsoft *softp; in iosram_switchfrom() local
2374 for (softp = iosram_instances; softp != NULL; softp = softp->next) { in iosram_switchfrom()
2380 if (softp->instance == instance) { in iosram_switchfrom()
2385 if (softp->state & IOSRAM_STATE_DETACH) { in iosram_switchfrom()
2395 if (softp->instance == last_master_instance) { in iosram_switchfrom()
2396 last_master = softp; in iosram_switchfrom()
2405 if (iosram_switch_tunnel(softp) == 0) { in iosram_switchfrom()
2417 if ((softp == NULL) && (last_master != NULL) && in iosram_switchfrom()
2421 softp = last_master; in iosram_switchfrom()
2426 if ((softp == NULL) || (iosram_tswitch_aborted)) { in iosram_switchfrom()
2450 iosram_tunnel_capable(struct iosramsoft *softp) in iosram_tunnel_capable() argument
2459 if (ddi_getlongprop_buf(DDI_DEV_T_ANY, softp->dip, in iosram_tunnel_capable()
2469 iosram_sbbc_setup_map(struct iosramsoft *softp) in iosram_sbbc_setup_map() argument
2473 dev_info_t *dip = softp->dip; in iosram_sbbc_setup_map()
2481 mutex_enter(&softp->intr_mutex); in iosram_sbbc_setup_map()
2487 (caddr_t *)&softp->sbbc_region, in iosram_sbbc_setup_map()
2489 &attr, &softp->sbbc_handle)) != DDI_SUCCESS) { in iosram_sbbc_setup_map()
2491 mutex_exit(&softp->intr_mutex); in iosram_sbbc_setup_map()
2500 ddi_put32(softp->sbbc_handle, in iosram_sbbc_setup_map()
2501 &(softp->sbbc_region->int_enable.reg), 0x0); in iosram_sbbc_setup_map()
2510 sema_val = IOSRAM_SEMA_RD(softp); in iosram_sbbc_setup_map()
2517 IOSRAM_SEMA_WR(softp, 0); in iosram_sbbc_setup_map()
2521 IOSRAM_SEMA_WR(softp, 0); in iosram_sbbc_setup_map()
2524 mutex_exit(&softp->intr_mutex); in iosram_sbbc_setup_map()
2531 iosram_setup_map(struct iosramsoft *softp) in iosram_setup_map() argument
2533 int instance = softp->instance; in iosram_setup_map()
2534 dev_info_t *dip = softp->dip; in iosram_setup_map()
2560 softp->iosramlen = regprop->size; in iosram_setup_map()
2565 softp->iosramlen)); in iosram_setup_map()
2566 softp->handle = NULL; in iosram_setup_map()
2572 if (ddi_regs_map_setup(dip, 0, (caddr_t *)&softp->iosramp, in iosram_setup_map()
2573 0x0, softp->iosramlen, &attr, &softp->handle) != DDI_SUCCESS) { in iosram_setup_map()
2575 instance, softp->iosramlen); in iosram_setup_map()
2576 iosram_remove_map(softp); in iosram_setup_map()
2589 iosram_remove_map(softp); in iosram_setup_map()
2592 softp->portid = portid; in iosram_setup_map()
2594 if (iosram_sbbc_setup_map(softp) != DDI_SUCCESS) { in iosram_setup_map()
2597 iosram_remove_map(softp); in iosram_setup_map()
2602 softp->state |= IOSRAM_STATE_MAPPED; in iosram_setup_map()
2610 iosram_remove_map(struct iosramsoft *softp) in iosram_remove_map() argument
2614 ASSERT((softp->state & IOSRAM_STATE_MASTER) == 0); in iosram_remove_map()
2616 if (softp->handle) { in iosram_remove_map()
2617 ddi_regs_map_free(&softp->handle); in iosram_remove_map()
2618 softp->handle = NULL; in iosram_remove_map()
2620 softp->iosramp = NULL; in iosram_remove_map()
2626 mutex_enter(&softp->intr_mutex); in iosram_remove_map()
2627 if (softp->sbbc_region) { in iosram_remove_map()
2628 ddi_regs_map_free(&softp->sbbc_handle); in iosram_remove_map()
2629 softp->sbbc_region = NULL; in iosram_remove_map()
2631 mutex_exit(&softp->intr_mutex); in iosram_remove_map()
2633 softp->state &= ~IOSRAM_STATE_MAPPED; in iosram_remove_map()
2646 iosram_is_chosen(struct iosramsoft *softp) in iosram_is_chosen() argument
2670 softp->instance); in iosram_is_chosen()
2675 softp->instance, nodeid, IOSRAM_CHOSEN_PROP)); in iosram_is_chosen()
2686 softp->instance, nodeid, chosen_iosram)); in iosram_is_chosen()
2688 (void) ddi_pathname(softp->dip, pn); in iosram_is_chosen()
2690 softp->instance, (void *)softp->dip, pn)); in iosram_is_chosen()
2693 DPRINTF(1, ("iosram(%d): ... %s\n", softp->instance, in iosram_is_chosen()
2695 IOSRAMLOG(1, "iosram(%d): ... %s\n", softp->instance, in iosram_is_chosen()
2709 iosram_set_master(struct iosramsoft *softp) in iosram_set_master() argument
2712 ASSERT(softp != NULL); in iosram_set_master()
2713 ASSERT(softp->state & IOSRAM_STATE_MAPPED); in iosram_set_master()
2714 ASSERT(IOSRAM_GET_HDRFIELD32(softp, status) == IOSRAM_VALID); in iosram_set_master()
2719 if (iosram_master && (iosram_master != softp)) { in iosram_set_master()
2726 iosram_update_addrs(softp); in iosram_set_master()
2727 iosram_handle = softp->handle; in iosram_set_master()
2728 softp->state |= IOSRAM_STATE_MASTER; in iosram_set_master()
2729 softp->tswitch_ok++; in iosram_set_master()
2730 iosram_master = softp; in iosram_set_master()
2732 IOSRAMLOG(1, "SETMASTER: softp:%p instance:%d\n", softp, in iosram_set_master()
2733 softp->instance, NULL, NULL); in iosram_set_master()
2744 iosram_read_toc(struct iosramsoft *softp) in iosram_read_toc() argument
2747 int instance = softp->instance; in iosram_read_toc()
2759 ASSERT(softp->state & IOSRAM_STATE_MAPPED); in iosram_read_toc()
2767 if (IOSRAM_GET_HDRFIELD32(softp, status) != IOSRAM_VALID) { in iosram_read_toc()
2777 toc_entryp = softp->iosramp + IOSRAM_GET_HDRFIELD32(softp, toc_offset); in iosram_read_toc()
2782 ddi_rep_get8(softp->handle, (uint8_t *)&index, toc_entryp, in iosram_read_toc()
2801 ddi_rep_get8(softp->handle, (uint8_t *)&(chunkp->toc_data), in iosram_read_toc()
2804 if ((chunkp->toc_data.off < softp->iosramlen) && in iosram_read_toc()
2805 (chunkp->toc_data.len <= softp->iosramlen) && in iosram_read_toc()
2807 softp->iosramlen)) { in iosram_read_toc()
2808 chunkp->basep = softp->iosramp + chunkp->toc_data.off; in iosram_read_toc()
2918 iosram_update_addrs(struct iosramsoft *softp) in iosram_update_addrs() argument
2931 chunkp->basep = softp->iosramp + chunkp->toc_data.off; in iosram_update_addrs()
2980 iosram_add_intr(iosramsoft_t *softp) in iosram_add_intr() argument
2983 softp, softp->instance, NULL, NULL); in iosram_add_intr()
2985 if (ddi_add_softintr(softp->dip, DDI_SOFTINT_MED, in iosram_add_intr()
2986 &softp->softintr_id, &softp->soft_iblk, NULL, in iosram_add_intr()
2987 iosram_softintr, (caddr_t)softp) != DDI_SUCCESS) { in iosram_add_intr()
2990 softp->instance); in iosram_add_intr()
2994 if (ddi_add_intr(softp->dip, 0, &softp->real_iblk, NULL, in iosram_add_intr()
2995 iosram_intr, (caddr_t)softp) != DDI_SUCCESS) { in iosram_add_intr()
2998 " handler.\n", softp->instance); in iosram_add_intr()
2999 ddi_remove_softintr(softp->softintr_id); in iosram_add_intr()
3006 ddi_put32(softp->sbbc_handle, &(softp->sbbc_region->int_enable.reg), in iosram_add_intr()
3017 iosram_remove_intr(iosramsoft_t *softp) in iosram_remove_intr() argument
3020 softp, softp->instance, NULL, NULL); in iosram_remove_intr()
3025 if (softp->sbbc_region) { in iosram_remove_intr()
3026 ddi_put32(softp->sbbc_handle, in iosram_remove_intr()
3027 &(softp->sbbc_region->int_enable.reg), 0); in iosram_remove_intr()
3033 ddi_remove_intr(softp->dip, 0, softp->real_iblk); in iosram_remove_intr()
3039 if (softp->softintr_id != NULL) { in iosram_remove_intr()
3040 ddi_remove_softintr(softp->softintr_id); in iosram_remove_intr()
3041 softp->softintr_id = NULL; in iosram_remove_intr()
3058 iosramsoft_t *softp; in iosram_add_instance() local
3065 for (softp = iosram_instances; softp != NULL; softp = softp->next) { in iosram_add_instance()
3066 ASSERT(softp->instance != instance); in iosram_add_instance()
3089 iosramsoft_t *softp; in iosram_remove_instance() local
3097 for (softp = iosram_instances; softp != NULL; softp = softp->next) { in iosram_remove_instance()
3098 if (softp->instance == instance) { in iosram_remove_instance()
3099 if (softp->next != NULL) { in iosram_remove_instance()
3100 softp->next->prev = softp->prev; in iosram_remove_instance()
3102 if (softp->prev != NULL) { in iosram_remove_instance()
3103 softp->prev->next = softp->next; in iosram_remove_instance()
3105 if (iosram_instances == softp) { in iosram_remove_instance()
3106 iosram_instances = softp->next; in iosram_remove_instance()
3128 struct iosramsoft *softp; in iosram_sema_acquire() local
3148 if ((softp = iosram_master) == NULL) { in iosram_sema_acquire()
3154 mutex_enter(&softp->intr_mutex); in iosram_sema_acquire()
3160 if (softp->sbbc_region == NULL) { in iosram_sema_acquire()
3161 mutex_exit(&softp->intr_mutex); in iosram_sema_acquire()
3164 "SBBC not mapped\n", softp->instance)); in iosram_sema_acquire()
3169 sema_val = IOSRAM_SEMA_RD(softp); in iosram_sema_acquire()
3181 mutex_exit(&softp->intr_mutex); in iosram_sema_acquire()
3185 "old value=0x%x rv=%d\n", softp->instance, sema_val, rv)); in iosram_sema_acquire()
3202 struct iosramsoft *softp; in iosram_sema_release() local
3220 if ((softp = iosram_master) == NULL) { in iosram_sema_release()
3226 mutex_enter(&softp->intr_mutex); in iosram_sema_release()
3232 if (softp->sbbc_region == NULL) { in iosram_sema_release()
3233 mutex_exit(&softp->intr_mutex); in iosram_sema_release()
3236 "SBBC not mapped\n", softp->instance)); in iosram_sema_release()
3241 IOSRAM_SEMA_WR(softp, 0); in iosram_sema_release()
3243 mutex_exit(&softp->intr_mutex); in iosram_sema_release()
3247 softp->instance)); in iosram_sema_release()
3338 struct iosramsoft *softp; in iosram_print_state() local
3342 softp = iosram_master; in iosram_print_state()
3344 softp = ddi_get_soft_state(iosramsoft_statep, instance); in iosram_print_state()
3347 if (softp == NULL) { in iosram_print_state()
3352 instance = softp->instance; in iosram_print_state()
3355 mutex_enter(&softp->intr_mutex); in iosram_print_state()
3358 ((softp == iosram_master) ? "MASTER" : "SLAVE")); in iosram_print_state()
3360 (void) ddi_pathname(softp->dip, pn); in iosram_print_state()
3363 softp->instance, softp->portid, softp->iosramlen); in iosram_print_state()
3364 cmn_err(CE_CONT, " softp:%p handle:%p iosramp:%p\n", (void *)softp, in iosram_print_state()
3365 (void *)softp->handle, (void *)softp->iosramp); in iosram_print_state()
3367 softp->state, softp->tswitch_ok, softp->tswitch_fail); in iosram_print_state()
3369 (void *)softp->softintr_id, softp->intr_busy, softp->intr_pending); in iosram_print_state()
3371 mutex_exit(&softp->intr_mutex); in iosram_print_state()