* Out: 'off' is 2M pci map addr
  * side effect: lock crb window
  */
-static void
+static int
 qlcnic_pci_set_crbwindow_2M(struct qlcnic_adapter *adapter, ulong off)
 {
        u32 window;
        off -= QLCNIC_PCI_CRBSPACE;
 
        window = CRB_HI(off);
+       if (window == 0) {
+               dev_err(&adapter->pdev->dev, "Invalid offset 0x%lx\n", off);
+               return -EIO;
+       }
 
        writel(window, addr);
        if (readl(addr) != window) {
                        dev_warn(&adapter->pdev->dev,
                                "failed to set CRB window to %d off 0x%lx\n",
                                window, off);
+               return -EIO;
        }
+       return 0;
 }
 
 int
                /* indirect access */
                write_lock_irqsave(&adapter->ahw.crb_lock, flags);
                crb_win_lock(adapter);
-               qlcnic_pci_set_crbwindow_2M(adapter, off);
-               writel(data, addr);
+               rv = qlcnic_pci_set_crbwindow_2M(adapter, off);
+               if (!rv)
+                       writel(data, addr);
                crb_win_unlock(adapter);
                write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
-               return 0;
+               return rv;
        }
 
        dev_err(&adapter->pdev->dev,
 {
        unsigned long flags;
        int rv;
-       u32 data;
+       u32 data = -1;
        void __iomem *addr = NULL;
 
        rv = qlcnic_pci_get_crb_addr_2M(adapter, off, &addr);
                /* indirect access */
                write_lock_irqsave(&adapter->ahw.crb_lock, flags);
                crb_win_lock(adapter);
-               qlcnic_pci_set_crbwindow_2M(adapter, off);
-               data = readl(addr);
+               if (!qlcnic_pci_set_crbwindow_2M(adapter, off))
+                       data = readl(addr);
                crb_win_unlock(adapter);
                write_unlock_irqrestore(&adapter->ahw.crb_lock, flags);
                return data;