diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5/main.c')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/main.c | 54 | 
1 files changed, 30 insertions, 24 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 4236c8086820..7f8bda3a2005 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c @@ -245,12 +245,16 @@ struct mlx5_core_dev *mlx5_ib_get_native_port_mdev(struct mlx5_ib_dev *ibdev,  	struct mlx5_ib_multiport_info *mpi;  	struct mlx5_ib_port *port; +	if (!mlx5_core_mp_enabled(ibdev->mdev) || +	    ll != IB_LINK_LAYER_ETHERNET) { +		if (native_port_num) +			*native_port_num = ib_port_num; +		return ibdev->mdev; +	} +  	if (native_port_num)  		*native_port_num = 1; -	if (!mlx5_core_mp_enabled(ibdev->mdev) || ll != IB_LINK_LAYER_ETHERNET) -		return ibdev->mdev; -  	port = &ibdev->port[ib_port_num - 1];  	if (!port)  		return NULL; @@ -3263,7 +3267,7 @@ static void mlx5_ib_handle_event(struct work_struct *_work)  	struct mlx5_ib_dev *ibdev;  	struct ib_event ibev;  	bool fatal = false; -	u8 port = 0; +	u8 port = (u8)work->param;  	if (mlx5_core_is_mp_slave(work->dev)) {  		ibdev = mlx5_ib_get_ibdev_from_mpi(work->context); @@ -3283,8 +3287,6 @@ static void mlx5_ib_handle_event(struct work_struct *_work)  	case MLX5_DEV_EVENT_PORT_UP:  	case MLX5_DEV_EVENT_PORT_DOWN:  	case MLX5_DEV_EVENT_PORT_INITIALIZED: -		port = (u8)work->param; -  		/* In RoCE, port up/down events are handled in  		 * mlx5_netdev_event().  		 */ @@ -3298,24 +3300,19 @@ static void mlx5_ib_handle_event(struct work_struct *_work)  	case MLX5_DEV_EVENT_LID_CHANGE:  		ibev.event = IB_EVENT_LID_CHANGE; -		port = (u8)work->param;  		break;  	case MLX5_DEV_EVENT_PKEY_CHANGE:  		ibev.event = IB_EVENT_PKEY_CHANGE; -		port = (u8)work->param; -  		schedule_work(&ibdev->devr.ports[port - 1].pkey_change_work);  		break;  	case MLX5_DEV_EVENT_GUID_CHANGE:  		ibev.event = IB_EVENT_GID_CHANGE; -		port = (u8)work->param;  		break;  	case MLX5_DEV_EVENT_CLIENT_REREG:  		ibev.event = IB_EVENT_CLIENT_REREGISTER; -		port = (u8)work->param;  		break;  	case MLX5_DEV_EVENT_DELAY_DROP_TIMEOUT:  		schedule_work(&ibdev->delay_drop.delay_drop_work); @@ -3327,7 +3324,7 @@ static void mlx5_ib_handle_event(struct work_struct *_work)  	ibev.device	      = &ibdev->ib_dev;  	ibev.element.port_num = port; -	if (port < 1 || port > ibdev->num_ports) { +	if (!rdma_is_port_valid(&ibdev->ib_dev, port)) {  		mlx5_ib_warn(ibdev, "warning: event on port %d\n", port);  		goto out;  	} @@ -3451,9 +3448,12 @@ static void destroy_umrc_res(struct mlx5_ib_dev *dev)  	if (err)  		mlx5_ib_warn(dev, "mr cache cleanup failed\n"); -	mlx5_ib_destroy_qp(dev->umrc.qp); -	ib_free_cq(dev->umrc.cq); -	ib_dealloc_pd(dev->umrc.pd); +	if (dev->umrc.qp) +		mlx5_ib_destroy_qp(dev->umrc.qp); +	if (dev->umrc.cq) +		ib_free_cq(dev->umrc.cq); +	if (dev->umrc.pd) +		ib_dealloc_pd(dev->umrc.pd);  }  enum { @@ -3555,12 +3555,15 @@ static int create_umr_res(struct mlx5_ib_dev *dev)  error_4:  	mlx5_ib_destroy_qp(qp); +	dev->umrc.qp = NULL;  error_3:  	ib_free_cq(cq); +	dev->umrc.cq = NULL;  error_2:  	ib_dealloc_pd(pd); +	dev->umrc.pd = NULL;  error_0:  	kfree(attr); @@ -4863,19 +4866,19 @@ static int mlx5_ib_stage_ib_reg_init(struct mlx5_ib_dev *dev)  	return ib_register_device(&dev->ib_dev, NULL);  } -static void mlx5_ib_stage_ib_reg_cleanup(struct mlx5_ib_dev *dev) +static void mlx5_ib_stage_pre_ib_reg_umr_cleanup(struct mlx5_ib_dev *dev)  { -	ib_unregister_device(&dev->ib_dev); +	destroy_umrc_res(dev);  } -static int mlx5_ib_stage_umr_res_init(struct mlx5_ib_dev *dev) +static void mlx5_ib_stage_ib_reg_cleanup(struct mlx5_ib_dev *dev)  { -	return create_umr_res(dev); +	ib_unregister_device(&dev->ib_dev);  } -static void mlx5_ib_stage_umr_res_cleanup(struct mlx5_ib_dev *dev) +static int mlx5_ib_stage_post_ib_reg_umr_init(struct mlx5_ib_dev *dev)  { -	destroy_umrc_res(dev); +	return create_umr_res(dev);  }  static int mlx5_ib_stage_delay_drop_init(struct mlx5_ib_dev *dev) @@ -4985,12 +4988,15 @@ static const struct mlx5_ib_profile pf_profile = {  	STAGE_CREATE(MLX5_IB_STAGE_BFREG,  		     mlx5_ib_stage_bfrag_init,  		     mlx5_ib_stage_bfrag_cleanup), +	STAGE_CREATE(MLX5_IB_STAGE_PRE_IB_REG_UMR, +		     NULL, +		     mlx5_ib_stage_pre_ib_reg_umr_cleanup),  	STAGE_CREATE(MLX5_IB_STAGE_IB_REG,  		     mlx5_ib_stage_ib_reg_init,  		     mlx5_ib_stage_ib_reg_cleanup), -	STAGE_CREATE(MLX5_IB_STAGE_UMR_RESOURCES, -		     mlx5_ib_stage_umr_res_init, -		     mlx5_ib_stage_umr_res_cleanup), +	STAGE_CREATE(MLX5_IB_STAGE_POST_IB_REG_UMR, +		     mlx5_ib_stage_post_ib_reg_umr_init, +		     NULL),  	STAGE_CREATE(MLX5_IB_STAGE_DELAY_DROP,  		     mlx5_ib_stage_delay_drop_init,  		     mlx5_ib_stage_delay_drop_cleanup),  |