| .. | .. |
|---|
| 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) |
|---|