diff options
Diffstat (limited to 'drivers/infiniband/hw/i40iw/i40iw_main.c')
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_main.c | 60 | 
1 files changed, 30 insertions, 30 deletions
| diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c index e0f47cc2effc..ae8463ff59a7 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_main.c +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c @@ -243,6 +243,8 @@ static void i40iw_destroy_cqp(struct i40iw_device *iwdev, bool free_hwcqp)  	if (free_hwcqp)  		dev->cqp_ops->cqp_destroy(dev->cqp); +	i40iw_cleanup_pending_cqp_op(iwdev); +  	i40iw_free_dma_mem(dev->hw, &cqp->sq);  	kfree(cqp->scratch_array);  	iwdev->cqp.scratch_array = NULL; @@ -274,13 +276,12 @@ static void i40iw_disable_irq(struct i40iw_sc_dev *dev,  /**   * i40iw_destroy_aeq - destroy aeq   * @iwdev: iwarp device - * @reset: true if called before reset   *   * Issue a destroy aeq request and   * free the resources associated with the aeq   * The function is called during driver unload   */ -static void i40iw_destroy_aeq(struct i40iw_device *iwdev, bool reset) +static void i40iw_destroy_aeq(struct i40iw_device *iwdev)  {  	enum i40iw_status_code status = I40IW_ERR_NOT_READY;  	struct i40iw_sc_dev *dev = &iwdev->sc_dev; @@ -288,7 +289,7 @@ static void i40iw_destroy_aeq(struct i40iw_device *iwdev, bool reset)  	if (!iwdev->msix_shared)  		i40iw_disable_irq(dev, iwdev->iw_msixtbl, (void *)iwdev); -	if (reset) +	if (iwdev->reset)  		goto exit;  	if (!dev->aeq_ops->aeq_destroy(&aeq->sc_aeq, 0, 1)) @@ -304,19 +305,17 @@ exit:   * i40iw_destroy_ceq - destroy ceq   * @iwdev: iwarp device   * @iwceq: ceq to be destroyed - * @reset: true if called before reset   *   * Issue a destroy ceq request and   * free the resources associated with the ceq   */  static void i40iw_destroy_ceq(struct i40iw_device *iwdev, -			      struct i40iw_ceq *iwceq, -			      bool reset) +			      struct i40iw_ceq *iwceq)  {  	enum i40iw_status_code status;  	struct i40iw_sc_dev *dev = &iwdev->sc_dev; -	if (reset) +	if (iwdev->reset)  		goto exit;  	status = dev->ceq_ops->ceq_destroy(&iwceq->sc_ceq, 0, 1); @@ -335,12 +334,11 @@ exit:  /**   * i40iw_dele_ceqs - destroy all ceq's   * @iwdev: iwarp device - * @reset: true if called before reset   *   * Go through all of the device ceq's and for each ceq   * disable the ceq interrupt and destroy the ceq   */ -static void i40iw_dele_ceqs(struct i40iw_device *iwdev, bool reset) +static void i40iw_dele_ceqs(struct i40iw_device *iwdev)  {  	u32 i = 0;  	struct i40iw_sc_dev *dev = &iwdev->sc_dev; @@ -349,32 +347,31 @@ static void i40iw_dele_ceqs(struct i40iw_device *iwdev, bool reset)  	if (iwdev->msix_shared) {  		i40iw_disable_irq(dev, msix_vec, (void *)iwdev); -		i40iw_destroy_ceq(iwdev, iwceq, reset); +		i40iw_destroy_ceq(iwdev, iwceq);  		iwceq++;  		i++;  	}  	for (msix_vec++; i < iwdev->ceqs_count; i++, msix_vec++, iwceq++) {  		i40iw_disable_irq(dev, msix_vec, (void *)iwceq); -		i40iw_destroy_ceq(iwdev, iwceq, reset); +		i40iw_destroy_ceq(iwdev, iwceq);  	}  }  /**   * i40iw_destroy_ccq - destroy control cq   * @iwdev: iwarp device - * @reset: true if called before reset   *   * Issue destroy ccq request and   * free the resources associated with the ccq   */ -static void i40iw_destroy_ccq(struct i40iw_device *iwdev, bool reset) +static void i40iw_destroy_ccq(struct i40iw_device *iwdev)  {  	struct i40iw_sc_dev *dev = &iwdev->sc_dev;  	struct i40iw_ccq *ccq = &iwdev->ccq;  	enum i40iw_status_code status = 0; -	if (!reset) +	if (!iwdev->reset)  		status = dev->ccq_ops->ccq_destroy(dev->ccq, 0, true);  	if (status)  		i40iw_pr_err("ccq destroy failed %d\n", status); @@ -810,7 +807,7 @@ static enum i40iw_status_code i40iw_setup_ceqs(struct i40iw_device *iwdev,  		iwceq->msix_idx = msix_vec->idx;  		status = i40iw_configure_ceq_vector(iwdev, iwceq, ceq_id, msix_vec);  		if (status) { -			i40iw_destroy_ceq(iwdev, iwceq, false); +			i40iw_destroy_ceq(iwdev, iwceq);  			break;  		}  		i40iw_enable_intr(&iwdev->sc_dev, msix_vec->idx); @@ -912,7 +909,7 @@ static enum i40iw_status_code i40iw_setup_aeq(struct i40iw_device *iwdev)  	status = i40iw_configure_aeq_vector(iwdev);  	if (status) { -		i40iw_destroy_aeq(iwdev, false); +		i40iw_destroy_aeq(iwdev);  		return status;  	} @@ -1442,12 +1439,11 @@ static enum i40iw_status_code i40iw_save_msix_info(struct i40iw_device *iwdev,  /**   * i40iw_deinit_device - clean up the device resources   * @iwdev: iwarp device - * @reset: true if called before reset   *   * Destroy the ib device interface, remove the mac ip entry and ipv4/ipv6 addresses,   * destroy the device queues and free the pble and the hmc objects   */ -static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset) +static void i40iw_deinit_device(struct i40iw_device *iwdev)  {  	struct i40e_info *ldev = iwdev->ldev; @@ -1464,7 +1460,7 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset)  		i40iw_destroy_rdma_device(iwdev->iwibdev);  		/* fallthrough */  	case IP_ADDR_REGISTERED: -		if (!reset) +		if (!iwdev->reset)  			i40iw_del_macip_entry(iwdev, (u8)iwdev->mac_ip_table_idx);  		/* fallthrough */  	case INET_NOTIFIER: @@ -1474,26 +1470,26 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset)  			unregister_inet6addr_notifier(&i40iw_inetaddr6_notifier);  		}  		/* fallthrough */ +	case PBLE_CHUNK_MEM: +		i40iw_destroy_pble_pool(dev, iwdev->pble_rsrc); +		/* fallthrough */  	case CEQ_CREATED: -		i40iw_dele_ceqs(iwdev, reset); +		i40iw_dele_ceqs(iwdev);  		/* fallthrough */  	case AEQ_CREATED: -		i40iw_destroy_aeq(iwdev, reset); +		i40iw_destroy_aeq(iwdev);  		/* fallthrough */  	case IEQ_CREATED: -		i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_IEQ, reset); +		i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_IEQ, iwdev->reset);  		/* fallthrough */  	case ILQ_CREATED: -		i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_ILQ, reset); +		i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_ILQ, iwdev->reset);  		/* fallthrough */  	case CCQ_CREATED: -		i40iw_destroy_ccq(iwdev, reset); -		/* fallthrough */ -	case PBLE_CHUNK_MEM: -		i40iw_destroy_pble_pool(dev, iwdev->pble_rsrc); +		i40iw_destroy_ccq(iwdev);  		/* fallthrough */  	case HMC_OBJS_CREATED: -		i40iw_del_hmc_objects(dev, dev->hmc_info, true, reset); +		i40iw_del_hmc_objects(dev, dev->hmc_info, true, iwdev->reset);  		/* fallthrough */  	case CQP_CREATED:  		i40iw_destroy_cqp(iwdev, true); @@ -1670,6 +1666,7 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)  		status = i40iw_hmc_init_pble(&iwdev->sc_dev, iwdev->pble_rsrc);  		if (status)  			break; +		iwdev->init_state = PBLE_CHUNK_MEM;  		iwdev->virtchnl_wq = alloc_ordered_workqueue("iwvch", WQ_MEM_RECLAIM);  		i40iw_register_notifiers();  		iwdev->init_state = INET_NOTIFIER; @@ -1693,7 +1690,7 @@ static int i40iw_open(struct i40e_info *ldev, struct i40e_client *client)  	} while (0);  	i40iw_pr_err("status = %d last completion = %d\n", status, iwdev->init_state); -	i40iw_deinit_device(iwdev, false); +	i40iw_deinit_device(iwdev);  	return -ERESTART;  } @@ -1774,9 +1771,12 @@ static void i40iw_close(struct i40e_info *ldev, struct i40e_client *client, bool  	iwdev = &hdl->device;  	iwdev->closing = true; +	if (reset) +		iwdev->reset = true; +  	i40iw_cm_disconnect_all(iwdev);  	destroy_workqueue(iwdev->virtchnl_wq); -	i40iw_deinit_device(iwdev, reset); +	i40iw_deinit_device(iwdev);  }  /** |