net/mlx4_en: Implement ndo_get_phys_port_id
authorHadar Hen Zion <hadarh@mellanox.com>
Thu, 19 Dec 2013 19:20:13 +0000 (21:20 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Dec 2013 00:04:43 +0000 (19:04 -0500)
Use the port GUID read from the firmware to identify the physical port.
This port identifier is available via ndo_get_phys_port_id for both PF
and VF net-devices.

Signed-off-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/en_netdev.c

index 709e5ec5ce14db599aec1cd8535852a0e6d3a0fd..d2e9666f2fb82b16f7c5c651eb1856c9ea36da92 100644 (file)
@@ -2164,6 +2164,27 @@ static int mlx4_en_set_vf_link_state(struct net_device *dev, int vf, int link_st
 
        return mlx4_set_vf_link_state(mdev->dev, en_priv->port, vf, link_state);
 }
+
+#define PORT_ID_BYTE_LEN 8
+static int mlx4_en_get_phys_port_id(struct net_device *dev,
+                                   struct netdev_phys_port_id *ppid)
+{
+       struct mlx4_en_priv *priv = netdev_priv(dev);
+       struct mlx4_dev *mdev = priv->mdev->dev;
+       int i;
+       u64 phys_port_id = mdev->caps.phys_port_id[priv->port];
+
+       if (!phys_port_id)
+               return -EOPNOTSUPP;
+
+       ppid->id_len = sizeof(phys_port_id);
+       for (i = PORT_ID_BYTE_LEN - 1; i >= 0; --i) {
+               ppid->id[i] =  phys_port_id & 0xff;
+               phys_port_id >>= 8;
+       }
+       return 0;
+}
+
 static const struct net_device_ops mlx4_netdev_ops = {
        .ndo_open               = mlx4_en_open,
        .ndo_stop               = mlx4_en_close,
@@ -2189,6 +2210,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
 #ifdef CONFIG_NET_RX_BUSY_POLL
        .ndo_busy_poll          = mlx4_en_low_latency_recv,
 #endif
+       .ndo_get_phys_port_id   = mlx4_en_get_phys_port_id,
 };
 
 static const struct net_device_ops mlx4_netdev_ops_master = {
@@ -2217,6 +2239,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = {
 #ifdef CONFIG_RFS_ACCEL
        .ndo_rx_flow_steer      = mlx4_en_filter_rfs,
 #endif
+       .ndo_get_phys_port_id   = mlx4_en_get_phys_port_id,
 };
 
 int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,