diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cmd.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/fw.c | 99 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 32 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 21 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mr.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/port.c | 87 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/qp.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 510 | ||||
| -rw-r--r-- | include/linux/mlx4/device.h | 20 |
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 | |||
