* [Intel-wired-lan] [PATCH 01/13 net-next] i40e: rename 'cmd' variables in ethtool interface
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 02/13 net-next] i40e: remove ifdef SPEED_25000 Alan Brady
` (11 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
After the switch to the new ethtool API, ethtool passes us
ethtool_ksettings structs instead of ethtool_command structs, however we
were still referring to them as 'cmd' variables. This renames them to
'ks' variables which makes the code easier to understand.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 139 +++++++++++++------------
1 file changed, 70 insertions(+), 69 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 72d5f2cdf419..4ed5deab7e68 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -378,12 +378,12 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
/**
* i40e_get_settings_link_up - Get the Link settings for when link is up
* @hw: hw structure
- * @ecmd: ethtool command to fill in
+ * @ks: ethtool ksettings to fill in
* @netdev: network interface device structure
- *
+ * @pf: pointer to physical function struct
**/
static void i40e_get_settings_link_up(struct i40e_hw *hw,
- struct ethtool_link_ksettings *cmd,
+ struct ethtool_link_ksettings *ks,
struct net_device *netdev,
struct i40e_pf *pf)
{
@@ -394,9 +394,9 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
u32 supported, advertising;
ethtool_convert_link_mode_to_legacy_u32(&supported,
- cmd->link_modes.supported);
+ ks->link_modes.supported);
ethtool_convert_link_mode_to_legacy_u32(&advertising,
- cmd->link_modes.advertising);
+ ks->link_modes.advertising);
/* Initialize supported and advertised settings based on phy settings */
switch (hw_link_info->phy_type) {
@@ -528,48 +528,49 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
/* Set speed and duplex */
switch (link_speed) {
case I40E_LINK_SPEED_40GB:
- cmd->base.speed = SPEED_40000;
+ ks->base.speed = SPEED_40000;
break;
case I40E_LINK_SPEED_25GB:
#ifdef SPEED_25000
- cmd->base.speed = SPEED_25000;
+ ks->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:
- cmd->base.speed = SPEED_20000;
+ ks->base.speed = SPEED_20000;
break;
case I40E_LINK_SPEED_10GB:
- cmd->base.speed = SPEED_10000;
+ ks->base.speed = SPEED_10000;
break;
case I40E_LINK_SPEED_1GB:
- cmd->base.speed = SPEED_1000;
+ ks->base.speed = SPEED_1000;
break;
case I40E_LINK_SPEED_100MB:
- cmd->base.speed = SPEED_100;
+ ks->base.speed = SPEED_100;
break;
default:
break;
}
- cmd->base.duplex = DUPLEX_FULL;
+ ks->base.duplex = DUPLEX_FULL;
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+ ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
supported);
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+ ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
advertising);
}
/**
* i40e_get_settings_link_down - Get the Link settings for when link is down
* @hw: hw structure
- * @ecmd: ethtool command to fill in
+ * @ks: ethtool ksettings to fill in
+ * @pf: pointer to physical function struct
*
* Reports link settings that can be determined when link is down
**/
static void i40e_get_settings_link_down(struct i40e_hw *hw,
- struct ethtool_link_ksettings *cmd,
+ struct ethtool_link_ksettings *ks,
struct i40e_pf *pf)
{
u32 supported, advertising;
@@ -579,25 +580,25 @@ static void i40e_get_settings_link_down(struct i40e_hw *hw,
*/
i40e_phy_type_to_ethtool(pf, &supported, &advertising);
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+ ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
supported);
- ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+ ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
advertising);
/* With no link speed and duplex are unknown */
- cmd->base.speed = SPEED_UNKNOWN;
- cmd->base.duplex = DUPLEX_UNKNOWN;
+ ks->base.speed = SPEED_UNKNOWN;
+ ks->base.duplex = DUPLEX_UNKNOWN;
}
/**
- * i40e_get_settings - Get Link Speed and Duplex settings
+ * i40e_get_link_ksettings - Get Link Speed and Duplex settings
* @netdev: network interface device structure
- * @ecmd: ethtool command
+ * @ks: ethtool ksettings
*
* Reports speed/duplex settings based on media_type
**/
static int i40e_get_link_ksettings(struct net_device *netdev,
- struct ethtool_link_ksettings *cmd)
+ struct ethtool_link_ksettings *ks)
{
struct i40e_netdev_priv *np = netdev_priv(netdev);
struct i40e_pf *pf = np->vsi->back;
@@ -607,74 +608,74 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
u32 advertising;
if (link_up)
- i40e_get_settings_link_up(hw, cmd, netdev, pf);
+ i40e_get_settings_link_up(hw, ks, netdev, pf);
else
- i40e_get_settings_link_down(hw, cmd, pf);
+ i40e_get_settings_link_down(hw, ks, pf);
/* Now set the settings that don't rely on link being up/down */
/* Set autoneg settings */
- cmd->base.autoneg = ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ?
- AUTONEG_ENABLE : AUTONEG_DISABLE);
+ ks->base.autoneg = ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ?
+ AUTONEG_ENABLE : AUTONEG_DISABLE);
switch (hw->phy.media_type) {
case I40E_MEDIA_TYPE_BACKPLANE:
- ethtool_link_ksettings_add_link_mode(cmd, supported,
+ ethtool_link_ksettings_add_link_mode(ks, supported,
Autoneg);
- ethtool_link_ksettings_add_link_mode(cmd, supported,
+ ethtool_link_ksettings_add_link_mode(ks, supported,
Backplane);
- ethtool_link_ksettings_add_link_mode(cmd, advertising,
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
Autoneg);
- ethtool_link_ksettings_add_link_mode(cmd, advertising,
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
Backplane);
- cmd->base.port = PORT_NONE;
+ ks->base.port = PORT_NONE;
break;
case I40E_MEDIA_TYPE_BASET:
- ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
- ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
- cmd->base.port = PORT_TP;
+ ethtool_link_ksettings_add_link_mode(ks, supported, TP);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, TP);
+ ks->base.port = PORT_TP;
break;
case I40E_MEDIA_TYPE_DA:
case I40E_MEDIA_TYPE_CX4:
- ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
- ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
- cmd->base.port = PORT_DA;
+ ethtool_link_ksettings_add_link_mode(ks, supported, FIBRE);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, FIBRE);
+ ks->base.port = PORT_DA;
break;
case I40E_MEDIA_TYPE_FIBER:
- ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
- cmd->base.port = PORT_FIBRE;
+ ethtool_link_ksettings_add_link_mode(ks, supported, FIBRE);
+ ks->base.port = PORT_FIBRE;
break;
case I40E_MEDIA_TYPE_UNKNOWN:
default:
- cmd->base.port = PORT_OTHER;
+ ks->base.port = PORT_OTHER;
break;
}
/* Set flow control settings */
- ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
+ ethtool_link_ksettings_add_link_mode(ks, supported, Pause);
switch (hw->fc.requested_mode) {
case I40E_FC_FULL:
- ethtool_link_ksettings_add_link_mode(cmd, advertising,
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
Pause);
break;
case I40E_FC_TX_PAUSE:
- ethtool_link_ksettings_add_link_mode(cmd, advertising,
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
Asym_Pause);
break;
case I40E_FC_RX_PAUSE:
- ethtool_link_ksettings_add_link_mode(cmd, advertising,
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
Pause);
- ethtool_link_ksettings_add_link_mode(cmd, advertising,
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
Asym_Pause);
break;
default:
ethtool_convert_link_mode_to_legacy_u32(
- &advertising, cmd->link_modes.advertising);
+ &advertising, ks->link_modes.advertising);
advertising &= ~(ADVERTISED_Pause | ADVERTISED_Asym_Pause);
ethtool_convert_legacy_u32_to_link_mode(
- cmd->link_modes.advertising, advertising);
+ ks->link_modes.advertising, advertising);
break;
}
@@ -682,14 +683,14 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
}
/**
- * i40e_set_settings - Set Speed and Duplex
+ * i40e_set_link_ksettings - Set Speed and Duplex
* @netdev: network interface device structure
- * @ecmd: ethtool command
+ * @ks: ethtool ksettings
*
* Set speed/duplex per media_types advertised/forced
**/
static int i40e_set_link_ksettings(struct net_device *netdev,
- const struct ethtool_link_ksettings *cmd)
+ const struct ethtool_link_ksettings *ks)
{
struct i40e_netdev_priv *np = netdev_priv(netdev);
struct i40e_aq_get_phy_abilities_resp abilities;
@@ -697,8 +698,8 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
struct i40e_pf *pf = np->vsi->back;
struct i40e_vsi *vsi = np->vsi;
struct i40e_hw *hw = &pf->hw;
- struct ethtool_link_ksettings safe_cmd;
- struct ethtool_link_ksettings copy_cmd;
+ struct ethtool_link_ksettings safe_ks;
+ struct ethtool_link_ksettings copy_ks;
i40e_status status = 0;
bool change = false;
int timeout = 50;
@@ -733,31 +734,31 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
return -EOPNOTSUPP;
}
- /* copy the cmd to copy_cmd to avoid modifying the origin */
- memcpy(©_cmd, cmd, sizeof(struct ethtool_link_ksettings));
+ /* copy the ksettings to copy_ks to avoid modifying the origin */
+ memcpy(©_ks, ks, sizeof(struct ethtool_link_ksettings));
/* get our own copy of the bits to check against */
- memset(&safe_cmd, 0, sizeof(struct ethtool_link_ksettings));
- i40e_get_link_ksettings(netdev, &safe_cmd);
+ memset(&safe_ks, 0, sizeof(struct ethtool_link_ksettings));
+ i40e_get_link_ksettings(netdev, &safe_ks);
- /* save autoneg and speed out of cmd */
- autoneg = cmd->base.autoneg;
+ /* save autoneg and speed out of ksettings */
+ autoneg = ks->base.autoneg;
ethtool_convert_link_mode_to_legacy_u32(&advertise,
- cmd->link_modes.advertising);
+ ks->link_modes.advertising);
/* set autoneg and speed back to what they currently are */
- copy_cmd.base.autoneg = safe_cmd.base.autoneg;
+ copy_ks.base.autoneg = safe_ks.base.autoneg;
ethtool_convert_link_mode_to_legacy_u32(
- &tmp, safe_cmd.link_modes.advertising);
+ &tmp, safe_ks.link_modes.advertising);
ethtool_convert_legacy_u32_to_link_mode(
- copy_cmd.link_modes.advertising, tmp);
+ copy_ks.link_modes.advertising, tmp);
- copy_cmd.base.cmd = safe_cmd.base.cmd;
+ copy_ks.base.cmd = safe_ks.base.cmd;
- /* If copy_cmd and safe_cmd are not the same now, then they are
+ /* If copy_ks and safe_ks are not the same now, then they are
* trying to set something that we do not support
*/
- if (memcmp(©_cmd, &safe_cmd, sizeof(struct ethtool_link_ksettings)))
+ if (memcmp(©_ks, &safe_ks, sizeof(struct ethtool_link_ksettings)))
return -EOPNOTSUPP;
while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) {
@@ -787,7 +788,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
if (!(hw->phy.link_info.an_info & I40E_AQ_AN_COMPLETED)) {
/* If autoneg is not supported, return error */
if (!ethtool_link_ksettings_test_link_mode(
- &safe_cmd, supported, Autoneg)) {
+ &safe_ks, supported, Autoneg)) {
netdev_info(netdev, "Autoneg not supported on this phy\n");
err = -EINVAL;
goto done;
@@ -804,7 +805,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
* that can disable it, so otherwise return error
*/
if (ethtool_link_ksettings_test_link_mode(
- &safe_cmd, supported, Autoneg) &&
+ &safe_ks, supported, Autoneg) &&
hw->phy.link_info.phy_type !=
I40E_PHY_TYPE_10GBASE_T) {
netdev_info(netdev, "Autoneg cannot be disabled on this phy\n");
@@ -819,7 +820,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
}
ethtool_convert_link_mode_to_legacy_u32(&tmp,
- safe_cmd.link_modes.supported);
+ safe_ks.link_modes.supported);
if (advertise & ~tmp) {
err = -EINVAL;
goto done;
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 02/13 net-next] i40e: remove ifdef SPEED_25000
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 01/13 net-next] i40e: rename 'cmd' variables in " Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 03/13 net-next] i40e: add function header for i40e_get_rxfh Alan Brady
` (10 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
This 'ifdef' doesn't accomplish anything so remove it.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 4ed5deab7e68..4fda529a464b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -531,12 +531,7 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
ks->base.speed = SPEED_40000;
break;
case I40E_LINK_SPEED_25GB:
-#ifdef SPEED_25000
ks->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:
ks->base.speed = SPEED_20000;
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 03/13 net-next] i40e: add function header for i40e_get_rxfh
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 01/13 net-next] i40e: rename 'cmd' variables in " Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 02/13 net-next] i40e: remove ifdef SPEED_25000 Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 04/13 net-next] i40e: fix clearing link masks in i40e_get_link_ksettings Alan Brady
` (9 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
Someone left this poor little function naked with no header. This
dresses it up in a proper function header it deserves.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 4fda529a464b..43294b6567c2 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -3966,6 +3966,16 @@ static u32 i40e_get_rxfh_indir_size(struct net_device *netdev)
return I40E_HLUT_ARRAY_SIZE;
}
+/**
+ * i40e_get_rxfh - get the rx flow hash indirection table
+ * @netdev: network interface device structure
+ * @indir: indirection table
+ * @key: hash key
+ * @hfunc: hash function
+ *
+ * Reads the indirection table directly from the hardware. Returns 0 on
+ * success.
+ **/
static int i40e_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key,
u8 *hfunc)
{
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 04/13 net-next] i40e: fix clearing link masks in i40e_get_link_ksettings
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (2 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 03/13 net-next] i40e: add function header for i40e_get_rxfh Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 05/13 net-next] i40e: fix i40e_phy_type_to_ethtool function header Alan Brady
` (8 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
This fixes two issues in i40e_get_link_ksettings. It adds calls to
ethtool_link_ksettings_zero_link_mode to make sure advertising and
supported link masks are cleared before we start setting bits in them.
This also replaces some funky bit manipulations with a much nicer call
to ethtool_link_ksettings_del_link_mode when removing link modes.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 43294b6567c2..f0cde09c0bd5 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -600,7 +600,9 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
struct i40e_hw *hw = &pf->hw;
struct i40e_link_status *hw_link_info = &hw->phy.link_info;
bool link_up = hw_link_info->link_info & I40E_AQ_LINK_UP;
- u32 advertising;
+
+ ethtool_link_ksettings_zero_link_mode(ks, supported);
+ ethtool_link_ksettings_zero_link_mode(ks, advertising);
if (link_up)
i40e_get_settings_link_up(hw, ks, netdev, pf);
@@ -664,13 +666,9 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
Asym_Pause);
break;
default:
- ethtool_convert_link_mode_to_legacy_u32(
- &advertising, ks->link_modes.advertising);
-
- advertising &= ~(ADVERTISED_Pause | ADVERTISED_Asym_Pause);
-
- ethtool_convert_legacy_u32_to_link_mode(
- ks->link_modes.advertising, advertising);
+ ethtool_link_ksettings_del_link_mode(ks, advertising, Pause);
+ ethtool_link_ksettings_del_link_mode(ks, advertising,
+ Asym_Pause);
break;
}
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 05/13 net-next] i40e: fix i40e_phy_type_to_ethtool function header
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (3 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 04/13 net-next] i40e: fix clearing link masks in i40e_get_link_ksettings Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 06/13 net-next] i40e: fix comment typo Alan Brady
` (7 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
The function header erroneously listed 'phy_types' as a parameter. The
correct parameter is 'pf'.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index f0cde09c0bd5..c5c3645ec682 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -253,7 +253,7 @@ static void i40e_partition_setting_complaint(struct i40e_pf *pf)
/**
* i40e_phy_type_to_ethtool - convert the phy_types to ethtool link modes
- * @phy_types: PHY types to convert
+ * @pf: PF struct with phy_types
* @supported: pointer to the ethtool supported variable to fill in
* @advertising: pointer to the ethtool advertising variable to fill in
*
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 06/13 net-next] i40e: fix comment typo
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (4 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 05/13 net-next] i40e: fix i40e_phy_type_to_ethtool function header Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 07/13 net-next] i40e: fix whitespace issues in i40e_ethtool.c Alan Brady
` (6 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
Someone forgot a word in this comment and it's confusing without it.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index c5c3645ec682..a6143b9d86db 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -516,8 +516,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
}
/* Now that we've worked out everything that could be supported by the
- * current PHY type, get what is supported by the NVM and them to
- * get what is truly supported
+ * current PHY type, get what is supported by the NVM and intersect
+ * them to get what is truly supported
*/
i40e_phy_type_to_ethtool(pf, &e_supported,
&e_advertising);
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 07/13 net-next] i40e: fix whitespace issues in i40e_ethtool.c
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (5 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 06/13 net-next] i40e: fix comment typo Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 08/13 net-next] i40e: group autoneg PHY types together Alan Brady
` (5 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
There's a number of minor incidental whitespace issues in this file.
This addresses most of the ones I could find.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 46 +++++++++++---------------
1 file changed, 19 insertions(+), 27 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index a6143b9d86db..6296bb2e8bd3 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -511,7 +511,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
break;
default:
/* if we got here and link is up something bad is afoot */
- netdev_info(netdev, "WARNING: Link is up but PHY type 0x%x is not recognized.\n",
+ netdev_info(netdev,
+ "WARNING: Link is up but PHY type 0x%x is not recognized.\n",
hw_link_info->phy_type);
}
@@ -614,14 +615,12 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
ks->base.autoneg = ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ?
AUTONEG_ENABLE : AUTONEG_DISABLE);
+ /* Set media type settings */
switch (hw->phy.media_type) {
case I40E_MEDIA_TYPE_BACKPLANE:
- ethtool_link_ksettings_add_link_mode(ks, supported,
- Autoneg);
- ethtool_link_ksettings_add_link_mode(ks, supported,
- Backplane);
- ethtool_link_ksettings_add_link_mode(ks, advertising,
- Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported, Backplane);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
ethtool_link_ksettings_add_link_mode(ks, advertising,
Backplane);
ks->base.port = PORT_NONE;
@@ -652,16 +651,14 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
switch (hw->fc.requested_mode) {
case I40E_FC_FULL:
- ethtool_link_ksettings_add_link_mode(ks, advertising,
- Pause);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Pause);
break;
case I40E_FC_TX_PAUSE:
ethtool_link_ksettings_add_link_mode(ks, advertising,
Asym_Pause);
break;
case I40E_FC_RX_PAUSE:
- ethtool_link_ksettings_add_link_mode(ks, advertising,
- Pause);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Pause);
ethtool_link_ksettings_add_link_mode(ks, advertising,
Asym_Pause);
break;
@@ -708,17 +705,14 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
i40e_partition_setting_complaint(pf);
return -EOPNOTSUPP;
}
-
if (vsi != pf->vsi[pf->lan_vsi])
return -EOPNOTSUPP;
-
if (hw->phy.media_type != I40E_MEDIA_TYPE_BASET &&
hw->phy.media_type != I40E_MEDIA_TYPE_FIBER &&
hw->phy.media_type != I40E_MEDIA_TYPE_BACKPLANE &&
hw->phy.media_type != I40E_MEDIA_TYPE_DA &&
hw->phy.link_info.link_info & I40E_AQ_LINK_UP)
return -EOPNOTSUPP;
-
if (hw->device_id == I40E_DEV_ID_KX_B ||
hw->device_id == I40E_DEV_ID_KX_C ||
hw->device_id == I40E_DEV_ID_20G_KR2 ||
@@ -781,7 +775,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
if (!(hw->phy.link_info.an_info & I40E_AQ_AN_COMPLETED)) {
/* If autoneg is not supported, return error */
if (!ethtool_link_ksettings_test_link_mode(
- &safe_ks, supported, Autoneg)) {
+ &safe_ks, supported, Autoneg)) {
netdev_info(netdev, "Autoneg not supported on this phy\n");
err = -EINVAL;
goto done;
@@ -842,7 +836,6 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
*/
if (!config.link_speed)
config.link_speed = abilities.link_speed;
-
if (change || (abilities.link_speed != config.link_speed)) {
/* copy over the rest of the abilities */
config.phy_type = abilities.phy_type;
@@ -870,7 +863,8 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
/* make the aq call */
status = i40e_aq_set_phy_config(hw, &config, NULL);
if (status) {
- netdev_info(netdev, "Set phy config failed, err %s aq_err %s\n",
+ netdev_info(netdev,
+ "Set phy config failed, err %s aq_err %s\n",
i40e_stat_str(hw, status),
i40e_aq_str(hw, hw->aq.asq_last_status));
err = -EAGAIN;
@@ -879,7 +873,8 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
status = i40e_update_link_info(hw);
if (status)
- netdev_dbg(netdev, "Updating link info failed with err %s aq_err %s\n",
+ netdev_dbg(netdev,
+ "Updating link info failed with err %s aq_err %s\n",
i40e_stat_str(hw, status),
i40e_aq_str(hw, hw->aq.asq_last_status));
@@ -2070,14 +2065,13 @@ static int __i40e_get_coalesce(struct net_device *netdev,
ec->tx_max_coalesced_frames_irq = vsi->work_limit;
ec->rx_max_coalesced_frames_irq = vsi->work_limit;
- /* rx and tx usecs has per queue value. If user doesn't specify the queue,
- * return queue 0's value to represent.
+ /* rx and tx usecs has per queue value. If user doesn't specify the
+ * queue, return queue 0's value to represent.
*/
- if (queue < 0) {
+ if (queue < 0)
queue = 0;
- } else if (queue >= vsi->num_queue_pairs) {
+ else if (queue >= vsi->num_queue_pairs)
return -EINVAL;
- }
rx_ring = vsi->rx_rings[queue];
tx_ring = vsi->tx_rings[queue];
@@ -2091,7 +2085,6 @@ static int __i40e_get_coalesce(struct net_device *netdev,
ec->rx_coalesce_usecs = rx_ring->rx_itr_setting & ~I40E_ITR_DYNAMIC;
ec->tx_coalesce_usecs = tx_ring->tx_itr_setting & ~I40E_ITR_DYNAMIC;
-
/* we use the _usecs_high to store/set the interrupt rate limit
* that the hardware supports, that almost but not quite
* fits the original intent of the ethtool variable,
@@ -2141,7 +2134,6 @@ static int i40e_get_per_queue_coalesce(struct net_device *netdev, u32 queue,
*
* Change the ITR settings for a specific queue.
**/
-
static void i40e_set_itr_per_queue(struct i40e_vsi *vsi,
struct ethtool_coalesce *ec,
int queue)
@@ -2263,8 +2255,8 @@ static int __i40e_set_coalesce(struct net_device *netdev,
vsi->int_rate_limit);
}
- /* rx and tx usecs has per queue value. If user doesn't specify the queue,
- * apply to all queues.
+ /* rx and tx usecs has per queue value. If user doesn't specify the
+ * queue, apply to all queues.
*/
if (queue < 0) {
for (i = 0; i < vsi->num_queue_pairs; i++)
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 08/13 net-next] i40e: group autoneg PHY types together
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (6 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 07/13 net-next] i40e: fix whitespace issues in i40e_ethtool.c Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 09/13 net-next] i40e: Add new phy types for 25G AOC and ACC support Alan Brady
` (4 subsequent siblings)
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
This separates the setting of autoneg in i40e_phy_types_to_ethtool into
its own conditional. Doing this adds clarity as what PHYs
support/advertise autoneg and makes it easier to add new PHY types in
the future.
This also fixes an issue on devices with CRT_RETIMER where advertising
autoneg was being set, but supported autoneg was not.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 85 +++++++++++++-------------
1 file changed, 41 insertions(+), 44 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 6296bb2e8bd3..08288b0a8cad 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -268,9 +268,7 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
*advertising = 0x0;
if (phy_types & I40E_CAP_PHY_TYPE_SGMII) {
- *supported |= SUPPORTED_Autoneg |
- SUPPORTED_1000baseT_Full;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_1000baseT_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
*advertising |= ADVERTISED_1000baseT_Full;
if (pf->hw_features & I40E_HW_100M_SGMII_CAPABLE) {
@@ -289,9 +287,7 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
- *supported |= SUPPORTED_Autoneg |
- SUPPORTED_10000baseT_Full;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_10000baseT_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
*advertising |= ADVERTISED_10000baseT_Full;
}
@@ -301,16 +297,12 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
*supported |= SUPPORTED_40000baseCR4_Full;
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU ||
phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4) {
- *supported |= SUPPORTED_Autoneg |
- SUPPORTED_40000baseCR4_Full;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_40000baseCR4_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_40GB)
*advertising |= ADVERTISED_40000baseCR4_Full;
}
if (phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
- *supported |= SUPPORTED_Autoneg |
- SUPPORTED_100baseT_Full;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_100baseT_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
*advertising |= ADVERTISED_100baseT_Full;
}
@@ -318,9 +310,7 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
- *supported |= SUPPORTED_Autoneg |
- SUPPORTED_1000baseT_Full;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_1000baseT_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
*advertising |= ADVERTISED_1000baseT_Full;
}
@@ -329,47 +319,54 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_LR4)
*supported |= SUPPORTED_40000baseLR4_Full;
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_KR4) {
- *supported |= SUPPORTED_40000baseKR4_Full |
- SUPPORTED_Autoneg;
- *advertising |= ADVERTISED_40000baseKR4_Full |
- ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_40000baseKR4_Full;
+ *advertising |= ADVERTISED_40000baseKR4_Full;
}
if (phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2) {
- *supported |= SUPPORTED_20000baseKR2_Full |
- SUPPORTED_Autoneg;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_20000baseKR2_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_20GB)
*advertising |= ADVERTISED_20000baseKR2_Full;
}
- if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR) {
- if (!(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER))
- *supported |= SUPPORTED_10000baseKR_Full |
- SUPPORTED_Autoneg;
- *advertising |= ADVERTISED_Autoneg;
- if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
- if (!(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER))
- *advertising |= ADVERTISED_10000baseKR_Full;
- }
if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4) {
- *supported |= SUPPORTED_10000baseKX4_Full |
- SUPPORTED_Autoneg;
- *advertising |= ADVERTISED_Autoneg;
+ *supported |= SUPPORTED_10000baseKX4_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
*advertising |= ADVERTISED_10000baseKX4_Full;
}
- if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX) {
- if (!(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER))
- *supported |= SUPPORTED_1000baseKX_Full |
- SUPPORTED_Autoneg;
- *advertising |= ADVERTISED_Autoneg;
+ if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR &&
+ !(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER)) {
+ *supported |= SUPPORTED_10000baseKR_Full;
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+ *advertising |= ADVERTISED_10000baseKR_Full;
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX &&
+ !(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER)) {
+ *supported |= SUPPORTED_1000baseKX_Full;
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
- if (!(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER))
- *advertising |= ADVERTISED_1000baseKX_Full;
+ *advertising |= ADVERTISED_1000baseKX_Full;
}
- if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_KR ||
- phy_types & I40E_CAP_PHY_TYPE_25GBASE_CR ||
+ /* Autoneg PHY types */
+ if (phy_types & I40E_CAP_PHY_TYPE_SGMII ||
+ phy_types & I40E_CAP_PHY_TYPE_40GBASE_KR4 ||
+ phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU ||
+ phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4 ||
phy_types & I40E_CAP_PHY_TYPE_25GBASE_SR ||
- phy_types & I40E_CAP_PHY_TYPE_25GBASE_LR) {
+ phy_types & I40E_CAP_PHY_TYPE_25GBASE_LR ||
+ phy_types & I40E_CAP_PHY_TYPE_25GBASE_KR ||
+ phy_types & I40E_CAP_PHY_TYPE_25GBASE_CR ||
+ phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2 ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4 ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX ||
+ phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
*supported |= SUPPORTED_Autoneg;
*advertising |= ADVERTISED_Autoneg;
}
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 09/13 net-next] i40e: Add new phy types for 25G AOC and ACC support.
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (7 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 08/13 net-next] i40e: group autoneg PHY types together Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 23:47 ` Shannon Nelson
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 10/13 net-next] i40e: convert i40e_phy_type_to_ethtool to new API Alan Brady
` (3 subsequent siblings)
12 siblings, 1 reply; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
From: Sudheer Mogilappagari <sudheer.mogilappagari@intel.com>
This patch adds support for 25G Active Optical Cables (AOC) and Active
Copper Cables (ACC) phy types.
Signed-off-by: Sudheer Mogilappagari <sudheer.mogilappagari@intel.com>
Signed-off-by: Krzysztof Malek <krzysztof.malek@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 5 +++++
drivers/net/ethernet/intel/i40e/i40e_common.c | 2 ++
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 ++
drivers/net/ethernet/intel/i40e/i40e_type.h | 4 ++++
drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 4 ++++
5 files changed, 17 insertions(+)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h
index a8f65aed5421..ad73f6d08352 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h
@@ -1771,10 +1771,13 @@ enum i40e_aq_phy_type {
I40E_PHY_TYPE_25GBASE_CR = 0x20,
I40E_PHY_TYPE_25GBASE_SR = 0x21,
I40E_PHY_TYPE_25GBASE_LR = 0x22,
+ I40E_PHY_TYPE_25GBASE_AOC = 0x23,
+ I40E_PHY_TYPE_25GBASE_ACC = 0x24,
I40E_PHY_TYPE_MAX,
I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
I40E_PHY_TYPE_EMPTY = 0xFE,
I40E_PHY_TYPE_DEFAULT = 0xFF,
+
};
#define I40E_LINK_SPEED_100MB_SHIFT 0x1
@@ -1831,6 +1834,8 @@ struct i40e_aq_get_phy_abilities_resp {
#define I40E_AQ_PHY_TYPE_EXT_25G_CR 0X02
#define I40E_AQ_PHY_TYPE_EXT_25G_SR 0x04
#define I40E_AQ_PHY_TYPE_EXT_25G_LR 0x08
+#define I40E_AQ_PHY_TYPE_EXT_25G_AOC 0x10
+#define I40E_AQ_PHY_TYPE_EXT_25G_ACC 0x20
u8 fec_cfg_curr_mod_ext_info;
#define I40E_AQ_ENABLE_FEC_KR 0x01
#define I40E_AQ_ENABLE_FEC_RS 0x02
diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
index 53aad378d49c..1b85eb3e6443 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_common.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
@@ -1180,6 +1180,8 @@ static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
case I40E_PHY_TYPE_40GBASE_AOC:
case I40E_PHY_TYPE_10GBASE_AOC:
case I40E_PHY_TYPE_25GBASE_CR:
+ case I40E_PHY_TYPE_25GBASE_AOC:
+ case I40E_PHY_TYPE_25GBASE_ACC:
media = I40E_MEDIA_TYPE_DA;
break;
case I40E_PHY_TYPE_1000BASE_KX:
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 08288b0a8cad..6ac5c7f232c6 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -502,6 +502,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
case I40E_PHY_TYPE_25GBASE_CR:
case I40E_PHY_TYPE_25GBASE_SR:
case I40E_PHY_TYPE_25GBASE_LR:
+ case I40E_PHY_TYPE_25GBASE_AOC:
+ case I40E_PHY_TYPE_25GBASE_ACC:
supported = SUPPORTED_Autoneg;
advertising = ADVERTISED_Autoneg;
/* TODO: add speeds when ethtool is ready to support*/
diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h b/drivers/net/ethernet/intel/i40e/i40e_type.h
index 0410fcbdbb94..17a99b53acd9 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_type.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
@@ -271,6 +271,10 @@ struct i40e_phy_info {
I40E_PHY_TYPE_OFFSET)
#define I40E_CAP_PHY_TYPE_25GBASE_LR BIT_ULL(I40E_PHY_TYPE_25GBASE_LR + \
I40E_PHY_TYPE_OFFSET)
+#define I40E_CAP_PHY_TYPE_25GBASE_AOC BIT_ULL(I40E_PHY_TYPE_25GBASE_AOC + \
+ I40E_PHY_TYPE_OFFSET)
+#define I40E_CAP_PHY_TYPE_25GBASE_ACC BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC + \
+ I40E_PHY_TYPE_OFFSET)
#define I40E_HW_CAP_MAX_GPIO 30
/* Capabilities of a PF or a VF or the whole device */
struct i40e_hw_capabilities {
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h
index 60c892f559b9..463e331a70a9 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h
@@ -1767,6 +1767,8 @@ enum i40e_aq_phy_type {
I40E_PHY_TYPE_25GBASE_CR = 0x20,
I40E_PHY_TYPE_25GBASE_SR = 0x21,
I40E_PHY_TYPE_25GBASE_LR = 0x22,
+ I40E_PHY_TYPE_25GBASE_AOC = 0x23,
+ I40E_PHY_TYPE_25GBASE_ACC = 0x24,
I40E_PHY_TYPE_MAX,
I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
I40E_PHY_TYPE_EMPTY = 0xFE,
@@ -1827,6 +1829,8 @@ struct i40e_aq_get_phy_abilities_resp {
#define I40E_AQ_PHY_TYPE_EXT_25G_CR 0X02
#define I40E_AQ_PHY_TYPE_EXT_25G_SR 0x04
#define I40E_AQ_PHY_TYPE_EXT_25G_LR 0x08
+#define I40E_AQ_PHY_TYPE_EXT_25G_AOC 0x10
+#define I40E_AQ_PHY_TYPE_EXT_25G_ACC 0x20
u8 fec_cfg_curr_mod_ext_info;
#define I40E_AQ_ENABLE_FEC_KR 0x01
#define I40E_AQ_ENABLE_FEC_RS 0x02
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 09/13 net-next] i40e: Add new phy types for 25G AOC and ACC support.
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 09/13 net-next] i40e: Add new phy types for 25G AOC and ACC support Alan Brady
@ 2017-10-04 23:47 ` Shannon Nelson
0 siblings, 0 replies; 17+ messages in thread
From: Shannon Nelson @ 2017-10-04 23:47 UTC (permalink / raw)
To: intel-wired-lan
On 10/4/2017 10:58 AM, Alan Brady wrote:
> From: Sudheer Mogilappagari <sudheer.mogilappagari@intel.com>
>
> This patch adds support for 25G Active Optical Cables (AOC) and Active
> Copper Cables (ACC) phy types.
>
> Signed-off-by: Sudheer Mogilappagari <sudheer.mogilappagari@intel.com>
> Signed-off-by: Krzysztof Malek <krzysztof.malek@intel.com>
> ---
> drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 5 +++++
> drivers/net/ethernet/intel/i40e/i40e_common.c | 2 ++
> drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 ++
> drivers/net/ethernet/intel/i40e/i40e_type.h | 4 ++++
> drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 4 ++++
> 5 files changed, 17 insertions(+)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h
> index a8f65aed5421..ad73f6d08352 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h
> @@ -1771,10 +1771,13 @@ enum i40e_aq_phy_type {
> I40E_PHY_TYPE_25GBASE_CR = 0x20,
> I40E_PHY_TYPE_25GBASE_SR = 0x21,
> I40E_PHY_TYPE_25GBASE_LR = 0x22,
> + I40E_PHY_TYPE_25GBASE_AOC = 0x23,
> + I40E_PHY_TYPE_25GBASE_ACC = 0x24,
> I40E_PHY_TYPE_MAX,
> I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
> I40E_PHY_TYPE_EMPTY = 0xFE,
> I40E_PHY_TYPE_DEFAULT = 0xFF,
> +
Unnecessary new whitespace
sln
> };
>
> #define I40E_LINK_SPEED_100MB_SHIFT 0x1
> @@ -1831,6 +1834,8 @@ struct i40e_aq_get_phy_abilities_resp {
> #define I40E_AQ_PHY_TYPE_EXT_25G_CR 0X02
> #define I40E_AQ_PHY_TYPE_EXT_25G_SR 0x04
> #define I40E_AQ_PHY_TYPE_EXT_25G_LR 0x08
> +#define I40E_AQ_PHY_TYPE_EXT_25G_AOC 0x10
> +#define I40E_AQ_PHY_TYPE_EXT_25G_ACC 0x20
> u8 fec_cfg_curr_mod_ext_info;
> #define I40E_AQ_ENABLE_FEC_KR 0x01
> #define I40E_AQ_ENABLE_FEC_RS 0x02
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
> index 53aad378d49c..1b85eb3e6443 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_common.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
> @@ -1180,6 +1180,8 @@ static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
> case I40E_PHY_TYPE_40GBASE_AOC:
> case I40E_PHY_TYPE_10GBASE_AOC:
> case I40E_PHY_TYPE_25GBASE_CR:
> + case I40E_PHY_TYPE_25GBASE_AOC:
> + case I40E_PHY_TYPE_25GBASE_ACC:
> media = I40E_MEDIA_TYPE_DA;
> break;
> case I40E_PHY_TYPE_1000BASE_KX:
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index 08288b0a8cad..6ac5c7f232c6 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -502,6 +502,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
> case I40E_PHY_TYPE_25GBASE_CR:
> case I40E_PHY_TYPE_25GBASE_SR:
> case I40E_PHY_TYPE_25GBASE_LR:
> + case I40E_PHY_TYPE_25GBASE_AOC:
> + case I40E_PHY_TYPE_25GBASE_ACC:
> supported = SUPPORTED_Autoneg;
> advertising = ADVERTISED_Autoneg;
> /* TODO: add speeds when ethtool is ready to support*/
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_type.h b/drivers/net/ethernet/intel/i40e/i40e_type.h
> index 0410fcbdbb94..17a99b53acd9 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_type.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_type.h
> @@ -271,6 +271,10 @@ struct i40e_phy_info {
> I40E_PHY_TYPE_OFFSET)
> #define I40E_CAP_PHY_TYPE_25GBASE_LR BIT_ULL(I40E_PHY_TYPE_25GBASE_LR + \
> I40E_PHY_TYPE_OFFSET)
> +#define I40E_CAP_PHY_TYPE_25GBASE_AOC BIT_ULL(I40E_PHY_TYPE_25GBASE_AOC + \
> + I40E_PHY_TYPE_OFFSET)
> +#define I40E_CAP_PHY_TYPE_25GBASE_ACC BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC + \
> + I40E_PHY_TYPE_OFFSET)
> #define I40E_HW_CAP_MAX_GPIO 30
> /* Capabilities of a PF or a VF or the whole device */
> struct i40e_hw_capabilities {
> diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h b/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h
> index 60c892f559b9..463e331a70a9 100644
> --- a/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h
> +++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h
> @@ -1767,6 +1767,8 @@ enum i40e_aq_phy_type {
> I40E_PHY_TYPE_25GBASE_CR = 0x20,
> I40E_PHY_TYPE_25GBASE_SR = 0x21,
> I40E_PHY_TYPE_25GBASE_LR = 0x22,
> + I40E_PHY_TYPE_25GBASE_AOC = 0x23,
> + I40E_PHY_TYPE_25GBASE_ACC = 0x24,
> I40E_PHY_TYPE_MAX,
> I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
> I40E_PHY_TYPE_EMPTY = 0xFE,
> @@ -1827,6 +1829,8 @@ struct i40e_aq_get_phy_abilities_resp {
> #define I40E_AQ_PHY_TYPE_EXT_25G_CR 0X02
> #define I40E_AQ_PHY_TYPE_EXT_25G_SR 0x04
> #define I40E_AQ_PHY_TYPE_EXT_25G_LR 0x08
> +#define I40E_AQ_PHY_TYPE_EXT_25G_AOC 0x10
> +#define I40E_AQ_PHY_TYPE_EXT_25G_ACC 0x20
> u8 fec_cfg_curr_mod_ext_info;
> #define I40E_AQ_ENABLE_FEC_KR 0x01
> #define I40E_AQ_ENABLE_FEC_RS 0x02
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 10/13 net-next] i40e: convert i40e_phy_type_to_ethtool to new API
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (8 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 09/13 net-next] i40e: Add new phy types for 25G AOC and ACC support Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 23:47 ` Shannon Nelson
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 11/13 net-next] i40e: convert i40e_get_settings_link_up " Alan Brady
` (2 subsequent siblings)
12 siblings, 1 reply; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
We are still largely using the old ethtool API macros. This is
problematic because eventually they will be removed and they only
support 32 bits of PHY types.
This overhauls i40e_phy_type_to_ethtool to use only the new API. Doing
this also allows us to provide much better support for newer 25G and 10G
PHY types which is included here as well.
The remaining usages of the old ethtool API will be addressed in other
patches in the series.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 227 ++++++++++++++++++-------
1 file changed, 163 insertions(+), 64 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 6ac5c7f232c6..76530a83eb70 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -241,6 +241,29 @@ static const struct i40e_priv_flags i40e_gl_gstrings_priv_flags[] = {
#define I40E_GL_PRIV_FLAGS_STR_LEN ARRAY_SIZE(i40e_gl_gstrings_priv_flags)
+#define I40E_ETHTOOL_LINK_MASK_SIZE \
+ BITS_TO_LONGS(__ETHTOOL_LINK_MODE_MASK_NBITS)
+
+/**
+ * i40e_intersect_link_mode_masks
+ * @dst: resulting intersection and first mask
+ * @src: mask to AND with
+ *
+ * Given two link mode masks, AND them together and save the result in dst.
+ */
+static void i40e_intersect_link_masks(struct ethtool_link_ksettings *dst,
+ struct ethtool_link_ksettings *src)
+{
+ int idx = 0;
+
+ for (; idx < I40E_ETHTOOL_LINK_MASK_SIZE; idx++) {
+ dst->link_modes.supported[idx] &=
+ src->link_modes.supported[idx];
+ dst->link_modes.advertising[idx] &=
+ src->link_modes.advertising[idx];
+ }
+}
+
/**
* i40e_partition_setting_complaint - generic complaint for MFP restriction
* @pf: the PF struct
@@ -254,95 +277,180 @@ static void i40e_partition_setting_complaint(struct i40e_pf *pf)
/**
* i40e_phy_type_to_ethtool - convert the phy_types to ethtool link modes
* @pf: PF struct with phy_types
- * @supported: pointer to the ethtool supported variable to fill in
- * @advertising: pointer to the ethtool advertising variable to fill in
+ * @ks: ethtool link ksettings struct to fill out
*
**/
-static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
- u32 *advertising)
+static void i40e_phy_type_to_ethtool(struct i40e_pf *pf,
+ struct ethtool_link_ksettings *ks)
{
struct i40e_link_status *hw_link_info = &pf->hw.phy.link_info;
u64 phy_types = pf->hw.phy.phy_types;
- *supported = 0x0;
- *advertising = 0x0;
+ ethtool_link_ksettings_zero_link_mode(ks, supported);
+ ethtool_link_ksettings_zero_link_mode(ks, advertising);
if (phy_types & I40E_CAP_PHY_TYPE_SGMII) {
- *supported |= SUPPORTED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
- *advertising |= ADVERTISED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseT_Full);
if (pf->hw_features & I40E_HW_100M_SGMII_CAPABLE) {
- *supported |= SUPPORTED_100baseT_Full;
- *advertising |= ADVERTISED_100baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 100baseT_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 100baseT_Full);
}
}
if (phy_types & I40E_CAP_PHY_TYPE_XAUI ||
phy_types & I40E_CAP_PHY_TYPE_XFI ||
phy_types & I40E_CAP_PHY_TYPE_SFI ||
phy_types & I40E_CAP_PHY_TYPE_10GBASE_SFPP_CU ||
- phy_types & I40E_CAP_PHY_TYPE_10GBASE_AOC)
- *supported |= SUPPORTED_10000baseT_Full;
- if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU ||
- phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
- phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
- phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
- phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
- *supported |= SUPPORTED_10000baseT_Full;
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_AOC) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseT_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseT_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_T) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
- *advertising |= ADVERTISED_10000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseT_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_XLAUI ||
phy_types & I40E_CAP_PHY_TYPE_XLPPI ||
phy_types & I40E_CAP_PHY_TYPE_40GBASE_AOC)
- *supported |= SUPPORTED_40000baseCR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseCR4_Full);
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU ||
phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4) {
- *supported |= SUPPORTED_40000baseCR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseCR4_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_40GB)
- *advertising |= ADVERTISED_40000baseCR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 40000baseCR4_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
- *supported |= SUPPORTED_100baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 100baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
- *advertising |= ADVERTISED_100baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 100baseT_Full);
}
- if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
- phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
- phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
- phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
- *supported |= SUPPORTED_1000baseT_Full;
+ if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
- *advertising |= ADVERTISED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseT_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_SR4)
- *supported |= SUPPORTED_40000baseSR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseSR4_Full);
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_LR4)
- *supported |= SUPPORTED_40000baseLR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseLR4_Full);
if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_KR4) {
- *supported |= SUPPORTED_40000baseKR4_Full;
- *advertising |= ADVERTISED_40000baseKR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseLR4_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 40000baseLR4_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2) {
- *supported |= SUPPORTED_20000baseKR2_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 20000baseKR2_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_20GB)
- *advertising |= ADVERTISED_20000baseKR2_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 20000baseKR2_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4) {
- *supported |= SUPPORTED_10000baseKX4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseKX4_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
- *advertising |= ADVERTISED_10000baseKX4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseKX4_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR &&
!(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER)) {
- *supported |= SUPPORTED_10000baseKR_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseKR_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
- *advertising |= ADVERTISED_10000baseKR_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseKR_Full);
}
if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX &&
!(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER)) {
- *supported |= SUPPORTED_1000baseKX_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseKX_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseKX_Full);
+ }
+ /* need to add 25G PHY types */
+ if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_KR) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseKR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseKR_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_CR) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseCR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseCR_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_SR ||
+ phy_types & I40E_CAP_PHY_TYPE_25GBASE_LR) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseSR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseSR_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_AOC ||
+ phy_types & I40E_CAP_PHY_TYPE_25GBASE_ACC) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseCR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseCR_Full);
+ }
+ /* need to add new 10G PHY types */
+ if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
+ phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseCR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseCR_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseSR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseSR_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseLR_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseLR_Full);
+ }
+ if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
+ phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseX_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
- *advertising |= ADVERTISED_1000baseKX_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseX_Full);
}
/* Autoneg PHY types */
if (phy_types & I40E_CAP_PHY_TYPE_SGMII ||
@@ -367,8 +475,10 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX ||
phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
- *supported |= SUPPORTED_Autoneg;
- *advertising |= ADVERTISED_Autoneg;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ Autoneg);
}
}
@@ -385,9 +495,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
struct i40e_pf *pf)
{
struct i40e_link_status *hw_link_info = &hw->phy.link_info;
+ struct ethtool_link_ksettings cap_ksettings;
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(&supported,
@@ -519,11 +628,13 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
* current PHY type, get what is supported by the NVM and intersect
* them to get what is truly supported
*/
- i40e_phy_type_to_ethtool(pf, &e_supported,
- &e_advertising);
-
- supported = supported & e_supported;
- advertising = advertising & e_advertising;
+ ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
+ supported);
+ ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
+ advertising);
+ memset(&cap_ksettings, 0, sizeof(struct ethtool_link_ksettings));
+ i40e_phy_type_to_ethtool(pf, &cap_ksettings);
+ i40e_intersect_link_masks(ks, &cap_ksettings);
/* Set speed and duplex */
switch (link_speed) {
@@ -549,11 +660,6 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
break;
}
ks->base.duplex = DUPLEX_FULL;
-
- ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
- supported);
- ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
- advertising);
}
/**
@@ -568,17 +674,10 @@ static void i40e_get_settings_link_down(struct i40e_hw *hw,
struct ethtool_link_ksettings *ks,
struct i40e_pf *pf)
{
- u32 supported, advertising;
-
/* link is down and the driver needs to fall back on
* supported phy types to figure out what info to display
*/
- i40e_phy_type_to_ethtool(pf, &supported, &advertising);
-
- ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
- supported);
- ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
- advertising);
+ i40e_phy_type_to_ethtool(pf, ks);
/* With no link speed and duplex are unknown */
ks->base.speed = SPEED_UNKNOWN;
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 10/13 net-next] i40e: convert i40e_phy_type_to_ethtool to new API
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 10/13 net-next] i40e: convert i40e_phy_type_to_ethtool to new API Alan Brady
@ 2017-10-04 23:47 ` Shannon Nelson
0 siblings, 0 replies; 17+ messages in thread
From: Shannon Nelson @ 2017-10-04 23:47 UTC (permalink / raw)
To: intel-wired-lan
On 10/4/2017 10:58 AM, Alan Brady wrote:
> We are still largely using the old ethtool API macros. This is
> problematic because eventually they will be removed and they only
> support 32 bits of PHY types.
>
> This overhauls i40e_phy_type_to_ethtool to use only the new API. Doing
> this also allows us to provide much better support for newer 25G and 10G
> PHY types which is included here as well.
>
> The remaining usages of the old ethtool API will be addressed in other
> patches in the series.
>
> Signed-off-by: Alan Brady <alan.brady@intel.com>
> ---
> drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 227 ++++++++++++++++++-------
> 1 file changed, 163 insertions(+), 64 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index 6ac5c7f232c6..76530a83eb70 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -241,6 +241,29 @@ static const struct i40e_priv_flags i40e_gl_gstrings_priv_flags[] = {
>
> #define I40E_GL_PRIV_FLAGS_STR_LEN ARRAY_SIZE(i40e_gl_gstrings_priv_flags)
>
> +#define I40E_ETHTOOL_LINK_MASK_SIZE \
> + BITS_TO_LONGS(__ETHTOOL_LINK_MODE_MASK_NBITS)
> +
> +/**
> + * i40e_intersect_link_mode_masks
> + * @dst: resulting intersection and first mask
> + * @src: mask to AND with
> + *
> + * Given two link mode masks, AND them together and save the result in dst.
> + */
> +static void i40e_intersect_link_masks(struct ethtool_link_ksettings *dst,
> + struct ethtool_link_ksettings *src)
> +{
> + int idx = 0;
> +
> + for (; idx < I40E_ETHTOOL_LINK_MASK_SIZE; idx++) {
> + dst->link_modes.supported[idx] &=
> + src->link_modes.supported[idx];
> + dst->link_modes.advertising[idx] &=
> + src->link_modes.advertising[idx];
> + }
> +}
> +
This might be a handy function for more than just i40e - maybe add a
size parameter and push this up to net/core/ethtool.c?
sln
> /**
> * i40e_partition_setting_complaint - generic complaint for MFP restriction
> * @pf: the PF struct
> @@ -254,95 +277,180 @@ static void i40e_partition_setting_complaint(struct i40e_pf *pf)
> /**
> * i40e_phy_type_to_ethtool - convert the phy_types to ethtool link modes
> * @pf: PF struct with phy_types
> - * @supported: pointer to the ethtool supported variable to fill in
> - * @advertising: pointer to the ethtool advertising variable to fill in
> + * @ks: ethtool link ksettings struct to fill out
> *
> **/
> -static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
> - u32 *advertising)
> +static void i40e_phy_type_to_ethtool(struct i40e_pf *pf,
> + struct ethtool_link_ksettings *ks)
> {
> struct i40e_link_status *hw_link_info = &pf->hw.phy.link_info;
> u64 phy_types = pf->hw.phy.phy_types;
>
> - *supported = 0x0;
> - *advertising = 0x0;
> + ethtool_link_ksettings_zero_link_mode(ks, supported);
> + ethtool_link_ksettings_zero_link_mode(ks, advertising);
>
> if (phy_types & I40E_CAP_PHY_TYPE_SGMII) {
> - *supported |= SUPPORTED_1000baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 1000baseT_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
> - *advertising |= ADVERTISED_1000baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 1000baseT_Full);
> if (pf->hw_features & I40E_HW_100M_SGMII_CAPABLE) {
> - *supported |= SUPPORTED_100baseT_Full;
> - *advertising |= ADVERTISED_100baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 100baseT_Full);
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 100baseT_Full);
> }
> }
> if (phy_types & I40E_CAP_PHY_TYPE_XAUI ||
> phy_types & I40E_CAP_PHY_TYPE_XFI ||
> phy_types & I40E_CAP_PHY_TYPE_SFI ||
> phy_types & I40E_CAP_PHY_TYPE_10GBASE_SFPP_CU ||
> - phy_types & I40E_CAP_PHY_TYPE_10GBASE_AOC)
> - *supported |= SUPPORTED_10000baseT_Full;
> - if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU ||
> - phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
> - phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
> - phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
> - phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
> - *supported |= SUPPORTED_10000baseT_Full;
> + phy_types & I40E_CAP_PHY_TYPE_10GBASE_AOC) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseT_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseT_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_T) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseT_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> - *advertising |= ADVERTISED_10000baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseT_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_XLAUI ||
> phy_types & I40E_CAP_PHY_TYPE_XLPPI ||
> phy_types & I40E_CAP_PHY_TYPE_40GBASE_AOC)
> - *supported |= SUPPORTED_40000baseCR4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 40000baseCR4_Full);
> if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4_CU ||
> phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4) {
> - *supported |= SUPPORTED_40000baseCR4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 40000baseCR4_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_40GB)
> - *advertising |= ADVERTISED_40000baseCR4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 40000baseCR4_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
> - *supported |= SUPPORTED_100baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 100baseT_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
> - *advertising |= ADVERTISED_100baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 100baseT_Full);
> }
> - if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
> - phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
> - phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
> - phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
> - *supported |= SUPPORTED_1000baseT_Full;
> + if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 1000baseT_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
> - *advertising |= ADVERTISED_1000baseT_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 1000baseT_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_SR4)
> - *supported |= SUPPORTED_40000baseSR4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 40000baseSR4_Full);
> if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_LR4)
> - *supported |= SUPPORTED_40000baseLR4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 40000baseLR4_Full);
> if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_KR4) {
> - *supported |= SUPPORTED_40000baseKR4_Full;
> - *advertising |= ADVERTISED_40000baseKR4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 40000baseLR4_Full);
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 40000baseLR4_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2) {
> - *supported |= SUPPORTED_20000baseKR2_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 20000baseKR2_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_20GB)
> - *advertising |= ADVERTISED_20000baseKR2_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 20000baseKR2_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4) {
> - *supported |= SUPPORTED_10000baseKX4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseKX4_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> - *advertising |= ADVERTISED_10000baseKX4_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseKX4_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR &&
> !(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER)) {
> - *supported |= SUPPORTED_10000baseKR_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseKR_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> - *advertising |= ADVERTISED_10000baseKR_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseKR_Full);
> }
> if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX &&
> !(pf->hw_features & I40E_HW_HAVE_CRT_RETIMER)) {
> - *supported |= SUPPORTED_1000baseKX_Full;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 1000baseKX_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 1000baseKX_Full);
> + }
> + /* need to add 25G PHY types */
> + if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_KR) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 25000baseKR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 25000baseKR_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_CR) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 25000baseCR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 25000baseCR_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_SR ||
> + phy_types & I40E_CAP_PHY_TYPE_25GBASE_LR) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 25000baseSR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 25000baseSR_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_25GBASE_AOC ||
> + phy_types & I40E_CAP_PHY_TYPE_25GBASE_ACC) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 25000baseCR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_25GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 25000baseCR_Full);
> + }
> + /* need to add new 10G PHY types */
> + if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
> + phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseCR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseCR_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseSR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseSR_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 10000baseLR_Full);
> + if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 10000baseLR_Full);
> + }
> + if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
> + phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
> + phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + 1000baseX_Full);
> if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
> - *advertising |= ADVERTISED_1000baseKX_Full;
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + 1000baseX_Full);
> }
> /* Autoneg PHY types */
> if (phy_types & I40E_CAP_PHY_TYPE_SGMII ||
> @@ -367,8 +475,10 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
> phy_types & I40E_CAP_PHY_TYPE_1000BASE_LX ||
> phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX ||
> phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
> - *supported |= SUPPORTED_Autoneg;
> - *advertising |= ADVERTISED_Autoneg;
> + ethtool_link_ksettings_add_link_mode(ks, supported,
> + Autoneg);
> + ethtool_link_ksettings_add_link_mode(ks, advertising,
> + Autoneg);
> }
> }
>
> @@ -385,9 +495,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
> struct i40e_pf *pf)
> {
> struct i40e_link_status *hw_link_info = &hw->phy.link_info;
> + struct ethtool_link_ksettings cap_ksettings;
> 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(&supported,
> @@ -519,11 +628,13 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
> * current PHY type, get what is supported by the NVM and intersect
> * them to get what is truly supported
> */
> - i40e_phy_type_to_ethtool(pf, &e_supported,
> - &e_advertising);
> -
> - supported = supported & e_supported;
> - advertising = advertising & e_advertising;
> + ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
> + supported);
> + ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
> + advertising);
> + memset(&cap_ksettings, 0, sizeof(struct ethtool_link_ksettings));
> + i40e_phy_type_to_ethtool(pf, &cap_ksettings);
> + i40e_intersect_link_masks(ks, &cap_ksettings);
>
> /* Set speed and duplex */
> switch (link_speed) {
> @@ -549,11 +660,6 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
> break;
> }
> ks->base.duplex = DUPLEX_FULL;
> -
> - ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
> - supported);
> - ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
> - advertising);
> }
>
> /**
> @@ -568,17 +674,10 @@ static void i40e_get_settings_link_down(struct i40e_hw *hw,
> struct ethtool_link_ksettings *ks,
> struct i40e_pf *pf)
> {
> - u32 supported, advertising;
> -
> /* link is down and the driver needs to fall back on
> * supported phy types to figure out what info to display
> */
> - i40e_phy_type_to_ethtool(pf, &supported, &advertising);
> -
> - ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
> - supported);
> - ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
> - advertising);
> + i40e_phy_type_to_ethtool(pf, ks);
>
> /* With no link speed and duplex are unknown */
> ks->base.speed = SPEED_UNKNOWN;
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [Intel-wired-lan] [PATCH 11/13 net-next] i40e: convert i40e_get_settings_link_up to new API
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (9 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 10/13 net-next] i40e: convert i40e_phy_type_to_ethtool to new API Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 12/13 net-next] i40e: rename 'change' variable to 'autoneg_changed' Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 13/13 net-next] i40e: convert i40e_set_link_ksettings to new API Alan Brady
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
This removes references to old ethtool API macros and functions in
i40e_get_settings_link_up as part of the process of converting to the
new API. The new API also allows us to provide more explicit support
for new 25G and 10G PHY types so some of the PHY types have been
adjusted where necessary as well.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 187 +++++++++++++++++--------
1 file changed, 125 insertions(+), 62 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 76530a83eb70..df05bd510b77 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -497,125 +497,192 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
struct i40e_link_status *hw_link_info = &hw->phy.link_info;
struct ethtool_link_ksettings cap_ksettings;
u32 link_speed = hw_link_info->link_speed;
- u32 supported, advertising;
-
- ethtool_convert_link_mode_to_legacy_u32(&supported,
- ks->link_modes.supported);
- ethtool_convert_link_mode_to_legacy_u32(&advertising,
- ks->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:
- supported = SUPPORTED_Autoneg |
- SUPPORTED_40000baseCR4_Full;
- advertising = ADVERTISED_Autoneg |
- ADVERTISED_40000baseCR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseCR4_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 40000baseCR4_Full);
break;
case I40E_PHY_TYPE_XLAUI:
case I40E_PHY_TYPE_XLPPI:
case I40E_PHY_TYPE_40GBASE_AOC:
- supported = SUPPORTED_40000baseCR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseCR4_Full);
break;
case I40E_PHY_TYPE_40GBASE_SR4:
- supported = SUPPORTED_40000baseSR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseSR4_Full);
break;
case I40E_PHY_TYPE_40GBASE_LR4:
- supported = SUPPORTED_40000baseLR4_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseLR4_Full);
break;
+ case I40E_PHY_TYPE_25GBASE_SR:
+ case I40E_PHY_TYPE_25GBASE_LR:
case I40E_PHY_TYPE_10GBASE_SR:
case I40E_PHY_TYPE_10GBASE_LR:
case I40E_PHY_TYPE_1000BASE_SX:
case I40E_PHY_TYPE_1000BASE_LX:
- supported = SUPPORTED_10000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseSR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseSR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseSR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseSR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseLR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseLR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseX_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseX_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseT_Full);
if (hw_link_info->module_type[2] &
I40E_MODULE_TYPE_1000BASE_SX ||
hw_link_info->module_type[2] &
I40E_MODULE_TYPE_1000BASE_LX) {
- supported |= SUPPORTED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseT_Full);
if (hw_link_info->requested_speeds &
I40E_LINK_SPEED_1GB)
- advertising |= ADVERTISED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(
+ ks, advertising, 1000baseT_Full);
}
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
- advertising |= ADVERTISED_10000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseT_Full);
break;
case I40E_PHY_TYPE_10GBASE_T:
case I40E_PHY_TYPE_1000BASE_T:
case I40E_PHY_TYPE_100BASE_TX:
- supported = SUPPORTED_Autoneg |
- SUPPORTED_10000baseT_Full |
- SUPPORTED_1000baseT_Full |
- SUPPORTED_100baseT_Full;
- advertising = ADVERTISED_Autoneg;
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseT_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseT_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 100baseT_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
- advertising |= ADVERTISED_10000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
- advertising |= ADVERTISED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
- advertising |= ADVERTISED_100baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 100baseT_Full);
break;
case I40E_PHY_TYPE_1000BASE_T_OPTICAL:
- supported = SUPPORTED_Autoneg |
- SUPPORTED_1000baseT_Full;
- advertising = ADVERTISED_Autoneg |
- ADVERTISED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseT_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseT_Full);
break;
case I40E_PHY_TYPE_10GBASE_CR1_CU:
case I40E_PHY_TYPE_10GBASE_CR1:
- supported = SUPPORTED_Autoneg |
- SUPPORTED_10000baseT_Full;
- advertising = ADVERTISED_Autoneg |
- ADVERTISED_10000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseT_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseT_Full);
break;
case I40E_PHY_TYPE_XAUI:
case I40E_PHY_TYPE_XFI:
case I40E_PHY_TYPE_SFI:
case I40E_PHY_TYPE_10GBASE_SFPP_CU:
case I40E_PHY_TYPE_10GBASE_AOC:
- supported = SUPPORTED_10000baseT_Full;
- advertising = SUPPORTED_10000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseT_Full);
+ if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseT_Full);
break;
case I40E_PHY_TYPE_SGMII:
- supported = SUPPORTED_Autoneg |
- SUPPORTED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseT_Full);
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
- advertising |= ADVERTISED_1000baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseT_Full);
if (pf->hw_features & I40E_HW_100M_SGMII_CAPABLE) {
- supported |= SUPPORTED_100baseT_Full;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 100baseT_Full);
if (hw_link_info->requested_speeds &
I40E_LINK_SPEED_100MB)
- advertising |= ADVERTISED_100baseT_Full;
+ ethtool_link_ksettings_add_link_mode(
+ ks, advertising, 100baseT_Full);
}
break;
case I40E_PHY_TYPE_40GBASE_KR4:
+ case I40E_PHY_TYPE_25GBASE_KR:
case I40E_PHY_TYPE_20GBASE_KR2:
case I40E_PHY_TYPE_10GBASE_KR:
case I40E_PHY_TYPE_10GBASE_KX4:
case I40E_PHY_TYPE_1000BASE_KX:
- supported |= SUPPORTED_40000baseKR4_Full |
- SUPPORTED_20000baseKR2_Full |
- SUPPORTED_10000baseKR_Full |
- SUPPORTED_10000baseKX4_Full |
- SUPPORTED_1000baseKX_Full |
- SUPPORTED_Autoneg;
- advertising |= ADVERTISED_40000baseKR4_Full |
- ADVERTISED_20000baseKR2_Full |
- ADVERTISED_10000baseKR_Full |
- ADVERTISED_10000baseKX4_Full |
- ADVERTISED_1000baseKX_Full |
- ADVERTISED_Autoneg;
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 40000baseKR4_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseKR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 20000baseKR2_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseKR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseKX4_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 1000baseKX_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 40000baseKR4_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseKR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 20000baseKR2_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseKR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseKX4_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 1000baseKX_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
break;
- case I40E_PHY_TYPE_25GBASE_KR:
case I40E_PHY_TYPE_25GBASE_CR:
- case I40E_PHY_TYPE_25GBASE_SR:
- case I40E_PHY_TYPE_25GBASE_LR:
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseCR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseCR_Full);
+ break;
case I40E_PHY_TYPE_25GBASE_AOC:
case I40E_PHY_TYPE_25GBASE_ACC:
- supported = SUPPORTED_Autoneg;
- advertising = ADVERTISED_Autoneg;
- /* TODO: add speeds when ethtool is ready to support*/
+ ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, advertising, Autoneg);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 25000baseCR_Full);
+
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 25000baseCR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, supported,
+ 10000baseCR_Full);
+ ethtool_link_ksettings_add_link_mode(ks, advertising,
+ 10000baseCR_Full);
break;
default:
/* if we got here and link is up something bad is afoot */
@@ -628,10 +695,6 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
* current PHY type, get what is supported by the NVM and intersect
* them to get what is truly supported
*/
- ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.supported,
- supported);
- ethtool_convert_legacy_u32_to_link_mode(ks->link_modes.advertising,
- advertising);
memset(&cap_ksettings, 0, sizeof(struct ethtool_link_ksettings));
i40e_phy_type_to_ethtool(pf, &cap_ksettings);
i40e_intersect_link_masks(ks, &cap_ksettings);
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 12/13 net-next] i40e: rename 'change' variable to 'autoneg_changed'
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (10 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 11/13 net-next] i40e: convert i40e_get_settings_link_up " Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 13/13 net-next] i40e: convert i40e_set_link_ksettings to new API Alan Brady
12 siblings, 0 replies; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
This variable isn't actually very descriptive and makes the code a bit
confusing as to what it is being used for. This patch enhances the
variable with the longer name, 'autoneg_changed', which makes it clear
we are concerned with autoneg changing in this context.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index df05bd510b77..f25cdd4cb860 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -845,14 +845,14 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
{
struct i40e_netdev_priv *np = netdev_priv(netdev);
struct i40e_aq_get_phy_abilities_resp abilities;
+ struct ethtool_link_ksettings safe_ks;
+ struct ethtool_link_ksettings copy_ks;
struct i40e_aq_set_phy_config config;
struct i40e_pf *pf = np->vsi->back;
struct i40e_vsi *vsi = np->vsi;
struct i40e_hw *hw = &pf->hw;
- struct ethtool_link_ksettings safe_ks;
- struct ethtool_link_ksettings copy_ks;
+ bool autoneg_changed = false;
i40e_status status = 0;
- bool change = false;
int timeout = 50;
int err = 0;
u32 autoneg;
@@ -944,7 +944,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
/* Autoneg is allowed to change */
config.abilities = abilities.abilities |
I40E_AQ_PHY_ENABLE_AN;
- change = true;
+ autoneg_changed = true;
}
} else {
/* If autoneg is currently enabled */
@@ -963,7 +963,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
/* Autoneg is allowed to change */
config.abilities = abilities.abilities &
~I40E_AQ_PHY_ENABLE_AN;
- change = true;
+ autoneg_changed = true;
}
}
@@ -997,7 +997,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
*/
if (!config.link_speed)
config.link_speed = abilities.link_speed;
- if (change || (abilities.link_speed != config.link_speed)) {
+ if (autoneg_changed || abilities.link_speed != config.link_speed) {
/* copy over the rest of the abilities */
config.phy_type = abilities.phy_type;
config.phy_type_ext = abilities.phy_type_ext;
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 13/13 net-next] i40e: convert i40e_set_link_ksettings to new API
2017-10-04 17:58 [Intel-wired-lan] [PATCH 00/13 net-next] i40e: refactor ethtool interface Alan Brady
` (11 preceding siblings ...)
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 12/13 net-next] i40e: rename 'change' variable to 'autoneg_changed' Alan Brady
@ 2017-10-04 17:58 ` Alan Brady
2017-10-04 23:47 ` Shannon Nelson
12 siblings, 1 reply; 17+ messages in thread
From: Alan Brady @ 2017-10-04 17:58 UTC (permalink / raw)
To: intel-wired-lan
This finishes off the conversion to the new ethtool API by removing the
old macros being used in i40e_set_link_ksettings and replacing them with
shiny new ones.
This conversion also allows us to provide link speed support for new 25G
and 10G macros which is included here as well.
Signed-off-by: Alan Brady <alan.brady@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 94 ++++++++++++++++----------
1 file changed, 58 insertions(+), 36 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index f25cdd4cb860..489aecd3f5dc 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -855,9 +855,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
i40e_status status = 0;
int timeout = 50;
int err = 0;
- u32 autoneg;
- u32 advertise;
- u32 tmp;
+ u8 autoneg;
/* Changing port settings is not supported if this isn't the
* port's controlling PF
@@ -885,28 +883,35 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
/* copy the ksettings to copy_ks to avoid modifying the origin */
memcpy(©_ks, ks, sizeof(struct ethtool_link_ksettings));
+ /* save autoneg out of ksettings */
+ autoneg = copy_ks.base.autoneg;
+
+ memset(&safe_ks, 0, sizeof(safe_ks));
+ /* Get link modes supported by hardware... */
+ i40e_phy_type_to_ethtool(pf, &safe_ks);
+ /* ...and check against modes requested by user.
+ * Return an error if unsupported mode was set.
+ */
+ if (!bitmap_subset(copy_ks.link_modes.advertising,
+ safe_ks.link_modes.supported,
+ __ETHTOOL_LINK_MODE_MASK_NBITS))
+ return -EINVAL;
+
/* get our own copy of the bits to check against */
memset(&safe_ks, 0, sizeof(struct ethtool_link_ksettings));
+ safe_ks.base.cmd = copy_ks.base.cmd;
+ safe_ks.base.link_mode_masks_nwords =
+ copy_ks.base.link_mode_masks_nwords;
i40e_get_link_ksettings(netdev, &safe_ks);
- /* save autoneg and speed out of ksettings */
- autoneg = ks->base.autoneg;
- ethtool_convert_link_mode_to_legacy_u32(&advertise,
- ks->link_modes.advertising);
-
- /* set autoneg and speed back to what they currently are */
+ /* set autoneg back to what it currently is */
copy_ks.base.autoneg = safe_ks.base.autoneg;
- ethtool_convert_link_mode_to_legacy_u32(
- &tmp, safe_ks.link_modes.advertising);
- ethtool_convert_legacy_u32_to_link_mode(
- copy_ks.link_modes.advertising, tmp);
- copy_ks.base.cmd = safe_ks.base.cmd;
-
- /* If copy_ks and safe_ks are not the same now, then they are
- * trying to set something that we do not support
+ /* If copy_ks.base and safe_ks.base are not the same now, then they are
+ * trying to set something that we do not support.
*/
- if (memcmp(©_ks, &safe_ks, sizeof(struct ethtool_link_ksettings)))
+ if (memcmp(©_ks.base, &safe_ks.base,
+ sizeof(struct ethtool_link_settings)))
return -EOPNOTSUPP;
while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) {
@@ -967,28 +972,45 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
}
}
- ethtool_convert_link_mode_to_legacy_u32(&tmp,
- safe_ks.link_modes.supported);
- if (advertise & ~tmp) {
- err = -EINVAL;
- goto done;
- }
-
- if (advertise & ADVERTISED_100baseT_Full)
+ if (ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 100baseT_Full))
config.link_speed |= I40E_LINK_SPEED_100MB;
- if (advertise & ADVERTISED_1000baseT_Full ||
- advertise & ADVERTISED_1000baseKX_Full)
+ if (ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 1000baseT_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 1000baseX_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 1000baseKX_Full))
config.link_speed |= I40E_LINK_SPEED_1GB;
- if (advertise & ADVERTISED_10000baseT_Full ||
- advertise & ADVERTISED_10000baseKX4_Full ||
- advertise & ADVERTISED_10000baseKR_Full)
+ if (ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 10000baseT_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 10000baseKX4_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 10000baseKR_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 10000baseCR_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 10000baseSR_Full))
config.link_speed |= I40E_LINK_SPEED_10GB;
- if (advertise & ADVERTISED_20000baseKR2_Full)
+ if (ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 20000baseKR2_Full))
config.link_speed |= I40E_LINK_SPEED_20GB;
- if (advertise & ADVERTISED_40000baseKR4_Full ||
- advertise & ADVERTISED_40000baseCR4_Full ||
- advertise & ADVERTISED_40000baseSR4_Full ||
- advertise & ADVERTISED_40000baseLR4_Full)
+ if (ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 25000baseCR_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 25000baseKR_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 25000baseSR_Full))
+ config.link_speed |= I40E_LINK_SPEED_25GB;
+ if (ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 40000baseKR4_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 40000baseCR4_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 40000baseSR4_Full) ||
+ ethtool_link_ksettings_test_link_mode(ks, advertising,
+ 40000baseLR4_Full))
config.link_speed |= I40E_LINK_SPEED_40GB;
/* If speed didn't get set, set it to what it currently is.
--
2.14.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [Intel-wired-lan] [PATCH 13/13 net-next] i40e: convert i40e_set_link_ksettings to new API
2017-10-04 17:58 ` [Intel-wired-lan] [PATCH 13/13 net-next] i40e: convert i40e_set_link_ksettings to new API Alan Brady
@ 2017-10-04 23:47 ` Shannon Nelson
0 siblings, 0 replies; 17+ messages in thread
From: Shannon Nelson @ 2017-10-04 23:47 UTC (permalink / raw)
To: intel-wired-lan
On 10/4/2017 10:58 AM, Alan Brady wrote:
> This finishes off the conversion to the new ethtool API by removing the
> old macros being used in i40e_set_link_ksettings and replacing them with
> shiny new ones.
>
> This conversion also allows us to provide link speed support for new 25G
> and 10G macros which is included here as well.
>
> Signed-off-by: Alan Brady <alan.brady@intel.com>
> ---
> drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 94 ++++++++++++++++----------
> 1 file changed, 58 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index f25cdd4cb860..489aecd3f5dc 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -855,9 +855,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
> i40e_status status = 0;
> int timeout = 50;
> int err = 0;
> - u32 autoneg;
> - u32 advertise;
> - u32 tmp;
> + u8 autoneg;
>
> /* Changing port settings is not supported if this isn't the
> * port's controlling PF
> @@ -885,28 +883,35 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
> /* copy the ksettings to copy_ks to avoid modifying the origin */
> memcpy(©_ks, ks, sizeof(struct ethtool_link_ksettings));
>
> + /* save autoneg out of ksettings */
> + autoneg = copy_ks.base.autoneg;
> +
> + memset(&safe_ks, 0, sizeof(safe_ks));
> + /* Get link modes supported by hardware... */
> + i40e_phy_type_to_ethtool(pf, &safe_ks);
> + /* ...and check against modes requested by user.
> + * Return an error if unsupported mode was set.
> + */
Please don't split this comment, it makes things harder to read.
sln
> + if (!bitmap_subset(copy_ks.link_modes.advertising,
> + safe_ks.link_modes.supported,
> + __ETHTOOL_LINK_MODE_MASK_NBITS))
> + return -EINVAL;
> +
> /* get our own copy of the bits to check against */
> memset(&safe_ks, 0, sizeof(struct ethtool_link_ksettings));
> + safe_ks.base.cmd = copy_ks.base.cmd;
> + safe_ks.base.link_mode_masks_nwords =
> + copy_ks.base.link_mode_masks_nwords;
> i40e_get_link_ksettings(netdev, &safe_ks);
>
> - /* save autoneg and speed out of ksettings */
> - autoneg = ks->base.autoneg;
> - ethtool_convert_link_mode_to_legacy_u32(&advertise,
> - ks->link_modes.advertising);
> -
> - /* set autoneg and speed back to what they currently are */
> + /* set autoneg back to what it currently is */
> copy_ks.base.autoneg = safe_ks.base.autoneg;
> - ethtool_convert_link_mode_to_legacy_u32(
> - &tmp, safe_ks.link_modes.advertising);
> - ethtool_convert_legacy_u32_to_link_mode(
> - copy_ks.link_modes.advertising, tmp);
>
> - copy_ks.base.cmd = safe_ks.base.cmd;
> -
> - /* If copy_ks and safe_ks are not the same now, then they are
> - * trying to set something that we do not support
> + /* If copy_ks.base and safe_ks.base are not the same now, then they are
> + * trying to set something that we do not support.
> */
> - if (memcmp(©_ks, &safe_ks, sizeof(struct ethtool_link_ksettings)))
> + if (memcmp(©_ks.base, &safe_ks.base,
> + sizeof(struct ethtool_link_settings)))
> return -EOPNOTSUPP;
>
> while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) {
> @@ -967,28 +972,45 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
> }
> }
>
> - ethtool_convert_link_mode_to_legacy_u32(&tmp,
> - safe_ks.link_modes.supported);
> - if (advertise & ~tmp) {
> - err = -EINVAL;
> - goto done;
> - }
> -
> - if (advertise & ADVERTISED_100baseT_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 100baseT_Full))
> config.link_speed |= I40E_LINK_SPEED_100MB;
> - if (advertise & ADVERTISED_1000baseT_Full ||
> - advertise & ADVERTISED_1000baseKX_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 1000baseT_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 1000baseX_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 1000baseKX_Full))
> config.link_speed |= I40E_LINK_SPEED_1GB;
> - if (advertise & ADVERTISED_10000baseT_Full ||
> - advertise & ADVERTISED_10000baseKX4_Full ||
> - advertise & ADVERTISED_10000baseKR_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseT_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseKX4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseKR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseCR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 10000baseSR_Full))
> config.link_speed |= I40E_LINK_SPEED_10GB;
> - if (advertise & ADVERTISED_20000baseKR2_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 20000baseKR2_Full))
> config.link_speed |= I40E_LINK_SPEED_20GB;
> - if (advertise & ADVERTISED_40000baseKR4_Full ||
> - advertise & ADVERTISED_40000baseCR4_Full ||
> - advertise & ADVERTISED_40000baseSR4_Full ||
> - advertise & ADVERTISED_40000baseLR4_Full)
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 25000baseCR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 25000baseKR_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 25000baseSR_Full))
> + config.link_speed |= I40E_LINK_SPEED_25GB;
> + if (ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseKR4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseCR4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseSR4_Full) ||
> + ethtool_link_ksettings_test_link_mode(ks, advertising,
> + 40000baseLR4_Full))
> config.link_speed |= I40E_LINK_SPEED_40GB;
>
> /* If speed didn't get set, set it to what it currently is.
>
^ permalink raw reply [flat|nested] 17+ messages in thread