diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/qp.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/qp.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c index b8da72b29cf7..436ef6c69add 100644 --- a/drivers/net/ethernet/mellanox/mlx4/qp.c +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | |||
@@ -67,10 +67,18 @@ void mlx4_qp_event(struct mlx4_dev *dev, u32 qpn, int event_type) | |||
67 | complete(&qp->free); | 67 | complete(&qp->free); |
68 | } | 68 | } |
69 | 69 | ||
70 | static int is_qp0(struct mlx4_dev *dev, struct mlx4_qp *qp) | 70 | /* used for INIT/CLOSE port logic */ |
71 | static int is_qp0(struct mlx4_dev *dev, struct mlx4_qp *qp, int *real_qp0, int *proxy_qp0) | ||
71 | { | 72 | { |
72 | return qp->qpn >= dev->caps.sqp_start && | 73 | /* qp0 is either the proxy qp0, or the real qp0 */ |
74 | *proxy_qp0 = qp->qpn >= dev->caps.sqp_start && | ||
73 | qp->qpn <= dev->caps.sqp_start + 1; | 75 | qp->qpn <= dev->caps.sqp_start + 1; |
76 | |||
77 | *real_qp0 = mlx4_is_master(dev) && | ||
78 | qp->qpn >= dev->caps.base_sqpn && | ||
79 | qp->qpn <= dev->caps.base_sqpn + 1; | ||
80 | |||
81 | return *real_qp0 || *proxy_qp0; | ||
74 | } | 82 | } |
75 | 83 | ||
76 | static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | 84 | static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, |
@@ -122,6 +130,8 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
122 | struct mlx4_priv *priv = mlx4_priv(dev); | 130 | struct mlx4_priv *priv = mlx4_priv(dev); |
123 | struct mlx4_cmd_mailbox *mailbox; | 131 | struct mlx4_cmd_mailbox *mailbox; |
124 | int ret = 0; | 132 | int ret = 0; |
133 | int real_qp0 = 0; | ||
134 | int proxy_qp0 = 0; | ||
125 | u8 port; | 135 | u8 port; |
126 | 136 | ||
127 | if (cur_state >= MLX4_QP_NUM_STATE || new_state >= MLX4_QP_NUM_STATE || | 137 | if (cur_state >= MLX4_QP_NUM_STATE || new_state >= MLX4_QP_NUM_STATE || |
@@ -133,9 +143,12 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
133 | MLX4_CMD_2RST_QP, MLX4_CMD_TIME_CLASS_A, native); | 143 | MLX4_CMD_2RST_QP, MLX4_CMD_TIME_CLASS_A, native); |
134 | if (mlx4_is_master(dev) && cur_state != MLX4_QP_STATE_ERR && | 144 | if (mlx4_is_master(dev) && cur_state != MLX4_QP_STATE_ERR && |
135 | cur_state != MLX4_QP_STATE_RST && | 145 | cur_state != MLX4_QP_STATE_RST && |
136 | is_qp0(dev, qp)) { | 146 | is_qp0(dev, qp, &real_qp0, &proxy_qp0)) { |
137 | port = (qp->qpn & 1) + 1; | 147 | port = (qp->qpn & 1) + 1; |
138 | priv->mfunc.master.qp0_state[port].qp0_active = 0; | 148 | if (proxy_qp0) |
149 | priv->mfunc.master.qp0_state[port].proxy_qp0_active = 0; | ||
150 | else | ||
151 | priv->mfunc.master.qp0_state[port].qp0_active = 0; | ||
139 | } | 152 | } |
140 | return ret; | 153 | return ret; |
141 | } | 154 | } |
@@ -162,6 +175,23 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
162 | new_state == MLX4_QP_STATE_RST ? 2 : 0, | 175 | new_state == MLX4_QP_STATE_RST ? 2 : 0, |
163 | op[cur_state][new_state], MLX4_CMD_TIME_CLASS_C, native); | 176 | op[cur_state][new_state], MLX4_CMD_TIME_CLASS_C, native); |
164 | 177 | ||
178 | if (mlx4_is_master(dev) && is_qp0(dev, qp, &real_qp0, &proxy_qp0)) { | ||
179 | port = (qp->qpn & 1) + 1; | ||
180 | if (cur_state != MLX4_QP_STATE_ERR && | ||
181 | cur_state != MLX4_QP_STATE_RST && | ||
182 | new_state == MLX4_QP_STATE_ERR) { | ||
183 | if (proxy_qp0) | ||
184 | priv->mfunc.master.qp0_state[port].proxy_qp0_active = 0; | ||
185 | else | ||
186 | priv->mfunc.master.qp0_state[port].qp0_active = 0; | ||
187 | } else if (new_state == MLX4_QP_STATE_RTR) { | ||
188 | if (proxy_qp0) | ||
189 | priv->mfunc.master.qp0_state[port].proxy_qp0_active = 1; | ||
190 | else | ||
191 | priv->mfunc.master.qp0_state[port].qp0_active = 1; | ||
192 | } | ||
193 | } | ||
194 | |||
165 | mlx4_free_cmd_mailbox(dev, mailbox); | 195 | mlx4_free_cmd_mailbox(dev, mailbox); |
166 | return ret; | 196 | return ret; |
167 | } | 197 | } |