mlx4: Implement QP paravirtualization and maintain phys_pkey_cache for smp_snoop
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / main.c
index 2f816c6..2294b71 100644 (file)
@@ -384,6 +384,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
                dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FC_ADDR] +
                dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FC_EXCH];
 
+       dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0;
        return 0;
 }
 /*The function checks if there are live vf, return the num of them*/
@@ -423,6 +424,17 @@ int mlx4_get_parav_qkey(struct mlx4_dev *dev, u32 qpn, u32 *qkey)
 }
 EXPORT_SYMBOL(mlx4_get_parav_qkey);
 
+void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port, int i, int val)
+{
+       struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
+
+       if (!mlx4_is_master(dev))
+               return;
+
+       priv->virt2phys_pkey[slave][port - 1][i] = val;
+}
+EXPORT_SYMBOL(mlx4_sync_pkey_table);
+
 int mlx4_is_slave_active(struct mlx4_dev *dev, int slave)
 {
        struct mlx4_priv *priv = mlx4_priv(dev);
@@ -541,6 +553,10 @@ static int mlx4_slave_cap(struct mlx4_dev *dev)
                return -ENODEV;
        }
 
+       /* Calculate our sqp_start */
+       dev->caps.sqp_start = func_cap.base_proxy_qpn;
+       dev->caps.base_tunnel_sqpn = func_cap.base_tunnel_qpn;
+
        return 0;
 }