return enic->cq[enic_cq_wq(enic, wq)].interrupt_offset;
 }
 
-static inline unsigned int enic_msix_err_intr(struct enic *enic)
-{
-       return enic->rq_count + enic->wq_count;
-}
+/* MSIX interrupts are organized as the error interrupt, then the notify
+ * interrupt followed by all the I/O interrupts.  The error interrupt needs
+ * to fit in 7 bits due to hardware constraints
+ */
+#define ENIC_MSIX_RESERVED_INTR 2
+#define ENIC_MSIX_ERR_INTR     0
+#define ENIC_MSIX_NOTIFY_INTR  1
+#define ENIC_MSIX_IO_INTR_BASE ENIC_MSIX_RESERVED_INTR
+#define ENIC_MSIX_MIN_INTR     (ENIC_MSIX_RESERVED_INTR + 2)
 
 #define ENIC_LEGACY_IO_INTR    0
 #define ENIC_LEGACY_ERR_INTR   1
 #define ENIC_LEGACY_NOTIFY_INTR        2
 
+static inline unsigned int enic_msix_err_intr(struct enic *enic)
+{
+       return ENIC_MSIX_ERR_INTR;
+}
+
 static inline unsigned int enic_msix_notify_intr(struct enic *enic)
 {
-       return enic->rq_count + enic->wq_count + 1;
+       return ENIC_MSIX_NOTIFY_INTR;
 }
 
 static inline bool enic_is_err_intr(struct enic *enic, int intr)
 
 
        switch (intr_mode) {
        case VNIC_DEV_INTR_MODE_INTX:
+               error_interrupt_enable = 1;
+               error_interrupt_offset = ENIC_LEGACY_ERR_INTR;
+               break;
        case VNIC_DEV_INTR_MODE_MSIX:
                error_interrupt_enable = 1;
-               error_interrupt_offset = enic->intr_count - 2;
+               error_interrupt_offset = enic_msix_err_intr(enic);
                break;
        default:
                error_interrupt_enable = 0;
 
        /* Init CQ resources
         *
-        * CQ[0 - n+m-1] point to INTR[0] for INTx, MSI
-        * CQ[0 - n+m-1] point to INTR[0 - n+m-1] for MSI-X
+        * All CQs point to INTR[0] for INTx, MSI
+        * CQ[i] point to INTR[ENIC_MSIX_IO_INTR_BASE + i] for MSI-X
         */
 
        for (i = 0; i < enic->cq_count; i++) {
 
                switch (intr_mode) {
                case VNIC_DEV_INTR_MODE_MSIX:
-                       interrupt_offset = i;
+                       interrupt_offset = ENIC_MSIX_IO_INTR_BASE + i;
                        break;
                default:
                        interrupt_offset = 0;