Lines Matching defs:mip

368  * when holding a reference on a link or when holding mip->mi_bridge_lock and
529 mac_impl_t *mip = buf;
533 mip->mi_linkstate = LINK_STATE_UNKNOWN;
535 rw_init(&mip->mi_rw_lock, NULL, RW_DRIVER, NULL);
536 mutex_init(&mip->mi_notify_lock, NULL, MUTEX_DRIVER, NULL);
537 mutex_init(&mip->mi_promisc_lock, NULL, MUTEX_DRIVER, NULL);
538 mutex_init(&mip->mi_ring_lock, NULL, MUTEX_DEFAULT, NULL);
540 mip->mi_notify_cb_info.mcbi_lockp = &mip->mi_notify_lock;
541 cv_init(&mip->mi_notify_cb_info.mcbi_cv, NULL, CV_DRIVER, NULL);
542 mip->mi_promisc_cb_info.mcbi_lockp = &mip->mi_promisc_lock;
543 cv_init(&mip->mi_promisc_cb_info.mcbi_cv, NULL, CV_DRIVER, NULL);
545 mutex_init(&mip->mi_bridge_lock, NULL, MUTEX_DEFAULT, NULL);
554 mac_impl_t *mip = buf;
557 ASSERT(mip->mi_ref == 0);
558 ASSERT(mip->mi_active == 0);
559 ASSERT(mip->mi_linkstate == LINK_STATE_UNKNOWN);
560 ASSERT(mip->mi_devpromisc == 0);
561 ASSERT(mip->mi_ksp == NULL);
562 ASSERT(mip->mi_kstat_count == 0);
563 ASSERT(mip->mi_nclients == 0);
564 ASSERT(mip->mi_nactiveclients == 0);
565 ASSERT(mip->mi_single_active_client == NULL);
566 ASSERT(mip->mi_state_flags == 0);
567 ASSERT(mip->mi_factory_addr == NULL);
568 ASSERT(mip->mi_factory_addr_num == 0);
569 ASSERT(mip->mi_default_tx_ring == NULL);
571 mcbi = &mip->mi_notify_cb_info;
573 ASSERT(mip->mi_notify_bits == 0);
574 ASSERT(mip->mi_notify_thread == NULL);
575 ASSERT(mcbi->mcbi_lockp == &mip->mi_notify_lock);
578 mcbi = &mip->mi_promisc_cb_info;
579 ASSERT(mcbi->mcbi_del_cnt == 0 && mip->mi_promisc_list == NULL);
580 ASSERT(mip->mi_promisc_list == NULL);
581 ASSERT(mcbi->mcbi_lockp == &mip->mi_promisc_lock);
584 ASSERT(mip->mi_bcast_ngrps == 0 && mip->mi_bcast_grp == NULL);
585 ASSERT(mip->mi_perim_owner == NULL && mip->mi_perim_ocnt == 0);
587 rw_destroy(&mip->mi_rw_lock);
589 mutex_destroy(&mip->mi_promisc_lock);
590 cv_destroy(&mip->mi_promisc_cb_info.mcbi_cv);
591 mutex_destroy(&mip->mi_notify_lock);
592 cv_destroy(&mip->mi_notify_cb_info.mcbi_cv);
593 mutex_destroy(&mip->mi_ring_lock);
595 ASSERT(mip->mi_bridge_link == NULL);
784 * The promisc callbacks are in 2 lists, one off the 'mip' and another off the
791 i_mac_promisc_walker_cleanup(mac_impl_t *mip)
803 rmlist = mac_callback_walker_cleanup(&mip->mi_promisc_cb_info,
804 &mip->mi_promisc_list);
809 VERIFY(mac_callback_remove(&mip->mi_promisc_cb_info,
818 i_mac_notify(mac_impl_t *mip, mac_notify_type_t type)
830 if (mip->mi_state_flags & MIS_DISABLED)
840 mcbi = &mip->mi_notify_cb_info;
842 mip->mi_notify_bits |= (1 << type);
855 i_mac_perim_enter(mac_impl_t *mip)
859 if (mip->mi_state_flags & MIS_IS_VNIC) {
864 mcip = mac_vnic_lower(mip);
865 mip = mcip->mci_mip;
868 mutex_enter(&mip->mi_perim_lock);
869 if (mip->mi_perim_owner == curthread) {
870 mip->mi_perim_ocnt++;
871 mutex_exit(&mip->mi_perim_lock);
875 while (mip->mi_perim_owner != NULL)
876 cv_wait(&mip->mi_perim_cv, &mip->mi_perim_lock);
878 mip->mi_perim_owner = curthread;
879 ASSERT(mip->mi_perim_ocnt == 0);
880 mip->mi_perim_ocnt++;
882 mip->mi_perim_stack_depth = getpcstack(mip->mi_perim_stack,
885 mutex_exit(&mip->mi_perim_lock);
889 i_mac_perim_enter_nowait(mac_impl_t *mip)
898 if (mip->mi_state_flags & MIS_IS_VNIC) {
899 i_mac_perim_enter(mip);
903 mutex_enter(&mip->mi_perim_lock);
904 if (mip->mi_perim_owner != NULL) {
905 mutex_exit(&mip->mi_perim_lock);
908 ASSERT(mip->mi_perim_ocnt == 0);
909 mip->mi_perim_owner = curthread;
910 mip->mi_perim_ocnt++;
911 mutex_exit(&mip->mi_perim_lock);
917 i_mac_perim_exit(mac_impl_t *mip)
921 if (mip->mi_state_flags & MIS_IS_VNIC) {
926 mcip = mac_vnic_lower(mip);
927 mip = mcip->mci_mip;
930 ASSERT(mip->mi_perim_owner == curthread && mip->mi_perim_ocnt != 0);
932 mutex_enter(&mip->mi_perim_lock);
933 if (--mip->mi_perim_ocnt == 0) {
934 mip->mi_perim_owner = NULL;
935 cv_signal(&mip->mi_perim_cv);
937 mutex_exit(&mip->mi_perim_lock);
947 mac_impl_t *mip = (mac_impl_t *)mh;
950 if (mip->mi_state_flags & MIS_IS_VNIC) {
955 mcip = mac_vnic_lower(mip);
956 mip = mcip->mci_mip;
958 return (mip->mi_perim_owner == curthread);
968 mac_impl_t *mip = (mac_impl_t *)mh;
970 i_mac_perim_enter(mip);
972 * The mac_perim_handle_t returned encodes the 'mip' and whether a
976 MAC_ENCODE_MPH(*mphp, mip, 0);
1010 mac_impl_t *mip;
1013 MAC_DECODE_MPH(mph, mip, need_close);
1014 i_mac_perim_exit(mip);
1016 mac_close((mac_handle_t)mip);
1022 mac_impl_t *mip;
1037 (mod_hash_val_t *)&mip);
1044 if (mip->mi_state_flags & MIS_DISABLED) {
1049 if (mip->mi_state_flags & MIS_EXCLUSIVE_HELD) {
1054 mip->mi_ref++;
1057 *pmip = mip;
1062 mac_rele(mac_impl_t *mip)
1065 ASSERT(mip->mi_ref != 0);
1066 if (--mip->mi_ref == 0) {
1067 ASSERT(mip->mi_nactiveclients == 0 &&
1068 !(mip->mi_state_flags & MIS_EXCLUSIVE));
1079 mac_impl_t *mip = (mac_impl_t *)mh;
1083 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1084 ASSERT(mip->mi_start != NULL);
1089 if (mip->mi_active++ == 0) {
1095 err = mip->mi_start(mip->mi_driver);
1097 mip->mi_active--;
1104 if (mip->mi_default_tx_ring != NULL) {
1106 ring = (mac_ring_t *)mip->mi_default_tx_ring;
1110 mip->mi_active--;
1116 if ((defgrp = MAC_DEFAULT_RX_GROUP(mip)) != NULL) {
1125 mip->mi_active--;
1144 mac_impl_t *mip = (mac_impl_t *)mh;
1147 ASSERT(mip->mi_stop != NULL);
1148 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1153 ASSERT(mip->mi_active != 0);
1154 if (--mip->mi_active == 0) {
1155 if ((grp = MAC_DEFAULT_RX_GROUP(mip)) != NULL) {
1171 mip->mi_nactiveclients == 0);
1176 if (mip->mi_default_tx_ring != NULL) {
1179 ring = (mac_ring_t *)mip->mi_default_tx_ring;
1189 mip->mi_stop(mip->mi_driver);
1194 i_mac_promisc_set(mac_impl_t *mip, boolean_t on)
1198 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
1199 ASSERT(mip->mi_setpromisc != NULL);
1205 if (mip->mi_devpromisc++ == 0) {
1206 err = mip->mi_setpromisc(mip->mi_driver, B_TRUE);
1208 mip->mi_devpromisc--;
1211 i_mac_notify(mip, MAC_NOTE_DEVPROMISC);
1214 if (mip->mi_devpromisc == 0)
1221 if (--mip->mi_devpromisc == 0) {
1222 err = mip->mi_setpromisc(mip->mi_driver, B_FALSE);
1224 mip->mi_devpromisc++;
1227 i_mac_notify(mip, MAC_NOTE_DEVPROMISC);
1242 mac_impl_t *mip = (mac_impl_t *)mh;
1247 return (mip->mi_devpromisc != 0);
1259 mac_addr_factory_init(mac_impl_t *mip)
1269 if (!i_mac_capab_get((mac_handle_t)mip, MAC_CAPAB_MULTIFACTADDR,
1282 capab.mcm_getaddr(mip->mi_driver, capab.mcm_naddr, addr);
1284 mip->mi_factory_addr_num = capab.mcm_naddr;
1285 mip->mi_factory_addr = kmem_zalloc(mip->mi_factory_addr_num *
1290 mip->mi_factory_addr[i].mfa_addr,
1291 mip->mi_type->mt_addr_length);
1292 mip->mi_factory_addr[i].mfa_in_use = B_FALSE;
1299 mac_addr_factory_fini(mac_impl_t *mip)
1301 if (mip->mi_factory_addr == NULL) {
1302 ASSERT(mip->mi_factory_addr_num == 0);
1306 kmem_free(mip->mi_factory_addr, mip->mi_factory_addr_num *
1309 mip->mi_factory_addr = NULL;
1310 mip->mi_factory_addr_num = 0;
1327 mac_impl_t *mip = mcip->mci_mip;
1330 i_mac_perim_enter(mip);
1335 rw_enter(&mip->mi_rw_lock, RW_WRITER);
1337 if (mip->mi_factory_addr_num == 0) {
1344 if (*slot < 1 || *slot > mip->mi_factory_addr_num) {
1348 if (mip->mi_factory_addr[*slot-1].mfa_in_use) {
1354 for (i = 0; i < mip->mi_factory_addr_num; i++) {
1355 if (!mip->mi_factory_addr[i].mfa_in_use)
1359 if (i == mip->mi_factory_addr_num) {
1366 mip->mi_factory_addr[*slot-1].mfa_in_use = B_TRUE;
1367 mip->mi_factory_addr[*slot-1].mfa_client = mcip;
1370 rw_exit(&mip->mi_rw_lock);
1371 i_mac_perim_exit(mip);
1382 mac_impl_t *mip = mcip->mci_mip;
1384 i_mac_perim_enter(mip);
1389 rw_enter(&mip->mi_rw_lock, RW_WRITER);
1391 ASSERT(slot > 0 && slot <= mip->mi_factory_addr_num);
1392 ASSERT(mip->mi_factory_addr[slot-1].mfa_in_use);
1394 mip->mi_factory_addr[slot-1].mfa_in_use = B_FALSE;
1396 rw_exit(&mip->mi_rw_lock);
1397 i_mac_perim_exit(mip);
1409 mac_impl_t *mip = (mac_impl_t *)mh;
1412 ASSERT(slot > 0 && slot <= mip->mi_factory_addr_num);
1418 rw_enter(&mip->mi_rw_lock, RW_READER);
1419 bcopy(mip->mi_factory_addr[slot-1].mfa_addr, mac_addr, MAXMACADDRLEN);
1420 *addr_len = mip->mi_type->mt_addr_length;
1421 in_use = mip->mi_factory_addr[slot-1].mfa_in_use;
1423 bcopy(mip->mi_factory_addr[slot-1].mfa_client->mci_name,
1428 rw_exit(&mip->mi_rw_lock);
1439 mac_impl_t *mip = (mac_impl_t *)mh;
1441 return (mip->mi_factory_addr_num);
1679 mac_impl_t *mip = mcip->mci_mip;
1681 MAC_TX(mip, rh, mp, mcip);
1704 mac_impl_t *mip = (mac_impl_t *)mh;
1708 VERIFY(mip->mi_state_flags & MIS_IS_AGGR);
1713 mip->mi_default_tx_ring = rh;
2096 mac_impl_t *mip = mcip->mci_mip;
2100 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2120 mac_impl_t *mip = mcip->mci_mip;
2122 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2136 mac_impl_t *mip = mcip->mci_mip;
2138 ASSERT(MAC_PERIM_HELD((mac_handle_t)mip));
2324 mac_impl_t *mip = (mac_impl_t *)mh;
2326 return (((mip->mi_state_flags & MIS_LEGACY) != 0) ?
2327 mip->mi_capab_legacy.ml_unsup_note : 0);
2334 i_mac_disable(mac_impl_t *mip)
2339 if (mip->mi_state_flags & MIS_DISABLED) {
2351 if (mip->mi_ref > 0) {
2363 ASSERT(mip->mi_bcast_ngrps == 0);
2371 mcip = mac_primary_client_handle(mip);
2377 mip->mi_state_flags |= MIS_DISABLED;
2385 mac_impl_t *mip = (mac_impl_t *)mh;
2388 if ((err = i_mac_perim_enter_nowait(mip)) != 0)
2390 err = i_mac_disable(mip);
2391 i_mac_perim_exit(mip);
2398 mac_impl_t *mip = (mac_impl_t *)mh;
2401 i_mac_perim_enter(mip);
2402 err = i_mac_disable(mip);
2403 i_mac_perim_exit(mip);
2409 i_mac_notify_exit(mip);
2421 mac_rx_classify(mac_impl_t *mip, mac_resource_handle_t mrh, mblk_t *mp)
2437 if ((mip->mi_state_flags & MIS_EXCLUSIVE) != 0)
2440 err = mac_flow_lookup(mip->mi_flow_tab, mp, flags, &flent);
2471 mac_impl_t *mip = (mac_impl_t *)mh;
2486 if (mac_rx_classify(mip, mrh, bp1) != NULL) {
2505 i_mac_tx_srs_notify(mac_impl_t *mip, mac_ring_handle_t ring)
2514 * don't do anything. In any case the mip has to be valid. The driver
2520 if (mip->mi_state_flags & MIS_DISABLED) {
2528 rw_enter(&mip->mi_rw_lock, RW_READER);
2529 for (cclient = mip->mi_clients_list; cclient != NULL;
2549 rw_exit(&mip->mi_rw_lock);
2558 mac_impl_t *mip = (mac_impl_t *)mh;
2566 refresh = mip->mi_multicst;
2567 arg = mip->mi_driver;
2570 mac_bcast_refresh(mip, refresh, arg, add);
2577 mac_impl_t *mip = (mac_impl_t *)mh;
2584 refresh = mip->mi_setpromisc;
2585 arg = mip->mi_driver;
2592 refresh(arg, (mip->mi_devpromisc != 0));
2606 mac_impl_t *mip = (mac_impl_t *)mh;
2610 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2612 *marginp = mip->mi_margin;
2618 if (*marginp > mip->mi_margin) {
2627 for (pp = &mip->mi_mmrp; (p = *pp) != NULL; pp = &p->mmr_nextp) {
2648 rw_exit(&(mip->mi_rw_lock));
2659 mac_impl_t *mip = (mac_impl_t *)mh;
2663 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2667 for (pp = &(mip->mi_mmrp); (p = *pp) != NULL; pp = &(p->mmr_nextp)) {
2696 rw_exit(&(mip->mi_rw_lock));
2703 mac_impl_t *mip = (mac_impl_t *)mh;
2706 rw_enter(&(mip->mi_rw_lock), RW_WRITER);
2708 if (mip->mi_mmrp != NULL)
2709 margin_needed = mip->mi_mmrp->mmr_margin;
2712 mip->mi_margin = margin;
2714 rw_exit(&(mip->mi_rw_lock));
2717 i_mac_notify(mip, MAC_NOTE_MARGIN);
2735 mac_impl_t *mip = (mac_impl_t *)mh;
2740 i_mac_perim_enter(mip);
2741 rw_enter(&mip->mi_rw_lock, RW_WRITER);
2744 *mtup = mip->mi_sdu_max;
2748 rw_exit(&mip->mi_rw_lock);
2749 i_mac_perim_exit(mip);
2753 if (*mtup > mip->mi_sdu_max ||
2755 rw_exit(&mip->mi_rw_lock);
2756 i_mac_perim_exit(mip);
2761 for (cur = mip->mi_mtrp; cur != NULL; cur = cur->mtr_nextp) {
2764 rw_exit(&mip->mi_rw_lock);
2765 i_mac_perim_exit(mip);
2782 cur->mtr_nextp = mip->mi_mtrp;
2783 mip->mi_mtrp = cur;
2786 rw_exit(&mip->mi_rw_lock);
2787 i_mac_perim_exit(mip);
2794 mac_impl_t *mip = (mac_impl_t *)mh;
2797 i_mac_perim_enter(mip);
2798 rw_enter(&mip->mi_rw_lock, RW_WRITER);
2801 for (cur = mip->mi_mtrp; cur != NULL; cur = cur->mtr_nextp) {
2807 mip->mi_mtrp = cur->mtr_nextp;
2813 rw_exit(&mip->mi_rw_lock);
2814 i_mac_perim_exit(mip);
2821 rw_exit(&mip->mi_rw_lock);
2822 i_mac_perim_exit(mip);
3171 mac_impl_t *mip = (mac_impl_t *)mh;
3190 if (mip->mi_state_flags & MIS_IS_VNIC)
3209 (mip->mi_state_flags & MIS_IS_VNIC))
3215 mip->mi_llimit = learnval;
3217 mip->mi_ldecay = learnval;
3224 if (mip->mi_callbacks->mc_callbacks & MC_SETPROP) {
3225 err = mip->mi_callbacks->mc_setprop(mip->mi_driver,
3245 mac_impl_t *mip = (mac_impl_t *)mh;
3277 if (mip->mi_state_flags & MIS_IS_VNIC)
3285 if (mip->mi_state_flags & MIS_IS_VNIC)
3288 bcopy(&mip->mi_llimit, val, sizeof (mip->mi_llimit));
3290 bcopy(&mip->mi_ldecay, val, sizeof (mip->mi_ldecay));
3343 if (mip->mi_callbacks->mc_callbacks & MC_GETPROP) {
3344 err = mip->mi_callbacks->mc_getprop(mip->mi_driver, name, id,
3375 mac_impl_t *mip = (mac_impl_t *)mh;
3415 if ((mip->mi_state_flags & MIS_IS_VNIC) &&
3427 if (mip->mi_state_flags & MIS_IS_VNIC)
3429 mip = (mac_impl_t *)mh;
3431 mip->mi_rx_group_type == MAC_GROUP_TYPE_STATIC) ||
3433 mip->mi_tx_group_type == MAC_GROUP_TYPE_STATIC)) {
3498 if (mip->mi_callbacks->mc_callbacks & MC_PROPINFO) {
3526 mip->mi_callbacks->mc_propinfo(mip->mi_driver, name, id,
3565 if (mip->mi_info.mi_media == DL_ETHER)
3579 mac_impl_t *mip = (mac_impl_t *)mh;
3581 if ((mip->mi_state_flags & MIS_LEGACY) == 0)
3584 return (mip->mi_capab_legacy.ml_fastpath_disable(mip->mi_driver));
3590 mac_impl_t *mip = (mac_impl_t *)mh;
3592 if ((mip->mi_state_flags & MIS_LEGACY) == 0)
3595 mip->mi_capab_legacy.ml_fastpath_enable(mip->mi_driver);
3599 mac_register_priv_prop(mac_impl_t *mip, char **priv_props)
3613 mip->mi_priv_prop = kmem_zalloc(nprops * sizeof (char *), KM_SLEEP);
3616 mip->mi_priv_prop[i] = kmem_zalloc(MAXLINKPROPNAME, KM_SLEEP);
3617 (void) strlcpy(mip->mi_priv_prop[i], priv_props[i],
3621 mip->mi_priv_prop_count = nprops;
3625 mac_unregister_priv_prop(mac_impl_t *mip)
3629 if (mip->mi_priv_prop_count == 0) {
3630 ASSERT(mip->mi_priv_prop == NULL);
3634 for (i = 0; i < mip->mi_priv_prop_count; i++)
3635 kmem_free(mip->mi_priv_prop[i], MAXLINKPROPNAME);
3636 kmem_free(mip->mi_priv_prop, mip->mi_priv_prop_count *
3639 mip->mi_priv_prop = NULL;
3640 mip->mi_priv_prop_count = 0;
3654 mac_ring_alloc(mac_impl_t *mip)
3658 mutex_enter(&mip->mi_ring_lock);
3659 if (mip->mi_ring_freelist != NULL) {
3660 ring = mip->mi_ring_freelist;
3661 mip->mi_ring_freelist = ring->mr_next;
3663 mutex_exit(&mip->mi_ring_lock);
3665 mutex_exit(&mip->mi_ring_lock);
3673 mac_ring_free(mac_impl_t *mip, mac_ring_t *ring)
3677 mutex_enter(&mip->mi_ring_lock);
3680 ring->mr_next = mip->mi_ring_freelist;
3682 mip->mi_ring_freelist = ring;
3684 mutex_exit(&mip->mi_ring_lock);
3688 mac_ring_freeall(mac_impl_t *mip)
3691 mutex_enter(&mip->mi_ring_lock);
3692 mac_ring_t *ring = mip->mi_ring_freelist;
3698 mip->mi_ring_freelist = NULL;
3699 mutex_exit(&mip->mi_ring_lock);
3802 mac_init_ring(mac_impl_t *mip, mac_group_t *group, int index,
3809 ring = mac_ring_alloc(mip);
3834 cap_rings->mr_rget(mip->mi_driver, group->mrg_type, group->mrg_index,
3878 mac_compare_ddi_handle(mip->mi_rx_groups,
3879 mip->mi_rx_group_count, ring);
3892 ring->mr_mip = mip;
3903 mac_init_group(mac_impl_t *mip, mac_group_t *group, int size,
3913 (void) mac_init_ring(mip, group, index, cap_rings);
3917 mac_init_rings(mac_impl_t *mip, mac_ring_type_t rtype)
3933 ASSERT(mip->mi_rx_groups == NULL);
3935 cap_rings = &mip->mi_rx_rings_cap;
3939 ASSERT(mip->mi_tx_groups == NULL);
3941 cap_rings = &mip->mi_tx_rings_cap;
3948 if (!i_mac_capab_get((mac_handle_t)mip, MAC_CAPAB_RINGS, cap_rings))
3961 (mip->mi_state_flags & MIS_IS_AGGR) == 0) {
3988 group->mrg_mh = (mac_handle_t)mip;
4005 cap_rings->mr_gget(mip->mi_driver, rtype, g, &group_info,
4014 char *, mip->mi_name,
4033 char *, mip->mi_name);
4040 char *, mip->mi_name,
4053 char *, mip->mi_name,
4070 char *, mip->mi_name,
4097 mac_init_group(mip, group, group_info.mgi_count, cap_rings);
4111 group->mrg_mh = (mac_handle_t)mip;
4121 mac_init_group(mip, group, ring_left, cap_rings);
4140 mip->mi_rx_group_type = cap_rings->mr_group_type;
4141 mip->mi_rx_group_count = cap_rings->mr_gnum;
4142 mip->mi_rx_groups = groups;
4143 mip->mi_rx_donor_grp = groups;
4144 if (mip->mi_rx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
4149 mip->mi_rxrings_avail =
4150 mip->mi_rx_groups->mrg_cur_count - 1;
4151 mip->mi_rxrings_rsvd = 1;
4157 mip->mi_rxhwclnt_avail = mip->mi_rx_group_count - 1;
4158 mip->mi_rxhwclnt_used = 1;
4161 mip->mi_tx_group_type = pseudo_txgrp ? MAC_GROUP_TYPE_DYNAMIC :
4163 mip->mi_tx_group_count = grpcnt;
4164 mip->mi_tx_group_free = group_free;
4165 mip->mi_tx_groups = groups;
4176 ASSERT(mip->mi_state_flags & MIS_IS_AGGR);
4181 cap_rings->mr_gget(mip->mi_driver, rtype, 0, NULL,
4197 mip->mi_default_tx_ring = (mac_ring_handle_t)ring;
4199 if (mip->mi_tx_group_type == MAC_GROUP_TYPE_DYNAMIC) {
4200 mip->mi_txrings_avail = group->mrg_cur_count - 1;
4204 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);
8047 mac_transceiver_init(mac_impl_t *mip)
8049 if (mac_capab_get((mac_handle_t)mip, MAC_CAPAB_TRANSCEIVER,
8050 &mip->mi_transceiver)) {
8055 if (mip->mi_transceiver.mct_flags != 0) {
8056 dev_err(mip->mi_dip, CE_WARN, "driver set transceiver "
8058 "capability", mip->mi_transceiver.mct_flags);
8059 bzero(&mip->mi_transceiver,
8063 bzero(&mip->mi_transceiver,
8071 mac_impl_t *mip = (mac_impl_t *)mh;
8075 if (mip->mi_transceiver.mct_ntransceivers == 0)
8078 *countp = mip->mi_transceiver.mct_ntransceivers;
8089 mac_impl_t *mip = (mac_impl_t *)mh;
8093 if (mip->mi_transceiver.mct_info == NULL ||
8094 mip->mi_transceiver.mct_ntransceivers == 0)
8097 if (tranid >= mip->mi_transceiver.mct_ntransceivers)
8101 if ((ret = mip->mi_transceiver.mct_info(mip->mi_driver, tranid,
8117 mac_impl_t *mip = (mac_impl_t *)mh;
8121 if (mip->mi_transceiver.mct_read == NULL)
8124 if (tranid >= mip->mi_transceiver.mct_ntransceivers)
8137 ret = mip->mi_transceiver.mct_read(mip->mi_driver, tranid, page, buf,
8140 dev_err(mip->mi_dip, CE_PANIC, "driver wrote %lu bytes into "
8149 mac_led_init(mac_impl_t *mip)
8151 mip->mi_led_modes = MAC_LED_DEFAULT;
8153 if (!mac_capab_get((mac_handle_t)mip, MAC_CAPAB_LED, &mip->mi_led)) {
8154 bzero(&mip->mi_led, sizeof (mac_capab_led_t));
8158 if (mip->mi_led.mcl_flags != 0) {
8159 dev_err(mip->mi_dip, CE_WARN, "driver set led capability "
8161 "capability", mip->mi_transceiver.mct_flags);
8162 bzero(&mip->mi_led, sizeof (mac_capab_led_t));
8166 if ((mip->mi_led.mcl_modes & ~MAC_LED_ALL) != 0) {
8167 dev_err(mip->mi_dip, CE_WARN, "driver set led capability "
8169 "capability", mip->mi_transceiver.mct_flags);
8170 bzero(&mip->mi_led, sizeof (mac_capab_led_t));
8178 mac_impl_t *mip = (mac_impl_t *)mh;
8182 if (mip->mi_led.mcl_set == NULL)
8185 *supported = mip->mi_led.mcl_modes;
8186 *active = mip->mi_led_modes;
8202 mac_impl_t *mip = (mac_impl_t *)mh;
8214 if (mip->mi_led.mcl_set == NULL)
8224 if ((desired & ~mip->mi_led.mcl_modes) != 0)
8230 if (desired == mip->mi_led_modes)
8249 if ((ret = mip->mi_led.mcl_set(mip->mi_driver, driver, 0)) == 0) {
8250 mip->mi_led_modes = desired;