3060 return (NDI_FAILURE);
3061 }
3062
3063 /*
3064 * The delay and wait strings have the same effect.
3065 * The "wait[,]" support should be removed once the
3066 * devfs test suites are fixed.
3067 * NOTE: delay should not be called from interrupt context
3068 */
3069 ASSERT(!servicing_interrupt());
3070
3071 if (strncmp(caddr, "delay,", 6) == 0) {
3072 p = caddr+6;
3073 n = stoi(&p);
3074 if (*p != 0)
3075 n = 1;
3076 if (pshot_debug)
3077 cmn_err(CE_CONT,
3078 "pshot%d: %s delay %d second\n",
3079 ddi_get_instance(parent), devname, n);
3080 delay(n * drv_usectohz(1000000));
3081 } else if (strncmp(caddr, "delay", 5) == 0) {
3082 if (pshot_debug)
3083 cmn_err(CE_CONT,
3084 "pshot%d: %s delay 1 second\n",
3085 ddi_get_instance(parent), devname);
3086 delay(drv_usectohz(1000000));
3087 } else if (strncmp(caddr, "wait,", 5) == 0) {
3088 p = caddr+5;
3089 n = stoi(&p);
3090 if (*p != 0)
3091 n = 1;
3092 if (pshot_debug)
3093 cmn_err(CE_CONT,
3094 "pshot%d: %s wait %d second\n",
3095 ddi_get_instance(parent), devname, n);
3096 delay(n * drv_usectohz(1000000));
3097 } else if (strncmp(caddr, "wait", 4) == 0) {
3098 if (pshot_debug)
3099 cmn_err(CE_CONT,
3100 "pshot%d: %s wait 1 second\n",
3101 ddi_get_instance(parent), devname);
3102 delay(drv_usectohz(1000000));
3103 }
3104
3105 return (NDI_SUCCESS);
3106 }
3107
3108 /*
3109 * translate nodetype name to actual value
3110 */
3111 static char *
3112 pshot_str2nt(char *str)
3113 {
3114 int i;
3115
3116 for (i = 0; pshot_nodetypes[i].name; i++) {
3117 if (strcmp(pshot_nodetypes[i].name, str) == 0)
3118 return (pshot_nodetypes[i].val);
3119 }
3120 return (NULL);
3121 }
3122
3463 {
3464 static int pshot_devnode(dev_info_t *dip, void * arg);
3465
3466 dev_info_t *root = ddi_root_node();
3467 ddi_walk_devs(root, pshot_devnode, NULL);
3468 }
3469
3470 static void
3471 pshot_walk_thread()
3472 {
3473 static void pshot_timeout(void *arg);
3474 static kthread_id_t pwt;
3475
3476 pwt = curthread;
3477 mutex_init(&pwl, NULL, MUTEX_DRIVER, NULL);
3478 cv_init(&pwcv, NULL, CV_DRIVER, NULL);
3479
3480 while (1) {
3481 pshot_walk_tree();
3482 mutex_enter(&pwl);
3483 (void) timeout(pshot_timeout, NULL, 5 * drv_usectohz(1000000));
3484 cv_wait(&pwcv, &pwl);
3485 mutex_exit(&pwl);
3486 }
3487 }
3488
3489 static void
3490 pshot_timeout(void *arg)
3491 {
3492 mutex_enter(&pwl);
3493 cv_signal(&pwcv);
3494 mutex_exit(&pwl);
3495 }
3496
3497 static int
3498 pshot_devnode(dev_info_t *dip, void *arg)
3499 {
3500 dev_info_t *f_dip;
3501
3502 if (dip != ddi_root_node()) {
3503 f_dip = ndi_devi_find((dev_info_t *)DEVI(dip)->devi_parent,
3532 (void *)dip, (void *)cookie, NDI_EVENT_NAME(cookie),
3533 event_tag, (void *)softstate, (void *)bus_impldata);
3534
3535 }
3536
3537 static void
3538 pshot_event_test(void *arg)
3539 {
3540 pshot_t *pshot = (pshot_t *)arg;
3541 ndi_event_hdl_t hdl;
3542 ndi_event_set_t events;
3543 int i, rval;
3544
3545 (void) ndi_event_alloc_hdl(pshot->dip, NULL, &hdl, NDI_SLEEP);
3546
3547 events.ndi_events_version = NDI_EVENTS_REV1;
3548 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3549 events.ndi_event_defs = pshot_test_events;
3550
3551 cmn_err(CE_CONT, "pshot: binding set of 8 events\n");
3552 delay(drv_usectohz(1000000));
3553 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3554 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3555
3556 cmn_err(CE_CONT, "pshot: binding the same set of 8 events\n");
3557 delay(drv_usectohz(1000000));
3558 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3559 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3560
3561 cmn_err(CE_CONT, "pshot: unbinding all events\n");
3562 delay(drv_usectohz(1000000));
3563 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3564 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3565
3566
3567 cmn_err(CE_CONT, "pshot: binding one highlevel event\n");
3568 delay(drv_usectohz(1000000));
3569 events.ndi_n_events = 1;
3570 events.ndi_event_defs = pshot_test_events_high;
3571 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3572 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3573
3574 cmn_err(CE_CONT, "pshot: binding the same set of 8 events\n");
3575 delay(drv_usectohz(1000000));
3576 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3577 events.ndi_event_defs = pshot_test_events;
3578 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3579 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3580
3581 cmn_err(CE_CONT, "pshot: unbinding one highlevel event\n");
3582 delay(drv_usectohz(1000000));
3583 events.ndi_n_events = 1;
3584 events.ndi_event_defs = pshot_test_events_high;
3585 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3586 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3587
3588 cmn_err(CE_CONT, "pshot: binding one highlevel event\n");
3589 delay(drv_usectohz(1000000));
3590 events.ndi_n_events = 1;
3591 events.ndi_event_defs = pshot_test_events_high;
3592 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3593 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3594
3595 cmn_err(CE_CONT, "pshot: unbinding one highlevel event\n");
3596 delay(drv_usectohz(1000000));
3597 events.ndi_n_events = 1;
3598 events.ndi_event_defs = pshot_test_events_high;
3599 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3600 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3601
3602 cmn_err(CE_CONT, "pshot: binding the same set of 8 events\n");
3603 delay(drv_usectohz(1000000));
3604 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3605 events.ndi_event_defs = pshot_test_events;
3606 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3607 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3608
3609 cmn_err(CE_CONT, "pshot: unbinding first 2 events\n");
3610 delay(drv_usectohz(1000000));
3611 events.ndi_n_events = 2;
3612 events.ndi_event_defs = pshot_test_events;
3613 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3614 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3615
3616 cmn_err(CE_CONT, "pshot: unbinding first 2 events again\n");
3617 delay(drv_usectohz(1000000));
3618 events.ndi_n_events = 2;
3619 events.ndi_event_defs = pshot_test_events;
3620 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3621 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3622
3623 cmn_err(CE_CONT, "pshot: unbinding middle 2 events\n");
3624 delay(drv_usectohz(1000000));
3625 events.ndi_n_events = 2;
3626 events.ndi_event_defs = &pshot_test_events[4];
3627 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3628 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3629
3630 cmn_err(CE_CONT, "pshot: binding those 2 events back\n");
3631 delay(drv_usectohz(1000000));
3632 events.ndi_n_events = 2;
3633 events.ndi_event_defs = &pshot_test_events[4];
3634 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3635 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3636
3637 cmn_err(CE_CONT, "pshot: unbinding 2 events\n");
3638 delay(drv_usectohz(1000000));
3639 events.ndi_n_events = 2;
3640 events.ndi_event_defs = &pshot_test_events[4];
3641 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3642 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3643
3644 cmn_err(CE_CONT, "pshot: unbinding all events\n");
3645 delay(drv_usectohz(1000000));
3646 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3647 events.ndi_event_defs = pshot_test_events;
3648 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3649 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3650
3651 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3652 delay(drv_usectohz(1000000));
3653 events.ndi_n_events = 1;
3654 events.ndi_event_defs = &pshot_test_events[2];
3655 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3656 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3657
3658 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3659 delay(drv_usectohz(1000000));
3660 events.ndi_n_events = 1;
3661 events.ndi_event_defs = &pshot_test_events[3];
3662 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3663 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3664
3665 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3666 delay(drv_usectohz(1000000));
3667 events.ndi_n_events = 1;
3668 events.ndi_event_defs = &pshot_test_events[6];
3669 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3670 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3671
3672 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3673 delay(drv_usectohz(1000000));
3674 events.ndi_n_events = 1;
3675 events.ndi_event_defs = &pshot_test_events[7];
3676 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3677 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3678
3679 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3680 events.ndi_event_defs = pshot_test_events;
3681
3682 cmn_err(CE_CONT, "pshot: binding set of 8 events\n");
3683 delay(drv_usectohz(1000000));
3684 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3685 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3686
3687 cmn_err(CE_CONT, "pshot: adding 8 callbacks\n");
3688 delay(drv_usectohz(1000000));
3689 for (i = 0; i < 8; i++) {
3690 rval = ndi_event_add_callback(hdl, pshot->dip,
3691 ndi_event_tag_to_cookie(hdl,
3692 pshot_test_events[i].ndi_event_tag),
3693 pshot_event_cb_test,
3694 (void *)(uintptr_t)pshot_test_events[i].ndi_event_tag,
3695 NDI_SLEEP, &pshot->test_callback_cache[i]);
3696 ASSERT(rval == NDI_SUCCESS);
3697 }
3698
3699 cmn_err(CE_CONT, "pshot: event callbacks\n");
3700
3701 for (i = 10; i < 18; i++) {
3702 ddi_eventcookie_t cookie = ndi_event_tag_to_cookie(hdl, i);
3703
3704 rval = ndi_event_run_callbacks(hdl, pshot->dip, cookie,
3705 (void *)hdl);
3706
3707 cmn_err(CE_CONT, "pshot: callback, tag=%d rval=%d\n",
3708 i, rval);
3709 delay(drv_usectohz(1000000));
3710 }
3711
3712 cmn_err(CE_CONT, "pshot: redo event callbacks\n");
3713
3714 for (i = 10; i < 18; i++) {
3715 ddi_eventcookie_t cookie = ndi_event_tag_to_cookie(hdl, i);
3716
3717 rval = ndi_event_run_callbacks(hdl,
3718 pshot->dip, cookie, (void *)hdl);
3719
3720 cmn_err(CE_CONT, "pshot: callback, tag=%d rval=%d\n",
3721 i, rval);
3722 delay(drv_usectohz(1000000));
3723 }
3724
3725 cmn_err(CE_CONT, "pshot: removing 8 callbacks\n");
3726 delay(drv_usectohz(1000000));
3727
3728 for (i = 0; i < 8; i++) {
3729 (void) ndi_event_remove_callback(hdl,
3730 pshot->test_callback_cache[i]);
3731
3732 pshot->test_callback_cache[i] = 0;
3733 }
3734
3735 cmn_err(CE_CONT, "pshot: freeing handle with bound set\n");
3736 delay(drv_usectohz(1000000));
3737
3738 rval = ndi_event_free_hdl(hdl);
3739
3740 ASSERT(rval == NDI_SUCCESS);
3741
3742 }
3743
3744 void
3745 pshot_event_test_post_one(void *arg)
3746 {
3747 pshot_t *pshot = (pshot_t *)arg;
3748 int rval;
3749 ddi_eventcookie_t cookie;
3750
3751 cmn_err(CE_CONT, "pshot%d: pshot_event_post_one event\n",
3752 pshot->instance);
3753
3754 if (ddi_get_eventcookie(pshot->dip, PSHOT_EVENT_NAME_BUS_TEST_POST,
3755 &cookie) != DDI_SUCCESS) {
3756 cmn_err(CE_NOTE, "pshot_bus_test_post cookie not found");
|
3060 return (NDI_FAILURE);
3061 }
3062
3063 /*
3064 * The delay and wait strings have the same effect.
3065 * The "wait[,]" support should be removed once the
3066 * devfs test suites are fixed.
3067 * NOTE: delay should not be called from interrupt context
3068 */
3069 ASSERT(!servicing_interrupt());
3070
3071 if (strncmp(caddr, "delay,", 6) == 0) {
3072 p = caddr+6;
3073 n = stoi(&p);
3074 if (*p != 0)
3075 n = 1;
3076 if (pshot_debug)
3077 cmn_err(CE_CONT,
3078 "pshot%d: %s delay %d second\n",
3079 ddi_get_instance(parent), devname, n);
3080 delay(drv_sectohz(n));
3081 } else if (strncmp(caddr, "delay", 5) == 0) {
3082 if (pshot_debug)
3083 cmn_err(CE_CONT,
3084 "pshot%d: %s delay 1 second\n",
3085 ddi_get_instance(parent), devname);
3086 delay(drv_sectohz(1));
3087 } else if (strncmp(caddr, "wait,", 5) == 0) {
3088 p = caddr+5;
3089 n = stoi(&p);
3090 if (*p != 0)
3091 n = 1;
3092 if (pshot_debug)
3093 cmn_err(CE_CONT,
3094 "pshot%d: %s wait %d second\n",
3095 ddi_get_instance(parent), devname, n);
3096 delay(drv_sectohz(n));
3097 } else if (strncmp(caddr, "wait", 4) == 0) {
3098 if (pshot_debug)
3099 cmn_err(CE_CONT,
3100 "pshot%d: %s wait 1 second\n",
3101 ddi_get_instance(parent), devname);
3102 delay(drv_sectohz(1));
3103 }
3104
3105 return (NDI_SUCCESS);
3106 }
3107
3108 /*
3109 * translate nodetype name to actual value
3110 */
3111 static char *
3112 pshot_str2nt(char *str)
3113 {
3114 int i;
3115
3116 for (i = 0; pshot_nodetypes[i].name; i++) {
3117 if (strcmp(pshot_nodetypes[i].name, str) == 0)
3118 return (pshot_nodetypes[i].val);
3119 }
3120 return (NULL);
3121 }
3122
3463 {
3464 static int pshot_devnode(dev_info_t *dip, void * arg);
3465
3466 dev_info_t *root = ddi_root_node();
3467 ddi_walk_devs(root, pshot_devnode, NULL);
3468 }
3469
3470 static void
3471 pshot_walk_thread()
3472 {
3473 static void pshot_timeout(void *arg);
3474 static kthread_id_t pwt;
3475
3476 pwt = curthread;
3477 mutex_init(&pwl, NULL, MUTEX_DRIVER, NULL);
3478 cv_init(&pwcv, NULL, CV_DRIVER, NULL);
3479
3480 while (1) {
3481 pshot_walk_tree();
3482 mutex_enter(&pwl);
3483 (void) timeout(pshot_timeout, NULL, drv_sectohz(5));
3484 cv_wait(&pwcv, &pwl);
3485 mutex_exit(&pwl);
3486 }
3487 }
3488
3489 static void
3490 pshot_timeout(void *arg)
3491 {
3492 mutex_enter(&pwl);
3493 cv_signal(&pwcv);
3494 mutex_exit(&pwl);
3495 }
3496
3497 static int
3498 pshot_devnode(dev_info_t *dip, void *arg)
3499 {
3500 dev_info_t *f_dip;
3501
3502 if (dip != ddi_root_node()) {
3503 f_dip = ndi_devi_find((dev_info_t *)DEVI(dip)->devi_parent,
3532 (void *)dip, (void *)cookie, NDI_EVENT_NAME(cookie),
3533 event_tag, (void *)softstate, (void *)bus_impldata);
3534
3535 }
3536
3537 static void
3538 pshot_event_test(void *arg)
3539 {
3540 pshot_t *pshot = (pshot_t *)arg;
3541 ndi_event_hdl_t hdl;
3542 ndi_event_set_t events;
3543 int i, rval;
3544
3545 (void) ndi_event_alloc_hdl(pshot->dip, NULL, &hdl, NDI_SLEEP);
3546
3547 events.ndi_events_version = NDI_EVENTS_REV1;
3548 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3549 events.ndi_event_defs = pshot_test_events;
3550
3551 cmn_err(CE_CONT, "pshot: binding set of 8 events\n");
3552 delay(drv_sectohz(1));
3553 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3554 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3555
3556 cmn_err(CE_CONT, "pshot: binding the same set of 8 events\n");
3557 delay(drv_sectohz(1));
3558 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3559 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3560
3561 cmn_err(CE_CONT, "pshot: unbinding all events\n");
3562 delay(drv_sectohz(1));
3563 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3564 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3565
3566
3567 cmn_err(CE_CONT, "pshot: binding one highlevel event\n");
3568 delay(drv_sectohz(1));
3569 events.ndi_n_events = 1;
3570 events.ndi_event_defs = pshot_test_events_high;
3571 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3572 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3573
3574 cmn_err(CE_CONT, "pshot: binding the same set of 8 events\n");
3575 delay(drv_sectohz(1));
3576 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3577 events.ndi_event_defs = pshot_test_events;
3578 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3579 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3580
3581 cmn_err(CE_CONT, "pshot: unbinding one highlevel event\n");
3582 delay(drv_sectohz(1));
3583 events.ndi_n_events = 1;
3584 events.ndi_event_defs = pshot_test_events_high;
3585 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3586 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3587
3588 cmn_err(CE_CONT, "pshot: binding one highlevel event\n");
3589 delay(drv_sectohz(1));
3590 events.ndi_n_events = 1;
3591 events.ndi_event_defs = pshot_test_events_high;
3592 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3593 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3594
3595 cmn_err(CE_CONT, "pshot: unbinding one highlevel event\n");
3596 delay(drv_sectohz(1));
3597 events.ndi_n_events = 1;
3598 events.ndi_event_defs = pshot_test_events_high;
3599 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3600 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3601
3602 cmn_err(CE_CONT, "pshot: binding the same set of 8 events\n");
3603 delay(drv_sectohz(1));
3604 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3605 events.ndi_event_defs = pshot_test_events;
3606 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3607 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3608
3609 cmn_err(CE_CONT, "pshot: unbinding first 2 events\n");
3610 delay(drv_sectohz(1));
3611 events.ndi_n_events = 2;
3612 events.ndi_event_defs = pshot_test_events;
3613 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3614 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3615
3616 cmn_err(CE_CONT, "pshot: unbinding first 2 events again\n");
3617 delay(drv_sectohz(1));
3618 events.ndi_n_events = 2;
3619 events.ndi_event_defs = pshot_test_events;
3620 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3621 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3622
3623 cmn_err(CE_CONT, "pshot: unbinding middle 2 events\n");
3624 delay(drv_sectohz(1));
3625 events.ndi_n_events = 2;
3626 events.ndi_event_defs = &pshot_test_events[4];
3627 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3628 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3629
3630 cmn_err(CE_CONT, "pshot: binding those 2 events back\n");
3631 delay(drv_sectohz(1));
3632 events.ndi_n_events = 2;
3633 events.ndi_event_defs = &pshot_test_events[4];
3634 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3635 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3636
3637 cmn_err(CE_CONT, "pshot: unbinding 2 events\n");
3638 delay(drv_sectohz(1));
3639 events.ndi_n_events = 2;
3640 events.ndi_event_defs = &pshot_test_events[4];
3641 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3642 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3643
3644 cmn_err(CE_CONT, "pshot: unbinding all events\n");
3645 delay(drv_sectohz(1));
3646 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3647 events.ndi_event_defs = pshot_test_events;
3648 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3649 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3650
3651 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3652 delay(drv_sectohz(1));
3653 events.ndi_n_events = 1;
3654 events.ndi_event_defs = &pshot_test_events[2];
3655 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3656 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3657
3658 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3659 delay(drv_sectohz(1));
3660 events.ndi_n_events = 1;
3661 events.ndi_event_defs = &pshot_test_events[3];
3662 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3663 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3664
3665 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3666 delay(drv_sectohz(1));
3667 events.ndi_n_events = 1;
3668 events.ndi_event_defs = &pshot_test_events[6];
3669 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3670 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3671
3672 cmn_err(CE_CONT, "pshot: unbinding 1 event\n");
3673 delay(drv_sectohz(1));
3674 events.ndi_n_events = 1;
3675 events.ndi_event_defs = &pshot_test_events[7];
3676 rval = ndi_event_unbind_set(hdl, &events, NDI_SLEEP);
3677 cmn_err(CE_CONT, "pshot: ndi_event_unbind_set rval = %d\n", rval);
3678
3679 events.ndi_n_events = PSHOT_N_TEST_EVENTS;
3680 events.ndi_event_defs = pshot_test_events;
3681
3682 cmn_err(CE_CONT, "pshot: binding set of 8 events\n");
3683 delay(drv_sectohz(1));
3684 rval = ndi_event_bind_set(hdl, &events, NDI_SLEEP);
3685 cmn_err(CE_CONT, "pshot: ndi_event_bind_set rval = %d\n", rval);
3686
3687 cmn_err(CE_CONT, "pshot: adding 8 callbacks\n");
3688 delay(drv_sectohz(1));
3689 for (i = 0; i < 8; i++) {
3690 rval = ndi_event_add_callback(hdl, pshot->dip,
3691 ndi_event_tag_to_cookie(hdl,
3692 pshot_test_events[i].ndi_event_tag),
3693 pshot_event_cb_test,
3694 (void *)(uintptr_t)pshot_test_events[i].ndi_event_tag,
3695 NDI_SLEEP, &pshot->test_callback_cache[i]);
3696 ASSERT(rval == NDI_SUCCESS);
3697 }
3698
3699 cmn_err(CE_CONT, "pshot: event callbacks\n");
3700
3701 for (i = 10; i < 18; i++) {
3702 ddi_eventcookie_t cookie = ndi_event_tag_to_cookie(hdl, i);
3703
3704 rval = ndi_event_run_callbacks(hdl, pshot->dip, cookie,
3705 (void *)hdl);
3706
3707 cmn_err(CE_CONT, "pshot: callback, tag=%d rval=%d\n",
3708 i, rval);
3709 delay(drv_sectohz(1));
3710 }
3711
3712 cmn_err(CE_CONT, "pshot: redo event callbacks\n");
3713
3714 for (i = 10; i < 18; i++) {
3715 ddi_eventcookie_t cookie = ndi_event_tag_to_cookie(hdl, i);
3716
3717 rval = ndi_event_run_callbacks(hdl,
3718 pshot->dip, cookie, (void *)hdl);
3719
3720 cmn_err(CE_CONT, "pshot: callback, tag=%d rval=%d\n",
3721 i, rval);
3722 delay(drv_sectohz(1));
3723 }
3724
3725 cmn_err(CE_CONT, "pshot: removing 8 callbacks\n");
3726 delay(drv_sectohz(1));
3727
3728 for (i = 0; i < 8; i++) {
3729 (void) ndi_event_remove_callback(hdl,
3730 pshot->test_callback_cache[i]);
3731
3732 pshot->test_callback_cache[i] = 0;
3733 }
3734
3735 cmn_err(CE_CONT, "pshot: freeing handle with bound set\n");
3736 delay(drv_sectohz(1));
3737
3738 rval = ndi_event_free_hdl(hdl);
3739
3740 ASSERT(rval == NDI_SUCCESS);
3741
3742 }
3743
3744 void
3745 pshot_event_test_post_one(void *arg)
3746 {
3747 pshot_t *pshot = (pshot_t *)arg;
3748 int rval;
3749 ddi_eventcookie_t cookie;
3750
3751 cmn_err(CE_CONT, "pshot%d: pshot_event_post_one event\n",
3752 pshot->instance);
3753
3754 if (ddi_get_eventcookie(pshot->dip, PSHOT_EVENT_NAME_BUS_TEST_POST,
3755 &cookie) != DDI_SUCCESS) {
3756 cmn_err(CE_NOTE, "pshot_bus_test_post cookie not found");
|