Lines Matching refs:hdlp

154 	ddi_intr_handle_impl_t	*hdlp, tmp_hdl;
316 hdlp = (ddi_intr_handle_impl_t *)kmem_zalloc(
318 rw_init(&hdlp->ih_rwlock, NULL, RW_DRIVER, NULL);
319 h_array[i] = (struct __ddi_intr_handle *)hdlp;
320 hdlp->ih_type = type;
321 hdlp->ih_pri = pri;
322 hdlp->ih_cap = cap;
323 hdlp->ih_ver = DDI_INTR_VERSION;
324 hdlp->ih_state = DDI_IHDL_STATE_ALLOC;
325 hdlp->ih_dip = dip;
326 hdlp->ih_inum = i;
327 i_ddi_alloc_intr_phdl(hdlp);
329 i_ddi_set_intr_handle(dip, hdlp->ih_inum,
330 (ddi_intr_handle_t)hdlp);
332 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_alloc: hdlp = 0x%p\n",
349 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
352 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_free: hdlp = %p\n", (void *)hdlp));
354 if (hdlp == NULL)
357 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
358 if (((hdlp->ih_flags & DDI_INTR_MSIX_DUP) &&
359 (hdlp->ih_state != DDI_IHDL_STATE_ADDED)) ||
360 ((hdlp->ih_state != DDI_IHDL_STATE_ALLOC) &&
361 (!(hdlp->ih_flags & DDI_INTR_MSIX_DUP)))) {
362 rw_exit(&hdlp->ih_rwlock);
367 hdlp->ih_scratch1 = 1;
369 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
370 DDI_INTROP_FREE, hdlp, NULL);
372 rw_exit(&hdlp->ih_rwlock);
375 if (hdlp->ih_flags & DDI_INTR_MSIX_DUP)
376 atomic_dec_32(&hdlp->ih_main->ih_dup_cnt);
380 n = i_ddi_intr_get_current_nintrs(hdlp->ih_dip) - 1;
381 curr_type = i_ddi_intr_get_current_type(hdlp->ih_dip);
383 i_ddi_intr_set_current_nintrs(hdlp->ih_dip, n);
385 if ((i_ddi_irm_supported(hdlp->ih_dip, curr_type)
387 (void) i_ddi_irm_modify(hdlp->ih_dip, n);
389 if (hdlp->ih_type & DDI_INTR_TYPE_FIXED)
390 i_ddi_set_intr_handle(hdlp->ih_dip,
391 hdlp->ih_inum, NULL);
393 i_ddi_intr_devi_fini(hdlp->ih_dip);
394 i_ddi_free_intr_phdl(hdlp);
396 rw_destroy(&hdlp->ih_rwlock);
397 kmem_free(hdlp, sizeof (ddi_intr_handle_impl_t));
444 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
447 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_get_cap: hdlp = %p\n",
448 (void *)hdlp));
451 if (hdlp == NULL)
454 rw_enter(&hdlp->ih_rwlock, RW_READER);
456 if (hdlp->ih_cap) {
457 *flagsp = hdlp->ih_cap & ~DDI_INTR_FLAG_MSI64;
458 rw_exit(&hdlp->ih_rwlock);
462 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
463 DDI_INTROP_GETCAP, hdlp, (void *)flagsp);
466 hdlp->ih_cap = *flagsp;
472 rw_exit(&hdlp->ih_rwlock);
479 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
482 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_set_cap: hdlp = %p", (void *)hdlp));
484 if (hdlp == NULL)
487 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
488 if (hdlp->ih_state != DDI_IHDL_STATE_ALLOC) {
489 rw_exit(&hdlp->ih_rwlock);
496 "can be set\n", ddi_driver_name(hdlp->ih_dip),
497 ddi_get_instance(hdlp->ih_dip)));
498 rw_exit(&hdlp->ih_rwlock);
503 if (!(hdlp->ih_cap & (DDI_INTR_FLAG_EDGE | DDI_INTR_FLAG_LEVEL))) {
505 " must be supported\n", ddi_driver_name(hdlp->ih_dip),
506 ddi_get_instance(hdlp->ih_dip)));
507 rw_exit(&hdlp->ih_rwlock);
511 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
512 DDI_INTROP_SETCAP, hdlp, &flags);
514 rw_exit(&hdlp->ih_rwlock);
537 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
540 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_get_pri: hdlp = %p\n",
541 (void *)hdlp));
544 if (hdlp == NULL)
547 rw_enter(&hdlp->ih_rwlock, RW_READER);
549 if (hdlp->ih_pri) {
550 *prip = hdlp->ih_pri;
551 rw_exit(&hdlp->ih_rwlock);
555 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
556 DDI_INTROP_GETPRI, hdlp, (void *)prip);
559 hdlp->ih_pri = *prip;
561 rw_exit(&hdlp->ih_rwlock);
568 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
571 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_set_pri: hdlp = %p", (void *)hdlp));
573 if (hdlp == NULL)
583 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
584 if (hdlp->ih_state != DDI_IHDL_STATE_ALLOC) {
585 rw_exit(&hdlp->ih_rwlock);
590 if (pri == hdlp->ih_pri) {
591 rw_exit(&hdlp->ih_rwlock);
595 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
596 DDI_INTROP_SETPRI, hdlp, &pri);
599 hdlp->ih_pri = pri;
601 rw_exit(&hdlp->ih_rwlock);
612 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
615 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_add_handler: hdlp = 0x%p\n",
616 (void *)hdlp));
618 if ((hdlp == NULL) || (inthandler == NULL))
621 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
622 if (hdlp->ih_state != DDI_IHDL_STATE_ALLOC) {
623 rw_exit(&hdlp->ih_rwlock);
627 hdlp->ih_cb_func = inthandler;
628 hdlp->ih_cb_arg1 = arg1;
629 hdlp->ih_cb_arg2 = arg2;
631 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
632 DDI_INTROP_ADDISR, hdlp, NULL);
635 hdlp->ih_cb_func = NULL;
636 hdlp->ih_cb_arg1 = NULL;
637 hdlp->ih_cb_arg2 = NULL;
639 hdlp->ih_state = DDI_IHDL_STATE_ADDED;
641 rw_exit(&hdlp->ih_rwlock);
649 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)org;
653 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_dup_handler: hdlp = 0x%p\n",
654 (void *)hdlp));
657 if ((hdlp == NULL) || (*dup != NULL) || (dup_inum < 0)) {
663 rw_enter(&hdlp->ih_rwlock, RW_READER);
666 if ((hdlp->ih_state == DDI_IHDL_STATE_ALLOC) || /* intr handle alloc? */
667 (hdlp->ih_type != DDI_INTR_TYPE_MSIX) || /* only MSI-X allowed */
668 (hdlp->ih_flags & DDI_INTR_MSIX_DUP)) { /* only dup original */
669 rw_exit(&hdlp->ih_rwlock);
673 hdlp->ih_scratch1 = dup_inum;
674 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
675 DDI_INTROP_DUPVEC, hdlp, NULL);
681 atomic_inc_32(&hdlp->ih_dup_cnt);
684 bcopy(hdlp, dup_hdlp, sizeof (ddi_intr_handle_impl_t));
694 dup_hdlp->ih_main = hdlp;
697 rw_exit(&hdlp->ih_rwlock);
704 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
707 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_remove_handler: hdlp = %p\n",
708 (void *)hdlp));
710 if (hdlp == NULL)
713 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
715 if (hdlp->ih_state != DDI_IHDL_STATE_ADDED) {
718 } else if (hdlp->ih_flags & DDI_INTR_MSIX_DUP)
721 ASSERT(hdlp->ih_dup_cnt == 0);
722 if (hdlp->ih_dup_cnt > 0) {
724 "dup_cnt %d is not 0\n", hdlp->ih_dup_cnt));
729 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
730 DDI_INTROP_REMISR, hdlp, NULL);
733 hdlp->ih_state = DDI_IHDL_STATE_ALLOC;
734 hdlp->ih_cb_func = NULL;
735 hdlp->ih_cb_arg1 = NULL;
736 hdlp->ih_cb_arg2 = NULL;
740 rw_exit(&hdlp->ih_rwlock);
751 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
754 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_enable: hdlp = %p\n",
755 (void *)hdlp));
757 if (hdlp == NULL)
760 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
761 if ((hdlp->ih_state != DDI_IHDL_STATE_ADDED) ||
762 ((hdlp->ih_type == DDI_INTR_TYPE_MSI) &&
763 (hdlp->ih_cap & DDI_INTR_FLAG_BLOCK))) {
764 rw_exit(&hdlp->ih_rwlock);
768 I_DDI_VERIFY_MSIX_HANDLE(hdlp);
770 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
771 DDI_INTROP_ENABLE, hdlp, NULL);
774 hdlp->ih_state = DDI_IHDL_STATE_ENABLE;
775 i_ddi_intr_set_current_nenables(hdlp->ih_dip,
776 i_ddi_intr_get_current_nenables(hdlp->ih_dip) + 1);
779 rw_exit(&hdlp->ih_rwlock);
786 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
789 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_disable: hdlp = %p\n",
790 (void *)hdlp));
792 if (hdlp == NULL)
795 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
796 if ((hdlp->ih_state != DDI_IHDL_STATE_ENABLE) ||
797 ((hdlp->ih_type == DDI_INTR_TYPE_MSI) &&
798 (hdlp->ih_cap & DDI_INTR_FLAG_BLOCK))) {
799 rw_exit(&hdlp->ih_rwlock);
803 I_DDI_VERIFY_MSIX_HANDLE(hdlp);
805 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
806 DDI_INTROP_DISABLE, hdlp, NULL);
809 hdlp->ih_state = DDI_IHDL_STATE_ADDED;
810 i_ddi_intr_set_current_nenables(hdlp->ih_dip,
811 i_ddi_intr_get_current_nenables(hdlp->ih_dip) - 1);
814 rw_exit(&hdlp->ih_rwlock);
821 ddi_intr_handle_impl_t *hdlp;
831 hdlp = (ddi_intr_handle_impl_t *)h_array[i];
832 rw_enter(&hdlp->ih_rwlock, RW_READER);
834 if (hdlp->ih_state != DDI_IHDL_STATE_ADDED ||
835 hdlp->ih_type != DDI_INTR_TYPE_MSI ||
836 !(hdlp->ih_cap & DDI_INTR_FLAG_BLOCK)) {
837 rw_exit(&hdlp->ih_rwlock);
840 rw_exit(&hdlp->ih_rwlock);
843 hdlp = (ddi_intr_handle_impl_t *)h_array[0];
844 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
845 hdlp->ih_scratch1 = count;
846 hdlp->ih_scratch2 = (void *)h_array;
848 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
849 DDI_INTROP_BLOCKENABLE, hdlp, NULL);
851 rw_exit(&hdlp->ih_rwlock);
855 hdlp = (ddi_intr_handle_impl_t *)h_array[i];
856 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
857 hdlp->ih_state = DDI_IHDL_STATE_ENABLE;
858 rw_exit(&hdlp->ih_rwlock);
860 i_ddi_intr_set_current_nenables(hdlp->ih_dip, 1);
869 ddi_intr_handle_impl_t *hdlp;
879 hdlp = (ddi_intr_handle_impl_t *)h_array[i];
880 rw_enter(&hdlp->ih_rwlock, RW_READER);
881 if (hdlp->ih_state != DDI_IHDL_STATE_ENABLE ||
882 hdlp->ih_type != DDI_INTR_TYPE_MSI ||
883 !(hdlp->ih_cap & DDI_INTR_FLAG_BLOCK)) {
884 rw_exit(&hdlp->ih_rwlock);
887 rw_exit(&hdlp->ih_rwlock);
890 hdlp = (ddi_intr_handle_impl_t *)h_array[0];
891 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
892 hdlp->ih_scratch1 = count;
893 hdlp->ih_scratch2 = (void *)h_array;
895 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
896 DDI_INTROP_BLOCKDISABLE, hdlp, NULL);
898 rw_exit(&hdlp->ih_rwlock);
902 hdlp = (ddi_intr_handle_impl_t *)h_array[i];
903 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
904 hdlp->ih_state = DDI_IHDL_STATE_ADDED;
905 rw_exit(&hdlp->ih_rwlock);
907 i_ddi_intr_set_current_nenables(hdlp->ih_dip, 0);
919 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
922 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_set_mask: hdlp = %p\n",
923 (void *)hdlp));
925 if (hdlp == NULL)
928 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
929 if ((hdlp->ih_state != DDI_IHDL_STATE_ENABLE) ||
930 (!(hdlp->ih_cap & DDI_INTR_FLAG_MASKABLE))) {
931 rw_exit(&hdlp->ih_rwlock);
935 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
936 DDI_INTROP_SETMASK, hdlp, NULL);
938 rw_exit(&hdlp->ih_rwlock);
945 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
948 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_clr_mask: hdlp = %p\n",
949 (void *)hdlp));
951 if (hdlp == NULL)
954 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
955 if ((hdlp->ih_state != DDI_IHDL_STATE_ENABLE) ||
956 (!(hdlp->ih_cap & DDI_INTR_FLAG_MASKABLE))) {
957 rw_exit(&hdlp->ih_rwlock);
961 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
962 DDI_INTROP_CLRMASK, hdlp, NULL);
964 rw_exit(&hdlp->ih_rwlock);
974 ddi_intr_handle_impl_t *hdlp = (ddi_intr_handle_impl_t *)h;
977 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_get_pending: hdlp = %p\n",
978 (void *)hdlp));
980 if (hdlp == NULL)
983 rw_enter(&hdlp->ih_rwlock, RW_READER);
984 if (!(hdlp->ih_cap & DDI_INTR_FLAG_PENDING)) {
985 rw_exit(&hdlp->ih_rwlock);
989 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
990 DDI_INTROP_GETPENDING, hdlp, (void *)pendingp);
992 rw_exit(&hdlp->ih_rwlock);
1041 ddi_softint_hdl_impl_t *hdlp;
1062 hdlp = (ddi_softint_hdl_impl_t *)kmem_zalloc(
1066 rw_init(&hdlp->ih_rwlock, NULL, RW_DRIVER, NULL);
1067 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
1068 hdlp->ih_pri = soft_pri;
1069 hdlp->ih_dip = dip;
1070 hdlp->ih_cb_func = handler;
1071 hdlp->ih_cb_arg1 = arg1;
1072 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_add_softint: hdlp = %p\n",
1073 (void *)hdlp));
1076 if ((ret = i_ddi_add_softint(hdlp)) != DDI_SUCCESS) {
1077 rw_exit(&hdlp->ih_rwlock);
1078 rw_destroy(&hdlp->ih_rwlock);
1079 kmem_free(hdlp, sizeof (ddi_softint_hdl_impl_t));
1083 *h_p = (ddi_softint_handle_t)hdlp;
1084 rw_exit(&hdlp->ih_rwlock);
1094 ddi_softint_hdl_impl_t *hdlp = (ddi_softint_hdl_impl_t *)h;
1096 DDI_INTR_APIDBG((CE_CONT, "ddi_intr_remove_softint: hdlp = %p\n",
1097 (void *)hdlp));
1099 if (hdlp == NULL)
1102 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
1103 i_ddi_remove_softint(hdlp);
1104 rw_exit(&hdlp->ih_rwlock);
1105 rw_destroy(&hdlp->ih_rwlock);
1108 kmem_free(hdlp, sizeof (ddi_softint_hdl_impl_t));
1118 ddi_softint_hdl_impl_t *hdlp = (ddi_softint_hdl_impl_t *)h;
1121 if (hdlp == NULL)
1124 if ((ret = i_ddi_trigger_softint(hdlp, arg2)) != DDI_SUCCESS) {
1131 hdlp->ih_cb_arg2 = arg2;
1141 ddi_softint_hdl_impl_t *hdlp = (ddi_softint_hdl_impl_t *)h;
1146 if (hdlp == NULL)
1149 rw_enter(&hdlp->ih_rwlock, RW_READER);
1150 *soft_prip = hdlp->ih_pri;
1151 rw_exit(&hdlp->ih_rwlock);
1161 ddi_softint_hdl_impl_t *hdlp = (ddi_softint_hdl_impl_t *)h;
1168 if (hdlp == NULL)
1179 rw_enter(&hdlp->ih_rwlock, RW_WRITER);
1180 orig_soft_pri = hdlp->ih_pri;
1181 hdlp->ih_pri = soft_pri;
1183 if ((ret = i_ddi_set_softint_pri(hdlp, orig_soft_pri)) != DDI_SUCCESS) {
1186 hdlp->ih_pri = orig_soft_pri;
1189 rw_exit(&hdlp->ih_rwlock);
1549 "ddi_intr_trigger_softint failed, hdlp 0x%p "