This patch replaces:
https://www.spinics.net/lists/linux-scsi/msg117838.html

A prior lpfc patch:
scsi: lpfc: Add push-to-adapter support to sli4
commitid=1351e69fc6db30e186295f1c9495d03cef6a01a2

Fails compilation on some 32-bit systems as writeq() is not supported
on all architectures. Additionally, it was pointed out that as writeX()
does byteswapping if necessary for pci vs the cpu endianness, the code
was broken on BE PPC.

After discussions with Arnd Bergmann, we've resolved the issue
to the following:
  When 32-bit, use 32-bit accesses.
  Instead of writeX(), use __raw_writeX() - which writes to io
    space while preserving byte order. To use this, the code
    was changed to use a different buffer that lpfc prepped
    via sli_pcimem_bcopy() that was set to the bytestream to
    be written.

Signed-off-by: Dick Kennedy <dick.kenn...@broadcom.com>
Signed-off-by: James Smart <james.sm...@broadcom.com>
---
 drivers/scsi/lpfc/lpfc_sli.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index 4ce3ca6f4b79..675914cc8ab8 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -140,9 +140,16 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe)
        lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size);
        if (q->dpp_enable && q->phba->cfg_enable_dpp) {
                /* write to DPP aperture taking advatage of Combined Writes */
-               tmp = (uint8_t *)wqe;
+               tmp = (uint8_t *)temp_wqe;
+#ifdef CONFIG_64BIT
                for (i = 0; i < q->entry_size; i += sizeof(uint64_t))
-                       writeq(*((uint64_t *)(tmp + i)), q->dpp_regaddr + i);
+                       __raw_writeq(*((uint64_t *)(tmp + i)),
+                                       q->dpp_regaddr + i);
+#else
+               for (i = 0; i < q->entry_size; i += sizeof(uint32_t))
+                       __raw_writel(*((uint32_t *)(tmp + i)),
+                                       q->dpp_regaddr + i);
+#endif
        }
        /* ensure WQE bcopy and DPP flushed before doorbell write */
        wmb();
-- 
2.13.1

Reply via email to