Print this page
XXXX introduce drv_sectohz


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");