main.c (a22ed86cff363b2fdcdcd70e2412d8fc14ce905f) | main.c (e1f24a79f424ddb03828de7c0152668c9a30146e) |
---|---|
1/* 2 * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 43 unchanged lines hidden (view full) --- 52#include <linux/list.h> 53#include <rdma/ib_smi.h> 54#include <rdma/ib_umem.h> 55#include <linux/in.h> 56#include <linux/etherdevice.h> 57#include <linux/mlx5/fs.h> 58#include <linux/mlx5/vport.h> 59#include "mlx5_ib.h" | 1/* 2 * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 43 unchanged lines hidden (view full) --- 52#include <linux/list.h> 53#include <rdma/ib_smi.h> 54#include <rdma/ib_umem.h> 55#include <linux/in.h> 56#include <linux/etherdevice.h> 57#include <linux/mlx5/fs.h> 58#include <linux/mlx5/vport.h> 59#include "mlx5_ib.h" |
60#include "cmd.h" |
|
60 61#define DRIVER_NAME "mlx5_ib" 62#define DRIVER_VERSION "2.2-1" 63#define DRIVER_RELDATE "Feb 2014" 64 65MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>"); 66MODULE_DESCRIPTION("Mellanox Connect-IB HCA IB driver"); 67MODULE_LICENSE("Dual BSD/GPL"); --- 3140 unchanged lines hidden (view full) --- 3208 3209static void mlx5_disable_eth(struct mlx5_ib_dev *dev) 3210{ 3211 mlx5_eth_lag_cleanup(dev); 3212 if (MLX5_CAP_GEN(dev->mdev, roce)) 3213 mlx5_nic_vport_disable_roce(dev->mdev); 3214} 3215 | 61 62#define DRIVER_NAME "mlx5_ib" 63#define DRIVER_VERSION "2.2-1" 64#define DRIVER_RELDATE "Feb 2014" 65 66MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>"); 67MODULE_DESCRIPTION("Mellanox Connect-IB HCA IB driver"); 68MODULE_LICENSE("Dual BSD/GPL"); --- 3140 unchanged lines hidden (view full) --- 3209 3210static void mlx5_disable_eth(struct mlx5_ib_dev *dev) 3211{ 3212 mlx5_eth_lag_cleanup(dev); 3213 if (MLX5_CAP_GEN(dev->mdev, roce)) 3214 mlx5_nic_vport_disable_roce(dev->mdev); 3215} 3216 |
3216struct mlx5_ib_q_counter { | 3217struct mlx5_ib_counter { |
3217 const char *name; 3218 size_t offset; 3219}; 3220 3221#define INIT_Q_COUNTER(_name) \ 3222 { .name = #_name, .offset = MLX5_BYTE_OFF(query_q_counter_out, _name)} 3223 | 3218 const char *name; 3219 size_t offset; 3220}; 3221 3222#define INIT_Q_COUNTER(_name) \ 3223 { .name = #_name, .offset = MLX5_BYTE_OFF(query_q_counter_out, _name)} 3224 |
3224static const struct mlx5_ib_q_counter basic_q_cnts[] = { | 3225static const struct mlx5_ib_counter basic_q_cnts[] = { |
3225 INIT_Q_COUNTER(rx_write_requests), 3226 INIT_Q_COUNTER(rx_read_requests), 3227 INIT_Q_COUNTER(rx_atomic_requests), 3228 INIT_Q_COUNTER(out_of_buffer), 3229}; 3230 | 3226 INIT_Q_COUNTER(rx_write_requests), 3227 INIT_Q_COUNTER(rx_read_requests), 3228 INIT_Q_COUNTER(rx_atomic_requests), 3229 INIT_Q_COUNTER(out_of_buffer), 3230}; 3231 |
3231static const struct mlx5_ib_q_counter out_of_seq_q_cnts[] = { | 3232static const struct mlx5_ib_counter out_of_seq_q_cnts[] = { |
3232 INIT_Q_COUNTER(out_of_sequence), 3233}; 3234 | 3233 INIT_Q_COUNTER(out_of_sequence), 3234}; 3235 |
3235static const struct mlx5_ib_q_counter retrans_q_cnts[] = { | 3236static const struct mlx5_ib_counter retrans_q_cnts[] = { |
3236 INIT_Q_COUNTER(duplicate_request), 3237 INIT_Q_COUNTER(rnr_nak_retry_err), 3238 INIT_Q_COUNTER(packet_seq_err), 3239 INIT_Q_COUNTER(implied_nak_seq_err), 3240 INIT_Q_COUNTER(local_ack_timeout_err), 3241}; 3242 | 3237 INIT_Q_COUNTER(duplicate_request), 3238 INIT_Q_COUNTER(rnr_nak_retry_err), 3239 INIT_Q_COUNTER(packet_seq_err), 3240 INIT_Q_COUNTER(implied_nak_seq_err), 3241 INIT_Q_COUNTER(local_ack_timeout_err), 3242}; 3243 |
3243static void mlx5_ib_dealloc_q_counters(struct mlx5_ib_dev *dev) | 3244#define INIT_CONG_COUNTER(_name) \ 3245 { .name = #_name, .offset = \ 3246 MLX5_BYTE_OFF(query_cong_statistics_out, _name ## _high)} 3247 3248static const struct mlx5_ib_counter cong_cnts[] = { 3249 INIT_CONG_COUNTER(rp_cnp_ignored), 3250 INIT_CONG_COUNTER(rp_cnp_handled), 3251 INIT_CONG_COUNTER(np_ecn_marked_roce_packets), 3252 INIT_CONG_COUNTER(np_cnp_sent), 3253}; 3254 3255static void mlx5_ib_dealloc_counters(struct mlx5_ib_dev *dev) |
3244{ 3245 unsigned int i; 3246 3247 for (i = 0; i < dev->num_ports; i++) { 3248 mlx5_core_dealloc_q_counter(dev->mdev, | 3256{ 3257 unsigned int i; 3258 3259 for (i = 0; i < dev->num_ports; i++) { 3260 mlx5_core_dealloc_q_counter(dev->mdev, |
3249 dev->port[i].q_cnts.set_id); 3250 kfree(dev->port[i].q_cnts.names); 3251 kfree(dev->port[i].q_cnts.offsets); | 3261 dev->port[i].cnts.set_id); 3262 kfree(dev->port[i].cnts.names); 3263 kfree(dev->port[i].cnts.offsets); |
3252 } 3253} 3254 | 3264 } 3265} 3266 |
3255static int __mlx5_ib_alloc_q_counters(struct mlx5_ib_dev *dev, 3256 const char ***names, 3257 size_t **offsets, 3258 u32 *num) | 3267static int __mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev, 3268 struct mlx5_ib_counters *cnts) |
3259{ 3260 u32 num_counters; 3261 3262 num_counters = ARRAY_SIZE(basic_q_cnts); 3263 3264 if (MLX5_CAP_GEN(dev->mdev, out_of_seq_cnt)) 3265 num_counters += ARRAY_SIZE(out_of_seq_q_cnts); 3266 3267 if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) 3268 num_counters += ARRAY_SIZE(retrans_q_cnts); | 3269{ 3270 u32 num_counters; 3271 3272 num_counters = ARRAY_SIZE(basic_q_cnts); 3273 3274 if (MLX5_CAP_GEN(dev->mdev, out_of_seq_cnt)) 3275 num_counters += ARRAY_SIZE(out_of_seq_q_cnts); 3276 3277 if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) 3278 num_counters += ARRAY_SIZE(retrans_q_cnts); |
3279 cnts->num_q_counters = num_counters; |
|
3269 | 3280 |
3270 *names = kcalloc(num_counters, sizeof(**names), GFP_KERNEL); 3271 if (!*names) | 3281 if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) { 3282 cnts->num_cong_counters = ARRAY_SIZE(cong_cnts); 3283 num_counters += ARRAY_SIZE(cong_cnts); 3284 } 3285 3286 cnts->names = kcalloc(num_counters, sizeof(cnts->names), GFP_KERNEL); 3287 if (!cnts->names) |
3272 return -ENOMEM; 3273 | 3288 return -ENOMEM; 3289 |
3274 *offsets = kcalloc(num_counters, sizeof(**offsets), GFP_KERNEL); 3275 if (!*offsets) | 3290 cnts->offsets = kcalloc(num_counters, 3291 sizeof(cnts->offsets), GFP_KERNEL); 3292 if (!cnts->offsets) |
3276 goto err_names; 3277 | 3293 goto err_names; 3294 |
3278 *num = num_counters; 3279 | |
3280 return 0; 3281 3282err_names: | 3295 return 0; 3296 3297err_names: |
3283 kfree(*names); | 3298 kfree(cnts->names); |
3284 return -ENOMEM; 3285} 3286 | 3299 return -ENOMEM; 3300} 3301 |
3287static void mlx5_ib_fill_q_counters(struct mlx5_ib_dev *dev, 3288 const char **names, 3289 size_t *offsets) | 3302static void mlx5_ib_fill_counters(struct mlx5_ib_dev *dev, 3303 const char **names, 3304 size_t *offsets) |
3290{ 3291 int i; 3292 int j = 0; 3293 3294 for (i = 0; i < ARRAY_SIZE(basic_q_cnts); i++, j++) { 3295 names[j] = basic_q_cnts[i].name; 3296 offsets[j] = basic_q_cnts[i].offset; 3297 } --- 6 unchanged lines hidden (view full) --- 3304 } 3305 3306 if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) { 3307 for (i = 0; i < ARRAY_SIZE(retrans_q_cnts); i++, j++) { 3308 names[j] = retrans_q_cnts[i].name; 3309 offsets[j] = retrans_q_cnts[i].offset; 3310 } 3311 } | 3305{ 3306 int i; 3307 int j = 0; 3308 3309 for (i = 0; i < ARRAY_SIZE(basic_q_cnts); i++, j++) { 3310 names[j] = basic_q_cnts[i].name; 3311 offsets[j] = basic_q_cnts[i].offset; 3312 } --- 6 unchanged lines hidden (view full) --- 3319 } 3320 3321 if (MLX5_CAP_GEN(dev->mdev, retransmission_q_counters)) { 3322 for (i = 0; i < ARRAY_SIZE(retrans_q_cnts); i++, j++) { 3323 names[j] = retrans_q_cnts[i].name; 3324 offsets[j] = retrans_q_cnts[i].offset; 3325 } 3326 } |
3327 3328 if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) { 3329 for (i = 0; i < ARRAY_SIZE(cong_cnts); i++, j++) { 3330 names[j] = cong_cnts[i].name; 3331 offsets[j] = cong_cnts[i].offset; 3332 } 3333 } |
|
3312} 3313 | 3334} 3335 |
3314static int mlx5_ib_alloc_q_counters(struct mlx5_ib_dev *dev) | 3336static int mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev) |
3315{ 3316 int i; 3317 int ret; 3318 3319 for (i = 0; i < dev->num_ports; i++) { 3320 struct mlx5_ib_port *port = &dev->port[i]; 3321 3322 ret = mlx5_core_alloc_q_counter(dev->mdev, | 3337{ 3338 int i; 3339 int ret; 3340 3341 for (i = 0; i < dev->num_ports; i++) { 3342 struct mlx5_ib_port *port = &dev->port[i]; 3343 3344 ret = mlx5_core_alloc_q_counter(dev->mdev, |
3323 &port->q_cnts.set_id); | 3345 &port->cnts.set_id); |
3324 if (ret) { 3325 mlx5_ib_warn(dev, 3326 "couldn't allocate queue counter for port %d, err %d\n", 3327 i + 1, ret); 3328 goto dealloc_counters; 3329 } 3330 | 3346 if (ret) { 3347 mlx5_ib_warn(dev, 3348 "couldn't allocate queue counter for port %d, err %d\n", 3349 i + 1, ret); 3350 goto dealloc_counters; 3351 } 3352 |
3331 ret = __mlx5_ib_alloc_q_counters(dev, 3332 &port->q_cnts.names, 3333 &port->q_cnts.offsets, 3334 &port->q_cnts.num_counters); | 3353 ret = __mlx5_ib_alloc_counters(dev, &port->cnts); |
3335 if (ret) 3336 goto dealloc_counters; 3337 | 3354 if (ret) 3355 goto dealloc_counters; 3356 |
3338 mlx5_ib_fill_q_counters(dev, port->q_cnts.names, 3339 port->q_cnts.offsets); | 3357 mlx5_ib_fill_counters(dev, port->cnts.names, 3358 port->cnts.offsets); |
3340 } 3341 3342 return 0; 3343 3344dealloc_counters: 3345 while (--i >= 0) 3346 mlx5_core_dealloc_q_counter(dev->mdev, | 3359 } 3360 3361 return 0; 3362 3363dealloc_counters: 3364 while (--i >= 0) 3365 mlx5_core_dealloc_q_counter(dev->mdev, |
3347 dev->port[i].q_cnts.set_id); | 3366 dev->port[i].cnts.set_id); |
3348 3349 return ret; 3350} 3351 3352static struct rdma_hw_stats *mlx5_ib_alloc_hw_stats(struct ib_device *ibdev, 3353 u8 port_num) 3354{ 3355 struct mlx5_ib_dev *dev = to_mdev(ibdev); 3356 struct mlx5_ib_port *port = &dev->port[port_num - 1]; 3357 3358 /* We support only per port stats */ 3359 if (port_num == 0) 3360 return NULL; 3361 | 3367 3368 return ret; 3369} 3370 3371static struct rdma_hw_stats *mlx5_ib_alloc_hw_stats(struct ib_device *ibdev, 3372 u8 port_num) 3373{ 3374 struct mlx5_ib_dev *dev = to_mdev(ibdev); 3375 struct mlx5_ib_port *port = &dev->port[port_num - 1]; 3376 3377 /* We support only per port stats */ 3378 if (port_num == 0) 3379 return NULL; 3380 |
3362 return rdma_alloc_hw_stats_struct(port->q_cnts.names, 3363 port->q_cnts.num_counters, | 3381 return rdma_alloc_hw_stats_struct(port->cnts.names, 3382 port->cnts.num_q_counters + 3383 port->cnts.num_cong_counters, |
3364 RDMA_HW_STATS_DEFAULT_LIFESPAN); 3365} 3366 | 3384 RDMA_HW_STATS_DEFAULT_LIFESPAN); 3385} 3386 |
3367static int mlx5_ib_get_hw_stats(struct ib_device *ibdev, 3368 struct rdma_hw_stats *stats, 3369 u8 port_num, int index) | 3387static int mlx5_ib_query_q_counters(struct mlx5_ib_dev *dev, 3388 struct mlx5_ib_port *port, 3389 struct rdma_hw_stats *stats) |
3370{ | 3390{ |
3371 struct mlx5_ib_dev *dev = to_mdev(ibdev); 3372 struct mlx5_ib_port *port = &dev->port[port_num - 1]; | |
3373 int outlen = MLX5_ST_SZ_BYTES(query_q_counter_out); 3374 void *out; 3375 __be32 val; | 3391 int outlen = MLX5_ST_SZ_BYTES(query_q_counter_out); 3392 void *out; 3393 __be32 val; |
3376 int ret; 3377 int i; | 3394 int ret, i; |
3378 | 3395 |
3379 if (!stats) 3380 return -ENOSYS; 3381 | |
3382 out = mlx5_vzalloc(outlen); 3383 if (!out) 3384 return -ENOMEM; 3385 3386 ret = mlx5_core_query_q_counter(dev->mdev, | 3396 out = mlx5_vzalloc(outlen); 3397 if (!out) 3398 return -ENOMEM; 3399 3400 ret = mlx5_core_query_q_counter(dev->mdev, |
3387 port->q_cnts.set_id, 0, | 3401 port->cnts.set_id, 0, |
3388 out, outlen); 3389 if (ret) 3390 goto free; 3391 | 3402 out, outlen); 3403 if (ret) 3404 goto free; 3405 |
3392 for (i = 0; i < port->q_cnts.num_counters; i++) { 3393 val = *(__be32 *)(out + port->q_cnts.offsets[i]); | 3406 for (i = 0; i < port->cnts.num_q_counters; i++) { 3407 val = *(__be32 *)(out + port->cnts.offsets[i]); |
3394 stats->value[i] = (u64)be32_to_cpu(val); 3395 } 3396 3397free: 3398 kvfree(out); | 3408 stats->value[i] = (u64)be32_to_cpu(val); 3409 } 3410 3411free: 3412 kvfree(out); |
3399 return port->q_cnts.num_counters; | 3413 return ret; |
3400} 3401 | 3414} 3415 |
3416static int mlx5_ib_query_cong_counters(struct mlx5_ib_dev *dev, 3417 struct mlx5_ib_port *port, 3418 struct rdma_hw_stats *stats) 3419{ 3420 int outlen = MLX5_ST_SZ_BYTES(query_cong_statistics_out); 3421 void *out; 3422 int ret, i; 3423 int offset = port->cnts.num_q_counters; 3424 3425 out = mlx5_vzalloc(outlen); 3426 if (!out) 3427 return -ENOMEM; 3428 3429 ret = mlx5_cmd_query_cong_counter(dev->mdev, false, out, outlen); 3430 if (ret) 3431 goto free; 3432 3433 for (i = 0; i < port->cnts.num_cong_counters; i++) { 3434 stats->value[i + offset] = 3435 be64_to_cpup((__be64 *)(out + 3436 port->cnts.offsets[i + offset])); 3437 } 3438 3439free: 3440 kvfree(out); 3441 return ret; 3442} 3443 3444static int mlx5_ib_get_hw_stats(struct ib_device *ibdev, 3445 struct rdma_hw_stats *stats, 3446 u8 port_num, int index) 3447{ 3448 struct mlx5_ib_dev *dev = to_mdev(ibdev); 3449 struct mlx5_ib_port *port = &dev->port[port_num - 1]; 3450 int ret, num_counters; 3451 3452 if (!stats) 3453 return -EINVAL; 3454 3455 ret = mlx5_ib_query_q_counters(dev, port, stats); 3456 if (ret) 3457 return ret; 3458 num_counters = port->cnts.num_q_counters; 3459 3460 if (MLX5_CAP_GEN(dev->mdev, cc_query_allowed)) { 3461 ret = mlx5_ib_query_cong_counters(dev, port, stats); 3462 if (ret) 3463 return ret; 3464 num_counters += port->cnts.num_cong_counters; 3465 } 3466 3467 return num_counters; 3468} 3469 |
|
3402static void *mlx5_ib_add(struct mlx5_core_dev *mdev) 3403{ 3404 struct mlx5_ib_dev *dev; 3405 enum rdma_link_layer ll; 3406 int port_type_cap; 3407 const char *name; 3408 int err; 3409 int i; --- 188 unchanged lines hidden (view full) --- 3598 if (err) 3599 goto err_disable_eth; 3600 3601 err = mlx5_ib_odp_init_one(dev); 3602 if (err) 3603 goto err_rsrc; 3604 3605 if (MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) { | 3470static void *mlx5_ib_add(struct mlx5_core_dev *mdev) 3471{ 3472 struct mlx5_ib_dev *dev; 3473 enum rdma_link_layer ll; 3474 int port_type_cap; 3475 const char *name; 3476 int err; 3477 int i; --- 188 unchanged lines hidden (view full) --- 3666 if (err) 3667 goto err_disable_eth; 3668 3669 err = mlx5_ib_odp_init_one(dev); 3670 if (err) 3671 goto err_rsrc; 3672 3673 if (MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) { |
3606 err = mlx5_ib_alloc_q_counters(dev); | 3674 err = mlx5_ib_alloc_counters(dev); |
3607 if (err) 3608 goto err_odp; 3609 } 3610 3611 dev->mdev->priv.uar = mlx5_get_uars_page(dev->mdev); 3612 if (!dev->mdev->priv.uar) | 3675 if (err) 3676 goto err_odp; 3677 } 3678 3679 dev->mdev->priv.uar = mlx5_get_uars_page(dev->mdev); 3680 if (!dev->mdev->priv.uar) |
3613 goto err_q_cnt; | 3681 goto err_cnt; |
3614 3615 err = mlx5_alloc_bfreg(dev->mdev, &dev->bfreg, false, false); 3616 if (err) 3617 goto err_uar_page; 3618 3619 err = mlx5_alloc_bfreg(dev->mdev, &dev->fp_bfreg, false, true); 3620 if (err) 3621 goto err_bfreg; --- 27 unchanged lines hidden (view full) --- 3649 mlx5_free_bfreg(dev->mdev, &dev->fp_bfreg); 3650 3651err_bfreg: 3652 mlx5_free_bfreg(dev->mdev, &dev->bfreg); 3653 3654err_uar_page: 3655 mlx5_put_uars_page(dev->mdev, dev->mdev->priv.uar); 3656 | 3682 3683 err = mlx5_alloc_bfreg(dev->mdev, &dev->bfreg, false, false); 3684 if (err) 3685 goto err_uar_page; 3686 3687 err = mlx5_alloc_bfreg(dev->mdev, &dev->fp_bfreg, false, true); 3688 if (err) 3689 goto err_bfreg; --- 27 unchanged lines hidden (view full) --- 3717 mlx5_free_bfreg(dev->mdev, &dev->fp_bfreg); 3718 3719err_bfreg: 3720 mlx5_free_bfreg(dev->mdev, &dev->bfreg); 3721 3722err_uar_page: 3723 mlx5_put_uars_page(dev->mdev, dev->mdev->priv.uar); 3724 |
3657err_q_cnt: | 3725err_cnt: |
3658 if (MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) | 3726 if (MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) |
3659 mlx5_ib_dealloc_q_counters(dev); | 3727 mlx5_ib_dealloc_counters(dev); |
3660 3661err_odp: 3662 mlx5_ib_odp_remove_one(dev); 3663 3664err_rsrc: 3665 destroy_dev_resources(&dev->devr); 3666 3667err_disable_eth: --- 17 unchanged lines hidden (view full) --- 3685 enum rdma_link_layer ll = mlx5_ib_port_link_layer(&dev->ib_dev, 1); 3686 3687 mlx5_remove_netdev_notifier(dev); 3688 ib_unregister_device(&dev->ib_dev); 3689 mlx5_free_bfreg(dev->mdev, &dev->fp_bfreg); 3690 mlx5_free_bfreg(dev->mdev, &dev->bfreg); 3691 mlx5_put_uars_page(dev->mdev, mdev->priv.uar); 3692 if (MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) | 3728 3729err_odp: 3730 mlx5_ib_odp_remove_one(dev); 3731 3732err_rsrc: 3733 destroy_dev_resources(&dev->devr); 3734 3735err_disable_eth: --- 17 unchanged lines hidden (view full) --- 3753 enum rdma_link_layer ll = mlx5_ib_port_link_layer(&dev->ib_dev, 1); 3754 3755 mlx5_remove_netdev_notifier(dev); 3756 ib_unregister_device(&dev->ib_dev); 3757 mlx5_free_bfreg(dev->mdev, &dev->fp_bfreg); 3758 mlx5_free_bfreg(dev->mdev, &dev->bfreg); 3759 mlx5_put_uars_page(dev->mdev, mdev->priv.uar); 3760 if (MLX5_CAP_GEN(dev->mdev, max_qp_cnt)) |
3693 mlx5_ib_dealloc_q_counters(dev); | 3761 mlx5_ib_dealloc_counters(dev); |
3694 destroy_umrc_res(dev); 3695 mlx5_ib_odp_remove_one(dev); 3696 destroy_dev_resources(&dev->devr); 3697 if (ll == IB_LINK_LAYER_ETHERNET) 3698 mlx5_disable_eth(dev); 3699 kfree(dev->port); 3700 ib_dealloc_device(&dev->ib_dev); 3701} --- 29 unchanged lines hidden --- | 3762 destroy_umrc_res(dev); 3763 mlx5_ib_odp_remove_one(dev); 3764 destroy_dev_resources(&dev->devr); 3765 if (ll == IB_LINK_LAYER_ETHERNET) 3766 mlx5_disable_eth(dev); 3767 kfree(dev->port); 3768 ib_dealloc_device(&dev->ib_dev); 3769} --- 29 unchanged lines hidden --- |