Lines Matching defs:ifm

124 ifmedia_lock_for_legacy(struct ifmedia *ifm)
129 if (mutex_tryenter(ifm->ifm_lock)) {
135 if ((ifm->ifm_legacy & IFM_L_CPU_MASK) == ci) {
136 cnt = ifm->ifm_legacy & IFM_L_COUNT_MASK;
144 mutex_enter(ifm->ifm_lock);
149 ifm->ifm_legacy = ci | cnt;
153 ifmedia_unlock_for_legacy(struct ifmedia *ifm)
159 KASSERT((ifm->ifm_legacy & IFM_L_CPU_MASK) == ci);
160 cnt = ifm->ifm_legacy & IFM_L_COUNT_MASK;
163 ifm->ifm_legacy = IFM_L_OWNLOCK;
164 mutex_exit(ifm->ifm_lock);
168 ifm->ifm_legacy = ci | cnt;
175 ifmedia_init_with_lock(struct ifmedia *ifm, int dontcare_mask,
188 TAILQ_INIT(&ifm->ifm_list);
189 ifm->ifm_cur = NULL;
190 ifm->ifm_media = IFM_NONE;
191 ifm->ifm_mask = dontcare_mask; /* IF don't-care bits */
192 ifm->ifm_change = change_callback;
193 ifm->ifm_status = status_callback;
194 ifm->ifm_legacy = 0;
206 ifm->ifm_legacy = IFM_L_OWNLOCK;
208 ifm->ifm_lock = lock;
212 ifmedia_init(struct ifmedia *ifm, int dontcare_mask,
215 ifmedia_init_with_lock(ifm, dontcare_mask, change_callback,
223 ifmedia_fini(struct ifmedia *ifm)
226 ifmedia_removeall(ifm);
228 if (ifm->ifm_legacy) {
229 KASSERT(ifm->ifm_legacy == IFM_L_OWNLOCK);
230 mutex_obj_free(ifm->ifm_lock);
232 ifm->ifm_legacy = 0;
233 ifm->ifm_lock = NULL;
237 ifmedia_change(struct ifmedia *ifm, struct ifnet *ifp)
241 IFMEDIA_LOCK_FOR_LEGACY(ifm);
242 KASSERT(ifmedia_locked(ifm));
243 if (ifm->ifm_change)
244 rv = (*ifm->ifm_change)(ifp);
247 IFMEDIA_UNLOCK_FOR_LEGACY(ifm);
253 ifmedia_status(struct ifmedia *ifm, struct ifnet *ifp, struct ifmediareq *ifmr)
256 KASSERT(ifmedia_locked(ifm));
257 if (ifm->ifm_status == NULL)
259 (*ifm->ifm_status)(ifp, ifmr);
267 ifmedia_add_entry(struct ifmedia *ifm, int mword, int data, void *aux,
273 if (ifm == NULL) {
274 printf("ifmedia_add: null ifm\n");
285 TAILQ_INSERT_TAIL(&ifm->ifm_list, entry, ifm_list);
289 ifmedia_add(struct ifmedia *ifm, int mword, int data, void *aux)
294 ifmedia_lock(ifm);
295 ifmedia_add_entry(ifm, mword, data, aux, entry);
296 ifmedia_unlock(ifm);
304 ifmedia_list_add(struct ifmedia *ifm, struct ifmedia_entry *lp, int count)
309 ifmedia_add(ifm, lp[i].ifm_media, lp[i].ifm_data,
321 ifmedia_set(struct ifmedia *ifm, int target)
325 ifmedia_lock(ifm);
326 match = ifmedia_match_locked(ifm, target, ifm->ifm_mask);
344 target, ~ifm->ifm_mask);
346 match = ifmedia_match_locked(ifm, target, ifm->ifm_mask);
348 ifmedia_unlock(ifm);
350 ifmedia_lock(ifm);
351 match = ifmedia_match_locked(ifm, target,
352 ifm->ifm_mask);
354 ifmedia_add_entry(ifm, target, 0, NULL, entry);
357 match = ifmedia_match_locked(ifm, target,
358 ifm->ifm_mask);
363 ifm->ifm_cur = match;
364 ifmedia_unlock(ifm);
374 ifmedia_printword(ifm->ifm_cur->ifm_media);
380 ifmedia_getwords(struct ifmedia * const ifm, int *words, int maxwords)
385 KASSERT(ifmedia_locked(ifm));
387 TAILQ_FOREACH(ep, &ifm->ifm_list, ifm_list) {
397 #define IFMEDIA_IOCTL_LOCK(ifm) \
399 if (ifmedia_islegacy(ifm)) \
400 ifmedia_lock_for_legacy(ifm); \
402 ifmedia_lock(ifm); \
405 #define IFMEDIA_IOCTL_UNLOCK(ifm) \
407 if (ifmedia_islegacy(ifm)) \
408 ifmedia_unlock_for_legacy(ifm); \
410 ifmedia_unlock(ifm); \
417 ifmedia_ioctl(struct ifnet *ifp, struct ifreq *ifr, struct ifmedia *ifm,
424 if (ifp == NULL || ifr == NULL || ifm == NULL)
436 IFMEDIA_IOCTL_LOCK(ifm);
438 match = ifmedia_match_locked(ifm, newmedia, ifm->ifm_mask);
446 IFMEDIA_IOCTL_UNLOCK(ifm);
458 (newmedia == ifm->ifm_media) && (match == ifm->ifm_cur)) {
459 IFMEDIA_IOCTL_UNLOCK(ifm);
475 oldentry = ifm->ifm_cur;
476 oldmedia = ifm->ifm_media;
477 ifm->ifm_cur = match;
478 ifm->ifm_media = newmedia;
479 error = ifmedia_change(ifm, ifp);
481 ifm->ifm_cur = oldentry;
482 ifm->ifm_media = oldmedia;
484 IFMEDIA_IOCTL_UNLOCK(ifm);
498 IFMEDIA_IOCTL_LOCK(ifm);
499 ifmr->ifm_active = ifmr->ifm_current = ifm->ifm_cur ?
500 ifm->ifm_cur->ifm_media : IFM_NONE;
501 ifmr->ifm_mask = ifm->ifm_mask;
503 ifmedia_status(ifm, ifp, ifmr);
509 nwords1 = nwords2 = ifmedia_getwords(ifm, NULL, 0);
510 IFMEDIA_IOCTL_UNLOCK(ifm);
517 ifmedia_lock(ifm);
518 nwords2 = ifmedia_getwords(ifm, kptr, maxwords);
519 ifmedia_unlock(ifm);
542 * Find media entry matching a given ifm word.
545 ifmedia_match_locked(struct ifmedia *ifm, u_int target, u_int mask)
552 TAILQ_FOREACH(next, &ifm->ifm_list, ifm_list) {
570 ifmedia_match(struct ifmedia *ifm, u_int target, u_int mask)
579 ifmedia_lock(ifm);
580 match = ifmedia_match_locked(ifm, target, mask);
581 ifmedia_unlock(ifm);
589 ifmedia_delete_instance(struct ifmedia *ifm, u_int inst)
596 ifmedia_lock(ifm);
597 TAILQ_FOREACH_SAFE(ife, &ifm->ifm_list, ifm_list, nife) {
600 if (ifm->ifm_cur == ife) {
601 ifm->ifm_cur = NULL;
602 ifm->ifm_media = IFM_NONE;
604 TAILQ_REMOVE(&ifm->ifm_list, ife, ifm_list);
608 ifmedia_unlock(ifm);
617 ifmedia_removeall(struct ifmedia *ifm)
620 ifmedia_delete_instance(ifm, IFM_INST_ANY);