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: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
4808b184fd
commit
d114f99a29
|
@ -890,5 +890,6 @@ void be_roce_dev_remove(struct be_adapter *);
|
||||||
*/
|
*/
|
||||||
void be_roce_dev_open(struct be_adapter *);
|
void be_roce_dev_open(struct be_adapter *);
|
||||||
void be_roce_dev_close(struct be_adapter *);
|
void be_roce_dev_close(struct be_adapter *);
|
||||||
|
void be_roce_dev_shutdown(struct be_adapter *);
|
||||||
|
|
||||||
#endif /* BE_H */
|
#endif /* BE_H */
|
||||||
|
|
|
@ -4958,6 +4958,7 @@ static void be_shutdown(struct pci_dev *pdev)
|
||||||
if (!adapter)
|
if (!adapter)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
be_roce_dev_shutdown(adapter);
|
||||||
cancel_delayed_work_sync(&adapter->work);
|
cancel_delayed_work_sync(&adapter->work);
|
||||||
cancel_delayed_work_sync(&adapter->func_recovery_work);
|
cancel_delayed_work_sync(&adapter->func_recovery_work);
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,8 @@ static void _be_roce_dev_open(struct be_adapter *adapter)
|
||||||
{
|
{
|
||||||
if (ocrdma_drv && adapter->ocrdma_dev &&
|
if (ocrdma_drv && adapter->ocrdma_dev &&
|
||||||
ocrdma_drv->state_change_handler)
|
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)
|
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 &&
|
if (ocrdma_drv && adapter->ocrdma_dev &&
|
||||||
ocrdma_drv->state_change_handler)
|
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)
|
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)
|
int be_roce_register_driver(struct ocrdma_driver *drv)
|
||||||
{
|
{
|
||||||
struct be_adapter *dev;
|
struct be_adapter *dev;
|
||||||
|
|
|
@ -62,7 +62,8 @@ struct ocrdma_driver {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
BE_DEV_UP = 0,
|
BE_DEV_UP = 0,
|
||||||
BE_DEV_DOWN = 1
|
BE_DEV_DOWN = 1,
|
||||||
|
BE_DEV_SHUTDOWN = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
/* APIs for RoCE driver to register callback handlers,
|
/* APIs for RoCE driver to register callback handlers,
|
||||||
|
|
Loading…
Reference in New Issue