IB/hfi1: Fix dc8051 multiple qword memory reads
authorDean Luick <dean.luick@intel.com>
Thu, 8 Dec 2016 03:32:22 +0000 (19:32 -0800)
committerDoug Ledford <dledford@redhat.com>
Sun, 11 Dec 2016 20:25:13 +0000 (15:25 -0500)
When reading multiple dc8051 data memory locations
at once, the read enabled field must be toggled
at every address change.  Do that by writing only
the address first, then writing the enable.

Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/firmware.c

index 9a36c8c2f8a1516a1443c6b97028d1eda9f9ceb9..bcf7da4599c48824463ed0430047e34ca107bc6e 100644 (file)
@@ -263,11 +263,13 @@ static int __read_8051_data(struct hfi1_devdata *dd, u32 addr, u64 *result)
        u64 reg;
        int count;
 
-       /* start the read at the given address */
-       reg = ((addr & DC_DC8051_CFG_RAM_ACCESS_CTRL_ADDRESS_MASK)
-                       << DC_DC8051_CFG_RAM_ACCESS_CTRL_ADDRESS_SHIFT)
-               | DC_DC8051_CFG_RAM_ACCESS_CTRL_READ_ENA_SMASK;
+       /* step 1: set the address, clear enable */
+       reg = (addr & DC_DC8051_CFG_RAM_ACCESS_CTRL_ADDRESS_MASK)
+                       << DC_DC8051_CFG_RAM_ACCESS_CTRL_ADDRESS_SHIFT;
        write_csr(dd, DC_DC8051_CFG_RAM_ACCESS_CTRL, reg);
+       /* step 2: enable */
+       write_csr(dd, DC_DC8051_CFG_RAM_ACCESS_CTRL,
+                 reg | DC_DC8051_CFG_RAM_ACCESS_CTRL_READ_ENA_SMASK);
 
        /* wait until ACCESS_COMPLETED is set */
        count = 0;