diff options
author | Daniel Jurgens <danielj@mellanox.com> | 2018-02-25 06:39:53 -0500 |
---|---|---|
committer | Jason Gunthorpe <jgg@mellanox.com> | 2018-02-28 14:10:32 -0500 |
commit | aba462134634b502d720e15b23154f21cfa277e5 (patch) | |
tree | 769c0625c0793a928262d92e67263d949834b524 | |
parent | e7b169f34403becd3c9fd3b6e46614ab788f2187 (diff) |
{net, IB}/mlx5: Raise fatal IB event when sys error occurs
All other mlx5_events report the port number as 1 based, which is how FW
reports it in the port event EQE. Reporting 0 for this event causes
mlx5_ib to not raise a fatal event notification to registered clients
due to a seemingly invalid port.
All switch cases in mlx5_ib_event that go through the port check are
supposed to set the port now, so just do it once at variable
declaration.
Fixes: 89d44f0a6c73("net/mlx5_core: Add pci error handlers to mlx5_core driver")
Reviewed-by: Majd Dibbiny <majd@mellanox.com>
Signed-off-by: Daniel Jurgens <danielj@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/health.c | 2 |
2 files changed, 3 insertions, 10 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 4236c8086820..bab38c6647d7 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -3263,7 +3263,7 @@ static void mlx5_ib_handle_event(struct work_struct *_work) | |||
3263 | struct mlx5_ib_dev *ibdev; | 3263 | struct mlx5_ib_dev *ibdev; |
3264 | struct ib_event ibev; | 3264 | struct ib_event ibev; |
3265 | bool fatal = false; | 3265 | bool fatal = false; |
3266 | u8 port = 0; | 3266 | u8 port = (u8)work->param; |
3267 | 3267 | ||
3268 | if (mlx5_core_is_mp_slave(work->dev)) { | 3268 | if (mlx5_core_is_mp_slave(work->dev)) { |
3269 | ibdev = mlx5_ib_get_ibdev_from_mpi(work->context); | 3269 | ibdev = mlx5_ib_get_ibdev_from_mpi(work->context); |
@@ -3283,8 +3283,6 @@ static void mlx5_ib_handle_event(struct work_struct *_work) | |||
3283 | case MLX5_DEV_EVENT_PORT_UP: | 3283 | case MLX5_DEV_EVENT_PORT_UP: |
3284 | case MLX5_DEV_EVENT_PORT_DOWN: | 3284 | case MLX5_DEV_EVENT_PORT_DOWN: |
3285 | case MLX5_DEV_EVENT_PORT_INITIALIZED: | 3285 | case MLX5_DEV_EVENT_PORT_INITIALIZED: |
3286 | port = (u8)work->param; | ||
3287 | |||
3288 | /* In RoCE, port up/down events are handled in | 3286 | /* In RoCE, port up/down events are handled in |
3289 | * mlx5_netdev_event(). | 3287 | * mlx5_netdev_event(). |
3290 | */ | 3288 | */ |
@@ -3298,24 +3296,19 @@ static void mlx5_ib_handle_event(struct work_struct *_work) | |||
3298 | 3296 | ||
3299 | case MLX5_DEV_EVENT_LID_CHANGE: | 3297 | case MLX5_DEV_EVENT_LID_CHANGE: |
3300 | ibev.event = IB_EVENT_LID_CHANGE; | 3298 | ibev.event = IB_EVENT_LID_CHANGE; |
3301 | port = (u8)work->param; | ||
3302 | break; | 3299 | break; |
3303 | 3300 | ||
3304 | case MLX5_DEV_EVENT_PKEY_CHANGE: | 3301 | case MLX5_DEV_EVENT_PKEY_CHANGE: |
3305 | ibev.event = IB_EVENT_PKEY_CHANGE; | 3302 | ibev.event = IB_EVENT_PKEY_CHANGE; |
3306 | port = (u8)work->param; | ||
3307 | |||
3308 | schedule_work(&ibdev->devr.ports[port - 1].pkey_change_work); | 3303 | schedule_work(&ibdev->devr.ports[port - 1].pkey_change_work); |
3309 | break; | 3304 | break; |
3310 | 3305 | ||
3311 | case MLX5_DEV_EVENT_GUID_CHANGE: | 3306 | case MLX5_DEV_EVENT_GUID_CHANGE: |
3312 | ibev.event = IB_EVENT_GID_CHANGE; | 3307 | ibev.event = IB_EVENT_GID_CHANGE; |
3313 | port = (u8)work->param; | ||
3314 | break; | 3308 | break; |
3315 | 3309 | ||
3316 | case MLX5_DEV_EVENT_CLIENT_REREG: | 3310 | case MLX5_DEV_EVENT_CLIENT_REREG: |
3317 | ibev.event = IB_EVENT_CLIENT_REREGISTER; | 3311 | ibev.event = IB_EVENT_CLIENT_REREGISTER; |
3318 | port = (u8)work->param; | ||
3319 | break; | 3312 | break; |
3320 | case MLX5_DEV_EVENT_DELAY_DROP_TIMEOUT: | 3313 | case MLX5_DEV_EVENT_DELAY_DROP_TIMEOUT: |
3321 | schedule_work(&ibdev->delay_drop.delay_drop_work); | 3314 | schedule_work(&ibdev->delay_drop.delay_drop_work); |
@@ -3327,7 +3320,7 @@ static void mlx5_ib_handle_event(struct work_struct *_work) | |||
3327 | ibev.device = &ibdev->ib_dev; | 3320 | ibev.device = &ibdev->ib_dev; |
3328 | ibev.element.port_num = port; | 3321 | ibev.element.port_num = port; |
3329 | 3322 | ||
3330 | if (port < 1 || port > ibdev->num_ports) { | 3323 | if (!rdma_is_port_valid(&ibdev->ib_dev, port)) { |
3331 | mlx5_ib_warn(ibdev, "warning: event on port %d\n", port); | 3324 | mlx5_ib_warn(ibdev, "warning: event on port %d\n", port); |
3332 | goto out; | 3325 | goto out; |
3333 | } | 3326 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c index 21d29f7936f6..d39b0b7011b2 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c | |||
@@ -124,7 +124,7 @@ void mlx5_enter_error_state(struct mlx5_core_dev *dev, bool force) | |||
124 | trigger_cmd_completions(dev); | 124 | trigger_cmd_completions(dev); |
125 | } | 125 | } |
126 | 126 | ||
127 | mlx5_core_event(dev, MLX5_DEV_EVENT_SYS_ERROR, 0); | 127 | mlx5_core_event(dev, MLX5_DEV_EVENT_SYS_ERROR, 1); |
128 | mlx5_core_err(dev, "end\n"); | 128 | mlx5_core_err(dev, "end\n"); |
129 | 129 | ||
130 | unlock: | 130 | unlock: |