.. | .. |
---|
146 | 146 | .ndo_open = mlx5i_pkey_open, |
---|
147 | 147 | .ndo_stop = mlx5i_pkey_close, |
---|
148 | 148 | .ndo_init = mlx5i_pkey_dev_init, |
---|
| 149 | + .ndo_get_stats64 = mlx5i_get_stats, |
---|
149 | 150 | .ndo_uninit = mlx5i_pkey_dev_cleanup, |
---|
150 | 151 | .ndo_change_mtu = mlx5i_pkey_change_mtu, |
---|
151 | 152 | .ndo_do_ioctl = mlx5i_pkey_ioctl, |
---|
.. | .. |
---|
203 | 204 | goto err_release_lock; |
---|
204 | 205 | } |
---|
205 | 206 | |
---|
206 | | - err = mlx5_fs_add_rx_underlay_qpn(mdev, ipriv->qp.qpn); |
---|
| 207 | + err = mlx5_fs_add_rx_underlay_qpn(mdev, ipriv->qpn); |
---|
207 | 208 | if (err) { |
---|
208 | 209 | mlx5_core_warn(mdev, "attach child underlay qp to ft failed, %d\n", err); |
---|
209 | 210 | goto err_unint_underlay_qp; |
---|
210 | 211 | } |
---|
211 | 212 | |
---|
212 | | - err = mlx5e_create_tis(mdev, 0 /* tc */, ipriv->qp.qpn, &epriv->tisn[0]); |
---|
| 213 | + err = mlx5i_create_tis(mdev, ipriv->qpn, &epriv->tisn[0][0]); |
---|
213 | 214 | if (err) { |
---|
214 | 215 | mlx5_core_warn(mdev, "create child tis failed, %d\n", err); |
---|
215 | 216 | goto err_remove_rx_uderlay_qp; |
---|
.. | .. |
---|
220 | 221 | mlx5_core_warn(mdev, "opening child channels failed, %d\n", err); |
---|
221 | 222 | goto err_clear_state_opened_flag; |
---|
222 | 223 | } |
---|
223 | | - mlx5e_refresh_tirs(epriv, false); |
---|
| 224 | + epriv->profile->update_rx(epriv); |
---|
224 | 225 | mlx5e_activate_priv_channels(epriv); |
---|
225 | 226 | mutex_unlock(&epriv->state_lock); |
---|
226 | 227 | |
---|
227 | 228 | return 0; |
---|
228 | 229 | |
---|
229 | 230 | err_clear_state_opened_flag: |
---|
230 | | - mlx5e_destroy_tis(mdev, epriv->tisn[0]); |
---|
| 231 | + mlx5e_destroy_tis(mdev, epriv->tisn[0][0]); |
---|
231 | 232 | err_remove_rx_uderlay_qp: |
---|
232 | | - mlx5_fs_remove_rx_underlay_qpn(mdev, ipriv->qp.qpn); |
---|
| 233 | + mlx5_fs_remove_rx_underlay_qpn(mdev, ipriv->qpn); |
---|
233 | 234 | err_unint_underlay_qp: |
---|
234 | 235 | mlx5i_uninit_underlay_qp(epriv); |
---|
235 | 236 | err_release_lock: |
---|
.. | .. |
---|
252 | 253 | clear_bit(MLX5E_STATE_OPENED, &priv->state); |
---|
253 | 254 | |
---|
254 | 255 | netif_carrier_off(priv->netdev); |
---|
255 | | - mlx5_fs_remove_rx_underlay_qpn(mdev, ipriv->qp.qpn); |
---|
| 256 | + mlx5_fs_remove_rx_underlay_qpn(mdev, ipriv->qpn); |
---|
256 | 257 | mlx5i_uninit_underlay_qp(priv); |
---|
257 | 258 | mlx5e_deactivate_priv_channels(priv); |
---|
258 | 259 | mlx5e_close_channels(&priv->channels); |
---|
259 | | - mlx5e_destroy_tis(mdev, priv->tisn[0]); |
---|
| 260 | + mlx5e_destroy_tis(mdev, priv->tisn[0][0]); |
---|
260 | 261 | unlock: |
---|
261 | 262 | mutex_unlock(&priv->state_lock); |
---|
262 | 263 | return 0; |
---|
.. | .. |
---|
274 | 275 | } |
---|
275 | 276 | |
---|
276 | 277 | /* Called directly after IPoIB netdevice was created to initialize SW structs */ |
---|
277 | | -static void mlx5i_pkey_init(struct mlx5_core_dev *mdev, |
---|
278 | | - struct net_device *netdev, |
---|
279 | | - const struct mlx5e_profile *profile, |
---|
280 | | - void *ppriv) |
---|
| 278 | +static int mlx5i_pkey_init(struct mlx5_core_dev *mdev, |
---|
| 279 | + struct net_device *netdev, |
---|
| 280 | + const struct mlx5e_profile *profile, |
---|
| 281 | + void *ppriv) |
---|
281 | 282 | { |
---|
282 | 283 | struct mlx5e_priv *priv = mlx5i_epriv(netdev); |
---|
| 284 | + int err; |
---|
283 | 285 | |
---|
284 | | - mlx5i_init(mdev, netdev, profile, ppriv); |
---|
| 286 | + err = mlx5i_init(mdev, netdev, profile, ppriv); |
---|
| 287 | + if (err) |
---|
| 288 | + return err; |
---|
285 | 289 | |
---|
286 | 290 | /* Override parent ndo */ |
---|
287 | 291 | netdev->netdev_ops = &mlx5i_pkey_netdev_ops; |
---|
.. | .. |
---|
291 | 295 | |
---|
292 | 296 | /* Use dummy rqs */ |
---|
293 | 297 | priv->channels.params.log_rq_mtu_frames = MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE; |
---|
| 298 | + |
---|
| 299 | + return 0; |
---|
294 | 300 | } |
---|
295 | 301 | |
---|
296 | 302 | /* Called directly before IPoIB netdevice is destroyed to cleanup SW structs */ |
---|
297 | 303 | static void mlx5i_pkey_cleanup(struct mlx5e_priv *priv) |
---|
298 | 304 | { |
---|
299 | | - /* Do nothing .. */ |
---|
| 305 | + mlx5i_cleanup(priv); |
---|
300 | 306 | } |
---|
301 | 307 | |
---|
302 | 308 | static int mlx5i_pkey_init_tx(struct mlx5e_priv *priv) |
---|
303 | 309 | { |
---|
304 | | - struct mlx5i_priv *ipriv = priv->ppriv; |
---|
305 | 310 | int err; |
---|
306 | 311 | |
---|
307 | | - err = mlx5i_create_underlay_qp(priv->mdev, &ipriv->qp); |
---|
308 | | - if (err) { |
---|
| 312 | + err = mlx5i_create_underlay_qp(priv); |
---|
| 313 | + if (err) |
---|
309 | 314 | mlx5_core_warn(priv->mdev, "create child underlay QP failed, %d\n", err); |
---|
310 | | - return err; |
---|
311 | | - } |
---|
312 | 315 | |
---|
313 | | - return 0; |
---|
| 316 | + return err; |
---|
314 | 317 | } |
---|
315 | 318 | |
---|
316 | 319 | static void mlx5i_pkey_cleanup_tx(struct mlx5e_priv *priv) |
---|
317 | 320 | { |
---|
318 | 321 | struct mlx5i_priv *ipriv = priv->ppriv; |
---|
319 | 322 | |
---|
320 | | - mlx5i_destroy_underlay_qp(priv->mdev, &ipriv->qp); |
---|
| 323 | + mlx5i_destroy_underlay_qp(priv->mdev, ipriv->qpn); |
---|
321 | 324 | } |
---|
322 | 325 | |
---|
323 | 326 | static int mlx5i_pkey_init_rx(struct mlx5e_priv *priv) |
---|
.. | .. |
---|
344 | 347 | .cleanup_rx = mlx5i_pkey_cleanup_rx, |
---|
345 | 348 | .enable = NULL, |
---|
346 | 349 | .disable = NULL, |
---|
| 350 | + .update_rx = mlx5i_update_nic_rx, |
---|
347 | 351 | .update_stats = NULL, |
---|
348 | | - .max_nch = mlx5e_get_max_num_channels, |
---|
349 | | - .rx_handlers.handle_rx_cqe = mlx5i_handle_rx_cqe, |
---|
350 | | - .rx_handlers.handle_rx_cqe_mpwqe = NULL, /* Not supported */ |
---|
| 352 | + .rx_handlers = &mlx5i_rx_handlers, |
---|
351 | 353 | .max_tc = MLX5I_MAX_NUM_TC, |
---|
| 354 | + .rq_groups = MLX5E_NUM_RQ_GROUPS(REGULAR), |
---|
352 | 355 | }; |
---|
353 | 356 | |
---|
354 | 357 | const struct mlx5e_profile *mlx5i_pkey_get_profile(void) |
---|