[PATCH] net: aquantia: atlantic: remove declaration of hw_atl_utils_hw_set_power

2017-06-09 Thread Philippe Reynes
This function is not defined, so no need to declare it.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 .../aquantia/atlantic/hw_atl/hw_atl_utils.h|3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h 
b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
index b8e3d88..a66aee5 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h
@@ -193,9 +193,6 @@ int hw_atl_utils_hw_get_regs(struct aq_hw_s *self,
 struct aq_hw_caps_s *aq_hw_caps,
 u32 *regs_buff);
 
-int hw_atl_utils_hw_get_settings(struct aq_hw_s *self,
-struct ethtool_cmd *cmd);
-
 int hw_atl_utils_hw_set_power(struct aq_hw_s *self,
  unsigned int power_state);
 
-- 
1.7.4.4



Re: [B.A.T.M.A.N.] [PATCH] net: batman-adv: use new api ethtool_{get|set}_link_ksettings

2017-03-31 Thread Philippe Reynes
Hi Sven,

On 3/31/17, Sven Eckelmann <s...@narfation.org> wrote:
> On Donnerstag, 30. März 2017 23:01:27 CEST Philippe Reynes wrote:
>> The ethtool api {get|set}_settings is deprecated.
>> We move this driver to new api {get|set}_link_ksettings.
>>
>> I've only compiled this change. If someone may test it,
>> it would be very nice.
>>
>> Signed-off-by: Philippe Reynes <trem...@gmail.com>
>> ---
>>  net/batman-adv/soft-interface.c |   25 -
>>  1 files changed, 12 insertions(+), 13 deletions(-)
>
> Do you know if anyone already prepared the get_link_ksettings support for
> kernels older than 4.6 for backports.git?

Sorry, I don't know this repo. Do you have an url please ?
But I suppose that nobody works on such backport.

> Kind regards,
>   Sven

Regards,
Philippe


[PATCH] net: batman-adv: use new api ethtool_{get|set}_link_ksettings

2017-03-30 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

I've only compiled this change. If someone may test it,
it would be very nice.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 net/batman-adv/soft-interface.c |   25 -
 1 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
index d042c99..07f6627 100644
--- a/net/batman-adv/soft-interface.c
+++ b/net/batman-adv/soft-interface.c
@@ -64,7 +64,8 @@
 #include "sysfs.h"
 #include "translation-table.h"
 
-static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd 
*cmd);
+static int batadv_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd);
 static void batadv_get_drvinfo(struct net_device *dev,
   struct ethtool_drvinfo *info);
 static u32 batadv_get_msglevel(struct net_device *dev);
@@ -76,7 +77,6 @@ static void batadv_get_ethtool_stats(struct net_device *dev,
 static int batadv_get_sset_count(struct net_device *dev, int stringset);
 
 static const struct ethtool_ops batadv_ethtool_ops = {
-   .get_settings = batadv_get_settings,
.get_drvinfo = batadv_get_drvinfo,
.get_msglevel = batadv_get_msglevel,
.set_msglevel = batadv_set_msglevel,
@@ -84,6 +84,7 @@ static void batadv_get_ethtool_stats(struct net_device *dev,
.get_strings = batadv_get_strings,
.get_ethtool_stats = batadv_get_ethtool_stats,
.get_sset_count = batadv_get_sset_count,
+   .get_link_ksettings = batadv_get_link_ksettings,
 };
 
 int batadv_skb_head_push(struct sk_buff *skb, unsigned int len)
@@ -1085,18 +1086,16 @@ struct rtnl_link_ops batadv_link_ops __read_mostly = {
 };
 
 /* ethtool */
-static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int batadv_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
-   cmd->supported = 0;
-   cmd->advertising = 0;
-   ethtool_cmd_speed_set(cmd, SPEED_10);
-   cmd->duplex = DUPLEX_FULL;
-   cmd->port = PORT_TP;
-   cmd->phy_address = 0;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->autoneg = AUTONEG_DISABLE;
-   cmd->maxtxpkt = 0;
-   cmd->maxrxpkt = 0;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   cmd->base.speed = SPEED_10;
+   cmd->base.duplex = DUPLEX_FULL;
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = 0;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
return 0;
 }
-- 
1.7.4.4



[PATCH v2] net: veth: use new api ethtool_{get|set}_link_ksettings

2017-03-29 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- avoid useless initiazation to zero (thanks Xin Long)

 drivers/net/veth.c |   19 +++
 1 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index 8c39d6d..3171036 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -45,18 +45,13 @@ struct veth_priv {
{ "peer_ifindex" },
 };
 
-static int veth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int veth_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
-   cmd->supported  = 0;
-   cmd->advertising= 0;
-   ethtool_cmd_speed_set(cmd, SPEED_1);
-   cmd->duplex = DUPLEX_FULL;
-   cmd->port   = PORT_TP;
-   cmd->phy_address= 0;
-   cmd->transceiver= XCVR_INTERNAL;
-   cmd->autoneg= AUTONEG_DISABLE;
-   cmd->maxtxpkt   = 0;
-   cmd->maxrxpkt   = 0;
+   cmd->base.speed = SPEED_1;
+   cmd->base.duplex= DUPLEX_FULL;
+   cmd->base.port  = PORT_TP;
+   cmd->base.autoneg   = AUTONEG_DISABLE;
return 0;
 }
 
@@ -95,12 +90,12 @@ static void veth_get_ethtool_stats(struct net_device *dev,
 }
 
 static const struct ethtool_ops veth_ethtool_ops = {
-   .get_settings   = veth_get_settings,
.get_drvinfo= veth_get_drvinfo,
.get_link   = ethtool_op_get_link,
.get_strings= veth_get_strings,
.get_sset_count = veth_get_sset_count,
.get_ethtool_stats  = veth_get_ethtool_stats,
+   .get_link_ksettings = veth_get_link_ksettings,
 };
 
 static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
-- 
1.7.4.4



[PATCH] net: tehuti: use new api ethtool_{get|set}_link_ksettings

2017-03-26 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/tehuti/tehuti.c |   43 ++---
 1 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/drivers/net/ethernet/tehuti/tehuti.c 
b/drivers/net/ethernet/tehuti/tehuti.c
index f864fd0..711fbbb 100644
--- a/drivers/net/ethernet/tehuti/tehuti.c
+++ b/drivers/net/ethernet/tehuti/tehuti.c
@@ -2124,33 +2124,26 @@ static void bdx_tx_push_desc_safe(struct bdx_priv 
*priv, void *data, int size)
 };
 
 /*
- * bdx_get_settings - get device-specific settings
+ * bdx_get_link_ksettings - get device-specific settings
  * @netdev
  * @ecmd
  */
-static int bdx_get_settings(struct net_device *netdev, struct ethtool_cmd 
*ecmd)
-{
-   u32 rdintcm;
-   u32 tdintcm;
-   struct bdx_priv *priv = netdev_priv(netdev);
-
-   rdintcm = priv->rdintcm;
-   tdintcm = priv->tdintcm;
-
-   ecmd->supported = (SUPPORTED_1baseT_Full | SUPPORTED_FIBRE);
-   ecmd->advertising = (ADVERTISED_1baseT_Full | ADVERTISED_FIBRE);
-   ethtool_cmd_speed_set(ecmd, SPEED_1);
-   ecmd->duplex = DUPLEX_FULL;
-   ecmd->port = PORT_FIBRE;
-   ecmd->transceiver = XCVR_EXTERNAL;  /* what does it mean? */
-   ecmd->autoneg = AUTONEG_DISABLE;
-
-   /* PCK_TH measures in multiples of FIFO bytes
-  We translate to packets */
-   ecmd->maxtxpkt =
-   ((GET_PCK_TH(tdintcm) * PCK_TH_MULT) / BDX_TXF_DESC_SZ);
-   ecmd->maxrxpkt =
-   ((GET_PCK_TH(rdintcm) * PCK_TH_MULT) / sizeof(struct rxf_desc));
+static int bdx_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *ecmd)
+{
+   ethtool_link_ksettings_zero_link_mode(ecmd, supported);
+   ethtool_link_ksettings_add_link_mode(ecmd, supported,
+1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(ecmd, supported, FIBRE);
+   ethtool_link_ksettings_zero_link_mode(ecmd, advertising);
+   ethtool_link_ksettings_add_link_mode(ecmd, advertising,
+1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(ecmd, advertising, FIBRE);
+
+   ecmd->base.speed = SPEED_1;
+   ecmd->base.duplex = DUPLEX_FULL;
+   ecmd->base.port = PORT_FIBRE;
+   ecmd->base.autoneg = AUTONEG_DISABLE;
 
return 0;
 }
@@ -2384,7 +2377,6 @@ static void bdx_get_ethtool_stats(struct net_device 
*netdev,
 static void bdx_set_ethtool_ops(struct net_device *netdev)
 {
static const struct ethtool_ops bdx_ethtool_ops = {
-   .get_settings = bdx_get_settings,
.get_drvinfo = bdx_get_drvinfo,
.get_link = ethtool_op_get_link,
.get_coalesce = bdx_get_coalesce,
@@ -2394,6 +2386,7 @@ static void bdx_set_ethtool_ops(struct net_device *netdev)
.get_strings = bdx_get_strings,
.get_sset_count = bdx_get_sset_count,
.get_ethtool_stats = bdx_get_ethtool_stats,
+   .get_link_ksettings = bdx_get_link_ksettings,
};
 
netdev->ethtool_ops = _ethtool_ops;
-- 
1.7.4.4



[PATCH] net: cris: eth_v10: use new api ethtool_{get|set}_link_ksettings

2017-03-25 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/cris/eth_v10.c |   32 
 1 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/net/cris/eth_v10.c b/drivers/net/cris/eth_v10.c
index 91c876a..da02041 100644
--- a/drivers/net/cris/eth_v10.c
+++ b/drivers/net/cris/eth_v10.c
@@ -1412,31 +1412,39 @@ struct transceiver_ops transceivers[] =
return rc;
 }
 
-static int e100_get_settings(struct net_device *dev,
-struct ethtool_cmd *cmd)
+static int e100_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct net_local *np = netdev_priv(dev);
+   u32 supported;
int err;
 
spin_lock_irq(>lock);
-   err = mii_ethtool_gset(>mii_if, cmd);
+   err = mii_ethtool_get_link_ksettings(>mii_if, cmd);
spin_unlock_irq(>lock);
 
/* The PHY may support 1000baseT, but the Etrax100 does not.  */
-   cmd->supported &= ~(SUPPORTED_1000baseT_Half
-   | SUPPORTED_1000baseT_Full);
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
+
+   supported &= ~(SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full);
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+
return err;
 }
 
-static int e100_set_settings(struct net_device *dev,
-struct ethtool_cmd *ecmd)
+static int e100_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *ecmd)
 {
-   if (ecmd->autoneg == AUTONEG_ENABLE) {
+   if (ecmd->base.autoneg == AUTONEG_ENABLE) {
e100_set_duplex(dev, autoneg);
e100_set_speed(dev, 0);
} else {
-   e100_set_duplex(dev, ecmd->duplex == DUPLEX_HALF ? half : full);
-   e100_set_speed(dev, ecmd->speed == SPEED_10 ? 10: 100);
+   e100_set_duplex(dev, ecmd->base.duplex == DUPLEX_HALF ?
+   half : full);
+   e100_set_speed(dev, ecmd->base.speed == SPEED_10 ? 10 : 100);
}
 
return 0;
@@ -1459,11 +1467,11 @@ static int e100_nway_reset(struct net_device *dev)
 }
 
 static const struct ethtool_ops e100_ethtool_ops = {
-   .get_settings   = e100_get_settings,
-   .set_settings   = e100_set_settings,
.get_drvinfo= e100_get_drvinfo,
.nway_reset = e100_nway_reset,
.get_link   = ethtool_op_get_link,
+   .get_link_ksettings = e100_get_link_ksettings,
+   .set_link_ksettings = e100_set_link_ksettings,
 };
 
 static int
-- 
1.7.4.4



[PATCH] net: vmxnet3: use new api ethtool_{get|set}_link_ksettings

2017-03-22 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/vmxnet3/vmxnet3_ethtool.c |   25 ++---
 1 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethtool.c 
b/drivers/net/vmxnet3/vmxnet3_ethtool.c
index f88ffaf..2ff2731 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethtool.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethtool.c
@@ -471,22 +471,25 @@ int vmxnet3_set_features(struct net_device *netdev, 
netdev_features_t features)
 
 
 static int
-vmxnet3_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
+vmxnet3_get_link_ksettings(struct net_device *netdev,
+  struct ethtool_link_ksettings *ecmd)
 {
struct vmxnet3_adapter *adapter = netdev_priv(netdev);
 
-   ecmd->supported = SUPPORTED_1baseT_Full | SUPPORTED_1000baseT_Full |
- SUPPORTED_TP;
-   ecmd->advertising = ADVERTISED_TP;
-   ecmd->port = PORT_TP;
-   ecmd->transceiver = XCVR_INTERNAL;
+   ethtool_link_ksettings_zero_link_mode(ecmd, supported);
+   ethtool_link_ksettings_add_link_mode(ecmd, supported, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(ecmd, supported, 1000baseT_Full);
+   ethtool_link_ksettings_add_link_mode(ecmd, supported, TP);
+   ethtool_link_ksettings_zero_link_mode(ecmd, advertising);
+   ethtool_link_ksettings_add_link_mode(ecmd, advertising, TP);
+   ecmd->base.port = PORT_TP;
 
if (adapter->link_speed) {
-   ethtool_cmd_speed_set(ecmd, adapter->link_speed);
-   ecmd->duplex = DUPLEX_FULL;
+   ecmd->base.speed = adapter->link_speed;
+   ecmd->base.duplex = DUPLEX_FULL;
} else {
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   ecmd->base.speed = SPEED_UNKNOWN;
+   ecmd->base.duplex = DUPLEX_UNKNOWN;
}
return 0;
 }
@@ -880,7 +883,6 @@ int vmxnet3_set_features(struct net_device *netdev, 
netdev_features_t features)
 }
 
 static const struct ethtool_ops vmxnet3_ethtool_ops = {
-   .get_settings  = vmxnet3_get_settings,
.get_drvinfo   = vmxnet3_get_drvinfo,
.get_regs_len  = vmxnet3_get_regs_len,
.get_regs  = vmxnet3_get_regs,
@@ -900,6 +902,7 @@ int vmxnet3_set_features(struct net_device *netdev, 
netdev_features_t features)
.get_rxfh  = vmxnet3_get_rss,
.set_rxfh  = vmxnet3_set_rss,
 #endif
+   .get_link_ksettings = vmxnet3_get_link_ksettings,
 };
 
 void vmxnet3_set_ethtool_ops(struct net_device *netdev)
-- 
1.7.4.4



[PATCH 2] net: virtio_net: use new api ethtool_{get|set}_link_ksettings

2017-03-21 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- remove comment about the missing hardware,
  I've tested this change with qemu

 drivers/net/virtio_net.c |   50 +++--
 1 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index ea9890d..b0d241d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1636,47 +1636,57 @@ static void virtnet_get_channels(struct net_device *dev,
 }
 
 /* Check if the user is trying to change anything besides speed/duplex */
-static bool virtnet_validate_ethtool_cmd(const struct ethtool_cmd *cmd)
+static bool
+virtnet_validate_ethtool_cmd(const struct ethtool_link_ksettings *cmd)
 {
-   struct ethtool_cmd diff1 = *cmd;
-   struct ethtool_cmd diff2 = {};
+   struct ethtool_link_ksettings diff1 = *cmd;
+   struct ethtool_link_ksettings diff2 = {};
 
/* cmd is always set so we need to clear it, validate the port type
 * and also without autonegotiation we can ignore advertising
 */
-   ethtool_cmd_speed_set(, 0);
-   diff2.port = PORT_OTHER;
-   diff1.advertising = 0;
-   diff1.duplex = 0;
-   diff1.cmd = 0;
+   diff1.base.speed = 0;
+   diff2.base.port = PORT_OTHER;
+   ethtool_link_ksettings_zero_link_mode(, advertising);
+   diff1.base.duplex = 0;
+   diff1.base.cmd = 0;
+   diff1.base.link_mode_masks_nwords = 0;
 
-   return !memcmp(, , sizeof(diff1));
+   return !memcmp(, , sizeof(diff1.base)) &&
+   bitmap_empty(diff1.link_modes.supported,
+__ETHTOOL_LINK_MODE_MASK_NBITS) &&
+   bitmap_empty(diff1.link_modes.advertising,
+__ETHTOOL_LINK_MODE_MASK_NBITS) &&
+   bitmap_empty(diff1.link_modes.lp_advertising,
+__ETHTOOL_LINK_MODE_MASK_NBITS);
 }
 
-static int virtnet_set_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int virtnet_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct virtnet_info *vi = netdev_priv(dev);
u32 speed;
 
-   speed = ethtool_cmd_speed(cmd);
+   speed = cmd->base.speed;
/* don't allow custom speed and duplex */
if (!ethtool_validate_speed(speed) ||
-   !ethtool_validate_duplex(cmd->duplex) ||
+   !ethtool_validate_duplex(cmd->base.duplex) ||
!virtnet_validate_ethtool_cmd(cmd))
return -EINVAL;
vi->speed = speed;
-   vi->duplex = cmd->duplex;
+   vi->duplex = cmd->base.duplex;
 
return 0;
 }
 
-static int virtnet_get_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int virtnet_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct virtnet_info *vi = netdev_priv(dev);
 
-   ethtool_cmd_speed_set(cmd, vi->speed);
-   cmd->duplex = vi->duplex;
-   cmd->port = PORT_OTHER;
+   cmd->base.speed = vi->speed;
+   cmd->base.duplex = vi->duplex;
+   cmd->base.port = PORT_OTHER;
 
return 0;
 }
@@ -1696,8 +1706,8 @@ static void virtnet_init_settings(struct net_device *dev)
.set_channels = virtnet_set_channels,
.get_channels = virtnet_get_channels,
.get_ts_info = ethtool_op_get_ts_info,
-   .get_settings = virtnet_get_settings,
-   .set_settings = virtnet_set_settings,
+   .get_link_ksettings = virtnet_get_link_ksettings,
+   .set_link_ksettings = virtnet_set_link_ksettings,
 };
 
 static void virtnet_freeze_down(struct virtio_device *vdev)
-- 
1.7.4.4



[PATCH] net: virtio_net: use new api ethtool_{get|set}_link_ksettings

2017-03-21 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/virtio_net.c |   50 +++--
 1 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index ea9890d..b0d241d 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1636,47 +1636,57 @@ static void virtnet_get_channels(struct net_device *dev,
 }
 
 /* Check if the user is trying to change anything besides speed/duplex */
-static bool virtnet_validate_ethtool_cmd(const struct ethtool_cmd *cmd)
+static bool
+virtnet_validate_ethtool_cmd(const struct ethtool_link_ksettings *cmd)
 {
-   struct ethtool_cmd diff1 = *cmd;
-   struct ethtool_cmd diff2 = {};
+   struct ethtool_link_ksettings diff1 = *cmd;
+   struct ethtool_link_ksettings diff2 = {};
 
/* cmd is always set so we need to clear it, validate the port type
 * and also without autonegotiation we can ignore advertising
 */
-   ethtool_cmd_speed_set(, 0);
-   diff2.port = PORT_OTHER;
-   diff1.advertising = 0;
-   diff1.duplex = 0;
-   diff1.cmd = 0;
+   diff1.base.speed = 0;
+   diff2.base.port = PORT_OTHER;
+   ethtool_link_ksettings_zero_link_mode(, advertising);
+   diff1.base.duplex = 0;
+   diff1.base.cmd = 0;
+   diff1.base.link_mode_masks_nwords = 0;
 
-   return !memcmp(, , sizeof(diff1));
+   return !memcmp(, , sizeof(diff1.base)) &&
+   bitmap_empty(diff1.link_modes.supported,
+__ETHTOOL_LINK_MODE_MASK_NBITS) &&
+   bitmap_empty(diff1.link_modes.advertising,
+__ETHTOOL_LINK_MODE_MASK_NBITS) &&
+   bitmap_empty(diff1.link_modes.lp_advertising,
+__ETHTOOL_LINK_MODE_MASK_NBITS);
 }
 
-static int virtnet_set_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int virtnet_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct virtnet_info *vi = netdev_priv(dev);
u32 speed;
 
-   speed = ethtool_cmd_speed(cmd);
+   speed = cmd->base.speed;
/* don't allow custom speed and duplex */
if (!ethtool_validate_speed(speed) ||
-   !ethtool_validate_duplex(cmd->duplex) ||
+   !ethtool_validate_duplex(cmd->base.duplex) ||
!virtnet_validate_ethtool_cmd(cmd))
return -EINVAL;
vi->speed = speed;
-   vi->duplex = cmd->duplex;
+   vi->duplex = cmd->base.duplex;
 
return 0;
 }
 
-static int virtnet_get_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int virtnet_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct virtnet_info *vi = netdev_priv(dev);
 
-   ethtool_cmd_speed_set(cmd, vi->speed);
-   cmd->duplex = vi->duplex;
-   cmd->port = PORT_OTHER;
+   cmd->base.speed = vi->speed;
+   cmd->base.duplex = vi->duplex;
+   cmd->base.port = PORT_OTHER;
 
return 0;
 }
@@ -1696,8 +1706,8 @@ static void virtnet_init_settings(struct net_device *dev)
.set_channels = virtnet_set_channels,
.get_channels = virtnet_get_channels,
.get_ts_info = ethtool_op_get_ts_info,
-   .get_settings = virtnet_get_settings,
-   .set_settings = virtnet_set_settings,
+   .get_link_ksettings = virtnet_get_link_ksettings,
+   .set_link_ksettings = virtnet_set_link_ksettings,
 };
 
 static void virtnet_freeze_down(struct virtio_device *vdev)
-- 
1.7.4.4



Re: [PATCH] net: veth: use new api ethtool_{get|set}_link_ksettings

2017-03-20 Thread Philippe Reynes
Hi Xin Long,

On 3/20/17, Xin Long <lucien@gmail.com> wrote:
> On Sat, Mar 18, 2017 at 7:13 PM, Philippe Reynes <trem...@gmail.com> wrote:
>> The ethtool api {get|set}_settings is deprecated.
>> We move this driver to new api {get|set}_link_ksettings.
>>
>> Signed-off-by: Philippe Reynes <trem...@gmail.com>
>> ---
>>  drivers/net/veth.c |   22 ++
>>  1 files changed, 10 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/net/veth.c b/drivers/net/veth.c
>> index 8c39d6d..730b133 100644
>> --- a/drivers/net/veth.c
>> +++ b/drivers/net/veth.c
>> @@ -45,18 +45,16 @@ struct veth_priv {
>> { "peer_ifindex" },
>>  };
>>
>> -static int veth_get_settings(struct net_device *dev, struct ethtool_cmd
>> *cmd)
>> +static int veth_get_link_ksettings(struct net_device *dev,
>> +  struct ethtool_link_ksettings *cmd)
>>  {
>> -   cmd->supported  = 0;
>> -   cmd->advertising= 0;
>> -   ethtool_cmd_speed_set(cmd, SPEED_1);
>> -   cmd->duplex = DUPLEX_FULL;
>> -   cmd->port   = PORT_TP;
>> -   cmd->phy_address= 0;
>> -   cmd->transceiver= XCVR_INTERNAL;
>> -   cmd->autoneg= AUTONEG_DISABLE;
>> -   cmd->maxtxpkt   = 0;
>> -   cmd->maxrxpkt   = 0;
>> +   ethtool_link_ksettings_zero_link_mode(cmd, supported);
>> +   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
>> +   cmd->base.speed = SPEED_1;
>> +   cmd->base.duplex= DUPLEX_FULL;
>> +   cmd->base.port  = PORT_TP;
>> +   cmd->base.phy_address   = 0;
> It seem always:
> memset(_ksettings, 0, sizeof(link_ksettings));
> err = dev->ethtool_ops->get_link_ksettings(dev, _ksettings);

You're right.

> do we really need:
>ethtool_link_ksettings_zero_link_mode(cmd, supported);
>ethtool_link_ksettings_zero_link_mode(cmd, advertising);
>cmd->base.phy_address   = 0;
> ?

As this code is just an api change, I prefer to keep this code.
Of course, if David prefer to remove this code, I'll remove it.

But you're right, there is a lot of function "get_link_ksettings"
that set to 0 some variable. It's useless as done just before
calling the callback.



Regards,
Philippe


[PATCH] net: veth: use new api ethtool_{get|set}_link_ksettings

2017-03-18 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/veth.c |   22 ++
 1 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index 8c39d6d..730b133 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -45,18 +45,16 @@ struct veth_priv {
{ "peer_ifindex" },
 };
 
-static int veth_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int veth_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
-   cmd->supported  = 0;
-   cmd->advertising= 0;
-   ethtool_cmd_speed_set(cmd, SPEED_1);
-   cmd->duplex = DUPLEX_FULL;
-   cmd->port   = PORT_TP;
-   cmd->phy_address= 0;
-   cmd->transceiver= XCVR_INTERNAL;
-   cmd->autoneg= AUTONEG_DISABLE;
-   cmd->maxtxpkt   = 0;
-   cmd->maxrxpkt   = 0;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   cmd->base.speed = SPEED_1;
+   cmd->base.duplex= DUPLEX_FULL;
+   cmd->base.port  = PORT_TP;
+   cmd->base.phy_address   = 0;
+   cmd->base.autoneg   = AUTONEG_DISABLE;
return 0;
 }
 
@@ -95,12 +93,12 @@ static void veth_get_ethtool_stats(struct net_device *dev,
 }
 
 static const struct ethtool_ops veth_ethtool_ops = {
-   .get_settings   = veth_get_settings,
.get_drvinfo= veth_get_drvinfo,
.get_link   = ethtool_op_get_link,
.get_strings= veth_get_strings,
.get_sset_count = veth_get_sset_count,
.get_ethtool_stats  = veth_get_ethtool_stats,
+   .get_link_ksettings = veth_get_link_ksettings,
 };
 
 static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
-- 
1.7.4.4



[PATCH] net: usb: pegasus: use new api ethtool_{get|set}_link_ksettings

2017-03-17 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/pegasus.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c
index 3667448..321e059 100644
--- a/drivers/net/usb/pegasus.c
+++ b/drivers/net/usb/pegasus.c
@@ -953,20 +953,22 @@ static inline void pegasus_reset_wol(struct net_device 
*dev)
 }
 
 static int
-pegasus_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+pegasus_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *ecmd)
 {
pegasus_t *pegasus;
 
pegasus = netdev_priv(dev);
-   mii_ethtool_gset(>mii, ecmd);
+   mii_ethtool_get_link_ksettings(>mii, ecmd);
return 0;
 }
 
 static int
-pegasus_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+pegasus_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *ecmd)
 {
pegasus_t *pegasus = netdev_priv(dev);
-   return mii_ethtool_sset(>mii, ecmd);
+   return mii_ethtool_set_link_ksettings(>mii, ecmd);
 }
 
 static int pegasus_nway_reset(struct net_device *dev)
@@ -995,14 +997,14 @@ static void pegasus_set_msglevel(struct net_device *dev, 
u32 v)
 
 static const struct ethtool_ops ops = {
.get_drvinfo = pegasus_get_drvinfo,
-   .get_settings = pegasus_get_settings,
-   .set_settings = pegasus_set_settings,
.nway_reset = pegasus_nway_reset,
.get_link = pegasus_get_link,
.get_msglevel = pegasus_get_msglevel,
.set_msglevel = pegasus_set_msglevel,
.get_wol = pegasus_get_wol,
.set_wol = pegasus_set_wol,
+   .get_link_ksettings = pegasus_get_link_ksettings,
+   .set_link_ksettings = pegasus_set_link_ksettings,
 };
 
 static int pegasus_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH v3] net: sun: sungem: rix a possible null dereference

2017-03-17 Thread Philippe Reynes
The function gem_begin_auto_negotiation dereference
the pointer ep before testing if it's null. This
patch add a check on ep before dereferencing it.

Fixes: 92552fdda557 ("net: sun: sungem: use new api
ethtool_{get|set}_link_ksettings")

Reported-by: Dan Carpenter <dan.carpen...@oracle.com>
Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v3:
- fix the sha1-id in the tag Fixes (thanks David Miller)
v2:
- use Fixes tag (thanks Sergei Shtylyov)

 drivers/net/ethernet/sun/sungem.c |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/sun/sungem.c 
b/drivers/net/ethernet/sun/sungem.c
index dbfca04..fa607d0 100644
--- a/drivers/net/ethernet/sun/sungem.c
+++ b/drivers/net/ethernet/sun/sungem.c
@@ -1259,8 +1259,9 @@ static void gem_begin_auto_negotiation(struct gem *gp,
int duplex;
u32 advertising;
 
-   ethtool_convert_link_mode_to_legacy_u32(,
-   ep->link_modes.advertising);
+   if (ep)
+   ethtool_convert_link_mode_to_legacy_u32(
+   , ep->link_modes.advertising);
 
if (gp->phy_type != phy_mii_mdio0 &&
gp->phy_type != phy_mii_mdio1)
-- 
1.7.4.4



[PATCH 00/11] net: usbnet: move to new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated. On usbnet, it
was often implemented with usbnet_{get|set}_settings.

In this serie, I add usbnet_{get|set}_link_ksettings
in the first patch, then I update all the driver to
use this new api, and in the last patch I remove the
old api usbnet_{get|set}_settings.


Philippe Reynes (11):
  net: usb: usbnet: add new api ethtool_{get|set}_link_ksettings
  net: usb: smsc95xx: use new api ethtool_{get|set}_link_ksettings
  net: usb: sr9800: use new api ethtool_{get|set}_link_ksettings
  net: usb: cdc_ncm: use new api ethtool_{get|set}_link_ksettings
  net: usb: dm9601: use new api ethtool_{get|set}_link_ksettings
  net: usb: mcs7830: use new api ethtool_{get|set}_link_ksettings
  net: usb: sierra_net: use new api ethtool_{get|set}_link_ksettings
  net: usb: smsc75xx: use new api ethtool_{get|set}_link_ksettings
  net: usb: sr9700: use new api ethtool_{get|set}_link_ksettings
  net: usb: asix: use new api ethtool_{get|set}_link_ksettings
  net: usb: usb: remove old api ethtool_{get|set}_settings

 drivers/net/usb/asix_devices.c |   12 ++--
 drivers/net/usb/cdc_ncm.c  |4 ++--
 drivers/net/usb/dm9601.c   |4 ++--
 drivers/net/usb/mcs7830.c  |4 ++--
 drivers/net/usb/sierra_net.c   |4 ++--
 drivers/net/usb/smsc75xx.c |4 ++--
 drivers/net/usb/smsc95xx.c |   24 
 drivers/net/usb/sr9700.c   |4 ++--
 drivers/net/usb/sr9800.c   |4 ++--
 drivers/net/usb/usbnet.c   |   19 ++-
 include/linux/usb/usbnet.h |8 
 11 files changed, 46 insertions(+), 45 deletions(-)

-- 
1.7.4.4



[PATCH 04/11] net: usb: cdc_ncm: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/cdc_ncm.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index f317984..b6c1d3a 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -131,8 +131,6 @@ static void cdc_ncm_get_strings(struct net_device 
__always_unused *netdev, u32 s
 static void cdc_ncm_update_rxtx_max(struct usbnet *dev, u32 new_rx, u32 
new_tx);
 
 static const struct ethtool_ops cdc_ncm_ethtool_ops = {
-   .get_settings  = usbnet_get_settings,
-   .set_settings  = usbnet_set_settings,
.get_link  = usbnet_get_link,
.nway_reset= usbnet_nway_reset,
.get_drvinfo   = usbnet_get_drvinfo,
@@ -142,6 +140,8 @@ static void cdc_ncm_get_strings(struct net_device 
__always_unused *netdev, u32 s
.get_sset_count= cdc_ncm_get_sset_count,
.get_strings   = cdc_ncm_get_strings,
.get_ethtool_stats = cdc_ncm_get_ethtool_stats,
+   .get_link_ksettings  = usbnet_get_link_ksettings,
+   .set_link_ksettings  = usbnet_set_link_ksettings,
 };
 
 static u32 cdc_ncm_check_rx_max(struct usbnet *dev, u32 new_rx)
-- 
1.7.4.4



[PATCH 01/11] net: usb: usbnet: add new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We add the new api {get|set}_link_ksettings to this driver.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/usbnet.c   |   36 
 include/linux/usb/usbnet.h |4 
 2 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 3de65ea..1b40b18 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -980,6 +980,40 @@ int usbnet_set_settings (struct net_device *net, struct 
ethtool_cmd *cmd)
 }
 EXPORT_SYMBOL_GPL(usbnet_set_settings);
 
+int usbnet_get_link_ksettings(struct net_device *net,
+ struct ethtool_link_ksettings *cmd)
+{
+   struct usbnet *dev = netdev_priv(net);
+
+   if (!dev->mii.mdio_read)
+   return -EOPNOTSUPP;
+
+   return mii_ethtool_get_link_ksettings(>mii, cmd);
+}
+EXPORT_SYMBOL_GPL(usbnet_get_link_ksettings);
+
+int usbnet_set_link_ksettings(struct net_device *net,
+ const struct ethtool_link_ksettings *cmd)
+{
+   struct usbnet *dev = netdev_priv(net);
+   int retval;
+
+   if (!dev->mii.mdio_write)
+   return -EOPNOTSUPP;
+
+   retval = mii_ethtool_set_link_ksettings(>mii, cmd);
+
+   /* link speed/duplex might have changed */
+   if (dev->driver_info->link_reset)
+   dev->driver_info->link_reset(dev);
+
+   /* hard_mtu or rx_urb_size may change in link_reset() */
+   usbnet_update_max_qlen(dev);
+
+   return retval;
+}
+EXPORT_SYMBOL_GPL(usbnet_set_link_ksettings);
+
 u32 usbnet_get_link (struct net_device *net)
 {
struct usbnet *dev = netdev_priv(net);
@@ -1046,6 +1080,8 @@ void usbnet_set_msglevel (struct net_device *net, u32 
level)
.get_msglevel   = usbnet_get_msglevel,
.set_msglevel   = usbnet_set_msglevel,
.get_ts_info= ethtool_op_get_ts_info,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 /*-*/
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index 6e0ce8c..5bd8007 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -265,6 +265,10 @@ extern int usbnet_get_settings(struct net_device *net,
   struct ethtool_cmd *cmd);
 extern int usbnet_set_settings(struct net_device *net,
   struct ethtool_cmd *cmd);
+extern int usbnet_get_link_ksettings(struct net_device *net,
+struct ethtool_link_ksettings *cmd);
+extern int usbnet_set_link_ksettings(struct net_device *net,
+const struct ethtool_link_ksettings *cmd);
 extern u32 usbnet_get_link(struct net_device *net);
 extern u32 usbnet_get_msglevel(struct net_device *);
 extern void usbnet_set_msglevel(struct net_device *, u32);
-- 
1.7.4.4



[PATCH 11/11] net: usb: usb: remove old api ethtool_{get|set}_settings

2017-03-16 Thread Philippe Reynes
The function usbnet_{get|set}_settings is no longer used,
so we remove it.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/usbnet.c   |   35 ---
 include/linux/usb/usbnet.h |4 
 2 files changed, 0 insertions(+), 39 deletions(-)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 1b40b18..13d4ec5 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -947,39 +947,6 @@ int usbnet_open (struct net_device *net)
  * they'll probably want to use this base set.
  */
 
-int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd)
-{
-   struct usbnet *dev = netdev_priv(net);
-
-   if (!dev->mii.mdio_read)
-   return -EOPNOTSUPP;
-
-   return mii_ethtool_gset(>mii, cmd);
-}
-EXPORT_SYMBOL_GPL(usbnet_get_settings);
-
-int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd)
-{
-   struct usbnet *dev = netdev_priv(net);
-   int retval;
-
-   if (!dev->mii.mdio_write)
-   return -EOPNOTSUPP;
-
-   retval = mii_ethtool_sset(>mii, cmd);
-
-   /* link speed/duplex might have changed */
-   if (dev->driver_info->link_reset)
-   dev->driver_info->link_reset(dev);
-
-   /* hard_mtu or rx_urb_size may change in link_reset() */
-   usbnet_update_max_qlen(dev);
-
-   return retval;
-
-}
-EXPORT_SYMBOL_GPL(usbnet_set_settings);
-
 int usbnet_get_link_ksettings(struct net_device *net,
  struct ethtool_link_ksettings *cmd)
 {
@@ -1072,8 +1039,6 @@ void usbnet_set_msglevel (struct net_device *net, u32 
level)
 
 /* drivers may override default ethtool_ops in their bind() routine */
 static const struct ethtool_ops usbnet_ethtool_ops = {
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.get_link   = usbnet_get_link,
.nway_reset = usbnet_nway_reset,
.get_drvinfo= usbnet_get_drvinfo,
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
index 5bd8007..e2b5691 100644
--- a/include/linux/usb/usbnet.h
+++ b/include/linux/usb/usbnet.h
@@ -261,10 +261,6 @@ extern netdev_tx_t usbnet_start_xmit(struct sk_buff *skb,
 extern void usbnet_resume_rx(struct usbnet *);
 extern void usbnet_purge_paused_rxq(struct usbnet *);
 
-extern int usbnet_get_settings(struct net_device *net,
-  struct ethtool_cmd *cmd);
-extern int usbnet_set_settings(struct net_device *net,
-  struct ethtool_cmd *cmd);
 extern int usbnet_get_link_ksettings(struct net_device *net,
 struct ethtool_link_ksettings *cmd);
 extern int usbnet_set_link_ksettings(struct net_device *net,
-- 
1.7.4.4



[PATCH 10/11] net: usb: asix: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/asix_devices.c |   12 ++--
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
index 0dd5106..38456d0 100644
--- a/drivers/net/usb/asix_devices.c
+++ b/drivers/net/usb/asix_devices.c
@@ -136,9 +136,9 @@ static int asix_ioctl (struct net_device *net, struct ifreq 
*rq, int cmd)
.get_eeprom_len = asix_get_eeprom_len,
.get_eeprom = asix_get_eeprom,
.set_eeprom = asix_set_eeprom,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static void ax88172_set_multicast(struct net_device *net)
@@ -301,9 +301,9 @@ static int ax88172_bind(struct usbnet *dev, struct 
usb_interface *intf)
.get_eeprom_len = asix_get_eeprom_len,
.get_eeprom = asix_get_eeprom,
.set_eeprom = asix_set_eeprom,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static int ax88772_link_reset(struct usbnet *dev)
@@ -775,9 +775,9 @@ static void ax88772_unbind(struct usbnet *dev, struct 
usb_interface *intf)
.get_eeprom_len = asix_get_eeprom_len,
.get_eeprom = asix_get_eeprom,
.set_eeprom = asix_set_eeprom,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static int marvell_phy_init(struct usbnet *dev)
-- 
1.7.4.4



[PATCH 09/11] net: usb: sr9700: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/sr9700.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c
index 4a1e9c4..950a3a9 100644
--- a/drivers/net/usb/sr9700.c
+++ b/drivers/net/usb/sr9700.c
@@ -249,9 +249,9 @@ static int sr9700_ioctl(struct net_device *netdev, struct 
ifreq *rq, int cmd)
.set_msglevel   = usbnet_set_msglevel,
.get_eeprom_len = sr9700_get_eeprom_len,
.get_eeprom = sr9700_get_eeprom,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static void sr9700_set_multicast(struct net_device *netdev)
-- 
1.7.4.4



[PATCH 07/11] net: usb: sierra_net: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/sierra_net.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c
index ac69f28..c8f60b8 100644
--- a/drivers/net/usb/sierra_net.c
+++ b/drivers/net/usb/sierra_net.c
@@ -648,9 +648,9 @@ static u32 sierra_net_get_link(struct net_device *net)
.get_link = sierra_net_get_link,
.get_msglevel = usbnet_get_msglevel,
.set_msglevel = usbnet_set_msglevel,
-   .get_settings = usbnet_get_settings,
-   .set_settings = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static int sierra_net_get_fw_attr(struct usbnet *dev, u16 *datap)
-- 
1.7.4.4



[PATCH 08/11] net: usb: smsc75xx: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/smsc75xx.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index 0b17b40..1ab0ff4 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -743,13 +743,13 @@ static int smsc75xx_ethtool_set_wol(struct net_device 
*net,
.get_drvinfo= usbnet_get_drvinfo,
.get_msglevel   = usbnet_get_msglevel,
.set_msglevel   = usbnet_set_msglevel,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.get_eeprom_len = smsc75xx_ethtool_get_eeprom_len,
.get_eeprom = smsc75xx_ethtool_get_eeprom,
.set_eeprom = smsc75xx_ethtool_set_eeprom,
.get_wol= smsc75xx_ethtool_get_wol,
.set_wol= smsc75xx_ethtool_set_wol,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static int smsc75xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH 06/11] net: usb: mcs7830: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/mcs7830.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c
index 4f345bd..5771ff2 100644
--- a/drivers/net/usb/mcs7830.c
+++ b/drivers/net/usb/mcs7830.c
@@ -464,9 +464,9 @@ static void mcs7830_get_regs(struct net_device *net, struct 
ethtool_regs *regs,
.get_link   = usbnet_get_link,
.get_msglevel   = usbnet_get_msglevel,
.set_msglevel   = usbnet_set_msglevel,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static const struct net_device_ops mcs7830_netdev_ops = {
-- 
1.7.4.4



[PATCH 03/11] net: usb: sr9800: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/sr9800.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/sr9800.c b/drivers/net/usb/sr9800.c
index a50df0d..a696b62 100644
--- a/drivers/net/usb/sr9800.c
+++ b/drivers/net/usb/sr9800.c
@@ -524,9 +524,9 @@ static int sr_set_mac_address(struct net_device *net, void 
*p)
.set_wol= sr_set_wol,
.get_eeprom_len = sr_get_eeprom_len,
.get_eeprom = sr_get_eeprom,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static int sr9800_link_reset(struct usbnet *dev)
-- 
1.7.4.4



[PATCH 02/11] net: usb: smsc95xx: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/smsc95xx.c |   24 
 1 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 831aa33..4a8bf96 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -853,32 +853,32 @@ static void set_mdix_status(struct net_device *net, __u8 
mdix_ctrl)
pdata->mdix_ctrl = mdix_ctrl;
 }
 
-static int smsc95xx_get_settings(struct net_device *net,
-struct ethtool_cmd *cmd)
+static int smsc95xx_get_link_ksettings(struct net_device *net,
+  struct ethtool_link_ksettings *cmd)
 {
struct usbnet *dev = netdev_priv(net);
struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
int retval;
 
-   retval = usbnet_get_settings(net, cmd);
+   retval = usbnet_get_link_ksettings(net, cmd);
 
-   cmd->eth_tp_mdix = pdata->mdix_ctrl;
-   cmd->eth_tp_mdix_ctrl = pdata->mdix_ctrl;
+   cmd->base.eth_tp_mdix = pdata->mdix_ctrl;
+   cmd->base.eth_tp_mdix_ctrl = pdata->mdix_ctrl;
 
return retval;
 }
 
-static int smsc95xx_set_settings(struct net_device *net,
-struct ethtool_cmd *cmd)
+static int smsc95xx_set_link_ksettings(struct net_device *net,
+  const struct ethtool_link_ksettings *cmd)
 {
struct usbnet *dev = netdev_priv(net);
struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]);
int retval;
 
-   if (pdata->mdix_ctrl != cmd->eth_tp_mdix_ctrl)
-   set_mdix_status(net, cmd->eth_tp_mdix_ctrl);
+   if (pdata->mdix_ctrl != cmd->base.eth_tp_mdix_ctrl)
+   set_mdix_status(net, cmd->base.eth_tp_mdix_ctrl);
 
-   retval = usbnet_set_settings(net, cmd);
+   retval = usbnet_set_link_ksettings(net, cmd);
 
return retval;
 }
@@ -889,8 +889,6 @@ static int smsc95xx_set_settings(struct net_device *net,
.get_drvinfo= usbnet_get_drvinfo,
.get_msglevel   = usbnet_get_msglevel,
.set_msglevel   = usbnet_set_msglevel,
-   .get_settings   = smsc95xx_get_settings,
-   .set_settings   = smsc95xx_set_settings,
.get_eeprom_len = smsc95xx_ethtool_get_eeprom_len,
.get_eeprom = smsc95xx_ethtool_get_eeprom,
.set_eeprom = smsc95xx_ethtool_set_eeprom,
@@ -898,6 +896,8 @@ static int smsc95xx_set_settings(struct net_device *net,
.get_regs   = smsc95xx_ethtool_getregs,
.get_wol= smsc95xx_ethtool_get_wol,
.set_wol= smsc95xx_ethtool_set_wol,
+   .get_link_ksettings = smsc95xx_get_link_ksettings,
+   .set_link_ksettings = smsc95xx_set_link_ksettings,
 };
 
 static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH 05/11] net: usb: dm9601: use new api ethtool_{get|set}_link_ksettings

2017-03-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/dm9601.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
index 0b4bdd3..fea1b64 100644
--- a/drivers/net/usb/dm9601.c
+++ b/drivers/net/usb/dm9601.c
@@ -281,9 +281,9 @@ static int dm9601_ioctl(struct net_device *net, struct 
ifreq *rq, int cmd)
.set_msglevel   = usbnet_set_msglevel,
.get_eeprom_len = dm9601_get_eeprom_len,
.get_eeprom = dm9601_get_eeprom,
-   .get_settings   = usbnet_get_settings,
-   .set_settings   = usbnet_set_settings,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = usbnet_get_link_ksettings,
+   .set_link_ksettings = usbnet_set_link_ksettings,
 };
 
 static void dm9601_set_multicast(struct net_device *net)
-- 
1.7.4.4



[PATCH v2] net: sun: sungem: rix a possible null dereference

2017-03-15 Thread Philippe Reynes
The function gem_begin_auto_negotiation dereference
the pointer ep before testing if it's null. This
patch add a check on ep before dereferencing it.

Fixes: 92552fdd557 ("net: sun: sungem: use new api
ethtool_{get|set}_link_ksettings")

Reported-by: Dan Carpenter <dan.carpen...@oracle.com>
Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Chanelog:
v2:
- use Fixes tag (thanks Sergei Shtylyov)

 drivers/net/ethernet/sun/sungem.c |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/sun/sungem.c 
b/drivers/net/ethernet/sun/sungem.c
index dbfca04..fa607d0 100644
--- a/drivers/net/ethernet/sun/sungem.c
+++ b/drivers/net/ethernet/sun/sungem.c
@@ -1259,8 +1259,9 @@ static void gem_begin_auto_negotiation(struct gem *gp,
int duplex;
u32 advertising;
 
-   ethtool_convert_link_mode_to_legacy_u32(,
-   ep->link_modes.advertising);
+   if (ep)
+   ethtool_convert_link_mode_to_legacy_u32(
+   , ep->link_modes.advertising);
 
if (gp->phy_type != phy_mii_mdio0 &&
gp->phy_type != phy_mii_mdio1)
-- 
1.7.4.4



Re: [PATCH] net: sun: sungem: rix a possible null dereference

2017-03-15 Thread Philippe Reynes
Hi Sergei,

On 3/15/17, Sergei Shtylyov <sergei.shtyl...@cogentembedded.com> wrote:
> Hello!
>
> On 3/15/2017 12:23 AM, Philippe Reynes wrote:
>
>> The function gem_begin_auto_negotiation dereference
>> the pointer ep before testing if it's null. This
>> patch add a check on ep before dereferencing it.
>>
>> This issue was added by the patch 92552fdd557:
>> "net: sun: sungem: use new api ethtool_{get|set}_link_ksettings".
>
> There's Fixes: tag for that now, described in
> Documentation/process/submitting-patches.rst...

Thanks a lot for pointing me this tag.
I'm sending a v2 of this patch with this tag.

>> Reported-by: Dan Carpenter <dan.carpen...@oracle.com>
>> Signed-off-by: Philippe Reynes <trem...@gmail.com>
> [...]
>
> MBR, Sergei
>

Thanks,
Philippe


[PATCH] net: sun: sungem: rix a possible null dereference

2017-03-14 Thread Philippe Reynes
The function gem_begin_auto_negotiation dereference
the pointer ep before testing if it's null. This
patch add a check on ep before dereferencing it.

This issue was added by the patch 92552fdd557:
"net: sun: sungem: use new api ethtool_{get|set}_link_ksettings".

Reported-by: Dan Carpenter <dan.carpen...@oracle.com>
Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sun/sungem.c |5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/sun/sungem.c 
b/drivers/net/ethernet/sun/sungem.c
index dbfca04..fa607d0 100644
--- a/drivers/net/ethernet/sun/sungem.c
+++ b/drivers/net/ethernet/sun/sungem.c
@@ -1259,8 +1259,9 @@ static void gem_begin_auto_negotiation(struct gem *gp,
int duplex;
u32 advertising;
 
-   ethtool_convert_link_mode_to_legacy_u32(,
-   ep->link_modes.advertising);
+   if (ep)
+   ethtool_convert_link_mode_to_legacy_u32(
+   , ep->link_modes.advertising);
 
if (gp->phy_type != phy_mii_mdio0 &&
gp->phy_type != phy_mii_mdio1)
-- 
1.7.4.4



Re: [PATCH] net: usb: asix88179_178a: use new api ethtool_{get|set}_link_ksettings

2017-03-13 Thread Philippe Reynes
Hi Chris,

On 3/13/17, Chris Roth <chris.r...@usask.ca> wrote:
> I can test it tomorrow. I'll pull a clean copy of 4.10.2, or do you
> suggest a different version than that?

I think that 4.10.2 is fine, there are no change on this driver
between 4.10 and git (net-next).

Thanks a lot for the test.


> Chris

Philippe


> On 2017-03-12 11:02 AM, Philippe Reynes wrote:
>> The ethtool api {get|set}_settings is deprecated.
>> We move this driver to new api {get|set}_link_ksettings.
>>
>> As I don't have the hardware, I'd be very pleased if
>> someone may test this patch.
>>
>> Signed-off-by: Philippe Reynes <trem...@gmail.com>
>> ---
>>  drivers/net/usb/ax88179_178a.c |   14 --
>>  1 files changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/net/usb/ax88179_178a.c
>> b/drivers/net/usb/ax88179_178a.c
>> index a3a7db0..4a0ae7c 100644
>> --- a/drivers/net/usb/ax88179_178a.c
>> +++ b/drivers/net/usb/ax88179_178a.c
>> @@ -620,16 +620,18 @@ static int ax88179_get_eeprom_len(struct net_device
>> *net)
>>  return 0;
>>  }
>>
>> -static int ax88179_get_settings(struct net_device *net, struct
>> ethtool_cmd *cmd)
>> +static int ax88179_get_link_ksettings(struct net_device *net,
>> +  struct ethtool_link_ksettings *cmd)
>>  {
>>  struct usbnet *dev = netdev_priv(net);
>> -return mii_ethtool_gset(>mii, cmd);
>> +return mii_ethtool_get_link_ksettings(>mii, cmd);
>>  }
>>
>> -static int ax88179_set_settings(struct net_device *net, struct
>> ethtool_cmd *cmd)
>> +static int ax88179_set_link_ksettings(struct net_device *net,
>> +  const struct ethtool_link_ksettings *cmd)
>>  {
>>  struct usbnet *dev = netdev_priv(net);
>> -return mii_ethtool_sset(>mii, cmd);
>> +return mii_ethtool_set_link_ksettings(>mii, cmd);
>>  }
>>
>>  static int
>> @@ -826,11 +828,11 @@ static int ax88179_ioctl(struct net_device *net,
>> struct ifreq *rq, int cmd)
>>  .set_wol= ax88179_set_wol,
>>  .get_eeprom_len = ax88179_get_eeprom_len,
>>  .get_eeprom = ax88179_get_eeprom,
>> -.get_settings   = ax88179_get_settings,
>> -.set_settings   = ax88179_set_settings,
>>  .get_eee= ax88179_get_eee,
>>  .set_eee= ax88179_set_eee,
>>  .nway_reset = usbnet_nway_reset,
>> +.get_link_ksettings = ax88179_get_link_ksettings,
>> +.set_link_ksettings = ax88179_set_link_ksettings,
>>  };
>>
>>  static void ax88179_set_multicast(struct net_device *net)
>
>


[PATCH] net: usb: rtl8150: use new api ethtool_{get|set}_link_ksettings

2017-03-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/rtl8150.c |   35 ---
 1 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/drivers/net/usb/rtl8150.c b/drivers/net/usb/rtl8150.c
index c81c791..daaa88a 100644
--- a/drivers/net/usb/rtl8150.c
+++ b/drivers/net/usb/rtl8150.c
@@ -791,47 +791,52 @@ static void rtl8150_get_drvinfo(struct net_device 
*netdev, struct ethtool_drvinf
usb_make_path(dev->udev, info->bus_info, sizeof(info->bus_info));
 }
 
-static int rtl8150_get_settings(struct net_device *netdev, struct ethtool_cmd 
*ecmd)
+static int rtl8150_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *ecmd)
 {
rtl8150_t *dev = netdev_priv(netdev);
short lpa, bmcr;
+   u32 supported;
 
-   ecmd->supported = (SUPPORTED_10baseT_Half |
+   supported = (SUPPORTED_10baseT_Half |
  SUPPORTED_10baseT_Full |
  SUPPORTED_100baseT_Half |
  SUPPORTED_100baseT_Full |
  SUPPORTED_Autoneg |
  SUPPORTED_TP | SUPPORTED_MII);
-   ecmd->port = PORT_TP;
-   ecmd->transceiver = XCVR_INTERNAL;
-   ecmd->phy_address = dev->phy;
+   ecmd->base.port = PORT_TP;
+   ecmd->base.phy_address = dev->phy;
get_registers(dev, BMCR, 2, );
get_registers(dev, ANLP, 2, );
if (bmcr & BMCR_ANENABLE) {
u32 speed = ((lpa & (LPA_100HALF | LPA_100FULL)) ?
 SPEED_100 : SPEED_10);
-   ethtool_cmd_speed_set(ecmd, speed);
-   ecmd->autoneg = AUTONEG_ENABLE;
+   ecmd->base.speed = speed;
+   ecmd->base.autoneg = AUTONEG_ENABLE;
if (speed == SPEED_100)
-   ecmd->duplex = (lpa & LPA_100FULL) ?
+   ecmd->base.duplex = (lpa & LPA_100FULL) ?
DUPLEX_FULL : DUPLEX_HALF;
else
-   ecmd->duplex = (lpa & LPA_10FULL) ?
+   ecmd->base.duplex = (lpa & LPA_10FULL) ?
DUPLEX_FULL : DUPLEX_HALF;
} else {
-   ecmd->autoneg = AUTONEG_DISABLE;
-   ethtool_cmd_speed_set(ecmd, ((bmcr & BMCR_SPEED100) ?
-SPEED_100 : SPEED_10));
-   ecmd->duplex = (bmcr & BMCR_FULLDPLX) ?
+   ecmd->base.autoneg = AUTONEG_DISABLE;
+   ecmd->base.speed = ((bmcr & BMCR_SPEED100) ?
+SPEED_100 : SPEED_10);
+   ecmd->base.duplex = (bmcr & BMCR_FULLDPLX) ?
DUPLEX_FULL : DUPLEX_HALF;
}
+
+   ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.supported,
+   supported);
+
return 0;
 }
 
 static const struct ethtool_ops ops = {
.get_drvinfo = rtl8150_get_drvinfo,
-   .get_settings = rtl8150_get_settings,
-   .get_link = ethtool_op_get_link
+   .get_link = ethtool_op_get_link,
+   .get_link_ksettings = rtl8150_get_link_ksettings,
 };
 
 static int rtl8150_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH] net: usb: r8152: use new api ethtool_{get|set}_link_ksettings

2017-03-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/r8152.c |   21 -
 1 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 986243c..227e1fd 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -3800,7 +3800,8 @@ static void rtl8152_get_drvinfo(struct net_device *netdev,
 }
 
 static
-int rtl8152_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
+int rtl8152_get_link_ksettings(struct net_device *netdev,
+  struct ethtool_link_ksettings *cmd)
 {
struct r8152 *tp = netdev_priv(netdev);
int ret;
@@ -3814,7 +3815,7 @@ int rtl8152_get_settings(struct net_device *netdev, 
struct ethtool_cmd *cmd)
 
mutex_lock(>control);
 
-   ret = mii_ethtool_gset(>mii, cmd);
+   ret = mii_ethtool_get_link_ksettings(>mii, cmd);
 
mutex_unlock(>control);
 
@@ -3824,7 +3825,8 @@ int rtl8152_get_settings(struct net_device *netdev, 
struct ethtool_cmd *cmd)
return ret;
 }
 
-static int rtl8152_set_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int rtl8152_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct r8152 *tp = netdev_priv(dev);
int ret;
@@ -3835,11 +3837,12 @@ static int rtl8152_set_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
 
mutex_lock(>control);
 
-   ret = rtl8152_set_speed(tp, cmd->autoneg, cmd->speed, cmd->duplex);
+   ret = rtl8152_set_speed(tp, cmd->base.autoneg, cmd->base.speed,
+   cmd->base.duplex);
if (!ret) {
-   tp->autoneg = cmd->autoneg;
-   tp->speed = cmd->speed;
-   tp->duplex = cmd->duplex;
+   tp->autoneg = cmd->base.autoneg;
+   tp->speed = cmd->base.speed;
+   tp->duplex = cmd->base.duplex;
}
 
mutex_unlock(>control);
@@ -4117,8 +4120,6 @@ static int rtl8152_set_coalesce(struct net_device *netdev,
 
 static const struct ethtool_ops ops = {
.get_drvinfo = rtl8152_get_drvinfo,
-   .get_settings = rtl8152_get_settings,
-   .set_settings = rtl8152_set_settings,
.get_link = ethtool_op_get_link,
.nway_reset = rtl8152_nway_reset,
.get_msglevel = rtl8152_get_msglevel,
@@ -4132,6 +4133,8 @@ static int rtl8152_set_coalesce(struct net_device *netdev,
.set_coalesce = rtl8152_set_coalesce,
.get_eee = rtl_ethtool_get_eee,
.set_eee = rtl_ethtool_set_eee,
+   .get_link_ksettings = rtl8152_get_link_ksettings,
+   .set_link_ksettings = rtl8152_set_link_ksettings,
 };
 
 static int rtl8152_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH] net: usb: catc: use new api ethtool_{get|set}_link_ksettings

2017-03-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/catc.c |   31 ++-
 1 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c
index 0acc9b64..fce92f0 100644
--- a/drivers/net/usb/catc.c
+++ b/drivers/net/usb/catc.c
@@ -688,29 +688,34 @@ static void catc_get_drvinfo(struct net_device *dev,
usb_make_path(catc->usbdev, info->bus_info, sizeof(info->bus_info));
 }
 
-static int catc_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int catc_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct catc *catc = netdev_priv(dev);
if (!catc->is_f5u011)
return -EOPNOTSUPP;
 
-   cmd->supported = SUPPORTED_10baseT_Half | SUPPORTED_TP;
-   cmd->advertising = ADVERTISED_10baseT_Half | ADVERTISED_TP;
-   ethtool_cmd_speed_set(cmd, SPEED_10);
-   cmd->duplex = DUPLEX_HALF;
-   cmd->port = PORT_TP; 
-   cmd->phy_address = 0;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->autoneg = AUTONEG_DISABLE;
-   cmd->maxtxpkt = 1;
-   cmd->maxrxpkt = 1;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 10baseT_Half);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
+
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Half);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
+
+   cmd->base.speed = SPEED_10;
+   cmd->base.duplex = DUPLEX_HALF;
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = 0;
+   cmd->base.autoneg = AUTONEG_DISABLE;
+
return 0;
 }
 
 static const struct ethtool_ops ops = {
.get_drvinfo = catc_get_drvinfo,
-   .get_settings = catc_get_settings,
-   .get_link = ethtool_op_get_link
+   .get_link = ethtool_op_get_link,
+   .get_link_ksettings = catc_get_link_ksettings,
 };
 
 /*
-- 
1.7.4.4



[PATCH] net: usb: asix88179_178a: use new api ethtool_{get|set}_link_ksettings

2017-03-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/usb/ax88179_178a.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index a3a7db0..4a0ae7c 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -620,16 +620,18 @@ static int ax88179_get_eeprom_len(struct net_device *net)
return 0;
 }
 
-static int ax88179_get_settings(struct net_device *net, struct ethtool_cmd 
*cmd)
+static int ax88179_get_link_ksettings(struct net_device *net,
+ struct ethtool_link_ksettings *cmd)
 {
struct usbnet *dev = netdev_priv(net);
-   return mii_ethtool_gset(>mii, cmd);
+   return mii_ethtool_get_link_ksettings(>mii, cmd);
 }
 
-static int ax88179_set_settings(struct net_device *net, struct ethtool_cmd 
*cmd)
+static int ax88179_set_link_ksettings(struct net_device *net,
+ const struct ethtool_link_ksettings *cmd)
 {
struct usbnet *dev = netdev_priv(net);
-   return mii_ethtool_sset(>mii, cmd);
+   return mii_ethtool_set_link_ksettings(>mii, cmd);
 }
 
 static int
@@ -826,11 +828,11 @@ static int ax88179_ioctl(struct net_device *net, struct 
ifreq *rq, int cmd)
.set_wol= ax88179_set_wol,
.get_eeprom_len = ax88179_get_eeprom_len,
.get_eeprom = ax88179_get_eeprom,
-   .get_settings   = ax88179_get_settings,
-   .set_settings   = ax88179_set_settings,
.get_eee= ax88179_get_eee,
.set_eee= ax88179_set_eee,
.nway_reset = usbnet_nway_reset,
+   .get_link_ksettings = ax88179_get_link_ksettings,
+   .set_link_ksettings = ax88179_set_link_ksettings,
 };
 
 static void ax88179_set_multicast(struct net_device *net)
-- 
1.7.4.4



[PATCH v2] net: tun: use new api ethtool_{get|set}_link_ksettings

2017-03-11 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- Finaly, I've found the hardware and do basic test ;)
  thanks Michael S. Tsirkin and Eric Dumazet for the feedback

 drivers/net/tun.c |   24 +++-
 1 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index dc1b1dd..c418f0a 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -2430,18 +2430,16 @@ static void tun_chr_show_fdinfo(struct seq_file *m, 
struct file *f)
 
 /* ethtool interface */
 
-static int tun_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
-{
-   cmd->supported  = 0;
-   cmd->advertising= 0;
-   ethtool_cmd_speed_set(cmd, SPEED_10);
-   cmd->duplex = DUPLEX_FULL;
-   cmd->port   = PORT_TP;
-   cmd->phy_address= 0;
-   cmd->transceiver= XCVR_INTERNAL;
-   cmd->autoneg= AUTONEG_DISABLE;
-   cmd->maxtxpkt   = 0;
-   cmd->maxrxpkt   = 0;
+static int tun_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
+{
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   cmd->base.speed = SPEED_10;
+   cmd->base.duplex= DUPLEX_FULL;
+   cmd->base.port  = PORT_TP;
+   cmd->base.phy_address   = 0;
+   cmd->base.autoneg   = AUTONEG_DISABLE;
return 0;
 }
 
@@ -2504,7 +2502,6 @@ static int tun_set_coalesce(struct net_device *dev,
 }
 
 static const struct ethtool_ops tun_ethtool_ops = {
-   .get_settings   = tun_get_settings,
.get_drvinfo= tun_get_drvinfo,
.get_msglevel   = tun_get_msglevel,
.set_msglevel   = tun_set_msglevel,
@@ -2512,6 +2509,7 @@ static int tun_set_coalesce(struct net_device *dev,
.get_ts_info= ethtool_op_get_ts_info,
.get_coalesce   = tun_get_coalesce,
.set_coalesce   = tun_set_coalesce,
+   .get_link_ksettings = tun_get_link_ksettings,
 };
 
 static int tun_queue_resize(struct tun_struct *tun)
-- 
1.7.4.4



[PATCH] net: tun: use new api ethtool_{get|set}_link_ksettings

2017-03-10 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/tun.c |   24 +++-
 1 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index dc1b1dd..c418f0a 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -2430,18 +2430,16 @@ static void tun_chr_show_fdinfo(struct seq_file *m, 
struct file *f)
 
 /* ethtool interface */
 
-static int tun_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
-{
-   cmd->supported  = 0;
-   cmd->advertising= 0;
-   ethtool_cmd_speed_set(cmd, SPEED_10);
-   cmd->duplex = DUPLEX_FULL;
-   cmd->port   = PORT_TP;
-   cmd->phy_address= 0;
-   cmd->transceiver= XCVR_INTERNAL;
-   cmd->autoneg= AUTONEG_DISABLE;
-   cmd->maxtxpkt   = 0;
-   cmd->maxrxpkt   = 0;
+static int tun_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
+{
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   cmd->base.speed = SPEED_10;
+   cmd->base.duplex= DUPLEX_FULL;
+   cmd->base.port  = PORT_TP;
+   cmd->base.phy_address   = 0;
+   cmd->base.autoneg   = AUTONEG_DISABLE;
return 0;
 }
 
@@ -2504,7 +2502,6 @@ static int tun_set_coalesce(struct net_device *dev,
 }
 
 static const struct ethtool_ops tun_ethtool_ops = {
-   .get_settings   = tun_get_settings,
.get_drvinfo= tun_get_drvinfo,
.get_msglevel   = tun_get_msglevel,
.set_msglevel   = tun_set_msglevel,
@@ -2512,6 +2509,7 @@ static int tun_set_coalesce(struct net_device *dev,
.get_ts_info= ethtool_op_get_ts_info,
.get_coalesce   = tun_get_coalesce,
.set_coalesce   = tun_set_coalesce,
+   .get_link_ksettings = tun_get_link_ksettings,
 };
 
 static int tun_queue_resize(struct tun_struct *tun)
-- 
1.7.4.4



[PATCH] net: net_netdev: use new api ethtool_{get|set}_link_ksettings

2017-03-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ntb_netdev.c |   25 +
 1 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c
index 36877ba..4daf3d0 100644
--- a/drivers/net/ntb_netdev.c
+++ b/drivers/net/ntb_netdev.c
@@ -372,18 +372,19 @@ static void ntb_get_drvinfo(struct net_device *ndev,
strlcpy(info->bus_info, pci_name(dev->pdev), sizeof(info->bus_info));
 }
 
-static int ntb_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int ntb_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
-   cmd->supported = SUPPORTED_Backplane;
-   cmd->advertising = ADVERTISED_Backplane;
-   ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN);
-   cmd->duplex = DUPLEX_FULL;
-   cmd->port = PORT_OTHER;
-   cmd->phy_address = 0;
-   cmd->transceiver = XCVR_DUMMY1;
-   cmd->autoneg = AUTONEG_ENABLE;
-   cmd->maxtxpkt = 0;
-   cmd->maxrxpkt = 0;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, Backplane);
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, Backplane);
+
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_FULL;
+   cmd->base.port = PORT_OTHER;
+   cmd->base.phy_address = 0;
+   cmd->base.autoneg = AUTONEG_ENABLE;
 
return 0;
 }
@@ -391,7 +392,7 @@ static int ntb_get_settings(struct net_device *dev, struct 
ethtool_cmd *cmd)
 static const struct ethtool_ops ntb_ethtool_ops = {
.get_drvinfo = ntb_get_drvinfo,
.get_link = ethtool_op_get_link,
-   .get_settings = ntb_get_settings,
+   .get_link_ksettings = ntb_get_link_ksettings,
 };
 
 static const struct ntb_queue_handlers ntb_netdev_handlers = {
-- 
1.7.4.4



[PATCH] net: hyperv: use new api ethtool_{get|set}_link_ksettings

2017-03-08 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/hyperv/netvsc_drv.c |   39 +--
 1 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 617dd90..b12808a 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -789,18 +789,19 @@ static int netvsc_set_channels(struct net_device *net,
return ret;
 }
 
-static bool netvsc_validate_ethtool_ss_cmd(const struct ethtool_cmd *cmd)
+static bool
+netvsc_validate_ethtool_ss_cmd(const struct ethtool_link_ksettings *cmd)
 {
-   struct ethtool_cmd diff1 = *cmd;
-   struct ethtool_cmd diff2 = {};
+   struct ethtool_link_ksettings diff1 = *cmd;
+   struct ethtool_link_ksettings diff2 = {};
 
-   ethtool_cmd_speed_set(, 0);
-   diff1.duplex = 0;
+   diff1.base.speed = 0;
+   diff1.base.duplex = 0;
/* advertising and cmd are usually set */
-   diff1.advertising = 0;
-   diff1.cmd = 0;
+   ethtool_link_ksettings_zero_link_mode(, advertising);
+   diff1.base.cmd = 0;
/* We set port to PORT_OTHER */
-   diff2.port = PORT_OTHER;
+   diff2.base.port = PORT_OTHER;
 
return !memcmp(, , sizeof(diff1));
 }
@@ -813,30 +814,32 @@ static void netvsc_init_settings(struct net_device *dev)
ndc->duplex = DUPLEX_UNKNOWN;
 }
 
-static int netvsc_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netvsc_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct net_device_context *ndc = netdev_priv(dev);
 
-   ethtool_cmd_speed_set(cmd, ndc->speed);
-   cmd->duplex = ndc->duplex;
-   cmd->port = PORT_OTHER;
+   cmd->base.speed = ndc->speed;
+   cmd->base.duplex = ndc->duplex;
+   cmd->base.port = PORT_OTHER;
 
return 0;
 }
 
-static int netvsc_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netvsc_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct net_device_context *ndc = netdev_priv(dev);
u32 speed;
 
-   speed = ethtool_cmd_speed(cmd);
+   speed = cmd->base.speed;
if (!ethtool_validate_speed(speed) ||
-   !ethtool_validate_duplex(cmd->duplex) ||
+   !ethtool_validate_duplex(cmd->base.duplex) ||
!netvsc_validate_ethtool_ss_cmd(cmd))
return -EINVAL;
 
ndc->speed = speed;
-   ndc->duplex = cmd->duplex;
+   ndc->duplex = cmd->base.duplex;
 
return 0;
 }
@@ -1170,13 +1173,13 @@ static int netvsc_set_rxfh(struct net_device *dev, 
const u32 *indir,
.get_channels   = netvsc_get_channels,
.set_channels   = netvsc_set_channels,
.get_ts_info= ethtool_op_get_ts_info,
-   .get_settings   = netvsc_get_settings,
-   .set_settings   = netvsc_set_settings,
.get_rxnfc  = netvsc_get_rxnfc,
.get_rxfh_key_size = netvsc_get_rxfh_key_size,
.get_rxfh_indir_size = netvsc_rss_indir_size,
.get_rxfh   = netvsc_get_rxfh,
.set_rxfh   = netvsc_set_rxfh,
+   .get_link_ksettings = netvsc_get_link_ksettings,
+   .set_link_ksettings = netvsc_set_link_ksettings,
 };
 
 static const struct net_device_ops device_ops = {
-- 
1.7.4.4



[PATCH] net: fjes: use new api ethtool_{get|set}_link_ksettings

2017-03-08 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/fjes/fjes_ethtool.c |   19 +--
 1 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/drivers/net/fjes/fjes_ethtool.c b/drivers/net/fjes/fjes_ethtool.c
index 6575f88..7d10171 100644
--- a/drivers/net/fjes/fjes_ethtool.c
+++ b/drivers/net/fjes/fjes_ethtool.c
@@ -175,16 +175,15 @@ static void fjes_get_drvinfo(struct net_device *netdev,
 "platform:%s", plat_dev->name);
 }
 
-static int fjes_get_settings(struct net_device *netdev,
-struct ethtool_cmd *ecmd)
+static int fjes_get_link_ksettings(struct net_device *netdev,
+  struct ethtool_link_ksettings *ecmd)
 {
-   ecmd->supported = 0;
-   ecmd->advertising = 0;
-   ecmd->duplex = DUPLEX_FULL;
-   ecmd->autoneg = AUTONEG_DISABLE;
-   ecmd->transceiver = XCVR_DUMMY1;
-   ecmd->port = PORT_NONE;
-   ethtool_cmd_speed_set(ecmd, 2); /* 20Gb/s */
+   ethtool_link_ksettings_zero_link_mode(ecmd, supported);
+   ethtool_link_ksettings_zero_link_mode(ecmd, advertising);
+   ecmd->base.duplex = DUPLEX_FULL;
+   ecmd->base.autoneg = AUTONEG_DISABLE;
+   ecmd->base.port = PORT_NONE;
+   ecmd->base.speed = 2;   /* 20Gb/s */
 
return 0;
 }
@@ -296,7 +295,6 @@ static int fjes_get_dump_data(struct net_device *netdev,
 }
 
 static const struct ethtool_ops fjes_ethtool_ops = {
-   .get_settings   = fjes_get_settings,
.get_drvinfo= fjes_get_drvinfo,
.get_ethtool_stats = fjes_get_ethtool_stats,
.get_strings  = fjes_get_strings,
@@ -306,6 +304,7 @@ static int fjes_get_dump_data(struct net_device *netdev,
.set_dump   = fjes_set_dump,
.get_dump_flag  = fjes_get_dump_flag,
.get_dump_data  = fjes_get_dump_data,
+   .get_link_ksettings = fjes_get_link_ksettings,
 };
 
 void fjes_set_ethtool_ops(struct net_device *netdev)
-- 
1.7.4.4



[PATCH] net: via: via-velocity: use new api ethtool_{get|set}_link_ksettings

2017-03-08 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/via/via-velocity.c |   62 +-
 1 files changed, 35 insertions(+), 27 deletions(-)

diff --git a/drivers/net/ethernet/via/via-velocity.c 
b/drivers/net/ethernet/via/via-velocity.c
index d088788..ef9538e 100644
--- a/drivers/net/ethernet/via/via-velocity.c
+++ b/drivers/net/ethernet/via/via-velocity.c
@@ -3291,15 +3291,17 @@ static void velocity_ethtool_down(struct net_device 
*dev)
velocity_set_power_state(vptr, PCI_D3hot);
 }
 
-static int velocity_get_settings(struct net_device *dev,
-struct ethtool_cmd *cmd)
+static int velocity_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct velocity_info *vptr = netdev_priv(dev);
struct mac_regs __iomem *regs = vptr->mac_regs;
u32 status;
+   u32 supported, advertising;
+
status = check_connection_type(vptr->mac_regs);
 
-   cmd->supported = SUPPORTED_TP |
+   supported = SUPPORTED_TP |
SUPPORTED_Autoneg |
SUPPORTED_10baseT_Half |
SUPPORTED_10baseT_Full |
@@ -3308,9 +3310,9 @@ static int velocity_get_settings(struct net_device *dev,
SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full;
 
-   cmd->advertising = ADVERTISED_TP | ADVERTISED_Autoneg;
+   advertising = ADVERTISED_TP | ADVERTISED_Autoneg;
if (vptr->options.spd_dpx == SPD_DPX_AUTO) {
-   cmd->advertising |=
+   advertising |=
ADVERTISED_10baseT_Half |
ADVERTISED_10baseT_Full |
ADVERTISED_100baseT_Half |
@@ -3320,19 +3322,19 @@ static int velocity_get_settings(struct net_device *dev,
} else {
switch (vptr->options.spd_dpx) {
case SPD_DPX_1000_FULL:
-   cmd->advertising |= ADVERTISED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
break;
case SPD_DPX_100_HALF:
-   cmd->advertising |= ADVERTISED_100baseT_Half;
+   advertising |= ADVERTISED_100baseT_Half;
break;
case SPD_DPX_100_FULL:
-   cmd->advertising |= ADVERTISED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
break;
case SPD_DPX_10_HALF:
-   cmd->advertising |= ADVERTISED_10baseT_Half;
+   advertising |= ADVERTISED_10baseT_Half;
break;
case SPD_DPX_10_FULL:
-   cmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
break;
default:
break;
@@ -3340,30 +3342,35 @@ static int velocity_get_settings(struct net_device *dev,
}
 
if (status & VELOCITY_SPEED_1000)
-   ethtool_cmd_speed_set(cmd, SPEED_1000);
+   cmd->base.speed = SPEED_1000;
else if (status & VELOCITY_SPEED_100)
-   ethtool_cmd_speed_set(cmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
else
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
 
-   cmd->autoneg = (status & VELOCITY_AUTONEG_ENABLE) ? AUTONEG_ENABLE : 
AUTONEG_DISABLE;
-   cmd->port = PORT_TP;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->phy_address = readb(>MIIADR) & 0x1F;
+   cmd->base.autoneg = (status & VELOCITY_AUTONEG_ENABLE) ?
+   AUTONEG_ENABLE : AUTONEG_DISABLE;
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = readb(>MIIADR) & 0x1F;
 
if (status & VELOCITY_DUPLEX_FULL)
-   cmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
else
-   cmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
 
return 0;
 }
 
-static int velocity_set_settings(struct net_device *dev,
-struct ethtool_cmd *cmd)
+static int velocity_set_link_ksettings(struct net_d

[PATCH] net: via: via-rhine: use new api ethtool_{get|set}_link_ksettings

2017-03-07 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/via/via-rhine.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/via/via-rhine.c 
b/drivers/net/ethernet/via/via-rhine.c
index c068c58..4cf41f7 100644
--- a/drivers/net/ethernet/via/via-rhine.c
+++ b/drivers/net/ethernet/via/via-rhine.c
@@ -2303,25 +2303,27 @@ static void netdev_get_drvinfo(struct net_device *dev, 
struct ethtool_drvinfo *i
strlcpy(info->bus_info, dev_name(hwdev), sizeof(info->bus_info));
 }
 
-static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netdev_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct rhine_private *rp = netdev_priv(dev);
int rc;
 
mutex_lock(>task_lock);
-   rc = mii_ethtool_gset(>mii_if, cmd);
+   rc = mii_ethtool_get_link_ksettings(>mii_if, cmd);
mutex_unlock(>task_lock);
 
return rc;
 }
 
-static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netdev_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct rhine_private *rp = netdev_priv(dev);
int rc;
 
mutex_lock(>task_lock);
-   rc = mii_ethtool_sset(>mii_if, cmd);
+   rc = mii_ethtool_set_link_ksettings(>mii_if, cmd);
rhine_set_carrier(>mii_if);
mutex_unlock(>task_lock);
 
@@ -2391,14 +2393,14 @@ static int rhine_set_wol(struct net_device *dev, struct 
ethtool_wolinfo *wol)
 
 static const struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo= netdev_get_drvinfo,
-   .get_settings   = netdev_get_settings,
-   .set_settings   = netdev_set_settings,
.nway_reset = netdev_nway_reset,
.get_link   = netdev_get_link,
.get_msglevel   = netdev_get_msglevel,
.set_msglevel   = netdev_set_msglevel,
.get_wol= rhine_get_wol,
.set_wol= rhine_set_wol,
+   .get_link_ksettings = netdev_get_link_ksettings,
+   .set_link_ksettings = netdev_set_link_ksettings,
 };
 
 static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH v2] net: intel: ixgbe: use new api ethtool_{get|set}_link_ksettings

2017-03-07 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- fix compilation (thanks andrewx bowers)

 drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c |  168 --
 1 files changed, 91 insertions(+), 77 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index 90fa5bf..0da0752f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -186,60 +186,62 @@ static u32 ixgbe_get_supported_10gtypes(struct ixgbe_hw 
*hw)
}
 }
 
-static int ixgbe_get_settings(struct net_device *netdev,
- struct ethtool_cmd *ecmd)
+static int ixgbe_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct ixgbe_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = >hw;
ixgbe_link_speed supported_link;
bool autoneg = false;
+   u32 supported, advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
 
hw->mac.ops.get_link_capabilities(hw, _link, );
 
/* set the supported link speeds */
if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
-   ecmd->supported |= ixgbe_get_supported_10gtypes(hw);
+   supported |= ixgbe_get_supported_10gtypes(hw);
if (supported_link & IXGBE_LINK_SPEED_1GB_FULL)
-   ecmd->supported |= (ixgbe_isbackplane(hw->phy.media_type)) ?
+   supported |= (ixgbe_isbackplane(hw->phy.media_type)) ?
   SUPPORTED_1000baseKX_Full :
   SUPPORTED_1000baseT_Full;
if (supported_link & IXGBE_LINK_SPEED_100_FULL)
-   ecmd->supported |= SUPPORTED_100baseT_Full;
+   supported |= SUPPORTED_100baseT_Full;
if (supported_link & IXGBE_LINK_SPEED_10_FULL)
-   ecmd->supported |= SUPPORTED_10baseT_Full;
+   supported |= SUPPORTED_10baseT_Full;
 
/* default advertised speed if phy.autoneg_advertised isn't set */
-   ecmd->advertising = ecmd->supported;
+   advertising = supported;
/* set the advertised speeds */
if (hw->phy.autoneg_advertised) {
-   ecmd->advertising = 0;
+   advertising = 0;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10_FULL)
-   ecmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
-   ecmd->advertising |= ADVERTISED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
-   ecmd->advertising |= ecmd->supported & ADVRTSD_MSK_10G;
+   advertising |= supported & ADVRTSD_MSK_10G;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) {
-   if (ecmd->supported & SUPPORTED_1000baseKX_Full)
-   ecmd->advertising |= ADVERTISED_1000baseKX_Full;
+   if (supported & SUPPORTED_1000baseKX_Full)
+   advertising |= ADVERTISED_1000baseKX_Full;
else
-   ecmd->advertising |= ADVERTISED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
}
} else {
if (hw->phy.multispeed_fiber && !autoneg) {
if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
-   ecmd->advertising = ADVERTISED_1baseT_Full;
+   advertising = ADVERTISED_1baseT_Full;
}
}
 
if (autoneg) {
-   ecmd->supported |= SUPPORTED_Autoneg;
-   ecmd->advertising |= ADVERTISED_Autoneg;
-   ecmd->autoneg = AUTONEG_ENABLE;
+   supported |= SUPPORTED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
+   cmd->base.autoneg = AUTONEG_ENABLE;
} else
-   ecmd->autoneg = AUTONEG_DISABLE;
-
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
/* Determine the remaining settings based on the PHY type. */
switch (adapter->hw.phy.type) {
@@ -248,

[PATCH] net: tundra: tsi108: use new api ethtool_{get|set}_link_ksettings

2017-03-06 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/tundra/tsi108_eth.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/tundra/tsi108_eth.c 
b/drivers/net/ethernet/tundra/tsi108_eth.c
index c558399..5ac6eaa 100644
--- a/drivers/net/ethernet/tundra/tsi108_eth.c
+++ b/drivers/net/ethernet/tundra/tsi108_eth.c
@@ -1499,27 +1499,29 @@ static void tsi108_init_mac(struct net_device *dev)
TSI_WRITE(TSI108_EC_INTMASK, ~0);
 }
 
-static int tsi108_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int tsi108_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct tsi108_prv_data *data = netdev_priv(dev);
unsigned long flags;
int rc;
 
spin_lock_irqsave(>txlock, flags);
-   rc = mii_ethtool_gset(>mii_if, cmd);
+   rc = mii_ethtool_get_link_ksettings(>mii_if, cmd);
spin_unlock_irqrestore(>txlock, flags);
 
return rc;
 }
 
-static int tsi108_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int tsi108_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct tsi108_prv_data *data = netdev_priv(dev);
unsigned long flags;
int rc;
 
spin_lock_irqsave(>txlock, flags);
-   rc = mii_ethtool_sset(>mii_if, cmd);
+   rc = mii_ethtool_set_link_ksettings(>mii_if, cmd);
spin_unlock_irqrestore(>txlock, flags);
 
return rc;
@@ -1535,8 +1537,8 @@ static int tsi108_do_ioctl(struct net_device *dev, struct 
ifreq *rq, int cmd)
 
 static const struct ethtool_ops tsi108_ethtool_ops = {
.get_link   = ethtool_op_get_link,
-   .get_settings   = tsi108_get_settings,
-   .set_settings   = tsi108_set_settings,
+   .get_link_ksettings = tsi108_get_link_ksettings,
+   .set_link_ksettings = tsi108_set_link_ksettings,
 };
 
 static const struct net_device_ops tsi108_netdev_ops = {
-- 
1.7.4.4



[PATCH] net: toshiba: spider_net: use new api ethtool_{get|set}_link_ksettings

2017-03-05 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/toshiba/spider_net_ethtool.c |   24 
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/toshiba/spider_net_ethtool.c 
b/drivers/net/ethernet/toshiba/spider_net_ethtool.c
index ffe5193..16bd036 100644
--- a/drivers/net/ethernet/toshiba/spider_net_ethtool.c
+++ b/drivers/net/ethernet/toshiba/spider_net_ethtool.c
@@ -47,19 +47,23 @@
 };
 
 static int
-spider_net_ethtool_get_settings(struct net_device *netdev,
-  struct ethtool_cmd *cmd)
+spider_net_ethtool_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *cmd)
 {
struct spider_net_card *card;
card = netdev_priv(netdev);
 
-   cmd->supported   = (SUPPORTED_1000baseT_Full |
-SUPPORTED_FIBRE);
-   cmd->advertising = (ADVERTISED_1000baseT_Full |
-ADVERTISED_FIBRE);
-   cmd->port = PORT_FIBRE;
-   ethtool_cmd_speed_set(cmd, card->phy.speed);
-   cmd->duplex = DUPLEX_FULL;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 1000baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
+
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, 1000baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
+
+   cmd->base.port = PORT_FIBRE;
+   cmd->base.speed = card->phy.speed;
+   cmd->base.duplex = DUPLEX_FULL;
 
return 0;
 }
@@ -166,7 +170,6 @@ static void spider_net_get_strings(struct net_device 
*netdev, u32 stringset,
 }
 
 const struct ethtool_ops spider_net_ethtool_ops = {
-   .get_settings   = spider_net_ethtool_get_settings,
.get_drvinfo= spider_net_ethtool_get_drvinfo,
.get_wol= spider_net_ethtool_get_wol,
.get_msglevel   = spider_net_ethtool_get_msglevel,
@@ -177,5 +180,6 @@ static void spider_net_get_strings(struct net_device 
*netdev, u32 stringset,
.get_strings= spider_net_get_strings,
.get_sset_count = spider_net_get_sset_count,
.get_ethtool_stats  = spider_net_get_ethtool_stats,
+   .get_link_ksettings = spider_net_ethtool_get_link_ksettings,
 };
 
-- 
1.7.4.4



[PATCH] net: toshiba: ps3_genic_net: use new api ethtool_{get|set}_link_ksettings

2017-03-05 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/toshiba/ps3_gelic_net.c |   51 +++---
 1 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_net.c 
b/drivers/net/ethernet/toshiba/ps3_gelic_net.c
index 7201331..fa6a065 100644
--- a/drivers/net/ethernet/toshiba/ps3_gelic_net.c
+++ b/drivers/net/ethernet/toshiba/ps3_gelic_net.c
@@ -1206,61 +1206,68 @@ void gelic_net_get_drvinfo(struct net_device *netdev,
strlcpy(info->version, DRV_VERSION, sizeof(info->version));
 }
 
-static int gelic_ether_get_settings(struct net_device *netdev,
-   struct ethtool_cmd *cmd)
+static int gelic_ether_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *cmd)
 {
struct gelic_card *card = netdev_card(netdev);
+   u32 supported, advertising;
 
gelic_card_get_ether_port_status(card, 0);
 
if (card->ether_port_status & GELIC_LV1_ETHER_FULL_DUPLEX)
-   cmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
else
-   cmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
 
switch (card->ether_port_status & GELIC_LV1_ETHER_SPEED_MASK) {
case GELIC_LV1_ETHER_SPEED_10:
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
break;
case GELIC_LV1_ETHER_SPEED_100:
-   ethtool_cmd_speed_set(cmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
break;
case GELIC_LV1_ETHER_SPEED_1000:
-   ethtool_cmd_speed_set(cmd, SPEED_1000);
+   cmd->base.speed = SPEED_1000;
break;
default:
pr_info("%s: speed unknown\n", __func__);
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
break;
}
 
-   cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg |
+   supported = SUPPORTED_TP | SUPPORTED_Autoneg |
SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
SUPPORTED_1000baseT_Full;
-   cmd->advertising = cmd->supported;
+   advertising = supported;
if (card->link_mode & GELIC_LV1_ETHER_AUTO_NEG) {
-   cmd->autoneg = AUTONEG_ENABLE;
+   cmd->base.autoneg = AUTONEG_ENABLE;
} else {
-   cmd->autoneg = AUTONEG_DISABLE;
-   cmd->advertising &= ~ADVERTISED_Autoneg;
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   advertising &= ~ADVERTISED_Autoneg;
}
-   cmd->port = PORT_TP;
+   cmd->base.port = PORT_TP;
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
 
return 0;
 }
 
-static int gelic_ether_set_settings(struct net_device *netdev,
-   struct ethtool_cmd *cmd)
+static int
+gelic_ether_set_link_ksettings(struct net_device *netdev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct gelic_card *card = netdev_card(netdev);
u64 mode;
int ret;
 
-   if (cmd->autoneg == AUTONEG_ENABLE) {
+   if (cmd->base.autoneg == AUTONEG_ENABLE) {
mode = GELIC_LV1_ETHER_AUTO_NEG;
} else {
-   switch (cmd->speed) {
+   switch (cmd->base.speed) {
case SPEED_10:
mode = GELIC_LV1_ETHER_SPEED_10;
break;
@@ -1273,9 +1280,9 @@ static int gelic_ether_set_settings(struct net_device 
*netdev,
default:
return -EINVAL;
}
-   if (cmd->duplex == DUPLEX_FULL)
+   if (cmd->base.duplex == DUPLEX_FULL) {
mode |= GELIC_LV1_ETHER_FULL_DUPLEX;
-   else if (cmd->speed == SPEED_1000) {
+   } else if (cmd->base.speed == SPEED_1000) {
pr_info("1000 half duplex is not supported.\n");
return -EINVAL;
}
@@ -1370,11 +1377,11 @@ static int gelic_net_set_wol(struct net_device *netdev,
 
 static const struct ethtool_ops gelic_ether_ethtool_ops = {
.get_drvinfo=

[PATCH] net: sun: sunhme: use new api ethtool_{get|set}_link_ksettings

2017-03-05 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sun/sunhme.c |   62 
 1 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/drivers/net/ethernet/sun/sunhme.c 
b/drivers/net/ethernet/sun/sunhme.c
index 72ff05c..53ff66e 100644
--- a/drivers/net/ethernet/sun/sunhme.c
+++ b/drivers/net/ethernet/sun/sunhme.c
@@ -1294,9 +1294,10 @@ static void happy_meal_init_rings(struct happy_meal *hp)
 }
 
 /* hp->happy_lock must be held */
-static void happy_meal_begin_auto_negotiation(struct happy_meal *hp,
- void __iomem *tregs,
- struct ethtool_cmd *ep)
+static void
+happy_meal_begin_auto_negotiation(struct happy_meal *hp,
+ void __iomem *tregs,
+ const struct ethtool_link_ksettings *ep)
 {
int timeout;
 
@@ -1309,7 +1310,7 @@ static void happy_meal_begin_auto_negotiation(struct 
happy_meal *hp,
/* XXX Check BMSR_ANEGCAPABLE, should not be necessary though. */
 
hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE);
-   if (ep == NULL || ep->autoneg == AUTONEG_ENABLE) {
+   if (!ep || ep->base.autoneg == AUTONEG_ENABLE) {
/* Advertise everything we can support. */
if (hp->sw_bmsr & BMSR_10HALF)
hp->sw_advertise |= (ADVERTISE_10HALF);
@@ -1384,14 +1385,14 @@ static void happy_meal_begin_auto_negotiation(struct 
happy_meal *hp,
/* Disable auto-negotiation in BMCR, enable the duplex and
 * speed setting, init the timer state machine, and fire it off.
 */
-   if (ep == NULL || ep->autoneg == AUTONEG_ENABLE) {
+   if (!ep || ep->base.autoneg == AUTONEG_ENABLE) {
hp->sw_bmcr = BMCR_SPEED100;
} else {
-   if (ethtool_cmd_speed(ep) == SPEED_100)
+   if (ep->base.speed == SPEED_100)
hp->sw_bmcr = BMCR_SPEED100;
else
hp->sw_bmcr = 0;
-   if (ep->duplex == DUPLEX_FULL)
+   if (ep->base.duplex == DUPLEX_FULL)
hp->sw_bmcr |= BMCR_FULLDPLX;
}
happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
@@ -2434,20 +2435,21 @@ static void happy_meal_set_multicast(struct net_device 
*dev)
 }
 
 /* Ethtool support... */
-static int hme_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int hme_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct happy_meal *hp = netdev_priv(dev);
u32 speed;
+   u32 supported;
 
-   cmd->supported =
+   supported =
(SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
 SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII);
 
/* XXX hardcoded stuff for now */
-   cmd->port = PORT_TP; /* XXX no MII support */
-   cmd->transceiver = XCVR_INTERNAL; /* XXX no external xcvr support */
-   cmd->phy_address = 0; /* XXX fixed PHYAD */
+   cmd->base.port = PORT_TP; /* XXX no MII support */
+   cmd->base.phy_address = 0; /* XXX fixed PHYAD */
 
/* Record PHY settings. */
spin_lock_irq(>happy_lock);
@@ -2456,41 +2458,45 @@ static int hme_get_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
spin_unlock_irq(>happy_lock);
 
if (hp->sw_bmcr & BMCR_ANENABLE) {
-   cmd->autoneg = AUTONEG_ENABLE;
+   cmd->base.autoneg = AUTONEG_ENABLE;
speed = ((hp->sw_lpa & (LPA_100HALF | LPA_100FULL)) ?
 SPEED_100 : SPEED_10);
if (speed == SPEED_100)
-   cmd->duplex =
+   cmd->base.duplex =
(hp->sw_lpa & (LPA_100FULL)) ?
DUPLEX_FULL : DUPLEX_HALF;
else
-   cmd->duplex =
+   cmd->base.duplex =
(hp->sw_lpa & (LPA_10FULL)) ?
DUPLEX_FULL : DUPLEX_HALF;
} else {
-   cmd->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
speed = (hp->sw_bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10;
-   cmd->duple

[PATCH] net: sun: sungem: use new api ethtool_{get|set}_link_ksettings

2017-03-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sun/sungem.c |   98 +---
 1 files changed, 57 insertions(+), 41 deletions(-)

diff --git a/drivers/net/ethernet/sun/sungem.c 
b/drivers/net/ethernet/sun/sungem.c
index 5c5952e..dbfca04 100644
--- a/drivers/net/ethernet/sun/sungem.c
+++ b/drivers/net/ethernet/sun/sungem.c
@@ -1250,12 +1250,17 @@ static void gem_stop_dma(struct gem *gp)
 
 
 // XXX dbl check what that function should do when called on PCS PHY
-static void gem_begin_auto_negotiation(struct gem *gp, struct ethtool_cmd *ep)
+static void gem_begin_auto_negotiation(struct gem *gp,
+  const struct ethtool_link_ksettings *ep)
 {
u32 advertise, features;
int autoneg;
int speed;
int duplex;
+   u32 advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   ep->link_modes.advertising);
 
if (gp->phy_type != phy_mii_mdio0 &&
gp->phy_type != phy_mii_mdio1)
@@ -1278,13 +1283,13 @@ static void gem_begin_auto_negotiation(struct gem *gp, 
struct ethtool_cmd *ep)
/* Setup link parameters */
if (!ep)
goto start_aneg;
-   if (ep->autoneg == AUTONEG_ENABLE) {
-   advertise = ep->advertising;
+   if (ep->base.autoneg == AUTONEG_ENABLE) {
+   advertise = advertising;
autoneg = 1;
} else {
autoneg = 0;
-   speed = ethtool_cmd_speed(ep);
-   duplex = ep->duplex;
+   speed = ep->base.speed;
+   duplex = ep->base.duplex;
}
 
 start_aneg:
@@ -2515,85 +2520,96 @@ static void gem_get_drvinfo(struct net_device *dev, 
struct ethtool_drvinfo *info
strlcpy(info->bus_info, pci_name(gp->pdev), sizeof(info->bus_info));
 }
 
-static int gem_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int gem_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct gem *gp = netdev_priv(dev);
+   u32 supported, advertising;
 
if (gp->phy_type == phy_mii_mdio0 ||
gp->phy_type == phy_mii_mdio1) {
if (gp->phy_mii.def)
-   cmd->supported = gp->phy_mii.def->features;
+   supported = gp->phy_mii.def->features;
else
-   cmd->supported = (SUPPORTED_10baseT_Half |
+   supported = (SUPPORTED_10baseT_Half |
  SUPPORTED_10baseT_Full);
 
/* XXX hardcoded stuff for now */
-   cmd->port = PORT_MII;
-   cmd->transceiver = XCVR_EXTERNAL;
-   cmd->phy_address = 0; /* XXX fixed PHYAD */
+   cmd->base.port = PORT_MII;
+   cmd->base.phy_address = 0; /* XXX fixed PHYAD */
 
/* Return current PHY settings */
-   cmd->autoneg = gp->want_autoneg;
-   ethtool_cmd_speed_set(cmd, gp->phy_mii.speed);
-   cmd->duplex = gp->phy_mii.duplex;
-   cmd->advertising = gp->phy_mii.advertising;
+   cmd->base.autoneg = gp->want_autoneg;
+   cmd->base.speed = gp->phy_mii.speed;
+   cmd->base.duplex = gp->phy_mii.duplex;
+   advertising = gp->phy_mii.advertising;
 
/* If we started with a forced mode, we don't have a default
 * advertise set, we need to return something sensible so
 * userland can re-enable autoneg properly.
 */
-   if (cmd->advertising == 0)
-   cmd->advertising = cmd->supported;
+   if (advertising == 0)
+   advertising = supported;
} else { // XXX PCS ?
-   cmd->supported =
+   supported =
(SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
 SUPPORTED_Autoneg);
-   cmd->advertising = cmd->supported;
-   ethtool_cmd_speed_set(cmd, 0);
-   cmd->duplex = cmd->port = cmd->phy_address =
-   cmd->transceiver = cmd->autoneg = 0;
+   advertising = supported;
+   cmd->base.speed = 0;
+   cmd->base.duplex = 0;
+   cmd->base.port = 0;
+   cmd->base.phy_address = 0;
+   cmd->base.autoneg

Re: [PATCH] net: smsc: smc91x: use new api ethtool_{get|set}_link_ksettings

2017-03-04 Thread Philippe Reynes
Hi Robert,

On 3/4/17, Robert Jarzmik <robert.jarz...@free.fr> wrote:
> Philippe Reynes <trem...@gmail.com> writes:
>
>> The ethtool api {get|set}_settings is deprecated.
>> We move this driver to new api {get|set}_link_ksettings.
>>
>> As I don't have the hardware, I'd be very pleased if
>> someone may test this patch.
> I have the hardware.
>
> Do you want anything specific to be tested, like setting full/half duplex
> or
> autoneg through ethtool, or just a driver probe/usage ?

I would be very nice if you could test the setting of half/full
duplex, speed, ...


> Cheers.
>
> --
> Robert
>

Thanks a lot for this test,

Regards,
Philippe


[PATCH] net: sun: niu: use new api ethtool_{get|set}_link_ksettings

2017-03-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sun/niu.c |   37 -
 1 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
index 5797805..2dcca24 100644
--- a/drivers/net/ethernet/sun/niu.c
+++ b/drivers/net/ethernet/sun/niu.c
@@ -6813,7 +6813,8 @@ static void niu_get_drvinfo(struct net_device *dev,
sizeof(info->bus_info));
 }
 
-static int niu_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int niu_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct niu *np = netdev_priv(dev);
struct niu_link_config *lp;
@@ -6821,28 +6822,30 @@ static int niu_get_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
lp = >link_config;
 
memset(cmd, 0, sizeof(*cmd));
-   cmd->phy_address = np->phy_addr;
-   cmd->supported = lp->supported;
-   cmd->advertising = lp->active_advertising;
-   cmd->autoneg = lp->active_autoneg;
-   ethtool_cmd_speed_set(cmd, lp->active_speed);
-   cmd->duplex = lp->active_duplex;
-   cmd->port = (np->flags & NIU_FLAGS_FIBER) ? PORT_FIBRE : PORT_TP;
-   cmd->transceiver = (np->flags & NIU_FLAGS_XCVR_SERDES) ?
-   XCVR_EXTERNAL : XCVR_INTERNAL;
+   cmd->base.phy_address = np->phy_addr;
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   lp->supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   lp->active_advertising);
+   cmd->base.autoneg = lp->active_autoneg;
+   cmd->base.speed = lp->active_speed;
+   cmd->base.duplex = lp->active_duplex;
+   cmd->base.port = (np->flags & NIU_FLAGS_FIBER) ? PORT_FIBRE : PORT_TP;
 
return 0;
 }
 
-static int niu_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int niu_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct niu *np = netdev_priv(dev);
struct niu_link_config *lp = >link_config;
 
-   lp->advertising = cmd->advertising;
-   lp->speed = ethtool_cmd_speed(cmd);
-   lp->duplex = cmd->duplex;
-   lp->autoneg = cmd->autoneg;
+   ethtool_convert_link_mode_to_legacy_u32(>advertising,
+   cmd->link_modes.advertising);
+   lp->speed = cmd->base.speed;
+   lp->duplex = cmd->base.duplex;
+   lp->autoneg = cmd->base.autoneg;
return niu_init_link(np);
 }
 
@@ -7902,14 +7905,14 @@ static int niu_set_phys_id(struct net_device *dev,
.nway_reset = niu_nway_reset,
.get_eeprom_len = niu_get_eeprom_len,
.get_eeprom = niu_get_eeprom,
-   .get_settings   = niu_get_settings,
-   .set_settings   = niu_set_settings,
.get_strings= niu_get_strings,
.get_sset_count = niu_get_sset_count,
.get_ethtool_stats  = niu_get_ethtool_stats,
.set_phys_id= niu_set_phys_id,
.get_rxnfc  = niu_get_nfc,
.set_rxnfc  = niu_set_nfc,
+   .get_link_ksettings = niu_get_link_ksettings,
+   .set_link_ksettings = niu_set_link_ksettings,
 };
 
 static int niu_ldg_assign_ldn(struct niu *np, struct niu_parent *parent,
-- 
1.7.4.4



[PATCH] net: sun: cassini: use new api ethtool_{get|set}_link_ksettings

2017-03-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sun/cassini.c |   98 +++-
 1 files changed, 52 insertions(+), 46 deletions(-)

diff --git a/drivers/net/ethernet/sun/cassini.c 
b/drivers/net/ethernet/sun/cassini.c
index 0e8e89f..382993c 100644
--- a/drivers/net/ethernet/sun/cassini.c
+++ b/drivers/net/ethernet/sun/cassini.c
@@ -691,7 +691,8 @@ static void cas_mif_poll(struct cas *cp, const int enable)
 }
 
 /* Must be invoked under cp->lock */
-static void cas_begin_auto_negotiation(struct cas *cp, struct ethtool_cmd *ep)
+static void cas_begin_auto_negotiation(struct cas *cp,
+  const struct ethtool_link_ksettings *ep)
 {
u16 ctl;
 #if 1
@@ -704,16 +705,16 @@ static void cas_begin_auto_negotiation(struct cas *cp, 
struct ethtool_cmd *ep)
if (!ep)
goto start_aneg;
lcntl = cp->link_cntl;
-   if (ep->autoneg == AUTONEG_ENABLE)
+   if (ep->base.autoneg == AUTONEG_ENABLE) {
cp->link_cntl = BMCR_ANENABLE;
-   else {
-   u32 speed = ethtool_cmd_speed(ep);
+   } else {
+   u32 speed = ep->base.speed;
cp->link_cntl = 0;
if (speed == SPEED_100)
cp->link_cntl |= BMCR_SPEED100;
else if (speed == SPEED_1000)
cp->link_cntl |= CAS_BMCR_SPEED1000;
-   if (ep->duplex == DUPLEX_FULL)
+   if (ep->base.duplex == DUPLEX_FULL)
cp->link_cntl |= BMCR_FULLDPLX;
}
 #if 1
@@ -4528,19 +4529,21 @@ static void cas_get_drvinfo(struct net_device *dev, 
struct ethtool_drvinfo *info
strlcpy(info->bus_info, pci_name(cp->pdev), sizeof(info->bus_info));
 }
 
-static int cas_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int cas_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct cas *cp = netdev_priv(dev);
u16 bmcr;
int full_duplex, speed, pause;
unsigned long flags;
enum link_state linkstate = link_up;
+   u32 supported, advertising;
 
-   cmd->advertising = 0;
-   cmd->supported = SUPPORTED_Autoneg;
+   advertising = 0;
+   supported = SUPPORTED_Autoneg;
if (cp->cas_flags & CAS_FLAG_1000MB_CAP) {
-   cmd->supported |= SUPPORTED_1000baseT_Full;
-   cmd->advertising |= ADVERTISED_1000baseT_Full;
+   supported |= SUPPORTED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
}
 
/* Record PHY settings if HW is on. */
@@ -4548,17 +4551,15 @@ static int cas_get_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
bmcr = 0;
linkstate = cp->lstate;
if (CAS_PHY_MII(cp->phy_type)) {
-   cmd->port = PORT_MII;
-   cmd->transceiver = (cp->cas_flags & CAS_FLAG_SATURN) ?
-   XCVR_INTERNAL : XCVR_EXTERNAL;
-   cmd->phy_address = cp->phy_addr;
-   cmd->advertising |= ADVERTISED_TP | ADVERTISED_MII |
+   cmd->base.port = PORT_MII;
+   cmd->base.phy_address = cp->phy_addr;
+   advertising |= ADVERTISED_TP | ADVERTISED_MII |
ADVERTISED_10baseT_Half |
ADVERTISED_10baseT_Full |
ADVERTISED_100baseT_Half |
ADVERTISED_100baseT_Full;
 
-   cmd->supported |=
+   supported |=
(SUPPORTED_10baseT_Half |
 SUPPORTED_10baseT_Full |
 SUPPORTED_100baseT_Half |
@@ -4574,11 +4575,10 @@ static int cas_get_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
}
 
} else {
-   cmd->port = PORT_FIBRE;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->phy_address = 0;
-   cmd->supported   |= SUPPORTED_FIBRE;
-   cmd->advertising |= ADVERTISED_FIBRE;
+   cmd->base.port = PORT_FIBRE;
+   cmd->base.phy_address = 0;
+   supported   |= SUPPORTED_FIBRE;
+   advertising |= ADVERTISED_FIBRE;
 
if (cp->hw_running) {
/* pcs uses the same bits as mii */
@@ -4590,21 +4590,20 @@ static int cas_get_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
spin_unlock_irqrestore(>lock, flags);
 
if (bmcr & BMCR_ANENABLE) {
-   cmd->advertising |= ADVERTISED

[PATCH v2] net: smsc: smc91x: use new api ethtool_{get|set}_link_ksettings

2017-03-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- also update comment (feeback from Russel King)

 drivers/net/ethernet/smsc/smc91x.c |   47 +++
 1 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smc91x.c 
b/drivers/net/ethernet/smsc/smc91x.c
index 65077c7..91e9bd7 100644
--- a/drivers/net/ethernet/smsc/smc91x.c
+++ b/drivers/net/ethernet/smsc/smc91x.c
@@ -1535,32 +1535,33 @@ static int smc_close(struct net_device *dev)
  * Ethtool support
  */
 static int
-smc_ethtool_getsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+smc_ethtool_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct smc_local *lp = netdev_priv(dev);
int ret;
 
-   cmd->maxtxpkt = 1;
-   cmd->maxrxpkt = 1;
-
if (lp->phy_type != 0) {
spin_lock_irq(>lock);
-   ret = mii_ethtool_gset(>mii, cmd);
+   ret = mii_ethtool_get_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
} else {
-   cmd->supported = SUPPORTED_10baseT_Half |
+   u32 supported = SUPPORTED_10baseT_Half |
 SUPPORTED_10baseT_Full |
 SUPPORTED_TP | SUPPORTED_AUI;
 
if (lp->ctl_rspeed == 10)
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
else if (lp->ctl_rspeed == 100)
-   ethtool_cmd_speed_set(cmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
+
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   cmd->base.port = 0;
+   cmd->base.duplex = lp->tcr_cur_mode & TCR_SWFDUP ?
+   DUPLEX_FULL : DUPLEX_HALF;
 
-   cmd->autoneg = AUTONEG_DISABLE;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->port = 0;
-   cmd->duplex = lp->tcr_cur_mode & TCR_SWFDUP ? DUPLEX_FULL : 
DUPLEX_HALF;
+   ethtool_convert_legacy_u32_to_link_mode(
+   cmd->link_modes.supported, supported);
 
ret = 0;
}
@@ -1569,24 +1570,26 @@ static int smc_close(struct net_device *dev)
 }
 
 static int
-smc_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+smc_ethtool_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct smc_local *lp = netdev_priv(dev);
int ret;
 
if (lp->phy_type != 0) {
spin_lock_irq(>lock);
-   ret = mii_ethtool_sset(>mii, cmd);
+   ret = mii_ethtool_set_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
} else {
-   if (cmd->autoneg != AUTONEG_DISABLE ||
-   cmd->speed != SPEED_10 ||
-   (cmd->duplex != DUPLEX_HALF && cmd->duplex != DUPLEX_FULL) 
||
-   (cmd->port != PORT_TP && cmd->port != PORT_AUI))
+   if (cmd->base.autoneg != AUTONEG_DISABLE ||
+   cmd->base.speed != SPEED_10 ||
+   (cmd->base.duplex != DUPLEX_HALF &&
+cmd->base.duplex != DUPLEX_FULL) ||
+   (cmd->base.port != PORT_TP && cmd->base.port != PORT_AUI))
return -EINVAL;
 
-// lp->port = cmd->port;
-   lp->ctl_rfduplx = cmd->duplex == DUPLEX_FULL;
+// lp->port = cmd->base.port;
+   lp->ctl_rfduplx = cmd->base.duplex == DUPLEX_FULL;
 
 // if (netif_running(dev))
 // smc_set_port(dev);
@@ -1744,8 +1747,6 @@ static int smc_ethtool_seteeprom(struct net_device *dev,
 
 
 static const struct ethtool_ops smc_ethtool_ops = {
-   .get_settings   = smc_ethtool_getsettings,
-   .set_settings   = smc_ethtool_setsettings,
.get_drvinfo= smc_ethtool_getdrvinfo,
 
.get_msglevel   = smc_ethtool_getmsglevel,
@@ -1755,6 +1756,8 @@ static int smc_ethtool_seteeprom(struct net_device *dev,
.get_eeprom_len = smc_ethtool_geteeprom_len,
.get_eeprom = smc_ethtool_geteeprom,
.set_eeprom = smc_ethtool_seteeprom,
+   .get_link_ksettings = smc_ethtool_get_link_ksettings,
+   .set_link_ksettings = smc_ethtool_set_link_ksettings,
 };
 
 static const struct net_device_ops smc_netdev_ops = {
-- 
1.7.4.4



[PATCH] net: smsc: smc91x: use new api ethtool_{get|set}_link_ksettings

2017-03-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/smsc/smc91x.c |   45 +++
 1 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smc91x.c 
b/drivers/net/ethernet/smsc/smc91x.c
index 65077c7..23bac47 100644
--- a/drivers/net/ethernet/smsc/smc91x.c
+++ b/drivers/net/ethernet/smsc/smc91x.c
@@ -1535,32 +1535,33 @@ static int smc_close(struct net_device *dev)
  * Ethtool support
  */
 static int
-smc_ethtool_getsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+smc_ethtool_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct smc_local *lp = netdev_priv(dev);
int ret;
 
-   cmd->maxtxpkt = 1;
-   cmd->maxrxpkt = 1;
-
if (lp->phy_type != 0) {
spin_lock_irq(>lock);
-   ret = mii_ethtool_gset(>mii, cmd);
+   ret = mii_ethtool_get_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
} else {
-   cmd->supported = SUPPORTED_10baseT_Half |
+   u32 supported = SUPPORTED_10baseT_Half |
 SUPPORTED_10baseT_Full |
 SUPPORTED_TP | SUPPORTED_AUI;
 
if (lp->ctl_rspeed == 10)
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
else if (lp->ctl_rspeed == 100)
-   ethtool_cmd_speed_set(cmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
+
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   cmd->base.port = 0;
+   cmd->base.duplex = lp->tcr_cur_mode & TCR_SWFDUP ?
+   DUPLEX_FULL : DUPLEX_HALF;
 
-   cmd->autoneg = AUTONEG_DISABLE;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->port = 0;
-   cmd->duplex = lp->tcr_cur_mode & TCR_SWFDUP ? DUPLEX_FULL : 
DUPLEX_HALF;
+   ethtool_convert_legacy_u32_to_link_mode(
+   cmd->link_modes.supported, supported);
 
ret = 0;
}
@@ -1569,24 +1570,26 @@ static int smc_close(struct net_device *dev)
 }
 
 static int
-smc_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+smc_ethtool_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct smc_local *lp = netdev_priv(dev);
int ret;
 
if (lp->phy_type != 0) {
spin_lock_irq(>lock);
-   ret = mii_ethtool_sset(>mii, cmd);
+   ret = mii_ethtool_set_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
} else {
-   if (cmd->autoneg != AUTONEG_DISABLE ||
-   cmd->speed != SPEED_10 ||
-   (cmd->duplex != DUPLEX_HALF && cmd->duplex != DUPLEX_FULL) 
||
-   (cmd->port != PORT_TP && cmd->port != PORT_AUI))
+   if (cmd->base.autoneg != AUTONEG_DISABLE ||
+   cmd->base.speed != SPEED_10 ||
+   (cmd->base.duplex != DUPLEX_HALF &&
+cmd->base.duplex != DUPLEX_FULL) ||
+   (cmd->base.port != PORT_TP && cmd->base.port != PORT_AUI))
return -EINVAL;
 
 // lp->port = cmd->port;
-   lp->ctl_rfduplx = cmd->duplex == DUPLEX_FULL;
+   lp->ctl_rfduplx = cmd->base.duplex == DUPLEX_FULL;
 
 // if (netif_running(dev))
 // smc_set_port(dev);
@@ -1744,8 +1747,6 @@ static int smc_ethtool_seteeprom(struct net_device *dev,
 
 
 static const struct ethtool_ops smc_ethtool_ops = {
-   .get_settings   = smc_ethtool_getsettings,
-   .set_settings   = smc_ethtool_setsettings,
.get_drvinfo= smc_ethtool_getdrvinfo,
 
.get_msglevel   = smc_ethtool_getmsglevel,
@@ -1755,6 +1756,8 @@ static int smc_ethtool_seteeprom(struct net_device *dev,
.get_eeprom_len = smc_ethtool_geteeprom_len,
.get_eeprom = smc_ethtool_geteeprom,
.set_eeprom = smc_ethtool_seteeprom,
+   .get_link_ksettings = smc_ethtool_get_link_ksettings,
+   .set_link_ksettings = smc_ethtool_set_link_ksettings,
 };
 
 static const struct net_device_ops smc_netdev_ops = {
-- 
1.7.4.4



[PATCH] net: smsc: smc91c92_cs: use new api ethtool_{get|set}_link_ksettings

2017-03-03 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/smsc/smc91c92_cs.c |   98 --
 1 files changed, 52 insertions(+), 46 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smc91c92_cs.c 
b/drivers/net/ethernet/smsc/smc91c92_cs.c
index 97280da..976aa87 100644
--- a/drivers/net/ethernet/smsc/smc91c92_cs.c
+++ b/drivers/net/ethernet/smsc/smc91c92_cs.c
@@ -1843,56 +1843,60 @@ static int smc_link_ok(struct net_device *dev)
 }
 }
 
-static int smc_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd 
*ecmd)
+static int smc_netdev_get_ecmd(struct net_device *dev,
+  struct ethtool_link_ksettings *ecmd)
 {
-u16 tmp;
-unsigned int ioaddr = dev->base_addr;
+   u16 tmp;
+   unsigned int ioaddr = dev->base_addr;
+   u32 supported;
 
-ecmd->supported = (SUPPORTED_TP | SUPPORTED_AUI |
-   SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full);
-   
-SMC_SELECT_BANK(1);
-tmp = inw(ioaddr + CONFIG);
-ecmd->port = (tmp & CFG_AUI_SELECT) ? PORT_AUI : PORT_TP;
-ecmd->transceiver = XCVR_INTERNAL;
-ethtool_cmd_speed_set(ecmd, SPEED_10);
-ecmd->phy_address = ioaddr + MGMT;
+   supported = (SUPPORTED_TP | SUPPORTED_AUI |
+SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full);
 
-SMC_SELECT_BANK(0);
-tmp = inw(ioaddr + TCR);
-ecmd->duplex = (tmp & TCR_FDUPLX) ? DUPLEX_FULL : DUPLEX_HALF;
+   SMC_SELECT_BANK(1);
+   tmp = inw(ioaddr + CONFIG);
+   ecmd->base.port = (tmp & CFG_AUI_SELECT) ? PORT_AUI : PORT_TP;
+   ecmd->base.speed = SPEED_10;
+   ecmd->base.phy_address = ioaddr + MGMT;
 
-return 0;
+   SMC_SELECT_BANK(0);
+   tmp = inw(ioaddr + TCR);
+   ecmd->base.duplex = (tmp & TCR_FDUPLX) ? DUPLEX_FULL : DUPLEX_HALF;
+
+   ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.supported,
+   supported);
+
+   return 0;
 }
 
-static int smc_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd 
*ecmd)
+static int smc_netdev_set_ecmd(struct net_device *dev,
+  const struct ethtool_link_ksettings *ecmd)
 {
-u16 tmp;
-unsigned int ioaddr = dev->base_addr;
+   u16 tmp;
+   unsigned int ioaddr = dev->base_addr;
 
-if (ethtool_cmd_speed(ecmd) != SPEED_10)
-   return -EINVAL;
-if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
-   return -EINVAL;
-if (ecmd->port != PORT_TP && ecmd->port != PORT_AUI)
-   return -EINVAL;
-if (ecmd->transceiver != XCVR_INTERNAL)
-   return -EINVAL;
+   if (ecmd->base.speed != SPEED_10)
+   return -EINVAL;
+   if (ecmd->base.duplex != DUPLEX_HALF &&
+   ecmd->base.duplex != DUPLEX_FULL)
+   return -EINVAL;
+   if (ecmd->base.port != PORT_TP && ecmd->base.port != PORT_AUI)
+   return -EINVAL;
 
-if (ecmd->port == PORT_AUI)
-   smc_set_xcvr(dev, 1);
-else
-   smc_set_xcvr(dev, 0);
+   if (ecmd->base.port == PORT_AUI)
+   smc_set_xcvr(dev, 1);
+   else
+   smc_set_xcvr(dev, 0);
 
-SMC_SELECT_BANK(0);
-tmp = inw(ioaddr + TCR);
-if (ecmd->duplex == DUPLEX_FULL)
-   tmp |= TCR_FDUPLX;
-else
-   tmp &= ~TCR_FDUPLX;
-outw(tmp, ioaddr + TCR);
-   
-return 0;
+   SMC_SELECT_BANK(0);
+   tmp = inw(ioaddr + TCR);
+   if (ecmd->base.duplex == DUPLEX_FULL)
+   tmp |= TCR_FDUPLX;
+   else
+   tmp &= ~TCR_FDUPLX;
+   outw(tmp, ioaddr + TCR);
+
+   return 0;
 }
 
 static int check_if_running(struct net_device *dev)
@@ -1908,7 +1912,8 @@ static void smc_get_drvinfo(struct net_device *dev, 
struct ethtool_drvinfo *info
strlcpy(info->version, DRV_VERSION, sizeof(info->version));
 }
 
-static int smc_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int smc_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *ecmd)
 {
struct smc_private *smc = netdev_priv(dev);
unsigned int ioaddr = dev->base_addr;
@@ -1919,7 +1924,7 @@ static int smc_get_settings(struct net_device *dev, 
struct ethtool_cmd *ecmd)
spin_lock_irqsave(>lock, flags);
SMC_SELECT_BANK(3);
if (smc->cfg & CFG_MII_SELECT)
-   ret = mii_ethtool_gset(>mii_if, ecmd);
+   ret = mii_ethtool_get_link_ksettings(>mii_if, ecmd);
else
ret = smc_netdev_get_ecmd(dev, ecmd);
SMC_SELECT_BANK(saved_bank);
@

[PATCH] net: smsc: smc911x: use new api ethtool_{get|set}_link_ksettings

2017-02-28 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/smsc/smc911x.c |   51 ++
 1 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/drivers/net/ethernet/smsc/smc911x.c 
b/drivers/net/ethernet/smsc/smc911x.c
index 4f19c61..36307d3 100644
--- a/drivers/net/ethernet/smsc/smc911x.c
+++ b/drivers/net/ethernet/smsc/smc911x.c
@@ -1446,40 +1446,40 @@ static int smc911x_close(struct net_device *dev)
  * Ethtool support
  */
 static int
-smc911x_ethtool_getsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+smc911x_ethtool_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct smc911x_local *lp = netdev_priv(dev);
int ret, status;
unsigned long flags;
+   u32 supported;
 
DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__);
-   cmd->maxtxpkt = 1;
-   cmd->maxrxpkt = 1;
 
if (lp->phy_type != 0) {
spin_lock_irqsave(>lock, flags);
-   ret = mii_ethtool_gset(>mii, cmd);
+   ret = mii_ethtool_get_link_ksettings(>mii, cmd);
spin_unlock_irqrestore(>lock, flags);
} else {
-   cmd->supported = SUPPORTED_10baseT_Half |
+   supported = SUPPORTED_10baseT_Half |
SUPPORTED_10baseT_Full |
SUPPORTED_TP | SUPPORTED_AUI;
 
if (lp->ctl_rspeed == 10)
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
else if (lp->ctl_rspeed == 100)
-   ethtool_cmd_speed_set(cmd, SPEED_100);
-
-   cmd->autoneg = AUTONEG_DISABLE;
-   if (lp->mii.phy_id==1)
-   cmd->transceiver = XCVR_INTERNAL;
-   else
-   cmd->transceiver = XCVR_EXTERNAL;
-   cmd->port = 0;
+   cmd->base.speed = SPEED_100;
+
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   cmd->base.port = 0;
SMC_GET_PHY_SPECIAL(lp, lp->mii.phy_id, status);
-   cmd->duplex =
+   cmd->base.duplex =
(status & (PHY_SPECIAL_SPD_10FULL_ | 
PHY_SPECIAL_SPD_100FULL_)) ?
DUPLEX_FULL : DUPLEX_HALF;
+
+   ethtool_convert_legacy_u32_to_link_mode(
+   cmd->link_modes.supported, supported);
+
ret = 0;
}
 
@@ -1487,7 +1487,8 @@ static int smc911x_close(struct net_device *dev)
 }
 
 static int
-smc911x_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd)
+smc911x_ethtool_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct smc911x_local *lp = netdev_priv(dev);
int ret;
@@ -1495,16 +1496,18 @@ static int smc911x_close(struct net_device *dev)
 
if (lp->phy_type != 0) {
spin_lock_irqsave(>lock, flags);
-   ret = mii_ethtool_sset(>mii, cmd);
+   ret = mii_ethtool_set_link_ksettings(>mii, cmd);
spin_unlock_irqrestore(>lock, flags);
} else {
-   if (cmd->autoneg != AUTONEG_DISABLE ||
-   cmd->speed != SPEED_10 ||
-   (cmd->duplex != DUPLEX_HALF && cmd->duplex != 
DUPLEX_FULL) ||
-   (cmd->port != PORT_TP && cmd->port != PORT_AUI))
+   if (cmd->base.autoneg != AUTONEG_DISABLE ||
+   cmd->base.speed != SPEED_10 ||
+   (cmd->base.duplex != DUPLEX_HALF &&
+cmd->base.duplex != DUPLEX_FULL) ||
+   (cmd->base.port != PORT_TP &&
+cmd->base.port != PORT_AUI))
return -EINVAL;
 
-   lp->ctl_rfduplx = cmd->duplex == DUPLEX_FULL;
+   lp->ctl_rfduplx = cmd->base.duplex == DUPLEX_FULL;
 
ret = 0;
}
@@ -1686,8 +1689,6 @@ static int smc911x_ethtool_geteeprom_len(struct 
net_device *dev)
 }
 
 static const struct ethtool_ops smc911x_ethtool_ops = {
-   .get_settings= smc911x_ethtool_getsettings,
-   .set_settings= smc911x_ethtool_setsettings,
.get_drvinfo = smc911x_ethtool_getdrvinfo,
.get_msglevel= smc911x_ethtool_getmsglevel,
.set_msglevel= smc911x_ethtool_setmsglevel,
@@ -1698,6 +1699,8 @@ static int smc911x_ethtool_geteeprom_len(struct 
net_device *

[PATCH] net: smsc: epic100: use new api ethtool_{get|set}_link_ksettings

2017-02-27 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/smsc/epic100.c |   16 +---
 1 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/smsc/epic100.c 
b/drivers/net/ethernet/smsc/epic100.c
index 5f27371..db6dcb0 100644
--- a/drivers/net/ethernet/smsc/epic100.c
+++ b/drivers/net/ethernet/smsc/epic100.c
@@ -1387,25 +1387,27 @@ static void netdev_get_drvinfo (struct net_device *dev, 
struct ethtool_drvinfo *
strlcpy(info->bus_info, pci_name(np->pci_dev), sizeof(info->bus_info));
 }
 
-static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netdev_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct epic_private *np = netdev_priv(dev);
int rc;
 
spin_lock_irq(>lock);
-   rc = mii_ethtool_gset(>mii, cmd);
+   rc = mii_ethtool_get_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
 
return rc;
 }
 
-static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netdev_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct epic_private *np = netdev_priv(dev);
int rc;
 
spin_lock_irq(>lock);
-   rc = mii_ethtool_sset(>mii, cmd);
+   rc = mii_ethtool_set_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
 
return rc;
@@ -1460,14 +1462,14 @@ static void ethtool_complete(struct net_device *dev)
 
 static const struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo= netdev_get_drvinfo,
-   .get_settings   = netdev_get_settings,
-   .set_settings   = netdev_set_settings,
.nway_reset = netdev_nway_reset,
.get_link   = netdev_get_link,
.get_msglevel   = netdev_get_msglevel,
.set_msglevel   = netdev_set_msglevel,
.begin  = ethtool_begin,
-   .complete   = ethtool_complete
+   .complete   = ethtool_complete,
+   .get_link_ksettings = netdev_get_link_ksettings,
+   .set_link_ksettings = netdev_set_link_ksettings,
 };
 
 static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH] net: sis: sis900: use new api ethtool_{get|set}_link_ksettings

2017-02-27 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sis/sis900.c |   18 +-
 1 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/sis/sis900.c 
b/drivers/net/ethernet/sis/sis900.c
index 19a4587..f317034 100644
--- a/drivers/net/ethernet/sis/sis900.c
+++ b/drivers/net/ethernet/sis/sis900.c
@@ -2035,23 +2035,23 @@ static u32 sis900_get_link(struct net_device *net_dev)
return mii_link_ok(_priv->mii_info);
 }
 
-static int sis900_get_settings(struct net_device *net_dev,
-   struct ethtool_cmd *cmd)
+static int sis900_get_link_ksettings(struct net_device *net_dev,
+struct ethtool_link_ksettings *cmd)
 {
struct sis900_private *sis_priv = netdev_priv(net_dev);
spin_lock_irq(_priv->lock);
-   mii_ethtool_gset(_priv->mii_info, cmd);
+   mii_ethtool_get_link_ksettings(_priv->mii_info, cmd);
spin_unlock_irq(_priv->lock);
return 0;
 }
 
-static int sis900_set_settings(struct net_device *net_dev,
-   struct ethtool_cmd *cmd)
+static int sis900_set_link_ksettings(struct net_device *net_dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct sis900_private *sis_priv = netdev_priv(net_dev);
int rt;
spin_lock_irq(_priv->lock);
-   rt = mii_ethtool_sset(_priv->mii_info, cmd);
+   rt = mii_ethtool_set_link_ksettings(_priv->mii_info, cmd);
spin_unlock_irq(_priv->lock);
return rt;
 }
@@ -2129,11 +2129,11 @@ static void sis900_get_wol(struct net_device *net_dev, 
struct ethtool_wolinfo *w
.get_msglevel   = sis900_get_msglevel,
.set_msglevel   = sis900_set_msglevel,
.get_link   = sis900_get_link,
-   .get_settings   = sis900_get_settings,
-   .set_settings   = sis900_set_settings,
.nway_reset = sis900_nway_reset,
.get_wol= sis900_get_wol,
-   .set_wol= sis900_set_wol
+   .set_wol= sis900_set_wol,
+   .get_link_ksettings = sis900_get_link_ksettings,
+   .set_link_ksettings = sis900_set_link_ksettings,
 };
 
 /**
-- 
1.7.4.4



[PATCH] net: silan: sc92031: use new api ethtool_{get|set}_link_ksettings

2017-02-27 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/silan/sc92031.c |   83 +++---
 1 files changed, 47 insertions(+), 36 deletions(-)

diff --git a/drivers/net/ethernet/silan/sc92031.c 
b/drivers/net/ethernet/silan/sc92031.c
index 6c2e2b3..751c818 100644
--- a/drivers/net/ethernet/silan/sc92031.c
+++ b/drivers/net/ethernet/silan/sc92031.c
@@ -1122,14 +1122,16 @@ static void sc92031_poll_controller(struct net_device 
*dev)
 }
 #endif
 
-static int sc92031_ethtool_get_settings(struct net_device *dev,
-   struct ethtool_cmd *cmd)
+static int
+sc92031_ethtool_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct sc92031_priv *priv = netdev_priv(dev);
void __iomem *port_base = priv->port_base;
u8 phy_address;
u32 phy_ctrl;
u16 output_status;
+   u32 supported, advertising;
 
spin_lock_bh(>lock);
 
@@ -1142,68 +1144,77 @@ static int sc92031_ethtool_get_settings(struct 
net_device *dev,
 
spin_unlock_bh(>lock);
 
-   cmd->supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full
+   supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full
| SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full
| SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII;
 
-   cmd->advertising = ADVERTISED_TP | ADVERTISED_MII;
+   advertising = ADVERTISED_TP | ADVERTISED_MII;
 
if ((phy_ctrl & (PhyCtrlDux | PhyCtrlSpd100 | PhyCtrlSpd10))
== (PhyCtrlDux | PhyCtrlSpd100 | PhyCtrlSpd10))
-   cmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
 
if ((phy_ctrl & PhyCtrlSpd10) == PhyCtrlSpd10)
-   cmd->advertising |= ADVERTISED_10baseT_Half;
+   advertising |= ADVERTISED_10baseT_Half;
 
if ((phy_ctrl & (PhyCtrlSpd10 | PhyCtrlDux))
== (PhyCtrlSpd10 | PhyCtrlDux))
-   cmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
 
if ((phy_ctrl & PhyCtrlSpd100) == PhyCtrlSpd100)
-   cmd->advertising |= ADVERTISED_100baseT_Half;
+   advertising |= ADVERTISED_100baseT_Half;
 
if ((phy_ctrl & (PhyCtrlSpd100 | PhyCtrlDux))
== (PhyCtrlSpd100 | PhyCtrlDux))
-   cmd->advertising |= ADVERTISED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
 
if (phy_ctrl & PhyCtrlAne)
-   cmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
 
-   ethtool_cmd_speed_set(cmd,
- (output_status & 0x2) ? SPEED_100 : SPEED_10);
-   cmd->duplex = (output_status & 0x4) ? DUPLEX_FULL : DUPLEX_HALF;
-   cmd->port = PORT_MII;
-   cmd->phy_address = phy_address;
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->autoneg = (phy_ctrl & PhyCtrlAne) ? AUTONEG_ENABLE : 
AUTONEG_DISABLE;
+   cmd->base.speed = (output_status & 0x2) ? SPEED_100 : SPEED_10;
+   cmd->base.duplex = (output_status & 0x4) ? DUPLEX_FULL : DUPLEX_HALF;
+   cmd->base.port = PORT_MII;
+   cmd->base.phy_address = phy_address;
+   cmd->base.autoneg = (phy_ctrl & PhyCtrlAne) ?
+   AUTONEG_ENABLE : AUTONEG_DISABLE;
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
 
return 0;
 }
 
-static int sc92031_ethtool_set_settings(struct net_device *dev,
-   struct ethtool_cmd *cmd)
+static int
+sc92031_ethtool_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct sc92031_priv *priv = netdev_priv(dev);
void __iomem *port_base = priv->port_base;
-   u32 speed = ethtool_cmd_speed(cmd);
+   u32 speed = cmd->base.speed;
u32 phy_ctrl;
u32 old_phy_ctrl;
+   u32 advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
if (!(speed == SPEED_10 || speed == SPEED_100))
return -EINVAL;
-   if (!(cmd->duplex == DUPLEX_HALF || cmd->duplex == DUPLEX_FULL))
-   return -EINVAL;
-   if (!(cmd->port == PORT_MII))
+   if (!(cmd->base

[PATCH] net: sis: sis190: use new api ethtool_{get|set}_link_ksettings

2017-02-27 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sis/sis190.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/sis/sis190.c 
b/drivers/net/ethernet/sis/sis190.c
index 210e35d..02da106 100644
--- a/drivers/net/ethernet/sis/sis190.c
+++ b/drivers/net/ethernet/sis/sis190.c
@@ -1734,18 +1734,20 @@ static void sis190_set_speed_auto(struct net_device 
*dev)
   BMCR_ANENABLE | BMCR_ANRESTART | BMCR_RESET);
 }
 
-static int sis190_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int sis190_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct sis190_private *tp = netdev_priv(dev);
 
-   return mii_ethtool_gset(>mii_if, cmd);
+   return mii_ethtool_get_link_ksettings(>mii_if, cmd);
 }
 
-static int sis190_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int sis190_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct sis190_private *tp = netdev_priv(dev);
 
-   return mii_ethtool_sset(>mii_if, cmd);
+   return mii_ethtool_set_link_ksettings(>mii_if, cmd);
 }
 
 static void sis190_get_drvinfo(struct net_device *dev,
@@ -1797,8 +1799,6 @@ static void sis190_set_msglevel(struct net_device *dev, 
u32 value)
 }
 
 static const struct ethtool_ops sis190_ethtool_ops = {
-   .get_settings   = sis190_get_settings,
-   .set_settings   = sis190_set_settings,
.get_drvinfo= sis190_get_drvinfo,
.get_regs_len   = sis190_get_regs_len,
.get_regs   = sis190_get_regs,
@@ -1806,6 +1806,8 @@ static void sis190_set_msglevel(struct net_device *dev, 
u32 value)
.get_msglevel   = sis190_get_msglevel,
.set_msglevel   = sis190_set_msglevel,
.nway_reset = sis190_nway_reset,
+   .get_link_ksettings = sis190_get_link_ksettings,
+   .set_link_ksettings = sis190_set_link_ksettings,
 };
 
 static int sis190_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-- 
1.7.4.4



[PATCH] net: sgi: ioc3-eth: use new api ethtool_{get|set}_link_ksettings

2017-02-26 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/sgi/ioc3-eth.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c 
b/drivers/net/ethernet/sgi/ioc3-eth.c
index 57e6cef..52ead55 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -1558,25 +1558,27 @@ static void ioc3_get_drvinfo (struct net_device *dev,
strlcpy(info->bus_info, pci_name(ip->pdev), sizeof(info->bus_info));
 }
 
-static int ioc3_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int ioc3_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct ioc3_private *ip = netdev_priv(dev);
int rc;
 
spin_lock_irq(>ioc3_lock);
-   rc = mii_ethtool_gset(>mii, cmd);
+   rc = mii_ethtool_get_link_ksettings(>mii, cmd);
spin_unlock_irq(>ioc3_lock);
 
return rc;
 }
 
-static int ioc3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int ioc3_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct ioc3_private *ip = netdev_priv(dev);
int rc;
 
spin_lock_irq(>ioc3_lock);
-   rc = mii_ethtool_sset(>mii, cmd);
+   rc = mii_ethtool_set_link_ksettings(>mii, cmd);
spin_unlock_irq(>ioc3_lock);
 
return rc;
@@ -1608,10 +1610,10 @@ static u32 ioc3_get_link(struct net_device *dev)
 
 static const struct ethtool_ops ioc3_ethtool_ops = {
.get_drvinfo= ioc3_get_drvinfo,
-   .get_settings   = ioc3_get_settings,
-   .set_settings   = ioc3_set_settings,
.nway_reset = ioc3_nway_reset,
.get_link   = ioc3_get_link,
+   .get_link_ksettings = ioc3_get_link_ksettings,
+   .set_link_ksettings = ioc3_set_link_ksettings,
 };
 
 static int ioc3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH] net: rocker: use new api ethtool_{get|set}_link_ksettings

2017-02-26 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/rocker/rocker_main.c |   55 +
 1 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/drivers/net/ethernet/rocker/rocker_main.c 
b/drivers/net/ethernet/rocker/rocker_main.c
index 0f63a44..b712ec2 100644
--- a/drivers/net/ethernet/rocker/rocker_main.c
+++ b/drivers/net/ethernet/rocker/rocker_main.c
@@ -1115,7 +1115,7 @@ int rocker_cmd_exec(struct rocker_port *rocker_port, bool 
nowait,
  const struct rocker_desc_info 
*desc_info,
  void *priv)
 {
-   struct ethtool_cmd *ecmd = priv;
+   struct ethtool_link_ksettings *ecmd = priv;
const struct rocker_tlv *attrs[ROCKER_TLV_CMD_MAX + 1];
const struct rocker_tlv *info_attrs[ROCKER_TLV_CMD_PORT_SETTINGS_MAX + 
1];
u32 speed;
@@ -1137,13 +1137,14 @@ int rocker_cmd_exec(struct rocker_port *rocker_port, 
bool nowait,
duplex = 
rocker_tlv_get_u8(info_attrs[ROCKER_TLV_CMD_PORT_SETTINGS_DUPLEX]);
autoneg = 
rocker_tlv_get_u8(info_attrs[ROCKER_TLV_CMD_PORT_SETTINGS_AUTONEG]);
 
-   ecmd->transceiver = XCVR_INTERNAL;
-   ecmd->supported = SUPPORTED_TP;
-   ecmd->phy_address = 0xff;
-   ecmd->port = PORT_TP;
-   ethtool_cmd_speed_set(ecmd, speed);
-   ecmd->duplex = duplex ? DUPLEX_FULL : DUPLEX_HALF;
-   ecmd->autoneg = autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
+   ethtool_link_ksettings_zero_link_mode(ecmd, supported);
+   ethtool_link_ksettings_add_link_mode(ecmd, supported, TP);
+
+   ecmd->base.phy_address = 0xff;
+   ecmd->base.port = PORT_TP;
+   ecmd->base.speed = speed;
+   ecmd->base.duplex = duplex ? DUPLEX_FULL : DUPLEX_HALF;
+   ecmd->base.autoneg = autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
 
return 0;
 }
@@ -1250,7 +1251,7 @@ struct port_name {
  struct rocker_desc_info *desc_info,
  void *priv)
 {
-   struct ethtool_cmd *ecmd = priv;
+   struct ethtool_link_ksettings *ecmd = priv;
struct rocker_tlv *cmd_info;
 
if (rocker_tlv_put_u16(desc_info, ROCKER_TLV_CMD_TYPE,
@@ -1263,13 +1264,13 @@ struct port_name {
   rocker_port->pport))
return -EMSGSIZE;
if (rocker_tlv_put_u32(desc_info, ROCKER_TLV_CMD_PORT_SETTINGS_SPEED,
-  ethtool_cmd_speed(ecmd)))
+  ecmd->base.speed))
return -EMSGSIZE;
if (rocker_tlv_put_u8(desc_info, ROCKER_TLV_CMD_PORT_SETTINGS_DUPLEX,
- ecmd->duplex))
+ ecmd->base.duplex))
return -EMSGSIZE;
if (rocker_tlv_put_u8(desc_info, ROCKER_TLV_CMD_PORT_SETTINGS_AUTONEG,
- ecmd->autoneg))
+ ecmd->base.autoneg))
return -EMSGSIZE;
rocker_tlv_nest_end(desc_info, cmd_info);
return 0;
@@ -1347,8 +1348,9 @@ struct port_name {
return 0;
 }
 
-static int rocker_cmd_get_port_settings_ethtool(struct rocker_port 
*rocker_port,
-   struct ethtool_cmd *ecmd)
+static int
+rocker_cmd_get_port_settings_ethtool(struct rocker_port *rocker_port,
+struct ethtool_link_ksettings *ecmd)
 {
return rocker_cmd_exec(rocker_port, false,
   rocker_cmd_get_port_settings_prep, NULL,
@@ -1373,12 +1375,17 @@ static int rocker_cmd_get_port_settings_mode(struct 
rocker_port *rocker_port,
   rocker_cmd_get_port_settings_mode_proc, p_mode);
 }
 
-static int rocker_cmd_set_port_settings_ethtool(struct rocker_port 
*rocker_port,
-   struct ethtool_cmd *ecmd)
+static int
+rocker_cmd_set_port_settings_ethtool(struct rocker_port *rocker_port,
+const struct ethtool_link_ksettings *ecmd)
 {
+   struct ethtool_link_ksettings copy_ecmd;
+
+   memcpy(_ecmd, ecmd, sizeof(copy_ecmd));
+
return rocker_cmd_exec(rocker_port, false,
   rocker_cmd_set_port_settings_ethtool_prep,
-  ecmd, NULL, NULL);
+  _ecmd, NULL, NULL);
 }
 
 static int rocker_cmd_set_port_settings_macaddr(struct rocker_port 
*rocker_port,
@@ -2237,16 +2244,18 @@ static int rocker_router_fib_event(struct 
notifier_block *nb,
  * ethtool interface
  /
 
-static int rocker_port_get_settings(struct net_device *dev,
-   

[PATCH] net: realtek: r8169: use new api ethtool_{get|set}_link_ksettings

2017-02-23 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/realtek/r8169.c |   41 -
 1 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/realtek/r8169.c 
b/drivers/net/ethernet/realtek/r8169.c
index 81f18a8..24b045b 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -817,7 +817,8 @@ struct rtl8169_private {
} csi_ops;
 
int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
-   int (*get_settings)(struct net_device *, struct ethtool_cmd *);
+   int (*get_link_ksettings)(struct net_device *,
+ struct ethtool_link_ksettings *);
void (*phy_reset_enable)(struct rtl8169_private *tp);
void (*hw_start)(struct net_device *);
unsigned int (*phy_reset_pending)(struct rtl8169_private *tp);
@@ -2115,41 +2116,49 @@ static void rtl8169_rx_vlan_tag(struct RxDesc *desc, 
struct sk_buff *skb)
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 
0x));
 }
 
-static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
+static int rtl8169_get_link_ksettings_tbi(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct rtl8169_private *tp = netdev_priv(dev);
void __iomem *ioaddr = tp->mmio_addr;
u32 status;
+   u32 supported, advertising;
 
-   cmd->supported =
+   supported =
SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
-   cmd->port = PORT_FIBRE;
-   cmd->transceiver = XCVR_INTERNAL;
+   cmd->base.port = PORT_FIBRE;
 
status = RTL_R32(TBICSR);
-   cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
-   cmd->autoneg = !!(status & TBINwEnable);
+   advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
+   cmd->base.autoneg = !!(status & TBINwEnable);
 
-   ethtool_cmd_speed_set(cmd, SPEED_1000);
-   cmd->duplex = DUPLEX_FULL; /* Always set */
+   cmd->base.speed = SPEED_1000;
+   cmd->base.duplex = DUPLEX_FULL; /* Always set */
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
 
return 0;
 }
 
-static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
+static int rtl8169_get_link_ksettings_xmii(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct rtl8169_private *tp = netdev_priv(dev);
 
-   return mii_ethtool_gset(>mii, cmd);
+   return mii_ethtool_get_link_ksettings(>mii, cmd);
 }
 
-static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int rtl8169_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct rtl8169_private *tp = netdev_priv(dev);
int rc;
 
rtl_lock_work(tp);
-   rc = tp->get_settings(dev, cmd);
+   rc = tp->get_link_ksettings(dev, cmd);
rtl_unlock_work(tp);
 
return rc;
@@ -2356,7 +2365,6 @@ static int rtl8169_nway_reset(struct net_device *dev)
.get_drvinfo= rtl8169_get_drvinfo,
.get_regs_len   = rtl8169_get_regs_len,
.get_link   = ethtool_op_get_link,
-   .get_settings   = rtl8169_get_settings,
.set_settings   = rtl8169_set_settings,
.get_msglevel   = rtl8169_get_msglevel,
.set_msglevel   = rtl8169_set_msglevel,
@@ -2368,6 +2376,7 @@ static int rtl8169_nway_reset(struct net_device *dev)
.get_ethtool_stats  = rtl8169_get_ethtool_stats,
.get_ts_info= ethtool_op_get_ts_info,
.nway_reset = rtl8169_nway_reset,
+   .get_link_ksettings = rtl8169_get_link_ksettings,
 };
 
 static void rtl8169_get_mac_version(struct rtl8169_private *tp,
@@ -8351,14 +8360,14 @@ static int rtl_init_one(struct pci_dev *pdev, const 
struct pci_device_id *ent)
 
if (rtl_tbi_enabled(tp)) {
tp->set_speed = rtl8169_set_speed_tbi;
-   tp->get_settings = rtl8169_gset_tbi;
+   tp->get_link_ksettings = rtl8169_get_link_ksettings_tbi;
tp->phy_reset_enable = rtl8169_tbi_reset_enable;
tp->phy_reset_pending = rtl8169_tbi_reset_pending;
tp->link_ok = rtl8169

[PATCH] net: realtek: 8139too: use new api ethtool_{get|set}_link_ksettings

2017-02-22 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/realtek/8139too.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/realtek/8139too.c 
b/drivers/net/ethernet/realtek/8139too.c
index 8963175..ca22f28 100644
--- a/drivers/net/ethernet/realtek/8139too.c
+++ b/drivers/net/ethernet/realtek/8139too.c
@@ -2384,21 +2384,23 @@ static void rtl8139_get_drvinfo(struct net_device *dev, 
struct ethtool_drvinfo *
strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
 }
 
-static int rtl8139_get_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int rtl8139_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct rtl8139_private *tp = netdev_priv(dev);
spin_lock_irq(>lock);
-   mii_ethtool_gset(>mii, cmd);
+   mii_ethtool_get_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
return 0;
 }
 
-static int rtl8139_set_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int rtl8139_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct rtl8139_private *tp = netdev_priv(dev);
int rc;
spin_lock_irq(>lock);
-   rc = mii_ethtool_sset(>mii, cmd);
+   rc = mii_ethtool_set_link_ksettings(>mii, cmd);
spin_unlock_irq(>lock);
return rc;
 }
@@ -2480,8 +2482,6 @@ static void rtl8139_get_strings(struct net_device *dev, 
u32 stringset, u8 *data)
 
 static const struct ethtool_ops rtl8139_ethtool_ops = {
.get_drvinfo= rtl8139_get_drvinfo,
-   .get_settings   = rtl8139_get_settings,
-   .set_settings   = rtl8139_set_settings,
.get_regs_len   = rtl8139_get_regs_len,
.get_regs   = rtl8139_get_regs,
.nway_reset = rtl8139_nway_reset,
@@ -2493,6 +2493,8 @@ static void rtl8139_get_strings(struct net_device *dev, 
u32 stringset, u8 *data)
.get_strings= rtl8139_get_strings,
.get_sset_count = rtl8139_get_sset_count,
.get_ethtool_stats  = rtl8139_get_ethtool_stats,
+   .get_link_ksettings = rtl8139_get_link_ksettings,
+   .set_link_ksettings = rtl8139_set_link_ksettings,
 };
 
 static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH] net: realtek: 8139cp: use new api ethtool_{get|set}_link_ksettings

2017-02-21 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/realtek/8139cp.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/realtek/8139cp.c 
b/drivers/net/ethernet/realtek/8139cp.c
index 672f6b6..72233ab 100644
--- a/drivers/net/ethernet/realtek/8139cp.c
+++ b/drivers/net/ethernet/realtek/8139cp.c
@@ -1406,27 +1406,29 @@ static int cp_get_sset_count (struct net_device *dev, 
int sset)
}
 }
 
-static int cp_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int cp_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct cp_private *cp = netdev_priv(dev);
int rc;
unsigned long flags;
 
spin_lock_irqsave(>lock, flags);
-   rc = mii_ethtool_gset(>mii_if, cmd);
+   rc = mii_ethtool_get_link_ksettings(>mii_if, cmd);
spin_unlock_irqrestore(>lock, flags);
 
return rc;
 }
 
-static int cp_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int cp_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct cp_private *cp = netdev_priv(dev);
int rc;
unsigned long flags;
 
spin_lock_irqsave(>lock, flags);
-   rc = mii_ethtool_sset(>mii_if, cmd);
+   rc = mii_ethtool_set_link_ksettings(>mii_if, cmd);
spin_unlock_irqrestore(>lock, flags);
 
return rc;
@@ -1578,8 +1580,6 @@ static void cp_get_ethtool_stats (struct net_device *dev,
.get_drvinfo= cp_get_drvinfo,
.get_regs_len   = cp_get_regs_len,
.get_sset_count = cp_get_sset_count,
-   .get_settings   = cp_get_settings,
-   .set_settings   = cp_set_settings,
.nway_reset = cp_nway_reset,
.get_link   = ethtool_op_get_link,
.get_msglevel   = cp_get_msglevel,
@@ -1593,6 +1593,8 @@ static void cp_get_ethtool_stats (struct net_device *dev,
.get_eeprom = cp_get_eeprom,
.set_eeprom = cp_set_eeprom,
.get_ringparam  = cp_get_ringparam,
+   .get_link_ksettings = cp_get_link_ksettings,
+   .set_link_ksettings = cp_set_link_ksettings,
 };
 
 static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
-- 
1.7.4.4



[PATCH] net: qualcomm: qca: use new api ethtool_{get|set}_link_ksettings

2017-02-20 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/qualcomm/qca_debug.c |   18 ++
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/qualcomm/qca_debug.c 
b/drivers/net/ethernet/qualcomm/qca_debug.c
index 8e28234..d145df9 100644
--- a/drivers/net/ethernet/qualcomm/qca_debug.c
+++ b/drivers/net/ethernet/qualcomm/qca_debug.c
@@ -188,14 +188,16 @@
 }
 
 static int
-qcaspi_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+qcaspi_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->supported = SUPPORTED_10baseT_Half;
-   ethtool_cmd_speed_set(cmd,  SPEED_10);
-   cmd->duplex = DUPLEX_HALF;
-   cmd->port = PORT_OTHER;
-   cmd->autoneg = AUTONEG_DISABLE;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 10baseT_Half);
+
+   cmd->base.speed = SPEED_10;
+   cmd->base.duplex = DUPLEX_HALF;
+   cmd->base.port = PORT_OTHER;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
return 0;
 }
@@ -295,7 +297,6 @@
 static const struct ethtool_ops qcaspi_ethtool_ops = {
.get_drvinfo = qcaspi_get_drvinfo,
.get_link = ethtool_op_get_link,
-   .get_settings = qcaspi_get_settings,
.get_ethtool_stats = qcaspi_get_ethtool_stats,
.get_strings = qcaspi_get_strings,
.get_sset_count = qcaspi_get_sset_count,
@@ -303,6 +304,7 @@
.get_regs = qcaspi_get_regs,
.get_ringparam = qcaspi_get_ringparam,
.set_ringparam = qcaspi_set_ringparam,
+   .get_link_ksettings = qcaspi_get_link_ksettings,
 };
 
 void qcaspi_set_ethtool_ops(struct net_device *dev)
-- 
1.7.4.4



[PATCH] net: qlogic: qlge: use new api ethtool_{get|set}_link_ksettings

2017-02-19 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c |   36 +-
 1 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c 
b/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c
index 5dade1f..31f4014 100644
--- a/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlge/qlge_ethtool.c
@@ -375,28 +375,34 @@ static int ql_get_sset_count(struct net_device *dev, int 
sset)
}
 }
 
-static int ql_get_settings(struct net_device *ndev,
- struct ethtool_cmd *ecmd)
+static int ql_get_link_ksettings(struct net_device *ndev,
+struct ethtool_link_ksettings *ecmd)
 {
struct ql_adapter *qdev = netdev_priv(ndev);
+   u32 supported, advertising;
+
+   supported = SUPPORTED_1baseT_Full;
+   advertising = ADVERTISED_1baseT_Full;
 
-   ecmd->supported = SUPPORTED_1baseT_Full;
-   ecmd->advertising = ADVERTISED_1baseT_Full;
-   ecmd->transceiver = XCVR_EXTERNAL;
if ((qdev->link_status & STS_LINK_TYPE_MASK) ==
STS_LINK_TYPE_10GBASET) {
-   ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg);
-   ecmd->advertising |= (ADVERTISED_TP | ADVERTISED_Autoneg);
-   ecmd->port = PORT_TP;
-   ecmd->autoneg = AUTONEG_ENABLE;
+   supported |= (SUPPORTED_TP | SUPPORTED_Autoneg);
+   advertising |= (ADVERTISED_TP | ADVERTISED_Autoneg);
+   ecmd->base.port = PORT_TP;
+   ecmd->base.autoneg = AUTONEG_ENABLE;
} else {
-   ecmd->supported |= SUPPORTED_FIBRE;
-   ecmd->advertising |= ADVERTISED_FIBRE;
-   ecmd->port = PORT_FIBRE;
+   supported |= SUPPORTED_FIBRE;
+   advertising |= ADVERTISED_FIBRE;
+   ecmd->base.port = PORT_FIBRE;
}
 
-   ethtool_cmd_speed_set(ecmd, SPEED_1);
-   ecmd->duplex = DUPLEX_FULL;
+   ecmd->base.speed = SPEED_1;
+   ecmd->base.duplex = DUPLEX_FULL;
+
+   ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.advertising,
+   advertising);
 
return 0;
 }
@@ -706,7 +712,6 @@ static void ql_set_msglevel(struct net_device *ndev, u32 
value)
 }
 
 const struct ethtool_ops qlge_ethtool_ops = {
-   .get_settings = ql_get_settings,
.get_drvinfo = ql_get_drvinfo,
.get_wol = ql_get_wol,
.set_wol = ql_set_wol,
@@ -724,5 +729,6 @@ static void ql_set_msglevel(struct net_device *ndev, u32 
value)
.get_sset_count = ql_get_sset_count,
.get_strings = ql_get_strings,
.get_ethtool_stats = ql_get_ethtool_stats,
+   .get_link_ksettings = ql_get_link_ksettings,
 };
 
-- 
1.7.4.4



[PATCH] net: qlogic: qlcnic: use new api ethtool_{get|set}_link_ksettings

2017-02-19 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c|   94 ---
 .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h|6 +-
 .../net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c|  132 ++-
 3 files changed, 123 insertions(+), 109 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index bdbcd2b..99b187b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -3252,12 +3252,13 @@ int qlcnic_83xx_test_link(struct qlcnic_adapter 
*adapter)
return config;
 }
 
-int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
-struct ethtool_cmd *ecmd)
+int qlcnic_83xx_get_link_ksettings(struct qlcnic_adapter *adapter,
+  struct ethtool_link_ksettings *ecmd)
 {
struct qlcnic_hardware_context *ahw = adapter->ahw;
u32 config = 0;
int status = 0;
+   u32 supported, advertising;
 
if (!test_bit(__QLCNIC_MAINTENANCE_MODE, >state)) {
/* Get port configuration info */
@@ -3271,45 +3272,48 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter 
*adapter,
ahw->board_type = QLCNIC_BRDTYPE_83XX_10G;
 
if (netif_running(adapter->netdev) && ahw->has_link_events) {
-   ethtool_cmd_speed_set(ecmd, ahw->link_speed);
-   ecmd->duplex = ahw->link_duplex;
-   ecmd->autoneg = ahw->link_autoneg;
+   ecmd->base.speed = ahw->link_speed;
+   ecmd->base.duplex = ahw->link_duplex;
+   ecmd->base.autoneg = ahw->link_autoneg;
} else {
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
-   ecmd->duplex = DUPLEX_UNKNOWN;
-   ecmd->autoneg = AUTONEG_DISABLE;
+   ecmd->base.speed = SPEED_UNKNOWN;
+   ecmd->base.duplex = DUPLEX_UNKNOWN;
+   ecmd->base.autoneg = AUTONEG_DISABLE;
}
 
-   ecmd->supported = (SUPPORTED_10baseT_Full |
+   supported = (SUPPORTED_10baseT_Full |
   SUPPORTED_100baseT_Full |
   SUPPORTED_1000baseT_Full |
   SUPPORTED_1baseT_Full |
   SUPPORTED_Autoneg);
 
-   if (ecmd->autoneg == AUTONEG_ENABLE) {
+   ethtool_convert_link_mode_to_legacy_u32(,
+   ecmd->link_modes.advertising);
+
+   if (ecmd->base.autoneg == AUTONEG_ENABLE) {
if (ahw->port_config & QLC_83XX_10_CAPABLE)
-   ecmd->advertising |= SUPPORTED_10baseT_Full;
+   advertising |= SUPPORTED_10baseT_Full;
if (ahw->port_config & QLC_83XX_100_CAPABLE)
-   ecmd->advertising |= SUPPORTED_100baseT_Full;
+   advertising |= SUPPORTED_100baseT_Full;
if (ahw->port_config & QLC_83XX_1G_CAPABLE)
-   ecmd->advertising |= SUPPORTED_1000baseT_Full;
+   advertising |= SUPPORTED_1000baseT_Full;
if (ahw->port_config & QLC_83XX_10G_CAPABLE)
-   ecmd->advertising |= SUPPORTED_1baseT_Full;
+   advertising |= SUPPORTED_1baseT_Full;
if (ahw->port_config & QLC_83XX_AUTONEG_ENABLE)
-   ecmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
} else {
switch (ahw->link_speed) {
case SPEED_10:
-   ecmd->advertising = SUPPORTED_10baseT_Full;
+   advertising = SUPPORTED_10baseT_Full;
break;
case SPEED_100:
-   ecmd->advertising = SUPPORTED_100baseT_Full;
+   advertising = SUPPORTED_100baseT_Full;
break;
case SPEED_1000:
-   ecmd->advertising = SUPPORTED_1000baseT_Full;
+   advertising = SUPPORTED_1000baseT_Full;
break;
case SPEED_1:
-   ecmd->advertising = SUPPORTED_1baseT_Full;
+   advertising = SUPPORTED_1baseT_Full;
break;
default:
break;
@@ -3319,56 +3323,58 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter 
*adapter,
 
switch (ahw->supported_type) {
case P

[PATCH] net: qlogic: qla3xxx: use new api ethtool_{get|set}_link_ksettings

2017-02-18 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/qlogic/qla3xxx.c |   29 ++---
 1 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c 
b/drivers/net/ethernet/qlogic/qla3xxx.c
index ea38236..2991179 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c
@@ -1707,23 +1707,30 @@ static int ql_get_full_dup(struct ql3_adapter *qdev)
return status;
 }
 
-static int ql_get_settings(struct net_device *ndev, struct ethtool_cmd *ecmd)
+static int ql_get_link_ksettings(struct net_device *ndev,
+struct ethtool_link_ksettings *cmd)
 {
struct ql3_adapter *qdev = netdev_priv(ndev);
+   u32 supported, advertising;
 
-   ecmd->transceiver = XCVR_INTERNAL;
-   ecmd->supported = ql_supported_modes(qdev);
+   supported = ql_supported_modes(qdev);
 
if (test_bit(QL_LINK_OPTICAL, >flags)) {
-   ecmd->port = PORT_FIBRE;
+   cmd->base.port = PORT_FIBRE;
} else {
-   ecmd->port = PORT_TP;
-   ecmd->phy_address = qdev->PHYAddr;
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = qdev->PHYAddr;
}
-   ecmd->advertising = ql_supported_modes(qdev);
-   ecmd->autoneg = ql_get_auto_cfg_status(qdev);
-   ethtool_cmd_speed_set(ecmd, ql_get_speed(qdev));
-   ecmd->duplex = ql_get_full_dup(qdev);
+   advertising = ql_supported_modes(qdev);
+   cmd->base.autoneg = ql_get_auto_cfg_status(qdev);
+   cmd->base.speed = ql_get_speed(qdev);
+   cmd->base.duplex = ql_get_full_dup(qdev);
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
+
return 0;
 }
 
@@ -1769,12 +1776,12 @@ static void ql_get_pauseparam(struct net_device *ndev,
 }
 
 static const struct ethtool_ops ql3xxx_ethtool_ops = {
-   .get_settings = ql_get_settings,
.get_drvinfo = ql_get_drvinfo,
.get_link = ethtool_op_get_link,
.get_msglevel = ql_get_msglevel,
.set_msglevel = ql_set_msglevel,
.get_pauseparam = ql_get_pauseparam,
+   .get_link_ksettings = ql_get_link_ksettings,
 };
 
 static int ql_populate_free_queue(struct ql3_adapter *qdev)
-- 
1.7.4.4



[PATCH] net: qlogic: netxen: use new api ethtool_{get|set}_link_ksettings

2017-02-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 .../ethernet/qlogic/netxen/netxen_nic_ethtool.c|  123 ++-
 1 files changed, 65 insertions(+), 58 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_ethtool.c 
b/drivers/net/ethernet/qlogic/netxen/netxen_nic_ethtool.c
index f903446..3157f97 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_ethtool.c
@@ -96,69 +96,70 @@ static int netxen_nic_get_eeprom_len(struct net_device *dev)
 }
 
 static int
-netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+netxen_nic_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct netxen_adapter *adapter = netdev_priv(dev);
int check_sfp_module = 0;
+   u32 supported, advertising;
 
/* read which mode */
if (adapter->ahw.port_type == NETXEN_NIC_GBE) {
-   ecmd->supported = (SUPPORTED_10baseT_Half |
+   supported = (SUPPORTED_10baseT_Half |
   SUPPORTED_10baseT_Full |
   SUPPORTED_100baseT_Half |
   SUPPORTED_100baseT_Full |
   SUPPORTED_1000baseT_Half |
   SUPPORTED_1000baseT_Full);
 
-   ecmd->advertising = (ADVERTISED_100baseT_Half |
+   advertising = (ADVERTISED_100baseT_Half |
 ADVERTISED_100baseT_Full |
 ADVERTISED_1000baseT_Half |
 ADVERTISED_1000baseT_Full);
 
-   ecmd->port = PORT_TP;
+   cmd->base.port = PORT_TP;
 
-   ethtool_cmd_speed_set(ecmd, adapter->link_speed);
-   ecmd->duplex = adapter->link_duplex;
-   ecmd->autoneg = adapter->link_autoneg;
+   cmd->base.speed = adapter->link_speed;
+   cmd->base.duplex = adapter->link_duplex;
+   cmd->base.autoneg = adapter->link_autoneg;
 
} else if (adapter->ahw.port_type == NETXEN_NIC_XGBE) {
u32 val;
 
val = NXRD32(adapter, NETXEN_PORT_MODE_ADDR);
if (val == NETXEN_PORT_MODE_802_3_AP) {
-   ecmd->supported = SUPPORTED_1000baseT_Full;
-   ecmd->advertising = ADVERTISED_1000baseT_Full;
+   supported = SUPPORTED_1000baseT_Full;
+   advertising = ADVERTISED_1000baseT_Full;
} else {
-   ecmd->supported = SUPPORTED_1baseT_Full;
-   ecmd->advertising = ADVERTISED_1baseT_Full;
+   supported = SUPPORTED_1baseT_Full;
+   advertising = ADVERTISED_1baseT_Full;
}
 
if (netif_running(dev) && adapter->has_link_events) {
-   ethtool_cmd_speed_set(ecmd, adapter->link_speed);
-   ecmd->autoneg = adapter->link_autoneg;
-   ecmd->duplex = adapter->link_duplex;
+   cmd->base.speed = adapter->link_speed;
+   cmd->base.autoneg = adapter->link_autoneg;
+   cmd->base.duplex = adapter->link_duplex;
goto skip;
}
 
-   ecmd->port = PORT_TP;
+   cmd->base.port = PORT_TP;
 
if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
u16 pcifn = adapter->ahw.pci_func;
 
val = NXRD32(adapter, P3_LINK_SPEED_REG(pcifn));
-   ethtool_cmd_speed_set(ecmd, P3_LINK_SPEED_MHZ *
- P3_LINK_SPEED_VAL(pcifn, val));
+   cmd->base.speed = P3_LINK_SPEED_MHZ *
+   P3_LINK_SPEED_VAL(pcifn, val);
} else
-   ethtool_cmd_speed_set(ecmd, SPEED_1);
+   cmd->base.speed = SPEED_1;
 
-   ecmd->duplex = DUPLEX_FULL;
-   ecmd->autoneg = AUTONEG_DISABLE;
+   cmd->base.duplex = DUPLEX_FULL;
+   cmd->base.autoneg = AUTONEG_DISABLE;
} else
return -EIO;
 
 skip:
-   ecmd->phy_address = adapter->physical_port;
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.phy_address = adapter->physical_port;
 
switch (adapter->ahw.board_type) {
case NETXEN_BRDTYPE_P2_SB35_4G

[PATCH] net: hamachi: use new api ethtool_{get|set}_link_ksettings

2017-02-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/packetengines/hamachi.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/packetengines/hamachi.c 
b/drivers/net/ethernet/packetengines/hamachi.c
index baff744..8b026db 100644
--- a/drivers/net/ethernet/packetengines/hamachi.c
+++ b/drivers/net/ethernet/packetengines/hamachi.c
@@ -1811,21 +1811,23 @@ static void hamachi_get_drvinfo(struct net_device *dev, 
struct ethtool_drvinfo *
strlcpy(info->bus_info, pci_name(np->pci_dev), sizeof(info->bus_info));
 }
 
-static int hamachi_get_settings(struct net_device *dev, struct ethtool_cmd 
*ecmd)
+static int hamachi_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct hamachi_private *np = netdev_priv(dev);
spin_lock_irq(>lock);
-   mii_ethtool_gset(>mii_if, ecmd);
+   mii_ethtool_get_link_ksettings(>mii_if, cmd);
spin_unlock_irq(>lock);
return 0;
 }
 
-static int hamachi_set_settings(struct net_device *dev, struct ethtool_cmd 
*ecmd)
+static int hamachi_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct hamachi_private *np = netdev_priv(dev);
int res;
spin_lock_irq(>lock);
-   res = mii_ethtool_sset(>mii_if, ecmd);
+   res = mii_ethtool_set_link_ksettings(>mii_if, cmd);
spin_unlock_irq(>lock);
return res;
 }
@@ -1845,10 +1847,10 @@ static u32 hamachi_get_link(struct net_device *dev)
 static const struct ethtool_ops ethtool_ops = {
.begin = check_if_running,
.get_drvinfo = hamachi_get_drvinfo,
-   .get_settings = hamachi_get_settings,
-   .set_settings = hamachi_set_settings,
.nway_reset = hamachi_nway_reset,
.get_link = hamachi_get_link,
+   .get_link_ksettings = hamachi_get_link_ksettings,
+   .set_link_ksettings = hamachi_set_link_ksettings,
 };
 
 static const struct ethtool_ops ethtool_ops_no_mii = {
-- 
1.7.4.4



[PATCH] net: oki-semi: pch_gbe: use new api ethtool_{get|set}_link_ksettings

2017-02-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 .../ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c|   58 +---
 1 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c 
b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
index b19be7c..2109327 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_ethtool.c
@@ -73,62 +73,80 @@ struct pch_gbe_stats {
 #define PCH_GBE_MAC_REGS_LEN(sizeof(struct pch_gbe_regs) / 4)
 #define PCH_GBE_REGS_LEN(PCH_GBE_MAC_REGS_LEN + PCH_GBE_PHY_REGS_LEN)
 /**
- * pch_gbe_get_settings - Get device-specific settings
+ * pch_gbe_get_link_ksettings - Get device-specific settings
  * @netdev: Network interface device structure
  * @ecmd:   Ethtool command
  * Returns:
  * 0:  Successful.
  * Negative value: Failed.
  */
-static int pch_gbe_get_settings(struct net_device *netdev,
-struct ethtool_cmd *ecmd)
+static int pch_gbe_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *ecmd)
 {
struct pch_gbe_adapter *adapter = netdev_priv(netdev);
+   u32 supported, advertising;
int ret;
 
-   ret = mii_ethtool_gset(>mii, ecmd);
-   ecmd->supported &= ~(SUPPORTED_TP | SUPPORTED_1000baseT_Half);
-   ecmd->advertising &= ~(ADVERTISED_TP | ADVERTISED_1000baseT_Half);
+   ret = mii_ethtool_get_link_ksettings(>mii, ecmd);
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   ecmd->link_modes.supported);
+   ethtool_convert_link_mode_to_legacy_u32(,
+   ecmd->link_modes.advertising);
+
+   supported &= ~(SUPPORTED_TP | SUPPORTED_1000baseT_Half);
+   advertising &= ~(ADVERTISED_TP | ADVERTISED_1000baseT_Half);
+
+   ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(ecmd->link_modes.advertising,
+   advertising);
 
if (!netif_carrier_ok(adapter->netdev))
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
+   ecmd->base.speed = SPEED_UNKNOWN;
return ret;
 }
 
 /**
- * pch_gbe_set_settings - Set device-specific settings
+ * pch_gbe_set_link_ksettings - Set device-specific settings
  * @netdev: Network interface device structure
  * @ecmd:   Ethtool command
  * Returns:
  * 0:  Successful.
  * Negative value: Failed.
  */
-static int pch_gbe_set_settings(struct net_device *netdev,
-struct ethtool_cmd *ecmd)
+static int pch_gbe_set_link_ksettings(struct net_device *netdev,
+ const struct ethtool_link_ksettings *ecmd)
 {
struct pch_gbe_adapter *adapter = netdev_priv(netdev);
struct pch_gbe_hw *hw = >hw;
-   u32 speed = ethtool_cmd_speed(ecmd);
+   struct ethtool_link_ksettings copy_ecmd;
+   u32 speed = ecmd->base.speed;
+   u32 advertising;
int ret;
 
pch_gbe_hal_write_phy_reg(hw, MII_BMCR, BMCR_RESET);
 
+   memcpy(_ecmd, ecmd, sizeof(*ecmd));
+
/* when set_settings() is called with a ethtool_cmd previously
 * filled by get_settings() on a down link, speed is -1: */
if (speed == UINT_MAX) {
speed = SPEED_1000;
-   ethtool_cmd_speed_set(ecmd, speed);
-   ecmd->duplex = DUPLEX_FULL;
+   copy_ecmd.base.speed = speed;
+   copy_ecmd.base.duplex = DUPLEX_FULL;
}
-   ret = mii_ethtool_sset(>mii, ecmd);
+   ret = mii_ethtool_set_link_ksettings(>mii, _ecmd);
if (ret) {
-   netdev_err(netdev, "Error: mii_ethtool_sset\n");
+   netdev_err(netdev, "Error: mii_ethtool_set_link_ksettings\n");
return ret;
}
hw->mac.link_speed = speed;
-   hw->mac.link_duplex = ecmd->duplex;
-   hw->phy.autoneg_advertised = ecmd->advertising;
-   hw->mac.autoneg = ecmd->autoneg;
+   hw->mac.link_duplex = copy_ecmd.base.duplex;
+   ethtool_convert_link_mode_to_legacy_u32(
+   , copy_ecmd.link_modes.advertising);
+   hw->phy.autoneg_advertised = advertising;
+   hw->mac.autoneg = copy_ecmd.base.autoneg;
 
/* reset the link */
if (netif_running(adapter->netdev)) {
@@ -487,8 +505,6 @@ static int pch_gbe_get_sset_count(s

[PATCH] net: nvidia: forcedeth: use new api ethtool_{get|set}_link_ksettings

2017-02-14 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/nvidia/forcedeth.c |   91 +--
 1 files changed, 50 insertions(+), 41 deletions(-)

diff --git a/drivers/net/ethernet/nvidia/forcedeth.c 
b/drivers/net/ethernet/nvidia/forcedeth.c
index 58ba5d3..92367a0 100644
--- a/drivers/net/ethernet/nvidia/forcedeth.c
+++ b/drivers/net/ethernet/nvidia/forcedeth.c
@@ -4237,14 +4237,15 @@ static int nv_set_wol(struct net_device *dev, struct 
ethtool_wolinfo *wolinfo)
return 0;
 }
 
-static int nv_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int nv_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct fe_priv *np = netdev_priv(dev);
-   u32 speed;
+   u32 speed, supported, advertising;
int adv;
 
spin_lock_irq(>lock);
-   ecmd->port = PORT_MII;
+   cmd->base.port = PORT_MII;
if (!netif_running(dev)) {
/* We do not track link speed / duplex setting if the
 * interface is disabled. Force a link check */
@@ -4272,64 +4273,71 @@ static int nv_get_settings(struct net_device *dev, 
struct ethtool_cmd *ecmd)
speed = -1;
break;
}
-   ecmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
if (np->duplex)
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
} else {
speed = SPEED_UNKNOWN;
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
-   ethtool_cmd_speed_set(ecmd, speed);
-   ecmd->autoneg = np->autoneg;
+   cmd->base.speed = speed;
+   cmd->base.autoneg = np->autoneg;
 
-   ecmd->advertising = ADVERTISED_MII;
+   advertising = ADVERTISED_MII;
if (np->autoneg) {
-   ecmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
adv = mii_rw(dev, np->phyaddr, MII_ADVERTISE, MII_READ);
if (adv & ADVERTISE_10HALF)
-   ecmd->advertising |= ADVERTISED_10baseT_Half;
+   advertising |= ADVERTISED_10baseT_Half;
if (adv & ADVERTISE_10FULL)
-   ecmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
if (adv & ADVERTISE_100HALF)
-   ecmd->advertising |= ADVERTISED_100baseT_Half;
+   advertising |= ADVERTISED_100baseT_Half;
if (adv & ADVERTISE_100FULL)
-   ecmd->advertising |= ADVERTISED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
if (np->gigabit == PHY_GIGABIT) {
adv = mii_rw(dev, np->phyaddr, MII_CTRL1000, MII_READ);
if (adv & ADVERTISE_1000FULL)
-   ecmd->advertising |= ADVERTISED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
}
}
-   ecmd->supported = (SUPPORTED_Autoneg |
+   supported = (SUPPORTED_Autoneg |
SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
SUPPORTED_MII);
if (np->gigabit == PHY_GIGABIT)
-   ecmd->supported |= SUPPORTED_1000baseT_Full;
+   supported |= SUPPORTED_1000baseT_Full;
 
-   ecmd->phy_address = np->phyaddr;
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.phy_address = np->phyaddr;
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
 
/* ignore maxtxpkt, maxrxpkt for now */
spin_unlock_irq(>lock);
return 0;
 }
 
-static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int nv_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct fe_priv *np = netdev_priv(dev);
-   u32 speed = ethtool_cmd_speed(ecmd);
+   u32 speed = cmd->base.speed;
+   u32 advertising;
 
-   if (ecmd->port != PORT_MII)
-   return -EINVAL;
-   if (ecmd->transceiver != XCVR_EXTERNAL)

[PATCH] net: nuvoton: w90p910: use new api ethtool_{get|set}_link_ksettings

2017-02-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/nuvoton/w90p910_ether.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/nuvoton/w90p910_ether.c 
b/drivers/net/ethernet/nuvoton/w90p910_ether.c
index 119f6dc..9709c8c 100644
--- a/drivers/net/ethernet/nuvoton/w90p910_ether.c
+++ b/drivers/net/ethernet/nuvoton/w90p910_ether.c
@@ -874,16 +874,18 @@ static void w90p910_get_drvinfo(struct net_device *dev,
strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
 }
 
-static int w90p910_get_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int w90p910_get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *cmd)
 {
struct w90p910_ether *ether = netdev_priv(dev);
-   return mii_ethtool_gset(>mii, cmd);
+   return mii_ethtool_get_link_ksettings(>mii, cmd);
 }
 
-static int w90p910_set_settings(struct net_device *dev, struct ethtool_cmd 
*cmd)
+static int w90p910_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct w90p910_ether *ether = netdev_priv(dev);
-   return mii_ethtool_sset(>mii, cmd);
+   return mii_ethtool_set_link_ksettings(>mii, cmd);
 }
 
 static int w90p910_nway_reset(struct net_device *dev)
@@ -899,11 +901,11 @@ static u32 w90p910_get_link(struct net_device *dev)
 }
 
 static const struct ethtool_ops w90p910_ether_ethtool_ops = {
-   .get_settings   = w90p910_get_settings,
-   .set_settings   = w90p910_set_settings,
.get_drvinfo= w90p910_get_drvinfo,
.nway_reset = w90p910_nway_reset,
.get_link   = w90p910_get_link,
+   .get_link_ksettings = w90p910_get_link_ksettings,
+   .set_link_ksettings = w90p910_set_link_ksettings,
 };
 
 static const struct net_device_ops w90p910_ether_netdev_ops = {
-- 
1.7.4.4



[PATCH] net: neterion: vxge: use new api ethtool_{get|set}_link_ksettings

2017-02-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/neterion/vxge/vxge-ethtool.c |   47 -
 1 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c 
b/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c
index 9a29670..db55e6d 100644
--- a/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c
+++ b/drivers/net/ethernet/neterion/vxge/vxge-ethtool.c
@@ -38,9 +38,9 @@
 };
 
 /**
- * vxge_ethtool_sset - Sets different link parameters.
+ * vxge_ethtool_set_link_ksettings - Sets different link parameters.
  * @dev: device pointer.
- * @info: pointer to the structure with parameters given by ethtool to set
+ * @cmd: pointer to the structure with parameters given by ethtool to set
  * link information.
  *
  * The function sets different link parameters provided by the user onto
@@ -48,44 +48,51 @@
  * Return value:
  * 0 on success.
  */
-static int vxge_ethtool_sset(struct net_device *dev, struct ethtool_cmd *info)
+static int
+vxge_ethtool_set_link_ksettings(struct net_device *dev,
+   const struct ethtool_link_ksettings *cmd)
 {
/* We currently only support 10Gb/FULL */
-   if ((info->autoneg == AUTONEG_ENABLE) ||
-   (ethtool_cmd_speed(info) != SPEED_1) ||
-   (info->duplex != DUPLEX_FULL))
+   if ((cmd->base.autoneg == AUTONEG_ENABLE) ||
+   (cmd->base.speed != SPEED_1) ||
+   (cmd->base.duplex != DUPLEX_FULL))
return -EINVAL;
 
return 0;
 }
 
 /**
- * vxge_ethtool_gset - Return link specific information.
+ * vxge_ethtool_get_link_ksettings - Return link specific information.
  * @dev: device pointer.
- * @info: pointer to the structure with parameters given by ethtool
+ * @cmd: pointer to the structure with parameters given by ethtool
  * to return link information.
  *
  * Returns link specific information like speed, duplex etc.. to ethtool.
  * Return value :
  * return 0 on success.
  */
-static int vxge_ethtool_gset(struct net_device *dev, struct ethtool_cmd *info)
+static int vxge_ethtool_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
-   info->supported = (SUPPORTED_1baseT_Full | SUPPORTED_FIBRE);
-   info->advertising = (ADVERTISED_1baseT_Full | ADVERTISED_FIBRE);
-   info->port = PORT_FIBRE;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
 
-   info->transceiver = XCVR_EXTERNAL;
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
+
+   cmd->base.port = PORT_FIBRE;
 
if (netif_carrier_ok(dev)) {
-   ethtool_cmd_speed_set(info, SPEED_1);
-   info->duplex = DUPLEX_FULL;
+   cmd->base.speed = SPEED_1;
+   cmd->base.duplex = DUPLEX_FULL;
} else {
-   ethtool_cmd_speed_set(info, SPEED_UNKNOWN);
-   info->duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
 
-   info->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
return 0;
 }
 
@@ -1126,8 +1133,6 @@ static int vxge_fw_flash(struct net_device *dev, struct 
ethtool_flash *parms)
 }
 
 static const struct ethtool_ops vxge_ethtool_ops = {
-   .get_settings   = vxge_ethtool_gset,
-   .set_settings   = vxge_ethtool_sset,
.get_drvinfo= vxge_ethtool_gdrvinfo,
.get_regs_len   = vxge_ethtool_get_regs_len,
.get_regs   = vxge_ethtool_gregs,
@@ -1139,6 +1144,8 @@ static int vxge_fw_flash(struct net_device *dev, struct 
ethtool_flash *parms)
.get_sset_count = vxge_ethtool_get_sset_count,
.get_ethtool_stats  = vxge_get_ethtool_stats,
.flash_device   = vxge_fw_flash,
+   .get_link_ksettings = vxge_ethtool_get_link_ksettings,
+   .set_link_ksettings = vxge_ethtool_set_link_ksettings,
 };
 
 void vxge_initialize_ethtool_ops(struct net_device *ndev)
-- 
1.7.4.4



[PATCH] net: neterion: s2io: use new api ethtool_{get|set}_link_ksettings

2017-02-12 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/neterion/s2io.c |   51 +++--
 1 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/neterion/s2io.c 
b/drivers/net/ethernet/neterion/s2io.c
index 203abcb..c5c1d0e 100644
--- a/drivers/net/ethernet/neterion/s2io.c
+++ b/drivers/net/ethernet/neterion/s2io.c
@@ -5300,10 +5300,10 @@ static int do_s2io_prog_unicast(struct net_device *dev, 
u8 *addr)
 }
 
 /**
- * s2io_ethtool_sset - Sets different link parameters.
+ * s2io_ethtool_set_link_ksettings - Sets different link parameters.
  * @sp : private member of the device structure, which is a pointer to the
  * s2io_nic structure.
- * @info: pointer to the structure with parameters given by ethtool to set
+ * @cmd: pointer to the structure with parameters given by ethtool to set
  * link information.
  * Description:
  * The function sets different link parameters provided by the user onto
@@ -5312,13 +5312,14 @@ static int do_s2io_prog_unicast(struct net_device *dev, 
u8 *addr)
  * 0 on success.
  */
 
-static int s2io_ethtool_sset(struct net_device *dev,
-struct ethtool_cmd *info)
+static int
+s2io_ethtool_set_link_ksettings(struct net_device *dev,
+   const struct ethtool_link_ksettings *cmd)
 {
struct s2io_nic *sp = netdev_priv(dev);
-   if ((info->autoneg == AUTONEG_ENABLE) ||
-   (ethtool_cmd_speed(info) != SPEED_1) ||
-   (info->duplex != DUPLEX_FULL))
+   if ((cmd->base.autoneg == AUTONEG_ENABLE) ||
+   (cmd->base.speed != SPEED_1) ||
+   (cmd->base.duplex != DUPLEX_FULL))
return -EINVAL;
else {
s2io_close(sp->dev);
@@ -5329,10 +5330,10 @@ static int s2io_ethtool_sset(struct net_device *dev,
 }
 
 /**
- * s2io_ethtol_gset - Return link specific information.
+ * s2io_ethtol_get_link_ksettings - Return link specific information.
  * @sp : private member of the device structure, pointer to the
  *  s2io_nic structure.
- * @info : pointer to the structure with parameters given by ethtool
+ * @cmd : pointer to the structure with parameters given by ethtool
  * to return link information.
  * Description:
  * Returns link specific information like speed, duplex etc.. to ethtool.
@@ -5340,25 +5341,31 @@ static int s2io_ethtool_sset(struct net_device *dev,
  * return 0 on success.
  */
 
-static int s2io_ethtool_gset(struct net_device *dev, struct ethtool_cmd *info)
+static int
+s2io_ethtool_get_link_ksettings(struct net_device *dev,
+   struct ethtool_link_ksettings *cmd)
 {
struct s2io_nic *sp = netdev_priv(dev);
-   info->supported = (SUPPORTED_1baseT_Full | SUPPORTED_FIBRE);
-   info->advertising = (SUPPORTED_1baseT_Full | SUPPORTED_FIBRE);
-   info->port = PORT_FIBRE;
 
-   /* info->transceiver */
-   info->transceiver = XCVR_EXTERNAL;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
+
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
+
+   cmd->base.port = PORT_FIBRE;
 
if (netif_carrier_ok(sp->dev)) {
-   ethtool_cmd_speed_set(info, SPEED_1);
-   info->duplex = DUPLEX_FULL;
+   cmd->base.speed = SPEED_1;
+   cmd->base.duplex = DUPLEX_FULL;
} else {
-   ethtool_cmd_speed_set(info, SPEED_UNKNOWN);
-   info->duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
 
-   info->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
return 0;
 }
 
@@ -6626,8 +6633,6 @@ static int s2io_set_features(struct net_device *dev, 
netdev_features_t features)
 }
 
 static const struct ethtool_ops netdev_ethtool_ops = {
-   .get_settings = s2io_ethtool_gset,
-   .set_settings = s2io_ethtool_sset,
.get_drvinfo = s2io_ethtool_gdrvinfo,
.get_regs_len = s2io_ethtool_get_regs_len,
.get_regs = s2io_ethtool_gregs,
@@ -6643,6 +6648,8 @@ static int s2io_set_features(struct net_device *dev, 
netdev_features_t features)
.set_phys_id = s2io_ethtool_set_led,
.get_ethtool_stats = s2io_get_ethtool_stats,
.get_sset_count = s2io_get_sset_count,
+   .get_link_ksettings = s2io_ethtool_get_link_kse

[PATCH] net: natsemi: ns83820: use new api ethtool_{get|set}_link_ksettings

2017-02-10 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/natsemi/ns83820.c |   46 +--
 1 files changed, 25 insertions(+), 21 deletions(-)

diff --git a/drivers/net/ethernet/natsemi/ns83820.c 
b/drivers/net/ethernet/natsemi/ns83820.c
index f9d2eb9..729095d 100644
--- a/drivers/net/ethernet/natsemi/ns83820.c
+++ b/drivers/net/ethernet/natsemi/ns83820.c
@@ -1217,12 +1217,13 @@ static void ns83820_update_stats(struct ns83820 *dev)
 }
 
 /* Let ethtool retrieve info */
-static int ns83820_get_settings(struct net_device *ndev,
-   struct ethtool_cmd *cmd)
+static int ns83820_get_link_ksettings(struct net_device *ndev,
+ struct ethtool_link_ksettings *cmd)
 {
struct ns83820 *dev = PRIV(ndev);
u32 cfg, tanar, tbicr;
int fullduplex   = 0;
+   u32 supported;
 
/*
 * Here's the list of available ethtool commands from other drivers:
@@ -1244,44 +1245,47 @@ static int ns83820_get_settings(struct net_device *ndev,
 
fullduplex = (cfg & CFG_DUPSTS) ? 1 : 0;
 
-   cmd->supported = SUPPORTED_Autoneg;
+   supported = SUPPORTED_Autoneg;
 
if (dev->CFG_cache & CFG_TBI_EN) {
/* we have optical interface */
-   cmd->supported |= SUPPORTED_1000baseT_Half |
+   supported |= SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full |
SUPPORTED_FIBRE;
-   cmd->port   = PORT_FIBRE;
+   cmd->base.port   = PORT_FIBRE;
} else {
/* we have copper */
-   cmd->supported |= SUPPORTED_10baseT_Half |
+   supported |= SUPPORTED_10baseT_Half |
SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Half |
SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full |
SUPPORTED_MII;
-   cmd->port = PORT_MII;
+   cmd->base.port = PORT_MII;
}
 
-   cmd->duplex = fullduplex ? DUPLEX_FULL : DUPLEX_HALF;
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+
+   cmd->base.duplex = fullduplex ? DUPLEX_FULL : DUPLEX_HALF;
switch (cfg / CFG_SPDSTS0 & 3) {
case 2:
-   ethtool_cmd_speed_set(cmd, SPEED_1000);
+   cmd->base.speed = SPEED_1000;
break;
case 1:
-   ethtool_cmd_speed_set(cmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
break;
default:
-   ethtool_cmd_speed_set(cmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
break;
}
-   cmd->autoneg = (tbicr & TBICR_MR_AN_ENABLE)
+   cmd->base.autoneg = (tbicr & TBICR_MR_AN_ENABLE)
? AUTONEG_ENABLE : AUTONEG_DISABLE;
return 0;
 }
 
 /* Let ethool change settings*/
-static int ns83820_set_settings(struct net_device *ndev,
-   struct ethtool_cmd *cmd)
+static int ns83820_set_link_ksettings(struct net_device *ndev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct ns83820 *dev = PRIV(ndev);
u32 cfg, tanar;
@@ -1306,10 +1310,10 @@ static int ns83820_set_settings(struct net_device *ndev,
spin_lock(>tx_lock);
 
/* Set duplex */
-   if (cmd->duplex != fullduplex) {
+   if (cmd->base.duplex != fullduplex) {
if (have_optical) {
/*set full duplex*/
-   if (cmd->duplex == DUPLEX_FULL) {
+   if (cmd->base.duplex == DUPLEX_FULL) {
/* force full duplex */
writel(readl(dev->base + TXCFG)
| TXCFG_CSI | TXCFG_HBI | TXCFG_ATP,
@@ -1333,7 +1337,7 @@ static int ns83820_set_settings(struct net_device *ndev,
 
/* Set autonegotiation */
if (1) {
-   if (cmd->autoneg == AUTONEG_ENABLE) {
+   if (cmd->base.autoneg == AUTONEG_ENABLE) {
/* restart auto negotiation */
writel(TBICR_MR_AN_ENABLE | TBICR_MR_RESTART_AN,
dev->base + TBICR);
@@ -1348,7 +1352,7 @@ static int ns83820_set_settings(struct net_device *ndev,
}
 
printk(KERN_INFO "%s: autoneg %s via ethtool\n", ndev->name,
-  

[PATCH] net: natsemi: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/natsemi/natsemi.c |  119 ++--
 1 files changed, 67 insertions(+), 52 deletions(-)

diff --git a/drivers/net/ethernet/natsemi/natsemi.c 
b/drivers/net/ethernet/natsemi/natsemi.c
index 8e72679..18af2a2 100644
--- a/drivers/net/ethernet/natsemi/natsemi.c
+++ b/drivers/net/ethernet/natsemi/natsemi.c
@@ -640,8 +640,10 @@ struct netdev_private {
 static int netdev_get_wol(struct net_device *dev, u32 *supported, u32 *cur);
 static int netdev_set_sopass(struct net_device *dev, u8 *newval);
 static int netdev_get_sopass(struct net_device *dev, u8 *data);
-static int netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd);
-static int netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd);
+static int netdev_get_ecmd(struct net_device *dev,
+  struct ethtool_link_ksettings *ecmd);
+static int netdev_set_ecmd(struct net_device *dev,
+  const struct ethtool_link_ksettings *ecmd);
 static void enable_wol_mode(struct net_device *dev, int enable_intr);
 static int netdev_close(struct net_device *dev);
 static int netdev_get_regs(struct net_device *dev, u8 *buf);
@@ -2584,7 +2586,8 @@ static int get_eeprom_len(struct net_device *dev)
return np->eeprom_size;
 }
 
-static int get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int get_link_ksettings(struct net_device *dev,
+ struct ethtool_link_ksettings *ecmd)
 {
struct netdev_private *np = netdev_priv(dev);
spin_lock_irq(>lock);
@@ -2593,7 +2596,8 @@ static int get_settings(struct net_device *dev, struct 
ethtool_cmd *ecmd)
return 0;
 }
 
-static int set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *ecmd)
 {
struct netdev_private *np = netdev_priv(dev);
int res;
@@ -2689,8 +2693,6 @@ static int get_eeprom(struct net_device *dev, struct 
ethtool_eeprom *eeprom, u8
.get_drvinfo = get_drvinfo,
.get_regs_len = get_regs_len,
.get_eeprom_len = get_eeprom_len,
-   .get_settings = get_settings,
-   .set_settings = set_settings,
.get_wol = get_wol,
.set_wol = set_wol,
.get_regs = get_regs,
@@ -2699,6 +2701,8 @@ static int get_eeprom(struct net_device *dev, struct 
ethtool_eeprom *eeprom, u8
.nway_reset = nway_reset,
.get_link = get_link,
.get_eeprom = get_eeprom,
+   .get_link_ksettings = get_link_ksettings,
+   .set_link_ksettings = set_link_ksettings,
 };
 
 static int netdev_set_wol(struct net_device *dev, u32 newval)
@@ -2828,29 +2832,32 @@ static int netdev_get_sopass(struct net_device *dev, u8 
*data)
return 0;
 }
 
-static int netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int netdev_get_ecmd(struct net_device *dev,
+  struct ethtool_link_ksettings *ecmd)
 {
struct netdev_private *np = netdev_priv(dev);
+   u32 supported, advertising;
u32 tmp;
 
-   ecmd->port= dev->if_port;
-   ethtool_cmd_speed_set(ecmd, np->speed);
-   ecmd->duplex  = np->duplex;
-   ecmd->autoneg = np->autoneg;
-   ecmd->advertising = 0;
+   ecmd->base.port   = dev->if_port;
+   ecmd->base.speed  = np->speed;
+   ecmd->base.duplex = np->duplex;
+   ecmd->base.autoneg = np->autoneg;
+   advertising = 0;
+
if (np->advertising & ADVERTISE_10HALF)
-   ecmd->advertising |= ADVERTISED_10baseT_Half;
+   advertising |= ADVERTISED_10baseT_Half;
if (np->advertising & ADVERTISE_10FULL)
-   ecmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
if (np->advertising & ADVERTISE_100HALF)
-   ecmd->advertising |= ADVERTISED_100baseT_Half;
+   advertising |= ADVERTISED_100baseT_Half;
if (np->advertising & ADVERTISE_100FULL)
-   ecmd->advertising |= ADVERTISED_100baseT_Full;
-   ecmd->supported   = (SUPPORTED_Autoneg |
+   advertising |= ADVERTISED_100baseT_Full;
+   supported   = (SUPPORTED_Autoneg |
SUPPORTED_10baseT_Half  | SUPPORTED_10baseT_Full  |
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
SUPPORTED_TP | SUPPORTED_MII | SUPPORTED_FIBRE);
-   ecmd->phy_address = np->phy_addr_external;
+   ecmd->base.phy_address = np->phy_addr_external;
/*
 * We inten

[PATCH] net: myricom: myri10ge: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/myricom/myri10ge/myri10ge.c |   23 +
 1 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c 
b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
index 1139d18..b171ed2 100644
--- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
+++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
@@ -1610,15 +1610,16 @@ static irqreturn_t myri10ge_intr(int irq, void *arg)
 }
 
 static int
-myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
+myri10ge_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct myri10ge_priv *mgp = netdev_priv(netdev);
char *ptr;
int i;
 
-   cmd->autoneg = AUTONEG_DISABLE;
-   ethtool_cmd_speed_set(cmd, SPEED_1);
-   cmd->duplex = DUPLEX_FULL;
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   cmd->base.speed = SPEED_1;
+   cmd->base.duplex = DUPLEX_FULL;
 
/*
 * parse the product code to deterimine the interface type
@@ -1643,16 +1644,12 @@ static irqreturn_t myri10ge_intr(int irq, void *arg)
ptr++;
if (*ptr == 'R' || *ptr == 'Q' || *ptr == 'S') {
/* We've found either an XFP, quad ribbon fiber, or SFP+ */
-   cmd->port = PORT_FIBRE;
-   cmd->supported |= SUPPORTED_FIBRE;
-   cmd->advertising |= ADVERTISED_FIBRE;
+   cmd->base.port = PORT_FIBRE;
+   ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
} else {
-   cmd->port = PORT_OTHER;
+   cmd->base.port = PORT_OTHER;
}
-   if (*ptr == 'R' || *ptr == 'S')
-   cmd->transceiver = XCVR_EXTERNAL;
-   else
-   cmd->transceiver = XCVR_INTERNAL;
 
return 0;
 }
@@ -1925,7 +1922,6 @@ static int myri10ge_led(struct myri10ge_priv *mgp, int on)
 }
 
 static const struct ethtool_ops myri10ge_ethtool_ops = {
-   .get_settings = myri10ge_get_settings,
.get_drvinfo = myri10ge_get_drvinfo,
.get_coalesce = myri10ge_get_coalesce,
.set_coalesce = myri10ge_set_coalesce,
@@ -1939,6 +1935,7 @@ static int myri10ge_led(struct myri10ge_priv *mgp, int on)
.set_msglevel = myri10ge_set_msglevel,
.get_msglevel = myri10ge_get_msglevel,
.set_phys_id = myri10ge_phys_id,
+   .get_link_ksettings = myri10ge_get_link_ksettings,
 };
 
 static int myri10ge_allocate_rings(struct myri10ge_slice_state *ss)
-- 
1.7.4.4



[PATCH] net: microchip: encx24j600: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/microchip/encx24j600.c |   32 +++---
 1 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/microchip/encx24j600.c 
b/drivers/net/ethernet/microchip/encx24j600.c
index fbce616..f831238 100644
--- a/drivers/net/ethernet/microchip/encx24j600.c
+++ b/drivers/net/ethernet/microchip/encx24j600.c
@@ -940,29 +940,33 @@ static void encx24j600_get_drvinfo(struct net_device *dev,
sizeof(info->bus_info));
 }
 
-static int encx24j600_get_settings(struct net_device *dev,
-  struct ethtool_cmd *cmd)
+static int encx24j600_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct encx24j600_priv *priv = netdev_priv(dev);
+   u32 supported;
 
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
+   supported = SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
 SUPPORTED_Autoneg | SUPPORTED_TP;
 
-   ethtool_cmd_speed_set(cmd, priv->speed);
-   cmd->duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
-   cmd->port = PORT_TP;
-   cmd->autoneg = priv->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+
+   cmd->base.speed = priv->speed;
+   cmd->base.duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
+   cmd->base.port = PORT_TP;
+   cmd->base.autoneg = priv->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
 
return 0;
 }
 
-static int encx24j600_set_settings(struct net_device *dev,
-  struct ethtool_cmd *cmd)
+static int
+encx24j600_set_link_ksettings(struct net_device *dev,
+ const struct ethtool_link_ksettings *cmd)
 {
-   return encx24j600_setlink(dev, cmd->autoneg,
- ethtool_cmd_speed(cmd), cmd->duplex);
+   return encx24j600_setlink(dev, cmd->base.autoneg,
+ cmd->base.speed, cmd->base.duplex);
 }
 
 static u32 encx24j600_get_msglevel(struct net_device *dev)
@@ -980,13 +984,13 @@ static void encx24j600_set_msglevel(struct net_device 
*dev, u32 val)
 }
 
 static const struct ethtool_ops encx24j600_ethtool_ops = {
-   .get_settings = encx24j600_get_settings,
-   .set_settings = encx24j600_set_settings,
.get_drvinfo = encx24j600_get_drvinfo,
.get_msglevel = encx24j600_get_msglevel,
.set_msglevel = encx24j600_set_msglevel,
.get_regs_len = encx24j600_get_regs_len,
.get_regs = encx24j600_get_regs,
+   .get_link_ksettings = encx24j600_get_link_ksettings,
+   .set_link_ksettings = encx24j600_set_link_ksettings,
 };
 
 static const struct net_device_ops encx24j600_netdev_ops = {
-- 
1.7.4.4



[PATCH] net: microchip: enc28j60: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/microchip/enc28j60.c |   31 +++-
 1 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/microchip/enc28j60.c 
b/drivers/net/ethernet/microchip/enc28j60.c
index 045b910..f6ecfa7 100644
--- a/drivers/net/ethernet/microchip/enc28j60.c
+++ b/drivers/net/ethernet/microchip/enc28j60.c
@@ -1487,27 +1487,30 @@ static void enc28j60_restart_work_handler(struct 
work_struct *work)
 }
 
 static int
-enc28j60_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+enc28j60_get_link_ksettings(struct net_device *dev,
+   struct ethtool_link_ksettings *cmd)
 {
struct enc28j60_net *priv = netdev_priv(dev);
 
-   cmd->transceiver = XCVR_INTERNAL;
-   cmd->supported  = SUPPORTED_10baseT_Half
-   | SUPPORTED_10baseT_Full
-   | SUPPORTED_TP;
-   ethtool_cmd_speed_set(cmd,  SPEED_10);
-   cmd->duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
-   cmd->port   = PORT_TP;
-   cmd->autoneg= AUTONEG_DISABLE;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 10baseT_Half);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 10baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
+
+   cmd->base.speed = SPEED_10;
+   cmd->base.duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF;
+   cmd->base.port  = PORT_TP;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
return 0;
 }
 
 static int
-enc28j60_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+enc28j60_set_link_ksettings(struct net_device *dev,
+   const struct ethtool_link_ksettings *cmd)
 {
-   return enc28j60_setlink(dev, cmd->autoneg,
-   ethtool_cmd_speed(cmd), cmd->duplex);
+   return enc28j60_setlink(dev, cmd->base.autoneg,
+   cmd->base.speed, cmd->base.duplex);
 }
 
 static u32 enc28j60_get_msglevel(struct net_device *dev)
@@ -1523,11 +1526,11 @@ static void enc28j60_set_msglevel(struct net_device 
*dev, u32 val)
 }
 
 static const struct ethtool_ops enc28j60_ethtool_ops = {
-   .get_settings   = enc28j60_get_settings,
-   .set_settings   = enc28j60_set_settings,
.get_drvinfo= enc28j60_get_drvinfo,
.get_msglevel   = enc28j60_get_msglevel,
.set_msglevel   = enc28j60_set_msglevel,
+   .get_link_ksettings = enc28j60_get_link_ksettings,
+   .set_link_ksettings = enc28j60_set_link_ksettings,
 };
 
 static int enc28j60_chipset_init(struct net_device *dev)
-- 
1.7.4.4



[PATCH] net: micrel: ksz884x: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/micrel/ksz884x.c |   62 -
 1 files changed, 38 insertions(+), 24 deletions(-)

diff --git a/drivers/net/ethernet/micrel/ksz884x.c 
b/drivers/net/ethernet/micrel/ksz884x.c
index 97f6ef1..ee38c18 100644
--- a/drivers/net/ethernet/micrel/ksz884x.c
+++ b/drivers/net/ethernet/micrel/ksz884x.c
@@ -5944,7 +5944,7 @@ static void mdio_write(struct net_device *dev, int 
phy_id, int reg_num, int val)
 /* These functions use the MII functions in mii.c. */
 
 /**
- * netdev_get_settings - get network device settings
+ * netdev_get_link_ksettings - get network device settings
  * @dev:   Network device.
  * @cmd:   Ethtool command.
  *
@@ -5952,23 +5952,26 @@ static void mdio_write(struct net_device *dev, int 
phy_id, int reg_num, int val)
  *
  * Return 0 if successful; otherwise an error code.
  */
-static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netdev_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct dev_priv *priv = netdev_priv(dev);
struct dev_info *hw_priv = priv->adapter;
 
mutex_lock(_priv->lock);
-   mii_ethtool_gset(>mii_if, cmd);
-   cmd->advertising |= SUPPORTED_TP;
+   mii_ethtool_get_link_ksettings(>mii_if, cmd);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
mutex_unlock(_priv->lock);
 
/* Save advertised settings for workaround in next function. */
-   priv->advertising = cmd->advertising;
+   ethtool_convert_link_mode_to_legacy_u32(>advertising,
+   cmd->link_modes.advertising);
+
return 0;
 }
 
 /**
- * netdev_set_settings - set network device settings
+ * netdev_set_link_ksettings - set network device settings
  * @dev:   Network device.
  * @cmd:   Ethtool command.
  *
@@ -5976,54 +5979,65 @@ static int netdev_get_settings(struct net_device *dev, 
struct ethtool_cmd *cmd)
  *
  * Return 0 if successful; otherwise an error code.
  */
-static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int netdev_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct dev_priv *priv = netdev_priv(dev);
struct dev_info *hw_priv = priv->adapter;
struct ksz_port *port = >port;
-   u32 speed = ethtool_cmd_speed(cmd);
+   struct ethtool_link_ksettings copy_cmd;
+   u32 speed = cmd->base.speed;
+   u32 advertising;
int rc;
 
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
+
/*
 * ethtool utility does not change advertised setting if auto
 * negotiation is not specified explicitly.
 */
-   if (cmd->autoneg && priv->advertising == cmd->advertising) {
-   cmd->advertising |= ADVERTISED_ALL;
+   if (cmd->base.autoneg && priv->advertising == advertising) {
+   advertising |= ADVERTISED_ALL;
if (10 == speed)
-   cmd->advertising &=
+   advertising &=
~(ADVERTISED_100baseT_Full |
ADVERTISED_100baseT_Half);
else if (100 == speed)
-   cmd->advertising &=
+   advertising &=
~(ADVERTISED_10baseT_Full |
ADVERTISED_10baseT_Half);
-   if (0 == cmd->duplex)
-   cmd->advertising &=
+   if (0 == cmd->base.duplex)
+   advertising &=
~(ADVERTISED_100baseT_Full |
ADVERTISED_10baseT_Full);
-   else if (1 == cmd->duplex)
-   cmd->advertising &=
+   else if (1 == cmd->base.duplex)
+   advertising &=
~(ADVERTISED_100baseT_Half |
ADVERTISED_10baseT_Half);
}
mutex_lock(_priv->lock);
-   if (cmd->autoneg &&
-   (cmd->advertising & ADVERTISED_ALL) ==
-   ADVERTISED_ALL) {
+   if (cmd->base.autoneg &&
+   (advertising & ADVERTISED_ALL) == ADVERTISED_ALL) {
port->duplex = 0;
port->speed = 0;
port->force_link = 0

[PATCH] net: micrel: ks8851_mll: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/micrel/ks8851_mll.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c 
b/drivers/net/ethernet/micrel/ks8851_mll.c
index db62807..7647f7b 100644
--- a/drivers/net/ethernet/micrel/ks8851_mll.c
+++ b/drivers/net/ethernet/micrel/ks8851_mll.c
@@ -1311,16 +1311,18 @@ static void ks_set_msglevel(struct net_device *netdev, 
u32 to)
ks->msg_enable = to;
 }
 
-static int ks_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
+static int ks_get_link_ksettings(struct net_device *netdev,
+struct ethtool_link_ksettings *cmd)
 {
struct ks_net *ks = netdev_priv(netdev);
-   return mii_ethtool_gset(>mii, cmd);
+   return mii_ethtool_get_link_ksettings(>mii, cmd);
 }
 
-static int ks_set_settings(struct net_device *netdev, struct ethtool_cmd *cmd)
+static int ks_set_link_ksettings(struct net_device *netdev,
+const struct ethtool_link_ksettings *cmd)
 {
struct ks_net *ks = netdev_priv(netdev);
-   return mii_ethtool_sset(>mii, cmd);
+   return mii_ethtool_set_link_ksettings(>mii, cmd);
 }
 
 static u32 ks_get_link(struct net_device *netdev)
@@ -1339,10 +1341,10 @@ static int ks_nway_reset(struct net_device *netdev)
.get_drvinfo= ks_get_drvinfo,
.get_msglevel   = ks_get_msglevel,
.set_msglevel   = ks_set_msglevel,
-   .get_settings   = ks_get_settings,
-   .set_settings   = ks_set_settings,
.get_link   = ks_get_link,
.nway_reset = ks_nway_reset,
+   .get_link_ksettings = ks_get_link_ksettings,
+   .set_link_ksettings = ks_set_link_ksettings,
 };
 
 /* MII interface controls */
-- 
1.7.4.4



[PATCH] net: micrel: ks8851: use new api ethtool_{get|set}_link_ksettings

2017-02-09 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/micrel/ks8851.c |   14 --
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/micrel/ks8851.c 
b/drivers/net/ethernet/micrel/ks8851.c
index 955d69a..279ee46 100644
--- a/drivers/net/ethernet/micrel/ks8851.c
+++ b/drivers/net/ethernet/micrel/ks8851.c
@@ -1086,16 +1086,18 @@ static void ks8851_set_msglevel(struct net_device *dev, 
u32 to)
ks->msg_enable = to;
 }
 
-static int ks8851_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int ks8851_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct ks8851_net *ks = netdev_priv(dev);
-   return mii_ethtool_gset(>mii, cmd);
+   return mii_ethtool_get_link_ksettings(>mii, cmd);
 }
 
-static int ks8851_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int ks8851_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct ks8851_net *ks = netdev_priv(dev);
-   return mii_ethtool_sset(>mii, cmd);
+   return mii_ethtool_set_link_ksettings(>mii, cmd);
 }
 
 static u32 ks8851_get_link(struct net_device *dev)
@@ -1251,13 +1253,13 @@ static int ks8851_get_eeprom_len(struct net_device *dev)
.get_drvinfo= ks8851_get_drvinfo,
.get_msglevel   = ks8851_get_msglevel,
.set_msglevel   = ks8851_set_msglevel,
-   .get_settings   = ks8851_get_settings,
-   .set_settings   = ks8851_set_settings,
.get_link   = ks8851_get_link,
.nway_reset = ks8851_nway_reset,
.get_eeprom_len = ks8851_get_eeprom_len,
.get_eeprom = ks8851_get_eeprom,
.set_eeprom = ks8851_set_eeprom,
+   .get_link_ksettings = ks8851_get_link_ksettings,
+   .set_link_ksettings = ks8851_set_link_ksettings,
 };
 
 /* MII interface controls */
-- 
1.7.4.4



[PATCH] net: micrel: ks8695net: use new api ethtool_{get|set}_link_ksettings

2017-02-08 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/micrel/ks8695net.c |   91 +--
 1 files changed, 50 insertions(+), 41 deletions(-)

diff --git a/drivers/net/ethernet/micrel/ks8695net.c 
b/drivers/net/ethernet/micrel/ks8695net.c
index d210615..bd51e05 100644
--- a/drivers/net/ethernet/micrel/ks8695net.c
+++ b/drivers/net/ethernet/micrel/ks8695net.c
@@ -854,85 +854,94 @@ static int ks8695_poll(struct napi_struct *napi, int 
budget)
 }
 
 /**
- * ks8695_wan_get_settings - Get device-specific settings.
+ * ks8695_wan_get_link_ksettings - Get device-specific settings.
  * @ndev: The network device to read settings from
  * @cmd: The ethtool structure to read into
  */
 static int
-ks8695_wan_get_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
+ks8695_wan_get_link_ksettings(struct net_device *ndev,
+ struct ethtool_link_ksettings *cmd)
 {
struct ks8695_priv *ksp = netdev_priv(ndev);
u32 ctrl;
+   u32 supported, advertising;
 
/* All ports on the KS8695 support these... */
-   cmd->supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
+   supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
  SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
  SUPPORTED_TP | SUPPORTED_MII);
-   cmd->transceiver = XCVR_INTERNAL;
 
-   cmd->advertising = ADVERTISED_TP | ADVERTISED_MII;
-   cmd->port = PORT_MII;
-   cmd->supported |= (SUPPORTED_Autoneg | SUPPORTED_Pause);
-   cmd->phy_address = 0;
+   advertising = ADVERTISED_TP | ADVERTISED_MII;
+   cmd->base.port = PORT_MII;
+   supported |= (SUPPORTED_Autoneg | SUPPORTED_Pause);
+   cmd->base.phy_address = 0;
 
ctrl = readl(ksp->phyiface_regs + KS8695_WMC);
if ((ctrl & WMC_WAND) == 0) {
/* auto-negotiation is enabled */
-   cmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
if (ctrl & WMC_WANA100F)
-   cmd->advertising |= ADVERTISED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
if (ctrl & WMC_WANA100H)
-   cmd->advertising |= ADVERTISED_100baseT_Half;
+   advertising |= ADVERTISED_100baseT_Half;
if (ctrl & WMC_WANA10F)
-   cmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
if (ctrl & WMC_WANA10H)
-   cmd->advertising |= ADVERTISED_10baseT_Half;
+   advertising |= ADVERTISED_10baseT_Half;
if (ctrl & WMC_WANAP)
-   cmd->advertising |= ADVERTISED_Pause;
-   cmd->autoneg = AUTONEG_ENABLE;
+   advertising |= ADVERTISED_Pause;
+   cmd->base.autoneg = AUTONEG_ENABLE;
 
-   ethtool_cmd_speed_set(cmd,
- (ctrl & WMC_WSS) ? SPEED_100 : SPEED_10);
-   cmd->duplex = (ctrl & WMC_WDS) ?
+   cmd->base.speed = (ctrl & WMC_WSS) ? SPEED_100 : SPEED_10;
+   cmd->base.duplex = (ctrl & WMC_WDS) ?
DUPLEX_FULL : DUPLEX_HALF;
} else {
/* auto-negotiation is disabled */
-   cmd->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
-   ethtool_cmd_speed_set(cmd, ((ctrl & WMC_WANF100) ?
-   SPEED_100 : SPEED_10));
-   cmd->duplex = (ctrl & WMC_WANFF) ?
+   cmd->base.speed = (ctrl & WMC_WANF100) ?
+   SPEED_100 : SPEED_10;
+   cmd->base.duplex = (ctrl & WMC_WANFF) ?
DUPLEX_FULL : DUPLEX_HALF;
}
 
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
+
return 0;
 }
 
 /**
- * ks8695_wan_set_settings - Set device-specific settings.
+ * ks8695_wan_set_link_ksettings - Set device-specific settings.
  * @ndev: The network device to configure
  * @cmd: The settings to configure
  */
 static int
-ks8695_wan_set_settings(struct net_device *ndev, struct ethtool_cmd *cmd)
+ks8695_wan_set_link_ksettings(struct net_device *ndev,
+ 

[PATCH] net: mellanox: switchx2: use new api ethtool_{get|set}_link_ksettings

2017-02-07 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c |   47 +++-
 1 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c 
b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index 169193e..ec1e886 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -733,7 +733,7 @@ static u32 mlxsw_sx_from_ptys_advert_link(u32 
ptys_eth_proto)
 }
 
 static void mlxsw_sx_from_ptys_speed_duplex(bool carrier_ok, u32 
ptys_eth_proto,
-   struct ethtool_cmd *cmd)
+   struct ethtool_link_ksettings *cmd)
 {
u32 speed = SPEED_UNKNOWN;
u8 duplex = DUPLEX_UNKNOWN;
@@ -750,8 +750,8 @@ static void mlxsw_sx_from_ptys_speed_duplex(bool 
carrier_ok, u32 ptys_eth_proto,
}
}
 out:
-   ethtool_cmd_speed_set(cmd, speed);
-   cmd->duplex = duplex;
+   cmd->base.speed = speed;
+   cmd->base.duplex = duplex;
 }
 
 static u8 mlxsw_sx_port_connector_port(u32 ptys_eth_proto)
@@ -776,8 +776,9 @@ static u8 mlxsw_sx_port_connector_port(u32 ptys_eth_proto)
return PORT_OTHER;
 }
 
-static int mlxsw_sx_port_get_settings(struct net_device *dev,
- struct ethtool_cmd *cmd)
+static int
+mlxsw_sx_port_get_link_ksettings(struct net_device *dev,
+struct ethtool_link_ksettings *cmd)
 {
struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
@@ -785,6 +786,7 @@ static int mlxsw_sx_port_get_settings(struct net_device 
*dev,
u32 eth_proto_cap;
u32 eth_proto_admin;
u32 eth_proto_oper;
+   u32 supported, advertising, lp_advertising;
int err;
 
mlxsw_reg_ptys_eth_pack(ptys_pl, mlxsw_sx_port->local_port, 0);
@@ -796,18 +798,24 @@ static int mlxsw_sx_port_get_settings(struct net_device 
*dev,
mlxsw_reg_ptys_eth_unpack(ptys_pl, _proto_cap,
  _proto_admin, _proto_oper);
 
-   cmd->supported = mlxsw_sx_from_ptys_supported_port(eth_proto_cap) |
+   supported = mlxsw_sx_from_ptys_supported_port(eth_proto_cap) |
 mlxsw_sx_from_ptys_supported_link(eth_proto_cap) |
 SUPPORTED_Pause | SUPPORTED_Asym_Pause;
-   cmd->advertising = mlxsw_sx_from_ptys_advert_link(eth_proto_admin);
+   advertising = mlxsw_sx_from_ptys_advert_link(eth_proto_admin);
mlxsw_sx_from_ptys_speed_duplex(netif_carrier_ok(dev),
eth_proto_oper, cmd);
 
eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
-   cmd->port = mlxsw_sx_port_connector_port(eth_proto_oper);
-   cmd->lp_advertising = mlxsw_sx_from_ptys_advert_link(eth_proto_oper);
+   cmd->base.port = mlxsw_sx_port_connector_port(eth_proto_oper);
+   lp_advertising = mlxsw_sx_from_ptys_advert_link(eth_proto_oper);
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.lp_advertising,
+   lp_advertising);
 
-   cmd->transceiver = XCVR_INTERNAL;
return 0;
 }
 
@@ -847,8 +855,9 @@ static u32 mlxsw_sx_to_ptys_upper_speed(u32 upper_speed)
return ptys_proto;
 }
 
-static int mlxsw_sx_port_set_settings(struct net_device *dev,
- struct ethtool_cmd *cmd)
+static int
+mlxsw_sx_port_set_link_ksettings(struct net_device *dev,
+const struct ethtool_link_ksettings *cmd)
 {
struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
@@ -857,13 +866,17 @@ static int mlxsw_sx_port_set_settings(struct net_device 
*dev,
u32 eth_proto_new;
u32 eth_proto_cap;
u32 eth_proto_admin;
+   u32 advertising;
bool is_up;
int err;
 
-   speed = ethtool_cmd_speed(cmd);
+   speed = cmd->base.speed;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
-   eth_proto_new = cmd->autoneg == AUTONEG_ENABLE ?
-   mlxsw_sx_to_ptys_advert_link(cmd->advertising) :
+   eth_proto_new = cmd->base.autoneg == AUTONEG

[PATCH] net: intel: ixgbevf: use new api ethtool_{get|set}_link_ksettings

2017-02-07 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/ixgbevf/ethtool.c |   22 +++---
 1 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbevf/ethtool.c 
b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
index 1f6c0ec..6bf7409 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ethtool.c
@@ -91,18 +91,18 @@ struct ixgbe_stats {
 
 #define IXGBEVF_TEST_LEN (sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN)
 
-static int ixgbevf_get_settings(struct net_device *netdev,
-   struct ethtool_cmd *ecmd)
+static int ixgbevf_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *cmd)
 {
struct ixgbevf_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = >hw;
u32 link_speed = 0;
bool link_up;
 
-   ecmd->supported = SUPPORTED_1baseT_Full;
-   ecmd->autoneg = AUTONEG_DISABLE;
-   ecmd->transceiver = XCVR_DUMMY1;
-   ecmd->port = -1;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 1baseT_Full);
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   cmd->base.port = -1;
 
hw->mac.get_link_status = 1;
hw->mac.ops.check_link(hw, _speed, _up, false);
@@ -122,11 +122,11 @@ static int ixgbevf_get_settings(struct net_device *netdev,
break;
}
 
-   ethtool_cmd_speed_set(ecmd, speed);
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.speed = speed;
+   cmd->base.duplex = DUPLEX_FULL;
} else {
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
 
return 0;
@@ -885,7 +885,6 @@ static int ixgbevf_get_rxfh(struct net_device *netdev, u32 
*indir, u8 *key,
 }
 
 static const struct ethtool_ops ixgbevf_ethtool_ops = {
-   .get_settings   = ixgbevf_get_settings,
.get_drvinfo= ixgbevf_get_drvinfo,
.get_regs_len   = ixgbevf_get_regs_len,
.get_regs   = ixgbevf_get_regs,
@@ -905,6 +904,7 @@ static int ixgbevf_get_rxfh(struct net_device *netdev, u32 
*indir, u8 *key,
.get_rxfh_indir_size= ixgbevf_get_rxfh_indir_size,
.get_rxfh_key_size  = ixgbevf_get_rxfh_key_size,
.get_rxfh   = ixgbevf_get_rxfh,
+   .get_link_ksettings = ixgbevf_get_link_ksettings,
 };
 
 void ixgbevf_set_ethtool_ops(struct net_device *netdev)
-- 
1.7.4.4



[PATCH] net: intel: ixgbe: use new api ethtool_{get|set}_link_ksettings

2017-02-07 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c |  166 --
 1 files changed, 90 insertions(+), 76 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index ee28e54..77b3126 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -179,60 +179,62 @@ static u32 ixgbe_get_supported_10gtypes(struct ixgbe_hw 
*hw)
}
 }
 
-static int ixgbe_get_settings(struct net_device *netdev,
- struct ethtool_cmd *ecmd)
+static int ixgbe_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct ixgbe_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = >hw;
ixgbe_link_speed supported_link;
bool autoneg = false;
+   u32 supported, advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
 
hw->mac.ops.get_link_capabilities(hw, _link, );
 
/* set the supported link speeds */
if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
-   ecmd->supported |= ixgbe_get_supported_10gtypes(hw);
+   supported |= ixgbe_get_supported_10gtypes(hw);
if (supported_link & IXGBE_LINK_SPEED_1GB_FULL)
-   ecmd->supported |= (ixgbe_isbackplane(hw->phy.media_type)) ?
+   supported |= (ixgbe_isbackplane(hw->phy.media_type)) ?
   SUPPORTED_1000baseKX_Full :
   SUPPORTED_1000baseT_Full;
if (supported_link & IXGBE_LINK_SPEED_100_FULL)
-   ecmd->supported |= SUPPORTED_100baseT_Full;
+   supported |= SUPPORTED_100baseT_Full;
if (supported_link & IXGBE_LINK_SPEED_10_FULL)
-   ecmd->supported |= SUPPORTED_10baseT_Full;
+   supported |= SUPPORTED_10baseT_Full;
 
/* default advertised speed if phy.autoneg_advertised isn't set */
-   ecmd->advertising = ecmd->supported;
+   advertising = supported;
/* set the advertised speeds */
if (hw->phy.autoneg_advertised) {
-   ecmd->advertising = 0;
+   advertising = 0;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10_FULL)
-   ecmd->advertising |= ADVERTISED_10baseT_Full;
+   advertising |= ADVERTISED_10baseT_Full;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
-   ecmd->advertising |= ADVERTISED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
-   ecmd->advertising |= ecmd->supported & ADVRTSD_MSK_10G;
+   advertising |= supported & ADVRTSD_MSK_10G;
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) {
-   if (ecmd->supported & SUPPORTED_1000baseKX_Full)
-   ecmd->advertising |= ADVERTISED_1000baseKX_Full;
+   if (supported & SUPPORTED_1000baseKX_Full)
+   advertising |= ADVERTISED_1000baseKX_Full;
else
-   ecmd->advertising |= ADVERTISED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
}
} else {
if (hw->phy.multispeed_fiber && !autoneg) {
if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
-   ecmd->advertising = ADVERTISED_1baseT_Full;
+   advertising = ADVERTISED_1baseT_Full;
}
}
 
if (autoneg) {
-   ecmd->supported |= SUPPORTED_Autoneg;
-   ecmd->advertising |= ADVERTISED_Autoneg;
-   ecmd->autoneg = AUTONEG_ENABLE;
+   supported |= SUPPORTED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
+   cmd->base.autoneg = AUTONEG_ENABLE;
} else
-   ecmd->autoneg = AUTONEG_DISABLE;
-
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
/* Determine the remaining settings based on the PHY type. */
switch (adapter->hw.phy.type) {
@@ -241,14 +243,14 @@ static int ixgbe_get_settings(struct net_device *netdev,

[PATCH] net: intel: ixgb: use new api ethtool_{get|set}_link_ksettings

2017-02-05 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c |   39 ++--
 1 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c 
b/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c
index e5d7255..d10a0d2 100644
--- a/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgb/ixgb_ethtool.c
@@ -94,24 +94,30 @@ struct ixgb_stats {
 #define IXGB_STATS_LEN ARRAY_SIZE(ixgb_gstrings_stats)
 
 static int
-ixgb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
+ixgb_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct ixgb_adapter *adapter = netdev_priv(netdev);
 
-   ecmd->supported = (SUPPORTED_1baseT_Full | SUPPORTED_FIBRE);
-   ecmd->advertising = (ADVERTISED_1baseT_Full | ADVERTISED_FIBRE);
-   ecmd->port = PORT_FIBRE;
-   ecmd->transceiver = XCVR_EXTERNAL;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
+
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, 1baseT_Full);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
+
+   cmd->base.port = PORT_FIBRE;
 
if (netif_carrier_ok(adapter->netdev)) {
-   ethtool_cmd_speed_set(ecmd, SPEED_1);
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.speed = SPEED_1;
+   cmd->base.duplex = DUPLEX_FULL;
} else {
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
 
-   ecmd->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
return 0;
 }
 
@@ -126,13 +132,14 @@ void ixgb_set_speed_duplex(struct net_device *netdev)
 }
 
 static int
-ixgb_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
+ixgb_set_link_ksettings(struct net_device *netdev,
+   const struct ethtool_link_ksettings *cmd)
 {
struct ixgb_adapter *adapter = netdev_priv(netdev);
-   u32 speed = ethtool_cmd_speed(ecmd);
+   u32 speed = cmd->base.speed;
 
-   if (ecmd->autoneg == AUTONEG_ENABLE ||
-   (speed + ecmd->duplex != SPEED_1 + DUPLEX_FULL))
+   if (cmd->base.autoneg == AUTONEG_ENABLE ||
+   (speed + cmd->base.duplex != SPEED_1 + DUPLEX_FULL))
return -EINVAL;
 
if (netif_running(adapter->netdev)) {
@@ -630,8 +637,6 @@ void ixgb_set_speed_duplex(struct net_device *netdev)
 }
 
 static const struct ethtool_ops ixgb_ethtool_ops = {
-   .get_settings = ixgb_get_settings,
-   .set_settings = ixgb_set_settings,
.get_drvinfo = ixgb_get_drvinfo,
.get_regs_len = ixgb_get_regs_len,
.get_regs = ixgb_get_regs,
@@ -649,6 +654,8 @@ void ixgb_set_speed_duplex(struct net_device *netdev)
.set_phys_id = ixgb_set_phys_id,
.get_sset_count = ixgb_get_sset_count,
.get_ethtool_stats = ixgb_get_ethtool_stats,
+   .get_link_ksettings = ixgb_get_link_ksettings,
+   .set_link_ksettings = ixgb_set_link_ksettings,
 };
 
 void ixgb_set_ethtool_ops(struct net_device *netdev)
-- 
1.7.4.4



[PATCH] net: intel: igbvf: use new api ethtool_{get|set}_link_ksettings

2017-02-05 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/igbvf/ethtool.c |   38 ++--
 1 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/intel/igbvf/ethtool.c 
b/drivers/net/ethernet/intel/igbvf/ethtool.c
index 8dea1b1..34faa11 100644
--- a/drivers/net/ethernet/intel/igbvf/ethtool.c
+++ b/drivers/net/ethernet/intel/igbvf/ethtool.c
@@ -71,45 +71,45 @@ struct igbvf_stats {
 
 #define IGBVF_TEST_LEN ARRAY_SIZE(igbvf_gstrings_test)
 
-static int igbvf_get_settings(struct net_device *netdev,
- struct ethtool_cmd *ecmd)
+static int igbvf_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct igbvf_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = >hw;
u32 status;
 
-   ecmd->supported   = SUPPORTED_1000baseT_Full;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   ethtool_link_ksettings_add_link_mode(cmd, supported, 1000baseT_Full);
+   ethtool_link_ksettings_zero_link_mode(cmd, advertising);
+   ethtool_link_ksettings_add_link_mode(cmd, advertising, 1000baseT_Full);
 
-   ecmd->advertising = ADVERTISED_1000baseT_Full;
-
-   ecmd->port = -1;
-   ecmd->transceiver = XCVR_DUMMY1;
+   cmd->base.port = -1;
 
status = er32(STATUS);
if (status & E1000_STATUS_LU) {
if (status & E1000_STATUS_SPEED_1000)
-   ethtool_cmd_speed_set(ecmd, SPEED_1000);
+   cmd->base.speed = SPEED_1000;
else if (status & E1000_STATUS_SPEED_100)
-   ethtool_cmd_speed_set(ecmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
else
-   ethtool_cmd_speed_set(ecmd, SPEED_10);
+   cmd->base.speed = SPEED_10;
 
if (status & E1000_STATUS_FD)
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
else
-   ecmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
} else {
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
 
-   ecmd->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
return 0;
 }
 
-static int igbvf_set_settings(struct net_device *netdev,
- struct ethtool_cmd *ecmd)
+static int igbvf_set_link_ksettings(struct net_device *netdev,
+   const struct ethtool_link_ksettings *cmd)
 {
return -EOPNOTSUPP;
 }
@@ -443,8 +443,6 @@ static void igbvf_get_strings(struct net_device *netdev, 
u32 stringset,
 }
 
 static const struct ethtool_ops igbvf_ethtool_ops = {
-   .get_settings   = igbvf_get_settings,
-   .set_settings   = igbvf_set_settings,
.get_drvinfo= igbvf_get_drvinfo,
.get_regs_len   = igbvf_get_regs_len,
.get_regs   = igbvf_get_regs,
@@ -467,6 +465,8 @@ static void igbvf_get_strings(struct net_device *netdev, 
u32 stringset,
.get_ethtool_stats  = igbvf_get_ethtool_stats,
.get_coalesce   = igbvf_get_coalesce,
.set_coalesce   = igbvf_set_coalesce,
+   .get_link_ksettings = igbvf_get_link_ksettings,
+   .set_link_ksettings = igbvf_set_link_ksettings,
 };
 
 void igbvf_set_ethtool_ops(struct net_device *netdev)
-- 
1.7.4.4



[PATCH] net: intel: igb: use new api ethtool_{get|set}_link_ksettings

2017-02-05 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/igb/igb_ethtool.c |  108 ++
 1 files changed, 59 insertions(+), 49 deletions(-)

diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c 
b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index 737b664..3e6281a 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -144,7 +144,8 @@ enum igb_diagnostics_results {
 };
 #define IGB_TEST_LEN (sizeof(igb_gstrings_test) / ETH_GSTRING_LEN)
 
-static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd 
*ecmd)
+static int igb_get_link_ksettings(struct net_device *netdev,
+ struct ethtool_link_ksettings *cmd)
 {
struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = >hw;
@@ -152,11 +153,12 @@ static int igb_get_settings(struct net_device *netdev, 
struct ethtool_cmd *ecmd)
struct e1000_sfp_flags *eth_flags = _spec->eth_flags;
u32 status;
u32 speed;
+   u32 supported, advertising;
 
status = rd32(E1000_STATUS);
if (hw->phy.media_type == e1000_media_type_copper) {
 
-   ecmd->supported = (SUPPORTED_10baseT_Half |
+   supported = (SUPPORTED_10baseT_Half |
   SUPPORTED_10baseT_Full |
   SUPPORTED_100baseT_Half |
   SUPPORTED_100baseT_Full |
@@ -164,63 +166,61 @@ static int igb_get_settings(struct net_device *netdev, 
struct ethtool_cmd *ecmd)
   SUPPORTED_Autoneg |
   SUPPORTED_TP |
   SUPPORTED_Pause);
-   ecmd->advertising = ADVERTISED_TP;
+   advertising = ADVERTISED_TP;
 
if (hw->mac.autoneg == 1) {
-   ecmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
/* the e1000 autoneg seems to match ethtool nicely */
-   ecmd->advertising |= hw->phy.autoneg_advertised;
+   advertising |= hw->phy.autoneg_advertised;
}
 
-   ecmd->port = PORT_TP;
-   ecmd->phy_address = hw->phy.addr;
-   ecmd->transceiver = XCVR_INTERNAL;
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = hw->phy.addr;
} else {
-   ecmd->supported = (SUPPORTED_FIBRE |
+   supported = (SUPPORTED_FIBRE |
   SUPPORTED_1000baseKX_Full |
   SUPPORTED_Autoneg |
   SUPPORTED_Pause);
-   ecmd->advertising = (ADVERTISED_FIBRE |
+   advertising = (ADVERTISED_FIBRE |
 ADVERTISED_1000baseKX_Full);
if (hw->mac.type == e1000_i354) {
if ((hw->device_id ==
 E1000_DEV_ID_I354_BACKPLANE_2_5GBPS) &&
!(status & E1000_STATUS_2P5_SKU_OVER)) {
-   ecmd->supported |= SUPPORTED_2500baseX_Full;
-   ecmd->supported &=
+   supported |= SUPPORTED_2500baseX_Full;
+   supported &=
~SUPPORTED_1000baseKX_Full;
-   ecmd->advertising |= ADVERTISED_2500baseX_Full;
-   ecmd->advertising &=
+   advertising |= ADVERTISED_2500baseX_Full;
+   advertising &=
~ADVERTISED_1000baseKX_Full;
}
}
if (eth_flags->e100_base_fx) {
-   ecmd->supported |= SUPPORTED_100baseT_Full;
-   ecmd->advertising |= ADVERTISED_100baseT_Full;
+   supported |= SUPPORTED_100baseT_Full;
+   advertising |= ADVERTISED_100baseT_Full;
}
if (hw->mac.autoneg == 1)
-   ecmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
 
-   ecmd->port = PORT_FIBRE;
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.port = PORT_FIBRE;
}
if (hw->mac.autoneg != 1)
-   ecmd->advertising &= ~(ADVERTISED_Pause |
+   advertising &= ~(ADVE

[PATCH] net: intel: i40evf: use new api ethtool_{get|set}_link_ksettings

2017-02-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c |   31 +--
 1 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c 
b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
index 272d600..122efbd 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
@@ -64,51 +64,50 @@ struct i40evf_stats {
(I40EVF_GLOBAL_STATS_LEN + I40EVF_QUEUE_STATS_LEN(_dev))
 
 /**
- * i40evf_get_settings - Get Link Speed and Duplex settings
+ * i40evf_get_link_ksettings - Get Link Speed and Duplex settings
  * @netdev: network interface device structure
- * @ecmd: ethtool command
+ * @cmd: ethtool command
  *
  * Reports speed/duplex settings. Because this is a VF, we don't know what
  * kind of link we really have, so we fake it.
  **/
-static int i40evf_get_settings(struct net_device *netdev,
-  struct ethtool_cmd *ecmd)
+static int i40evf_get_link_ksettings(struct net_device *netdev,
+struct ethtool_link_ksettings *cmd)
 {
struct i40evf_adapter *adapter = netdev_priv(netdev);
 
-   ecmd->supported = 0;
-   ecmd->autoneg = AUTONEG_DISABLE;
-   ecmd->transceiver = XCVR_DUMMY1;
-   ecmd->port = PORT_NONE;
+   ethtool_link_ksettings_zero_link_mode(cmd, supported);
+   cmd->base.autoneg = AUTONEG_DISABLE;
+   cmd->base.port = PORT_NONE;
/* Set speed and duplex */
switch (adapter->link_speed) {
case I40E_LINK_SPEED_40GB:
-   ethtool_cmd_speed_set(ecmd, SPEED_4);
+   cmd->base.speed = SPEED_4;
break;
case I40E_LINK_SPEED_25GB:
 #ifdef SPEED_25000
-   ethtool_cmd_speed_set(ecmd, SPEED_25000);
+   cmd->base.speed = SPEED_25000;
 #else
netdev_info(netdev,
"Speed is 25G, display not supported by this 
version of ethtool.\n");
 #endif
break;
case I40E_LINK_SPEED_20GB:
-   ethtool_cmd_speed_set(ecmd, SPEED_2);
+   cmd->base.speed = SPEED_2;
break;
case I40E_LINK_SPEED_10GB:
-   ethtool_cmd_speed_set(ecmd, SPEED_1);
+   cmd->base.speed = SPEED_1;
break;
case I40E_LINK_SPEED_1GB:
-   ethtool_cmd_speed_set(ecmd, SPEED_1000);
+   cmd->base.speed = SPEED_1000;
break;
case I40E_LINK_SPEED_100MB:
-   ethtool_cmd_speed_set(ecmd, SPEED_100);
+   cmd->base.speed = SPEED_100;
break;
default:
break;
}
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
 
return 0;
 }
@@ -643,7 +642,6 @@ static int i40evf_set_rxfh(struct net_device *netdev, const 
u32 *indir,
 }
 
 static const struct ethtool_ops i40evf_ethtool_ops = {
-   .get_settings   = i40evf_get_settings,
.get_drvinfo= i40evf_get_drvinfo,
.get_link   = ethtool_op_get_link,
.get_ringparam  = i40evf_get_ringparam,
@@ -663,6 +661,7 @@ static int i40evf_set_rxfh(struct net_device *netdev, const 
u32 *indir,
.set_rxfh   = i40evf_set_rxfh,
.get_channels   = i40evf_get_channels,
.get_rxfh_key_size  = i40evf_get_rxfh_key_size,
+   .get_link_ksettings = i40evf_get_link_ksettings,
 };
 
 /**
-- 
1.7.4.4



[PATCH] net: intel: i40e: use new api ethtool_{get|set}_link_ksettings

2017-02-04 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/i40e/i40e_ethtool.c |  224 ++--
 1 files changed, 133 insertions(+), 91 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c 
b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index cc1465a..011f0b8 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -387,7 +387,7 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, 
u32 *supported,
  *
  **/
 static void i40e_get_settings_link_up(struct i40e_hw *hw,
- struct ethtool_cmd *ecmd,
+ struct ethtool_link_ksettings *cmd,
  struct net_device *netdev,
  struct i40e_pf *pf)
 {
@@ -395,70 +395,76 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
u32 link_speed = hw_link_info->link_speed;
u32 e_advertising = 0x0;
u32 e_supported = 0x0;
+   u32 supported, advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
/* Initialize supported and advertised settings based on phy settings */
switch (hw_link_info->phy_type) {
case I40E_PHY_TYPE_40GBASE_CR4:
case I40E_PHY_TYPE_40GBASE_CR4_CU:
-   ecmd->supported = SUPPORTED_Autoneg |
+   supported = SUPPORTED_Autoneg |
  SUPPORTED_4baseCR4_Full;
-   ecmd->advertising = ADVERTISED_Autoneg |
+   advertising = ADVERTISED_Autoneg |
ADVERTISED_4baseCR4_Full;
break;
case I40E_PHY_TYPE_XLAUI:
case I40E_PHY_TYPE_XLPPI:
case I40E_PHY_TYPE_40GBASE_AOC:
-   ecmd->supported = SUPPORTED_4baseCR4_Full;
+   supported = SUPPORTED_4baseCR4_Full;
break;
case I40E_PHY_TYPE_40GBASE_SR4:
-   ecmd->supported = SUPPORTED_4baseSR4_Full;
+   supported = SUPPORTED_4baseSR4_Full;
break;
case I40E_PHY_TYPE_40GBASE_LR4:
-   ecmd->supported = SUPPORTED_4baseLR4_Full;
+   supported = SUPPORTED_4baseLR4_Full;
break;
case I40E_PHY_TYPE_10GBASE_SR:
case I40E_PHY_TYPE_10GBASE_LR:
case I40E_PHY_TYPE_1000BASE_SX:
case I40E_PHY_TYPE_1000BASE_LX:
-   ecmd->supported = SUPPORTED_1baseT_Full;
+   supported = SUPPORTED_1baseT_Full;
if (hw_link_info->module_type[2] &
I40E_MODULE_TYPE_1000BASE_SX ||
hw_link_info->module_type[2] &
I40E_MODULE_TYPE_1000BASE_LX) {
-   ecmd->supported |= SUPPORTED_1000baseT_Full;
+   supported |= SUPPORTED_1000baseT_Full;
if (hw_link_info->requested_speeds &
I40E_LINK_SPEED_1GB)
-   ecmd->advertising |= ADVERTISED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
}
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
-   ecmd->advertising |= ADVERTISED_1baseT_Full;
+   advertising |= ADVERTISED_1baseT_Full;
break;
case I40E_PHY_TYPE_10GBASE_T:
case I40E_PHY_TYPE_1000BASE_T:
case I40E_PHY_TYPE_100BASE_TX:
-   ecmd->supported = SUPPORTED_Autoneg |
+   supported = SUPPORTED_Autoneg |
  SUPPORTED_1baseT_Full |
  SUPPORTED_1000baseT_Full |
  SUPPORTED_100baseT_Full;
-   ecmd->advertising = ADVERTISED_Autoneg;
+   advertising = ADVERTISED_Autoneg;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
-   ecmd->advertising |= ADVERTISED_1baseT_Full;
+   advertising |= ADVERTISED_1baseT_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
-   ecmd->advertising |= ADVERTISED_1000baseT_Full;
+   advertising |= ADVERTISED_1000baseT_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)

Re: [Intel-wired-lan] [PATCH] net: intel: e1000e: use new api ethtool_{get|set}_link_ksettings

2017-01-31 Thread Philippe Reynes
Hi Sasha,

On 1/31/17, Neftin, Sasha  wrote:
>
> Philippe,
>
> We will look into and try test this patch. I would like ask question. I
> see that this thread has been started from implementation for e1000
> code. Why do you decide shift implementation to e1000e?

I've just sent two patch for two drivers (e1000 and e1000e).


> Sasha
>
>
Philippe


[PATCH v2] net: aquantia: atlantic: use new api ethtool_{get|set}_link_ksettings

2017-01-30 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- add support and advertise for TP

 .../net/ethernet/aquantia/atlantic/aq_ethtool.c|   23 +
 drivers/net/ethernet/aquantia/atlantic/aq_nic.c|   51 +---
 drivers/net/ethernet/aquantia/atlantic/aq_nic.h|6 ++-
 3 files changed, 49 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c 
b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
index c5b025e..a761e91 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
@@ -35,24 +35,25 @@ static u32 aq_ethtool_get_link(struct net_device *ndev)
return ethtool_op_get_link(ndev);
 }
 
-static int aq_ethtool_get_settings(struct net_device *ndev,
-  struct ethtool_cmd *cmd)
+static int aq_ethtool_get_link_ksettings(struct net_device *ndev,
+struct ethtool_link_ksettings *cmd)
 {
struct aq_nic_s *aq_nic = netdev_priv(ndev);
 
-   aq_nic_get_link_settings(aq_nic, cmd);
-   ethtool_cmd_speed_set(cmd, netif_carrier_ok(ndev) ?
-   aq_nic_get_link_speed(aq_nic) : 0U);
+   aq_nic_get_link_ksettings(aq_nic, cmd);
+   cmd->base.speed = netif_carrier_ok(ndev) ?
+   aq_nic_get_link_speed(aq_nic) : 0U;
 
return 0;
 }
 
-static int aq_ethtool_set_settings(struct net_device *ndev,
-  struct ethtool_cmd *cmd)
+static int
+aq_ethtool_set_link_ksettings(struct net_device *ndev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct aq_nic_s *aq_nic = netdev_priv(ndev);
 
-   return aq_nic_set_link_settings(aq_nic, cmd);
+   return aq_nic_set_link_ksettings(aq_nic, cmd);
 }
 
 /* there "5U" is number of queue[#] stats lines (InPackets+...+InErrors) */
@@ -248,8 +249,6 @@ static int aq_ethtool_get_rxnfc(struct net_device *ndev,
.get_link= aq_ethtool_get_link,
.get_regs_len= aq_ethtool_get_regs_len,
.get_regs= aq_ethtool_get_regs,
-   .get_settings= aq_ethtool_get_settings,
-   .set_settings= aq_ethtool_set_settings,
.get_drvinfo = aq_ethtool_get_drvinfo,
.get_strings = aq_ethtool_get_strings,
.get_rxfh_indir_size = aq_ethtool_get_rss_indir_size,
@@ -257,5 +256,7 @@ static int aq_ethtool_get_rxnfc(struct net_device *ndev,
.get_rxfh= aq_ethtool_get_rss,
.get_rxnfc   = aq_ethtool_get_rxnfc,
.get_sset_count  = aq_ethtool_get_sset_count,
-   .get_ethtool_stats   = aq_ethtool_stats
+   .get_ethtool_stats   = aq_ethtool_stats,
+   .get_link_ksettings  = aq_ethtool_get_link_ksettings,
+   .set_link_ksettings  = aq_ethtool_set_link_ksettings,
 };
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c 
b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 84bb441..bed25ab 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -734,50 +734,65 @@ void aq_nic_get_stats(struct aq_nic_s *self, u64 *data)
(void)err;
 }
 
-void aq_nic_get_link_settings(struct aq_nic_s *self, struct ethtool_cmd *cmd)
+void aq_nic_get_link_ksettings(struct aq_nic_s *self,
+  struct ethtool_link_ksettings *cmd)
 {
-   cmd->port = PORT_TP;
-   cmd->transceiver = XCVR_EXTERNAL;
+   u32 supported, advertising;
+
+   cmd->base.port = PORT_TP;
/* This driver supports only 10G capable adapters, so DUPLEX_FULL */
-   cmd->duplex = DUPLEX_FULL;
-   cmd->autoneg = self->aq_nic_cfg.is_autoneg;
+   cmd->base.duplex = DUPLEX_FULL;
+   cmd->base.autoneg = self->aq_nic_cfg.is_autoneg;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
-   cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_10G) ?
+   supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_10G) ?
ADVERTISED_1baseT_Full : 0U;
-   cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_1G) ?
+   supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_1G) ?
ADVERTISED_1000baseT_Full : 0U;
-   cmd->supported |= (self->aq_hw_caps.link_speed_msk &a

Re: [PATCH] net: aquantia: atlantic: use new api ethtool_{get|set}_link_ksettings

2017-01-30 Thread Philippe Reynes
Hi Pavel,

On 1/30/17, Pavel Belous  wrote:
> Hi Philippe,
>
> thanks you for your patch, it looks good.
> One improvement - could you please add support/advertising for TP?
>
>>+ supported |= SUPPORTED_Autoneg;
> need:
>   supported |= SUPPORTED_TP;
>
>
>>+ advertising = (self->aq_nic_cfg.is_autoneg) ?
>>  ADVERTISED_Autoneg : 0U;
>
> need:
>   advertising |= ADVERTISED_TP;
>

Yes, of course, I add send, and I send a v2.

> Thank you.

Regards,
Philippe


[PATCH] net: aquantia: atlantic: use new api ethtool_{get|set}_link_ksettings

2017-01-28 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 .../net/ethernet/aquantia/atlantic/aq_ethtool.c|   23 +
 drivers/net/ethernet/aquantia/atlantic/aq_nic.c|   49 ---
 drivers/net/ethernet/aquantia/atlantic/aq_nic.h|6 ++-
 3 files changed, 47 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c 
b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
index c5b025e..a761e91 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
@@ -35,24 +35,25 @@ static u32 aq_ethtool_get_link(struct net_device *ndev)
return ethtool_op_get_link(ndev);
 }
 
-static int aq_ethtool_get_settings(struct net_device *ndev,
-  struct ethtool_cmd *cmd)
+static int aq_ethtool_get_link_ksettings(struct net_device *ndev,
+struct ethtool_link_ksettings *cmd)
 {
struct aq_nic_s *aq_nic = netdev_priv(ndev);
 
-   aq_nic_get_link_settings(aq_nic, cmd);
-   ethtool_cmd_speed_set(cmd, netif_carrier_ok(ndev) ?
-   aq_nic_get_link_speed(aq_nic) : 0U);
+   aq_nic_get_link_ksettings(aq_nic, cmd);
+   cmd->base.speed = netif_carrier_ok(ndev) ?
+   aq_nic_get_link_speed(aq_nic) : 0U;
 
return 0;
 }
 
-static int aq_ethtool_set_settings(struct net_device *ndev,
-  struct ethtool_cmd *cmd)
+static int
+aq_ethtool_set_link_ksettings(struct net_device *ndev,
+ const struct ethtool_link_ksettings *cmd)
 {
struct aq_nic_s *aq_nic = netdev_priv(ndev);
 
-   return aq_nic_set_link_settings(aq_nic, cmd);
+   return aq_nic_set_link_ksettings(aq_nic, cmd);
 }
 
 /* there "5U" is number of queue[#] stats lines (InPackets+...+InErrors) */
@@ -248,8 +249,6 @@ static int aq_ethtool_get_rxnfc(struct net_device *ndev,
.get_link= aq_ethtool_get_link,
.get_regs_len= aq_ethtool_get_regs_len,
.get_regs= aq_ethtool_get_regs,
-   .get_settings= aq_ethtool_get_settings,
-   .set_settings= aq_ethtool_set_settings,
.get_drvinfo = aq_ethtool_get_drvinfo,
.get_strings = aq_ethtool_get_strings,
.get_rxfh_indir_size = aq_ethtool_get_rss_indir_size,
@@ -257,5 +256,7 @@ static int aq_ethtool_get_rxnfc(struct net_device *ndev,
.get_rxfh= aq_ethtool_get_rss,
.get_rxnfc   = aq_ethtool_get_rxnfc,
.get_sset_count  = aq_ethtool_get_sset_count,
-   .get_ethtool_stats   = aq_ethtool_stats
+   .get_ethtool_stats   = aq_ethtool_stats,
+   .get_link_ksettings  = aq_ethtool_get_link_ksettings,
+   .set_link_ksettings  = aq_ethtool_set_link_ksettings,
 };
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c 
b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 84bb441..ea86801 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -734,50 +734,63 @@ void aq_nic_get_stats(struct aq_nic_s *self, u64 *data)
(void)err;
 }
 
-void aq_nic_get_link_settings(struct aq_nic_s *self, struct ethtool_cmd *cmd)
+void aq_nic_get_link_ksettings(struct aq_nic_s *self,
+  struct ethtool_link_ksettings *cmd)
 {
-   cmd->port = PORT_TP;
-   cmd->transceiver = XCVR_EXTERNAL;
+   u32 supported, advertising;
+
+   cmd->base.port = PORT_TP;
/* This driver supports only 10G capable adapters, so DUPLEX_FULL */
-   cmd->duplex = DUPLEX_FULL;
-   cmd->autoneg = self->aq_nic_cfg.is_autoneg;
+   cmd->base.duplex = DUPLEX_FULL;
+   cmd->base.autoneg = self->aq_nic_cfg.is_autoneg;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
-   cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_10G) ?
+   supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_10G) ?
ADVERTISED_1baseT_Full : 0U;
-   cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_1G) ?
+   supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_1G) ?
ADVERTISED_1000baseT_Full : 0U;
-   cmd->supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RATE_100M) ?
+   supported |= (self->aq_hw_caps.link_speed_msk & AQ_NIC_RAT

[PATCH] net: intel: e1000e: use new api ethtool_{get|set}_link_ksettings

2017-01-26 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/e1000e/ethtool.c |   91 ++
 1 files changed, 49 insertions(+), 42 deletions(-)

diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c 
b/drivers/net/ethernet/intel/e1000e/ethtool.c
index 7aff68a..3768a5c 100644
--- a/drivers/net/ethernet/intel/e1000e/ethtool.c
+++ b/drivers/net/ethernet/intel/e1000e/ethtool.c
@@ -117,15 +117,15 @@ struct e1000_stats {
 
 #define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test)
 
-static int e1000_get_settings(struct net_device *netdev,
- struct ethtool_cmd *ecmd)
+static int e1000_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = >hw;
-   u32 speed;
+   u32 speed, supported, advertising;
 
if (hw->phy.media_type == e1000_media_type_copper) {
-   ecmd->supported = (SUPPORTED_10baseT_Half |
+   supported = (SUPPORTED_10baseT_Half |
   SUPPORTED_10baseT_Full |
   SUPPORTED_100baseT_Half |
   SUPPORTED_100baseT_Full |
@@ -133,39 +133,36 @@ static int e1000_get_settings(struct net_device *netdev,
   SUPPORTED_Autoneg |
   SUPPORTED_TP);
if (hw->phy.type == e1000_phy_ife)
-   ecmd->supported &= ~SUPPORTED_1000baseT_Full;
-   ecmd->advertising = ADVERTISED_TP;
+   supported &= ~SUPPORTED_1000baseT_Full;
+   advertising = ADVERTISED_TP;
 
if (hw->mac.autoneg == 1) {
-   ecmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
/* the e1000 autoneg seems to match ethtool nicely */
-   ecmd->advertising |= hw->phy.autoneg_advertised;
+   advertising |= hw->phy.autoneg_advertised;
}
 
-   ecmd->port = PORT_TP;
-   ecmd->phy_address = hw->phy.addr;
-   ecmd->transceiver = XCVR_INTERNAL;
-
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = hw->phy.addr;
} else {
-   ecmd->supported   = (SUPPORTED_1000baseT_Full |
+   supported   = (SUPPORTED_1000baseT_Full |
 SUPPORTED_FIBRE |
 SUPPORTED_Autoneg);
 
-   ecmd->advertising = (ADVERTISED_1000baseT_Full |
+   advertising = (ADVERTISED_1000baseT_Full |
 ADVERTISED_FIBRE |
 ADVERTISED_Autoneg);
 
-   ecmd->port = PORT_FIBRE;
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.port = PORT_FIBRE;
}
 
speed = SPEED_UNKNOWN;
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
 
if (netif_running(netdev)) {
if (netif_carrier_ok(netdev)) {
speed = adapter->link_speed;
-   ecmd->duplex = adapter->link_duplex - 1;
+   cmd->base.duplex = adapter->link_duplex - 1;
}
} else if (!pm_runtime_suspended(netdev->dev.parent)) {
u32 status = er32(STATUS);
@@ -179,30 +176,36 @@ static int e1000_get_settings(struct net_device *netdev,
speed = SPEED_10;
 
if (status & E1000_STATUS_FD)
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
else
-   ecmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
}
}
 
-   ethtool_cmd_speed_set(ecmd, speed);
-   ecmd->autoneg = ((hw->phy.media_type == e1000_media_type_fiber) ||
+   cmd->base.speed = speed;
+   cmd->base.autoneg = ((hw->phy.media_type == e1000_media_type_fiber) ||
 hw->mac.autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE;
 
/* MDI-X => 2; MDI =>1; Invalid =>0 */
if ((hw->phy.media_type == e1000_media_type_copper) &&
netif_carrier_ok(netdev))
-   ecmd->eth_tp_mdix = hw->phy.is_mdix ? ETH_TP_MDI_X : ETH_TP_MDI;
+   cmd->base.eth_tp_mdix = hw-&g

[PATCH] net: intel: e1000: use new api ethtool_{get|set}_link_ksettings

2017-01-21 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 drivers/net/ethernet/intel/e1000/e1000_ethtool.c |   93 +++---
 1 files changed, 46 insertions(+), 47 deletions(-)

diff --git a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c 
b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c
index 975eeb8..024a4b5 100644
--- a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c
+++ b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c
@@ -103,104 +103,104 @@ struct e1000_stats {
 
 #define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test)
 
-static int e1000_get_settings(struct net_device *netdev,
- struct ethtool_cmd *ecmd)
+static int e1000_get_link_ksettings(struct net_device *netdev,
+   struct ethtool_link_ksettings *cmd)
 {
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = >hw;
+   u32 supported, advertising;
 
if (hw->media_type == e1000_media_type_copper) {
-   ecmd->supported = (SUPPORTED_10baseT_Half |
+   supported = (SUPPORTED_10baseT_Half |
   SUPPORTED_10baseT_Full |
   SUPPORTED_100baseT_Half |
   SUPPORTED_100baseT_Full |
   SUPPORTED_1000baseT_Full|
   SUPPORTED_Autoneg |
   SUPPORTED_TP);
-   ecmd->advertising = ADVERTISED_TP;
+   advertising = ADVERTISED_TP;
 
if (hw->autoneg == 1) {
-   ecmd->advertising |= ADVERTISED_Autoneg;
+   advertising |= ADVERTISED_Autoneg;
/* the e1000 autoneg seems to match ethtool nicely */
-   ecmd->advertising |= hw->autoneg_advertised;
+   advertising |= hw->autoneg_advertised;
}
 
-   ecmd->port = PORT_TP;
-   ecmd->phy_address = hw->phy_addr;
-
-   if (hw->mac_type == e1000_82543)
-   ecmd->transceiver = XCVR_EXTERNAL;
-   else
-   ecmd->transceiver = XCVR_INTERNAL;
-
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = hw->phy_addr;
} else {
-   ecmd->supported   = (SUPPORTED_1000baseT_Full |
+   supported   = (SUPPORTED_1000baseT_Full |
 SUPPORTED_FIBRE |
 SUPPORTED_Autoneg);
 
-   ecmd->advertising = (ADVERTISED_1000baseT_Full |
+   advertising = (ADVERTISED_1000baseT_Full |
 ADVERTISED_FIBRE |
 ADVERTISED_Autoneg);
 
-   ecmd->port = PORT_FIBRE;
-
-   if (hw->mac_type >= e1000_82545)
-   ecmd->transceiver = XCVR_INTERNAL;
-   else
-   ecmd->transceiver = XCVR_EXTERNAL;
+   cmd->base.port = PORT_FIBRE;
}
 
if (er32(STATUS) & E1000_STATUS_LU) {
e1000_get_speed_and_duplex(hw, >link_speed,
   >link_duplex);
-   ethtool_cmd_speed_set(ecmd, adapter->link_speed);
+   cmd->base.speed = adapter->link_speed;
 
/* unfortunately FULL_DUPLEX != DUPLEX_FULL
 * and HALF_DUPLEX != DUPLEX_HALF
 */
if (adapter->link_duplex == FULL_DUPLEX)
-   ecmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
else
-   ecmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
} else {
-   ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN);
-   ecmd->duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
+   cmd->base.duplex = DUPLEX_UNKNOWN;
}
 
-   ecmd->autoneg = ((hw->media_type == e1000_media_type_fiber) ||
+   cmd->base.autoneg = ((hw->media_type == e1000_media_type_fiber) ||
 hw->autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE;
 
/* MDI-X => 1; MDI => 0 */
if ((hw->media_type == e1000_media_type_copper) &&
netif_carrier_ok(netdev))
-   ecmd->eth_tp_mdix = (!!adapter->phy_info.mdix_mode ?
+   cmd->base.eth_tp_mdix = (!!adapter->phy_info.mdix_mode ?
 ETH_TP_MDI_X : ETH_TP_MDI);
else
-  

[PATCH v2] net: broadcom: bnx2x: use new api ethtool_{get|set}_link_ksettings

2017-01-21 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- also move to new api for bnx2x_vf

 .../net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c|  199 +++-
 1 files changed, 109 insertions(+), 90 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index 5f19427..4342374 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -216,165 +216,184 @@ static int bnx2x_get_port_type(struct bnx2x *bp)
return port_type;
 }
 
-static int bnx2x_get_vf_settings(struct net_device *dev,
-struct ethtool_cmd *cmd)
+static int bnx2x_get_vf_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct bnx2x *bp = netdev_priv(dev);
+   u32 supported, advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.supported);
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
if (bp->state == BNX2X_STATE_OPEN) {
if (test_bit(BNX2X_LINK_REPORT_FD,
 >vf_link_vars.link_report_flags))
-   cmd->duplex = DUPLEX_FULL;
+   cmd->base.duplex = DUPLEX_FULL;
else
-   cmd->duplex = DUPLEX_HALF;
+   cmd->base.duplex = DUPLEX_HALF;
 
-   ethtool_cmd_speed_set(cmd, bp->vf_link_vars.line_speed);
+   cmd->base.speed = bp->vf_link_vars.line_speed;
} else {
-   cmd->duplex = DUPLEX_UNKNOWN;
-   ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN);
+   cmd->base.duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
}
 
-   cmd->port   = PORT_OTHER;
-   cmd->phy_address= 0;
-   cmd->transceiver= XCVR_INTERNAL;
-   cmd->autoneg= AUTONEG_DISABLE;
-   cmd->maxtxpkt   = 0;
-   cmd->maxrxpkt   = 0;
+   cmd->base.port  = PORT_OTHER;
+   cmd->base.phy_address   = 0;
+   cmd->base.autoneg   = AUTONEG_DISABLE;
 
DP(BNX2X_MSG_ETHTOOL, "ethtool_cmd: cmd %d\n"
   "  supported 0x%x  advertising 0x%x  speed %u\n"
-  "  duplex %d  port %d  phy_address %d  transceiver %d\n"
-  "  autoneg %d  maxtxpkt %d  maxrxpkt %d\n",
-  cmd->cmd, cmd->supported, cmd->advertising,
-  ethtool_cmd_speed(cmd),
-  cmd->duplex, cmd->port, cmd->phy_address, cmd->transceiver,
-  cmd->autoneg, cmd->maxtxpkt, cmd->maxrxpkt);
+  "  duplex %d  port %d  phy_address %d\n"
+  "  autoneg %d\n",
+  cmd->base.cmd, supported, advertising,
+  cmd->base.speed,
+  cmd->base.duplex, cmd->base.port, cmd->base.phy_address,
+  cmd->base.autoneg);
 
return 0;
 }
 
-static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int bnx2x_get_link_ksettings(struct net_device *dev,
+   struct ethtool_link_ksettings *cmd)
 {
struct bnx2x *bp = netdev_priv(dev);
int cfg_idx = bnx2x_get_link_cfg_idx(bp);
u32 media_type;
+   u32 supported, advertising, lp_advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(_advertising,
+   cmd->link_modes.lp_advertising);
 
/* Dual Media boards present all available port types */
-   cmd->supported = bp->port.supported[cfg_idx] |
+   supported = bp->port.supported[cfg_idx] |
(bp->port.supported[cfg_idx ^ 1] &
 (SUPPORTED_TP | SUPPORTED_FIBRE));
-   cmd->advertising = bp->port.advertising[cfg_idx];
+   advertising = bp->port.advertising[cfg_idx];
media_type = bp->link_params.phy[bnx2x_get_cur_phy_idx(bp)].media_type;
if (media_type == ETH_PHY_SFP_1G_FIBER) {
-   cmd->supported &= ~(SUPPORTED_1baseT_Full);
-   cmd->advertising &= ~(ADVERTISED_1baseT_Full);
+   supported &= ~(SUPPORTED_1baseT_Full);
+   advertising &= ~(ADVERTISED_1baseT_Full);
}
 
if ((bp->state == BNX2X_STATE_OPEN) && bp->link_vars.link_up &&
!(bp->flags & MF_FUNC_DIS)) {
-

[PATCH] net: broadcom: bnx2x: use new api ethtool_{get|set}_link_ksettings

2017-01-21 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
 .../net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c|  156 +++-
 1 files changed, 86 insertions(+), 70 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index 5f19427..9d02a14 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -253,128 +253,144 @@ static int bnx2x_get_vf_settings(struct net_device *dev,
return 0;
 }
 
-static int bnx2x_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+static int bnx2x_get_link_ksettings(struct net_device *dev,
+   struct ethtool_link_ksettings *cmd)
 {
struct bnx2x *bp = netdev_priv(dev);
int cfg_idx = bnx2x_get_link_cfg_idx(bp);
u32 media_type;
+   u32 supported, advertising, lp_advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(_advertising,
+   cmd->link_modes.lp_advertising);
 
/* Dual Media boards present all available port types */
-   cmd->supported = bp->port.supported[cfg_idx] |
+   supported = bp->port.supported[cfg_idx] |
(bp->port.supported[cfg_idx ^ 1] &
 (SUPPORTED_TP | SUPPORTED_FIBRE));
-   cmd->advertising = bp->port.advertising[cfg_idx];
+   advertising = bp->port.advertising[cfg_idx];
media_type = bp->link_params.phy[bnx2x_get_cur_phy_idx(bp)].media_type;
if (media_type == ETH_PHY_SFP_1G_FIBER) {
-   cmd->supported &= ~(SUPPORTED_1baseT_Full);
-   cmd->advertising &= ~(ADVERTISED_1baseT_Full);
+   supported &= ~(SUPPORTED_1baseT_Full);
+   advertising &= ~(ADVERTISED_1baseT_Full);
}
 
if ((bp->state == BNX2X_STATE_OPEN) && bp->link_vars.link_up &&
!(bp->flags & MF_FUNC_DIS)) {
-   cmd->duplex = bp->link_vars.duplex;
+   cmd->base.duplex = bp->link_vars.duplex;
 
if (IS_MF(bp) && !BP_NOMCP(bp))
-   ethtool_cmd_speed_set(cmd, bnx2x_get_mf_speed(bp));
+   cmd->base.speed = bnx2x_get_mf_speed(bp);
else
-   ethtool_cmd_speed_set(cmd, bp->link_vars.line_speed);
+   cmd->base.speed = bp->link_vars.line_speed;
} else {
-   cmd->duplex = DUPLEX_UNKNOWN;
-   ethtool_cmd_speed_set(cmd, SPEED_UNKNOWN);
+   cmd->base.duplex = DUPLEX_UNKNOWN;
+   cmd->base.speed = SPEED_UNKNOWN;
}
 
-   cmd->port = bnx2x_get_port_type(bp);
+   cmd->base.port = bnx2x_get_port_type(bp);
 
-   cmd->phy_address = bp->mdio.prtad;
-   cmd->transceiver = XCVR_INTERNAL;
+   cmd->base.phy_address = bp->mdio.prtad;
 
if (bp->link_params.req_line_speed[cfg_idx] == SPEED_AUTO_NEG)
-   cmd->autoneg = AUTONEG_ENABLE;
+   cmd->base.autoneg = AUTONEG_ENABLE;
else
-   cmd->autoneg = AUTONEG_DISABLE;
+   cmd->base.autoneg = AUTONEG_DISABLE;
 
/* Publish LP advertised speeds and FC */
if (bp->link_vars.link_status & LINK_STATUS_AUTO_NEGOTIATE_COMPLETE) {
u32 status = bp->link_vars.link_status;
 
-   cmd->lp_advertising |= ADVERTISED_Autoneg;
+   lp_advertising |= ADVERTISED_Autoneg;
if (status & LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE)
-   cmd->lp_advertising |= ADVERTISED_Pause;
+   lp_advertising |= ADVERTISED_Pause;
if (status & LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE)
-   cmd->lp_advertising |= ADVERTISED_Asym_Pause;
+   lp_advertising |= ADVERTISED_Asym_Pause;
 
if (status & LINK_STATUS_LINK_PARTNER_10THD_CAPABLE)
-   cmd->lp_advertising |= ADVERTISED_10baseT_Half;
+   lp_advertising |= ADVERTISED_10baseT_Half;
if (status & LINK_STATUS_LINK_PARTNER_10TFD_CAPABLE)
-   cmd->lp_advertising |= ADVERTISED_10baseT_Full;
+   lp_advertising |= ADVERTISED_10baseT_Full;
if (status & LINK_STATUS_LINK_PARTNER_100TXHD_CAPABLE)
-   cmd->lp_advertising |= ADVERTISED_100baseT_Half;
+   lp_advertising |= ADVERTISED_100baseT_Half;
if (statu

[PATCH v2] net: marvell: skge: use new api ethtool_{get|set}_link_ksettings

2017-01-16 Thread Philippe Reynes
The ethtool api {get|set}_settings is deprecated.
We move this driver to new api {get|set}_link_ksettings.

The callback set_link_ksettings no longer update the value
of advertising, as the struct ethtool_link_ksettings is
defined as const.

As I don't have the hardware, I'd be very pleased if
someone may test this patch.

Signed-off-by: Philippe Reynes <trem...@gmail.com>
---
Changelog:
v2:
- update the commit log with a note to explain that this code
  was not tested on hardware (feedback from Stephen Hemminger)

 drivers/net/ethernet/marvell/skge.c |   63 --
 1 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/drivers/net/ethernet/marvell/skge.c 
b/drivers/net/ethernet/marvell/skge.c
index 9146a51..81106b7 100644
--- a/drivers/net/ethernet/marvell/skge.c
+++ b/drivers/net/ethernet/marvell/skge.c
@@ -300,65 +300,76 @@ static u32 skge_supported_modes(const struct skge_hw *hw)
return supported;
 }
 
-static int skge_get_settings(struct net_device *dev,
-struct ethtool_cmd *ecmd)
+static int skge_get_link_ksettings(struct net_device *dev,
+  struct ethtool_link_ksettings *cmd)
 {
struct skge_port *skge = netdev_priv(dev);
struct skge_hw *hw = skge->hw;
+   u32 supported, advertising;
 
-   ecmd->transceiver = XCVR_INTERNAL;
-   ecmd->supported = skge_supported_modes(hw);
+   supported = skge_supported_modes(hw);
 
if (hw->copper) {
-   ecmd->port = PORT_TP;
-   ecmd->phy_address = hw->phy_addr;
+   cmd->base.port = PORT_TP;
+   cmd->base.phy_address = hw->phy_addr;
} else
-   ecmd->port = PORT_FIBRE;
+   cmd->base.port = PORT_FIBRE;
+
+   advertising = skge->advertising;
+   cmd->base.autoneg = skge->autoneg;
+   cmd->base.speed = skge->speed;
+   cmd->base.duplex = skge->duplex;
+
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+   supported);
+   ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+   advertising);
 
-   ecmd->advertising = skge->advertising;
-   ecmd->autoneg = skge->autoneg;
-   ethtool_cmd_speed_set(ecmd, skge->speed);
-   ecmd->duplex = skge->duplex;
return 0;
 }
 
-static int skge_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
+static int skge_set_link_ksettings(struct net_device *dev,
+  const struct ethtool_link_ksettings *cmd)
 {
struct skge_port *skge = netdev_priv(dev);
const struct skge_hw *hw = skge->hw;
u32 supported = skge_supported_modes(hw);
int err = 0;
+   u32 advertising;
+
+   ethtool_convert_link_mode_to_legacy_u32(,
+   cmd->link_modes.advertising);
 
-   if (ecmd->autoneg == AUTONEG_ENABLE) {
-   ecmd->advertising = supported;
+   if (cmd->base.autoneg == AUTONEG_ENABLE) {
+   advertising = supported;
skge->duplex = -1;
skge->speed = -1;
} else {
u32 setting;
-   u32 speed = ethtool_cmd_speed(ecmd);
+   u32 speed = cmd->base.speed;
 
switch (speed) {
case SPEED_1000:
-   if (ecmd->duplex == DUPLEX_FULL)
+   if (cmd->base.duplex == DUPLEX_FULL)
setting = SUPPORTED_1000baseT_Full;
-   else if (ecmd->duplex == DUPLEX_HALF)
+   else if (cmd->base.duplex == DUPLEX_HALF)
setting = SUPPORTED_1000baseT_Half;
else
return -EINVAL;
break;
case SPEED_100:
-   if (ecmd->duplex == DUPLEX_FULL)
+   if (cmd->base.duplex == DUPLEX_FULL)
setting = SUPPORTED_100baseT_Full;
-   else if (ecmd->duplex == DUPLEX_HALF)
+   else if (cmd->base.duplex == DUPLEX_HALF)
setting = SUPPORTED_100baseT_Half;
else
return -EINVAL;
break;
 
case SPEED_10:
-   if (ecmd->duplex == DUPLEX_FULL)
+   if (cmd->base.duplex == DUPLEX_FULL)
setting = SUPPORTED_10baseT_Full;
-   else if (ecmd->duplex == DUPLEX_HALF)
+   else if (cmd->base.duplex == DUPLEX_HALF)
setting = SUPPORTE

Re: [PATCH] net: marvell: skge: use new api ethtool_{get|set}_link_ksettings

2017-01-16 Thread Philippe Reynes
Hi Stephen,

On 1/16/17, Stephen Hemminger <step...@networkplumber.org> wrote:
> On Mon, 16 Jan 2017 12:36:17 -0500 (EST)
> David Miller <da...@davemloft.net> wrote:
>
>> From: Stephen Hemminger <step...@networkplumber.org>
>> Date: Mon, 16 Jan 2017 09:29:51 -0800
>>
>> > On Sat, 14 Jan 2017 13:08:28 +0100
>> > Philippe Reynes <trem...@gmail.com> wrote:
>> >
>> >> The ethtool api {get|set}_settings is deprecated.
>> >> We move this driver to new api {get|set}_link_ksettings.
>> >>
>> >> The callback set_link_ksettings no longer update the value
>> >> of advertising, as the struct ethtool_link_ksettings is
>> >> defined as const.
>> >>
>> >> Signed-off-by: Philippe Reynes <trem...@gmail.com>
>> >
>> > Did you test this on real hardware?
>>
>> Philippe probably doesn't have physical access to most of the
>> drivers he is converting.
>>
>> But, he is the only person working on converting all of the drivers,
>> and therefore when the change looks straightforward I am going to
>> reward his work and effort by applying his changes and hope there
>> isn't any fallout.
>>
>> Those who really care can test his patches and give a Tested-by:
>>
>> Thanks.
>
> Yes, it looks mechanical and should be applied. There are lots of pieces of
> old hardware that no developer is running, and if we required full test
> suite runs
> on all drivers, then no refactoring would ever be possible.
>
> My preference is to always add commit note that the patch was compile
> tested only so that if someone has a problem with real hardware then they
> know
> what to suspect.

David is right, I don't have the hardware to test all drivers.
I haven't added a little note on all commit, because I was
thinking it would be a lot of noise. But if you prefer (and
David agrees), I'll add a note on all the following patches.

Btw, thanks David for applying my patches.

Philippe


  1   2   3   >