Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1396497 > unrolled thread
| Started by | Philippe Reynes <tremyfr@gmail.com> |
|---|---|
| First post | 2016-05-08 23:50 +0200 |
| Last post | 2016-05-09 04:00 +0200 |
| Articles | 7 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH v2 0/3] net: ethtool: add ethtool_op_{get|set}_link_ksettings Philippe Reynes <tremyfr@gmail.com> - 2016-05-08 23:50 +0200
[PATCH v2 3/3] net: ethernet: fec: use ethtool_op_{get|set}_link_ksettings Philippe Reynes <tremyfr@gmail.com> - 2016-05-08 23:50 +0200
[PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device Philippe Reynes <tremyfr@gmail.com> - 2016-05-08 23:50 +0200
Re: [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device Ben Hutchings <ben@decadent.org.uk> - 2016-05-09 00:30 +0200
Re: [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device Philippe Reynes <tremyfr@gmail.com> - 2016-05-09 00:50 +0200
Re: [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device Ben Hutchings <ben@decadent.org.uk> - 2016-05-09 01:10 +0200
RE: [PATCH v2 0/3] net: ethtool: add ethtool_op_{get|set}_link_ksettings Fugang Duan <fugang.duan@nxp.com> - 2016-05-09 04:00 +0200
| From | Philippe Reynes <tremyfr@gmail.com> |
|---|---|
| Date | 2016-05-08 23:50 +0200 |
| Subject | [PATCH v2 0/3] net: ethtool: add ethtool_op_{get|set}_link_ksettings |
| Message-ID | <rwEKl-6rk-9@gated-at.bofh.it> |
Ethtool callbacks {get|set}_link_ksettings may be the
same for many drivers. So we add two generics callbacks
ethtool_op_{get|set}_link_ksettings.
To use those generics callbacks, the ethernet driver must
use the pointer phydev contained in struct net_device, and
not use a private structure to store this pointer.
Changelog:
v2:
- use generic function instead of macro
- ethernet driver use the pointer phydev provided by struct net_device
Those idea were provided by Ben Hutchings,
and Florian Fainelli acknowledge them.
Philippe Reynes (3):
net: core: ethtool: add ethtool_op_{get|set}_link_ksettings
net: ethernet: fec: use phydev from struct net_device
net: ethernet: fec: use ethtool_op_{get|set}_link_ksettings
drivers/net/ethernet/freescale/fec.h | 1 -
drivers/net/ethernet/freescale/fec_main.c | 71 +++++++++--------------------
include/linux/ethtool.h | 5 ++
net/core/ethtool.c | 24 ++++++++++
4 files changed, 50 insertions(+), 51 deletions(-)
--
1.7.4.4
[toc] | [next] | [standalone]
| From | Philippe Reynes <tremyfr@gmail.com> |
|---|---|
| Date | 2016-05-08 23:50 +0200 |
| Subject | [PATCH v2 3/3] net: ethernet: fec: use ethtool_op_{get|set}_link_ksettings |
| Message-ID | <rwEKl-6rk-13@gated-at.bofh.it> |
| In reply to | #1396497 |
There are two generics functions ethtool_op_{get|set}_link_ksettings,
so we can use them instead of defining the same code in the driver.
Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
---
drivers/net/ethernet/freescale/fec_main.c | 26 ++------------------------
1 files changed, 2 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index e1d24ff..f2dae6c 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2055,28 +2055,6 @@ static void fec_enet_mii_remove(struct fec_enet_private *fep)
}
}
-static int fec_enet_get_link_ksettings(struct net_device *ndev,
- struct ethtool_link_ksettings *cmd)
-{
- struct phy_device *phydev = ndev->phydev;
-
- if (!phydev)
- return -ENODEV;
-
- return phy_ethtool_ksettings_get(phydev, cmd);
-}
-
-static int fec_enet_set_link_ksettings(struct net_device *ndev,
- const struct ethtool_link_ksettings *cmd)
-{
- struct phy_device *phydev = ndev->phydev;
-
- if (!phydev)
- return -ENODEV;
-
- return phy_ethtool_ksettings_set(phydev, cmd);
-}
-
static void fec_enet_get_drvinfo(struct net_device *ndev,
struct ethtool_drvinfo *info)
{
@@ -2575,8 +2553,8 @@ static const struct ethtool_ops fec_enet_ethtool_ops = {
.set_tunable = fec_enet_set_tunable,
.get_wol = fec_enet_get_wol,
.set_wol = fec_enet_set_wol,
- .get_link_ksettings = fec_enet_get_link_ksettings,
- .set_link_ksettings = fec_enet_set_link_ksettings,
+ .get_link_ksettings = ethtool_op_get_link_ksettings,
+ .set_link_ksettings = ethtool_op_set_link_ksettings,
};
static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
--
1.7.4.4
[toc] | [prev] | [next] | [standalone]
| From | Philippe Reynes <tremyfr@gmail.com> |
|---|---|
| Date | 2016-05-08 23:50 +0200 |
| Subject | [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device |
| Message-ID | <rwEKm-6rk-19@gated-at.bofh.it> |
| In reply to | #1396497 |
The private structure contain a pointer to phydev, but the structure
net_device already contain such pointer. So we can remove the pointer
phydev in the private structure, and update the driver to use the one
contained in struct net_device.
Signed-off-by: Philippe Reynes <tremyfr@gmail.com>
---
drivers/net/ethernet/freescale/fec.h | 1 -
drivers/net/ethernet/freescale/fec_main.c | 49 ++++++++++++----------------
2 files changed, 21 insertions(+), 29 deletions(-)
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 195122e..f58f9ea 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -517,7 +517,6 @@ struct fec_enet_private {
/* Phylib and MDIO interface */
struct mii_bus *mii_bus;
- struct phy_device *phy_dev;
int mii_timeout;
uint phy_speed;
phy_interface_t phy_interface;
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index bfa10c3..e1d24ff 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -967,10 +967,10 @@ fec_restart(struct net_device *ndev)
rcntl &= ~(1 << 8);
/* 1G, 100M or 10M */
- if (fep->phy_dev) {
- if (fep->phy_dev->speed == SPEED_1000)
+ if (ndev->phydev) {
+ if (ndev->phydev->speed == SPEED_1000)
ecntl |= (1 << 5);
- else if (fep->phy_dev->speed == SPEED_100)
+ else if (ndev->phydev->speed == SPEED_100)
rcntl &= ~(1 << 9);
else
rcntl |= (1 << 9);
@@ -991,7 +991,7 @@ fec_restart(struct net_device *ndev)
*/
cfgr = (fep->phy_interface == PHY_INTERFACE_MODE_RMII)
? BM_MIIGSK_CFGR_RMII : BM_MIIGSK_CFGR_MII;
- if (fep->phy_dev && fep->phy_dev->speed == SPEED_10)
+ if (ndev->phydev && ndev->phydev->speed == SPEED_10)
cfgr |= BM_MIIGSK_CFGR_FRCONT_10M;
writel(cfgr, fep->hwp + FEC_MIIGSK_CFGR);
@@ -1005,7 +1005,7 @@ fec_restart(struct net_device *ndev)
/* enable pause frame*/
if ((fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) ||
((fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) &&
- fep->phy_dev && fep->phy_dev->pause)) {
+ ndev->phydev && ndev->phydev->pause)) {
rcntl |= FEC_ENET_FCE;
/* set FIFO threshold parameter to reduce overrun */
@@ -1679,7 +1679,7 @@ static void fec_get_mac(struct net_device *ndev)
static void fec_enet_adjust_link(struct net_device *ndev)
{
struct fec_enet_private *fep = netdev_priv(ndev);
- struct phy_device *phy_dev = fep->phy_dev;
+ struct phy_device *phy_dev = ndev->phydev;
int status_change = 0;
/* Prevent a state halted on mii error */
@@ -1879,8 +1879,6 @@ static int fec_enet_mii_probe(struct net_device *ndev)
int phy_id;
int dev_id = fep->dev_id;
- fep->phy_dev = NULL;
-
if (fep->phy_node) {
phy_dev = of_phy_connect(ndev, fep->phy_node,
&fec_enet_adjust_link, 0,
@@ -1928,7 +1926,6 @@ static int fec_enet_mii_probe(struct net_device *ndev)
phy_dev->advertising = phy_dev->supported;
- fep->phy_dev = phy_dev;
fep->link = 0;
fep->full_duplex = 0;
@@ -2061,8 +2058,7 @@ static void fec_enet_mii_remove(struct fec_enet_private *fep)
static int fec_enet_get_link_ksettings(struct net_device *ndev,
struct ethtool_link_ksettings *cmd)
{
- struct fec_enet_private *fep = netdev_priv(ndev);
- struct phy_device *phydev = fep->phy_dev;
+ struct phy_device *phydev = ndev->phydev;
if (!phydev)
return -ENODEV;
@@ -2073,8 +2069,7 @@ static int fec_enet_get_link_ksettings(struct net_device *ndev,
static int fec_enet_set_link_ksettings(struct net_device *ndev,
const struct ethtool_link_ksettings *cmd)
{
- struct fec_enet_private *fep = netdev_priv(ndev);
- struct phy_device *phydev = fep->phy_dev;
+ struct phy_device *phydev = ndev->phydev;
if (!phydev)
return -ENODEV;
@@ -2214,7 +2209,7 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
{
struct fec_enet_private *fep = netdev_priv(ndev);
- if (!fep->phy_dev)
+ if (!ndev->phydev)
return -ENODEV;
if (pause->tx_pause != pause->rx_pause) {
@@ -2230,17 +2225,17 @@ static int fec_enet_set_pauseparam(struct net_device *ndev,
fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0;
if (pause->rx_pause || pause->autoneg) {
- fep->phy_dev->supported |= ADVERTISED_Pause;
- fep->phy_dev->advertising |= ADVERTISED_Pause;
+ ndev->phydev->supported |= ADVERTISED_Pause;
+ ndev->phydev->advertising |= ADVERTISED_Pause;
} else {
- fep->phy_dev->supported &= ~ADVERTISED_Pause;
- fep->phy_dev->advertising &= ~ADVERTISED_Pause;
+ ndev->phydev->supported &= ~ADVERTISED_Pause;
+ ndev->phydev->advertising &= ~ADVERTISED_Pause;
}
if (pause->autoneg) {
if (netif_running(ndev))
fec_stop(ndev);
- phy_start_aneg(fep->phy_dev);
+ phy_start_aneg(ndev->phydev);
}
if (netif_running(ndev)) {
napi_disable(&fep->napi);
@@ -2356,8 +2351,7 @@ static int fec_enet_get_sset_count(struct net_device *dev, int sset)
static int fec_enet_nway_reset(struct net_device *dev)
{
- struct fec_enet_private *fep = netdev_priv(dev);
- struct phy_device *phydev = fep->phy_dev;
+ struct phy_device *phydev = dev->phydev;
if (!phydev)
return -ENODEV;
@@ -2588,7 +2582,7 @@ static const struct ethtool_ops fec_enet_ethtool_ops = {
static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
{
struct fec_enet_private *fep = netdev_priv(ndev);
- struct phy_device *phydev = fep->phy_dev;
+ struct phy_device *phydev = ndev->phydev;
if (!netif_running(ndev))
return -EINVAL;
@@ -2843,7 +2837,7 @@ fec_enet_open(struct net_device *ndev)
goto err_enet_mii_probe;
napi_enable(&fep->napi);
- phy_start(fep->phy_dev);
+ phy_start(ndev->phydev);
netif_tx_start_all_queues(ndev);
device_set_wakeup_enable(&ndev->dev, fep->wol_flag &
@@ -2867,7 +2861,7 @@ fec_enet_close(struct net_device *ndev)
{
struct fec_enet_private *fep = netdev_priv(ndev);
- phy_stop(fep->phy_dev);
+ phy_stop(ndev->phydev);
if (netif_device_present(ndev)) {
napi_disable(&fep->napi);
@@ -2875,8 +2869,7 @@ fec_enet_close(struct net_device *ndev)
fec_stop(ndev);
}
- phy_disconnect(fep->phy_dev);
- fep->phy_dev = NULL;
+ phy_disconnect(ndev->phydev);
fec_enet_clk_enable(ndev, false);
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
@@ -3504,7 +3497,7 @@ static int __maybe_unused fec_suspend(struct device *dev)
if (netif_running(ndev)) {
if (fep->wol_flag & FEC_WOL_FLAG_ENABLE)
fep->wol_flag |= FEC_WOL_FLAG_SLEEP_ON;
- phy_stop(fep->phy_dev);
+ phy_stop(ndev->phydev);
napi_disable(&fep->napi);
netif_tx_lock_bh(ndev);
netif_device_detach(ndev);
@@ -3564,7 +3557,7 @@ static int __maybe_unused fec_resume(struct device *dev)
netif_device_attach(ndev);
netif_tx_unlock_bh(ndev);
napi_enable(&fep->napi);
- phy_start(fep->phy_dev);
+ phy_start(ndev->phydev);
}
rtnl_unlock();
--
1.7.4.4
[toc] | [prev] | [next] | [standalone]
| From | Ben Hutchings <ben@decadent.org.uk> |
|---|---|
| Date | 2016-05-09 00:30 +0200 |
| Subject | Re: [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device |
| Message-ID | <rwFn3-7dV-11@gated-at.bofh.it> |
| In reply to | #1396499 |
[Multipart message — attachments visible in raw view] — view raw
On Sun, 2016-05-08 at 23:44 +0200, Philippe Reynes wrote: > The private structure contain a pointer to phydev, but the structure > net_device already contain such pointer. So we can remove the pointer > phydev in the private structure, and update the driver to use the one > contained in struct net_device. But there is no central code that updates the pointer, so: [...] > @@ -1928,7 +1926,6 @@ static int fec_enet_mii_probe(struct net_device *ndev) > > phy_dev->advertising = phy_dev->supported; > > - fep->phy_dev = phy_dev; you need to assign ndev->phydev here [...] > @@ -2875,8 +2869,7 @@ fec_enet_close(struct net_device *ndev) > fec_stop(ndev); > } > > - phy_disconnect(fep->phy_dev); > - fep->phy_dev = NULL; > + phy_disconnect(ndev->phydev); [...] and you need to set it to NULL here. Ben. -- Ben Hutchings I haven't lost my mind; it's backed up on tape somewhere.
[toc] | [prev] | [next] | [standalone]
| From | Philippe Reynes <tremyfr@gmail.com> |
|---|---|
| Date | 2016-05-09 00:50 +0200 |
| Subject | Re: [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device |
| Message-ID | <rwFGp-7qe-11@gated-at.bofh.it> |
| In reply to | #1396504 |
On 09/05/16 00:22, Ben Hutchings wrote: > On Sun, 2016-05-08 at 23:44 +0200, Philippe Reynes wrote: >> The private structure contain a pointer to phydev, but the structure >> net_device already contain such pointer. So we can remove the pointer >> phydev in the private structure, and update the driver to use the one >> contained in struct net_device. > > But there is no central code that updates the pointer, so: The function phy_attach_direct and phy_detach update the pointer phydev in the struct net_device. > > [...] >> @@ -1928,7 +1926,6 @@ static int fec_enet_mii_probe(struct net_device *ndev) >> >> phy_dev->advertising = phy_dev->supported; >> >> - fep->phy_dev = phy_dev; > > you need to assign ndev->phydev here The function fec_enet_mii_probe call of_phy_connect, which call phy_connect_direct, which call phy_attach_direct. This last function update the pointer phydev of struct net_device. > [...] >> @@ -2875,8 +2869,7 @@ fec_enet_close(struct net_device *ndev) >> fec_stop(ndev); >> } >> >> - phy_disconnect(fep->phy_dev); >> - fep->phy_dev = NULL; >> + phy_disconnect(ndev->phydev); > [...] > > and you need to set it to NULL here. The function fec_enet_close call phy_disconnect, which call phy_detach. This last function set the pointer phydev in the struct net_device to NULL. So from my understanding, those two lines aren't usefull. May you confirm that I'm on the right way please ? > Ben. > Philippe
[toc] | [prev] | [next] | [standalone]
| From | Ben Hutchings <ben@decadent.org.uk> |
|---|---|
| Date | 2016-05-09 01:10 +0200 |
| Subject | Re: [PATCH v2 2/3] net: ethernet: fec: use phydev from struct net_device |
| Message-ID | <rwFZL-82O-3@gated-at.bofh.it> |
| In reply to | #1396514 |
[Multipart message — attachments visible in raw view] — view raw
On Mon, 2016-05-09 at 00:47 +0200, Philippe Reynes wrote: > On 09/05/16 00:22, Ben Hutchings wrote: > > > > On Sun, 2016-05-08 at 23:44 +0200, Philippe Reynes wrote: > > > > > > The private structure contain a pointer to phydev, but the structure > > > net_device already contain such pointer. So we can remove the pointer > > > phydev in the private structure, and update the driver to use the one > > > contained in struct net_device. > > But there is no central code that updates the pointer, so: > The function phy_attach_direct and phy_detach update the pointer > phydev in the struct net_device. [...] > So from my understanding, those two lines aren't usefull. > May you confirm that I'm on the right way please ? Sorry, you're right. Ben. -- Ben Hutchings I haven't lost my mind; it's backed up on tape somewhere.
[toc] | [prev] | [next] | [standalone]
| From | Fugang Duan <fugang.duan@nxp.com> |
|---|---|
| Date | 2016-05-09 04:00 +0200 |
| Subject | RE: [PATCH v2 0/3] net: ethtool: add ethtool_op_{get|set}_link_ksettings |
| Message-ID | <rwIEi-1Ti-1@gated-at.bofh.it> |
| In reply to | #1396497 |
Fom: Philippe Reynes <tremyfr@gmail.com> Sent: Monday, May 09, 2016 5:45 AM
> To: Fugang Duan <fugang.duan@nxp.com>; davem@davemloft.net;
> ben@decadent.org.uk; kan.liang@intel.com; decot@googlers.com;
> aduyck@mirantis.com; jiri@mellanox.com; jacob.e.keller@intel.com;
> tom@herbertland.com; andrew@lunn.ch
> Cc: netdev@vger.kernel.org; linux-kernel@vger.kernel.org; Philippe Reynes
> <tremyfr@gmail.com>
> Subject: [PATCH v2 0/3] net: ethtool: add ethtool_op_{get|set}_link_ksettings
>
> Ethtool callbacks {get|set}_link_ksettings may be the same for many drivers. So
> we add two generics callbacks ethtool_op_{get|set}_link_ksettings.
>
> To use those generics callbacks, the ethernet driver must use the pointer
> phydev contained in struct net_device, and not use a private structure to store
> this pointer.
>
> Changelog:
> v2:
> - use generic function instead of macro
> - ethernet driver use the pointer phydev provided by struct net_device
> Those idea were provided by Ben Hutchings,
> and Florian Fainelli acknowledge them.
>
> Philippe Reynes (3):
> net: core: ethtool: add ethtool_op_{get|set}_link_ksettings
> net: ethernet: fec: use phydev from struct net_device
> net: ethernet: fec: use ethtool_op_{get|set}_link_ksettings
>
> drivers/net/ethernet/freescale/fec.h | 1 -
> drivers/net/ethernet/freescale/fec_main.c | 71 +++++++++--------------------
> include/linux/ethtool.h | 5 ++
> net/core/ethtool.c | 24 ++++++++++
> 4 files changed, 50 insertions(+), 51 deletions(-)
>
> --
> 1.7.4.4
Acked-by: Fugang Duan <fugang.duan@nxp.com>
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web