Lines Matching refs:mip

362  * when holding a reference on a link or when holding mip->mi_bridge_lock and
523 mac_impl_t *mip = buf;
527 mip->mi_linkstate = LINK_STATE_UNKNOWN;
529 rw_init(&mip->mi_rw_lock, NULL, RW_DRIVER, NULL);
530 mutex_init(&mip->mi_notify_lock, NULL, MUTEX_DRIVER, NULL);
531 mutex_init(&mip->mi_promisc_lock, NULL, MUTEX_DRIVER, NULL);
532 mutex_init(&mip->mi_ring_lock, NULL, MUTEX_DEFAULT, NULL);
534 mip->mi_notify_cb_info.mcbi_lockp = &mip->mi_notify_lock;
535 cv_init(&mip->mi_notify_cb_info.mcbi_cv, NULL, CV_DRIVER, NULL);
536 mip->mi_promisc_cb_info.mcbi_lockp = &mip->mi_promisc_lock;
537 cv_init(&mip->mi_promisc_cb_info.mcbi_cv, NULL, CV_DRIVER, NULL);
539 mutex_init(&mip->mi_bridge_lock, NULL, MUTEX_DEFAULT, NULL);
548 mac_impl_t *mip = buf;
551 ASSERT(mip->mi_ref == 0);
552 ASSERT(mip->mi_active == 0);
553 ASSERT(mip->mi_linkstate == LINK_STATE_UNKNOWN);
554 ASSERT(mip->mi_devpromisc == 0);
555 ASSERT(mip->mi_ksp == NULL);
556 ASSERT(mip->mi_kstat_count == 0);
557 ASSERT(mip->mi_nclients == 0);
558 ASSERT(mip->mi_nactiveclients == 0);
559 ASSERT(mip->mi_single_active_client == NULL);
560 ASSERT(mip->mi_state_flags == 0);
561 ASSERT(mip->mi_factory_addr == NULL);
562 ASSERT(mip->mi_factory_addr_num == 0);
563 ASSERT(mip->mi_default_tx_ring == NULL);
565 mcbi = &mip->mi_notify_cb_info;
567 ASSERT(mip->mi_notify_bits == 0);
568 ASSERT(mip->mi_notify_thread == NULL);
569 ASSERT(mcbi->mcbi_lockp == &mip->mi_notify_lock);
572 mcbi = &mip->mi_promisc_cb_info;
573 ASSERT(mcbi->mcbi_del_cnt == 0 && mip->mi_promisc_list == NULL);
574 ASSERT(mip->mi_promisc_list == NULL);
575 ASSERT(mcbi->mcbi_lockp == &mip->mi_promisc_lock);
578 ASSERT(mip->mi_bcast_ngrps == 0 && mip->mi_bcast_grp == NULL);
579 ASSERT(mip->mi_perim_owner == NULL && mip->mi_perim_ocnt == 0);
581 rw_destroy(&mip->mi_rw_lock);
583 mutex_destroy(&mip->mi_promisc_lock);
584 cv_destroy(&mip->mi_promisc_cb_info.mcbi_cv);
585 mutex_destroy(&mip->mi_notify_lock);
586 cv_destroy(&mip->mi_notify_cb_info.mcbi_cv);
587 mutex_destroy(&mip->mi_ring_lock);
589 ASSERT(mip->mi_bridge_link == NULL);
778 * The promisc callbacks are in 2 lists, one off the 'mip' and another off the
785 i_mac_promisc_walker_cleanup(mac_impl_t *mip)
797 rmlist = mac_callback_walker_cleanup(&mip->mi_promisc_cb_info,
798 &mip->mi_promisc_list);
803 VERIFY(mac_callback_remove(&mip->mi_promisc_cb_info,
812 i_mac_notify(mac_impl_t *mip, mac_notify_type_t type)
824 if (mip->mi_state_flags & MIS_DISABLED)
834 mcbi = &mip->mi_notify_cb_info;
836 mip->mi_notify_bits |= (1 << type);
849 i_mac_perim_enter(mac_impl_t *mip)
853 if (mip->mi_state_flags & MIS_IS_VNIC) {
858 mcip = mac_vnic_lower(mip);
859 mip = mcip->mci_mip;
862 mutex_enter(&mip->mi_perim_lock);
863 if (mip->mi_perim_owner == curthread) {
864 mip->mi_perim_ocnt++;
865 mutex_exit(&mip->mi_perim_lock);
869 while (mip->mi_perim_owner != NULL)
870 cv_wait(&mip->mi_perim_cv, &mip->mi_perim_lock);
872 mip->mi_perim_owner = curthread;
873 ASSERT(mip->mi_perim_ocnt == 0);
874 mip->mi_perim_ocnt++;
876 mip->mi_perim_stack_depth = getpcstack(mip->mi_perim_stack,
879 mutex_exit(&mip->mi_perim_lock);
883 i_mac_perim_enter_nowait(mac_impl_t *mip)
892 if (mip->mi_state_flags & MIS_IS_VNIC) {
893 i_mac_perim_enter(mip);
897 mutex_enter(&mip->mi_perim_lock);
898 if (mip->mi_perim_owner != NULL) {
899 mutex_exit(&mip->mi_perim_lock);
902 ASSERT(mip->mi_perim_ocnt == 0);
903 mip->mi_perim_owner = curthread;
904 mip->mi_perim_ocnt++;
905 mutex_exit(&mip->mi_perim_lock);
911 i_mac_perim_exit(mac_impl_t *mip)
915 if (mip->mi_state_flags & MIS_IS_VNIC) {
920 mcip = mac_vnic_lower(mip);
921 mip = mcip->mci_mip;
924 ASSERT(mip->mi_perim_owner == curthread && mip->mi_perim_ocnt != 0);
926 mutex_enter(&mip->mi_perim_lock);
927 if (--mip->mi_perim_ocnt == 0) {
928 mip->mi_perim_owner = NULL;
929 cv_signal(&mip->mi_perim_cv);
931 mutex_exit(&mip->mi_perim_lock);
941 mac_impl_t *mip = (mac_impl_t *)mh;
944 if (mip->mi_state_flags & MIS_IS_VNIC) {
949 mcip = mac_vnic_lower(mip);
950 mip = mcip->mci_mip;
952 return (mip->mi_perim_owner == curthread);
962 mac_impl_t *mip = (mac_impl_t *)mh;
964 i_mac_perim_enter(mip);
966 * The mac_perim_handle_t returned encodes the 'mip' and whether a
970 MAC_ENCODE_MPH(*mphp, mip, 0);
1004 mac_impl_t *mip;
1007 MAC_DECODE_MPH(mph, mip, need_close);
1008 i_mac_perim_exit(mip);
1010 mac_close((mac_handle_t)mip);
1016 mac_impl_t *mip;
1031 (mod_hash_val_t *)&mip);
1038 if (mip->mi_state_flags & MIS_DISABLED) {
1043 if (mip->mi_state_flags & MIS_EXCLUSIVE_HELD) {
1048 mip->mi_ref++;
1051 *pmip = mip;
1056 mac_rele(mac_impl_t *mip)
1059 ASSERT(mip->mi_ref != 0);
1060 if (--mip->mi_ref == 0) {
1061 ASSERT(mip->mi_nactiveclients == 0 &&
1062 !(mip->mi_state_flags & MIS_EXCLUSIVE));
1073 mac_impl_t *mip = (mac_impl_t *)mh;
1077 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1078 ASSERT(mip->mi_start != NULL);
1083 if (mip->mi_active++ == 0) {
1089 err = mip->mi_start(mip->mi_driver);
1091 mip->mi_active--;
1098 if (mip->mi_default_tx_ring != NULL) {
1100 ring = (mac_ring_t *)mip->mi_default_tx_ring;
1104 mip->mi_active--;
1110 if ((defgrp = MAC_DEFAULT_RX_GROUP(mip)) != NULL) {
1119 mip->mi_active--;
1138 mac_impl_t *mip = (mac_impl_t *)mh;
1141 ASSERT(mip->mi_stop != NULL);
1142 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1147 ASSERT(mip->mi_active != 0);
1148 if (--mip->mi_active == 0) {
1149 if ((grp = MAC_DEFAULT_RX_GROUP(mip)) != NULL) {
1165 mip->mi_nactiveclients == 0);
1170 if (mip->mi_default_tx_ring != NULL) {
1173 ring = (mac_ring_t *)mip->mi_default_tx_ring;
1183 mip->mi_stop(mip->mi_driver);
1188 i_mac_promisc_set(mac_impl_t *mip, boolean_t on)
1192 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1193 ASSERT(mip->mi_setpromisc != NULL);
1199 if (mip->mi_devpromisc++ == 0) {
1200 err = mip->mi_setpromisc(mip->mi_driver, B_TRUE);
1202 mip->mi_devpromisc--;
1205 i_mac_notify(mip, MAC_NOTE_DEVPROMISC);
1208 if (mip->mi_devpromisc == 0)
1215 if (--mip->mi_devpromisc == 0) {
1216 err = mip->mi_setpromisc(mip->mi_driver, B_FALSE);
1218 mip->mi_devpromisc++;
1221 i_mac_notify(mip, MAC_NOTE_DEVPROMISC);
1236 mac_impl_t *mip = (mac_impl_t *)mh;
1241 return (mip->mi_devpromisc != 0);
1253 mac_addr_factory_init(mac_impl_t *mip)
1263 if (!i_mac_capab_get((mac_handle_t)mip, MAC_CAPAB_MULTIFACTADDR,
1276 capab.mcm_getaddr(mip->mi_driver, capab.mcm_naddr, addr);
1278 mip->mi_factory_addr_num = capab.mcm_naddr;
1279 mip->mi_factory_addr = kmem_zalloc(mip->mi_factory_addr_num *
1284 mip->mi_factory_addr[i].mfa_addr,
1285 mip->mi_type->mt_addr_length);
1286 mip->mi_factory_addr[i].mfa_in_use = B_FALSE;
1293 mac_addr_factory_fini(mac_impl_t *mip)
1295 if (mip->mi_factory_addr == NULL) {
1296 ASSERT(mip->mi_factory_addr_num == 0);
1300 kmem_free(mip->mi_factory_addr, mip->mi_factory_addr_num *
1303 mip->mi_factory_addr = NULL;
1304 mip->mi_factory_addr_num = 0;
1321 mac_impl_t *mip = mcip->mci_mip;
1324 i_mac_perim_enter(mip);
1329 rw_enter(&mip->mi_rw_lock, RW_WRITER);
1331 if (mip->mi_factory_addr_num == 0) {
1338 if (*slot < 1 || *slot > mip->mi_factory_addr_num) {
1342 if (mip->mi_factory_addr[*slot-1].mfa_in_use) {
1348 for (i = 0; i < mip->mi_factory_addr_num; i++) {
1349 if (!mip->mi_factory_addr[i].mfa_in_use)
1353 if (i == mip->mi_factory_addr_num) {
1360 mip->mi_factory_addr[*slot-1].mfa_in_use = B_TRUE;
1361 mip->mi_factory_addr[*slot-1].mfa_client = mcip;
1364 rw_exit(&mip->mi_rw_lock);
1365 i_mac_perim_exit(mip);
1376 mac_impl_t *mip = mcip->mci_mip;
1378 i_mac_perim_enter(mip);
1383 rw_enter(&mip->mi_rw_lock, RW_WRITER);
1385 ASSERT(slot > 0 && slot <= mip->mi_factory_addr_num);
1386 ASSERT(mip->mi_factory_addr[slot-1].mfa_in_use);
1388 mip->mi_factory_addr[slot-1].mfa_in_use = B_FALSE;
1390 rw_exit(&mip->mi_rw_lock);
1391 i_mac_perim_exit(mip);
1403 mac_impl_t *mip = (mac_impl_t *)mh;
1406 ASSERT(slot > 0 && slot <= mip->mi_factory_addr_num);
1412 rw_enter(&mip->mi_rw_lock, RW_READER);
1413 bcopy(mip->mi_factory_addr[slot-1].mfa_addr, mac_addr, MAXMACADDRLEN);
1414 *addr_len = mip->mi_type->mt_addr_length;
1415 in_use = mip->mi_factory_addr[slot-1].mfa_in_use;
1417 bcopy(mip->mi_factory_addr[slot-1].mfa_client->mci_name,
1422 rw_exit(&mip->mi_rw_lock);
1433 mac_impl_t *mip = (mac_impl_t *)mh;
1435 return (mip->mi_factory_addr_num);
1673 mac_impl_t *mip = mcip->mci_mip;
1675 MAC_TX(mip, rh, mp, mcip);
2059 mac_impl_t *mip = mcip->mci_mip;
2063 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2083 mac_impl_t *mip = mcip->mci_mip;
2085 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2099 mac_impl_t *mip = mcip->mci_mip;
2101 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2289 mac_impl_t *mip = (mac_impl_t *)mh;
2291 return (((mip->mi_state_flags & MIS_LEGACY) != 0) ?
2292 mip->mi_capab_legacy.ml_unsup_note : 0);
2299 i_mac_disable(mac_impl_t *mip)
2304 if (mip->mi_state_flags & MIS_DISABLED) {
2316 if (mip->mi_ref > 0) {
2328 ASSERT(mip->mi_bcast_ngrps == 0);
2336 mcip = mac_primary_client_handle(mip);
2342 mip->mi_state_flags |= MIS_DISABLED;
2350 mac_impl_t *mip = (mac_impl_t *)mh;
2353 if ((err = i_mac_perim_enter_nowait(mip)) != 0)
2355 err = i_mac_disable(mip);
2356 i_mac_perim_exit(mip);
2363 mac_impl_t *mip = (mac_impl_t *)mh;
2366 i_mac_perim_enter(mip);
2367 err = i_mac_disable(mip);
2368 i_mac_perim_exit(mip);
2374 i_mac_notify_exit(mip);
2386 mac_rx_classify(mac_impl_t *mip, mac_resource_handle_t mrh, mblk_t *mp)
2402 if ((mip->mi_state_flags & MIS_EXCLUSIVE) != 0)
2405 err = mac_flow_lookup(mip->mi_flow_tab, mp, flags, &flent);
2436 mac_impl_t *mip = (mac_impl_t *)mh;
2451 if (mac_rx_classify(mip, mrh, bp1) != NULL) {
2470 i_mac_tx_srs_notify(mac_impl_t *mip, mac_ring_handle_t ring)
2479 * don't do anything. In any case the mip has to be valid. The driver
2485 if (mip->mi_state_flags & MIS_DISABLED) {
2493 rw_enter(&mip->mi_rw_lock, RW_READER);
2494 for (cclient = mip->mi_clients_list; cclient != NULL;
2514 rw_exit(&mip->mi_rw_lock);
2523 mac_impl_t *mip = (mac_impl_t *)mh;
2531 refresh = mip->mi_multicst;
2532 arg = mip->mi_driver;
2535 mac_bcast_refresh(mip, refresh, arg, add);
2542 mac_impl_t *mip = (mac_impl_t *)mh;
2549 refresh = mip->mi_setpromisc;
2550 arg = mip->mi_driver;
2557 refresh(arg, (mip->mi_devpromisc != 0));
2571 mac_impl_t *mip = (mac_impl_t *)mh;
2575 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2577 *marginp = mip->mi_margin;
2583 if (*marginp > mip->mi_margin) {
2592 for (pp = &mip->mi_mmrp; (p = *pp) != NULL; pp = &p->mmr_nextp) {
2613 rw_exit(&(mip->mi_rw_lock));
2624 mac_impl_t *mip = (mac_impl_t *)mh;
2628 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2632 for (pp = &(mip->mi_mmrp); (p = *pp) != NULL; pp = &(p->mmr_nextp)) {
2661 rw_exit(&(mip->mi_rw_lock));
2668 mac_impl_t *mip = (mac_impl_t *)mh;
2671 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2673 if (mip->mi_mmrp != NULL)
2674 margin_needed = mip->mi_mmrp->mmr_margin;
2677 mip->mi_margin = margin;
2679 rw_exit(&(mip->mi_rw_lock));
2682 i_mac_notify(mip, MAC_NOTE_MARGIN);
3017 mac_impl_t *mip = (mac_impl_t *)mh;
3036 if (mip->mi_state_flags & MIS_IS_VNIC)
3055 (mip->mi_state_flags & MIS_IS_VNIC))
3061 mip->mi_llimit = learnval;
3063 mip->mi_ldecay = learnval;
3070 if (mip->mi_callbacks->mc_callbacks & MC_SETPROP) {
3071 err = mip->mi_callbacks->mc_setprop(mip->mi_driver,
3091 mac_impl_t *mip = (mac_impl_t *)mh;
3123 if (mip->mi_state_flags & MIS_IS_VNIC)
3131 if (mip->mi_state_flags & MIS_IS_VNIC)
3134 bcopy(&mip->mi_llimit, val, sizeof (mip->mi_llimit));
3136 bcopy(&mip->mi_ldecay, val, sizeof (mip->mi_ldecay));
3189 if (mip->mi_callbacks->mc_callbacks & MC_GETPROP) {
3190 err = mip->mi_callbacks->mc_getprop(mip->mi_driver, name, id,
3221 mac_impl_t *mip = (mac_impl_t *)mh;
3261 if ((mip->mi_state_flags & MIS_IS_VNIC) &&
3273 if (mip->mi_state_flags & MIS_IS_VNIC)
3275 mip = (mac_impl_t *)mh;
3277 mip->mi_rx_group_type == MAC_GROUP_TYPE_STATIC) ||
3279 mip->mi_tx_group_type == MAC_GROUP_TYPE_STATIC)) {
3344 if (mip->mi_callbacks->mc_callbacks & MC_PROPINFO) {
3372 mip->mi_callbacks->mc_propinfo(mip->mi_driver, name, id,
3411 if (mip->mi_info.mi_media == DL_ETHER)
3425 mac_impl_t *mip = (mac_impl_t *)mh;
3427 if ((mip->mi_state_flags & MIS_LEGACY) == 0)
3430 return (mip->mi_capab_legacy.ml_fastpath_disable(mip->mi_driver));
3436 mac_impl_t *mip = (mac_impl_t *)mh;
3438 if ((mip->mi_state_flags & MIS_LEGACY) == 0)
3441 mip->mi_capab_legacy.ml_fastpath_enable(mip->mi_driver);
3445 mac_register_priv_prop(mac_impl_t *mip, char **priv_props)
3459 mip->mi_priv_prop = kmem_zalloc(nprops * sizeof (char *), KM_SLEEP);
3462 mip->mi_priv_prop[i] = kmem_zalloc(MAXLINKPROPNAME, KM_SLEEP);
3463 (void) strlcpy(mip->mi_priv_prop[i], priv_props[i],
3467 mip->mi_priv_prop_count = nprops;
3471 mac_unregister_priv_prop(mac_impl_t *mip)
3475 if (mip->mi_priv_prop_count == 0) {
3476 ASSERT(mip->mi_priv_prop == NULL);
3480 for (i = 0; i < mip->mi_priv_prop_count; i++)
3481 kmem_free(mip->mi_priv_prop[i], MAXLINKPROPNAME);
3482 kmem_free(mip->mi_priv_prop, mip->mi_priv_prop_count *
3485 mip->mi_priv_prop = NULL;
3486 mip->mi_priv_prop_count = 0;
3500 mac_ring_alloc(mac_impl_t *mip)
3504 mutex_enter(&mip->mi_ring_lock);
3505 if (mip->mi_ring_freelist != NULL) {
3506 ring = mip->mi_ring_freelist;
3507 mip->mi_ring_freelist = ring->mr_next;
3509 mutex_exit(&mip->mi_ring_lock);
3511 mutex_exit(&mip->mi_ring_lock);
3519 mac_ring_free(mac_impl_t *mip, mac_ring_t *ring)
3523 mutex_enter(&mip->mi_ring_lock);
3526 ring->mr_next = mip->mi_ring_freelist;
3528 mip->mi_ring_freelist = ring;
3530 mutex_exit(&mip->mi_ring_lock);
3534 mac_ring_freeall(mac_impl_t *mip)
3537 mutex_enter(&mip->mi_ring_lock);
3538 mac_ring_t *ring = mip->mi_ring_freelist;
3544 mip->mi_ring_freelist = NULL;
3545 mutex_exit(&mip->mi_ring_lock);
3648 mac_init_ring(mac_impl_t *mip, mac_group_t *group, int index,
3655 ring = mac_ring_alloc(mip);
3680 cap_rings->mr_rget(mip->mi_driver, group->mrg_type, group->mrg_index,
3724 mac_compare_ddi_handle(mip->mi_rx_groups,
3725 mip->mi_rx_group_count, ring);
3738 ring->mr_mip = mip;
3749 mac_init_group(mac_impl_t *mip, mac_group_t *group, int size,
3759 (void) mac_init_ring(mip, group, index, cap_rings);
3763 mac_init_rings(mac_impl_t *mip, mac_ring_type_t rtype)
3779 ASSERT(mip->mi_rx_groups == NULL);
3781 cap_rings = &mip->mi_rx_rings_cap;
3785 ASSERT(mip->mi_tx_groups == NULL);
3787 cap_rings = &mip->mi_tx_rings_cap;
3794 if (!i_mac_capab_get((mac_handle_t)mip, MAC_CAPAB_RINGS, cap_rings))
3807 (mip->mi_state_flags & MIS_IS_AGGR) == 0) {
3834 group->mrg_mh = (mac_handle_t)mip;
3851 cap_rings->mr_gget(mip->mi_driver, rtype, g, &group_info,
3860 char *, mip->mi_name,
3879 char *, mip->mi_name);
3886 char *, mip->mi_name,
3899 char *, mip->mi_name,
3916 char *, mip->mi_name,
3943 mac_init_group(mip, group, group_info.mgi_count, cap_rings);
3957 group->mrg_mh = (mac_handle_t)mip;
3967 mac_init_group(mip, group, ring_left, cap_rings);
3986 mip->mi_rx_group_type = cap_rings->mr_group_type;
3987 mip->mi_rx_group_count = cap_rings->mr_gnum;
3988 mip->mi_rx_groups = groups;
3989 mip->mi_rx_donor_grp = groups;
3990 if (mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
3995 mip->mi_rxrings_avail =
3996 mip->mi_rx_groups->mrg_cur_count - 1;
3997 mip->mi_rxrings_rsvd = 1;
4003 mip->mi_rxhwclnt_avail = mip->mi_rx_group_count - 1;
4004 mip->mi_rxhwclnt_used = 1;
4007 mip->mi_tx_group_type = pseudo_txgrp ? MAC_GROUP_TYPE_DYNAMIC :
4009 mip->mi_tx_group_count = grpcnt;
4010 mip->mi_tx_group_free = group_free;
4011 mip->mi_tx_groups = groups;
4022 ASSERT(mip->mi_state_flags & MIS_IS_AGGR);
4027 cap_rings->mr_gget(mip->mi_driver, rtype, 0, NULL,
4043 mip->mi_default_tx_ring = (mac_ring_handle_t)ring;
4045 if (mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC)
4046 mip->mi_txrings_avail = group->mrg_cur_count - 1;
4050 mip->mi_txrings_rsvd = 1;
4055 mip->mi_txhwclnt_avail = mip->mi_tx_group_count;
4056 mip->mi_txhwclnt_used = 1;
4063 mac_free_rings(mip, rtype);
4110 mac_free_rings(mac_impl_t *mip, mac_ring_type_t rtype)
4117 if (mip->mi_rx_groups == NULL)
4120 groups = mip->mi_rx_groups;
4121 group_count = mip->mi_rx_group_count;
4123 mip->mi_rx_groups = NULL;
4124 mip->mi_rx_donor_grp = NULL;
4125 mip->mi_rx_group_count = 0;
4128 ASSERT(mip->mi_tx_group_count == mip->mi_tx_group_free);
4130 if (mip->mi_tx_groups == NULL)
4133 groups = mip->mi_tx_groups;
4134 group_count = mip->mi_tx_group_count;
4136 mip->mi_tx_groups = NULL;
4137 mip->mi_tx_group_count = 0;
4138 mip->mi_tx_group_free = 0;
4139 mip->mi_default_tx_ring = NULL;
4155 mac_ring_free(mip, ring);
4160 mac_ring_freeall(mip);
4205 mac_bridge_tx(mac_impl_t *mip, mac_ring_handle_t rh, mblk_t *mp)
4214 mutex_enter(&mip->mi_bridge_lock);
4215 if ((mh = mip->mi_bridge_link) != NULL)
4217 mutex_exit(&mip->mi_bridge_lock);
4219 MAC_RING_TX(mip, rh, mp, mp);
4255 mac_impl_t *mip = (mac_impl_t *)group->mrg_mh;
4262 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4266 cap_rings = &mip->mi_rx_rings_cap;
4267 group_type = mip->mi_rx_group_type;
4270 cap_rings = &mip->mi_tx_rings_cap;
4271 group_type = mip->mi_tx_group_type;
4291 ring = mac_init_ring(mip, group, index, cap_rings);
4357 mac_ring_free(mip, ring);
4459 if (mip->mi_state_flags & MIS_IS_AGGR &&
4460 mip->mi_default_tx_ring == NULL &&
4462 mip->mi_default_tx_ring = (mac_ring_handle_t)ring;
4479 mac_impl_t *mip = (mac_impl_t *)group->mrg_mh;
4483 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4494 group_type = mip->mi_rx_group_type;
4495 cap_rings = &mip->mi_rx_rings_cap;
4545 if (mip->mi_state_flags & MIS_IS_AGGR &&
4546 mip->mi_default_tx_ring ==
4549 mip->mi_default_tx_ring =
4577 ASSERT(ring != (mac_ring_t *)mip->mi_default_tx_ring);
4578 group_type = mip->mi_tx_group_type;
4579 cap_rings = &mip->mi_tx_rings_cap;
4587 defgrp = MAC_DEFAULT_TX_GROUP(mip);
4682 mac_ring_free(mip, ring);
4694 mac_group_mov_ring(mac_impl_t *mip, mac_group_t *d_group, mac_ring_t *ring)
4699 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4723 mip->mi_name, (void *)ring);
4734 mac_find_macaddr(mac_impl_t *mip, uint8_t *mac_addr)
4738 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4740 for (map = mip->mi_addresses; map != NULL; map = map->ma_next) {
4765 mac_impl_t *mip = map->ma_mip;
4767 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4768 ASSERT(mip->mi_addresses != NULL);
4770 map = mac_find_macaddr(mip, map->ma_addr);
4775 if (map == mip->mi_addresses) {
4776 mip->mi_addresses = map->ma_next;
4780 pre = mip->mi_addresses;
4802 mac_add_macaddr(mac_impl_t *mip, mac_group_t *group, uint8_t *mac_addr,
4809 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4811 map = mac_find_macaddr(mip, mac_addr);
4819 map->ma_len = mip->mi_type->mt_addr_length;
4823 map->ma_mip = mip;
4826 map->ma_next = mip->mi_addresses;
4827 mip->mi_addresses = map;
4870 (bcmp(map->ma_addr, mip->mi_addr, map->ma_len) == 0)) {
4879 if ((err = i_mac_promisc_set(mip, B_TRUE)) == 0) {
4905 mac_impl_t *mip = map->ma_mip;
4908 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4910 ASSERT(map == mac_find_macaddr(mip, map->ma_addr));
4938 err = i_mac_promisc_set(mip, B_FALSE);
4951 if (bcmp(map->ma_addr, mip->mi_addr, map->ma_len) != 0)
4964 mac_impl_t *mip = map->ma_mip;
4967 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
4968 ASSERT(mac_find_macaddr(mip, mac_addr) == NULL);
4976 if (mip->mi_rx_groups == NULL) {
4977 err = mip->mi_unicst(mip->mi_driver, (const uint8_t *)
5036 mac_impl_t *mip = map->ma_mip;
5038 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
5039 ASSERT(mac_find_macaddr(mip, mac_addr) == NULL);
5045 bcopy(mac_addr, mip->mi_addr, map->ma_len);
5050 mac_unicast_update_clients(mip, map);
5057 mac_init_macaddr(mac_impl_t *mip)
5066 map->ma_len = mip->mi_type->mt_addr_length;
5067 bcopy(mip->mi_addr, map->ma_addr, map->ma_len);
5074 if (mip->mi_rx_groups == NULL)
5077 map->ma_mip = mip;
5079 mip->mi_addresses = map;
5087 mac_fini_macaddr(mac_impl_t *mip)
5089 mac_address_t *map = mip->mi_addresses;
5102 mip->mi_addresses = NULL;
5379 i_mac_impl_log(mac_impl_t *mip, i_mac_log_state_t *lstate)
5384 i_mac_perim_enter(mip);
5388 if ((mip->mi_state_flags & MIS_DISABLED) ||
5389 ((mip->mi_state_flags & MIS_IS_VNIC) &&
5390 (mac_get_lower_mac_handle((mac_handle_t)mip) != NULL))) {
5391 i_mac_perim_exit(mip);
5395 for (mcip = mip->mi_clients_list; mcip != NULL;
5415 i_mac_perim_exit(mip);
5428 i_mac_perim_exit(mip);
5444 i_mac_perim_exit(mip);
5456 mac_impl_t *mip = (mac_impl_t *)val;
5458 if ((mip->mi_state_flags & MIS_DISABLED) == 0) {
5459 list_insert_tail(list, mip);
5460 mip->mi_ref++;
5470 mac_impl_t *mip;
5481 for (mip = list_head(&mac_impl_list); mip != NULL;
5482 mip = list_next(&mac_impl_list, mip)) {
5483 if (i_mac_impl_log(mip, lstate) != 0)
5489 while ((mip = list_remove_tail(&mac_impl_list)) != NULL) {
5490 mip->mi_ref--;
5735 mac_reserve_tx_ring(mac_impl_t *mip, mac_ring_t *desired_ring)
5742 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
5749 group = MAC_DEFAULT_TX_GROUP(mip);
5752 ASSERT(desired_ring != (mac_ring_t *)mip->mi_default_tx_ring);
5805 mac_reclaim_ring_from_grp(mac_impl_t *mip, mac_ring_type_t ring_type,
5825 defgrp = mip->mi_rx_donor_grp;
5848 if (mac_group_mov_ring(mip, group, tring) != 0)
5850 if (mac_group_mov_ring(mip, defgrp, ring) != 0) {
5851 (void) mac_group_mov_ring(mip, defgrp, tring);
5859 defgrp = MAC_DEFAULT_TX_GROUP(mip);
5860 if (ring == (mac_ring_t *)mip->mi_default_tx_ring) {
5871 for (i = 0; i < mip->mi_tx_group_count; i++) {
5872 tgrp = &mip->mi_tx_groups[i];
5928 mip->mi_default_tx_ring = (mac_ring_handle_t)tring;
5953 if (tring == (mac_ring_t *)mip->mi_default_tx_ring)
5970 if (mac_group_mov_ring(mip, group, tring) != 0) {
5974 if (mac_group_mov_ring(mip, defgrp, ring) != 0) {
5975 (void) mac_group_mov_ring(mip, defgrp, tring);
5993 i_mac_group_allocate_rings(mac_impl_t *mip, mac_ring_type_t ring_type,
6002 mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) ||
6004 mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC));
6011 mip->mi_share_capab.ms_squery(share, ring_type, NULL, &nrings);
6015 mip->mi_share_capab.ms_squery(share, ring_type,
6025 ring == (mac_ring_t *)mip->mi_default_tx_ring) {
6026 if (mac_reclaim_ring_from_grp(mip, ring_type,
6052 ring == (mac_ring_t *)mip->mi_default_tx_ring) {
6078 rv = mac_group_mov_ring(mip, new_group, rings[i]);
6082 (void) mac_group_mov_ring(mip,
6096 tmp_ring = mac_reserve_tx_ring(mip, rings[i]);
6102 rv = mac_group_mov_ring(mip, new_group, rings[i]);
6106 (void) mac_group_mov_ring(mip,
6107 MAC_DEFAULT_TX_GROUP(mip),
6119 mip->mi_share_capab.ms_sadd(share, new_group->mrg_driver);
6177 mac_impl_t *mip = mcip->mci_mip;
6195 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
6203 if (!move && (map = mac_find_macaddr(mip, mac_addr)) != NULL) {
6207 if (mip->mi_rx_groups == NULL || mip->mi_rx_group_count == 0)
6218 mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6226 mip->mi_rx_group_type == MAC_GROUP_TYPE_STATIC) {
6243 } else if (isprimary && mip->mi_nactiveclients == 1 &&
6244 mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6247 * mip and we have not asked for any rings, we give
6255 donorgrp = mip->mi_rx_donor_grp;
6277 for (i = 1; i < mip->mi_rx_group_count; i++) {
6278 grp = &mip->mi_rx_groups[i];
6280 DTRACE_PROBE3(rx__group__trying, char *, mip->mi_name,
6300 donorgrp == MAC_DEFAULT_RX_GROUP(mip)) {
6329 if (mip->mi_rx_group_type != MAC_GROUP_TYPE_DYNAMIC)
6346 err = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_RX,
6360 mip->mi_rx_donor_grp = grp;
6366 mip->mi_name, int, grp->mrg_index, int, err);
6375 if (i >= mip->mi_rx_group_count) {
6389 donorgrp != MAC_DEFAULT_RX_GROUP(mip) &&
6406 if (grp == mip->mi_rx_donor_grp)
6409 MAC_DEFAULT_RX_GROUP(mip)) != 0) {
6413 mip->mi_rx_donor_grp =
6414 MAC_DEFAULT_RX_GROUP(mip);
6415 donorgrp = MAC_DEFAULT_RX_GROUP(mip);
6427 if (mip->mi_rx_group_type != MAC_GROUP_TYPE_DYNAMIC)
6433 err = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_RX,
6447 char *, mip->mi_name, int, grp->mrg_index);
6451 mip->mi_name, int, grp->mrg_index, int, err);
6459 char *, mip->mi_name, int, grp->mrg_index);
6474 mac_impl_t *mip = mcip->mci_mip;
6477 ASSERT(group != MAC_DEFAULT_RX_GROUP(mip));
6479 if (mip->mi_rx_donor_grp == group)
6480 mip->mi_rx_donor_grp = MAC_DEFAULT_RX_GROUP(mip);
6505 mip->mi_share_capab.ms_sremove(mcip->mci_share,
6509 if (mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6517 (void) mac_group_mov_ring(mip, mip->mi_rx_donor_grp,
6524 * to a another client of the mip
6543 mac_impl_t *mip = mcip->mci_mip;
6559 (grp != MAC_DEFAULT_RX_GROUP(mip) ||
6566 (void) mac_add_macaddr(mip, tgrp, maddr, prim);
6584 mac_impl_t *mip = mcip->mci_mip;
6613 if ((err = mac_add_macaddr(mip, tgrp, maddr, prim)) != 0) {
6615 if ((err = mac_add_macaddr(mip, fgrp, maddr, prim)) != 0) {
6632 mcip->mci_unicast = mac_find_macaddr(mip, maddr);
6654 mac_impl_t *mip = mcip->mci_mip;
6670 if (fgrp != MAC_DEFAULT_RX_GROUP(mip)) {
6717 MAC_DEFAULT_RX_GROUP(mip), B_TRUE);
6741 mac_impl_t *mip = mcip->mci_mip;
6770 for (gclient = mip->mi_clients_list; gclient != NULL;
6779 if (mip->mi_tx_groups == NULL || mip->mi_tx_group_count == 0)
6784 mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6792 mip->mi_tx_group_type == MAC_GROUP_TYPE_STATIC) {
6811 defgrp = MAC_DEFAULT_TX_GROUP(mip);
6827 for (i = 0; i < mip->mi_tx_group_count; i++) {
6828 grp = &mip->mi_tx_groups[i];
6860 if (mip->mi_tx_group_type != MAC_GROUP_TYPE_DYNAMIC ||
6871 if (i >= mip->mi_tx_group_count) {
6899 if (mip->mi_tx_group_type != MAC_GROUP_TYPE_DYNAMIC)
6905 err = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_TX,
6918 mip->mi_tx_group_free--;
6922 mip->mi_name, int, grp->mrg_index, int, err);
6930 if (mip->mi_tx_group_type != MAC_GROUP_TYPE_DYNAMIC) {
6931 mip->mi_tx_group_free--;
6935 rv = i_mac_group_allocate_rings(mip, MAC_RING_TYPE_TX, defgrp, grp,
6939 char *, mip->mi_name, int, grp->mrg_index, int, rv);
6951 mip->mi_tx_group_free--;
6958 mac_impl_t *mip = mcip->mci_mip;
6964 defgrp = MAC_DEFAULT_TX_GROUP(mip);
6982 mip->mi_share_capab.ms_sremove(share, grp->mrg_driver);
6985 if (mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
6987 (void) mac_group_mov_ring(mip, defgrp, ring);
6990 mip->mi_tx_group_free++;
7037 mac_impl_t *mip = mcip->mci_mip;
7044 defgrp = MAC_DEFAULT_TX_GROUP(mip);
7103 (mac_ring_t *)mip->mi_default_tx_ring) {
7251 mac_impl_t *mip = (mac_impl_t *)mh;
7254 mutex_enter(&mip->mi_bridge_lock);
7255 if (mip->mi_bridge_link == NULL) {
7256 mip->mi_bridge_link = link;
7261 mutex_exit(&mip->mi_bridge_lock);
7275 mac_impl_t *mip = (mac_impl_t *)mh;
7277 mutex_enter(&mip->mi_bridge_lock);
7278 ASSERT(mip->mi_bridge_link == link);
7279 mip->mi_bridge_link = NULL;
7280 mutex_exit(&mip->mi_bridge_lock);
7288 mac_impl_t *mip = (mac_impl_t *)mh;
7290 i_mac_perim_enter(mip);
7291 mip->mi_state_flags |= MIS_NO_ACTIVE;
7292 i_mac_perim_exit(mip);
7303 mac_set_prim_vlan_rings(mac_impl_t *mip, mac_resource_props_t *mrp)
7308 for (vmcip = mip->mi_clients_list; vmcip != NULL;
7355 mac_impl_t *mip = mcip->mci_mip;
7387 if (mip->mi_rx_donor_grp == group) {
7389 mip->mi_rx_donor_grp = defgrp;
7391 defgrp = mip->mi_rx_donor_grp;
7400 rv = mac_group_mov_ring(mip, defgrp, ring);
7404 (void) mac_group_mov_ring(mip, group,
7421 if (group != mip->mi_rx_donor_grp)
7422 defgrp = mip->mi_rx_donor_grp;
7428 mip->mi_rx_donor_grp = defgrp;
7430 end = mip->mi_rx_group_count;
7433 end = mip->mi_tx_group_count - 1;
7444 tgrp = &mip->mi_rx_groups[i];
7465 tgrp = &mip->mi_tx_groups[i];
7491 if ((rv = i_mac_group_allocate_rings(mip, group->mrg_type, defgrp,
7591 mac_impl_t *mip = (mac_impl_t *)val;
7600 i_mac_perim_enter(mip);
7601 for (mcip = mip->mi_clients_list; mcip != NULL;
7685 i_mac_perim_exit(mip);
7754 mac_impl_t *mip = mcip->mci_mip;
7764 defgrp = MAC_DEFAULT_RX_GROUP(mip);
7804 defgrp = MAC_DEFAULT_TX_GROUP(mip);
7850 mac_impl_t *mip = mcip->mci_mip;
7851 mac_group_t *defgrp = MAC_DEFAULT_RX_GROUP(mip);
7869 if (rxhw && mip->mi_rxhwclnt_avail < 2)
7877 ASSERT(mip->mi_nactiveclients == 2);