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