Thread (34 messages) 34 messages, 8 authors, 2011-11-03

Re: [RFC PATCH 05/17] phy_driver: Make .read_status()/.config_aneg() optional

From: Mike Frysinger <hidden>
Date: 2011-10-25 07:06:37
Also in: lkml

On Fri, Oct 21, 2011 at 01:13, Kyle Moffett wrote:
On Thu, Oct 20, 2011 at 17:14, Mike Frysinger wrote:
quoted
On Thursday 20 October 2011 17:10:12 Mike Frysinger wrote:
quoted
On Thursday 20 October 2011 17:00:12 Kyle Moffett wrote:
quoted
Approximately 90% of the PHY drivers follow the PHY layer docs and
simply use &genphy_read_status and &genphy_config_aneg.  There would
seem to be little point in requiring them all to manually specify those
functions.
well, it does make sense if you think about the compile vs build time
overhead.  yes, your patch does make things much nicer to read, and a
little easier to maintain the source.  however, it adds runtime overhead
(checking the func pointers) while the func pointer storage is unchanged
(it's now a NULL pointer instead of pointing to the genphy funcs).
personally, i think the savings in runtime and smaller compiled code is
more important.  so i'm going to NAK this.  sorry.
ah, sorry, i was thinking this was u-boot since we were just having
conversations there.

since this is Linux, and i don't have real standing in the general netdev
community, i can't really NAK here.  but i think my comment still stands in
that this patch makes things much worse than the minor code style improvement.
I would argue that the PHY layer itself is not remotely a hot-path,
especially not to the level of caring about an extra if statement.  A
single phy_read() is a sleeping call which goes over a slow serial
bus, so code maintainability is much more important.
i disagree.  ignoring that, what you ultimately desire can be
accomplished without bloating the kernel.

option 1: this can be done in the registration func just like the mtd
layer.  if (!func_pointer) func_pointer = default;

option 2: introduce a new macro in the common phy header similar to:
  #define PHY_DRIVER_DEFAULT_FUNCS \
    .config_aneg = genphy_config_aneg, \
    .read_status = genphy_read_status
and then use that in the phy_driver init structs:
  struct phy_driver bcm5411_driver = {
    PHY_DRIVER_DEFAULT_FUNCS,
    .config_aneg = bcm5411_config_aneg,
    ...

however, imo, these func pointer arrays really should be in the
.rodata section with proper const markers.  this would require
breaking out into a new phy_driver_opts struct since the phy_driver
struct has read/write fields (like the list structure).  option 2
should allow this to work.
-mike
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help