Lines Matching refs:mh
189 _mii_error(mii_handle_t mh, int errno) in _mii_error() argument
195 if (mh->m_error != errno) { in _mii_error()
196 cmn_err(CE_WARN, "%s: %s", mh->m_name, mii_errors[errno]); in _mii_error()
197 mh->m_error = errno; in _mii_error()
223 mii_handle_t mh; in mii_alloc_instance() local
231 mh = kmem_zalloc(sizeof (*mh), KM_SLEEP); in mii_alloc_instance()
233 (void) snprintf(mh->m_name, sizeof (mh->m_name), "%s%d", in mii_alloc_instance()
239 mh->m_dip = dip; in mii_alloc_instance()
240 mh->m_ops = *ops; in mii_alloc_instance()
241 mh->m_private = private; in mii_alloc_instance()
242 mh->m_suspended = B_FALSE; in mii_alloc_instance()
243 mh->m_started = B_FALSE; in mii_alloc_instance()
244 mh->m_tstate = MII_STATE_PROBE; in mii_alloc_instance()
245 mh->m_link = LINK_STATE_UNKNOWN; in mii_alloc_instance()
246 mh->m_error = MII_EOK; in mii_alloc_instance()
247 mh->m_addr = -1; in mii_alloc_instance()
248 mutex_init(&mh->m_lock, NULL, MUTEX_DRIVER, NULL); in mii_alloc_instance()
249 cv_init(&mh->m_cv, NULL, CV_DRIVER, NULL); in mii_alloc_instance()
251 mh->m_tq = ddi_taskq_create(dip, tqname, 1, TASKQ_DEFAULTPRI, 0); in mii_alloc_instance()
252 if (mh->m_tq == NULL) { in mii_alloc_instance()
255 cv_destroy(&mh->m_cv); in mii_alloc_instance()
256 mutex_destroy(&mh->m_lock); in mii_alloc_instance()
257 kmem_free(mh, sizeof (*mh)); in mii_alloc_instance()
266 mh->m_en_aneg = GETPROP("adv_autoneg_cap"); in mii_alloc_instance()
267 mh->m_en_10_hdx = GETPROP("adv_10hdx_cap"); in mii_alloc_instance()
268 mh->m_en_10_fdx = GETPROP("adv_10fdx_cap"); in mii_alloc_instance()
269 mh->m_en_100_hdx = GETPROP("adv_100hdx_cap"); in mii_alloc_instance()
270 mh->m_en_100_fdx = GETPROP("adv_100fdx_cap"); in mii_alloc_instance()
271 mh->m_en_100_t4 = GETPROP("adv_100T4_cap"); in mii_alloc_instance()
272 mh->m_en_1000_hdx = GETPROP("adv_1000hdx_cap"); in mii_alloc_instance()
273 mh->m_en_1000_fdx = GETPROP("adv_1000fdx_cap"); in mii_alloc_instance()
275 mh->m_cap_pause = B_FALSE; in mii_alloc_instance()
276 mh->m_cap_asmpause = B_FALSE; in mii_alloc_instance()
278 bzero(&mh->m_bogus_phy, sizeof (mh->m_bogus_phy)); in mii_alloc_instance()
279 mh->m_bogus_phy.phy_link = LINK_STATE_UNKNOWN; in mii_alloc_instance()
280 mh->m_bogus_phy.phy_duplex = LINK_DUPLEX_UNKNOWN; in mii_alloc_instance()
281 mh->m_bogus_phy.phy_addr = 0xff; in mii_alloc_instance()
282 mh->m_bogus_phy.phy_type = XCVR_NONE; in mii_alloc_instance()
283 mh->m_bogus_phy.phy_id = (uint32_t)-1; in mii_alloc_instance()
284 mh->m_bogus_phy.phy_loopback = PHY_LB_NONE; in mii_alloc_instance()
285 mh->m_bogus_phy.phy_flowctrl = LINK_FLOWCTRL_NONE; in mii_alloc_instance()
286 mh->m_phy = &mh->m_bogus_phy; in mii_alloc_instance()
289 mh->m_phys[i].phy_mii = mh; in mii_alloc_instance()
291 mh->m_bogus_phy.phy_mii = mh; in mii_alloc_instance()
293 return (mh); in mii_alloc_instance()
303 mii_set_pauseable(mii_handle_t mh, boolean_t pauseable, boolean_t asymetric) in mii_set_pauseable() argument
307 mutex_enter(&mh->m_lock); in mii_set_pauseable()
308 ph = mh->m_phy; in mii_set_pauseable()
309 ph->phy_cap_pause = mh->m_cap_pause = pauseable; in mii_set_pauseable()
310 ph->phy_cap_asmpause = mh->m_cap_asmpause = asymetric; in mii_set_pauseable()
312 mh->m_en_flowctrl = LINK_FLOWCTRL_BI; in mii_set_pauseable()
314 mh->m_en_flowctrl = LINK_FLOWCTRL_NONE; in mii_set_pauseable()
316 mutex_exit(&mh->m_lock); in mii_set_pauseable()
320 mii_free(mii_handle_t mh) in mii_free() argument
322 mutex_enter(&mh->m_lock); in mii_free()
323 mh->m_started = B_FALSE; in mii_free()
324 cv_broadcast(&mh->m_cv); in mii_free()
325 mutex_exit(&mh->m_lock); in mii_free()
327 ddi_taskq_destroy(mh->m_tq); in mii_free()
328 mutex_destroy(&mh->m_lock); in mii_free()
329 cv_destroy(&mh->m_cv); in mii_free()
330 kmem_free(mh, sizeof (*mh)); in mii_free()
334 mii_reset(mii_handle_t mh) in mii_reset() argument
336 mutex_enter(&mh->m_lock); in mii_reset()
337 if (mh->m_tstate > MII_STATE_RESET) in mii_reset()
338 mh->m_tstate = MII_STATE_RESET; in mii_reset()
339 cv_broadcast(&mh->m_cv); in mii_reset()
340 mutex_exit(&mh->m_lock); in mii_reset()
344 mii_suspend(mii_handle_t mh) in mii_suspend() argument
346 mutex_enter(&mh->m_lock); in mii_suspend()
347 while ((!mh->m_suspended) && (mh->m_started)) { in mii_suspend()
348 mh->m_suspending = B_TRUE; in mii_suspend()
349 cv_broadcast(&mh->m_cv); in mii_suspend()
350 cv_wait(&mh->m_cv, &mh->m_lock); in mii_suspend()
352 mutex_exit(&mh->m_lock); in mii_suspend()
356 mii_resume(mii_handle_t mh) in mii_resume() argument
358 mutex_enter(&mh->m_lock); in mii_resume()
360 switch (mh->m_tstate) { in mii_resume()
367 mh->m_tstate = MII_STATE_RESET; in mii_resume()
372 (void) _mii_loopback(mh); in mii_resume()
376 mh->m_suspended = B_FALSE; in mii_resume()
377 cv_broadcast(&mh->m_cv); in mii_resume()
378 mutex_exit(&mh->m_lock); in mii_resume()
382 mii_start(mii_handle_t mh) in mii_start() argument
384 mutex_enter(&mh->m_lock); in mii_start()
385 if (!mh->m_started) { in mii_start()
386 mh->m_tstate = MII_STATE_PROBE; in mii_start()
387 mh->m_started = B_TRUE; in mii_start()
388 if (ddi_taskq_dispatch(mh->m_tq, _mii_task, mh, DDI_NOSLEEP) != in mii_start()
392 mh->m_name); in mii_start()
393 mh->m_started = B_FALSE; in mii_start()
396 cv_broadcast(&mh->m_cv); in mii_start()
397 mutex_exit(&mh->m_lock); in mii_start()
401 mii_stop(mii_handle_t mh) in mii_stop() argument
403 mutex_enter(&mh->m_lock); in mii_stop()
404 mh->m_started = B_FALSE; in mii_stop()
409 mh->m_link = LINK_STATE_UNKNOWN; in mii_stop()
410 mh->m_phy = &mh->m_bogus_phy; in mii_stop()
411 cv_broadcast(&mh->m_cv); in mii_stop()
412 mutex_exit(&mh->m_lock); in mii_stop()
417 _mii_notify(mh); in mii_stop()
421 mii_probe(mii_handle_t mh) in mii_probe() argument
423 mutex_enter(&mh->m_lock); in mii_probe()
424 _mii_probe(mh); in mii_probe()
425 mutex_exit(&mh->m_lock); in mii_probe()
429 mii_check(mii_handle_t mh) in mii_check() argument
431 mutex_enter(&mh->m_lock); in mii_check()
432 cv_broadcast(&mh->m_cv); in mii_check()
433 mutex_exit(&mh->m_lock); in mii_check()
437 mii_get_speed(mii_handle_t mh) in mii_get_speed() argument
439 phy_handle_t *ph = mh->m_phy; in mii_get_speed()
445 mii_get_duplex(mii_handle_t mh) in mii_get_duplex() argument
447 phy_handle_t *ph = mh->m_phy; in mii_get_duplex()
453 mii_get_state(mii_handle_t mh) in mii_get_state() argument
455 phy_handle_t *ph = mh->m_phy; in mii_get_state()
461 mii_get_flowctrl(mii_handle_t mh) in mii_get_flowctrl() argument
463 phy_handle_t *ph = mh->m_phy; in mii_get_flowctrl()
469 mii_get_loopmodes(mii_handle_t mh, lb_property_t *modes) in mii_get_loopmodes() argument
471 phy_handle_t *ph = mh->m_phy; in mii_get_loopmodes()
523 mii_get_loopback(mii_handle_t mh) in mii_get_loopback() argument
525 phy_handle_t *ph = mh->m_phy; in mii_get_loopback()
531 mii_set_loopback(mii_handle_t mh, uint32_t loop) in mii_set_loopback() argument
536 mutex_enter(&mh->m_lock); in mii_set_loopback()
537 ph = mh->m_phy; in mii_set_loopback()
539 if ((!mh->m_started) || (!ph->phy_present) || in mii_set_loopback()
540 (loop >= mii_get_loopmodes(mh, NULL))) { in mii_set_loopback()
545 rv = _mii_loopback(mh); in mii_set_loopback()
547 mh->m_tstate = MII_STATE_LOOPBACK; in mii_set_loopback()
549 cv_broadcast(&mh->m_cv); in mii_set_loopback()
550 mutex_exit(&mh->m_lock); in mii_set_loopback()
556 mii_get_id(mii_handle_t mh) in mii_get_id() argument
558 phy_handle_t *ph = mh->m_phy; in mii_get_id()
564 mii_get_addr(mii_handle_t mh) in mii_get_addr() argument
566 return (mh->m_addr); in mii_get_addr()
572 mii_m_loop_ioctl(mii_handle_t mh, queue_t *wq, mblk_t *mp) in mii_m_loop_ioctl() argument
603 cnt = mii_get_loopmodes(mh, modes); in mii_m_loop_ioctl()
613 cnt = mii_get_loopmodes(mh, modes); in mii_m_loop_ioctl()
625 mode = mii_get_loopback(mh); in mii_m_loop_ioctl()
639 rv = mii_set_loopback(mh, mode); in mii_m_loop_ioctl()
652 mii_m_getprop(mii_handle_t mh, const char *name, mac_prop_id_t num, in mii_m_getprop() argument
663 mutex_enter(&mh->m_lock); in mii_m_getprop()
665 ph = mh->m_phy; in mii_m_getprop()
711 mutex_exit(&mh->m_lock); in mii_m_getprop()
717 mii_m_propinfo(mii_handle_t mh, const char *name, mac_prop_id_t num, in mii_m_propinfo() argument
724 mutex_enter(&mh->m_lock); in mii_m_propinfo()
726 ph = mh->m_phy; in mii_m_propinfo()
759 mutex_exit(&mh->m_lock); in mii_m_propinfo()
763 mii_m_setprop(mii_handle_t mh, const char *name, mac_prop_id_t num, in mii_m_setprop() argument
777 mutex_enter(&mh->m_lock); in mii_m_setprop()
779 ph = mh->m_phy; in mii_m_setprop()
801 macpp = &mh->m_en_1000_fdx; in mii_m_setprop()
806 macpp = &mh->m_en_1000_hdx; in mii_m_setprop()
811 macpp = &mh->m_en_100_fdx; in mii_m_setprop()
816 macpp = &mh->m_en_100_hdx; in mii_m_setprop()
821 macpp = &mh->m_en_100_t4; in mii_m_setprop()
826 macpp = &mh->m_en_10_fdx; in mii_m_setprop()
831 macpp = &mh->m_en_10_hdx; in mii_m_setprop()
836 macpp = &mh->m_en_aneg; in mii_m_setprop()
888 mh->m_en_flowctrl = fc; in mii_m_setprop()
889 mh->m_tstate = MII_STATE_RESET; in mii_m_setprop()
890 cv_broadcast(&mh->m_cv); in mii_m_setprop()
908 mh->m_tstate = MII_STATE_RESET; in mii_m_setprop()
909 cv_broadcast(&mh->m_cv); in mii_m_setprop()
915 mutex_exit(&mh->m_lock); in mii_m_setprop()
920 mii_m_getstat(mii_handle_t mh, uint_t stat, uint64_t *val) in mii_m_getstat() argument
925 mutex_enter(&mh->m_lock); in mii_m_getstat()
927 ph = mh->m_phy; in mii_m_getstat()
1053 mutex_exit(&mh->m_lock); in mii_m_getstat()
1065 mii_handle_t mh = ph->phy_mii; in phy_read() local
1067 return ((*mh->m_ops.mii_read)(mh->m_private, ph->phy_addr, reg)); in phy_read()
1073 mii_handle_t mh = ph->phy_mii; in phy_write() local
1075 (*mh->m_ops.mii_write)(mh->m_private, ph->phy_addr, reg, val); in phy_write()
1600 mii_handle_t mh = ph->phy_mii; in phy_get_prop() local
1602 return (ddi_prop_get_int(DDI_DEV_T_ANY, mh->m_dip, 0, prop, dflt)); in phy_get_prop()
1608 mii_handle_t mh = ph->phy_mii; in phy_get_name() local
1610 return (mh->m_name); in phy_get_name()
1616 mii_handle_t mh = ph->phy_mii; in phy_get_driver() local
1618 return (ddi_driver_name(mh->m_dip)); in phy_get_driver()
1639 _mii_notify(mii_handle_t mh) in _mii_notify() argument
1641 if (mh->m_ops.mii_notify != NULL) { in _mii_notify()
1642 mh->m_ops.mii_notify(mh->m_private, mh->m_link); in _mii_notify()
1651 mii_handle_t mh = ph->phy_mii; in _mii_probe_phy() local
1706 ph->phy_cap_pause = mh->m_cap_pause; in _mii_probe_phy()
1707 ph->phy_cap_asmpause = mh->m_cap_asmpause; in _mii_probe_phy()
1761 ph->phy_en_##CAP = (mh->m_en_##CAP > 0) ? \ in _mii_probe_phy()
1762 mh->m_en_##CAP : ph->phy_cap_##CAP in _mii_probe_phy()
1774 ph->phy_en_flowctrl = mh->m_en_flowctrl; in _mii_probe_phy()
1793 _mii_probe(mii_handle_t mh) in _mii_probe() argument
1803 user_addr = ddi_prop_get_int(DDI_DEV_T_ANY, mh->m_dip, 0, in _mii_probe()
1805 old_addr = mh->m_addr; in _mii_probe()
1821 first = ddi_prop_get_int(DDI_DEV_T_ANY, mh->m_dip, 0, "first-phy", 1); in _mii_probe()
1834 ph = &mh->m_phys[curr_addr]; in _mii_probe()
1838 ph->phy_mii = mh; in _mii_probe()
1883 mh->m_addr = -1; in _mii_probe()
1884 mh->m_phy = &mh->m_bogus_phy; in _mii_probe()
1885 _mii_error(mh, MII_ENOPHY); in _mii_probe()
1887 mh->m_addr = new_addr; in _mii_probe()
1888 mh->m_phy = &mh->m_phys[new_addr]; in _mii_probe()
1889 mh->m_tstate = MII_STATE_RESET; in _mii_probe()
1893 mh->m_name, mii_xcvr_types[mh->m_phy->phy_type], in _mii_probe()
1894 mh->m_addr, mh->m_phy->phy_vendor, in _mii_probe()
1895 mh->m_phy->phy_model); in _mii_probe()
1896 mh->m_link = LINK_STATE_UNKNOWN; in _mii_probe()
1902 _mii_reset(mii_handle_t mh) in _mii_reset() argument
1907 ASSERT(mutex_owned(&mh->m_lock)); in _mii_reset()
1914 ph = &mh->m_phys[i]; in _mii_reset()
1920 if (ph == mh->m_phy) in _mii_reset()
1926 ph = mh->m_phy; in _mii_reset()
1931 notify = (mh->m_link != LINK_STATE_DOWN); in _mii_reset()
1932 mh->m_link = LINK_STATE_DOWN; in _mii_reset()
1938 _mii_error(mh, MII_ERESET); in _mii_reset()
1943 if (mh->m_ops.mii_reset != NULL) { in _mii_reset()
1944 mh->m_ops.mii_reset(mh->m_private); in _mii_reset()
1949 _mii_notify(mh); in _mii_reset()
1955 _mii_loopback(mii_handle_t mh) in _mii_loopback() argument
1959 ASSERT(mutex_owned(&mh->m_lock)); in _mii_loopback()
1961 ph = mh->m_phy; in _mii_loopback()
1963 if (_mii_reset(mh) != DDI_SUCCESS) { in _mii_loopback()
1967 mh->m_tstate = MII_STATE_START; in _mii_loopback()
1971 _mii_error(mh, MII_ELOOP); in _mii_loopback()
1976 mh->m_link = ph->phy_link = LINK_STATE_UP; in _mii_loopback()
1977 _mii_notify(mh); in _mii_loopback()
1983 _mii_start(mii_handle_t mh) in _mii_start() argument
1987 ph = mh->m_phy; in _mii_start()
1989 ASSERT(mutex_owned(&mh->m_lock)); in _mii_start()
1994 _mii_error(mh, MII_ESTART); in _mii_start()
1998 mh->m_error = MII_EOK; in _mii_start()
2003 _mii_check(mii_handle_t mh) in _mii_check() argument
2011 ph = mh->m_phy; in _mii_check()
2013 olink = mh->m_link; in _mii_check()
2021 _mii_error(mh, MII_ECHECK); in _mii_check()
2022 mh->m_link = LINK_STATE_UNKNOWN; in _mii_check()
2023 _mii_notify(mh); in _mii_check()
2027 mh->m_link = ph->phy_link; in _mii_check()
2030 if ((mh->m_link != olink) || in _mii_check()
2034 _mii_notify(mh); in _mii_check()
2043 mii_handle_t mh = _mh; in _mii_task() local
2048 mutex_enter(&mh->m_lock); in _mii_task()
2053 if (!mh->m_started) { in _mii_task()
2057 ph = mh->m_phy; in _mii_task()
2069 if (mh->m_suspending) { in _mii_task()
2070 mh->m_suspended = B_TRUE; in _mii_task()
2071 cv_broadcast(&mh->m_cv); in _mii_task()
2073 if (mh->m_suspended) { in _mii_task()
2074 mh->m_suspending = B_FALSE; in _mii_task()
2075 cv_wait(&mh->m_cv, &mh->m_lock); in _mii_task()
2079 switch (mh->m_tstate) { in _mii_task()
2081 _mii_probe(mh); in _mii_task()
2082 ph = mh->m_phy; in _mii_task()
2096 if (_mii_reset(mh) == DDI_SUCCESS) { in _mii_task()
2097 mh->m_tstate = MII_STATE_START; in _mii_task()
2117 if (_mii_start(mh) == DDI_SUCCESS) { in _mii_task()
2120 mh->m_tstate = MII_STATE_RUN; in _mii_task()
2122 mh->m_tstate = MII_STATE_PROBE; in _mii_task()
2137 if (_mii_check(mh) == DDI_FAILURE) { in _mii_task()
2144 mh->m_tstate = MII_STATE_PROBE; in _mii_task()
2146 } else if (mh->m_link == LINK_STATE_UP) { in _mii_task()
2159 mh->m_tstate = MII_STATE_RESET; in _mii_task()
2179 cv_wait(&mh->m_cv, &mh->m_lock); in _mii_task()
2183 (void) cv_reltimedwait(&mh->m_cv, &mh->m_lock, in _mii_task()
2188 mutex_exit(&mh->m_lock); in _mii_task()