Home | History | Annotate | Download | only in mii
History log of /src/sys/dev/mii/exphy.c
RevisionDateAuthorComments
 1.58  15-Mar-2020  thorpej Define and implement a locking protocol for the ifmedia / mii layers:
- MP-safe drivers provide a mutex to ifmedia that is used to serialize
access to media-related structures / hardware regsiters. Converted
drivers use the new ifmedia_init_with_lock() function for this. The
new name is provided to ease the transition.
- Un-converted drivers continue to call ifmedia_init(), which will supply
a compatibility lock to be used instead. Several media-related entry
points must be aware of this compatibility lock, and are able to acquire
it recursively a limited number of times, if needed. This is a SPIN
mutex with priority IPL_NET.
- This same lock is used to serialize access to PHY registers and other
MII-related data structures.

The PHY drivers are modified to acquire and release the lock, as needed,
and assert the lock is held as a diagnostic aid.

The "usbnet" framework has had an overhaul of its internal locking
protocols to fit in with the media / mii changes, and the drivers adapted.

USB wifi drivers have been changed to provide their own adaptive mutex
to the ifmedia later via a new ieee80211_media_init_with_lock() function.
This is required because the USB drivers need an adaptive mutex.

Besised "usbnet", a few other drivers are converted: vmx, wm, ixgbe / ixv.

mcx also now calls ifmedia_init_with_lock() because it needs to also use
an adaptive mutex. The mcx driver still needs to be fully converted to
NET_MPSAFE.
 1.57  27-Nov-2019  msaitoh - Simplify sc->mii_anegticks setting. Same as FreeBSD.

Don't set the default value not in the attach function. Instead, set the
default value (MII_ANEGTICKS) first in the beginning of the
mii_phy_add_media(). The function already has the code to change the value to
MII_ANEGTICKS_GIGE if it's gigabit capable.

- Remove extra pmf_device_register() call. It's done in mii_phy_add_media().
 1.56  25-Mar-2019  msaitoh KNF. No functional change.
 1.55  22-Jan-2019  msaitoh Change MII PHY read/write API from:

int (*mii_readreg_t)(device_t, int, int);
void (*mii_writereg_t)(device_t, int, int, int);
to:

int (*mii_readreg_t)(device_t, int, int, uint16_t *);
int (*mii_writereg_t)(device_t, int, int, uint16_t);

Now we can test if a read/write operation failed or not by the return value.

In 802.3 spec says that the PHY shall not respond to read/write transaction
to the unimplemented register(22.2.4.3). Detecting timeout can be used to
check whether a register is implemented or not (if the register conforms to
the spec). ukphy(4) can be used this for MII_MMDACR and MII_MMDAADR.

Note that I noticed that the following code do infinite loop in the
read/wirte function. If it accesses unimplemented PHY register, it will hang.
It should be fixed:

arm/at91/at91emac.c
arm/ep93xx/epe.c
arm/omap/omapl1x_emac.c
mips/ralink/ralink_eth.c
arch/powerpc/booke/dev/pq3etsec.c(read)
dev/cadence/if_cemac.c <- hkenken
dev/ic/lan9118.c


Tested with the following device:

axe+ukphy
axe+rgephy
axen+rgephy (tested by Andrius V)
wm+atphy
wm+ukphy
wm+igphy
wm+ihphy
wm+makphy
sk+makphy
sk+brgphy
sk+gentbi
msk+makphy
sip+icsphy
sip+ukphy
re+rgephy
bge+brgphy
bnx+brgphy
gsip+gphyter
rtk+rlphy
fxp+inphy (tested by Andrius V)
tlp+acphy
ex+exphy
epic+qsphy
vge+ciphy (tested by Andrius V)
vr+ukphy (tested by Andrius V)
vte+ukphy (tested by Andrius V)

Not tested (MAC):
arm:at91emac
arm:cemac
arm:epe
arm:geminigmac
arm:enet
arm:cpsw
arm:emac(omac)
arm:emac(sunxi)
arm:npe
evbppc:temac
macppc:bm
macppc:gm
mips:aumac
mips:ae
mips:cnmac
mips:reth
mips:sbmac
playstation2:smap
powerpc:tsec
powerpc:emac(ibm4xx)
sgimips:mec
sparc:be
sf
ne(ax88190, dl10019)
awge
ep
gem
hme
smsh
mtd
sm
age
alc
ale
bce
cas
et
jme
lii
nfe
pcn
ste
stge
tl
xi
aue
mue
smsc
udav
url

Not tested (PHY):
amhphy
bmtphy
dmphy
etphy
glxtphy
ikphy
iophy
lxtphy
nsphyter
pnaphy
rdcphy
sqphy
tlphy
tqphy
urlphy
 1.54  07-Jul-2016  msaitoh branches: 1.54.16; 1.54.18;
KNF. Remove extra spaces. No functional change.
 1.53  09-Jun-2013  msaitoh branches: 1.53.10;
Don't "return" but "break" in MII_TICK when the interface isn't doing
autonegotiaton or the link is up to update the status.
 1.52  19-Oct-2009  bouyer branches: 1.52.12; 1.52.22;
Remove closes 3 & 4 from my licence. Lots of thanks to Soren Jacobsen
for the booring work !
 1.51  17-Nov-2008  dyoung Reduce code duplication: most PHY drivers call mii_phy_add_media()
when they attach to the device tree, so call pmf_device_register(9)
once there instead of once in more than twenty drivers.
 1.50  04-May-2008  xtraeme branches: 1.50.6; 1.50.8;
device_t/softc split for all mii(4) devices, and other related
cosmetic changes.
 1.49  28-Apr-2008  martin Remove clause 3 and 4 from TNF licenses
 1.48  14-Apr-2008  spz branches: 1.48.2; 1.48.4;
pretty up if_ex: pmf'ify, device split, and improve printing a bit too.

Reviewed and function-tested on if_ex_cardbus by cube (thanks).
Function-tested on if_ex_pci by myself.
 1.47  08-Apr-2008  cegger use aprint_*_dev and device_xname
 1.46  29-Dec-2007  dyoung branches: 1.46.6;
Remove the device_is_active() check from each individual PHY's
service routine. Add a wrapper for PHY_SERVICE(), called phy_service(),
and check device_is_active() there. Make the mii_*() routines call
the PHY service routines thorugh phy_service() instead of PHY_SERVICE().

In mii_phy_resume(), restore a PHY's state after resetting it by
sending a MII_MEDIACHG command. This change makes bnx(4) resume
more reliably and more quickly; it should help other NICs to resume,
too, if they attach PHYs through MII.
 1.45  09-Dec-2007  jmcneill branches: 1.45.2;
Merge jmcneill-pm branch.
 1.44  16-Nov-2006  christos branches: 1.44.22; 1.44.24; 1.44.30; 1.44.34; 1.44.36;
- don't hardcode 5, 10 define and use MII_ANEGTICKS{,_GIGE}
- instead of != limit, use <= limit (conservative)
 1.43  16-Nov-2006  christos __unused removal on arguments; approved by core.
 1.42  12-Oct-2006  christos - sprinkle __unused on function decls.
- fix a couple of unused bugs
- no more -Wno-unused for i386
 1.41  29-Mar-2006  thorpej branches: 1.41.8; 1.41.10;
Use device_private().
 1.40  28-Feb-2006  kleink branches: 1.40.2; 1.40.4; 1.40.6;
Reduce previous (!is(...) != 0) to (!is(...)).
 1.39  27-Feb-2006  thorpej Use device_is_a().
 1.38  20-Feb-2006  thorpej Use device_is_active() rather than testing dv_flags for DVF_ACTIVE
directly.
 1.37  11-Dec-2005  christos branches: 1.37.2; 1.37.4; 1.37.6;
merge ktrace-lwp.
 1.36  23-Aug-2004  thorpej branches: 1.36.12;
Make use of static.
 1.35  29-Apr-2003  thorpej branches: 1.35.2;
Use aprint*().
 1.34  02-Oct-2002  thorpej Add trailing ; to CFATTACH_DECL.
 1.33  30-Sep-2002  thorpej Use CFATTACH_DECL().
 1.32  27-Sep-2002  thorpej Declare all cfattach structures const.
 1.31  27-Sep-2002  thorpej Rather than referencing the cfdriver directly in the cfdata entries,
instead use a string naming the driver. The cfdriver is then looked
up in a list which is built at run-time.
 1.30  03-Jul-2002  simonb Don't include <malloc.h> - no memory management style functions are use
in any of the MII drivers.
 1.29  25-Mar-2002  thorpej branches: 1.29.2;
Get flags passed down to PHY drivers correctly. This was done on
an adhoc basis in a couple of PHY drivers, this fixes it more generally.

Per a discussion w/ Cliff Neighbors <cliff@allegronetworks.com>.
 1.28  13-Nov-2001  lukem add RCSID
 1.27  25-Aug-2001  thorpej ANSI'ify.
 1.26  31-May-2001  thorpej branches: 1.26.2;
Make the number of ticks between auto-negotiation tries PHY-specific,
and default every PHY to 5 seconds (what we used before). If we find
Gig-E media on a PHY, bump it to 10 seconds, since it can take 5
seconds just to negotiate a Gig-E link.
 1.25  04-Jul-2000  thorpej branches: 1.25.2;
Restructure the PHY entry points to use a structure of entry points
instead of discrete function pointers, and extend this to include
a "reset" entry point. Make sure any PHY-specific reset routine is
always used, and provide one for the LXT-970 which disables MII
interrupts (as is done for a few other PHYs we have drivers for).
 1.24  06-Mar-2000  thorpej branches: 1.24.4;
Factor out the tick handling code into a common function, and send
rt_ifmsg's when the link speed or link status changes.
 1.23  02-Feb-2000  thorpej Let mii_phy_setmedia() handle the IFM_AUTO case, too.
 1.22  02-Feb-2000  thorpej Make PHY drivers provide a pointer to their status routine, and add
a generic mii_phy_status() that calls back into the PHY. It doesn't
do anything interesting yet, but it will soon.
 1.21  02-Feb-2000  thorpej Don't dry to diving MIIF_NOISOLATE in the PHY drivers. Instead, pass
flags down from the parent to child vi mii_attach().
 1.20  02-Feb-2000  thorpej Bring some order to the chaos which was the MII code function naming
"conventions".
 1.19  27-Jan-2000  thorpej Add detachment support to the MII layer.
 1.18  12-Nov-1999  thorpej Add mii_down(), which is used by MAC drivers to inform PHYs that the
interface is now down. PHYs use this to cancel pending asynchronous
operations.
 1.17  03-Nov-1999  thorpej Clean up the code that adds media a little, and make media selection
table-driven in preparation for some other changes to be made.
 1.16  23-Apr-1999  thorpej branches: 1.16.2; 1.16.4; 1.16.8;
Implement asynchronous autonegotiation when driven by the MII tick
(one-second clock). Prevents .5s delays every 5 seconds when the interface
is up but there is no link. Fixes PR 7361.
 1.15  05-Nov-1998  thorpej branches: 1.15.6;
Place the essentially common "ticks" and "active" members into the
mii_softc (generic phy goo), and just switch all of the PHY drivers
(except tlphy, which really does have special stuff) to use an mii_softc
instead of a private one.
 1.14  04-Nov-1998  thorpej Routines common between the Uknown PHY driver (forthcoming) and other
PHY drivers. This file has ukphy_status(), which is what PHY drivers
should use if media detection is done by decoding NWay.
 1.13  04-Nov-1998  thorpej Return a higher-priority match than 1. These are specific drivers. This
allows for a "generic unknown PHY" driver to be implemented.
 1.12  04-Nov-1998  thorpej Factor out the common reset code. Use the NOISOLATE flags as appropriate
to prevent a PHY from being isolated in the event the MAC can't deal with
this. (3Com 3c905B-TX, and Intel i82557).
 1.11  04-Nov-1998  thorpej Factor out some common code from all the PHY drivers (autonegotiation, for
now.)
 1.10  04-Nov-1998  thorpej Define and use generic PHY read/write reg macros.
 1.9  03-Nov-1998  thorpej 3Com PHY can't be isolated, so don't allow IFM_NONE.
 1.8  02-Nov-1998  thorpej When doing a media change service request, use the media word from the
current ifmedia_entry, not from the user-supplied media word. The
user supplied media word may not necessarily match e.g. instance (if
the parent MAC driver is intentionally ignoring instance if its expecting
multiple PHYs with non-overlapping media, e.g. TI ThunderLAN) the media
word we are actually switching to.

Since PHY drivers use `instance' to determine if they should isolate
themselves, the ThunderLAN PHY was sometimes being incorrectly isolated
when in fact the user attempted to select that PHY (for e.g. BNC operation).
 1.7  23-Oct-1998  thorpej Don't print the revision of the 3c905B-TX's internal PHY; it's meaningless.
 1.6  23-Oct-1998  thorpej Make sure the parent is an `ex'. The 3c905B-TX's internal PHY isn't
the only one w/ non-existent ID registers. SIGH.
 1.5  28-Aug-1998  fvdl Add ETHER|NONE to default capabilities, or we'll panic when attaching
the forthcoming ex driver.
 1.4  12-Aug-1998  thorpej Make a variable name reflect a register name.
 1.3  12-Aug-1998  thorpej If autonegotiation is enabled in the BMSR, and the BMCR doens't claim
that it has completed, report "none" as the active media type.
 1.2  12-Aug-1998  thorpej Ugh, don't print out "autonegotiation failed to complete" if it did.
We get these once a second if we're in auto mode, the interface is up,
and there's no carrier.
 1.1  12-Aug-1998  thorpej Driver for the 3Com internal PHY, found on 3c905B-TX cards (and maybe
some 3c905-TX?). Partially from Frank van der Linden.
 1.15.6.1  23-Apr-1999  perry branches: 1.15.6.1.2;
pullup 1.15->1.16 (thorpej): Fix PR7361
 1.15.6.1.2.1  21-Jun-1999  thorpej Sync w/ -current.
 1.16.8.1  27-Dec-1999  wrstuden Pull up to last week's -current.
 1.16.4.1  15-Nov-1999  fvdl Sync with -current
 1.16.2.1  20-Nov-2000  bouyer Update thorpej_scsipi to -current as of a month ago
A i386 GENERIC kernel compiles without the siop, ahc and bha drivers
(will be updated later). i386 IDE/ATAPI and ncr work, as well as
sparc/esp_sbus. alpha should work as well (untested yet).
siop, ahc and bha will be updated once I've updated the branch to current
-current, as well as machine-dependant code.
 1.24.4.1  04-Jul-2000  thorpej Update from trunk:
Restructure the PHY entry points to use a structure of entry points
instead of discrete function pointers, and extend this to include
a "reset" entry point. Make sure any PHY-specific reset routine is
always used, and provide one for the LXT-970 which disables MII
interrupts (as is done for a few other PHYs we have drivers for).
 1.25.2.6  18-Oct-2002  nathanw Catch up to -current.
 1.25.2.5  01-Aug-2002  nathanw Catch up to -current.
 1.25.2.4  01-Apr-2002  nathanw Catch up to -current.
(CVS: It's not just a program. It's an adventure!)
 1.25.2.3  14-Nov-2001  nathanw Catch up to -current.
 1.25.2.2  21-Sep-2001  nathanw Catch up to -current.
 1.25.2.1  21-Jun-2001  nathanw Catch up to -current.
 1.26.2.5  10-Oct-2002  jdolecek sync kqueue with -current; this includes merge of gehenna-devsw branch,
merge of i386 MP branch, and part of autoconf rototil work
 1.26.2.4  06-Sep-2002  jdolecek sync kqueue branch with HEAD
 1.26.2.3  23-Jun-2002  jdolecek catch up with -current on kqueue branch
 1.26.2.2  10-Jan-2002  thorpej Sync kqueue branch with -current.
 1.26.2.1  13-Sep-2001  thorpej Update the kqueue branch to HEAD.
 1.29.2.1  15-Jul-2002  gehenna catch up with -current.
 1.35.2.3  21-Sep-2004  skrll Fix the sync with head I botched.
 1.35.2.2  18-Sep-2004  skrll Sync with HEAD.
 1.35.2.1  25-Aug-2004  skrll Sync with HEAD.
 1.36.12.3  21-Jan-2008  yamt sync with head
 1.36.12.2  30-Dec-2006  yamt sync with head.
 1.36.12.1  21-Jun-2006  yamt sync with head.
 1.37.6.1  22-Apr-2006  simonb Sync with head.
 1.37.4.1  09-Sep-2006  rpaulo sync with head
 1.37.2.1  01-Mar-2006  yamt sync with head.
 1.40.6.1  31-Mar-2006  tron Merge 2006-03-31 NetBSD-current into the "peter-altq" branch.
 1.40.4.1  19-Apr-2006  elad sync with head.
 1.40.2.1  01-Apr-2006  yamt sync with head.
 1.41.10.2  10-Dec-2006  yamt sync with head.
 1.41.10.1  22-Oct-2006  yamt sync with head
 1.41.8.1  18-Nov-2006  ad Sync with head.
 1.44.36.1  11-Dec-2007  yamt sync with head.
 1.44.34.1  26-Dec-2007  ad Sync with head.
 1.44.30.1  18-Feb-2008  mjf Sync with HEAD.
 1.44.24.1  09-Jan-2008  matt sync with HEAD
 1.44.22.2  08-Dec-2007  jmcneill Rename pnp(9) -> pmf(9), as requested by many.
 1.44.22.1  27-Nov-2007  joerg Register MII PHY drives with the PM framework. Nothing to do on suspend,
just reset the PHY on resume.
 1.45.2.1  02-Jan-2008  bouyer Sync with HEAD
 1.46.6.2  17-Jan-2009  mjf Sync with HEAD.
 1.46.6.1  02-Jun-2008  mjf Sync with HEAD.
 1.48.4.3  11-Mar-2010  yamt sync with head
 1.48.4.2  04-May-2009  yamt sync with head.
 1.48.4.1  16-May-2008  yamt sync with head.
 1.48.2.1  18-May-2008  yamt sync with head.
 1.50.8.1  19-Jan-2009  skrll Sync with HEAD.
 1.50.6.1  13-Dec-2008  haad Update haad-dm branch to haad-dm-base2.
 1.52.22.2  03-Dec-2017  jdolecek update from HEAD
 1.52.22.1  23-Jun-2013  tls resync from head
 1.52.12.1  22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.53.10.1  09-Jul-2016  skrll Sync with HEAD
 1.54.18.2  08-Apr-2020  martin Merge changes from current as of 20200406
 1.54.18.1  10-Jun-2019  christos Sync with HEAD
 1.54.16.1  26-Jan-2019  pgoyette Sync with HEAD

RSS XML Feed