u16 work_counter;
 
        struct delayed_work be_err_detection_work;
+       u8 err_flags;
        u32 flags;
        u32 cmd_privileges;
        /* Ethtool knobs and info */
        return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4;
 }
 
-static inline bool be_multi_rxq(const struct be_adapter *adapter)
+#define BE_ERROR_EEH           1
+#define BE_ERROR_UE            BIT(1)
+#define BE_ERROR_FW            BIT(2)
+#define BE_ERROR_HW            (BE_ERROR_EEH | BE_ERROR_UE)
+#define BE_ERROR_ANY           (BE_ERROR_EEH | BE_ERROR_UE | BE_ERROR_FW)
+#define BE_CLEAR_ALL           0xFF
+
+static inline u8 be_check_error(struct be_adapter *adapter, u32 err_type)
 {
-       return adapter->num_rx_qs > 1;
+       return (adapter->err_flags & err_type);
 }
 
-static inline bool be_error(struct be_adapter *adapter)
+static inline void be_set_error(struct be_adapter *adapter, int err_type)
 {
-       return adapter->eeh_error || adapter->hw_error || adapter->fw_timeout;
+       struct net_device *netdev = adapter->netdev;
+
+       adapter->err_flags |= err_type;
+       netif_carrier_off(netdev);
+
+       dev_info(&adapter->pdev->dev, "%s: Link down\n", netdev->name);
 }
 
-static inline bool be_hw_error(struct be_adapter *adapter)
+static inline void  be_clear_error(struct be_adapter *adapter, int err_type)
 {
-       return adapter->eeh_error || adapter->hw_error;
+       adapter->err_flags &= ~err_type;
 }
 
-static inline void  be_clear_all_error(struct be_adapter *adapter)
+static inline bool be_multi_rxq(const struct be_adapter *adapter)
 {
-       adapter->eeh_error = false;
-       adapter->hw_error = false;
-       adapter->fw_timeout = false;
+       return adapter->num_rx_qs > 1;
 }
 
 void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
 
        struct be_queue_info *mccq = &adapter->mcc_obj.q;
        u32 val = 0;
 
-       if (be_error(adapter))
+       if (be_check_error(adapter, BE_ERROR_ANY))
                return;
 
        val |= mccq->id & DB_MCCQ_RING_ID_MASK;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
        for (i = 0; i < mcc_timeout; i++) {
-               if (be_error(adapter))
+               if (be_check_error(adapter, BE_ERROR_ANY))
                        return -EIO;
 
                local_bh_disable();
        }
        if (i == mcc_timeout) {
                dev_err(&adapter->pdev->dev, "FW not responding\n");
-               adapter->fw_timeout = true;
+               be_set_error(adapter, BE_ERROR_FW);
                return -EIO;
        }
        return status;
        u32 ready;
 
        do {
-               if (be_error(adapter))
+               if (be_check_error(adapter, BE_ERROR_ANY))
                        return -EIO;
 
                ready = ioread32(db);
 
                if (msecs > 4000) {
                        dev_err(&adapter->pdev->dev, "FW not responding\n");
-                       adapter->fw_timeout = true;
+                       be_set_error(adapter, BE_ERROR_FW);
                        be_detect_error(adapter);
                        return -1;
                }
 
        if (lancer_chip(adapter))
                return;
 
-       if (adapter->eeh_error)
+       if (be_check_error(adapter, BE_ERROR_EEH))
                return;
 
        status = be_cmd_intr_set(adapter, enable);
 {
        u32 val = 0;
 
+       if (be_check_error(adapter, BE_ERROR_HW))
+               return;
+
        val |= qid & DB_RQ_RING_ID_MASK;
        val |= posted << DB_RQ_NUM_POSTED_SHIFT;
 
 {
        u32 val = 0;
 
+       if (be_check_error(adapter, BE_ERROR_HW))
+               return;
+
        val |= txo->q.id & DB_TXULP_RING_ID_MASK;
        val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT;
 
        val |= qid & DB_EQ_RING_ID_MASK;
        val |= ((qid & DB_EQ_RING_ID_EXT_MASK) << DB_EQ_RING_ID_EXT_MASK_SHIFT);
 
-       if (adapter->eeh_error)
+       if (be_check_error(adapter, BE_ERROR_HW))
                return;
 
        if (arm)
        val |= ((qid & DB_CQ_RING_ID_EXT_MASK) <<
                        DB_CQ_RING_ID_EXT_MASK_SHIFT);
 
-       if (adapter->eeh_error)
+       if (be_check_error(adapter, BE_ERROR_HW))
                return;
 
        if (arm)
                        if (lancer_chip(adapter))
                                break;
 
-                       if (flush_wait++ > 10 || be_hw_error(adapter)) {
+                       if (flush_wait++ > 50 ||
+                           be_check_error(adapter,
+                                          BE_ERROR_HW)) {
                                dev_warn(&adapter->pdev->dev,
                                         "did not receive flush compl\n");
                                break;
                                pending_txqs--;
                }
 
-               if (pending_txqs == 0 || ++timeo > 10 || be_hw_error(adapter))
+               if (pending_txqs == 0 || ++timeo > 10 ||
+                   be_check_error(adapter, BE_ERROR_HW))
                        break;
 
                mdelay(1);
        u32 ue_lo = 0, ue_hi = 0, ue_lo_mask = 0, ue_hi_mask = 0;
        u32 sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
        u32 i;
-       bool error_detected = false;
        struct device *dev = &adapter->pdev->dev;
-       struct net_device *netdev = adapter->netdev;
 
-       if (be_hw_error(adapter))
+       if (be_check_error(adapter, BE_ERROR_HW))
                return;
 
        if (lancer_chip(adapter)) {
                sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
                if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
+                       be_set_error(adapter, BE_ERROR_UE);
                        sliport_err1 = ioread32(adapter->db +
                                                SLIPORT_ERROR1_OFFSET);
                        sliport_err2 = ioread32(adapter->db +
                                                SLIPORT_ERROR2_OFFSET);
-                       adapter->hw_error = true;
-                       error_detected = true;
                        /* Do not log error messages if its a FW reset */
                        if (sliport_err1 == SLIPORT_ERROR_FW_RESET1 &&
                            sliport_err2 == SLIPORT_ERROR_FW_RESET2) {
                 */
 
                if (ue_lo || ue_hi) {
-                       error_detected = true;
                        dev_err(dev,
                                "Unrecoverable Error detected in the adapter");
                        dev_err(dev, "Please reboot server to recover");
                        if (skyhawk_chip(adapter))
-                               adapter->hw_error = true;
+                               be_set_error(adapter, BE_ERROR_UE);
+
                        for (i = 0; ue_lo; ue_lo >>= 1, i++) {
                                if (ue_lo & 1)
                                        dev_err(dev, "UE: %s bit set\n",
                        }
                }
        }
-       if (error_detected)
-               netif_carrier_off(netdev);
 }
 
 static void be_msix_disable(struct be_adapter *adapter)
                msleep(100);
 
                /* We can clear all errors when function reset succeeds */
-               be_clear_all_error(adapter);
+               be_clear_error(adapter, BE_CLEAR_ALL);
        }
 
        /* Tell FW we're ready to fire cmds */
 
        be_detect_error(adapter);
 
-       if (adapter->hw_error) {
+       if (be_check_error(adapter, BE_ERROR_HW)) {
                be_cleanup(adapter);
 
                /* As of now error recovery support is in Lancer only */
 
        dev_err(&adapter->pdev->dev, "EEH error detected\n");
 
-       if (!adapter->eeh_error) {
-               adapter->eeh_error = true;
+       if (!be_check_error(adapter, BE_ERROR_EEH)) {
+               be_set_error(adapter, BE_ERROR_EEH);
 
                be_cancel_err_detection(adapter);
 
                return PCI_ERS_RESULT_DISCONNECT;
 
        pci_cleanup_aer_uncorrect_error_status(pdev);
-       be_clear_all_error(adapter);
+       be_clear_error(adapter, BE_CLEAR_ALL);
        return PCI_ERS_RESULT_RECOVERED;
 }