661 }
662
663 rw_enter(&hdlp->ih_rwlock, RW_READER);
664
665 /* Do some input argument checking */
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);
670 return (DDI_EINVAL);
671 }
672
673 hdlp->ih_scratch1 = dup_inum;
674 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
675 DDI_INTROP_DUPVEC, hdlp, NULL);
676
677 if (ret == DDI_SUCCESS) {
678 dup_hdlp = (ddi_intr_handle_impl_t *)
679 kmem_alloc(sizeof (ddi_intr_handle_impl_t), KM_SLEEP);
680
681 atomic_add_32(&hdlp->ih_dup_cnt, 1);
682
683 *dup = (ddi_intr_handle_t)dup_hdlp;
684 bcopy(hdlp, dup_hdlp, sizeof (ddi_intr_handle_impl_t));
685
686 /* These fields are unique to each dupped msi-x vector */
687 rw_init(&dup_hdlp->ih_rwlock, NULL, RW_DRIVER, NULL);
688 dup_hdlp->ih_state = DDI_IHDL_STATE_ADDED;
689 dup_hdlp->ih_inum = dup_inum;
690 dup_hdlp->ih_flags |= DDI_INTR_MSIX_DUP;
691 dup_hdlp->ih_dup_cnt = 0;
692
693 /* Point back to original vector */
694 dup_hdlp->ih_main = hdlp;
695 }
696
697 rw_exit(&hdlp->ih_rwlock);
698 return (ret);
699 }
700
701 int
|
661 }
662
663 rw_enter(&hdlp->ih_rwlock, RW_READER);
664
665 /* Do some input argument checking */
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);
670 return (DDI_EINVAL);
671 }
672
673 hdlp->ih_scratch1 = dup_inum;
674 ret = i_ddi_intr_ops(hdlp->ih_dip, hdlp->ih_dip,
675 DDI_INTROP_DUPVEC, hdlp, NULL);
676
677 if (ret == DDI_SUCCESS) {
678 dup_hdlp = (ddi_intr_handle_impl_t *)
679 kmem_alloc(sizeof (ddi_intr_handle_impl_t), KM_SLEEP);
680
681 atomic_inc_32(&hdlp->ih_dup_cnt);
682
683 *dup = (ddi_intr_handle_t)dup_hdlp;
684 bcopy(hdlp, dup_hdlp, sizeof (ddi_intr_handle_impl_t));
685
686 /* These fields are unique to each dupped msi-x vector */
687 rw_init(&dup_hdlp->ih_rwlock, NULL, RW_DRIVER, NULL);
688 dup_hdlp->ih_state = DDI_IHDL_STATE_ADDED;
689 dup_hdlp->ih_inum = dup_inum;
690 dup_hdlp->ih_flags |= DDI_INTR_MSIX_DUP;
691 dup_hdlp->ih_dup_cnt = 0;
692
693 /* Point back to original vector */
694 dup_hdlp->ih_main = hdlp;
695 }
696
697 rw_exit(&hdlp->ih_rwlock);
698 return (ret);
699 }
700
701 int
|