Due to relaxed ordering requirements on multiple architectures,
drivers are required to use wmb/rmb/mb combinations when they
need to guarantee observability between the memory and the HW.

The mpt3sas driver is already using wmb() for this purpose.
However, it issues a writel following wmb(). writel() function
on arm/arm64 arhictectures have an embedded wmb() call inside.

This results in unnecessary performance loss and code duplication.

The kernel has been updated to support relaxed read/write
API to be supported across all architectures now.

The right thing was to either call __raw_writel/__raw_readl or
write_relaxed/read_relaxed for multi-arch compatibility.

Signed-off-by: Sinan Kaya <ok...@codeaurora.org>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c 
b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 5b7aec5..6e42036 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -1026,8 +1026,8 @@ static int mpt3sas_remove_dead_ioc_func(void *arg)
                                ioc->reply_free[ioc->reply_free_host_index] =
                                    cpu_to_le32(reply);
                                wmb();
-                               writel(ioc->reply_free_host_index,
-                                   &ioc->chip->ReplyFreeHostIndex);
+                               writel_relaxed(ioc->reply_free_host_index,
+                                              &ioc->chip->ReplyFreeHostIndex);
                        }
                }
 
@@ -1076,8 +1076,8 @@ static int mpt3sas_remove_dead_ioc_func(void *arg)
 
        wmb();
        if (ioc->is_warpdrive) {
-               writel(reply_q->reply_post_host_index,
-               ioc->reply_post_host_index[msix_index]);
+               writel_relaxed(reply_q->reply_post_host_index,
+                              ioc->reply_post_host_index[msix_index]);
                atomic_dec(&reply_q->busy);
                return IRQ_HANDLED;
        }
@@ -1098,13 +1098,14 @@ static int mpt3sas_remove_dead_ioc_func(void *arg)
         * value in MSIxIndex field.
         */
        if (ioc->combined_reply_queue)
-               writel(reply_q->reply_post_host_index | ((msix_index  & 7) <<
-                       MPI2_RPHI_MSIX_INDEX_SHIFT),
-                       ioc->replyPostRegisterIndex[msix_index/8]);
+               writel_relaxed(reply_q->reply_post_host_index |
+                              ((msix_index  & 7) <<
+                              MPI2_RPHI_MSIX_INDEX_SHIFT),
+                              ioc->replyPostRegisterIndex[msix_index/8]);
        else
-               writel(reply_q->reply_post_host_index | (msix_index <<
-                       MPI2_RPHI_MSIX_INDEX_SHIFT),
-                       &ioc->chip->ReplyPostHostIndex);
+               writel_relaxed(reply_q->reply_post_host_index |
+                              (msix_index << MPI2_RPHI_MSIX_INDEX_SHIFT),
+                              &ioc->chip->ReplyPostHostIndex);
        atomic_dec(&reply_q->busy);
        return IRQ_HANDLED;
 }
-- 
1.9.1

Reply via email to