Lines Matching refs:softmac

27  * The softmac driver is used to "unify" non-GLDv3 drivers to the GLDv3
31 * Specifically, a softmac will be created for each physical network device
32 * (dip) during the device's post-attach process. When this softmac is
39 * This softmac will be destroyed during the device's pre-detach process,
55 #include <sys/softmac.h>
58 /* Used as a parameter to the mod hash walk of softmac structures */
118 softmac_t *softmac = buf;
121 mutex_init(&softmac->smac_mutex, NULL, MUTEX_DEFAULT, NULL);
122 mutex_init(&softmac->smac_active_mutex, NULL, MUTEX_DEFAULT, NULL);
123 mutex_init(&softmac->smac_fp_mutex, NULL, MUTEX_DEFAULT, NULL);
124 cv_init(&softmac->smac_cv, NULL, CV_DEFAULT, NULL);
125 cv_init(&softmac->smac_fp_cv, NULL, CV_DEFAULT, NULL);
126 list_create(&softmac->smac_sup_list, sizeof (softmac_upper_t),
135 softmac_t *softmac = buf;
137 ASSERT(softmac->smac_fp_disable_clients == 0);
138 ASSERT(!softmac->smac_fastpath_admin_disabled);
140 ASSERT(!(softmac->smac_flags & SOFTMAC_ATTACH_DONE));
141 ASSERT(softmac->smac_hold_cnt == 0);
142 ASSERT(softmac->smac_attachok_cnt == 0);
143 ASSERT(softmac->smac_mh == NULL);
144 ASSERT(softmac->smac_softmac[0] == NULL &&
145 softmac->smac_softmac[1] == NULL);
146 ASSERT(softmac->smac_lower == NULL);
147 ASSERT(softmac->smac_active == B_FALSE);
148 ASSERT(softmac->smac_nactive == 0);
149 ASSERT(list_is_empty(&softmac->smac_sup_list));
151 list_destroy(&softmac->smac_sup_list);
152 mutex_destroy(&softmac->smac_mutex);
153 mutex_destroy(&softmac->smac_active_mutex);
154 mutex_destroy(&softmac->smac_fp_mutex);
155 cv_destroy(&softmac->smac_cv);
156 cv_destroy(&softmac->smac_fp_cv);
223 * softmac state machine
263 softmac_state_verify(softmac_t *softmac)
265 ASSERT(MUTEX_HELD(&softmac->smac_mutex));
270 ASSERT(softmac->smac_cnt <= 2 && softmac->smac_attachok_cnt <= 2);
277 ASSERT(softmac->smac_attachok_cnt == SMAC_NONZERO_NODECNT(softmac));
283 ASSERT(softmac->smac_state != SOFTMAC_ATTACH_DONE ||
284 softmac->smac_attachok_cnt == softmac->smac_cnt);
286 if (softmac->smac_attachok_cnt == 0) {
287 ASSERT(softmac->smac_state == SOFTMAC_UNINIT);
288 ASSERT(softmac->smac_mh == NULL);
289 } else if (softmac->smac_attachok_cnt < softmac->smac_cnt) {
290 ASSERT(softmac->smac_state == SOFTMAC_ATTACH_INPROG ||
291 softmac->smac_state == SOFTMAC_DETACH_INPROG);
292 ASSERT(softmac->smac_mh == NULL);
301 ASSERT(softmac->smac_attachok_cnt == softmac->smac_cnt);
302 ASSERT(softmac->smac_state != SOFTMAC_UNINIT);
304 if (softmac->smac_mh != NULL)
305 ASSERT(softmac->smac_attachok_cnt == softmac->smac_cnt);
310 #define SOFTMAC_STATE_VERIFY(softmac) softmac_state_verify(softmac)
312 #define SOFTMAC_STATE_VERIFY(softmac)
319 softmac_t *softmac;
325 * Force the softmac driver to be attached.
328 cmn_err(CE_WARN, "softmac_create:softmac attach fails");
377 * Check whether the softmac for the specified device already exists
381 (mod_hash_val_t *)&softmac)) != 0) {
383 softmac = kmem_cache_alloc(softmac_cachep, KM_SLEEP);
384 (void) strlcpy(softmac->smac_devname, devname, MAXNAMELEN);
387 (mod_hash_key_t)softmac->smac_devname,
388 (mod_hash_val_t)softmac);
395 mutex_enter(&softmac->smac_mutex);
396 SOFTMAC_STATE_VERIFY(softmac);
397 if (softmac->smac_state != SOFTMAC_ATTACH_DONE)
398 softmac->smac_state = SOFTMAC_ATTACH_INPROG;
399 if (softmac->smac_attachok_cnt == 0) {
401 * Initialize the softmac if this is the post-attach of the
404 softmac->smac_flags = 0;
405 softmac->smac_umajor = ddi_driver_major(dip);
406 softmac->smac_uppa = ppa;
414 softmac->smac_flags |= SOFTMAC_GLDV3;
415 softmac->smac_cnt = 1;
417 softmac->smac_cnt =
423 if (softmac->smac_softmac[index] != NULL) {
430 ASSERT(softmac->smac_attached_left != 0);
431 softmac->smac_attached_left--;
432 mutex_exit(&softmac->smac_mutex);
437 mutex_exit(&softmac->smac_mutex);
443 mutex_enter(&softmac->smac_mutex);
444 softmac->smac_softmac[index] = softmac_dev;
449 if (++softmac->smac_attachok_cnt != softmac->smac_cnt) {
450 mutex_exit(&softmac->smac_mutex);
474 softmac, TQ_SLEEP);
475 mutex_exit(&softmac->smac_mutex);
482 softmac_t *softmac = arg;
484 if (!(softmac->smac_capab_flags & cap))
491 *txflags = softmac->smac_hcksum_txflags;
503 legacy->ml_unsup_note = ~softmac->smac_notifications &
509 legacy->ml_dev = makedevice(softmac->smac_umajor,
510 softmac->smac_uppa + 1);
527 softmac_update_info(softmac_t *softmac, datalink_id_t *linkidp)
533 if ((err = dls_mgmt_update(softmac->smac_devname, softmac->smac_media,
534 softmac->smac_flags & SOFTMAC_NOSUPP, &media, &linkid)) == 0) {
551 if (media != softmac->smac_media) {
554 dl_mactypestr(softmac->smac_media),
555 softmac->smac_devname, dl_mactypestr(media),
556 softmac->smac_devname);
560 softmac->smac_devname);
565 "for use.", softmac->smac_devname);
578 softmac_create_datalink(softmac_t *softmac)
590 err = dls_mgmt_create(softmac->smac_devname,
591 makedevice(softmac->smac_umajor, softmac->smac_uppa + 1),
600 ((err = softmac_update_info(softmac, &linkid)) != 0)) {
607 if (!(softmac->smac_flags & SOFTMAC_NOSUPP)) {
608 err = dls_devnet_create(softmac->smac_mh, linkid,
612 softmac->smac_devname);
618 mutex_enter(&softmac->smac_mutex);
619 softmac->smac_flags |= SOFTMAC_NEED_RECREATE;
620 mutex_exit(&softmac->smac_mutex);
629 softmac_t *softmac = arg;
633 if (!GLDV3_DRV(softmac->smac_umajor)) {
634 softmac_mac_register(softmac);
638 if ((err = mac_open(softmac->smac_devname, &mh)) != 0)
641 mutex_enter(&softmac->smac_mutex);
642 softmac->smac_media = (mac_info(mh))->mi_nativemedia;
643 softmac->smac_mh = mh;
644 mutex_exit(&softmac->smac_mutex);
649 * the device detaches, and the softmac will be destroyed
657 err = softmac_create_datalink(softmac);
660 mutex_enter(&softmac->smac_mutex);
662 softmac->smac_mh = NULL;
663 softmac->smac_attacherr = err;
664 softmac->smac_state = SOFTMAC_ATTACH_DONE;
665 cv_broadcast(&softmac->smac_cv);
666 mutex_exit(&softmac->smac_mutex);
676 softmac_mac_register(softmac_t *softmac)
687 * Note that we do not need any locks to access this softmac pointer,
690 ASSERT(softmac != NULL);
691 ASSERT(softmac->smac_state == SOFTMAC_ATTACH_INPROG &&
692 softmac->smac_attachok_cnt == softmac->smac_cnt);
695 mutex_enter(&softmac->smac_mutex);
704 dev = makedevice(ddi_name_to_major("clone"), softmac->smac_umajor);
707 if (dl_attach(lh, softmac->smac_uppa + 1 * 1000, NULL) == 0)
721 if ((softmac_dev = softmac->smac_softmac[index]) == NULL)
724 softmac->smac_dev = dev = softmac_dev->sd_dev;
740 cmn_err(CE_NOTE, "softmac: received "
754 if ((softmac->smac_media = dlia.dl_mac_type) != DL_ETHER) {
761 (dl_attach(lh, softmac->smac_uppa, NULL) != 0)) {
768 cmn_err(CE_NOTE, "softmac: received "
781 softmac->smac_addrlen = sizeof (softmac->smac_unicst_addr);
782 if ((rval = dl_info(lh, &dlia, softmac->smac_unicst_addr,
783 &softmac->smac_addrlen, &dlea)) != 0) {
785 cmn_err(CE_NOTE, "softmac: received "
794 softmac->smac_style = dlia.dl_provider_style;
795 softmac->smac_saplen = ABS(dlia.dl_sap_length);
796 softmac->smac_min_sdu = dlia.dl_min_sdu;
797 softmac->smac_max_sdu = dlia.dl_max_sdu;
799 if ((softmac->smac_saplen != sizeof (uint16_t)) ||
800 (softmac->smac_addrlen != ETHERADDRL) ||
813 softmac->smac_capab_flags =
816 softmac->smac_no_capability_req = B_FALSE;
817 if (softmac_fill_capab(lh, softmac) != 0)
818 softmac->smac_no_capability_req = B_TRUE;
828 softmac->smac_margin = 0;
832 softmac->smac_margin = margin;
840 if (softmac->smac_margin == 0)
841 softmac->smac_margin = VLAN_TAGSZ;
843 softmac->smac_capab_flags |= MAC_CAPAB_NO_NATIVEVLAN;
849 softmac->smac_notifications = 0;
853 softmac->smac_notifications = notes;
868 mutex_enter(&softmac->smac_mutex);
873 if (softmac->smac_media != DL_ETHER)
874 softmac->smac_flags |= SOFTMAC_NOSUPP;
880 if (!(softmac->smac_flags & SOFTMAC_NOSUPP)) {
889 macp->m_driver = softmac;
892 macp->m_margin = softmac->smac_margin;
893 macp->m_src_addr = softmac->smac_unicst_addr;
894 macp->m_min_sdu = softmac->smac_min_sdu;
895 macp->m_max_sdu = softmac->smac_max_sdu;
899 err = mac_register(macp, &softmac->smac_mh);
903 softmac->smac_devname);
907 mutex_exit(&softmac->smac_mutex);
910 * Try to create the datalink for this softmac.
912 if ((err = softmac_create_datalink(softmac)) != 0) {
913 if (!(softmac->smac_flags & SOFTMAC_NOSUPP))
914 (void) mac_unregister(softmac->smac_mh);
915 mutex_enter(&softmac->smac_mutex);
916 softmac->smac_mh = NULL;
923 mutex_enter(&softmac->smac_mutex);
924 if (softmac->smac_mh != NULL) {
925 softmac->smac_notify_thread = thread_create(NULL, 0,
926 softmac_notify_thread, softmac, 0, &p0,
931 ASSERT(softmac->smac_state == SOFTMAC_ATTACH_INPROG &&
932 softmac->smac_attachok_cnt == softmac->smac_cnt);
933 softmac->smac_state = SOFTMAC_ATTACH_DONE;
934 softmac->smac_attacherr = err;
935 cv_broadcast(&softmac->smac_cv);
936 mutex_exit(&softmac->smac_mutex);
943 softmac_t *softmac;
975 * for the same softmac. The softmac found out from the modhash
980 (mod_hash_val_t *)&softmac);
983 mutex_enter(&softmac->smac_mutex);
984 SOFTMAC_STATE_VERIFY(softmac);
987 * Fail the predetach routine if this softmac is in-use.
993 if ((softmac->smac_hold_cnt != 0) ||
994 (softmac->smac_state == SOFTMAC_ATTACH_INPROG)) {
995 softmac->smac_attached_left = softmac->smac_attachok_cnt;
996 mutex_exit(&softmac->smac_mutex);
1006 if (softmac->smac_attached_left != 0) {
1007 mutex_exit(&softmac->smac_mutex);
1011 smac_mh = softmac->smac_mh;
1012 smac_flags = softmac->smac_flags;
1013 softmac->smac_state = SOFTMAC_DETACH_INPROG;
1014 mutex_exit(&softmac->smac_mutex);
1019 * softmac.
1021 ASSERT(softmac->smac_attachok_cnt == softmac->smac_cnt);
1042 mutex_enter(&softmac->smac_mutex);
1043 softmac->smac_flags |= SOFTMAC_NOTIFY_QUIT;
1044 cv_broadcast(&softmac->smac_cv);
1045 while (softmac->smac_notify_thread != NULL) {
1046 cv_wait(&softmac->smac_cv,
1047 &softmac->smac_mutex);
1049 mutex_exit(&softmac->smac_mutex);
1052 softmac->smac_mh = NULL;
1059 mutex_enter(&softmac->smac_mutex);
1061 ASSERT(softmac->smac_state == SOFTMAC_DETACH_INPROG &&
1062 softmac->smac_attachok_cnt != 0);
1063 softmac->smac_mh = NULL;
1065 softmac_dev = softmac->smac_softmac[index];
1067 softmac->smac_softmac[index] = NULL;
1070 if (--softmac->smac_attachok_cnt == 0) {
1073 softmac->smac_state = SOFTMAC_UNINIT;
1074 if (softmac->smac_hold_cnt != 0) {
1077 * the locks. Leave the softmac itself intact which
1080 mutex_exit(&softmac->smac_mutex);
1089 mutex_exit(&softmac->smac_mutex);
1091 ASSERT(softmac->smac_fp_disable_clients == 0);
1092 softmac->smac_fastpath_admin_disabled = B_FALSE;
1093 kmem_cache_free(softmac_cachep, softmac);
1096 mutex_exit(&softmac->smac_mutex);
1101 mutex_enter(&softmac->smac_mutex);
1102 softmac->smac_attached_left = softmac->smac_attachok_cnt;
1103 softmac->smac_state = SOFTMAC_ATTACH_DONE;
1104 cv_broadcast(&softmac->smac_cv);
1105 mutex_exit(&softmac->smac_mutex);
1112 * We walk through every softmac that was created but failed to notify
1122 softmac_t *softmac = (softmac_t *)val;
1135 mutex_enter(&softmac->smac_mutex);
1136 SOFTMAC_STATE_VERIFY(softmac);
1137 if (softmac->smac_state == SOFTMAC_ATTACH_INPROG) {
1140 * Hold the softmac to ensure it stays around. The wait itself
1146 smwp->smw_softmac = softmac;
1147 softmac->smac_hold_cnt++;
1151 if ((softmac->smac_state != SOFTMAC_ATTACH_DONE) ||
1152 !(softmac->smac_flags & SOFTMAC_NEED_RECREATE)) {
1153 mutex_exit(&softmac->smac_mutex);
1163 softmac->smac_hold_cnt++;
1164 mutex_exit(&softmac->smac_mutex);
1166 if (dls_mgmt_create(softmac->smac_devname,
1167 makedevice(softmac->smac_umajor, softmac->smac_uppa + 1),
1168 DATALINK_CLASS_PHYS, softmac->smac_media, B_TRUE, &linkid) != 0) {
1169 softmac_rele_device((dls_dev_handle_t)softmac);
1173 if ((err = softmac_update_info(softmac, &linkid)) != 0) {
1174 cmn_err(CE_WARN, "softmac: softmac_update_info() for %s "
1175 "failed (%d)", softmac->smac_devname, err);
1176 softmac_rele_device((dls_dev_handle_t)softmac);
1184 if (!(softmac->smac_flags & SOFTMAC_NOSUPP)) {
1185 err = dls_devnet_recreate(softmac->smac_mh, linkid);
1187 cmn_err(CE_WARN, "softmac: dls_devnet_recreate() for "
1189 softmac->smac_devname, linkid, err);
1193 mutex_enter(&softmac->smac_mutex);
1194 softmac->smac_flags &= ~SOFTMAC_NEED_RECREATE;
1195 ASSERT(softmac->smac_hold_cnt != 0);
1196 softmac->smac_hold_cnt--;
1197 mutex_exit(&softmac->smac_mutex);
1209 softmac_t *softmac;
1223 * finished and the softmac is not yet in the
1226 softmac = smw.smw_softmac;
1227 cv_wait(&softmac->smac_cv, &softmac->smac_mutex);
1228 softmac->smac_hold_cnt--;
1229 mutex_exit(&softmac->smac_mutex);
1237 softmac_t *softmac = arg;
1238 softmac_lower_t *slp = softmac->smac_lower;
1241 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1247 err = softmac_send_bind_req(slp, softmac->smac_media == DL_TPR ? 2 : 0);
1281 softmac_t *softmac = arg;
1282 softmac_lower_t *slp = softmac->smac_lower;
1284 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1307 * the softmac upper-stream.
1310 softmac_lower_setup(softmac_t *softmac, softmac_upper_t *sup,
1328 * need any protection to access softmac here.
1330 dev = softmac->smac_dev;
1339 * be pushed when the softmac node is opened.
1344 if ((softmac->smac_style == DL_STYLE2) &&
1345 ((err = dl_attach(lh, softmac->smac_uppa, NULL)) != 0)) {
1359 * Then push the softmac shim layer atop the lower stream.
1381 slp->sl_softmac = softmac;
1396 (notifications & softmac->smac_notifications));
1408 softmac_t *softmac = arg;
1412 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1414 if ((err = softmac_lower_setup(softmac, NULL, &slp)) != 0)
1417 softmac->smac_lower = slp;
1424 softmac_t *softmac = arg;
1427 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1428 slp = softmac->smac_lower;
1435 softmac->smac_lower = NULL;
1460 softmac_t *softmac = arg;
1466 return (softmac_datapath_switch(softmac, B_TRUE, B_TRUE));
1468 return (softmac_datapath_switch(softmac, B_FALSE, B_TRUE));
1477 softmac_t *softmac = arg;
1484 mutex_enter(&softmac->smac_fp_mutex);
1485 fpstr = (DATAPATH_MODE(softmac) == SOFTMAC_SLOWPATH) ?
1487 mutex_exit(&softmac->smac_fp_mutex);
1489 fpstr = softmac->smac_fastpath_admin_disabled ?
1522 softmac_t *softmac;
1549 * and ensure that the softmac entry gets created in net_postattach().
1567 /* Now wait for its softmac to be created. */
1574 (mod_hash_val_t *)&softmac) != 0) {
1577 * routine of the device succeeds. But the softmac will then
1591 mutex_enter(&softmac->smac_mutex);
1592 softmac->smac_hold_cnt++;
1598 while (softmac->smac_state != SOFTMAC_ATTACH_DONE)
1599 cv_wait(&softmac->smac_cv, &softmac->smac_mutex);
1601 SOFTMAC_STATE_VERIFY(softmac);
1603 if ((err = softmac->smac_attacherr) != 0)
1604 softmac->smac_hold_cnt--;
1606 *ddhp = (dls_dev_handle_t)softmac;
1607 mutex_exit(&softmac->smac_mutex);
1623 softmac_t *softmac;
1636 softmac = (softmac_t *)mac_driver(mh);
1638 mutex_enter(&softmac->smac_mutex);
1639 softmac->smac_hold_cnt++;
1640 mutex_exit(&softmac->smac_mutex);
1642 *softmacp = softmac;
1647 softmac_rele(softmac_t *softmac)
1649 mutex_enter(&softmac->smac_mutex);
1650 softmac->smac_hold_cnt--;
1651 mutex_exit(&softmac->smac_mutex);