Commit 4ea61b54 authored by Ralph Campbell's avatar Ralph Campbell Committed by Roland Dreier

IB/ipath: Add flag and handling for chips with swapped register bug

The 6110 had a bug that caused some registers to be swapped; it was
fixed for the 7220 (and didn't affect the 6120 because it had fewer
registers).  This adds a flag and related code to handle that, and
includes some minor cleanups in the same area.
Signed-off-by: default avatarRalph Campbell <ralph.campbell@qlogic.com>
parent 60948a41
...@@ -1340,14 +1340,9 @@ static void ipath_update_pio_bufs(struct ipath_devdata *dd) ...@@ -1340,14 +1340,9 @@ static void ipath_update_pio_bufs(struct ipath_devdata *dd)
/* /*
* Chip Errata: bug 6641; even and odd qwords>3 are swapped * Chip Errata: bug 6641; even and odd qwords>3 are swapped
*/ */
if (i > 3) { if (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS))
if (i & 1) piov = le64_to_cpu(dd->ipath_pioavailregs_dma[i ^ 1]);
piov = le64_to_cpu( else
dd->ipath_pioavailregs_dma[i - 1]);
else
piov = le64_to_cpu(
dd->ipath_pioavailregs_dma[i + 1]);
} else
piov = le64_to_cpu(dd->ipath_pioavailregs_dma[i]); piov = le64_to_cpu(dd->ipath_pioavailregs_dma[i]);
pchg = _IPATH_ALL_CHECKBITS & pchg = _IPATH_ALL_CHECKBITS &
~(dd->ipath_pioavailshadow[i] ^ piov); ~(dd->ipath_pioavailshadow[i] ^ piov);
......
...@@ -1043,6 +1043,8 @@ static int ipath_setup_ht_config(struct ipath_devdata *dd, ...@@ -1043,6 +1043,8 @@ static int ipath_setup_ht_config(struct ipath_devdata *dd,
} while ((pos = pci_find_next_capability(pdev, pos, } while ((pos = pci_find_next_capability(pdev, pos,
PCI_CAP_ID_HT))); PCI_CAP_ID_HT)));
dd->ipath_flags |= IPATH_SWAP_PIOBUFS;
bail: bail:
return ret; return ret;
} }
......
...@@ -528,12 +528,8 @@ static void enable_chip(struct ipath_devdata *dd, ...@@ -528,12 +528,8 @@ static void enable_chip(struct ipath_devdata *dd,
/* /*
* Chip Errata bug 6641; even and odd qwords>3 are swapped. * Chip Errata bug 6641; even and odd qwords>3 are swapped.
*/ */
if (i > 3) { if (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS))
if (i & 1) val = dd->ipath_pioavailregs_dma[i ^ 1];
val = dd->ipath_pioavailregs_dma[i - 1];
else
val = dd->ipath_pioavailregs_dma[i + 1];
}
else else
val = dd->ipath_pioavailregs_dma[i]; val = dd->ipath_pioavailregs_dma[i];
dd->ipath_pioavailshadow[i] = le64_to_cpu(val); dd->ipath_pioavailshadow[i] = le64_to_cpu(val);
......
...@@ -831,8 +831,8 @@ void ipath_clear_freeze(struct ipath_devdata *dd) ...@@ -831,8 +831,8 @@ void ipath_clear_freeze(struct ipath_devdata *dd)
*/ */
for (i = 0; i < dd->ipath_pioavregs; i++) { for (i = 0; i < dd->ipath_pioavregs; i++) {
/* deal with 6110 chip bug */ /* deal with 6110 chip bug */
im = i > 3 ? ((i&1) ? i-1 : i+1) : i; im = i > 3 ? i ^ 1 : i;
val = ipath_read_kreg64(dd, (0x1000/sizeof(u64))+im); val = ipath_read_kreg64(dd, (0x1000 / sizeof(u64)) + im);
dd->ipath_pioavailregs_dma[i] = dd->ipath_pioavailshadow[i] dd->ipath_pioavailregs_dma[i] = dd->ipath_pioavailshadow[i]
= le64_to_cpu(val); = le64_to_cpu(val);
} }
......
...@@ -756,6 +756,7 @@ int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv); ...@@ -756,6 +756,7 @@ int ipath_set_rx_pol_inv(struct ipath_devdata *dd, u8 new_pol_inv);
#define IPATH_DISABLED 0x80000 /* administratively disabled */ #define IPATH_DISABLED 0x80000 /* administratively disabled */
/* Use GPIO interrupts for new counters */ /* Use GPIO interrupts for new counters */
#define IPATH_GPIO_ERRINTRS 0x100000 #define IPATH_GPIO_ERRINTRS 0x100000
#define IPATH_SWAP_PIOBUFS 0x200000
/* Bits in GPIO for the added interrupts */ /* Bits in GPIO for the added interrupts */
#define IPATH_GPIO_PORT0_BIT 2 #define IPATH_GPIO_PORT0_BIT 2
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment