be2net: gracefully handle situations when UE is detected
authorAjit Khaparde <ajit.khaparde@emulex.com>
Fri, 11 Feb 2011 13:38:17 +0000 (13:38 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 12 Feb 2011 05:14:48 +0000 (21:14 -0800)
Avoid accessing the hardware when UE is detected.

Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/benet/be_cmds.c
drivers/net/benet/be_main.c

index 8fa9a709d9fe4d4abcbd817f0c1856ace9bd3eaa..619ebc24602e70c2deb1e957d152b1f71c222321 100644 (file)
@@ -23,6 +23,12 @@ static void be_mcc_notify(struct be_adapter *adapter)
        struct be_queue_info *mccq = &adapter->mcc_obj.q;
        u32 val = 0;
 
+       if (adapter->eeh_err) {
+               dev_info(&adapter->pdev->dev,
+                       "Error in Card Detected! Cannot issue commands\n");
+               return;
+       }
+
        val |= mccq->id & DB_MCCQ_RING_ID_MASK;
        val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
 
@@ -217,6 +223,9 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
        int i, num, status = 0;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
+       if (adapter->eeh_err)
+               return -EIO;
+
        for (i = 0; i < mcc_timeout; i++) {
                num = be_process_mcc(adapter, &status);
                if (num)
@@ -246,6 +255,12 @@ static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
        int msecs = 0;
        u32 ready;
 
+       if (adapter->eeh_err) {
+               dev_err(&adapter->pdev->dev,
+                       "Error detected in card.Cannot issue commands\n");
+               return -EIO;
+       }
+
        do {
                ready = ioread32(db);
                if (ready == 0xffffffff) {
index 7e83c06f913f4e73193b0ff18962f59d3a3e9e49..1f5e342dd883e049c01e507503a473fb8e73611d 100644 (file)
@@ -1827,6 +1827,7 @@ void be_detect_dump_ue(struct be_adapter *adapter)
 
        if (ue_status_lo || ue_status_hi) {
                adapter->ue_detected = true;
+               adapter->eeh_err = true;
                dev_err(&adapter->pdev->dev, "UE Detected!!\n");
        }