aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx4/main.c8
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c99
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c32
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h21
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mr.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/port.c87
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/qp.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/resource_tracker.c510
-rw-r--r--include/linux/mlx4/device.h20
11 files changed, 675 insertions, 120 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c
index f0612645de99..7567437dbd34 100644
--- a/drivers/infiniband/hw/mlx4/main.c
+++ b/drivers/infiniband/hw/mlx4/main.c
@@ -177,18 +177,18 @@ static int mlx4_ib_query_device(struct ib_device *ibdev,
177 177
178 props->max_mr_size = ~0ull; 178 props->max_mr_size = ~0ull;
179 props->page_size_cap = dev->dev->caps.page_size_cap; 179 props->page_size_cap = dev->dev->caps.page_size_cap;
180 props->max_qp = dev->dev->caps.num_qps - dev->dev->caps.reserved_qps; 180 props->max_qp = dev->dev->quotas.qp;
181 props->max_qp_wr = dev->dev->caps.max_wqes - MLX4_IB_SQ_MAX_SPARE; 181 props->max_qp_wr = dev->dev->caps.max_wqes - MLX4_IB_SQ_MAX_SPARE;
182 props->max_sge = min(dev->dev->caps.max_sq_sg, 182 props->max_sge = min(dev->dev->caps.max_sq_sg,
183 dev->dev->caps.max_rq_sg); 183 dev->dev->caps.max_rq_sg);
184 props->max_cq = dev->dev->caps.num_cqs - dev->dev->caps.reserved_cqs; 184 props->max_cq = dev->dev->quotas.cq;
185 props->max_cqe = dev->dev->caps.max_cqes; 185 props->max_cqe = dev->dev->caps.max_cqes;
186 props->max_mr = dev->dev->caps.num_mpts - dev->dev->caps.reserved_mrws; 186 props->max_mr = dev->dev->quotas.mpt;
187 props->max_pd = dev->dev->caps.num_pds - dev->dev->caps.reserved_pds; 187 props->max_pd = dev->dev->caps.num_pds - dev->dev->caps.reserved_pds;
188 props->max_qp_rd_atom = dev->dev->caps.max_qp_dest_rdma; 188 props->max_qp_rd_atom = dev->dev->caps.max_qp_dest_rdma;
189 props->max_qp_init_rd_atom = dev->dev->caps.max_qp_init_rdma; 189 props->max_qp_init_rd_atom = dev->dev->caps.max_qp_init_rdma;
190 props->max_res_rd_atom = props->max_qp_rd_atom * props->max_qp; 190 props->max_res_rd_atom = props->max_qp_rd_atom * props->max_qp;
191 props->max_srq = dev->dev->caps.num_srqs - dev->dev->caps.reserved_srqs; 191 props->max_srq = dev->dev->quotas.srq;
192 props->max_srq_wr = dev->dev->caps.max_srq_wqes - 1; 192 props->max_srq_wr = dev->dev->caps.max_srq_wqes - 1;
193 props->max_srq_sge = dev->dev->caps.max_srq_sge; 193 props->max_srq_sge = dev->dev->caps.max_srq_sge;
194 props->max_fast_reg_page_list_len = MLX4_MAX_FAST_REG_PAGES; 194 props->max_fast_reg_page_list_len = MLX4_MAX_FAST_REG_PAGES;
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index ae8eb4c4fb6c..65d41b76fa2c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -1687,7 +1687,7 @@ static void mlx4_master_deactivate_admin_state(struct mlx4_priv *priv, int slave
1687 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port]; 1687 vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port];
1688 if (NO_INDX != vp_oper->vlan_idx) { 1688 if (NO_INDX != vp_oper->vlan_idx) {
1689 __mlx4_unregister_vlan(&priv->dev, 1689 __mlx4_unregister_vlan(&priv->dev,
1690 port, vp_oper->vlan_idx); 1690 port, vp_oper->state.default_vlan);
1691 vp_oper->vlan_idx = NO_INDX; 1691 vp_oper->vlan_idx = NO_INDX;
1692 } 1692 }
1693 if (NO_INDX != vp_oper->mac_idx) { 1693 if (NO_INDX != vp_oper->mac_idx) {
@@ -1718,6 +1718,7 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd,
1718 if (cmd == MLX4_COMM_CMD_RESET) { 1718 if (cmd == MLX4_COMM_CMD_RESET) {
1719 mlx4_warn(dev, "Received reset from slave:%d\n", slave); 1719 mlx4_warn(dev, "Received reset from slave:%d\n", slave);
1720 slave_state[slave].active = false; 1720 slave_state[slave].active = false;
1721 slave_state[slave].old_vlan_api = false;
1721 mlx4_master_deactivate_admin_state(priv, slave); 1722 mlx4_master_deactivate_admin_state(priv, slave);
1722 for (i = 0; i < MLX4_EVENT_TYPES_NUM; ++i) { 1723 for (i = 0; i < MLX4_EVENT_TYPES_NUM; ++i) {
1723 slave_state[slave].event_eq[i].eqn = -1; 1724 slave_state[slave].event_eq[i].eqn = -1;
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 85d91665d400..b5554121aca4 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -417,7 +417,6 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev,
417 struct mlx4_en_priv *priv = netdev_priv(dev); 417 struct mlx4_en_priv *priv = netdev_priv(dev);
418 struct mlx4_en_dev *mdev = priv->mdev; 418 struct mlx4_en_dev *mdev = priv->mdev;
419 int err; 419 int err;
420 int idx;
421 420
422 en_dbg(HW, priv, "Killing VID:%d\n", vid); 421 en_dbg(HW, priv, "Killing VID:%d\n", vid);
423 422
@@ -425,10 +424,7 @@ static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev,
425 424
426 /* Remove VID from port VLAN filter */ 425 /* Remove VID from port VLAN filter */
427 mutex_lock(&mdev->state_lock); 426 mutex_lock(&mdev->state_lock);
428 if (!mlx4_find_cached_vlan(mdev->dev, priv->port, vid, &idx)) 427 mlx4_unregister_vlan(mdev->dev, priv->port, vid);
429 mlx4_unregister_vlan(mdev->dev, priv->port, idx);
430 else
431 en_dbg(HW, priv, "could not find vid %d in cache\n", vid);
432 428
433 if (mdev->device_up && priv->port_up) { 429 if (mdev->device_up && priv->port_up) {
434 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); 430 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv);
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index c151e7a6710a..c3e70bc2d875 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -177,6 +177,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
177 struct mlx4_cmd_mailbox *outbox, 177 struct mlx4_cmd_mailbox *outbox,
178 struct mlx4_cmd_info *cmd) 178 struct mlx4_cmd_info *cmd)
179{ 179{
180 struct mlx4_priv *priv = mlx4_priv(dev);
180 u8 field; 181 u8 field;
181 u32 size; 182 u32 size;
182 int err = 0; 183 int err = 0;
@@ -185,18 +186,26 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
185#define QUERY_FUNC_CAP_NUM_PORTS_OFFSET 0x1 186#define QUERY_FUNC_CAP_NUM_PORTS_OFFSET 0x1
186#define QUERY_FUNC_CAP_PF_BHVR_OFFSET 0x4 187#define QUERY_FUNC_CAP_PF_BHVR_OFFSET 0x4
187#define QUERY_FUNC_CAP_FMR_OFFSET 0x8 188#define QUERY_FUNC_CAP_FMR_OFFSET 0x8
188#define QUERY_FUNC_CAP_QP_QUOTA_OFFSET 0x10 189#define QUERY_FUNC_CAP_QP_QUOTA_OFFSET_DEP 0x10
189#define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET 0x14 190#define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET_DEP 0x14
190#define QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET 0x18 191#define QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET_DEP 0x18
191#define QUERY_FUNC_CAP_MPT_QUOTA_OFFSET 0x20 192#define QUERY_FUNC_CAP_MPT_QUOTA_OFFSET_DEP 0x20
192#define QUERY_FUNC_CAP_MTT_QUOTA_OFFSET 0x24 193#define QUERY_FUNC_CAP_MTT_QUOTA_OFFSET_DEP 0x24
193#define QUERY_FUNC_CAP_MCG_QUOTA_OFFSET 0x28 194#define QUERY_FUNC_CAP_MCG_QUOTA_OFFSET_DEP 0x28
194#define QUERY_FUNC_CAP_MAX_EQ_OFFSET 0x2c 195#define QUERY_FUNC_CAP_MAX_EQ_OFFSET 0x2c
195#define QUERY_FUNC_CAP_RESERVED_EQ_OFFSET 0x30 196#define QUERY_FUNC_CAP_RESERVED_EQ_OFFSET 0x30
196 197
198#define QUERY_FUNC_CAP_QP_QUOTA_OFFSET 0x50
199#define QUERY_FUNC_CAP_CQ_QUOTA_OFFSET 0x54
200#define QUERY_FUNC_CAP_SRQ_QUOTA_OFFSET 0x58
201#define QUERY_FUNC_CAP_MPT_QUOTA_OFFSET 0x60
202#define QUERY_FUNC_CAP_MTT_QUOTA_OFFSET 0x64
203#define QUERY_FUNC_CAP_MCG_QUOTA_OFFSET 0x68
204
197#define QUERY_FUNC_CAP_FMR_FLAG 0x80 205#define QUERY_FUNC_CAP_FMR_FLAG 0x80
198#define QUERY_FUNC_CAP_FLAG_RDMA 0x40 206#define QUERY_FUNC_CAP_FLAG_RDMA 0x40
199#define QUERY_FUNC_CAP_FLAG_ETH 0x80 207#define QUERY_FUNC_CAP_FLAG_ETH 0x80
208#define QUERY_FUNC_CAP_FLAG_QUOTAS 0x10
200 209
201/* when opcode modifier = 1 */ 210/* when opcode modifier = 1 */
202#define QUERY_FUNC_CAP_PHYS_PORT_OFFSET 0x3 211#define QUERY_FUNC_CAP_PHYS_PORT_OFFSET 0x3
@@ -237,8 +246,9 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
237 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP1_PROXY); 246 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP1_PROXY);
238 247
239 } else if (vhcr->op_modifier == 0) { 248 } else if (vhcr->op_modifier == 0) {
240 /* enable rdma and ethernet interfaces */ 249 /* enable rdma and ethernet interfaces, and new quota locations */
241 field = (QUERY_FUNC_CAP_FLAG_ETH | QUERY_FUNC_CAP_FLAG_RDMA); 250 field = (QUERY_FUNC_CAP_FLAG_ETH | QUERY_FUNC_CAP_FLAG_RDMA |
251 QUERY_FUNC_CAP_FLAG_QUOTAS);
242 MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS_OFFSET); 252 MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS_OFFSET);
243 253
244 field = dev->caps.num_ports; 254 field = dev->caps.num_ports;
@@ -250,14 +260,20 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
250 field = 0; /* protected FMR support not available as yet */ 260 field = 0; /* protected FMR support not available as yet */
251 MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FMR_OFFSET); 261 MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FMR_OFFSET);
252 262
253 size = dev->caps.num_qps; 263 size = priv->mfunc.master.res_tracker.res_alloc[RES_QP].quota[slave];
254 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP_QUOTA_OFFSET); 264 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP_QUOTA_OFFSET);
265 size = dev->caps.num_qps;
266 MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP_QUOTA_OFFSET_DEP);
255