Lines Matching refs:link

535 	viona_link_t *link;  in viona_ioctl()  local
555 if ((link = ss->ss_link) == NULL || link->l_destroyed || in viona_ioctl()
556 vmm_drv_release_reqd(link->l_vm_hold)) { in viona_ioctl()
563 val = VIONA_S_HOSTCAPS | link->l_features_hw; in viona_ioctl()
573 val &= (VIONA_S_HOSTCAPS | link->l_features_hw); in viona_ioctl()
581 link->l_features = val; in viona_ioctl()
584 err = viona_ioc_ring_init(link, dptr, md); in viona_ioctl()
587 err = viona_ioc_ring_reset(link, (uint_t)data); in viona_ioctl()
590 err = viona_ioc_ring_kick(link, (uint_t)data); in viona_ioctl()
593 err = viona_ioc_ring_set_msi(link, dptr, md); in viona_ioctl()
596 err = viona_ioc_ring_intr_clear(link, (uint_t)data); in viona_ioctl()
599 err = viona_ioc_ring_set_state(link, dptr, md); in viona_ioctl()
602 err = viona_ioc_ring_get_state(link, dptr, md); in viona_ioctl()
605 err = viona_ioc_ring_pause(link, (uint_t)data); in viona_ioctl()
609 err = viona_ioc_intr_poll(link, dptr, md, rv); in viona_ioctl()
616 err = viona_ioc_set_notify_ioport(link, (uint16_t)data); in viona_ioctl()
619 err = viona_ioc_set_promisc(link, (viona_promisc_t)data); in viona_ioctl()
635 viona_link_t *link; in viona_chpoll() local
643 if ((link = ss->ss_link) == NULL || link->l_destroyed) { in viona_chpoll()
651 if (link->l_vrings[i].vr_intr_enabled != 0) { in viona_chpoll()
658 *phpp = &link->l_pollhead; in viona_chpoll()
666 viona_get_mac_capab(viona_link_t *link) in viona_get_mac_capab() argument
668 mac_handle_t mh = link->l_mh; in viona_get_mac_capab()
672 link->l_features_hw = 0; in viona_get_mac_capab()
679 link->l_features_hw |= VIRTIO_NET_F_CSUM; in viona_get_mac_capab()
681 link->l_cap_csum = cap; in viona_get_mac_capab()
684 if ((link->l_features_hw & VIRTIO_NET_F_CSUM) && in viona_get_mac_capab()
694 link->l_features_hw |= VIRTIO_NET_F_HOST_TSO4; in viona_get_mac_capab()
702 viona_link_t *link = NULL; in viona_ioc_create() local
745 link = kmem_zalloc(sizeof (viona_link_t), KM_SLEEP); in viona_ioc_create()
746 link->l_linkid = kvc.c_linkid; in viona_ioc_create()
747 link->l_vm_hold = hold; in viona_ioc_create()
749 err = mac_open_by_linkid(link->l_linkid, &link->l_mh); in viona_ioc_create()
754 viona_get_mac_capab(link); in viona_ioc_create()
757 link->l_linkid); in viona_ioc_create()
758 err = mac_client_open(link->l_mh, &link->l_mch, cli_name, 0); in viona_ioc_create()
763 err = mac_unicast_add(link->l_mch, NULL, MAC_UNICAST_PRIMARY, in viona_ioc_create()
764 &link->l_muh, VLAN_ID_NONE, &mac_diag); in viona_ioc_create()
769 viona_ring_alloc(link, &link->l_vrings[VIONA_VQ_RX]); in viona_ioc_create()
770 viona_ring_alloc(link, &link->l_vrings[VIONA_VQ_TX]); in viona_ioc_create()
778 link->l_promisc = VIONA_PROMISC_MULTI; in viona_ioc_create()
779 if ((err = viona_rx_set(link, link->l_promisc)) != 0) { in viona_ioc_create()
780 viona_rx_clear(link); in viona_ioc_create()
781 viona_ring_free(&link->l_vrings[VIONA_VQ_RX]); in viona_ioc_create()
782 viona_ring_free(&link->l_vrings[VIONA_VQ_TX]); in viona_ioc_create()
786 link->l_neti = nip; in viona_ioc_create()
787 ss->ss_link = link; in viona_ioc_create()
797 if (link != NULL) { in viona_ioc_create()
798 if (link->l_mch != NULL) { in viona_ioc_create()
799 if (link->l_muh != NULL) { in viona_ioc_create()
800 VERIFY0(mac_unicast_remove(link->l_mch, in viona_ioc_create()
801 link->l_muh)); in viona_ioc_create()
802 link->l_muh = NULL; in viona_ioc_create()
804 mac_client_close(link->l_mch, 0); in viona_ioc_create()
806 if (link->l_mh != NULL) { in viona_ioc_create()
807 mac_close(link->l_mh); in viona_ioc_create()
809 kmem_free(link, sizeof (viona_link_t)); in viona_ioc_create()
823 viona_link_t *link; in viona_ioc_delete() local
827 if ((link = ss->ss_link) == NULL) { in viona_ioc_delete()
833 if (link->l_destroyed) { in viona_ioc_delete()
848 link->l_destroyed = B_TRUE; in viona_ioc_delete()
854 VERIFY0(viona_ioc_set_notify_ioport(link, 0)); in viona_ioc_delete()
861 VERIFY0(viona_ring_reset(&link->l_vrings[VIONA_VQ_RX], B_FALSE)); in viona_ioc_delete()
862 VERIFY0(viona_ring_reset(&link->l_vrings[VIONA_VQ_TX], B_FALSE)); in viona_ioc_delete()
865 if (link->l_mch != NULL) { in viona_ioc_delete()
867 viona_rx_clear(link); in viona_ioc_delete()
868 if (link->l_muh != NULL) { in viona_ioc_delete()
869 VERIFY0(mac_unicast_remove(link->l_mch, link->l_muh)); in viona_ioc_delete()
870 link->l_muh = NULL; in viona_ioc_delete()
872 mac_client_close(link->l_mch, 0); in viona_ioc_delete()
874 if (link->l_mh != NULL) { in viona_ioc_delete()
875 mac_close(link->l_mh); in viona_ioc_delete()
877 if (link->l_vm_hold != NULL) { in viona_ioc_delete()
878 vmm_drv_rele(link->l_vm_hold); in viona_ioc_delete()
879 link->l_vm_hold = NULL; in viona_ioc_delete()
882 nip = link->l_neti; in viona_ioc_delete()
883 link->l_neti = NULL; in viona_ioc_delete()
885 viona_ring_free(&link->l_vrings[VIONA_VQ_RX]); in viona_ioc_delete()
886 viona_ring_free(&link->l_vrings[VIONA_VQ_TX]); in viona_ioc_delete()
887 pollhead_clean(&link->l_pollhead); in viona_ioc_delete()
897 kmem_free(link, sizeof (viona_link_t)); in viona_ioc_delete()
902 viona_ioc_ring_init(viona_link_t *link, void *udata, int md) in viona_ioc_ring_init() argument
917 err = viona_ring_init(link, kri.ri_index, &params); in viona_ioc_ring_init()
923 viona_ioc_ring_set_state(viona_link_t *link, void *udata, int md) in viona_ioc_ring_set_state() argument
938 err = viona_ring_init(link, krs.vrs_index, &params); in viona_ioc_ring_set_state()
944 viona_ioc_ring_get_state(viona_link_t *link, void *udata, int md) in viona_ioc_ring_get_state() argument
953 int err = viona_ring_get_state(link, krs.vrs_index, &params); in viona_ioc_ring_get_state()
969 viona_ioc_ring_reset(viona_link_t *link, uint_t idx) in viona_ioc_ring_reset() argument
976 ring = &link->l_vrings[idx]; in viona_ioc_ring_reset()
982 viona_ioc_ring_kick(viona_link_t *link, uint_t idx) in viona_ioc_ring_kick() argument
990 ring = &link->l_vrings[idx]; in viona_ioc_ring_kick()
1018 viona_ioc_ring_pause(viona_link_t *link, uint_t idx) in viona_ioc_ring_pause() argument
1024 viona_vring_t *ring = &link->l_vrings[idx]; in viona_ioc_ring_pause()
1029 viona_ioc_ring_set_msi(viona_link_t *link, void *data, int md) in viona_ioc_ring_set_msi() argument
1041 ring = &link->l_vrings[vrm.rm_index]; in viona_ioc_ring_set_msi()
1054 viona_link_t *link = (viona_link_t *)arg; in viona_notify_iop() local
1060 if (in || port != link->l_notify_ioport) { in viona_notify_iop()
1070 viona_vring_t *ring = &link->l_vrings[vq]; in viona_notify_iop()
1085 viona_ioc_set_notify_ioport(viona_link_t *link, uint16_t ioport) in viona_ioc_set_notify_ioport() argument
1089 if (link->l_notify_ioport != 0) { in viona_ioc_set_notify_ioport()
1090 vmm_drv_ioport_unhook(link->l_vm_hold, &link->l_notify_cookie); in viona_ioc_set_notify_ioport()
1091 link->l_notify_ioport = 0; in viona_ioc_set_notify_ioport()
1095 err = vmm_drv_ioport_hook(link->l_vm_hold, ioport, in viona_ioc_set_notify_ioport()
1096 viona_notify_iop, (void *)link, &link->l_notify_cookie); in viona_ioc_set_notify_ioport()
1098 link->l_notify_ioport = ioport; in viona_ioc_set_notify_ioport()
1105 viona_ioc_set_promisc(viona_link_t *link, viona_promisc_t mode) in viona_ioc_set_promisc() argument
1113 if (mode == link->l_promisc) { in viona_ioc_set_promisc()
1117 if ((err = viona_rx_set(link, mode)) != 0) { in viona_ioc_set_promisc()
1121 link->l_promisc = mode; in viona_ioc_set_promisc()
1126 viona_ioc_ring_intr_clear(viona_link_t *link, uint_t idx) in viona_ioc_ring_intr_clear() argument
1132 link->l_vrings[idx].vr_intr_enabled = 0; in viona_ioc_ring_intr_clear()
1137 viona_ioc_intr_poll(viona_link_t *link, void *udata, int md, int *rv) in viona_ioc_intr_poll() argument
1143 uint_t val = link->l_vrings[i].vr_intr_enabled; in viona_ioc_intr_poll()