OSDN Git Service

bus: ixp4xx: Don't touch bit 7 on IXP42x
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 22 Nov 2022 13:44:11 +0000 (14:44 +0100)
committerArnd Bergmann <arnd@arndb.de>
Tue, 22 Nov 2022 22:12:18 +0000 (23:12 +0100)
We face some regressions on a few IXP42x systems when
accessing flash, the following unrelated error prints
appear from the PCI driver:

ixp4xx-pci c0000000.pci: PCI: abort_handler addr = 0xff9ffb5f,
   isr = 0x0, status = 0x22a0
ixp4xx-pci c0000000.pci: imprecise abort
(...)

It turns out that while bit 7 is masked "reserved" it is
not unused, so masking it off as zero is dangerous, and
breaks flash access on some systems such as the NSLU2.
Be more careful and avoid masking off any of the reserved
bits 7, 8, 9 or 30. Only keep masking EXP_WORD (bit 2)
on IXP43x which is necessary in some setups.

Fixes: 1c953bda90ca ("bus: ixp4xx: Add a driver for IXP4xx expansion bus")
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20221122134411.2030372-1-linus.walleij@linaro.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
drivers/bus/intel-ixp4xx-eb.c

index a438844..91db001 100644 (file)
@@ -49,7 +49,7 @@
 #define IXP4XX_EXP_SIZE_SHIFT          10
 #define IXP4XX_EXP_CNFG_0              BIT(9) /* Always zero */
 #define IXP43X_EXP_SYNC_INTEL          BIT(8) /* Only on IXP43x */
-#define IXP43X_EXP_EXP_CHIP            BIT(7) /* Only on IXP43x */
+#define IXP43X_EXP_EXP_CHIP            BIT(7) /* Only on IXP43x, dangerous to touch on IXP42x */
 #define IXP4XX_EXP_BYTE_RD16           BIT(6)
 #define IXP4XX_EXP_HRDY_POL            BIT(5) /* Only on IXP42x */
 #define IXP4XX_EXP_MUX_EN              BIT(4)
@@ -57,8 +57,6 @@
 #define IXP4XX_EXP_WORD                        BIT(2) /* Always zero */
 #define IXP4XX_EXP_WR_EN               BIT(1)
 #define IXP4XX_EXP_BYTE_EN             BIT(0)
-#define IXP42X_RESERVED                        (BIT(30)|IXP4XX_EXP_CNFG_0|BIT(8)|BIT(7)|IXP4XX_EXP_WORD)
-#define IXP43X_RESERVED                        (BIT(30)|IXP4XX_EXP_CNFG_0|BIT(5)|IXP4XX_EXP_WORD)
 
 #define IXP4XX_EXP_CNFG0               0x20
 #define IXP4XX_EXP_CNFG0_MEM_MAP       BIT(31)
@@ -252,10 +250,9 @@ static void ixp4xx_exp_setup_chipselect(struct ixp4xx_eb *eb,
                cs_cfg |= val << IXP4XX_EXP_CYC_TYPE_SHIFT;
        }
 
-       if (eb->is_42x)
-               cs_cfg &= ~IXP42X_RESERVED;
        if (eb->is_43x) {
-               cs_cfg &= ~IXP43X_RESERVED;
+               /* Should always be zero */
+               cs_cfg &= ~IXP4XX_EXP_WORD;
                /*
                 * This bit for Intel strata flash is currently unused, but let's
                 * report it if we find one.