aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamad Haj Yahia <mohamad@mellanox.com>2016-05-03 10:13:54 -0400
committerDavid S. Miller <davem@davemloft.net>2016-05-04 14:04:46 -0400
commitefdc810ba39dae0ccce9cb9c1c84ff9b0157ca43 (patch)
tree0f52fbc9ee304e8b367249f5e3752341fbe7916f
parentfbc4a69b562e38d6946bc8bd7e97d30fe0acd5d0 (diff)
net/mlx5: Flow steering, Add vport ACL support
Update the relevant flow steering device structs and commands to support vport. Update the flow steering core API to receive vport number. Add ingress and egress ACL flow table name spaces. Add ACL flow table support: * ACL (Access Control List) flow table is a table that contains only allow/drop steering rules. * We have two types of ACL flow tables - ingress and egress. * ACLs handle traffic sent from/to E-Switch FDB table, Ingress refers to traffic sent from Vport to E-Switch and Egress refers to traffic sent from E-Switch to vport. * Ingress ACL flow table allow/drop rules is checked against traffic sent from VF. * Egress ACL flow table allow/drop rules is checked against traffic sent to VF. Signed-off-by: Mohamad Haj Yahia <mohamad@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/eswitch.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c33
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h1
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.c85
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.h7
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h2
-rw-r--r--include/linux/mlx5/device.h12
-rw-r--r--include/linux/mlx5/driver.h2
-rw-r--r--include/linux/mlx5/fs.h7
9 files changed, 142 insertions, 9 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index ff91bb5e1c43..dd066199d172 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -845,7 +845,7 @@ void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw)
845int mlx5_eswitch_init(struct mlx5_core_dev *dev) 845int mlx5_eswitch_init(struct mlx5_core_dev *dev)
846{ 846{
847 int l2_table_size = 1 << MLX5_CAP_GEN(dev, log_max_l2_table); 847 int l2_table_size = 1 << MLX5_CAP_GEN(dev, log_max_l2_table);
848 int total_vports = 1 + pci_sriov_get_totalvfs(dev->pdev); 848 int total_vports = MLX5_TOTAL_VPORTS(dev);
849 struct mlx5_eswitch *esw; 849 struct mlx5_eswitch *esw;
850 int vport_num; 850 int vport_num;
851 int err; 851 int err;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
index f46f1db0fc00..9797768891ee 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
@@ -50,6 +50,10 @@ int mlx5_cmd_update_root_ft(struct mlx5_core_dev *dev,
50 MLX5_CMD_OP_SET_FLOW_TABLE_ROOT); 50 MLX5_CMD_OP_SET_FLOW_TABLE_ROOT);
51 MLX5_SET(set_flow_table_root_in, in, table_type, ft->type); 51 MLX5_SET(set_flow_table_root_in, in, table_type, ft->type);
52 MLX5_SET(set_flow_table_root_in, in, table_id, ft->id); 52 MLX5_SET(set_flow_table_root_in, in, table_id, ft->id);
53 if (ft->vport) {
54 MLX5_SET(set_flow_table_root_in, in, vport_number, ft->vport);
55 MLX5_SET(set_flow_table_root_in, in, other_vport, 1);
56 }
53 57
54 memset(out, 0, sizeof(out)); 58 memset(out, 0, sizeof(out));
55 return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, 59 return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
@@ -57,6 +61,7 @@ int mlx5_cmd_update_root_ft(struct mlx5_core_dev *dev,
57} 61}
58 62
59int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev, 63int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
64 u16 vport,
60 enum fs_flow_table_type type, unsigned int level, 65 enum fs_flow_table_type type, unsigned int level,
61 unsigned int log_size, struct mlx5_flow_table 66 unsigned int log_size, struct mlx5_flow_table
62 *next_ft, unsigned int *table_id) 67 *next_ft, unsigned int *table_id)
@@ -77,6 +82,10 @@ int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
77 MLX5_SET(create_flow_table_in, in, table_type, type); 82 MLX5_SET(create_flow_table_in, in, table_type, type);
78 MLX5_SET(create_flow_table_in, in, level, level); 83 MLX5_SET(create_flow_table_in, in, level, level);
79 MLX5_SET(create_flow_table_in, in, log_size, log_size); 84 MLX5_SET(create_flow_table_in, in, log_size, log_size);
85 if (vport) {
86 MLX5_SET(create_flow_table_in, in, vport_number, vport);
87 MLX5_SET(create_flow_table_in, in, other_vport, 1);
88 }
80 89
81 memset(out, 0, sizeof(out)); 90 memset(out, 0, sizeof(out));
82 err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, 91 err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
@@ -101,6 +110,10 @@ int mlx5_cmd_destroy_flow_table(struct mlx5_core_dev *dev,
101 MLX5_CMD_OP_DESTROY_FLOW_TABLE); 110 MLX5_CMD_OP_DESTROY_FLOW_TABLE);
102 MLX5_SET(destroy_flow_table_in, in, table_type, ft->type); 111 MLX5_SET(destroy_flow_table_in, in, table_type, ft->type);
103 MLX5_SET(destroy_flow_table_in, in, table_id, ft->id); 112 MLX5_SET(destroy_flow_table_in, in, table_id, ft->id);
113 if (ft->vport) {
114 MLX5_SET(destroy_flow_table_in, in, vport_number, ft->vport);
115 MLX5_SET(destroy_flow_table_in, in, other_vport, 1);
116 }
104 117
105 return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, 118 return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
106 sizeof(out)); 119 sizeof(out));
@@ -120,6 +133,10 @@ int mlx5_cmd_modify_flow_table(struct mlx5_core_dev *dev,
120 MLX5_CMD_OP_MODIFY_FLOW_TABLE); 133 MLX5_CMD_OP_MODIFY_FLOW_TABLE);
121 MLX5_SET(modify_flow_table_in, in, table_type, ft->type); 134 MLX5_SET(modify_flow_table_in, in, table_type, ft->type);
122 MLX5_SET(modify_flow_table_in, in, table_id, ft->id); 135 MLX5_SET(modify_flow_table_in, in, table_id, ft->id);
136 if (ft->vport) {
137 MLX5_SET(modify_flow_table_in, in, vport_number, ft->vport);
138 MLX5_SET(modify_flow_table_in, in, other_vport, 1);
139 }
123 MLX5_SET(modify_flow_table_in, in, modify_field_select, 140 MLX5_SET(modify_flow_table_in, in, modify_field_select,
124 MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID); 141 MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID);
125 if (next_ft) { 142 if (next_ft) {
@@ -148,6 +165,10 @@ int mlx5_cmd_create_flow_group(struct mlx5_core_dev *dev,
148 MLX5_CMD_OP_CREATE_FLOW_GROUP); 165 MLX5_CMD_OP_CREATE_FLOW_GROUP);
149 MLX5_SET(create_flow_group_in, in, table_type, ft->type); 166 MLX5_SET(create_flow_group_in, in, table_type, ft->type);
150 MLX5_SET(create_flow_group_in, in, table_id, ft->id); 167 MLX5_SET(create_flow_group_in, in, table_id, ft->id);
168 if (ft->vport) {
169 MLX5_SET(create_flow_group_in, in, vport_number, ft->vport);
170 MLX5_SET(create_flow_group_in, in, other_vport, 1);
171 }
151 172
152 err = mlx5_cmd_exec_check_status(dev, in, 173 err = mlx5_cmd_exec_check_status(dev, in,
153 inlen, out, 174 inlen, out,
@@ -174,6 +195,10 @@ int mlx5_cmd_destroy_flow_group(struct mlx5_core_dev *dev,
174 MLX5_SET(destroy_flow_group_in, in, table_type, ft->type); 195 MLX5_SET(destroy_flow_group_in, in, table_type, ft->type);
175 MLX5_SET(destroy_flow_group_in, in, table_id, ft->id); 196 MLX5_SET(destroy_flow_group_in, in, table_id, ft->id);
176 MLX5_SET(destroy_flow_group_in, in, group_id, group_id); 197 MLX5_SET(destroy_flow_group_in, in, group_id, group_id);
198 if (ft->vport) {
199 MLX5_SET(destroy_flow_group_in, in, vport_number, ft->vport);
200 MLX5_SET(destroy_flow_group_in, in, other_vport, 1);
201 }
177 202
178 return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, 203 return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out,
179 sizeof(out)); 204 sizeof(out));
@@ -207,6 +232,10 @@ static int mlx5_cmd_set_fte(struct mlx5_core_dev *dev,
207 MLX5_SET(set_fte_in, in, table_type, ft->type); 232 MLX5_SET(set_fte_in, in, table_type, ft->type);
208 MLX5_SET(set_fte_in, in, table_id, ft->id); 233 MLX5_SET(set_fte_in, in, table_id, ft->id);
209 MLX5_SET(set_fte_in, in, flow_index, fte->index); 234 MLX5_SET(set_fte_in, in, flow_index, fte->index);
235 if (ft->vport) {
236 MLX5_SET(set_fte_in, in, vport_number, ft->vport);
237 MLX5_SET(set_fte_in, in, other_vport, 1);
238 }
210 239
211 in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context); 240 in_flow_context = MLX5_ADDR_OF(set_fte_in, in, flow_context);
212 MLX5_SET(flow_context, in_flow_context, group_id, group_id); 241 MLX5_SET(flow_context, in_flow_context, group_id, group_id);
@@ -285,6 +314,10 @@ int mlx5_cmd_delete_fte(struct mlx5_core_dev *dev,
285 MLX5_SET(delete_fte_in, in, table_type, ft->type); 314 MLX5_SET(delete_fte_in, in, table_type, ft->type);
286 MLX5_SET(delete_fte_in, in, table_id, ft->id); 315 MLX5_SET(delete_fte_in, in, table_id, ft->id);
287 MLX5_SET(delete_fte_in, in, flow_index, index); 316 MLX5_SET(delete_fte_in, in, flow_index, index);
317 if (ft->vport) {
318 MLX5_SET(delete_fte_in, in, vport_number, ft->vport);
319 MLX5_SET(delete_fte_in, in, other_vport, 1);
320 }
288 321
289 err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out)); 322 err = mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, sizeof(out));
290 323
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h
index 9814d4784803..c97b4a03eeed 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.h
@@ -34,6 +34,7 @@
34#define _MLX5_FS_CMD_ 34#define _MLX5_FS_CMD_
35 35
36int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev, 36int mlx5_cmd_create_flow_table(struct mlx5_core_dev *dev,
37 u16 vport,
37 enum fs_flow_table_type type, unsigned int level, 38 enum fs_flow_table_type type, unsigned int level,
38 unsigned int log_size, struct mlx5_flow_table 39 unsigned int log_size, struct mlx5_flow_table
39 *next_ft, unsigned int *table_id); 40 *next_ft, unsigned int *table_id);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 4d78d5a48af3..659a6980cda2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -457,7 +457,7 @@ static struct mlx5_flow_group *alloc_flow_group(u32 *create_fg_in)
457 return fg; 457 return fg;
458} 458}
459 459
460static struct mlx5_flow_table *alloc_flow_table(int level, int max_fte, 460static struct mlx5_flow_table *alloc_flow_table(int level, u16 vport, int max_fte,
461 enum fs_flow_table_type table_type) 461 enum fs_flow_table_type table_type)
462{ 462{
463 struct mlx5_flow_table *ft; 463 struct mlx5_flow_table *ft;
@@ -469,6 +469,7 @@ static struct mlx5_flow_table *alloc_flow_table(int level, int max_fte,
469 ft->level = level; 469 ft->level = level;
470 ft->node.type = FS_TYPE_FLOW_TABLE; 470 ft->node.type = FS_TYPE_FLOW_TABLE;
471 ft->type = table_type; 471 ft->type = table_type;
472 ft->vport = vport;
472 ft->max_fte = max_fte; 473 ft->max_fte = max_fte;
473 INIT_LIST_HEAD(&ft->fwd_rules); 474 INIT_LIST_HEAD(&ft->fwd_rules);
474 mutex_init(&ft->lock); 475 mutex_init(&ft->lock);
@@ -700,9 +701,9 @@ static void list_add_flow_table(struct mlx5_flow_table *ft,
700 list_add(&ft->node.list, prev); 701 list_add(&ft->node.list, prev);
701} 702}
702 703
703struct mlx5_flow_table *mlx5_create_flow_table(struct mlx5_flow_namespace *ns, 704static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
704 int prio, int max_fte, 705 u16 vport, int prio,
705 u32 level) 706 int max_fte, u32 level)
706{ 707{
707 struct mlx5_flow_table *next_ft = NULL; 708 struct mlx5_flow_table *next_ft = NULL;
708 struct mlx5_flow_table *ft; 709 struct mlx5_flow_table *ft;
@@ -732,6 +733,7 @@ struct mlx5_flow_table *mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
732 */ 733 */
733 level += fs_prio->start_level; 734 level += fs_prio->start_level;
734 ft = alloc_flow_table(level, 735 ft = alloc_flow_table(level,
736 vport,
735 roundup_pow_of_two(max_fte), 737 roundup_pow_of_two(max_fte),
736 root->table_type); 738 root->table_type);
737 if (!ft) { 739 if (!ft) {
@@ -742,7 +744,7 @@ struct mlx5_flow_table *mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
742 tree_init_node(&ft->node, 1, del_flow_table); 744 tree_init_node(&ft->node, 1, del_flow_table);
743 log_table_sz = ilog2(ft->max_fte); 745 log_table_sz = ilog2(ft->max_fte);
744 next_ft = find_next_chained_ft(fs_prio); 746 next_ft = find_next_chained_ft(fs_prio);
745 err = mlx5_cmd_create_flow_table(root->dev, ft->type, ft->level, 747 err = mlx5_cmd_create_flow_table(root->dev, ft->vport, ft->type, ft->level,
746 log_table_sz, next_ft, &ft->id); 748 log_table_sz, next_ft, &ft->id);
747 if (err) 749 if (err)
748 goto free_ft; 750 goto free_ft;
@@ -766,6 +768,20 @@ unlock_root:
766 return ERR_PTR(err); 768 return ERR_PTR(err);
767} 769}
768 770
771struct mlx5_flow_table *mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
772 int prio, int max_fte,
773 u32 level)
774{
775 return __mlx5_create_flow_table(ns, 0, prio, max_fte, level);
776}
777
778struct mlx5_flow_table *mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns,
779 int prio, int max_fte,
780 u32 level, u16 vport)
781{
782 return __mlx5_create_flow_table(ns, vport, prio, max_fte, level);
783}
784
769struct mlx5_flow_table *mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, 785struct mlx5_flow_table *mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
770 int prio, 786 int prio,
771 int num_flow_table_entries, 787 int num_flow_table_entries,
@@ -1319,6 +1335,16 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
1319 return &dev->priv.fdb_root_ns->ns; 1335 return &dev->priv.fdb_root_ns->ns;
1320 else 1336 else
1321 return NULL; 1337 return NULL;
1338 case MLX5_FLOW_NAMESPACE_ESW_EGRESS:
1339 if (dev->priv.esw_egress_root_ns)
1340 return &dev->priv.esw_egress_root_ns->ns;
1341 else
1342 return NULL;
1343 case MLX5_FLOW_NAMESPACE_ESW_INGRESS:
1344 if (dev->priv.esw_ingress_root_ns)
1345 return &dev->priv.esw_ingress_root_ns->ns;
1346 else
1347 return NULL;
1322 default: 1348 default:
1323 return NULL; 1349 return NULL;
1324 } 1350 }
@@ -1699,6 +1725,8 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev)
1699{ 1725{
1700 cleanup_root_ns(dev); 1726 cleanup_root_ns(dev);
1701 cleanup_single_prio_root_ns(dev, dev->priv.fdb_root_ns); 1727 cleanup_single_prio_root_ns(dev, dev->priv.fdb_root_ns);
1728 cleanup_single_prio_root_ns(dev, dev->priv.esw_egress_root_ns);
1729 cleanup_single_prio_root_ns(dev, dev->priv.esw_ingress_root_ns);
1702} 1730}
1703 1731
1704static int init_fdb_root_ns(struct mlx5_core_dev *dev) 1732static int init_fdb_root_ns(struct mlx5_core_dev *dev)
@@ -1719,6 +1747,38 @@ static int init_fdb_root_ns(struct mlx5_core_dev *dev)
1719 } 1747 }
1720} 1748}
1721 1749
1750static int init_egress_acl_root_ns(struct mlx5_core_dev *dev)
1751{
1752 struct fs_prio *prio;
1753
1754 dev->priv.esw_egress_root_ns = create_root_ns(dev, FS_FT_ESW_EGRESS_ACL);
1755 if (!dev->priv.esw_egress_root_ns)
1756 return -ENOMEM;
1757
1758 /* create 1 prio*/
1759 prio = fs_create_prio(&dev->priv.esw_egress_root_ns->ns, 0, MLX5_TOTAL_VPORTS(dev));
1760 if (IS_ERR(prio))
1761 return PTR_ERR(prio);
1762 else
1763 return 0;
1764}
1765
1766static int init_ingress_acl_root_ns(struct mlx5_core_dev *dev)
1767{
1768 struct fs_prio *prio;
1769
1770 dev->priv.esw_ingress_root_ns = create_root_ns(dev, FS_FT_ESW_INGRESS_ACL);
1771 if (!dev->priv.esw_ingress_root_ns)
1772 return -ENOMEM;
1773
1774 /* create 1 prio*/
1775 prio = fs_create_prio(&dev->priv.esw_ingress_root_ns->ns, 0, MLX5_TOTAL_VPORTS(dev));
1776 if (IS_ERR(prio))
1777 return PTR_ERR(prio);
1778 else
1779 return 0;
1780}
1781
1722int mlx5_init_fs(struct mlx5_core_dev *dev) 1782int mlx5_init_fs(struct mlx5_core_dev *dev)
1723{ 1783{
1724 int err = 0; 1784 int err = 0;
@@ -1731,8 +1791,21 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
1731 if (MLX5_CAP_GEN(dev, eswitch_flow_table)) { 1791 if (MLX5_CAP_GEN(dev, eswitch_flow_table)) {
1732 err = init_fdb_root_ns(dev); 1792 err = init_fdb_root_ns(dev);
1733 if (err) 1793 if (err)
1734 cleanup_root_ns(dev); 1794 goto err;
1795 }
1796 if (MLX5_CAP_ESW_EGRESS_ACL(dev, ft_support)) {
1797 err = init_egress_acl_root_ns(dev);
1798 if (err)
1799 goto err;
1800 }
1801 if (MLX5_CAP_ESW_INGRESS_ACL(dev, ft_support)) {
1802 err = init_ingress_acl_root_ns(dev);
1803 if (err)
1804 goto err;
1735 } 1805 }
1736 1806
1807 return 0;
1808err:
1809 mlx5_cleanup_fs(dev);
1737 return err; 1810 return err;
1738} 1811}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
index d607e564f454..8e76cc505f5a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
@@ -45,8 +45,10 @@ enum fs_node_type {
45}; 45};
46 46
47enum fs_flow_table_type { 47enum fs_flow_table_type {
48 FS_FT_NIC_RX = 0x0, 48 FS_FT_NIC_RX = 0x0,
49 FS_FT_FDB = 0X4, 49 FS_FT_ESW_EGRESS_ACL = 0x2,
50 FS_FT_ESW_INGRESS_ACL = 0x3,
51 FS_FT_FDB = 0X4,
50}; 52};
51 53
52enum fs_fte_status { 54enum fs_fte_status {
@@ -79,6 +81,7 @@ struct mlx5_flow_rule {
79struct mlx5_flow_table { 81struct mlx5_flow_table {
80 struct fs_node node; 82 struct fs_node node;
81 u32 id; 83 u32 id;
84 u16 vport;
82 unsigned int max_fte; 85 unsigned int max_fte;
83 unsigned int level; 86 unsigned int level;
84 enum fs_flow_table_type type; 87 enum fs_flow_table_type type;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
index 0b0b226c789e..482604bd051c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
@@ -42,6 +42,8 @@
42#define DRIVER_VERSION "3.0-1" 42#define DRIVER_VERSION "3.0-1"
43#define DRIVER_RELDATE "January 2015" 43#define DRIVER_RELDATE "January 2015"
44 44
45#define MLX5_TOTAL_VPORTS(mdev) (1 + pci_sriov_get_totalvfs(mdev->pdev))
46
45extern int mlx5_core_debug_mask; 47extern int mlx5_core_debug_mask;
46 48
47#define mlx5_core_dbg(__dev, format, ...) \ 49#define mlx5_core_dbg(__dev, format, ...) \
diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h
index 8fecd6d6f814..ee0d5a937f02 100644
--- a/include/linux/mlx5/device.h
+++ b/include/linux/mlx5/device.h
@@ -1349,6 +1349,18 @@ enum mlx5_cap_type {
1349#define MLX5_CAP_ESW_FLOWTABLE_FDB_MAX(mdev, cap) \ 1349#define MLX5_CAP_ESW_FLOWTABLE_FDB_MAX(mdev, cap) \
1350 MLX5_CAP_ESW_FLOWTABLE_MAX(mdev, flow_table_properties_nic_esw_fdb.cap) 1350 MLX5_CAP_ESW_FLOWTABLE_MAX(mdev, flow_table_properties_nic_esw_fdb.cap)
1351 1351
1352#define MLX5_CAP_ESW_EGRESS_ACL(mdev, cap) \
1353 MLX5_CAP_ESW_FLOWTABLE(mdev, flow_table_properties_esw_acl_egress.cap)
1354
1355#define MLX5_CAP_ESW_EGRESS_ACL_MAX(mdev, cap) \
1356 MLX5_CAP_ESW_FLOWTABLE_MAX(mdev, flow_table_properties_esw_acl_egress.cap)
1357
1358#define MLX5_CAP_ESW_INGRESS_ACL(mdev, cap) \
1359 MLX5_CAP_ESW_FLOWTABLE(mdev, flow_table_properties_esw_acl_ingress.cap)
1360
1361#define MLX5_CAP_ESW_INGRESS_ACL_MAX(mdev, cap) \
1362 MLX5_CAP_ESW_FLOWTABLE_MAX(mdev, flow_table_properties_esw_acl_ingress.cap)
1363
1352#define MLX5_CAP_ESW(mdev, cap) \ 1364#define MLX5_CAP_ESW(mdev, cap) \
1353 MLX5_GET(e_switch_cap, \ 1365 MLX5_GET(e_switch_cap, \
1354 mdev->hca_caps_cur[MLX5_CAP_ESWITCH], cap) 1366 mdev->hca_caps_cur[MLX5_CAP_ESWITCH], cap)
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h
index d5529449ef47..9613143f0561 100644
--- a/include/linux/mlx5/driver.h
+++ b/include/linux/mlx5/driver.h
@@ -518,6 +518,8 @@ struct mlx5_priv {
518 unsigned long pci_dev_data; 518 unsigned long pci_dev_data;
519 struct mlx5_flow_root_namespace *root_ns; 519 struct mlx5_flow_root_namespace *root_ns;
520 struct mlx5_flow_root_namespace *fdb_root_ns; 520 struct mlx5_flow_root_namespace *fdb_root_ns;
521 struct mlx5_flow_root_namespace *esw_egress_root_ns;
522 struct mlx5_flow_root_namespace *esw_ingress_root_ns;
521}; 523};
522 524
523enum mlx5_device_state { 525enum mlx5_device_state {
diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h
index 165ff4f9cc6a..6467569ad76e 100644
--- a/include/linux/mlx5/fs.h
+++ b/include/linux/mlx5/fs.h
@@ -58,6 +58,8 @@ enum mlx5_flow_namespace_type {
58 MLX5_FLOW_NAMESPACE_LEFTOVERS, 58 MLX5_FLOW_NAMESPACE_LEFTOVERS,
59 MLX5_FLOW_NAMESPACE_ANCHOR, 59 MLX5_FLOW_NAMESPACE_ANCHOR,
60 MLX5_FLOW_NAMESPACE_FDB, 60 MLX5_FLOW_NAMESPACE_FDB,
61 MLX5_FLOW_NAMESPACE_ESW_EGRESS,
62 MLX5_FLOW_NAMESPACE_ESW_INGRESS,
61}; 63};
62 64
63struct mlx5_flow_table; 65struct mlx5_flow_table;
@@ -90,6 +92,11 @@ mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
90 int prio, 92 int prio,
91 int num_flow_table_entries, 93 int num_flow_table_entries,
92 u32 level); 94 u32 level);
95struct mlx5_flow_table *
96mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns,
97 int prio,
98 int num_flow_table_entries,
99 u32 level, u16 vport);
93int mlx5_destroy_flow_table(struct mlx5_flow_table *ft); 100int mlx5_destroy_flow_table(struct mlx5_flow_table *ft);
94 101
95/* inbox should be set with the following values: 102/* inbox should be set with the following values: