On 7/8/2021 10:36, Kinsey Moore wrote:
On 7/8/2021 02:48, Chris Johns wrote:
On 8/7/21 11:11 am, Kinsey Moore wrote:
On 7/7/2021 19:28, Chris Johns wrote:
We can:
1. Add FDT support. This is something I would like to avoid as it
adds an extra
layer of dependency and it complicates backwards compatibility for
existing
users. I however wonder if this is just me and it is something that
will be
needed more and more and cannot be avoided.
It's not just you, I (and Joel) lean this direction as well. Having
the option
of FDT would be nice and would certainly cover this case, but making
it a hard
requirement seems excessive.
If we could contain a suitable default FDT in the BSP that achieves
the outcome
then I would be OK.
2. Add a weak call that is RTEMS and BSP specific to return a probe
state. The
default state could be enabled and the tests provide something from
the network
config. Not a great solution but it is simple and cheap to
implement. The driver
already has a weak call to set the reference clock.
This patch (since omitted above) strikes a similar compromise but
has the
downside of the default application configuration not having network
at all. The
downside of this suggestion (option #2) is the addition of a second
method to
accomplish the same goal: define a new hook vs redefine or add to
the existing
definitions in nexus-devices.h. My initial patch addressed both, but
added what
appeared to be dead options to RTEMS and has since been reverted.
The other
current/alternate patch addresses both but leaks test configuration
state into
the application by installing the test network configuration.
I do not see them as being the same thing, yes they achieve the same
result
however via different interfaces. Your patch creates a top level "user
interface", ie at the publicly exposed nexus bus interface while a
weak driver
interface is a private agreement between the BSP and this driver plus
users can
provide their own implementation to further change the mix without
needing to
configure or touch any released code. I am concerned the pattern of
defining
mixes in the nexus header is adopted by others on a look and copy
basis and we
get more and more options that never get compiled and rot.
A 2.1 alternative could be adding a global define such as ....
RTEMS_BSD_CONFIG_NEXUS_BUS_DISABLE_DEFAULT_DRIVERS
that disables all the provided definitions and the user can then
provide their
own? Maybe the network config could be extended to allow such defines?
A global disable is needed so the BSD config header I posted before
could be
used without nexus defines clashing.
3. Try and detect a PHY in the probe? I am not sure if that is easy
or hard. If
read works maybe that is something that may be suitable.
That's what is currently happening.
Are you sure? I see the probe as passing and the device is consider
available
however there is no PHY and that creates the errors and that seems
reasonable.
The UKPHY driver is designed to inspect all PHY addresses however
needing 200
reties does seem excessive.
I was thinking about a simpler scan of the MII bus for a PHY in the
probe and if
none found disable return -1 from the probe.
Sorry, I misunderstood what you were saying. You're correct that a PHY
detection does not occur in the CGEM probe, but that wouldn't improve
the current situation since PHYs are being detected on all available
slots. If that weren't happening there wouldn't be PHY read/write
errors, either.
Unfortunately, the ukphy driver is there to
detect braindead PHYs (I have a board which needs it, but could
probably use a
more specific PHY driver in its place) and will pick up certain bits
being set
as being a valid PHY. Perhaps the ukphy driver just needs more
specificity or
maybe the ukphy driver should never be used in nexus-devices.h when
there are
multiple interfaces provided for a BSP.
I think the UKPHY driver is OK, it is the cgem driver that has a
crazy high
retry count and generates the error message. A failing probe with no
error
messages generates no output.
From above, the probe wouldn't fail in that case due to the spurious
PHY detections unless you're trying to do a read/write transaction
with the PHY and waiting for the timeout. This doesn't seem reasonable
to do in a device probe.
I would prefer we avoid special build options for BSPs. It is easy
for us as
developers to make these changes and build a specific RTEMS plus we
can be a
little narrow in our focus when delivering something for a client
in the
defaults we select. Specific builds of a BSP to configure options
becomes hard
for users where they have a few Zynq or ZynqMP designs all running
RTEMS and
each with a different mix of network interfaces. This creates a
complex set of
build options for common application code plus more configuration
items to
control.
It's possible that the ukphy driver could be
improved and this entire problem just goes away or we ban that
driver from the
default configuration for multi-interface BSPs and the problem goes
away.
The UKPHY is an important driver and we need it. The MVME2700 runs a
rev 1 Tulip
chip and the PHY on the board is so old there is no data on it and
the company
has long gone. The PHY does support the IEEE MII basic registers and
the UKPHY
works. I think our issue here is in the cgem driver and not else where.
Ok, so the ukphy driver is too risky for behavioral changes and the
CGEM driver needs to be tweaked to be a bit less verbose.
The solutions to the remainder of the problem are:
1) Use a different, smarter PHY driver and avoid use of ukphy when
multiple interfaces are present
** This could possibly solve the general problem for ethernet
interfaces and replace the ukphy driver for new multi-interface hardware
** Lets nexus-devices.h contain all interfaces that exist on the
hardware, possibly applicable to Zynq7000 and versal as well
2) Disable unused interfaces via weak-reference call in the CGEM probe
** This solves the CGEM problem and provides a template on how to
solve the general problem for other BSPS/interfaces
** Allows the application to make arbitrarily different choices by
implementing a relatively trivial function
** This feels like it's working toward a partial reimplementation of
FDT with hardware configuration embedded in code
** Lets nexus-devices.h contain all interfaces that exist on the
hardware, possibly applicable to Zynq7000 and versal as well
3) Disable unused interfaces via header configuration conditionals
** Allows the application to define the interfaces it needs using
existing mechanisms
** Doesn't provide any network interfaces by default to the application
** Only solves the problem one BSP at a time with extra preprocessor
logic
4) Embed FDT somewhere that defines what interfaces get configured
** Pulls in extra dependencies
** Doesn't solve the test issue without generation/embedding of a FDT
** Allows the application to have exactly what it wants via a
relatively standard mechanism
** Lets nexus-devices.h contain all interfaces that exist on the
hardware, possibly applicable to Zynq7000 and versal as well
I'm starting to lean toward option #1. It allows all interfaces to be
defined and the primary interface for testing can be selected by the
existing test configuration in config.inc. Applications can check the
available interfaces for connectivity or they can prune the nexus
devices in their own copy instead of pulling in nexus-devices.h.
I looked a little further into what it would take to make a smarter
version of ukphy and ukphy isn't actually the issue here. The code in
mii.c that detects whether a PHY exists at all has a bug in it where PHY
read timeouts aren't detected and handled and so the 0xffffffff result
of the failed read slips through the bad-PHY check. I'm working up and
verifying the patch for that now. Fixing that should hopefully allow for
all interfaces to be enabled without issue.
Kinsey
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel