Lines Matching defs: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_state == SOFTMAC_INITIALIZED);
147 ASSERT(softmac->smac_lower == NULL);
148 ASSERT(softmac->smac_active == B_FALSE);
149 ASSERT(softmac->smac_nactive == 0);
150 ASSERT(list_is_empty(&softmac->smac_sup_list));
152 list_destroy(&softmac->smac_sup_list);
153 mutex_destroy(&softmac->smac_mutex);
154 mutex_destroy(&softmac->smac_active_mutex);
155 mutex_destroy(&softmac->smac_fp_mutex);
156 cv_destroy(&softmac->smac_cv);
157 cv_destroy(&softmac->smac_fp_cv);
224 * softmac state machine
264 softmac_state_verify(softmac_t *softmac)
266 ASSERT(MUTEX_HELD(&softmac->smac_mutex));
271 ASSERT(softmac->smac_cnt <= 2 && softmac->smac_attachok_cnt <= 2);
278 ASSERT(softmac->smac_attachok_cnt == SMAC_NONZERO_NODECNT(softmac));
284 ASSERT(softmac->smac_state != SOFTMAC_ATTACH_DONE ||
285 softmac->smac_attachok_cnt == softmac->smac_cnt);
287 if (softmac->smac_attachok_cnt == 0) {
288 ASSERT(softmac->smac_state == SOFTMAC_UNINIT);
289 ASSERT(softmac->smac_mh == NULL);
290 } else if (softmac->smac_attachok_cnt < softmac->smac_cnt) {
291 ASSERT(softmac->smac_state == SOFTMAC_ATTACH_INPROG ||
292 softmac->smac_state == SOFTMAC_DETACH_INPROG);
293 ASSERT(softmac->smac_mh == NULL);
302 ASSERT(softmac->smac_attachok_cnt == softmac->smac_cnt);
303 ASSERT(softmac->smac_state != SOFTMAC_UNINIT);
305 if (softmac->smac_mh != NULL)
306 ASSERT(softmac->smac_attachok_cnt == softmac->smac_cnt);
311 #define SOFTMAC_STATE_VERIFY(softmac) softmac_state_verify(softmac)
313 #define SOFTMAC_STATE_VERIFY(softmac)
320 softmac_t *softmac;
326 * Force the softmac driver to be attached.
329 cmn_err(CE_WARN, "softmac_create:softmac attach fails");
378 * Check whether the softmac for the specified device already exists
382 (mod_hash_val_t *)&softmac)) != 0) {
384 softmac = kmem_cache_alloc(softmac_cachep, KM_SLEEP);
385 (void) strlcpy(softmac->smac_devname, devname, MAXNAMELEN);
388 (mod_hash_key_t)softmac->smac_devname,
389 (mod_hash_val_t)softmac);
396 mutex_enter(&softmac->smac_mutex);
397 SOFTMAC_STATE_VERIFY(softmac);
398 if (softmac->smac_state != SOFTMAC_ATTACH_DONE)
399 softmac->smac_state = SOFTMAC_ATTACH_INPROG;
400 if (softmac->smac_attachok_cnt == 0) {
402 * Initialize the softmac if this is the post-attach of the
405 softmac->smac_flags = 0;
406 softmac->smac_umajor = ddi_driver_major(dip);
407 softmac->smac_uppa = ppa;
415 softmac->smac_flags |= SOFTMAC_GLDV3;
416 softmac->smac_cnt = 1;
418 softmac->smac_cnt =
424 if (softmac->smac_softmac[index] != NULL) {
431 ASSERT(softmac->smac_attached_left != 0);
432 softmac->smac_attached_left--;
433 mutex_exit(&softmac->smac_mutex);
438 mutex_exit(&softmac->smac_mutex);
444 mutex_enter(&softmac->smac_mutex);
445 softmac->smac_softmac[index] = softmac_dev;
450 if (++softmac->smac_attachok_cnt != softmac->smac_cnt) {
451 mutex_exit(&softmac->smac_mutex);
475 softmac, TQ_SLEEP);
476 mutex_exit(&softmac->smac_mutex);
483 softmac_t *softmac = arg;
485 if (!(softmac->smac_capab_flags & cap))
492 *txflags = softmac->smac_hcksum_txflags;
504 legacy->ml_unsup_note = ~softmac->smac_notifications &
510 legacy->ml_dev = makedevice(softmac->smac_umajor,
511 softmac->smac_uppa + 1);
528 softmac_update_info(softmac_t *softmac, datalink_id_t *linkidp)
534 if ((err = dls_mgmt_update(softmac->smac_devname, softmac->smac_media,
535 softmac->smac_flags & SOFTMAC_NOSUPP, &media, &linkid)) == 0) {
552 if (media != softmac->smac_media) {
555 dl_mactypestr(softmac->smac_media),
556 softmac->smac_devname, dl_mactypestr(media),
557 softmac->smac_devname);
561 softmac->smac_devname);
566 "for use.", softmac->smac_devname);
579 softmac_create_datalink(softmac_t *softmac)
591 err = dls_mgmt_create(softmac->smac_devname,
592 makedevice(softmac->smac_umajor, softmac->smac_uppa + 1),
601 ((err = softmac_update_info(softmac, &linkid)) != 0)) {
608 if (!(softmac->smac_flags & SOFTMAC_NOSUPP)) {
609 err = dls_devnet_create(softmac->smac_mh, linkid,
613 softmac->smac_devname);
619 mutex_enter(&softmac->smac_mutex);
620 softmac->smac_flags |= SOFTMAC_NEED_RECREATE;
621 mutex_exit(&softmac->smac_mutex);
630 softmac_t *softmac = arg;
634 if (!GLDV3_DRV(softmac->smac_umajor)) {
635 softmac_mac_register(softmac);
639 if ((err = mac_open(softmac->smac_devname, &mh)) != 0)
642 mutex_enter(&softmac->smac_mutex);
643 softmac->smac_media = (mac_info(mh))->mi_nativemedia;
644 softmac->smac_mh = mh;
645 mutex_exit(&softmac->smac_mutex);
650 * the device detaches, and the softmac will be destroyed
658 err = softmac_create_datalink(softmac);
661 mutex_enter(&softmac->smac_mutex);
663 softmac->smac_mh = NULL;
664 softmac->smac_attacherr = err;
665 softmac->smac_state = SOFTMAC_ATTACH_DONE;
666 cv_broadcast(&softmac->smac_cv);
667 mutex_exit(&softmac->smac_mutex);
677 softmac_mac_register(softmac_t *softmac)
688 * Note that we do not need any locks to access this softmac pointer,
691 ASSERT(softmac != NULL);
692 ASSERT(softmac->smac_state == SOFTMAC_ATTACH_INPROG &&
693 softmac->smac_attachok_cnt == softmac->smac_cnt);
696 mutex_enter(&softmac->smac_mutex);
705 dev = makedevice(ddi_name_to_major("clone"), softmac->smac_umajor);
708 if (dl_attach(lh, softmac->smac_uppa + 1 * 1000, NULL) == 0)
722 if ((softmac_dev = softmac->smac_softmac[index]) == NULL)
725 softmac->smac_dev = dev = softmac_dev->sd_dev;
741 cmn_err(CE_NOTE, "softmac: received "
755 if ((softmac->smac_media = dlia.dl_mac_type) != DL_ETHER) {
762 (dl_attach(lh, softmac->smac_uppa, NULL) != 0)) {
769 cmn_err(CE_NOTE, "softmac: received "
782 softmac->smac_addrlen = sizeof (softmac->smac_unicst_addr);
783 if ((rval = dl_info(lh, &dlia, softmac->smac_unicst_addr,
784 &softmac->smac_addrlen, &dlea)) != 0) {
786 cmn_err(CE_NOTE, "softmac: received "
795 softmac->smac_style = dlia.dl_provider_style;
796 softmac->smac_saplen = ABS(dlia.dl_sap_length);
797 softmac->smac_min_sdu = dlia.dl_min_sdu;
798 softmac->smac_max_sdu = dlia.dl_max_sdu;
800 if ((softmac->smac_saplen != sizeof (uint16_t)) ||
801 (softmac->smac_addrlen != ETHERADDRL) ||
814 softmac->smac_capab_flags =
817 softmac->smac_no_capability_req = B_FALSE;
818 if (softmac_fill_capab(lh, softmac) != 0)
819 softmac->smac_no_capability_req = B_TRUE;
829 softmac->smac_margin = 0;
833 softmac->smac_margin = margin;
841 if (softmac->smac_margin == 0)
842 softmac->smac_margin = VLAN_TAGSZ;
844 softmac->smac_capab_flags |= MAC_CAPAB_NO_NATIVEVLAN;
850 softmac->smac_notifications = 0;
854 softmac->smac_notifications = notes;
869 mutex_enter(&softmac->smac_mutex);
874 if (softmac->smac_media != DL_ETHER)
875 softmac->smac_flags |= SOFTMAC_NOSUPP;
881 if (!(softmac->smac_flags & SOFTMAC_NOSUPP)) {
890 macp->m_driver = softmac;
893 macp->m_margin = softmac->smac_margin;
894 macp->m_src_addr = softmac->smac_unicst_addr;
895 macp->m_min_sdu = softmac->smac_min_sdu;
896 macp->m_max_sdu = softmac->smac_max_sdu;
900 err = mac_register(macp, &softmac->smac_mh);
904 softmac->smac_devname);
908 mutex_exit(&softmac->smac_mutex);
911 * Try to create the datalink for this softmac.
913 if ((err = softmac_create_datalink(softmac)) != 0) {
914 if (!(softmac->smac_flags & SOFTMAC_NOSUPP))
915 (void) mac_unregister(softmac->smac_mh);
916 mutex_enter(&softmac->smac_mutex);
917 softmac->smac_mh = NULL;
924 mutex_enter(&softmac->smac_mutex);
925 if (softmac->smac_mh != NULL) {
926 softmac->smac_notify_thread = thread_create(NULL, 0,
927 softmac_notify_thread, softmac, 0, &p0,
932 ASSERT(softmac->smac_state == SOFTMAC_ATTACH_INPROG &&
933 softmac->smac_attachok_cnt == softmac->smac_cnt);
934 softmac->smac_state = SOFTMAC_ATTACH_DONE;
935 softmac->smac_attacherr = err;
936 cv_broadcast(&softmac->smac_cv);
937 mutex_exit(&softmac->smac_mutex);
944 softmac_t *softmac;
976 * for the same softmac. The softmac found out from the modhash
981 (mod_hash_val_t *)&softmac);
984 mutex_enter(&softmac->smac_mutex);
985 SOFTMAC_STATE_VERIFY(softmac);
988 * Fail the predetach routine if this softmac is in-use.
994 if ((softmac->smac_hold_cnt != 0) ||
995 (softmac->smac_state == SOFTMAC_ATTACH_INPROG)) {
996 softmac->smac_attached_left = softmac->smac_attachok_cnt;
997 mutex_exit(&softmac->smac_mutex);
1007 if (softmac->smac_attached_left != 0) {
1008 mutex_exit(&softmac->smac_mutex);
1012 smac_mh = softmac->smac_mh;
1013 smac_flags = softmac->smac_flags;
1014 softmac->smac_state = SOFTMAC_DETACH_INPROG;
1015 mutex_exit(&softmac->smac_mutex);
1020 * softmac.
1022 ASSERT(softmac->smac_attachok_cnt == softmac->smac_cnt);
1043 mutex_enter(&softmac->smac_mutex);
1044 softmac->smac_flags |= SOFTMAC_NOTIFY_QUIT;
1045 cv_broadcast(&softmac->smac_cv);
1046 while (softmac->smac_notify_thread != NULL) {
1047 cv_wait(&softmac->smac_cv,
1048 &softmac->smac_mutex);
1050 mutex_exit(&softmac->smac_mutex);
1053 softmac->smac_mh = NULL;
1060 mutex_enter(&softmac->smac_mutex);
1062 ASSERT(softmac->smac_state == SOFTMAC_DETACH_INPROG &&
1063 softmac->smac_attachok_cnt != 0);
1064 softmac->smac_mh = NULL;
1066 softmac_dev = softmac->smac_softmac[index];
1068 softmac->smac_softmac[index] = NULL;
1071 if (--softmac->smac_attachok_cnt == 0) {
1074 softmac->smac_state = SOFTMAC_UNINIT;
1075 if (softmac->smac_hold_cnt != 0) {
1078 * the locks. Leave the softmac itself intact which
1081 mutex_exit(&softmac->smac_mutex);
1090 mutex_exit(&softmac->smac_mutex);
1092 ASSERT(softmac->smac_fp_disable_clients == 0);
1093 softmac->smac_fastpath_admin_disabled = B_FALSE;
1094 kmem_cache_free(softmac_cachep, softmac);
1097 mutex_exit(&softmac->smac_mutex);
1102 mutex_enter(&softmac->smac_mutex);
1103 softmac->smac_attached_left = softmac->smac_attachok_cnt;
1104 softmac->smac_state = SOFTMAC_ATTACH_DONE;
1105 cv_broadcast(&softmac->smac_cv);
1106 mutex_exit(&softmac->smac_mutex);
1113 * We walk through every softmac that was created but failed to notify
1123 softmac_t *softmac = (softmac_t *)val;
1136 mutex_enter(&softmac->smac_mutex);
1137 SOFTMAC_STATE_VERIFY(softmac);
1138 if (softmac->smac_state == SOFTMAC_ATTACH_INPROG) {
1141 * Hold the softmac to ensure it stays around. The wait itself
1147 smwp->smw_softmac = softmac;
1148 softmac->smac_hold_cnt++;
1152 if ((softmac->smac_state != SOFTMAC_ATTACH_DONE) ||
1153 !(softmac->smac_flags & SOFTMAC_NEED_RECREATE)) {
1154 mutex_exit(&softmac->smac_mutex);
1164 softmac->smac_hold_cnt++;
1165 mutex_exit(&softmac->smac_mutex);
1167 if (dls_mgmt_create(softmac->smac_devname,
1168 makedevice(softmac->smac_umajor, softmac->smac_uppa + 1),
1169 DATALINK_CLASS_PHYS, softmac->smac_media, B_TRUE, &linkid) != 0) {
1170 softmac_rele_device((dls_dev_handle_t)softmac);
1174 if ((err = softmac_update_info(softmac, &linkid)) != 0) {
1175 cmn_err(CE_WARN, "softmac: softmac_update_info() for %s "
1176 "failed (%d)", softmac->smac_devname, err);
1177 softmac_rele_device((dls_dev_handle_t)softmac);
1185 if (!(softmac->smac_flags & SOFTMAC_NOSUPP)) {
1186 err = dls_devnet_recreate(softmac->smac_mh, linkid);
1188 cmn_err(CE_WARN, "softmac: dls_devnet_recreate() for "
1190 softmac->smac_devname, linkid, err);
1194 mutex_enter(&softmac->smac_mutex);
1195 softmac->smac_flags &= ~SOFTMAC_NEED_RECREATE;
1196 ASSERT(softmac->smac_hold_cnt != 0);
1197 softmac->smac_hold_cnt--;
1198 mutex_exit(&softmac->smac_mutex);
1210 softmac_t *softmac;
1224 * finished and the softmac is not yet in the
1227 softmac = smw.smw_softmac;
1228 cv_wait(&softmac->smac_cv, &softmac->smac_mutex);
1229 softmac->smac_hold_cnt--;
1230 mutex_exit(&softmac->smac_mutex);
1238 softmac_t *softmac = arg;
1239 softmac_lower_t *slp = softmac->smac_lower;
1242 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1248 err = softmac_send_bind_req(slp, softmac->smac_media == DL_TPR ? 2 : 0);
1282 softmac_t *softmac = arg;
1283 softmac_lower_t *slp = softmac->smac_lower;
1285 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1308 * the softmac upper-stream.
1311 softmac_lower_setup(softmac_t *softmac, softmac_upper_t *sup,
1329 * need any protection to access softmac here.
1331 dev = softmac->smac_dev;
1340 * be pushed when the softmac node is opened.
1345 if ((softmac->smac_style == DL_STYLE2) &&
1346 ((err = dl_attach(lh, softmac->smac_uppa, NULL)) != 0)) {
1360 * Then push the softmac shim layer atop the lower stream.
1382 slp->sl_softmac = softmac;
1397 (notifications & softmac->smac_notifications));
1409 softmac_t *softmac = arg;
1413 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1415 if ((err = softmac_lower_setup(softmac, NULL, &slp)) != 0)
1418 softmac->smac_lower = slp;
1425 softmac_t *softmac = arg;
1428 ASSERT(MAC_PERIM_HELD(softmac->smac_mh));
1429 slp = softmac->smac_lower;
1436 softmac->smac_lower = NULL;
1461 softmac_t *softmac = arg;
1467 return (softmac_datapath_switch(softmac, B_TRUE, B_TRUE));
1469 return (softmac_datapath_switch(softmac, B_FALSE, B_TRUE));
1478 softmac_t *softmac = arg;
1485 mutex_enter(&softmac->smac_fp_mutex);
1486 fpstr = (DATAPATH_MODE(softmac) == SOFTMAC_SLOWPATH) ?
1488 mutex_exit(&softmac->smac_fp_mutex);
1490 fpstr = softmac->smac_fastpath_admin_disabled ?
1523 softmac_t *softmac;
1550 * and ensure that the softmac entry gets created in net_postattach().
1568 /* Now wait for its softmac to be created. */
1575 (mod_hash_val_t *)&softmac) != 0) {
1578 * routine of the device succeeds. But the softmac will then
1592 mutex_enter(&softmac->smac_mutex);
1593 softmac->smac_hold_cnt++;
1599 while (softmac->smac_state != SOFTMAC_ATTACH_DONE)
1600 cv_wait(&softmac->smac_cv, &softmac->smac_mutex);
1602 SOFTMAC_STATE_VERIFY(softmac);
1604 if ((err = softmac->smac_attacherr) != 0)
1605 softmac->smac_hold_cnt--;
1607 *ddhp = (dls_dev_handle_t)softmac;
1608 mutex_exit(&softmac->smac_mutex);
1624 softmac_t *softmac;
1637 softmac = (softmac_t *)mac_driver(mh);
1639 mutex_enter(&softmac->smac_mutex);
1640 softmac->smac_hold_cnt++;
1641 mutex_exit(&softmac->smac_mutex);
1643 *softmacp = softmac;
1648 softmac_rele(softmac_t *softmac)
1650 mutex_enter(&softmac->smac_mutex);
1651 softmac->smac_hold_cnt--;
1652 mutex_exit(&softmac->smac_mutex);