]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
be2net: Issue shutdown event to ocrdma driver
authorDevesh Sharma <devesh.sharma@emulex.com>
Tue, 10 Jun 2014 14:02:15 +0000 (19:32 +0530)
committerRoland Dreier <roland@purestorage.com>
Fri, 1 Aug 2014 22:07:36 +0000 (15:07 -0700)
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>
drivers/net/ethernet/emulex/benet/be.h
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/emulex/benet/be_roce.c
drivers/net/ethernet/emulex/benet/be_roce.h

index c2f5d2d3b9324269edd1dc7d18e3d5355f209faf..56d4d100e024034a20e88dbafb08e07a621dc306 100644 (file)
@@ -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 */
index 1e187fb760f80fce4099f779ee44abafc10b22f2..36ce69ae9a2fbd5a2bbc22be74621e22c868b188 100644 (file)
@@ -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);
 
index 5bf16603a3e9d9854b39554a75065dde75c11eff..ef4672dc735750d24186c987fd1a34e478b21b60 100644 (file)
@@ -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;
index a3d9e96c18eb88ff720fd59af6d1a975bc5f71b1..e6f7eb1a7d879b23ba57e8e03f301f38b7c33d12 100644 (file)
@@ -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,