/*
                 * Chip Errata: bug 6641; even and odd qwords>3 are swapped
                 */
-               if (i > 3) {
-                       if (i & 1)
-                               piov = le64_to_cpu(
-                                       dd->ipath_pioavailregs_dma[i - 1]);
-                       else
-                               piov = le64_to_cpu(
-                                       dd->ipath_pioavailregs_dma[i + 1]);
-               } else
+               if (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS))
+                       piov = le64_to_cpu(dd->ipath_pioavailregs_dma[i ^ 1]);
+               else
                        piov = le64_to_cpu(dd->ipath_pioavailregs_dma[i]);
                pchg = _IPATH_ALL_CHECKBITS &
                        ~(dd->ipath_pioavailshadow[i] ^ piov);
 
        } while ((pos = pci_find_next_capability(pdev, pos,
                                                 PCI_CAP_ID_HT)));
 
+       dd->ipath_flags |= IPATH_SWAP_PIOBUFS;
+
 bail:
        return ret;
 }
 
                /*
                 * Chip Errata bug 6641; even and odd qwords>3 are swapped.
                 */
-               if (i > 3) {
-                       if (i & 1)
-                               val = dd->ipath_pioavailregs_dma[i - 1];
-                       else
-                               val = dd->ipath_pioavailregs_dma[i + 1];
-               }
+               if (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS))
+                       val = dd->ipath_pioavailregs_dma[i ^ 1];
                else
                        val = dd->ipath_pioavailregs_dma[i];
                dd->ipath_pioavailshadow[i] = le64_to_cpu(val);
 
         */
        for (i = 0; i < dd->ipath_pioavregs; i++) {
                /* deal with 6110 chip bug */
-               im = i > 3 ? ((i&1) ? i-1 : i+1) : i;
-               val = ipath_read_kreg64(dd, (0x1000/sizeof(u64))+im);
+               im = i > 3 ? i ^ 1 : i;
+               val = ipath_read_kreg64(dd, (0x1000 / sizeof(u64)) + im);
                dd->ipath_pioavailregs_dma[i] = dd->ipath_pioavailshadow[i]
                        = le64_to_cpu(val);
        }
 
 #define IPATH_DISABLED      0x80000 /* administratively disabled */
                /* Use GPIO interrupts for new counters */
 #define IPATH_GPIO_ERRINTRS 0x100000
+#define IPATH_SWAP_PIOBUFS  0x200000
 
 /* Bits in GPIO for the added interrupts */
 #define IPATH_GPIO_PORT0_BIT 2