Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −8
Original line number Original line Diff line number Diff line
@@ -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(
					dd->ipath_pioavailregs_dma[i - 1]);
		else
		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);
+2 −0
Original line number Original line Diff line number Diff line
@@ -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;
}
}
+2 −6
Original line number Original line Diff line number Diff line
@@ -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);
+2 −2
Original line number Original line Diff line number Diff line
@@ -831,7 +831,7 @@ 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);
+1 −0
Original line number Original line Diff line number Diff line
@@ -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