* [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21
@ 2022-06-21 22:59 Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 1/3] i40e: Add support for ethtool -s <interface> speed <speed in Mb> Tony Nguyen
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Tony Nguyen @ 2022-06-21 22:59 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet; +Cc: Tony Nguyen, netdev, sassmann
This series contains updates to i40e driver only.
Mateusz adds support for using the speed option in ethtool.
Minghao Chi removes unneeded synchronize_irq() calls.
Bernard Zhao removes unneeded NULL check.
The following are changes since commit 8720bd951b8e8515ffd995c7631790fdabaa9265:
Merge branch 'net-dsa-microchip-common-spi-probe-for-the-ksz-series-switches-part-1'
and are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue 40GbE
Bernard Zhao (1):
intel/i40e: delete if NULL check before dev_kfree_skb
Mateusz Palczewski (1):
i40e: Add support for ethtool -s <interface> speed <speed in Mb>
Minghao Chi (1):
i40e: Remove unnecessary synchronize_irq() before free_irq()
.../net/ethernet/intel/i40e/i40e_ethtool.c | 90 +++++++++++++++++++
drivers/net/ethernet/intel/i40e/i40e_main.c | 2 -
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 6 +-
3 files changed, 92 insertions(+), 6 deletions(-)
--
2.35.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next 1/3] i40e: Add support for ethtool -s <interface> speed <speed in Mb>
2022-06-21 22:59 [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 Tony Nguyen
@ 2022-06-21 22:59 ` Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 2/3] i40e: Remove unnecessary synchronize_irq() before free_irq() Tony Nguyen
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Tony Nguyen @ 2022-06-21 22:59 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet
Cc: Mateusz Palczewski, netdev, anthony.l.nguyen, sassmann,
Norbert Zulinski, Dave Switzer
From: Mateusz Palczewski <mateusz.palczewski@intel.com>
Add ability to change speed through ethtool -s <interface> speed <speed in Mb>
Driver advertises all link modes that support requested speed.
Autoneg must be set off e.g.:
ethtool -s <interface> autoneg off speed <speed in Mb>.
Add helper function that translate speed in Mb to
enum i40e_aq_link_speed and compare it to supported speeds from
given ethtool_link_ksettings. Add in i40e_set_link_ksettings hold
for requested speed and set copy_ks.base.speed to safe_ks.base.speed
to be sure that user is not changing unsupported setting.
In i40e_speed_to_link_speed compare requested speed with supported
speeds. Set speed to requested speed.
Signed-off-by: Norbert Zulinski <norbertx.zulinski@intel.com>
Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
Tested-by: Dave Switzer <david.switzer@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
.../net/ethernet/intel/i40e/i40e_ethtool.c | 90 +++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 552aad6ae1ca..55841816272b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -1143,6 +1143,71 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
return 0;
}
+#define I40E_LBIT_SIZE 8
+/**
+ * i40e_speed_to_link_speed - Translate decimal speed to i40e_aq_link_speed
+ * @speed: speed in decimal
+ * @ks: ethtool ksettings
+ *
+ * Return i40e_aq_link_speed based on speed
+ **/
+static enum i40e_aq_link_speed
+i40e_speed_to_link_speed(__u32 speed, const struct ethtool_link_ksettings *ks)
+{
+ enum i40e_aq_link_speed link_speed = I40E_LINK_SPEED_UNKNOWN;
+ bool speed_changed = false;
+ int i, j;
+
+ static const struct {
+ __u32 speed;
+ enum i40e_aq_link_speed link_speed;
+ __u8 bit[I40E_LBIT_SIZE];
+ } i40e_speed_lut[] = {
+#define I40E_LBIT(mode) ETHTOOL_LINK_MODE_ ## mode ##_Full_BIT
+ {SPEED_100, I40E_LINK_SPEED_100MB, {I40E_LBIT(100baseT)} },
+ {SPEED_1000, I40E_LINK_SPEED_1GB,
+ {I40E_LBIT(1000baseT), I40E_LBIT(1000baseX),
+ I40E_LBIT(1000baseKX)} },
+ {SPEED_10000, I40E_LINK_SPEED_10GB,
+ {I40E_LBIT(10000baseT), I40E_LBIT(10000baseKR),
+ I40E_LBIT(10000baseLR), I40E_LBIT(10000baseCR),
+ I40E_LBIT(10000baseSR), I40E_LBIT(10000baseKX4)} },
+
+ {SPEED_25000, I40E_LINK_SPEED_25GB,
+ {I40E_LBIT(25000baseCR), I40E_LBIT(25000baseKR),
+ I40E_LBIT(25000baseSR)} },
+ {SPEED_40000, I40E_LINK_SPEED_40GB,
+ {I40E_LBIT(40000baseKR4), I40E_LBIT(40000baseCR4),
+ I40E_LBIT(40000baseSR4), I40E_LBIT(40000baseLR4)} },
+ {SPEED_20000, I40E_LINK_SPEED_20GB,
+ {I40E_LBIT(20000baseKR2)} },
+ {SPEED_2500, I40E_LINK_SPEED_2_5GB, {I40E_LBIT(2500baseT)} },
+ {SPEED_5000, I40E_LINK_SPEED_5GB, {I40E_LBIT(2500baseT)} }
+#undef I40E_LBIT
+};
+
+ for (i = 0; i < ARRAY_SIZE(i40e_speed_lut); i++) {
+ if (i40e_speed_lut[i].speed == speed) {
+ for (j = 0; j < I40E_LBIT_SIZE; j++) {
+ if (test_bit(i40e_speed_lut[i].bit[j],
+ ks->link_modes.supported)) {
+ speed_changed = true;
+ break;
+ }
+ if (!i40e_speed_lut[i].bit[j])
+ break;
+ }
+ if (speed_changed) {
+ link_speed = i40e_speed_lut[i].link_speed;
+ break;
+ }
+ }
+ }
+ return link_speed;
+}
+
+#undef I40E_LBIT_SIZE
+
/**
* i40e_set_link_ksettings - Set Speed and Duplex
* @netdev: network interface device structure
@@ -1159,12 +1224,14 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
struct ethtool_link_ksettings copy_ks;
struct i40e_aq_set_phy_config config;
struct i40e_pf *pf = np->vsi->back;
+ enum i40e_aq_link_speed link_speed;
struct i40e_vsi *vsi = np->vsi;
struct i40e_hw *hw = &pf->hw;
bool autoneg_changed = false;
i40e_status status = 0;
int timeout = 50;
int err = 0;
+ __u32 speed;
u8 autoneg;
/* Changing port settings is not supported if this isn't the
@@ -1197,6 +1264,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
/* save autoneg out of ksettings */
autoneg = copy_ks.base.autoneg;
+ speed = copy_ks.base.speed;
/* get our own copy of the bits to check against */
memset(&safe_ks, 0, sizeof(struct ethtool_link_ksettings));
@@ -1215,6 +1283,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
/* set autoneg back to what it currently is */
copy_ks.base.autoneg = safe_ks.base.autoneg;
+ copy_ks.base.speed = safe_ks.base.speed;
/* 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.
@@ -1331,6 +1400,27 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
40000baseLR4_Full))
config.link_speed |= I40E_LINK_SPEED_40GB;
+ /* Autonegotiation must be disabled to change speed */
+ if ((speed != SPEED_UNKNOWN && safe_ks.base.speed != speed) &&
+ (autoneg == AUTONEG_DISABLE ||
+ (safe_ks.base.autoneg == AUTONEG_DISABLE && !autoneg_changed))) {
+ link_speed = i40e_speed_to_link_speed(speed, ks);
+ if (link_speed == I40E_LINK_SPEED_UNKNOWN) {
+ netdev_info(netdev, "Given speed is not supported\n");
+ err = -EOPNOTSUPP;
+ goto done;
+ } else {
+ config.link_speed = link_speed;
+ }
+ } else {
+ if (safe_ks.base.speed != speed) {
+ netdev_info(netdev,
+ "Unable to set speed, disable autoneg\n");
+ err = -EOPNOTSUPP;
+ goto done;
+ }
+ }
+
/* If speed didn't get set, set it to what it currently is.
* This is needed because if advertise is 0 (as it is when autoneg
* is disabled) then speed won't get set.
--
2.35.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net-next 2/3] i40e: Remove unnecessary synchronize_irq() before free_irq()
2022-06-21 22:59 [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 1/3] i40e: Add support for ethtool -s <interface> speed <speed in Mb> Tony Nguyen
@ 2022-06-21 22:59 ` Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 3/3] intel/i40e: delete if NULL check before dev_kfree_skb Tony Nguyen
2022-06-23 3:10 ` [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 patchwork-bot+netdevbpf
3 siblings, 0 replies; 5+ messages in thread
From: Tony Nguyen @ 2022-06-21 22:59 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet
Cc: Minghao Chi, netdev, anthony.l.nguyen, sassmann, Zeal Robot, Gurucharan
From: Minghao Chi <chi.minghao@zte.com.cn>
Calling synchronize_irq() right before free_irq() is quite useless. On one
hand the IRQ can easily fire again before free_irq() is entered, on the
other hand free_irq() itself calls synchronize_irq() internally (in a race
condition free way), before any state associated with the IRQ is freed.
Reported-by: Zeal Robot <zealci@zte.com.cn>
Signed-off-by: Minghao Chi <chi.minghao@zte.com.cn>
Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_main.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 83e0cf475ebd..797f61b2cd96 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -4162,7 +4162,6 @@ static void i40e_free_misc_vector(struct i40e_pf *pf)
i40e_flush(&pf->hw);
if (pf->flags & I40E_FLAG_MSIX_ENABLED && pf->msix_entries) {
- synchronize_irq(pf->msix_entries[0].vector);
free_irq(pf->msix_entries[0].vector, pf);
clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state);
}
@@ -4901,7 +4900,6 @@ static void i40e_vsi_free_irq(struct i40e_vsi *vsi)
irq_set_affinity_notifier(irq_num, NULL);
/* remove our suggested affinity mask for this IRQ */
irq_update_affinity_hint(irq_num, NULL);
- synchronize_irq(irq_num);
free_irq(irq_num, vsi->q_vectors[i]);
/* Tear down the interrupt queue link list
--
2.35.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net-next 3/3] intel/i40e: delete if NULL check before dev_kfree_skb
2022-06-21 22:59 [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 1/3] i40e: Add support for ethtool -s <interface> speed <speed in Mb> Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 2/3] i40e: Remove unnecessary synchronize_irq() before free_irq() Tony Nguyen
@ 2022-06-21 22:59 ` Tony Nguyen
2022-06-23 3:10 ` [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 patchwork-bot+netdevbpf
3 siblings, 0 replies; 5+ messages in thread
From: Tony Nguyen @ 2022-06-21 22:59 UTC (permalink / raw)
To: davem, kuba, pabeni, edumazet
Cc: Bernard Zhao, netdev, anthony.l.nguyen, sassmann, Gurucharan
From: Bernard Zhao <zhaojunkui2008@126.com>
dev_kfree_skb check if the input parameter NULL and do the right
thing, there is no need to check again.
This change is to cleanup the code a bit.
Signed-off-by: Bernard Zhao <zhaojunkui2008@126.com>
Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index b7967105a549..dadef56e5f9b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -1483,10 +1483,8 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
if (!rx_ring->rx_bi)
return;
- if (rx_ring->skb) {
- dev_kfree_skb(rx_ring->skb);
- rx_ring->skb = NULL;
- }
+ dev_kfree_skb(rx_ring->skb);
+ rx_ring->skb = NULL;
if (rx_ring->xsk_pool) {
i40e_xsk_clean_rx_ring(rx_ring);
--
2.35.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21
2022-06-21 22:59 [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 Tony Nguyen
` (2 preceding siblings ...)
2022-06-21 22:59 ` [PATCH net-next 3/3] intel/i40e: delete if NULL check before dev_kfree_skb Tony Nguyen
@ 2022-06-23 3:10 ` patchwork-bot+netdevbpf
3 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2022-06-23 3:10 UTC (permalink / raw)
To: Tony Nguyen; +Cc: davem, kuba, pabeni, edumazet, netdev, sassmann
Hello:
This series was applied to netdev/net-next.git (master)
by Tony Nguyen <anthony.l.nguyen@intel.com>:
On Tue, 21 Jun 2022 15:59:27 -0700 you wrote:
> This series contains updates to i40e driver only.
>
> Mateusz adds support for using the speed option in ethtool.
>
> Minghao Chi removes unneeded synchronize_irq() calls.
>
> Bernard Zhao removes unneeded NULL check.
>
> [...]
Here is the summary with links:
- [net-next,1/3] i40e: Add support for ethtool -s <interface> speed <speed in Mb>
https://git.kernel.org/netdev/net-next/c/7f72d923149c
- [net-next,2/3] i40e: Remove unnecessary synchronize_irq() before free_irq()
https://git.kernel.org/netdev/net-next/c/3e0fcb782a9f
- [net-next,3/3] intel/i40e: delete if NULL check before dev_kfree_skb
https://git.kernel.org/netdev/net-next/c/56878d49cc26
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-06-23 4:41 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-21 22:59 [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 1/3] i40e: Add support for ethtool -s <interface> speed <speed in Mb> Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 2/3] i40e: Remove unnecessary synchronize_irq() before free_irq() Tony Nguyen
2022-06-21 22:59 ` [PATCH net-next 3/3] intel/i40e: delete if NULL check before dev_kfree_skb Tony Nguyen
2022-06-23 3:10 ` [PATCH net-next 0/3][pull request] 40GbE Intel Wired LAN Driver Updates 2022-06-21 patchwork-bot+netdevbpf
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.