Lines Matching +full:tx +full:- +full:device
29 * in software; cnex is the nexus for channel-devices. They use
104 * they are removed in converse order--compared to the order they
108 * Channel interrupt weights affect interrupt-CPU distribution
127 * 0x8 - Errors
128 * 0x4 - Warnings
129 * 0x2 - All debug messages
130 * 0x1 - Minimal debug messages
254 "sun4v channel-devices nexus",
330 mutex_enter(&cnex_ssp->clist_lock); in cnex_intr_redist()
332 cldcp = cnex_ssp->clist; in cnex_intr_redist()
335 mutex_enter(&cldcp->lock); in cnex_intr_redist()
337 if (cldcp->tx.hdlr && (cldcp->tx.weight == weight || in cnex_intr_redist()
338 (weight_max == weight && cldcp->tx.weight > weight))) { in cnex_intr_redist()
339 (void) cnex_intr_new_cpu(cnex_ssp, &cldcp->tx); in cnex_intr_redist()
342 if (cldcp->rx.hdlr && (cldcp->rx.weight == weight || in cnex_intr_redist()
343 (weight_max == weight && cldcp->rx.weight > weight))) { in cnex_intr_redist()
344 (void) cnex_intr_new_cpu(cnex_ssp, &cldcp->rx); in cnex_intr_redist()
347 mutex_exit(&cldcp->lock); in cnex_intr_redist()
350 cldcp = cldcp->next; in cnex_intr_redist()
353 mutex_exit(&cnex_ssp->clist_lock); in cnex_intr_redist()
367 rv = hvldc_intr_getvalid(ssp->cfghdl, iinfo->ino, &intr_state); in cnex_intr_new_cpu()
370 iinfo->ino); in cnex_intr_new_cpu()
383 iinfo->cpuid = intr_dist_cpuid(); in cnex_intr_new_cpu()
384 (void) hvldc_intr_settarget(ssp->cfghdl, iinfo->ino, iinfo->cpuid); in cnex_intr_new_cpu()
385 intr_dist_cpuid_add_device_weight(iinfo->cpuid, iinfo->dip, in cnex_intr_new_cpu()
386 iinfo->weight); in cnex_intr_new_cpu()
388 /* Re-enable the interrupt if it was enabled */ in cnex_intr_new_cpu()
390 (void) hvldc_intr_setvalid(ssp->cfghdl, iinfo->ino, in cnex_intr_new_cpu()
407 rv = hvldc_intr_setvalid(ssp->cfghdl, iinfo->ino, HV_INTR_NOTVALID); in cnex_intr_dis_wait()
410 iinfo->ino); in cnex_intr_dis_wait()
421 rv = hvldc_intr_getstate(ssp->cfghdl, iinfo->ino, &intr_state); in cnex_intr_dis_wait()
424 "state\n", iinfo->ino); in cnex_intr_dis_wait()
476 uint64_t rxino = (uint64_t)-1; in cnex_reg_chan()
477 uint64_t txino = (uint64_t)-1; in cnex_reg_chan()
482 /* Get device instance and structure */ in cnex_reg_chan()
487 mutex_enter(&cnex_ssp->clist_lock); in cnex_reg_chan()
488 cldcp = cnex_ssp->clist; in cnex_reg_chan()
490 if (cldcp->id == id) { in cnex_reg_chan()
492 mutex_exit(&cnex_ssp->clist_lock); in cnex_reg_chan()
495 cldcp = cldcp->next; in cnex_reg_chan()
497 mutex_exit(&cnex_ssp->clist_lock); in cnex_reg_chan()
499 /* Get the Tx/Rx inos from the MD */ in cnex_reg_chan()
514 md_find_name(mdp, "channel-endpoint"), in cnex_reg_chan()
536 /* Get the Tx and Rx ino */ in cnex_reg_chan()
537 status = md_get_prop_val(mdp, listp[idx], "tx-ino", &txino); in cnex_reg_chan()
539 DWARN("cnex_reg_chan: cannot read Tx ino\n"); in cnex_reg_chan()
544 status = md_get_prop_val(mdp, listp[idx], "rx-ino", &rxino); in cnex_reg_chan()
561 if ((rxino == -1) || (txino == -1)) { in cnex_reg_chan()
570 mutex_init(&new_cldcp->lock, NULL, MUTEX_DRIVER, NULL); in cnex_reg_chan()
572 new_cldcp->id = id; in cnex_reg_chan()
573 new_cldcp->tx.ino = txino; in cnex_reg_chan()
574 new_cldcp->rx.ino = rxino; in cnex_reg_chan()
575 new_cldcp->devclass = devclass; in cnex_reg_chan()
576 new_cldcp->tx.weight = CNEX_TX_INTR_WEIGHT; in cnex_reg_chan()
577 new_cldcp->rx.weight = cnex_class_weight(devclass); in cnex_reg_chan()
578 new_cldcp->dip = chan_dip; in cnex_reg_chan()
585 mutex_enter(&cnex_ssp->clist_lock); in cnex_reg_chan()
586 cldcp = cnex_ssp->clist; in cnex_reg_chan()
588 if (cldcp->id == id) { in cnex_reg_chan()
590 mutex_exit(&cnex_ssp->clist_lock); in cnex_reg_chan()
591 mutex_destroy(&new_cldcp->lock); in cnex_reg_chan()
595 cldcp = cldcp->next; in cnex_reg_chan()
597 new_cldcp->next = cnex_ssp->clist; in cnex_reg_chan()
598 cnex_ssp->clist = new_cldcp; in cnex_reg_chan()
599 mutex_exit(&cnex_ssp->clist_lock); in cnex_reg_chan()
605 * Add Tx/Rx interrupt handler for the channel
617 /* Get device instance and structure */ in cnex_add_intr()
622 mutex_enter(&cnex_ssp->clist_lock); in cnex_add_intr()
623 cldcp = cnex_ssp->clist; in cnex_add_intr()
625 if (cldcp->id == id) in cnex_add_intr()
627 cldcp = cldcp->next; in cnex_add_intr()
631 mutex_exit(&cnex_ssp->clist_lock); in cnex_add_intr()
634 mutex_exit(&cnex_ssp->clist_lock); in cnex_add_intr()
637 mutex_enter(&cldcp->lock); in cnex_add_intr()
641 iinfo = &(cldcp->tx); in cnex_add_intr()
643 iinfo = &(cldcp->rx); in cnex_add_intr()
646 mutex_exit(&cldcp->lock); in cnex_add_intr()
651 if (iinfo->hdlr != 0) { in cnex_add_intr()
653 mutex_exit(&cldcp->lock); in cnex_add_intr()
658 iinfo->hdlr = hdlr; in cnex_add_intr()
659 iinfo->arg1 = arg1; in cnex_add_intr()
660 iinfo->arg2 = arg2; in cnex_add_intr()
663 iinfo->dip = cldcp->dip; in cnex_add_intr()
664 iinfo->id = cldcp->id; in cnex_add_intr()
666 iinfo->icookie = MINVINTR_COOKIE + iinfo->ino; in cnex_add_intr()
673 if (iinfo->icookie >= MAXIVNUM || iinfo->icookie < MINVINTR_COOKIE) { in cnex_add_intr()
675 iinfo->icookie, iinfo->ino); in cnex_add_intr()
676 mutex_exit(&cldcp->lock); in cnex_add_intr()
681 "cookie=0x%llx\n", cnex_ssp->cfghdl, iinfo->ino, iinfo->icookie); in cnex_add_intr()
685 if (cldcp->devclass == cnex_class_to_intr[idx].devclass) { in cnex_add_intr()
692 if (add_ivintr(iinfo->icookie, pil, (intrfunc)cnex_intr_wrapper, in cnex_add_intr()
695 iinfo->icookie, iinfo->ino); in cnex_add_intr()
696 mutex_exit(&cldcp->lock); in cnex_add_intr()
701 rv = hvldc_intr_setcookie(cnex_ssp->cfghdl, iinfo->ino, iinfo->icookie); in cnex_add_intr()
704 iinfo->cpuid = intr_dist_cpuid(); in cnex_add_intr()
707 rv = hvldc_intr_settarget(cnex_ssp->cfghdl, iinfo->ino, iinfo->cpuid); in cnex_add_intr()
710 iinfo->ino); in cnex_add_intr()
713 rv = hvldc_intr_setstate(cnex_ssp->cfghdl, iinfo->ino, in cnex_add_intr()
717 iinfo->ino); in cnex_add_intr()
720 rv = hvldc_intr_setvalid(cnex_ssp->cfghdl, iinfo->ino, HV_INTR_VALID); in cnex_add_intr()
723 iinfo->ino); in cnex_add_intr()
727 intr_dist_cpuid_add_device_weight(iinfo->cpuid, iinfo->dip, in cnex_add_intr()
728 iinfo->weight); in cnex_add_intr()
730 mutex_exit(&cldcp->lock); in cnex_add_intr()
734 (void) rem_ivintr(iinfo->icookie, pil); in cnex_add_intr()
735 mutex_exit(&cldcp->lock); in cnex_add_intr()
751 /* Get device instance and structure */ in cnex_unreg_chan()
756 mutex_enter(&cnex_ssp->clist_lock); in cnex_unreg_chan()
758 cldcp = cnex_ssp->clist; in cnex_unreg_chan()
760 if (cldcp->id == id) in cnex_unreg_chan()
763 cldcp = cldcp->next; in cnex_unreg_chan()
768 mutex_exit(&cnex_ssp->clist_lock); in cnex_unreg_chan()
772 if (cldcp->tx.hdlr || cldcp->rx.hdlr) { in cnex_unreg_chan()
774 mutex_exit(&cnex_ssp->clist_lock); in cnex_unreg_chan()
779 prev_cldcp->next = cldcp->next; in cnex_unreg_chan()
781 cnex_ssp->clist = cldcp->next; in cnex_unreg_chan()
783 mutex_exit(&cnex_ssp->clist_lock); in cnex_unreg_chan()
786 mutex_destroy(&cldcp->lock); in cnex_unreg_chan()
795 * Remove Tx/Rx interrupt handler for the channel
806 /* Get device instance and structure */ in cnex_rem_intr()
811 mutex_enter(&cnex_ssp->clist_lock); in cnex_rem_intr()
812 cldcp = cnex_ssp->clist; in cnex_rem_intr()
814 if (cldcp->id == id) in cnex_rem_intr()
816 cldcp = cldcp->next; in cnex_rem_intr()
820 mutex_exit(&cnex_ssp->clist_lock); in cnex_rem_intr()
823 mutex_exit(&cnex_ssp->clist_lock); in cnex_rem_intr()
826 mutex_enter(&cldcp->lock); in cnex_rem_intr()
830 iinfo = &(cldcp->tx); in cnex_rem_intr()
832 iinfo = &(cldcp->rx); in cnex_rem_intr()
835 mutex_exit(&cldcp->lock); in cnex_rem_intr()
839 D1("cnex_rem_intr: interrupt ino=0x%x\n", iinfo->ino); in cnex_rem_intr()
842 if (iinfo->hdlr == 0) { in cnex_rem_intr()
844 mutex_exit(&cldcp->lock); in cnex_rem_intr()
848 D1("cnex_rem_intr: set intr to invalid ino=0x%x\n", iinfo->ino); in cnex_rem_intr()
849 rv = hvldc_intr_setvalid(cnex_ssp->cfghdl, in cnex_rem_intr()
850 iinfo->ino, HV_INTR_NOTVALID); in cnex_rem_intr()
852 DWARN("cnex_rem_intr: cannot set valid ino=%x\n", iinfo->ino); in cnex_rem_intr()
853 mutex_exit(&cldcp->lock); in cnex_rem_intr()
861 rv = hvldc_intr_getstate(cnex_ssp->cfghdl, iinfo->ino, &istate); in cnex_rem_intr()
864 iinfo->ino); in cnex_rem_intr()
865 mutex_exit(&cldcp->lock); in cnex_rem_intr()
872 iinfo->ino); in cnex_rem_intr()
873 mutex_exit(&cldcp->lock); in cnex_rem_intr()
879 if (cldcp->devclass == cnex_class_to_intr[idx].devclass) { in cnex_rem_intr()
885 intr_dist_cpuid_rem_device_weight(iinfo->cpuid, iinfo->dip); in cnex_rem_intr()
888 (void) rem_ivintr(iinfo->icookie, pil); in cnex_rem_intr()
893 mutex_exit(&cldcp->lock); in cnex_rem_intr()
900 * Clear pending Tx/Rx interrupt
911 /* Get device instance and structure */ in cnex_clr_intr()
916 mutex_enter(&cnex_ssp->clist_lock); in cnex_clr_intr()
917 cldcp = cnex_ssp->clist; in cnex_clr_intr()
919 if (cldcp->id == id) in cnex_clr_intr()
921 cldcp = cldcp->next; in cnex_clr_intr()
925 mutex_exit(&cnex_ssp->clist_lock); in cnex_clr_intr()
928 mutex_exit(&cnex_ssp->clist_lock); in cnex_clr_intr()
930 mutex_enter(&cldcp->lock); in cnex_clr_intr()
934 iinfo = &(cldcp->tx); in cnex_clr_intr()
936 iinfo = &(cldcp->rx); in cnex_clr_intr()
939 mutex_exit(&cldcp->lock); in cnex_clr_intr()
943 D1("%s: interrupt ino=0x%x\n", __func__, iinfo->ino); in cnex_clr_intr()
946 if (iinfo->hdlr == 0) { in cnex_clr_intr()
948 mutex_exit(&cldcp->lock); in cnex_clr_intr()
952 rv = hvldc_intr_setstate(cnex_ssp->cfghdl, iinfo->ino, in cnex_clr_intr()
956 mutex_exit(&cldcp->lock); in cnex_clr_intr()
960 mutex_exit(&cldcp->lock); in cnex_clr_intr()
979 handler = iinfo->hdlr; in cnex_intr_wrapper()
980 handler_arg1 = iinfo->arg1; in cnex_intr_wrapper()
981 handler_arg2 = iinfo->arg2; in cnex_intr_wrapper()
986 * help monitor the interrupts on a per device basis only. in cnex_intr_wrapper()
992 DTRACE_PROBE4(channelintr__start, uint64_t, iinfo->id, in cnex_intr_wrapper()
995 DTRACE_PROBE4(interrupt__start, dev_info_t, iinfo->dip, in cnex_intr_wrapper()
998 D1("cnex_intr_wrapper:ino=0x%llx invoke client handler\n", iinfo->ino); in cnex_intr_wrapper()
1001 DTRACE_PROBE4(interrupt__complete, dev_info_t, iinfo->dip, in cnex_intr_wrapper()
1004 DTRACE_PROBE4(channelintr__complete, uint64_t, iinfo->id, in cnex_intr_wrapper()
1037 cnex_ssp->devi = devi; in cnex_attach()
1038 cnex_ssp->clist = NULL; in cnex_attach()
1045 /* get the sun4v config handle for this device */ in cnex_attach()
1046 cnex_ssp->cfghdl = SUN4V_REG_SPEC2CFG_HDL(reg_p->physaddr); in cnex_attach()
1049 D1("cnex_attach: cfghdl=0x%llx\n", cnex_ssp->cfghdl); in cnex_attach()
1052 mutex_init(&cnex_ssp->clist_lock, NULL, MUTEX_DRIVER, NULL); in cnex_attach()
1070 mutex_destroy(&cnex_ssp->clist_lock); in cnex_attach()
1078 mutex_destroy(&cnex_ssp->clist_lock); in cnex_attach()
1110 if (cnex_ssp->clist) { in cnex_detach()
1124 mutex_destroy(&cnex_ssp->clist_lock); in cnex_detach()
1175 ASSERT(cnex_ssp->devi); in cnex_ioctl()
1176 return (ndi_devctl_ioctl(cnex_ssp->devi, cmd, arg, mode, 0)); in cnex_ioctl()
1191 cmn_err(CE_CONT, "?channel-device: %s%d\n", in cnex_ctl()
1218 ddi_driver_name(child), DEVI(child)->devi_instance)); in cnex_ctl()
1236 * by a channel-device driver. So we whine when we're called. in cnex_ctl()
1260 * cnex_find_chan_dip -- Find the dip of a device that is corresponding
1264 * - In the MD, the cfg-handle is expected to be unique for
1265 * virtual-device nodes that have the same 'name' property value.
1267 * of the corresponding OBP device node.
1269 * - The value of the 'name' property of a virtual-device node
1271 * OBP device node.
1273 * - Find the virtual-device node corresponding to a channel-endpoint
1275 * 'cfg-handle' properties.
1277 * - Walk all the children of the cnex, find a matching dip which
1280 * - The channels that have no corresponding device driver are
1283 * cnex acts as an umbrella device driver. Note, this is
1285 * the 'intrstat' shows cnex as the device that is servicing the
1289 * are used by the "domain-services".
1308 num_devs = md_scan_dag(mdp, mde, md_find_name(mdp, "virtual-device"), in cnex_find_chan_dip()
1313 "No virtual-device found\n", chan_id); in cnex_find_chan_dip()
1322 D1("cnex_find_chan_dip: channel(0x%llx): virtual-device " in cnex_find_chan_dip()
1325 if (md_get_prop_val(mdp, listp[0], "cfg-handle", &cfghdl) != 0) { in cnex_find_chan_dip()
1326 DWARN("cnex_find_chan_dip:channel(0x%llx): virtual-device's " in cnex_find_chan_dip()
1327 "cfg-handle property not found\n", chan_id); in cnex_find_chan_dip()
1331 D1("cnex_find_chan_dip:channel(0x%llx): virtual-device cfg-handle " in cnex_find_chan_dip()
1373 * If a virtual-device node exists but no dip found, in cnex_find_chan_dip()
1378 "No device found\n", chan_id); in cnex_find_chan_dip()
1381 /* If no dip was found, return cnex device's dip. */ in cnex_find_chan_dip()
1391 /* -------------------------------------------------------------------------- */