* [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30
@ 2013-01-30 10:34 Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 01/11] net/mlx4_core: Directly expose fields of HW flow steering rule control segment Amir Vadai
` (10 more replies)
0 siblings, 11 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev
Hi Dave,
This series contains updates to mlx4 driver.
Majority of the patches are small bug fixes. Another patch is to expose through
debugfs some HW resources to be used by external tools.
Patches done against net-next commit d2ed273: "net: disallow drivers with buggy
VLAN accel to register_netdevice()"
Thanks,
Amir
Amir Vadai (1):
net/mlx4_en: Fix transmit timeout when driver restarts port
Hadar Hen Zion (8):
net/mlx4_core: Directly expose fields of HW flow steering rule
control segment
net/mlx4_core: Set correctly allow_loopback flag
net/mlx4_en: Fix ip/udp steering rules multicast mac when attached
via ethtool
net/mlx4_en: Validate VLAN IDs provided in ethtool flow steering
rules
net/mlx4_en: Fix vlan mask for ethtool steering rules
net/mlx4_en: Block insertion of ethtool steering rules while the
interface is down
net/mlx4_en: Fix ethtool rules leftovers after module unloaded
net/mlx4_core: Use firmware driven flow steering hash mode
Matan Barak (1):
net/mlx4_en: Don't reassign port mac address on firmware that
supports it
Shani Michaelli (1):
net/mlx4_en: Add debugfs support
drivers/net/ethernet/mellanox/mlx4/Makefile | 3 +
drivers/net/ethernet/mellanox/mlx4/cq.c | 3 +
drivers/net/ethernet/mellanox/mlx4/en_debugfs.c | 133 ++++++++++++++++++
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 147 ++++++++++++++------
drivers/net/ethernet/mellanox/mlx4/en_main.c | 7 +
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 38 +++++-
drivers/net/ethernet/mellanox/mlx4/en_rx.c | 7 +-
drivers/net/ethernet/mellanox/mlx4/fw.c | 11 +-
drivers/net/ethernet/mellanox/mlx4/fw.h | 1 -
drivers/net/ethernet/mellanox/mlx4/main.c | 16 --
drivers/net/ethernet/mellanox/mlx4/mcg.c | 4 +-
drivers/net/ethernet/mellanox/mlx4/mlx4.h | 12 +-
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 14 ++-
.../net/ethernet/mellanox/mlx4/resource_tracker.c | 2 +-
include/linux/mlx4/device.h | 5 +-
15 files changed, 319 insertions(+), 84 deletions(-)
create mode 100644 drivers/net/ethernet/mellanox/mlx4/en_debugfs.c
--
1.7.8.2
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH net-next 01/11] net/mlx4_core: Directly expose fields of HW flow steering rule control segment
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 02/11] net/mlx4_core: Set correctly allow_loopback flag Amir Vadai
` (9 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
Some of the fields for struct mlx4_net_trans_rule_hw_ctrl were packed into u32
and accessed through bit field operations. Expose and access them directly as
u8.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/mcg.c | 2 +-
drivers/net/ethernet/mellanox/mlx4/mlx4.h | 7 +++++--
.../net/ethernet/mellanox/mlx4/resource_tracker.c | 2 +-
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index 1ee4db3..d7c0704 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -664,7 +664,7 @@ static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl,
dw |= ctrl->priority << 16;
hw->ctrl = cpu_to_be32(dw);
- hw->vf_vep_port = cpu_to_be32(ctrl->port);
+ hw->port = ctrl->port;
hw->qpn = cpu_to_be32(ctrl->qpn);
}
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 116c5c2..3263848 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -696,9 +696,12 @@ struct mlx4_steer {
struct mlx4_net_trans_rule_hw_ctrl {
__be32 ctrl;
- __be32 vf_vep_port;
+ u8 rsvd1;
+ u8 funcid;
+ u8 vep;
+ u8 port;
__be32 qpn;
- __be32 reserved;
+ __be32 rsvd2;
};
struct mlx4_net_trans_rule_hw_ib {
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
index 561ed2a..5997adc 100644
--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
+++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
@@ -3018,7 +3018,7 @@ static int add_eth_header(struct mlx4_dev *dev, int slave,
__be64 mac_msk = cpu_to_be64(MLX4_MAC_MASK << 16);
ctrl = (struct mlx4_net_trans_rule_hw_ctrl *)inbox->buf;
- port = be32_to_cpu(ctrl->vf_vep_port) & 0xff;
+ port = ctrl->port;
eth_header = (struct mlx4_net_trans_rule_hw_eth *)(ctrl + 1);
/* Clear a space in the inbox for eth header */
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 02/11] net/mlx4_core: Set correctly allow_loopback flag
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 01/11] net/mlx4_core: Directly expose fields of HW flow steering rule control segment Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 03/11] net/mlx4_en: Fix ip/udp steering rules multicast mac when attached via ethtool Amir Vadai
` (8 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
The allow_loopback flag was wrongly set using arithmetic bit operation, change
the code to use logical bit operation.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/mcg.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index d7c0704..5268552 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -1157,7 +1157,7 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
.priority = MLX4_DOMAIN_NIC,
};
- rule.allow_loopback = ~block_mcast_loopback;
+ rule.allow_loopback = !block_mcast_loopback;
rule.port = port;
rule.qpn = qp->qpn;
INIT_LIST_HEAD(&rule.list);
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 03/11] net/mlx4_en: Fix ip/udp steering rules multicast mac when attached via ethtool
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 01/11] net/mlx4_core: Directly expose fields of HW flow steering rule control segment Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 02/11] net/mlx4_core: Set correctly allow_loopback flag Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 04/11] net/mlx4_en: Validate VLAN IDs provided in ethtool flow steering rules Amir Vadai
` (7 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
Destination mac is a mandatory specification for ip/udp steering rules.
When attaching multicast steering rules via ethtool the unicast mac of the
interface was added to the rule specification instead of the multicast mac.
The following commit sets the corresponding multicast mac for the rule multicast ip.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 119 ++++++++++++++++-------
1 files changed, 82 insertions(+), 37 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 03447da..86afb5b 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -35,6 +35,8 @@
#include <linux/ethtool.h>
#include <linux/netdevice.h>
#include <linux/mlx4/driver.h>
+#include <linux/in.h>
+#include <net/ip.h>
#include "mlx4_en.h"
#include "en_port.h"
@@ -672,19 +674,71 @@ static int mlx4_en_validate_flow(struct net_device *dev,
return 0;
}
+static int mlx4_en_ethtool_add_mac_rule(struct ethtool_rxnfc *cmd,
+ struct list_head *rule_list_h,
+ struct mlx4_spec_list *spec_l2,
+ unsigned char *mac)
+{
+ int err = 0;
+ __be64 mac_msk = cpu_to_be64(MLX4_MAC_MASK << 16);
+
+ spec_l2->id = MLX4_NET_TRANS_RULE_ID_ETH;
+ memcpy(spec_l2->eth.dst_mac_msk, &mac_msk, ETH_ALEN);
+ memcpy(spec_l2->eth.dst_mac, mac, ETH_ALEN);
+
+ if ((cmd->fs.flow_type & FLOW_EXT) && cmd->fs.m_ext.vlan_tci) {
+ spec_l2->eth.vlan_id = cmd->fs.h_ext.vlan_tci;
+ spec_l2->eth.vlan_id_msk = cpu_to_be16(0xfff);
+ }
+
+ list_add_tail(&spec_l2->list, rule_list_h);
+
+ return err;
+}
+
+static int mlx4_en_ethtool_add_mac_rule_by_ipv4(struct mlx4_en_priv *priv,
+ struct ethtool_rxnfc *cmd,
+ struct list_head *rule_list_h,
+ struct mlx4_spec_list *spec_l2,
+ __be32 ipv4_dst)
+{
+ __be64 be_mac = 0;
+ unsigned char mac[ETH_ALEN];
+
+ if (!ipv4_is_multicast(ipv4_dst)) {
+ if (cmd->fs.flow_type & FLOW_MAC_EXT) {
+ memcpy(&mac, cmd->fs.h_ext.h_dest, ETH_ALEN);
+ } else {
+ be_mac = cpu_to_be64((priv->mac & MLX4_MAC_MASK) << 16);
+ memcpy(&mac, &be_mac, ETH_ALEN);
+ }
+ } else {
+ ip_eth_mc_map(ipv4_dst, mac);
+ }
+
+ return mlx4_en_ethtool_add_mac_rule(cmd, rule_list_h, spec_l2, &mac[0]);
+}
+
static int add_ip_rule(struct mlx4_en_priv *priv,
- struct ethtool_rxnfc *cmd,
- struct list_head *list_h)
+ struct ethtool_rxnfc *cmd,
+ struct list_head *list_h)
{
- struct mlx4_spec_list *spec_l3;
+ struct mlx4_spec_list *spec_l2 = NULL;
+ struct mlx4_spec_list *spec_l3 = NULL;
struct ethtool_usrip4_spec *l3_mask = &cmd->fs.m_u.usr_ip4_spec;
- spec_l3 = kzalloc(sizeof *spec_l3, GFP_KERNEL);
- if (!spec_l3) {
+ spec_l3 = kzalloc(sizeof(*spec_l3), GFP_KERNEL);
+ spec_l2 = kzalloc(sizeof(*spec_l2), GFP_KERNEL);
+ if (!spec_l2 || !spec_l3) {
en_err(priv, "Fail to alloc ethtool rule.\n");
+ kfree(spec_l2);
+ kfree(spec_l3);
return -ENOMEM;
}
+ mlx4_en_ethtool_add_mac_rule_by_ipv4(priv, cmd, list_h, spec_l2,
+ cmd->fs.h_u.
+ usr_ip4_spec.ip4dst);
spec_l3->id = MLX4_NET_TRANS_RULE_ID_IPV4;
spec_l3->ipv4.src_ip = cmd->fs.h_u.usr_ip4_spec.ip4src;
if (l3_mask->ip4src)
@@ -701,14 +755,17 @@ static int add_tcp_udp_rule(struct mlx4_en_priv *priv,
struct ethtool_rxnfc *cmd,
struct list_head *list_h, int proto)
{
- struct mlx4_spec_list *spec_l3;
- struct mlx4_spec_list *spec_l4;
+ struct mlx4_spec_list *spec_l2 = NULL;
+ struct mlx4_spec_list *spec_l3 = NULL;
+ struct mlx4_spec_list *spec_l4 = NULL;
struct ethtool_tcpip4_spec *l4_mask = &cmd->fs.m_u.tcp_ip4_spec;
- spec_l3 = kzalloc(sizeof *spec_l3, GFP_KERNEL);
- spec_l4 = kzalloc(sizeof *spec_l4, GFP_KERNEL);
- if (!spec_l4 || !spec_l3) {
+ spec_l2 = kzalloc(sizeof(*spec_l2), GFP_KERNEL);
+ spec_l3 = kzalloc(sizeof(*spec_l3), GFP_KERNEL);
+ spec_l4 = kzalloc(sizeof(*spec_l4), GFP_KERNEL);
+ if (!spec_l2 || !spec_l3 || !spec_l4) {
en_err(priv, "Fail to alloc ethtool rule.\n");
+ kfree(spec_l2);
kfree(spec_l3);
kfree(spec_l4);
return -ENOMEM;
@@ -717,12 +774,20 @@ static int add_tcp_udp_rule(struct mlx4_en_priv *priv,
spec_l3->id = MLX4_NET_TRANS_RULE_ID_IPV4;
if (proto == TCP_V4_FLOW) {
+ mlx4_en_ethtool_add_mac_rule_by_ipv4(priv, cmd, list_h,
+ spec_l2,
+ cmd->fs.h_u.
+ tcp_ip4_spec.ip4dst);
spec_l4->id = MLX4_NET_TRANS_RULE_ID_TCP;
spec_l3->ipv4.src_ip = cmd->fs.h_u.tcp_ip4_spec.ip4src;
spec_l3->ipv4.dst_ip = cmd->fs.h_u.tcp_ip4_spec.ip4dst;
spec_l4->tcp_udp.src_port = cmd->fs.h_u.tcp_ip4_spec.psrc;
spec_l4->tcp_udp.dst_port = cmd->fs.h_u.tcp_ip4_spec.pdst;
} else {
+ mlx4_en_ethtool_add_mac_rule_by_ipv4(priv, cmd, list_h,
+ spec_l2,
+ cmd->fs.h_u.
+ udp_ip4_spec.ip4dst);
spec_l4->id = MLX4_NET_TRANS_RULE_ID_UDP;
spec_l3->ipv4.src_ip = cmd->fs.h_u.udp_ip4_spec.ip4src;
spec_l3->ipv4.dst_ip = cmd->fs.h_u.udp_ip4_spec.ip4dst;
@@ -751,43 +816,23 @@ static int mlx4_en_ethtool_to_net_trans_rule(struct net_device *dev,
struct list_head *rule_list_h)
{
int err;
- __be64 be_mac;
struct ethhdr *eth_spec;
- struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_spec_list *spec_l2;
- __be64 mac_msk = cpu_to_be64(MLX4_MAC_MASK << 16);
+ struct mlx4_en_priv *priv = netdev_priv(dev);
err = mlx4_en_validate_flow(dev, cmd);
if (err)
return err;
- spec_l2 = kzalloc(sizeof *spec_l2, GFP_KERNEL);
- if (!spec_l2)
- return -ENOMEM;
-
- if (cmd->fs.flow_type & FLOW_MAC_EXT) {
- memcpy(&be_mac, cmd->fs.h_ext.h_dest, ETH_ALEN);
- } else {
- u64 mac = priv->mac & MLX4_MAC_MASK;
- be_mac = cpu_to_be64(mac << 16);
- }
-
- spec_l2->id = MLX4_NET_TRANS_RULE_ID_ETH;
- memcpy(spec_l2->eth.dst_mac_msk, &mac_msk, ETH_ALEN);
- if ((cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) != ETHER_FLOW)
- memcpy(spec_l2->eth.dst_mac, &be_mac, ETH_ALEN);
-
- if ((cmd->fs.flow_type & FLOW_EXT) && cmd->fs.m_ext.vlan_tci) {
- spec_l2->eth.vlan_id = cmd->fs.h_ext.vlan_tci;
- spec_l2->eth.vlan_id_msk = cpu_to_be16(0xfff);
- }
-
- list_add_tail(&spec_l2->list, rule_list_h);
-
switch (cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
case ETHER_FLOW:
+ spec_l2 = kzalloc(sizeof(*spec_l2), GFP_KERNEL);
+ if (!spec_l2)
+ return -ENOMEM;
+
eth_spec = &cmd->fs.h_u.ether_spec;
- memcpy(&spec_l2->eth.dst_mac, eth_spec->h_dest, ETH_ALEN);
+ mlx4_en_ethtool_add_mac_rule(cmd, rule_list_h, spec_l2,
+ ð_spec->h_dest[0]);
spec_l2->eth.ether_type = eth_spec->h_proto;
if (eth_spec->h_proto)
spec_l2->eth.ether_type_enable = 1;
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 04/11] net/mlx4_en: Validate VLAN IDs provided in ethtool flow steering rules
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (2 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 03/11] net/mlx4_en: Fix ip/udp steering rules multicast mac when attached via ethtool Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 05/11] net/mlx4_en: Fix vlan mask for ethtool " Amir Vadai
` (6 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
When attaching flow steering rules via Ethtool accept only valid vlans IDs e.g
in the range: [0,4095].
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 86afb5b..f33049f 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -669,6 +669,10 @@ static int mlx4_en_validate_flow(struct net_device *dev,
!(cmd->fs.m_ext.vlan_tci == 0 ||
cmd->fs.m_ext.vlan_tci == cpu_to_be16(0xfff)))
return -EINVAL;
+ if (cmd->fs.m_ext.vlan_tci) {
+ if (be16_to_cpu(cmd->fs.h_ext.vlan_tci) >= VLAN_N_VID)
+ return -EINVAL;
+ }
}
return 0;
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 05/11] net/mlx4_en: Fix vlan mask for ethtool steering rules
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (3 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 04/11] net/mlx4_en: Validate VLAN IDs provided in ethtool flow steering rules Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 17:20 ` Ben Hutchings
2013-01-30 10:34 ` [PATCH net-next 06/11] net/mlx4_en: Block insertion of ethtool steering rules while the interface is down Amir Vadai
` (5 subsequent siblings)
10 siblings, 1 reply; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
The vlan mask field should be validated and assigned according to the field
size which is 12 bits. Also replace the numeric 0xfff mask with existing kernel
macro.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 13 +++++++++----
1 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index f33049f..f36c219 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -666,12 +666,16 @@ static int mlx4_en_validate_flow(struct net_device *dev,
if ((cmd->fs.flow_type & FLOW_EXT)) {
if (cmd->fs.m_ext.vlan_etype ||
- !(cmd->fs.m_ext.vlan_tci == 0 ||
- cmd->fs.m_ext.vlan_tci == cpu_to_be16(0xfff)))
+ !((cmd->fs.m_ext.vlan_tci & cpu_to_be16(VLAN_VID_MASK)) ==
+ 0 ||
+ (cmd->fs.m_ext.vlan_tci & cpu_to_be16(VLAN_VID_MASK)) ==
+ cpu_to_be16(VLAN_VID_MASK)))
return -EINVAL;
+
if (cmd->fs.m_ext.vlan_tci) {
if (be16_to_cpu(cmd->fs.h_ext.vlan_tci) >= VLAN_N_VID)
return -EINVAL;
+
}
}
@@ -690,9 +694,10 @@ static int mlx4_en_ethtool_add_mac_rule(struct ethtool_rxnfc *cmd,
memcpy(spec_l2->eth.dst_mac_msk, &mac_msk, ETH_ALEN);
memcpy(spec_l2->eth.dst_mac, mac, ETH_ALEN);
- if ((cmd->fs.flow_type & FLOW_EXT) && cmd->fs.m_ext.vlan_tci) {
+ if ((cmd->fs.flow_type & FLOW_EXT) &&
+ (cmd->fs.m_ext.vlan_tci & cpu_to_be16(VLAN_VID_MASK))) {
spec_l2->eth.vlan_id = cmd->fs.h_ext.vlan_tci;
- spec_l2->eth.vlan_id_msk = cpu_to_be16(0xfff);
+ spec_l2->eth.vlan_id_msk = cpu_to_be16(VLAN_VID_MASK);
}
list_add_tail(&spec_l2->list, rule_list_h);
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 06/11] net/mlx4_en: Block insertion of ethtool steering rules while the interface is down
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (4 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 05/11] net/mlx4_en: Fix vlan mask for ethtool " Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 07/11] net/mlx4_en: Fix ethtool rules leftovers after module unloaded Amir Vadai
` (4 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
Attaching steering rules while the interface is down is an invalid operation, block it.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 6 ++++--
1 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index f36c219..6f8044d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -1006,7 +1006,8 @@ static int mlx4_en_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
if ((cmd->cmd == ETHTOOL_GRXCLSRLCNT ||
cmd->cmd == ETHTOOL_GRXCLSRULE ||
cmd->cmd == ETHTOOL_GRXCLSRLALL) &&
- mdev->dev->caps.steering_mode != MLX4_STEERING_MODE_DEVICE_MANAGED)
+ (mdev->dev->caps.steering_mode !=
+ MLX4_STEERING_MODE_DEVICE_MANAGED || !priv->port_up))
return -EINVAL;
switch (cmd->cmd) {
@@ -1042,7 +1043,8 @@ static int mlx4_en_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev;
- if (mdev->dev->caps.steering_mode != MLX4_STEERING_MODE_DEVICE_MANAGED)
+ if (mdev->dev->caps.steering_mode !=
+ MLX4_STEERING_MODE_DEVICE_MANAGED || !priv->port_up)
return -EINVAL;
switch (cmd->cmd) {
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 07/11] net/mlx4_en: Fix ethtool rules leftovers after module unloaded
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (5 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 06/11] net/mlx4_en: Block insertion of ethtool steering rules while the interface is down Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 08/11] net/mlx4_core: Use firmware driven flow steering hash mode Amir Vadai
` (3 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
As part of the driver unload flow, all steering rules must be deleted,
make sure to remove the rules that were set through ethtool.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 3 +++
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 15 +++++++++++++++
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 3 +++
3 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 6f8044d..738e95d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -915,6 +915,7 @@ static int mlx4_en_flow_replace(struct net_device *dev,
loc_rule->id = 0;
memset(&loc_rule->flow_spec, 0,
sizeof(struct ethtool_rx_flow_spec));
+ list_del(&loc_rule->list);
}
err = mlx4_flow_attach(priv->mdev->dev, &rule, ®_id);
if (err) {
@@ -925,6 +926,7 @@ static int mlx4_en_flow_replace(struct net_device *dev,
loc_rule->id = reg_id;
memcpy(&loc_rule->flow_spec, &cmd->fs,
sizeof(struct ethtool_rx_flow_spec));
+ list_add_tail(&loc_rule->list, &priv->ethtool_list);
out_free_list:
list_for_each_entry_safe(spec, tmp_spec, &rule.list, list) {
@@ -958,6 +960,7 @@ static int mlx4_en_flow_detach(struct net_device *dev,
}
rule->id = 0;
memset(&rule->flow_spec, 0, sizeof(struct ethtool_rx_flow_spec));
+ list_del(&rule->list);
out:
return err;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 9c42812..333a7a0 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1039,6 +1039,9 @@ int mlx4_en_start_port(struct net_device *dev)
INIT_LIST_HEAD(&priv->mc_list);
INIT_LIST_HEAD(&priv->curr_list);
+ INIT_LIST_HEAD(&priv->ethtool_list);
+ memset(&priv->ethtool_rules[0], 0,
+ sizeof(struct ethtool_flow_id) * MAX_NUM_OF_FS_RULES);
/* Calculate Rx buf size */
dev->mtu = min(dev->mtu, priv->max_mtu);
@@ -1202,6 +1205,7 @@ void mlx4_en_stop_port(struct net_device *dev)
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev;
struct mlx4_en_mc_list *mclist, *tmp;
+ struct ethtool_flow_id *flow, *tmp_flow;
int i;
u8 mc_list[16] = {0};
@@ -1283,6 +1287,17 @@ void mlx4_en_stop_port(struct net_device *dev)
mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
mdev->mac_removed[priv->port] = 1;
+ /* Remove flow steering rules for the port*/
+ if (mdev->dev->caps.steering_mode ==
+ MLX4_STEERING_MODE_DEVICE_MANAGED) {
+ ASSERT_RTNL();
+ list_for_each_entry_safe(flow, tmp_flow,
+ &priv->ethtool_list, list) {
+ mlx4_flow_detach(mdev->dev, flow->id);
+ list_del(&flow->list);
+ }
+ }
+
/* Free RX Rings */
for (i = 0; i < priv->rx_ring_num; i++) {
mlx4_en_deactivate_rx_ring(priv, &priv->rx_ring[i]);
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 8d54412..4fb4a3e 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -427,6 +427,7 @@ struct mlx4_en_frag_info {
#endif
struct ethtool_flow_id {
+ struct list_head list;
struct ethtool_rx_flow_spec flow_spec;
u64 id;
};
@@ -441,6 +442,8 @@ struct mlx4_en_priv {
struct mlx4_en_port_state port_state;
spinlock_t stats_lock;
struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES];
+ /* To allow rules removal while port is going down */
+ struct list_head ethtool_list;
unsigned long last_moder_packets[MAX_RX_RINGS];
unsigned long last_moder_tx_packets;
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 08/11] net/mlx4_core: Use firmware driven flow steering hash mode
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (6 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 07/11] net/mlx4_en: Fix ethtool rules leftovers after module unloaded Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 09/11] net/mlx4_en: Add debugfs support Amir Vadai
` (2 subsequent siblings)
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Hadar Hen Zion
From: Hadar Hen Zion <hadarh@mellanox.com>
The Firmware dynamically changes flow steering hash configuration from covering
L2 only to "full" L2/L3/L4 mode needed. The dynamic change allows the driver
to set hard coded hash configuration which is changed by the firmware from L2
to L2/L3/L4 when attaching the first L3/L4 flow steering rule and back to L2
when there are no more such rules.
Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/fw.c | 4 ++--
drivers/net/ethernet/mellanox/mlx4/fw.h | 1 -
drivers/net/ethernet/mellanox/mlx4/main.c | 16 ----------------
drivers/net/ethernet/mellanox/mlx4/mlx4.h | 5 -----
4 files changed, 2 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 8b3d051..91acf71 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -1287,14 +1287,14 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param)
/* Enable Ethernet flow steering
* with udp unicast and tcp unicast
*/
- MLX4_PUT(inbox, param->fs_hash_enable_bits,
+ MLX4_PUT(inbox, (u8) (MLX4_FS_UDP_UC_EN | MLX4_FS_TCP_UC_EN),
INIT_HCA_FS_ETH_BITS_OFFSET);
MLX4_PUT(inbox, (u16) MLX4_FS_NUM_OF_L2_ADDR,
INIT_HCA_FS_ETH_NUM_ADDRS_OFFSET);
/* Enable IPoIB flow steering
* with udp unicast and tcp unicast
*/
- MLX4_PUT(inbox, param->fs_hash_enable_bits,
+ MLX4_PUT(inbox, (u8) (MLX4_FS_UDP_UC_EN | MLX4_FS_TCP_UC_EN),
INIT_HCA_FS_IB_BITS_OFFSET);
MLX4_PUT(inbox, (u16) MLX4_FS_NUM_OF_L2_ADDR,
INIT_HCA_FS_IB_NUM_ADDRS_OFFSET);
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.h b/drivers/net/ethernet/mellanox/mlx4/fw.h
index dbf2f69..3af33ff 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.h
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.h
@@ -171,7 +171,6 @@ struct mlx4_init_hca_param {
u8 log_mpt_sz;
u8 log_uar_sz;
u8 uar_page_sz; /* log pg sz in 4k chunks */
- u8 fs_hash_enable_bits;
u8 steering_mode; /* for QUERY_HCA */
u64 dev_cap_enabled;
};
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index f1ee52d..e38c6b2 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -1415,22 +1415,6 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
if (mlx4_is_master(dev))
mlx4_parav_master_pf_caps(dev);
- priv->fs_hash_mode = MLX4_FS_L2_HASH;
-
- switch (priv->fs_hash_mode) {
- case MLX4_FS_L2_HASH:
- init_hca.fs_hash_enable_bits = 0;
- break;
-
- case MLX4_FS_L2_L3_L4_HASH:
- /* Enable flow steering with
- * udp unicast and tcp unicast
- */
- init_hca.fs_hash_enable_bits =
- MLX4_FS_UDP_UC_EN | MLX4_FS_TCP_UC_EN;
- break;
- }
-
profile = default_profile;
if (dev->caps.steering_mode ==
MLX4_STEERING_MODE_DEVICE_MANAGED)
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
index 3263848..172daaa 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h
@@ -60,11 +60,6 @@
#define MLX4_FS_MGM_LOG_ENTRY_SIZE 7
#define MLX4_FS_NUM_MCG (1 << 17)
-enum {
- MLX4_FS_L2_HASH = 0,
- MLX4_FS_L2_L3_L4_HASH,
-};
-
#define MLX4_NUM_UP 8
#define MLX4_NUM_TC 8
#define MLX4_RATELIMIT_UNITS 3 /* 100 Mbps */
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 09/11] net/mlx4_en: Add debugfs support
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (7 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 08/11] net/mlx4_core: Use firmware driven flow steering hash mode Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-31 1:23 ` David Miller
2013-01-30 10:34 ` [PATCH net-next 10/11] net/mlx4_en: Don't reassign port mac address on firmware that supports it Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 11/11] net/mlx4_en: Fix transmit timeout when driver restarts port Amir Vadai
10 siblings, 1 reply; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Shani Michaelli
From: Shani Michaelli <shanim@mellanox.com>
Add debugfs support to the mlx4_en driver such that users have the ability to access
kernel information which can be used by external tools e.g HW monitoring ones
The filesystem is set up in the following driver/interface hierarchy:
<debugfs>
|-- mlx4_en
|-- <interface>
|-- queues
|-- rx
|-- indir_qp
|-- qpn_base_rx
|-- rx_[0-9]*
|-- qpn_rx
|-- irq_rx
|-- cqn_rx
|-- eqn_rx
|-- tx
|-- tx_[0-9]*
|-- qpn_tx
|-- irq_tx
|-- cqn_tx
|-- eqn_tx
Signed-off-by: Shani Michaeli <shanim@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/Makefile | 3 +
drivers/net/ethernet/mellanox/mlx4/cq.c | 3 +
drivers/net/ethernet/mellanox/mlx4/en_debugfs.c | 133 +++++++++++++++++++++++
drivers/net/ethernet/mellanox/mlx4/en_main.c | 7 ++
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 +
drivers/net/ethernet/mellanox/mlx4/en_rx.c | 7 +-
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 9 ++
include/linux/mlx4/device.h | 2 +
8 files changed, 167 insertions(+), 3 deletions(-)
create mode 100644 drivers/net/ethernet/mellanox/mlx4/en_debugfs.c
diff --git a/drivers/net/ethernet/mellanox/mlx4/Makefile b/drivers/net/ethernet/mellanox/mlx4/Makefile
index 293127d..9800aa5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/Makefile
+++ b/drivers/net/ethernet/mellanox/mlx4/Makefile
@@ -7,4 +7,7 @@ obj-$(CONFIG_MLX4_EN) += mlx4_en.o
mlx4_en-y := en_main.o en_tx.o en_rx.o en_ethtool.o en_port.o en_cq.o \
en_resources.o en_netdev.o en_selftest.o
+
+mlx4_en-$(CONFIG_DEBUG_FS) += en_debugfs.o
+
mlx4_en-$(CONFIG_MLX4_EN_DCB) += en_dcb_nl.o
diff --git a/drivers/net/ethernet/mellanox/mlx4/cq.c b/drivers/net/ethernet/mellanox/mlx4/cq.c
index 7e64033..e6eb492 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cq.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cq.c
@@ -296,6 +296,9 @@ int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
atomic_set(&cq->refcount, 1);
init_completion(&cq->free);
+ cq->eqn = priv->eq_table.eq[cq->vector].eqn;
+ cq->irq = priv->eq_table.eq[cq->vector].irq;
+
return 0;
err_radix:
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_debugfs.c b/drivers/net/ethernet/mellanox/mlx4/en_debugfs.c
new file mode 100644
index 0000000..05cb1e7
--- /dev/null
+++ b/drivers/net/ethernet/mellanox/mlx4/en_debugfs.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2013 Mellanox Technologies. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses. You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "mlx4_en.h"
+#include <linux/debugfs.h>
+#include <linux/slab.h>
+
+#define MAX_DIR_NAME 100
+
+static struct dentry *mlx4_en_root;
+void mlx4_en_create_debug_files(struct mlx4_en_priv *priv)
+{
+ int i;
+ char name[MAX_DIR_NAME];
+ struct dentry *queue_root;
+ struct dentry *rx_root;
+ struct dentry *tx_root;
+ struct dentry *rx_ring_root;
+ struct dentry *tx_ring_root;
+
+ if (!mlx4_en_root)
+ return;
+ priv->dev_root = debugfs_create_dir(priv->dev->name, mlx4_en_root);
+ if (!priv->dev_root)
+ goto error;
+ queue_root = debugfs_create_dir("queues", priv->dev_root);
+ if (!queue_root)
+ goto error;
+ rx_root = debugfs_create_dir("rx", queue_root);
+ if (!rx_root)
+ goto error;
+ tx_root = debugfs_create_dir("tx", queue_root);
+ if (!tx_root)
+ goto error;
+ if (!debugfs_create_x32("indir_qp", 0444,
+ rx_root, (u32 *)&priv->rss_map.indir_qp.qpn))
+ goto error;
+ if (!debugfs_create_x32("qpn_base_rx", 0444,
+ rx_root, (u32 *)&priv->rss_map.base_qpn))
+ goto error;
+
+ for (i = 0; i < priv->rx_ring_num; i++) {
+ snprintf(name, MAX_DIR_NAME, "rx-%d", i);
+ rx_ring_root = debugfs_create_dir(name, rx_root);
+ if (!rx_ring_root)
+ goto error;
+ if (!debugfs_create_u16("cqn_rx", 0444, rx_ring_root,
+ &priv->rx_ring[i].cqn))
+ goto error;
+ if (!debugfs_create_x32("qpn_rx", 0444, rx_ring_root,
+ (u32 *)&priv->rx_ring[i].qpn))
+ goto error;
+ if (!debugfs_create_u32("eqn_rx", 0444, rx_ring_root,
+ (u32 *)&priv->rx_cq[i].mcq.eqn))
+ goto error;
+ if (!debugfs_create_u16("irq_rx", 0444, rx_ring_root,
+ &priv->rx_cq[i].mcq.irq))
+ goto error;
+ }
+
+ for (i = 0; i < priv->tx_ring_num; i++) {
+ snprintf(name, MAX_DIR_NAME, "tx-%d", i);
+ tx_ring_root = debugfs_create_dir(name, tx_root);
+ if (!tx_ring_root)
+ goto error;
+ if (!debugfs_create_u16("cqn_tx", 0444, tx_ring_root,
+ &priv->tx_ring[i].cqn))
+ goto error;
+ if (!debugfs_create_x32("qpn_tx", 0444, tx_ring_root,
+ (u32 *)&priv->tx_ring[i].qpn))
+ goto error;
+ if (!debugfs_create_u32("eqn_tx", 0444, tx_ring_root,
+ (u32 *)&priv->tx_cq[i].mcq.eqn))
+ goto error;
+ if (!debugfs_create_u16("irq_tx", 0444, tx_ring_root,
+ &priv->tx_cq[i].mcq.irq))
+ goto error;
+ }
+
+ return;
+
+error:
+ mlx4_warn(priv->mdev, "Couldn't create debugfs for %s\n",
+ priv->dev->name);
+ mlx4_en_delete_debug_files(priv);
+ return;
+}
+
+void mlx4_en_delete_debug_files(struct mlx4_en_priv *priv)
+{
+ debugfs_remove_recursive(priv->dev_root);
+ priv->dev_root = NULL;
+}
+
+int mlx4_en_register_debugfs(void)
+{
+ mlx4_en_root = debugfs_create_dir("mlx4_en", NULL);
+ return mlx4_en_root ? 0 : PTR_ERR(mlx4_en_root);
+}
+
+void mlx4_en_unregister_debugfs(void)
+{
+ debugfs_remove_recursive(mlx4_en_root);
+}
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_main.c b/drivers/net/ethernet/mellanox/mlx4/en_main.c
index 3a2b8c6..f147c91 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_main.c
@@ -307,12 +307,19 @@ static struct mlx4_interface mlx4_en_interface = {
static int __init mlx4_en_init(void)
{
+#ifdef CONFIG_DEBUG_FS
+ if (mlx4_en_register_debugfs())
+ pr_err(KERN_ERR "Failed to register debugfs\n");
+#endif
return mlx4_register_interface(&mlx4_en_interface);
}
static void __exit mlx4_en_cleanup(void)
{
mlx4_unregister_interface(&mlx4_en_interface);
+#ifdef CONFIG_DEBUG_FS
+ mlx4_en_unregister_debugfs();
+#endif
}
module_init(mlx4_en_init);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 333a7a0..616c3a3 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1178,6 +1178,9 @@ int mlx4_en_start_port(struct net_device *dev)
priv->port_up = true;
netif_tx_start_all_queues(dev);
+#ifdef CONFIG_DEBUG_FS
+ mlx4_en_create_debug_files(priv);
+#endif
return 0;
tx_err:
@@ -1214,6 +1217,9 @@ void mlx4_en_stop_port(struct net_device *dev)
return;
}
+#ifdef CONFIG_DEBUG_FS
+ mlx4_en_delete_debug_files(priv);
+#endif
/* Synchronize with tx routine */
netif_tx_lock_bh(dev);
netif_tx_stop_all_queues(dev);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
index fed26d8..5f9c13f 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c
@@ -912,7 +912,7 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv)
void *ptr;
u8 rss_mask = (MLX4_RSS_IPV4 | MLX4_RSS_TCP_IPV4 | MLX4_RSS_IPV6 |
MLX4_RSS_TCP_IPV6);
- int i, qpn;
+ int i;
int err = 0;
int good_qps = 0;
static const u32 rsskey[10] = { 0xD181C62C, 0xF7F4DB5B, 0x1983A2FC,
@@ -929,8 +929,9 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv)
}
for (i = 0; i < priv->rx_ring_num; i++) {
- qpn = rss_map->base_qpn + i;
- err = mlx4_en_config_rss_qp(priv, qpn, &priv->rx_ring[i],
+ priv->rx_ring[i].qpn = rss_map->base_qpn + i;
+ err = mlx4_en_config_rss_qp(priv, priv->rx_ring[i].qpn,
+ &priv->rx_ring[i],
&rss_map->state[i],
&rss_map->qps[i]);
if (err)
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 4fb4a3e..8d7a3b2 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -283,6 +283,7 @@ struct mlx4_en_rx_ring {
u32 cons;
u32 buf_size;
u8 fcs_del;
+ int qpn;
void *buf;
void *rx_info;
unsigned long bytes;
@@ -512,6 +513,7 @@ struct mlx4_en_priv {
int vids[128];
bool wol;
struct device *ddev;
+ struct dentry *dev_root;
int base_tx_qpn;
#ifdef CONFIG_MLX4_EN_DCB
@@ -600,6 +602,13 @@ int mlx4_SET_VLAN_FLTR(struct mlx4_dev *dev, struct mlx4_en_priv *priv);
int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset);
int mlx4_en_QUERY_PORT(struct mlx4_en_dev *mdev, u8 port);
+#ifdef CONFIG_DEBUG_FS
+void mlx4_en_create_debug_files(struct mlx4_en_priv *priv);
+void mlx4_en_delete_debug_files(struct mlx4_en_priv *priv);
+int mlx4_en_register_debugfs(void);
+void mlx4_en_unregister_debugfs(void);
+#endif
+
#ifdef CONFIG_MLX4_EN_DCB
extern const struct dcbnl_rtnl_ops mlx4_en_dcbnl_ops;
#endif
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 20ea939..ae9741b 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -547,6 +547,8 @@ struct mlx4_cq {
atomic_t refcount;
struct completion free;
+ int eqn;
+ u16 irq;
};
struct mlx4_qp {
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 10/11] net/mlx4_en: Don't reassign port mac address on firmware that supports it
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (8 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 09/11] net/mlx4_en: Add debugfs support Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 11/11] net/mlx4_en: Fix transmit timeout when driver restarts port Amir Vadai
10 siblings, 0 replies; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Matan Barak
From: Matan Barak <matanb@mellanox.com>
Mac reassignments should only be done when not supported by the firmware. To
accomplish that, checking firmware capability bit to know whether we should
reassign macs in the driver.
Signed-off-by: Matan Barak <matanb@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 3 ++-
drivers/net/ethernet/mellanox/mlx4/fw.c | 7 ++++++-
include/linux/mlx4/device.h | 3 ++-
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 616c3a3..9b78f61 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1291,7 +1291,8 @@ void mlx4_en_stop_port(struct net_device *dev)
/* Unregister Mac address for the port */
mlx4_put_eth_qp(mdev->dev, priv->port, priv->mac, priv->base_qpn);
- mdev->mac_removed[priv->port] = 1;
+ if (!(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN))
+ mdev->mac_removed[priv->port] = 1;
/* Remove flow steering rules for the port*/
if (mdev->dev->caps.steering_mode ==
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 91acf71..38b62c7 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -127,7 +127,8 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
[0] = "RSS support",
[1] = "RSS Toeplitz Hash Function support",
[2] = "RSS XOR Hash Function support",
- [3] = "Device manage flow steering support"
+ [3] = "Device manage flow steering support",
+ [4] = "Automatic mac reassignment support"
};
int i;
@@ -478,6 +479,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
#define QUERY_DEV_CAP_BMME_FLAGS_OFFSET 0x94
#define QUERY_DEV_CAP_RSVD_LKEY_OFFSET 0x98
#define QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET 0xa0
+#define QUERY_DEV_CAP_FW_REASSIGN_MAC 0x9d
dev_cap->flags2 = 0;
mailbox = mlx4_alloc_cmd_mailbox(dev);
@@ -637,6 +639,9 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
MLX4_GET(dev_cap->reserved_lkey, outbox,
QUERY_DEV_CAP_RSVD_LKEY_OFFSET);
+ MLX4_GET(field, outbox, QUERY_DEV_CAP_FW_REASSIGN_MAC);
+ if (field & 1<<6)
+ dev_cap->flags2 |= MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN;
MLX4_GET(dev_cap->max_icm_sz, outbox,
QUERY_DEV_CAP_MAX_ICM_SZ_OFFSET);
if (dev_cap->flags & MLX4_DEV_CAP_FLAG_COUNTERS)
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index ae9741b..054aae4 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -150,7 +150,8 @@ enum {
MLX4_DEV_CAP_FLAG2_RSS = 1LL << 0,
MLX4_DEV_CAP_FLAG2_RSS_TOP = 1LL << 1,
MLX4_DEV_CAP_FLAG2_RSS_XOR = 1LL << 2,
- MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3
+ MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3,
+ MLX4_DEV_CAP_FLAGS2_REASSIGN_MAC_EN = 1LL << 4
};
enum {
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH net-next 11/11] net/mlx4_en: Fix transmit timeout when driver restarts port
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
` (9 preceding siblings ...)
2013-01-30 10:34 ` [PATCH net-next 10/11] net/mlx4_en: Don't reassign port mac address on firmware that supports it Amir Vadai
@ 2013-01-30 10:34 ` Amir Vadai
2013-01-30 16:50 ` Ben Hutchings
10 siblings, 1 reply; 15+ messages in thread
From: Amir Vadai @ 2013-01-30 10:34 UTC (permalink / raw)
To: David S. Miller; +Cc: Amir Vadai, netdev, Ben Hutchings, Eugenia Emantayev
Under heavy CPU load, changing, ring size/mtu/etc. could result in transmit
timeout, since stop-start port might take more than 10 seconds.
Calling netif_detach_device to prevent tx queue transmit timeout.
netif_detach_device() is not called under ndo_stop, because netif_carrier_off
will prevent the timeout, and device should not be marked as not present, or
else user won't be able to start it later on.
CC: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: Eugenia Emantayev <eugenia@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 6 +++---
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 14 ++++++++++----
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 2 +-
3 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 738e95d..911d488 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -496,7 +496,7 @@ static int mlx4_en_set_ringparam(struct net_device *dev,
mutex_lock(&mdev->state_lock);
if (priv->port_up) {
port_up = 1;
- mlx4_en_stop_port(dev);
+ mlx4_en_stop_port(dev, 1);
}
mlx4_en_free_resources(priv);
@@ -591,7 +591,7 @@ static int mlx4_en_set_rxfh_indir(struct net_device *dev,
mutex_lock(&mdev->state_lock);
if (priv->port_up) {
port_up = 1;
- mlx4_en_stop_port(dev);
+ mlx4_en_stop_port(dev, 1);
}
priv->prof->rss_rings = rss_rings;
@@ -1096,7 +1096,7 @@ static int mlx4_en_set_channels(struct net_device *dev,
mutex_lock(&mdev->state_lock);
if (priv->port_up) {
port_up = 1;
- mlx4_en_stop_port(dev);
+ mlx4_en_stop_port(dev, 1);
}
mlx4_en_free_resources(priv);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 9b78f61..21be6dc 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -1181,6 +1181,8 @@ int mlx4_en_start_port(struct net_device *dev)
#ifdef CONFIG_DEBUG_FS
mlx4_en_create_debug_files(priv);
#endif
+ netif_device_attach(dev);
+
return 0;
tx_err:
@@ -1203,7 +1205,7 @@ cq_err:
}
-void mlx4_en_stop_port(struct net_device *dev)
+void mlx4_en_stop_port(struct net_device *dev, int detach)
{
struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev;
@@ -1222,9 +1224,13 @@ void mlx4_en_stop_port(struct net_device *dev)
#endif
/* Synchronize with tx routine */
netif_tx_lock_bh(dev);
+ if (detach)
+ netif_device_detach(dev);
netif_tx_stop_all_queues(dev);
netif_tx_unlock_bh(dev);
+ netif_tx_disable(dev);
+
/* Set port as not active */
priv->port_up = false;
@@ -1329,7 +1335,7 @@ static void mlx4_en_restart(struct work_struct *work)
mutex_lock(&mdev->state_lock);
if (priv->port_up) {
- mlx4_en_stop_port(dev);
+ mlx4_en_stop_port(dev, 1);
for (i = 0; i < priv->tx_ring_num; i++)
netdev_tx_reset_queue(priv->tx_ring[i].tx_queue);
if (mlx4_en_start_port(dev))
@@ -1401,7 +1407,7 @@ static int mlx4_en_close(struct net_device *dev)
mutex_lock(&mdev->state_lock);
- mlx4_en_stop_port(dev);
+ mlx4_en_stop_port(dev, 0);
netif_carrier_off(dev);
mutex_unlock(&mdev->state_lock);
@@ -1539,7 +1545,7 @@ static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
* the port */
en_dbg(DRV, priv, "Change MTU called with card down!?\n");
} else {
- mlx4_en_stop_port(dev);
+ mlx4_en_stop_port(dev, 1);
err = mlx4_en_start_port(dev);
if (err) {
en_err(priv, "Failed restarting port:%d\n",
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 8d7a3b2..6c25513 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -541,7 +541,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
struct mlx4_en_port_profile *prof);
int mlx4_en_start_port(struct net_device *dev);
-void mlx4_en_stop_port(struct net_device *dev);
+void mlx4_en_stop_port(struct net_device *dev, int detach);
void mlx4_en_free_resources(struct mlx4_en_priv *priv);
int mlx4_en_alloc_resources(struct mlx4_en_priv *priv);
--
1.7.8.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 11/11] net/mlx4_en: Fix transmit timeout when driver restarts port
2013-01-30 10:34 ` [PATCH net-next 11/11] net/mlx4_en: Fix transmit timeout when driver restarts port Amir Vadai
@ 2013-01-30 16:50 ` Ben Hutchings
0 siblings, 0 replies; 15+ messages in thread
From: Ben Hutchings @ 2013-01-30 16:50 UTC (permalink / raw)
To: Amir Vadai; +Cc: David S. Miller, netdev, Eugenia Emantayev
On Wed, 2013-01-30 at 12:34 +0200, Amir Vadai wrote:
> Under heavy CPU load, changing, ring size/mtu/etc. could result in transmit
> timeout, since stop-start port might take more than 10 seconds.
> Calling netif_detach_device to prevent tx queue transmit timeout.
[...]
It's actually worse than that - the watchdog can fire instantly if it
has been 10 seconds since the last packet was queued.
Anyway, this looks very much like a pending fix for the same issue in
sfc, so hopefully we both did it right. :-)
Ben.
--
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 05/11] net/mlx4_en: Fix vlan mask for ethtool steering rules
2013-01-30 10:34 ` [PATCH net-next 05/11] net/mlx4_en: Fix vlan mask for ethtool " Amir Vadai
@ 2013-01-30 17:20 ` Ben Hutchings
0 siblings, 0 replies; 15+ messages in thread
From: Ben Hutchings @ 2013-01-30 17:20 UTC (permalink / raw)
To: Amir Vadai, Alexander Duyck; +Cc: David S. Miller, netdev, Hadar Hen Zion
On Wed, 2013-01-30 at 12:34 +0200, Amir Vadai wrote:
> From: Hadar Hen Zion <hadarh@mellanox.com>
>
> The vlan mask field should be validated and assigned according to the field
> size which is 12 bits.
[...]
My understanding is that ethtool_flow_ext::vlan_tci corresponds to the
whole VLAN tag; a filter rule that matches only the VID must have a mask
of htons(0xfff).
The original implementation of this extension was in ixgbe and it's now
unclear to me whether it's programming hardware filters to match just
the VID or the whole VLAN tag. Alexander, can you answer this?
I was thinking about adding new keywords to ethtool -U ('vid', 'vtag'?)
to make it easier to specify just the VID and clearer when you're
specifying the full tag. (The 'vlan' keyword would have to remain but
could be removed from documentation.) But if no-one really implements
matching of the full tag then maybe we can pretend those 4 bits don't
exist.
Ben.
--
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH net-next 09/11] net/mlx4_en: Add debugfs support
2013-01-30 10:34 ` [PATCH net-next 09/11] net/mlx4_en: Add debugfs support Amir Vadai
@ 2013-01-31 1:23 ` David Miller
0 siblings, 0 replies; 15+ messages in thread
From: David Miller @ 2013-01-31 1:23 UTC (permalink / raw)
To: amirv; +Cc: netdev, shanim
From: Amir Vadai <amirv@mellanox.com>
Date: Wed, 30 Jan 2013 12:34:25 +0200
> Add debugfs support to the mlx4_en driver such that users have the ability to access
> kernel information which can be used by external tools e.g HW monitoring ones
>
> The filesystem is set up in the following driver/interface hierarchy:
> <debugfs>
Sigh...
This is a chronic problem.
Every time some driver developer can't figure out a way, using existing
well structured interfaces, to expose some information or statistic,
they just throw their hands in the air and add some debugfs turd.
Don't do this.
Instead, use or extend existing, well structured and typed, interfaces
to export your information.
That way every driver can export similar information in a familiar way
rather than with yet-another-debugfs-hack.
I'm not applying this series, sorry.
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2013-01-31 1:23 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-30 10:34 [PATCH net-next 00/11] Mellanox Ethernet driver updates 2013-01-30 Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 01/11] net/mlx4_core: Directly expose fields of HW flow steering rule control segment Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 02/11] net/mlx4_core: Set correctly allow_loopback flag Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 03/11] net/mlx4_en: Fix ip/udp steering rules multicast mac when attached via ethtool Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 04/11] net/mlx4_en: Validate VLAN IDs provided in ethtool flow steering rules Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 05/11] net/mlx4_en: Fix vlan mask for ethtool " Amir Vadai
2013-01-30 17:20 ` Ben Hutchings
2013-01-30 10:34 ` [PATCH net-next 06/11] net/mlx4_en: Block insertion of ethtool steering rules while the interface is down Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 07/11] net/mlx4_en: Fix ethtool rules leftovers after module unloaded Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 08/11] net/mlx4_core: Use firmware driven flow steering hash mode Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 09/11] net/mlx4_en: Add debugfs support Amir Vadai
2013-01-31 1:23 ` David Miller
2013-01-30 10:34 ` [PATCH net-next 10/11] net/mlx4_en: Don't reassign port mac address on firmware that supports it Amir Vadai
2013-01-30 10:34 ` [PATCH net-next 11/11] net/mlx4_en: Fix transmit timeout when driver restarts port Amir Vadai
2013-01-30 16:50 ` Ben Hutchings
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).