devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Lunn <andrew@lunn.ch>
To: Lukasz Stelmach <l.stelmach@samsung.com>
Cc: "David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	Krzysztof Kozlowski <krzk@kernel.org>,
	Kukjin Kim <kgene@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	Russell King <linux@armlinux.org.uk>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linux-samsung-soc@vger.kernel.org,
	netdev@vger.kernel.org, devicetree@vger.kernel.org,
	b.zolnierkie@samsung.com, m.szyprowski@samsung.com
Subject: Re: [PATCH 1/3] net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver
Date: Mon, 7 Sep 2020 20:18:54 +0200	[thread overview]
Message-ID: <20200907181854.GD3254313@lunn.ch> (raw)
In-Reply-To: <dleftjwo15qyei.fsf%l.stelmach@samsung.com>

> > On Tue, Aug 25, 2020 at 07:03:09PM +0200, Łukasz Stelmach wrote:
> >> +++ b/drivers/net/ethernet/asix/ax88796c_ioctl.c
> >
> > This is an odd filename. The ioctl code is wrong anyway, but there is
> > a lot more than ioctl in here. I suggest you give it a new name.
> >
> 
> Sure, any suggestions?

Sorry, i have forgotten what is actually contained. Does it even need
to be a separate file?

> >> +u8 ax88796c_check_power(struct ax88796c_device *ax_local)
> >
> > bool ?
> 
> OK.
> 
> It appears, however, that 0 means OK and 1 !OK. Do you think changing to
> TRUE and FALSE (or FALSE and TRUE) is required?

Or change the name, ax88796c_check_power_off()? I don't really care,
so long as it is logical and not surprising.

> >> +	AX_READ_STATUS(&ax_local->ax_spi, &ax_status);
> >> +	if (!(ax_status.status & AX_STATUS_READY)) {
> >> +
> >> +		/* AX88796C in power saving mode */
> >> +		AX_WAKEUP(&ax_local->ax_spi);
> >> +
> >> +		/* Check status */
> >> +		start_time = jiffies;
> >> +		do {
> >> +			if (time_after(jiffies, start_time + HZ/2)) {
> >> +				netdev_err(ax_local->ndev,
> >> +					"timeout waiting for wakeup"
> >> +					" from power saving\n");
> >> +				break;
> >> +			}
> >> +
> >> +			AX_READ_STATUS(&ax_local->ax_spi, &ax_status);
> >> +
> >> +		} while (!(ax_status.status & AX_STATUS_READY));
> >
> > include/linux/iopoll.h
> >
> 
> Done. The result seems only slightly more elegant since the generic
> read_poll_timeout() needs to be employed.

Often code like this has bugs in it, not correctly handling the
scheduler sleeping longer than expected. That is why i point people at
iopoll, no bugs, not elegance.

> The manufacturer says
> 
>     The AX88796C integrates on-chip Fast Ethernet MAC and PHY, […]
> 
> There is a single integrated PHY in this chip and no possiblity to
> connect external one. Do you think it makes sense in such case to
> introduce the additional layer of abstraction?

Yes it does, because it then uses all the standard phylib code to
drive the PHY which many people understand, is well tested, etc. It
will make the MAC driver smaller and probably less buggy.

> >> +static char *macaddr;
> >> +module_param(macaddr, charp, 0);
> >> +MODULE_PARM_DESC(macaddr, "MAC address");
> >
> > No Module parameters. You can get the MAC address from DT.
> 
> What about systems without DT? Not every bootloader is sophisicated
> enough to edit DT before starting kernel. AX88786C is a chip that can be
> used in a variety of systems and I'd like to avoid too strong
> assumptions.

There is also a standardised way to read it from ACPI. And you can set
it using ip link set. DaveM will likely NACK a module parameter.

> >> +MODULE_AUTHOR("ASIX");
> >
> > Do you expect ASIX to support this? 
> 
> No.
> 
> > You probably want to put your name here.
> 
> I don't want to be considered as the only author and as far as I can
> tell being mentioned as an author does not imply being a
> maintainer. Do you think two MODULE_AUTHOR()s be OK?

Can you have two? One with two names listed is O.K.

> >> +
> >> +	phy_status = AX_READ(&ax_local->ax_spi, P0_PSCR);
> >> +	if (phy_status & PSCR_PHYLINK) {
> >> +
> >> +		ax_local->w_state = ax_nop;
> >> +		time_to_chk = 0;
> >> +
> >> +	} else if (!(phy_status & PSCR_PHYCOFF)) {
> >> +		/* The ethernet cable has been plugged */
> >> +		if (ax_local->w_state == chk_cable) {
> >> +			if (netif_msg_timer(ax_local))
> >> +				netdev_info(ndev, "Cable connected\n");
> >> +
> >> +			ax_local->w_state = chk_link;
> >> +			ax_local->w_ticks = 0;
> >> +		} else {
> >> +			if (netif_msg_timer(ax_local))
> >> +				netdev_info(ndev, "Check media status\n");
> >> +
> >> +			if (++ax_local->w_ticks == AX88796C_WATCHDOG_RESTART) {
> >> +				if (netif_msg_timer(ax_local))
> >> +					netdev_info(ndev, "Restart autoneg\n");
> >> +				ax88796c_mdio_write(ndev,
> >> +					ax_local->mii.phy_id, MII_BMCR,
> >> +					(BMCR_SPEED100 | BMCR_ANENABLE |
> >> +					BMCR_ANRESTART));
> >> +
> >> +				if (netif_msg_hw(ax_local))
> >> +					ax88796c_dump_phy_regs(ax_local);
> >> +				ax_local->w_ticks = 0;
> >> +			}
> >> +		}
> >> +	} else {
> >> +		if (netif_msg_timer(ax_local))
> >> +			netdev_info(ndev, "Check cable status\n");
> >> +
> >> +		ax_local->w_state = chk_cable;
> >> +	}
> >> +
> >> +	ax88796c_set_power_saving(ax_local, ax_local->ps_level);
> >> +
> >> +	if (time_to_chk)
> >> +		mod_timer(&ax_local->watchdog, jiffies + time_to_chk);
> >> +}
> >
> > This is not the normal use of a watchdog in network drivers. The
> > normal case is the network stack as asked the driver to do something,
> > normally a TX, and the driver has not reported the action has
> > completed.  The state of the cable should not make any
> > difference. This does not actually appear to do anything useful, like
> > kick the hardware to bring it back to life.
> >
> 
> Maybe it's the naming that is a problem. Yes, it is not a watchdog, but
> rather a periodic housekeeping and it kicks hw if it can't negotiate
> the connection. The question is: should the settings be reset in such case.

Let see what is left once you convert to phylib.

> >> +	struct net_device *ndev = ax_local->ndev;
> >> +	int status;
> >> +
> >> +	do {
> >> +		if (!(ax_local->checksum & AX_RX_CHECKSUM))
> >> +			break;
> >> +
> >> +		/* checksum error bit is set */
> >> +		if ((rxhdr->flags & RX_HDR3_L3_ERR) ||
> >> +		    (rxhdr->flags & RX_HDR3_L4_ERR))
> >> +			break;
> >> +
> >> +		if ((rxhdr->flags & RX_HDR3_L4_TYPE_TCP) ||
> >> +		    (rxhdr->flags & RX_HDR3_L4_TYPE_UDP)) {
> >> +			skb->ip_summed = CHECKSUM_UNNECESSARY;
> >> +		}
> >> +	} while (0);
> >
> >
> > ??
> >
> 
> if() break; Should I use goto?

Sorry, i was too ambiguous. Why:

do {
} while (0);

It is an odd construct.

   Andrew

  reply	other threads:[~2020-09-07 18:19 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20200825170322eucas1p2c6619aa3e02d2762e07da99640a2451c@eucas1p2.samsung.com>
2020-08-25 17:03 ` [PATCH 1/3] net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver Łukasz Stelmach
     [not found]   ` <CGME20200825170323eucas1p2d299a6ac365e6a70d802757d439bc77c@eucas1p2.samsung.com>
2020-08-25 17:03     ` [PATCH 2/3] ARM: dts: Add ethernet Łukasz Stelmach
2020-08-25 18:03       ` Andrew Lunn
2020-08-25 18:49       ` Krzysztof Kozlowski
     [not found]   ` <CGME20200825170323eucas1p15f2bbfa460f7ef787069dd3459dd77b3@eucas1p1.samsung.com>
2020-08-25 17:03     ` [PATCH 3/3] ARM: defconfig: Enable ax88796c driver Łukasz Stelmach
2020-08-25 18:51       ` Krzysztof Kozlowski
     [not found]         ` <CGME20200826051134eucas1p23a1c91b2179678eecc5dd5eeb2d0e4c9@eucas1p2.samsung.com>
2020-08-26  5:11           ` Lukasz Stelmach
2020-08-26  6:46             ` Krzysztof Kozlowski
2020-08-25 17:19   ` [PATCH 1/3] net: ax88796c: ASIX AX88796C SPI Ethernet Adapter Driver Randy Dunlap
     [not found]     ` <CGME20200825173041eucas1p29cb450a15648e0ecb1e896fcbe0f9126@eucas1p2.samsung.com>
2020-08-25 17:30       ` Lukasz Stelmach
2020-08-25 17:55         ` Randy Dunlap
2020-08-25 18:01   ` Andrew Lunn
2020-08-26  7:13     ` Geert Uytterhoeven
     [not found]       ` <CGME20200907174710eucas1p1b06f854222c255719a63c72b043ecda2@eucas1p1.samsung.com>
2020-09-07 17:47         ` Lukasz Stelmach
     [not found]     ` <CGME20200907173945eucas1p240c0d7ebff3010a3bf752eaf8e619eb1@eucas1p2.samsung.com>
2020-09-07 17:39       ` Lukasz Stelmach
2020-09-07 18:18         ` Andrew Lunn [this message]
     [not found]           ` <CGME20200908174935eucas1p2f24d79b234152148b060c45863e3efeb@eucas1p2.samsung.com>
2020-09-08 17:49             ` Lukasz Stelmach
2020-09-08 18:22               ` Andrew Lunn
2020-09-14 22:29         ` jim.cromie
2020-08-25 18:44   ` Krzysztof Kozlowski
     [not found]     ` <CGME20200826145929eucas1p1367c260edb8fa003869de1da527039c0@eucas1p1.samsung.com>
2020-08-26 14:59       ` Lukasz Stelmach
2020-08-26 15:06         ` David Laight
2020-08-26 16:07           ` Andrew Lunn
     [not found]           ` <CGME20200907180715eucas1p1c1e41bb1ddb5a401a4d9c8cb6117e1f6@eucas1p1.samsung.com>
2020-09-07 18:06             ` Lukasz Stelmach
2020-08-26 16:02         ` Andrew Lunn
2020-08-26 16:45         ` Krzysztof Kozlowski
2020-08-26 16:52           ` Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200907181854.GD3254313@lunn.ch \
    --to=andrew@lunn.ch \
    --cc=b.zolnierkie@samsung.com \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=kgene@kernel.org \
    --cc=krzk@kernel.org \
    --cc=kuba@kernel.org \
    --cc=l.stelmach@samsung.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=m.szyprowski@samsung.com \
    --cc=netdev@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).