Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d114f99a authored by Devesh Sharma's avatar Devesh Sharma Committed by Roland Dreier
Browse files

be2net: Issue shutdown event to ocrdma driver



In the shutdown path, when be2net calls pci_disable_msix(), it
complains (BUG_ON) that irqs requested by ocrdma driver are still in
use.  This patch fixes this problem by issuing shutdown event to
ocrdma from be2net shutdown path.  As part of shutdown event
processing, ocrdma driver will free up all the resources and free
irqs.  Once this completes be2net completes pci_disable_msix
successfully.

Signed-off-by: default avatarDevesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: default avatarSelvin Xavier <selvin.xavier@emulex.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 4808b184
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -890,5 +890,6 @@ void be_roce_dev_remove(struct be_adapter *);
 */
void be_roce_dev_open(struct be_adapter *);
void be_roce_dev_close(struct be_adapter *);
void be_roce_dev_shutdown(struct be_adapter *);

#endif				/* BE_H */
+1 −0
Original line number Diff line number Diff line
@@ -4958,6 +4958,7 @@ static void be_shutdown(struct pci_dev *pdev)
	if (!adapter)
		return;

	be_roce_dev_shutdown(adapter);
	cancel_delayed_work_sync(&adapter->work);
	cancel_delayed_work_sync(&adapter->func_recovery_work);

+16 −2
Original line number Diff line number Diff line
@@ -120,7 +120,8 @@ static void _be_roce_dev_open(struct be_adapter *adapter)
{
	if (ocrdma_drv && adapter->ocrdma_dev &&
	    ocrdma_drv->state_change_handler)
		ocrdma_drv->state_change_handler(adapter->ocrdma_dev, 0);
		ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
						 BE_DEV_UP);
}

void be_roce_dev_open(struct be_adapter *adapter)
@@ -136,7 +137,8 @@ static void _be_roce_dev_close(struct be_adapter *adapter)
{
	if (ocrdma_drv && adapter->ocrdma_dev &&
	    ocrdma_drv->state_change_handler)
		ocrdma_drv->state_change_handler(adapter->ocrdma_dev, 1);
		ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
						 BE_DEV_DOWN);
}

void be_roce_dev_close(struct be_adapter *adapter)
@@ -148,6 +150,18 @@ void be_roce_dev_close(struct be_adapter *adapter)
	}
}

void be_roce_dev_shutdown(struct be_adapter *adapter)
{
	if (be_roce_supported(adapter)) {
		mutex_lock(&be_adapter_list_lock);
		if (ocrdma_drv && adapter->ocrdma_dev &&
		    ocrdma_drv->state_change_handler)
			ocrdma_drv->state_change_handler(adapter->ocrdma_dev,
							 BE_DEV_SHUTDOWN);
		mutex_unlock(&be_adapter_list_lock);
	}
}

int be_roce_register_driver(struct ocrdma_driver *drv)
{
	struct be_adapter *dev;
+2 −1
Original line number Diff line number Diff line
@@ -62,7 +62,8 @@ struct ocrdma_driver {

enum {
	BE_DEV_UP	= 0,
	BE_DEV_DOWN	= 1
	BE_DEV_DOWN	= 1,
	BE_DEV_SHUTDOWN = 2
};

/* APIs for RoCE driver to register callback handlers,