Lines Matching defs:mip

371  * when holding a reference on a link or when holding mip->mi_bridge_lock and
532 mac_impl_t *mip = buf;
536 mip->mi_linkstate = LINK_STATE_UNKNOWN;
538 rw_init(&mip->mi_rw_lock, NULL, RW_DRIVER, NULL);
539 mutex_init(&mip->mi_notify_lock, NULL, MUTEX_DRIVER, NULL);
540 mutex_init(&mip->mi_promisc_lock, NULL, MUTEX_DRIVER, NULL);
541 mutex_init(&mip->mi_ring_lock, NULL, MUTEX_DEFAULT, NULL);
543 mip->mi_notify_cb_info.mcbi_lockp = &mip->mi_notify_lock;
544 cv_init(&mip->mi_notify_cb_info.mcbi_cv, NULL, CV_DRIVER, NULL);
545 mip->mi_promisc_cb_info.mcbi_lockp = &mip->mi_promisc_lock;
546 cv_init(&mip->mi_promisc_cb_info.mcbi_cv, NULL, CV_DRIVER, NULL);
548 mutex_init(&mip->mi_bridge_lock, NULL, MUTEX_DEFAULT, NULL);
557 mac_impl_t *mip = buf;
560 ASSERT(mip->mi_ref == 0);
561 ASSERT(mip->mi_active == 0);
562 ASSERT(mip->mi_linkstate == LINK_STATE_UNKNOWN);
563 ASSERT(mip->mi_devpromisc == 0);
564 ASSERT(mip->mi_ksp == NULL);
565 ASSERT(mip->mi_kstat_count == 0);
566 ASSERT(mip->mi_nclients == 0);
567 ASSERT(mip->mi_nactiveclients == 0);
568 ASSERT(mip->mi_single_active_client == NULL);
569 ASSERT(mip->mi_state_flags == 0);
570 ASSERT(mip->mi_factory_addr == NULL);
571 ASSERT(mip->mi_factory_addr_num == 0);
572 ASSERT(mip->mi_default_tx_ring == NULL);
574 mcbi = &mip->mi_notify_cb_info;
576 ASSERT(mip->mi_notify_bits == 0);
577 ASSERT(mip->mi_notify_thread == NULL);
578 ASSERT(mcbi->mcbi_lockp == &mip->mi_notify_lock);
581 mcbi = &mip->mi_promisc_cb_info;
582 ASSERT(mcbi->mcbi_del_cnt == 0 && mip->mi_promisc_list == NULL);
583 ASSERT(mip->mi_promisc_list == NULL);
584 ASSERT(mcbi->mcbi_lockp == &mip->mi_promisc_lock);
587 ASSERT(mip->mi_bcast_ngrps == 0 && mip->mi_bcast_grp == NULL);
588 ASSERT(mip->mi_perim_owner == NULL && mip->mi_perim_ocnt == 0);
590 rw_destroy(&mip->mi_rw_lock);
592 mutex_destroy(&mip->mi_promisc_lock);
593 cv_destroy(&mip->mi_promisc_cb_info.mcbi_cv);
594 mutex_destroy(&mip->mi_notify_lock);
595 cv_destroy(&mip->mi_notify_cb_info.mcbi_cv);
596 mutex_destroy(&mip->mi_ring_lock);
598 ASSERT(mip->mi_bridge_link == NULL);
787 * The promisc callbacks are in 2 lists, one off the 'mip' and another off the
794 i_mac_promisc_walker_cleanup(mac_impl_t *mip)
806 rmlist = mac_callback_walker_cleanup(&mip->mi_promisc_cb_info,
807 &mip->mi_promisc_list);
812 VERIFY(mac_callback_remove(&mip->mi_promisc_cb_info,
821 i_mac_notify(mac_impl_t *mip, mac_notify_type_t type)
833 if (mip->mi_state_flags & MIS_DISABLED)
843 mcbi = &mip->mi_notify_cb_info;
845 mip->mi_notify_bits |= (1 << type);
858 i_mac_perim_enter(mac_impl_t *mip)
862 if (mip->mi_state_flags & MIS_IS_VNIC) {
867 mcip = mac_vnic_lower(mip);
868 mip = mcip->mci_mip;
871 mutex_enter(&mip->mi_perim_lock);
872 if (mip->mi_perim_owner == curthread) {
873 mip->mi_perim_ocnt++;
874 mutex_exit(&mip->mi_perim_lock);
878 while (mip->mi_perim_owner != NULL)
879 cv_wait(&mip->mi_perim_cv, &mip->mi_perim_lock);
881 mip->mi_perim_owner = curthread;
882 ASSERT(mip->mi_perim_ocnt == 0);
883 mip->mi_perim_ocnt++;
885 mip->mi_perim_stack_depth = getpcstack(mip->mi_perim_stack,
888 mutex_exit(&mip->mi_perim_lock);
892 i_mac_perim_enter_nowait(mac_impl_t *mip)
901 if (mip->mi_state_flags & MIS_IS_VNIC) {
902 i_mac_perim_enter(mip);
906 mutex_enter(&mip->mi_perim_lock);
907 if (mip->mi_perim_owner != NULL) {
908 mutex_exit(&mip->mi_perim_lock);
911 ASSERT(mip->mi_perim_ocnt == 0);
912 mip->mi_perim_owner = curthread;
913 mip->mi_perim_ocnt++;
914 mutex_exit(&mip->mi_perim_lock);
920 i_mac_perim_exit(mac_impl_t *mip)
924 if (mip->mi_state_flags & MIS_IS_VNIC) {
929 mcip = mac_vnic_lower(mip);
930 mip = mcip->mci_mip;
933 ASSERT(mip->mi_perim_owner == curthread && mip->mi_perim_ocnt != 0);
935 mutex_enter(&mip->mi_perim_lock);
936 if (--mip->mi_perim_ocnt == 0) {
937 mip->mi_perim_owner = NULL;
938 cv_signal(&mip->mi_perim_cv);
940 mutex_exit(&mip->mi_perim_lock);
950 mac_impl_t *mip = (mac_impl_t *)mh;
953 if (mip->mi_state_flags & MIS_IS_VNIC) {
958 mcip = mac_vnic_lower(mip);
959 mip = mcip->mci_mip;
961 return (mip->mi_perim_owner == curthread);
971 mac_impl_t *mip = (mac_impl_t *)mh;
973 i_mac_perim_enter(mip);
975 * The mac_perim_handle_t returned encodes the 'mip' and whether a
979 MAC_ENCODE_MPH(*mphp, mip, 0);
1013 mac_impl_t *mip;
1016 MAC_DECODE_MPH(mph, mip, need_close);
1017 i_mac_perim_exit(mip);
1019 mac_close((mac_handle_t)mip);
1025 mac_impl_t *mip;
1040 (mod_hash_val_t *)&mip);
1047 if (mip->mi_state_flags & MIS_DISABLED) {
1052 if (mip->mi_state_flags & MIS_EXCLUSIVE_HELD) {
1057 mip->mi_ref++;
1060 *pmip = mip;
1065 mac_rele(mac_impl_t *mip)
1068 ASSERT(mip->mi_ref != 0);
1069 if (--mip->mi_ref == 0) {
1070 ASSERT(mip->mi_nactiveclients == 0 &&
1071 !(mip->mi_state_flags & MIS_EXCLUSIVE));
1082 mac_impl_t *mip = (mac_impl_t *)mh;
1086 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1087 ASSERT(mip->mi_start != NULL);
1092 if (mip->mi_active++ == 0) {
1098 err = mip->mi_start(mip->mi_driver);
1100 mip->mi_active--;
1107 if (mip->mi_default_tx_ring != NULL) {
1109 ring = (mac_ring_t *)mip->mi_default_tx_ring;
1113 mip->mi_active--;
1119 if ((defgrp = MAC_DEFAULT_RX_GROUP(mip)) != NULL) {
1128 mip->mi_active--;
1147 mac_impl_t *mip = (mac_impl_t *)mh;
1150 ASSERT(mip->mi_stop != NULL);
1151 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1156 ASSERT(mip->mi_active != 0);
1157 if (--mip->mi_active == 0) {
1158 if ((grp = MAC_DEFAULT_RX_GROUP(mip)) != NULL) {
1174 mip->mi_nactiveclients == 0);
1179 if (mip->mi_default_tx_ring != NULL) {
1182 ring = (mac_ring_t *)mip->mi_default_tx_ring;
1192 mip->mi_stop(mip->mi_driver);
1197 i_mac_promisc_set(mac_impl_t *mip, boolean_t on)
1201 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1202 ASSERT(mip->mi_setpromisc != NULL);
1208 if (mip->mi_devpromisc++ == 0) {
1209 err = mip->mi_setpromisc(mip->mi_driver, B_TRUE);
1211 mip->mi_devpromisc--;
1214 i_mac_notify(mip, MAC_NOTE_DEVPROMISC);
1217 if (mip->mi_devpromisc == 0)
1224 if (--mip->mi_devpromisc == 0) {
1225 err = mip->mi_setpromisc(mip->mi_driver, B_FALSE);
1227 mip->mi_devpromisc++;
1230 i_mac_notify(mip, MAC_NOTE_DEVPROMISC);
1245 mac_impl_t *mip = (mac_impl_t *)mh;
1250 return (mip->mi_devpromisc != 0);
1262 mac_addr_factory_init(mac_impl_t *mip)
1272 if (!i_mac_capab_get((mac_handle_t)mip, MAC_CAPAB_MULTIFACTADDR,
1285 capab.mcm_getaddr(mip->mi_driver, capab.mcm_naddr, addr);
1287 mip->mi_factory_addr_num = capab.mcm_naddr;
1288 mip->mi_factory_addr = kmem_zalloc(mip->mi_factory_addr_num *
1293 mip->mi_factory_addr[i].mfa_addr,
1294 mip->mi_type->mt_addr_length);
1295 mip->mi_factory_addr[i].mfa_in_use = B_FALSE;
1302 mac_addr_factory_fini(mac_impl_t *mip)
1304 if (mip->mi_factory_addr == NULL) {
1305 ASSERT(mip->mi_factory_addr_num == 0);
1309 kmem_free(mip->mi_factory_addr, mip->mi_factory_addr_num *
1312 mip->mi_factory_addr = NULL;
1313 mip->mi_factory_addr_num = 0;
1330 mac_impl_t *mip = mcip->mci_mip;
1333 i_mac_perim_enter(mip);
1338 rw_enter(&mip->mi_rw_lock, RW_WRITER);
1340 if (mip->mi_factory_addr_num == 0) {
1347 if (*slot < 1 || *slot > mip->mi_factory_addr_num) {
1351 if (mip->mi_factory_addr[*slot-1].mfa_in_use) {
1357 for (i = 0; i < mip->mi_factory_addr_num; i++) {
1358 if (!mip->mi_factory_addr[i].mfa_in_use)
1362 if (i == mip->mi_factory_addr_num) {
1369 mip->mi_factory_addr[*slot-1].mfa_in_use = B_TRUE;
1370 mip->mi_factory_addr[*slot-1].mfa_client = mcip;
1373 rw_exit(&mip->mi_rw_lock);
1374 i_mac_perim_exit(mip);
1385 mac_impl_t *mip = mcip->mci_mip;
1387 i_mac_perim_enter(mip);
1392 rw_enter(&mip->mi_rw_lock, RW_WRITER);
1394 ASSERT(slot > 0 && slot <= mip->mi_factory_addr_num);
1395 ASSERT(mip->mi_factory_addr[slot-1].mfa_in_use);
1397 mip->mi_factory_addr[slot-1].mfa_in_use = B_FALSE;
1399 rw_exit(&mip->mi_rw_lock);
1400 i_mac_perim_exit(mip);
1412 mac_impl_t *mip = (mac_impl_t *)mh;
1415 ASSERT(slot > 0 && slot <= mip->mi_factory_addr_num);
1421 rw_enter(&mip->mi_rw_lock, RW_READER);
1422 bcopy(mip->mi_factory_addr[slot-1].mfa_addr, mac_addr, MAXMACADDRLEN);
1423 *addr_len = mip->mi_type->mt_addr_length;
1424 in_use = mip->mi_factory_addr[slot-1].mfa_in_use;
1426 bcopy(mip->mi_factory_addr[slot-1].mfa_client->mci_name,
1431 rw_exit(&mip->mi_rw_lock);
1442 mac_impl_t *mip = (mac_impl_t *)mh;
1444 return (mip->mi_factory_addr_num);
1682 mac_impl_t *mip = mcip->mci_mip;
1684 MAC_TX(mip, rh, mp, mcip);
1707 mac_impl_t *mip = (mac_impl_t *)mh;
1711 VERIFY(mip->mi_state_flags & MIS_IS_AGGR);
1716 mip->mi_default_tx_ring = rh;
2099 mac_impl_t *mip = mcip->mci_mip;
2103 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2123 mac_impl_t *mip = mcip->mci_mip;
2125 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2139 mac_impl_t *mip = mcip->mci_mip;
2141 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2329 mac_impl_t *mip = (mac_impl_t *)mh;
2331 return (((mip->mi_state_flags & MIS_LEGACY) != 0) ?
2332 mip->mi_capab_legacy.ml_unsup_note : 0);
2339 i_mac_disable(mac_impl_t *mip)
2344 if (mip->mi_state_flags & MIS_DISABLED) {
2356 if (mip->mi_ref > 0) {
2368 ASSERT(mip->mi_bcast_ngrps == 0);
2376 mcip = mac_primary_client_handle(mip);
2382 mip->mi_state_flags |= MIS_DISABLED;
2390 mac_impl_t *mip = (mac_impl_t *)mh;
2393 if ((err = i_mac_perim_enter_nowait(mip)) != 0)
2395 err = i_mac_disable(mip);
2396 i_mac_perim_exit(mip);
2403 mac_impl_t *mip = (mac_impl_t *)mh;
2406 i_mac_perim_enter(mip);
2407 err = i_mac_disable(mip);
2408 i_mac_perim_exit(mip);
2414 i_mac_notify_exit(mip);
2426 mac_rx_classify(mac_impl_t *mip, mac_resource_handle_t mrh, mblk_t *mp)
2442 if ((mip->mi_state_flags & MIS_EXCLUSIVE) != 0)
2445 err = mac_flow_lookup(mip->mi_flow_tab, mp, flags, &flent);
2476 mac_impl_t *mip = (mac_impl_t *)mh;
2491 if (mac_rx_classify(mip, mrh, bp1) != NULL) {
2510 i_mac_tx_srs_notify(mac_impl_t *mip, mac_ring_handle_t ring)
2519 * don't do anything. In any case the mip has to be valid. The driver
2525 if (mip->mi_state_flags & MIS_DISABLED) {
2533 rw_enter(&mip->mi_rw_lock, RW_READER);
2534 for (cclient = mip->mi_clients_list; cclient != NULL;
2554 rw_exit(&mip->mi_rw_lock);
2563 mac_impl_t *mip = (mac_impl_t *)mh;
2571 refresh = mip->mi_multicst;
2572 arg = mip->mi_driver;
2575 mac_bcast_refresh(mip, refresh, arg, add);
2582 mac_impl_t *mip = (mac_impl_t *)mh;
2589 refresh = mip->mi_setpromisc;
2590 arg = mip->mi_driver;
2597 refresh(arg, (mip->mi_devpromisc != 0));
2611 mac_impl_t *mip = (mac_impl_t *)mh;
2615 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2617 *marginp = mip->mi_margin;
2623 if (*marginp > mip->mi_margin) {
2632 for (pp = &mip->mi_mmrp; (p = *pp) != NULL; pp = &p->mmr_nextp) {
2653 rw_exit(&(mip->mi_rw_lock));
2664 mac_impl_t *mip = (mac_impl_t *)mh;
2668 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2672 for (pp = &(mip->mi_mmrp); (p = *pp) != NULL; pp = &(p->mmr_nextp)) {
2701 rw_exit(&(mip->mi_rw_lock));
2708 mac_impl_t *mip = (mac_impl_t *)mh;
2711 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2713 if (mip->mi_mmrp != NULL)
2714 margin_needed = mip->mi_mmrp->mmr_margin;
2717 mip->mi_margin = margin;
2719 rw_exit(&(mip->mi_rw_lock));
2722 i_mac_notify(mip, MAC_NOTE_MARGIN);
2740 mac_impl_t *mip = (mac_impl_t *)mh;
2745 i_mac_perim_enter(mip);
2746 rw_enter(&mip->mi_rw_lock, RW_WRITER);
2749 *mtup = mip->mi_sdu_max;
2753 rw_exit(&mip->mi_rw_lock);
2754 i_mac_perim_exit(mip);
2758 if (*mtup > mip->mi_sdu_max ||
2760 rw_exit(&mip->mi_rw_lock);
2761 i_mac_perim_exit(mip);
2766 for (cur = mip->mi_mtrp; cur != NULL; cur = cur->mtr_nextp) {
2769 rw_exit(&mip->mi_rw_lock);
2770 i_mac_perim_exit(mip);
2787 cur->mtr_nextp = mip->mi_mtrp;
2788 mip->mi_mtrp = cur;
2791 rw_exit(&mip->mi_rw_lock);
2792 i_mac_perim_exit(mip);
2799 mac_impl_t *mip = (mac_impl_t *)mh;
2802 i_mac_perim_enter(mip);
2803 rw_enter(&mip->mi_rw_lock, RW_WRITER);
2806 for (cur = mip->mi_mtrp; cur != NULL; cur = cur->mtr_nextp) {
2812 mip->mi_mtrp = cur->mtr_nextp;
2818 rw_exit(&mip->mi_rw_lock);
2819 i_mac_perim_exit(mip);
2826 rw_exit(&mip->mi_rw_lock);
2827 i_mac_perim_exit(mip);
3172 mac_impl_t *mip = (mac_impl_t *)mh;
3191 if (mip->mi_state_flags & MIS_IS_VNIC)
3210 (mip->mi_state_flags & MIS_IS_VNIC))
3216 mip->mi_llimit = learnval;
3218 mip->mi_ldecay = learnval;
3225 if (mip->mi_callbacks->mc_callbacks & MC_SETPROP) {
3226 err = mip->mi_callbacks->mc_setprop(mip->mi_driver,
3246 mac_impl_t *mip = (mac_impl_t *)mh;
3278 if (mip->mi_state_flags & MIS_IS_VNIC)
3286 if (mip->mi_state_flags & MIS_IS_VNIC)
3289 bcopy(&mip->mi_llimit, val, sizeof (mip->mi_llimit));
3291 bcopy(&mip->mi_ldecay, val, sizeof (mip->mi_ldecay));
3344 if (mip->mi_callbacks->mc_callbacks & MC_GETPROP) {
3345 err = mip->mi_callbacks->mc_getprop(mip->mi_driver, name, id,
3376 mac_impl_t *mip = (mac_impl_t *)mh;
3416 if ((mip->mi_state_flags & MIS_IS_VNIC) &&
3428 if (mip->mi_state_flags & MIS_IS_VNIC)
3430 mip = (mac_impl_t *)mh;
3432 mip->mi_rx_group_type == MAC_GROUP_TYPE_STATIC) ||
3434 mip->mi_tx_group_type == MAC_GROUP_TYPE_STATIC)) {
3499 if (mip->mi_callbacks->mc_callbacks & MC_PROPINFO) {
3527 mip->mi_callbacks->mc_propinfo(mip->mi_driver, name, id,
3566 if (mip->mi_info.mi_media == DL_ETHER)
3580 mac_impl_t *mip = (mac_impl_t *)mh;
3582 if ((mip->mi_state_flags & MIS_LEGACY) == 0)
3585 return (mip->mi_capab_legacy.ml_fastpath_disable(mip->mi_driver));
3591 mac_impl_t *mip = (mac_impl_t *)mh;
3593 if ((mip->mi_state_flags & MIS_LEGACY) == 0)
3596 mip->mi_capab_legacy.ml_fastpath_enable(mip->mi_driver);
3600 mac_register_priv_prop(mac_impl_t *mip, char **priv_props)
3614 mip->mi_priv_prop = kmem_zalloc(nprops * sizeof (char *), KM_SLEEP);
3617 mip->mi_priv_prop[i] = kmem_zalloc(MAXLINKPROPNAME, KM_SLEEP);
3618 (void) strlcpy(mip->mi_priv_prop[i], priv_props[i],
3622 mip->mi_priv_prop_count = nprops;
3626 mac_unregister_priv_prop(mac_impl_t *mip)
3630 if (mip->mi_priv_prop_count == 0) {
3631 ASSERT(mip->mi_priv_prop == NULL);
3635 for (i = 0; i < mip->mi_priv_prop_count; i++)
3636 kmem_free(mip->mi_priv_prop[i], MAXLINKPROPNAME);
3637 kmem_free(mip->mi_priv_prop, mip->mi_priv_prop_count *
3640 mip->mi_priv_prop = NULL;
3641 mip->mi_priv_prop_count = 0;
3655 mac_ring_alloc(mac_impl_t *mip)
3659 mutex_enter(&mip->mi_ring_lock);
3660 if (mip->mi_ring_freelist != NULL) {
3661 ring = mip->mi_ring_freelist;
3662 mip->mi_ring_freelist = ring->mr_next;
3664 mutex_exit(&mip->mi_ring_lock);
3666 mutex_exit(&mip->mi_ring_lock);
3674 mac_ring_free(mac_impl_t *mip, mac_ring_t *ring)
3678 mutex_enter(&mip->mi_ring_lock);
3681 ring->mr_next = mip->mi_ring_freelist;
3683 mip->mi_ring_freelist = ring;
3685 mutex_exit(&mip->mi_ring_lock);
3689 mac_ring_freeall(mac_impl_t *mip)
3692 mutex_enter(&mip->mi_ring_lock);
3693 mac_ring_t *ring = mip->mi_ring_freelist;
3699 mip->mi_ring_freelist = NULL;
3700 mutex_exit(&mip->mi_ring_lock);
3803 mac_init_ring(mac_impl_t *mip, mac_group_t *group, int index,
3810 ring = mac_ring_alloc(mip);
3835 cap_rings->mr_rget(mip->mi_driver, group->mrg_type, group->mrg_index,
3879 mac_compare_ddi_handle(mip->mi_rx_groups,
3880 mip->mi_rx_group_count, ring);
3893 ring->mr_mip = mip;
3904 mac_init_group(mac_impl_t *mip, mac_group_t *group, int size,
3914 (void) mac_init_ring(mip, group, index, cap_rings);
3918 mac_init_rings(mac_impl_t *mip, mac_ring_type_t rtype)
3934 ASSERT(mip->mi_rx_groups == NULL);
3936 cap_rings = &mip->mi_rx_rings_cap;
3940 ASSERT(mip->mi_tx_groups == NULL);
3942 cap_rings = &mip->mi_tx_rings_cap;
3949 if (!i_mac_capab_get((mac_handle_t)mip, MAC_CAPAB_RINGS, cap_rings))
3962 (mip->mi_state_flags & MIS_IS_AGGR) == 0) {
3989 group->mrg_mh = (mac_handle_t)mip;
4006 cap_rings->mr_gget(mip->mi_driver, rtype, g, &group_info,
4015 char *, mip->mi_name,
4034 char *, mip->mi_name);
4041 char *, mip->mi_name,
4054 char *, mip->mi_name,
4071 char *, mip->mi_name,
4098 mac_init_group(mip, group, group_info.mgi_count, cap_rings);
4112 group->mrg_mh = (mac_handle_t)mip;
4122 mac_init_group(mip, group, ring_left, cap_rings);
4141 mip->mi_rx_group_type = cap_rings->mr_group_type;
4142 mip->mi_rx_group_count = cap_rings->mr_gnum;
4143 mip->mi_rx_groups = groups;
4144 mip->mi_rx_donor_grp = groups;
4145 if (mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
4150 mip->mi_rxrings_avail =
4151 mip->mi_rx_groups->mrg_cur_count - 1;
4152 mip->mi_rxrings_rsvd = 1;
4158 mip->mi_rxhwclnt_avail = mip->mi_rx_group_count - 1;
4159 mip->mi_rxhwclnt_used = 1;
4162 mip->mi_tx_group_type = pseudo_txgrp ? MAC_GROUP_TYPE_DYNAMIC :
4164 mip->mi_tx_group_count = grpcnt;
4165 mip->mi_tx_group_free = group_free;
4166 mip->mi_tx_groups = groups;
4177 ASSERT(mip->mi_state_flags & MIS_IS_AGGR);
4182 cap_rings->mr_gget(mip->mi_driver, rtype, 0, NULL,
4198 mip->mi_default_tx_ring = (mac_ring_handle_t)ring;
4200 if (mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC)
4201 mip->mi_txrings_avail = group->mrg_cur_count - 1;
4205 mip->mi_txrings_rsvd = 1;
4210 mip->mi_txhwclnt_avail = mip->mi_tx_group_count;
4211 mip->mi_txhwclnt_used = 1;
4218 mac_free_rings(mip, rtype);
4265 mac_free_rings(mac_impl_t *mip, mac_ring_type_t rtype)
4272 if (mip->mi_rx_groups == NULL)
4275 groups = mip->mi_rx_groups;
4276 group_count = mip->mi_rx_group_count;
4278 mip->mi_rx_groups = NULL;
4279 mip->mi_rx_donor_grp = NULL;
4280 mip->mi_rx_group_count = 0;
4283 ASSERT(mip->mi_tx_group_count == mip->mi_tx_group_free);
4285 if (mip->mi_tx_groups == NULL)
4288 groups = mip->mi_tx_groups;
4289 group_count = mip->mi_tx_group_count;
4291 mip->mi_tx_groups = NULL;
4292 mip->mi_tx_group_count = 0;
4293 mip->mi_tx_group_free = 0;
4294 mip->mi_default_tx_ring = NULL;
4310 mac_ring_free(mip, ring);
4315 mac_ring_freeall(mip);
4360 mac_bridge_tx(mac_impl_t *mip, mac_ring_handle_t rh, mblk_t *mp)
4369 mutex_enter(&mip->mi_bridge_lock);
4370 if ((mh = mip->mi_bridge_link) != NULL)
4372 mutex_exit(&mip->mi_bridge_lock);
4374 MAC_RING_TX(mip, rh, mp, mp);
4410 mac_impl_t *mip = (mac_impl_t *)group->mrg_mh;
4417 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4421 cap_rings = &mip->mi_rx_rings_cap;
4422 group_type = mip->mi_rx_group_type;
4425 cap_rings = &mip->mi_tx_rings_cap;
4426 group_type = mip->mi_tx_group_type;
4446 ring = mac_init_ring(mip, group, index, cap_rings);
4512 mac_ring_free(mip, ring);
4614 if (mip->mi_state_flags & MIS_IS_AGGR &&
4615 mip->mi_default_tx_ring == NULL &&
4617 mip->mi_default_tx_ring = (mac_ring_handle_t)ring;
4634 mac_impl_t *mip = (mac_impl_t *)group->mrg_mh;
4638 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4649 group_type = mip->mi_rx_group_type;
4650 cap_rings = &mip->mi_rx_rings_cap;
4700 if (mip->mi_state_flags & MIS_IS_AGGR &&
4701 mip->mi_default_tx_ring ==
4704 mip->mi_default_tx_ring =
4732 ASSERT(ring != (mac_ring_t *)mip->mi_default_tx_ring);
4733 group_type = mip->mi_tx_group_type;
4734 cap_rings = &mip->mi_tx_rings_cap;
4742 defgrp = MAC_DEFAULT_TX_GROUP(mip);
4837 mac_ring_free(mip, ring);
4849 mac_group_mov_ring(mac_impl_t *mip, mac_group_t *d_group, mac_ring_t *ring)
4854 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4878 mip->mi_name, (void *)ring);
4889 mac_find_macaddr(mac_impl_t *mip, uint8_t *mac_addr)
4893 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4895 for (map = mip->mi_addresses; map != NULL; map = map->ma_next) {
4920 mac_impl_t *mip = map->ma_mip;
4922 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4923 ASSERT(mip->mi_addresses != NULL);
4925 map = mac_find_macaddr(mip, map->ma_addr);
4930 if (map == mip->mi_addresses) {
4931 mip->mi_addresses = map->ma_next;
4935 pre = mip->mi_addresses;
4957 mac_add_macaddr(mac_impl_t *mip, mac_group_t *group, uint8_t *mac_addr,
4964 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4966 map = mac_find_macaddr(mip, mac_addr);
4974 map->ma_len = mip->mi_type->mt_addr_length;
4978 map->ma_mip = mip;
4981 map->ma_next = mip->mi_addresses;
4982 mip->mi_addresses = map;
5025 (bcmp(map->ma_addr, mip->mi_addr, map->ma_len) == 0)) {
5034 if ((err = i_mac_promisc_set(mip, B_TRUE)) == 0) {
5060 mac_impl_t *mip = map->ma_mip;
5063 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
5065 ASSERT(map == mac_find_macaddr(mip, map->ma_addr));
5093 err = i_mac_promisc_set(mip, B_FALSE);
5106 if (bcmp(map->ma_addr, mip->mi_addr, map->ma_len) != 0)
5119 mac_impl_t *mip = map->ma_mip;
5122 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
5123 ASSERT(mac_find_macaddr(mip, mac_addr) == NULL);
5131 if (mip->mi_rx_groups == NULL) {
5132 err = mip->mi_unicst(mip->mi_driver, (const uint8_t *)
5191 mac_impl_t *mip = map->ma_mip;
5193 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
5194 ASSERT(mac_find_macaddr(mip, mac_addr) == NULL);
5200 bcopy(mac_addr, mip->mi_addr, map->ma_len);
5205 mac_unicast_update_clients(mip, map);
5212 mac_init_macaddr(mac_impl_t *mip)
5221 map->ma_len = mip->mi_type->mt_addr_length;
5222 bcopy(mip->mi_addr, map->ma_addr, map->ma_len);
5229 if (mip->mi_rx_groups == NULL)
5232 map->ma_mip = mip;
5234 mip->mi_addresses = map;
5242 mac_fini_macaddr(mac_impl_t *mip)
5244 mac_address_t *map = mip->mi_addresses;
5257 mip->mi_addresses = NULL;
5534 i_mac_impl_log(mac_impl_t *mip, i_mac_log_state_t *lstate)
5539 i_mac_perim_enter(mip);
5543 if ((mip->mi_state_flags & MIS_DISABLED) ||
5544 ((mip->mi_state_flags & MIS_IS_VNIC) &&
5545 (mac_get_lower_mac_handle((mac_handle_t)mip) != NULL))) {
5546 i_mac_perim_exit(mip);
5550 for (mcip = mip->mi_clients_list; mcip != NULL;
5570 i_mac_perim_exit(mip);
5583 i_mac_perim_exit(mip);
5599 i_mac_perim_exit(mip);
5611 mac_impl_t *mip = (mac_impl_t *)val;
5613 if ((mip->mi_state_flags & MIS_DISABLED) == 0) {
5614 list_insert_tail(list, mip);
5615 mip->mi_ref++;
5625 mac_impl_t *mip;
5636 for (mip = list_head(&mac_impl_list); mip != NULL;
5637 mip = list_next(&mac_impl_list, mip)) {
5638 if (i_mac_impl_log(mip, lstate) != 0)
5644 while ((mip = list_remove_tail(&mac_impl_list)) != NULL) {
5645 mip->mi_ref--;
5890 mac_reserve_tx_ring(mac_impl_t *mip, mac_ring_t *desired_ring)
5897 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
5904 group = MAC_DEFAULT_TX_GROUP(mip);
5907 ASSERT(desired_ring != (mac_ring_t *)mip->mi_default_tx_ring);
5960 mac_reclaim_ring_from_grp(mac_impl_t *mip, mac_ring_type_t ring_type,
5980 defgrp = mip->mi_rx_donor_grp;
6003 if (mac_group_mov_ring(mip, group, tring) != 0)
6005 if (mac_group_mov_ring(mip, defgrp, ring) != 0) {
6006 (void) mac_group_mov_ring(mip, defgrp, tring);
6014 defgrp = MAC_DEFAULT_TX_GROUP(mip);
6015 if (ring == (mac_ring_t *)mip->mi_default_tx_ring) {
6026 for (i = 0; i < mip->mi_tx_group_count; i++) {
6027 tgrp = &mip->mi_tx_groups[i];
6083 mip->mi_default_tx_ring = (mac_ring_handle_t)tring;
6108 if (tring == (mac_ring_t *)mip->mi_default_tx_ring)
6125 if (mac_group_mov_ring(mip, group, tring) != 0) {
6129 if (mac_group_mov_ring(mip, defgrp, ring) != 0) {
6130 (void) mac_group_mov_ring(mip, defgrp, tring);
6148 i_mac_group_allocate_rings(mac_impl_t *mip, mac_ring_type_t ring_type,
6157 mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) ||
6159 mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC));
6166 mip->mi_share_capab.ms_squery(share, ring_type, NULL, &nrings);
6170 mip->mi_share_capab.ms_squery(share, ring_type,
6180 ring == (mac_ring_t *)mip->mi_default_tx_ring) {
6181 if (mac_reclaim_ring_from_grp(mip, ring_type,
6207 ring == (mac_ring_t *)mip->mi_default_tx_ring) {
6233 rv = mac_group_mov_ring(mip, new_group, rings[i]);
6237 (void) mac_group_mov_ring(mip,
6251 tmp_ring = mac_reserve_tx_ring(mip, rings[i]);
6257 rv = mac_group_mov_ring(mip, new_group, rings[i]);
6261 (void) mac_group_mov_ring(mip,
6262 MAC_DEFAULT_TX_GROUP(mip),
6274 mip->mi_share_capab.ms_sadd(share, new_group->mrg_driver);
6332 mac_impl_t *mip = mcip->mci_mip;
6350 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
6358 if (!move && (map = mac_find_macaddr(mip, mac_addr)) != NULL) {
6362 if (mip->mi_rx_groups == NULL || mip->mi_rx_group_count == 0)
6373 mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6381 mip->mi_rx_group_type == MAC_GROUP_TYPE_STATIC) {
6398 } else if (isprimary && mip->mi_nactiveclients == 1 &&
6399 mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6402 * mip and we have not asked for any rings, we give
6410 donorgrp = mip->mi_rx_donor_grp;
6432 for (i = 1; i < mip->mi_rx_group_count; i++) {
6433 grp = &mip->mi_rx_groups[i];
6435 DTRACE_PROBE3(rx__group__trying, char *, mip->mi_name,
6455 donorgrp == MAC_DEFAULT_RX_GROUP(mip)) {
6484 if (mip->mi_rx_group_type != MAC_GROUP_TYPE_DYNAMIC)
6501 err = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_RX,
6515 mip->mi_rx_donor_grp = grp;
6521 mip->mi_name, int, grp->mrg_index, int, err);
6530 if (i >= mip->mi_rx_group_count) {
6544 donorgrp != MAC_DEFAULT_RX_GROUP(mip) &&
6561 if (grp == mip->mi_rx_donor_grp)
6564 MAC_DEFAULT_RX_GROUP(mip)) != 0) {
6568 mip->mi_rx_donor_grp =
6569 MAC_DEFAULT_RX_GROUP(mip);
6570 donorgrp = MAC_DEFAULT_RX_GROUP(mip);
6582 if (mip->mi_rx_group_type != MAC_GROUP_TYPE_DYNAMIC)
6588 err = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_RX,
6602 char *, mip->mi_name, int, grp->mrg_index);
6606 mip->mi_name, int, grp->mrg_index, int, err);
6614 char *, mip->mi_name, int, grp->mrg_index);
6629 mac_impl_t *mip = mcip->mci_mip;
6632 ASSERT(group != MAC_DEFAULT_RX_GROUP(mip));
6634 if (mip->mi_rx_donor_grp == group)
6635 mip->mi_rx_donor_grp = MAC_DEFAULT_RX_GROUP(mip);
6660 mip->mi_share_capab.ms_sremove(mcip->mci_share,
6664 if (mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6672 (void) mac_group_mov_ring(mip, mip->mi_rx_donor_grp,
6679 * to a another client of the mip
6698 mac_impl_t *mip = mcip->mci_mip;
6714 (grp != MAC_DEFAULT_RX_GROUP(mip) ||
6721 (void) mac_add_macaddr(mip, tgrp, maddr, prim);
6739 mac_impl_t *mip = mcip->mci_mip;
6768 if ((err = mac_add_macaddr(mip, tgrp, maddr, prim)) != 0) {
6770 if ((err = mac_add_macaddr(mip, fgrp, maddr, prim)) != 0) {
6787 mcip->mci_unicast = mac_find_macaddr(mip, maddr);
6809 mac_impl_t *mip = mcip->mci_mip;
6825 if (fgrp != MAC_DEFAULT_RX_GROUP(mip)) {
6872 MAC_DEFAULT_RX_GROUP(mip), B_TRUE);
6896 mac_impl_t *mip = mcip->mci_mip;
6925 for (gclient = mip->mi_clients_list; gclient != NULL;
6934 if (mip->mi_tx_groups == NULL || mip->mi_tx_group_count == 0)
6939 mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6947 mip->mi_tx_group_type == MAC_GROUP_TYPE_STATIC) {
6966 defgrp = MAC_DEFAULT_TX_GROUP(mip);
6982 for (i = 0; i < mip->mi_tx_group_count; i++) {
6983 grp = &mip->mi_tx_groups[i];
7015 if (mip->mi_tx_group_type != MAC_GROUP_TYPE_DYNAMIC ||
7026 if (i >= mip->mi_tx_group_count) {
7054 if (mip->mi_tx_group_type != MAC_GROUP_TYPE_DYNAMIC)
7060 err = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_TX,
7073 mip->mi_tx_group_free--;
7077 mip->mi_name, int, grp->mrg_index, int, err);
7085 if (mip->mi_tx_group_type != MAC_GROUP_TYPE_DYNAMIC) {
7086 mip->mi_tx_group_free--;
7090 rv = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_TX, defgrp, grp,
7094 char *, mip->mi_name, int, grp->mrg_index, int, rv);
7106 mip->mi_tx_group_free--;
7113 mac_impl_t *mip = mcip->mci_mip;
7119 defgrp = MAC_DEFAULT_TX_GROUP(mip);
7137 mip->mi_share_capab.ms_sremove(share, grp->mrg_driver);
7140 if (mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
7142 (void) mac_group_mov_ring(mip, defgrp, ring);
7145 mip->mi_tx_group_free++;
7192 mac_impl_t *mip = mcip->mci_mip;
7199 defgrp = MAC_DEFAULT_TX_GROUP(mip);
7258 (mac_ring_t *)mip->mi_default_tx_ring) {
7406 mac_impl_t *mip = (mac_impl_t *)mh;
7409 mutex_enter(&mip->mi_bridge_lock);
7410 if (mip->mi_bridge_link == NULL) {
7411 mip->mi_bridge_link = link;
7416 mutex_exit(&mip->mi_bridge_lock);
7430 mac_impl_t *mip = (mac_impl_t *)mh;
7432 mutex_enter(&mip->mi_bridge_lock);
7433 ASSERT(mip->mi_bridge_link == link);
7434 mip->mi_bridge_link = NULL;
7435 mutex_exit(&mip->mi_bridge_lock);
7443 mac_impl_t *mip = (mac_impl_t *)mh;
7445 i_mac_perim_enter(mip);
7446 mip->mi_state_flags |= MIS_NO_ACTIVE;
7447 i_mac_perim_exit(mip);
7458 mac_set_prim_vlan_rings(mac_impl_t *mip, mac_resource_props_t *mrp)
7463 for (vmcip = mip->mi_clients_list; vmcip != NULL;
7510 mac_impl_t *mip = mcip->mci_mip;
7542 if (mip->mi_rx_donor_grp == group) {
7544 mip->mi_rx_donor_grp = defgrp;
7546 defgrp = mip->mi_rx_donor_grp;
7555 rv = mac_group_mov_ring(mip, defgrp, ring);
7559 (void) mac_group_mov_ring(mip, group,
7576 if (group != mip->mi_rx_donor_grp)
7577 defgrp = mip->mi_rx_donor_grp;
7583 mip->mi_rx_donor_grp = defgrp;
7585 end = mip->mi_rx_group_count;
7588 end = mip->mi_tx_group_count - 1;
7599 tgrp = &mip->mi_rx_groups[i];
7620 tgrp = &mip->mi_tx_groups[i];
7646 if ((rv = i_mac_group_allocate_rings(mip, group->mrg_type, defgrp,
7746 mac_impl_t *mip = (mac_impl_t *)val;
7755 i_mac_perim_enter(mip);
7756 for (mcip = mip->mi_clients_list; mcip != NULL;
7840 i_mac_perim_exit(mip);
7909 mac_impl_t *mip = mcip->mci_mip;
7919 defgrp = MAC_DEFAULT_RX_GROUP(mip);
7959 defgrp = MAC_DEFAULT_TX_GROUP(mip);
8005 mac_impl_t *mip = mcip->mci_mip;
8006 mac_group_t *defgrp = MAC_DEFAULT_RX_GROUP(mip);
8024 if (rxhw && mip->mi_rxhwclnt_avail < 2)
8032 ASSERT(mip->mi_nactiveclients == 2);