dpaa2: defer link_state updates until we are up
authorBjoern A. Zeeb <bz@FreeBSD.org>
Fri, 17 Nov 2023 00:47:11 +0000 (00:47 +0000)
committerBjoern A. Zeeb <bz@FreeBSD.org>
Fri, 17 Nov 2023 12:20:03 +0000 (12:20 +0000)
commit964b3408fa872178aacf58f2d84dc43564ec0aa7
treebbc601f008aa204157fe34537f8d1b30eb70e8c5
parent0480dccd3f347da0dbccf5917633435d5ce6cb86
dpaa2: defer link_state updates until we are up

dpaa2_ni_media_change() was called in early setup stages, before we
were fully setup.  That lead to internal driver state being all synched
and fine but hardware state was lost/never setup corrently.

Introduce dpaa2_ni_media_change_locked() so we can avoid reccursive
locking and call "dpaa2_ni_media_change()" instead of mii_mediachg()
as the latter does not setup our state there either.

In order for this all to work, call if_setdrvflagbits() just before
rather than after the above.

Also remove an unecessary direct call to dpaa2_ni_miibus_statchg()
which mii_mediachg() will trigger anyway.

This all fixes a problem [1] that one had to lose the link (either
unplugging/replugging the cable or using ifconfig media none;
ifconfig media auto) to re-trigger the all updates and get the
full state programmed when hardware expected.

MFC after: 3 days
GH-Issue: https://github.com/mcusim/freebsd-src/issues/21 [1]
Reviewed by: dsl, dch
Differential Revision: https://reviews.freebsd.org/D42643
sys/dev/dpaa2/dpaa2_ni.c