Commit 09c2f95a authored by Sreekanth Reddy's avatar Sreekanth Reddy Committed by Martin K. Petersen

scsi: mpt3sas: Swap I/O memory read value back to cpu endianness

Swap the I/O memory read value back to cpu endianness before storing it in
a data structures which are defined in the MPI headers where u8 components
are not defined in the endianness order.

In this area from day one mpt3sas driver is using le32_to_cpu() &
cpu_to_le32() APIs. But in commit cf6bf971
(mpt3sas: Bug fix for big endian systems) we have removed these APIs
before reading I/O memory which we should haven't done it. So
in this patch I am correcting it by adding these APIs back
before accessing I/O memory.
Signed-off-by: default avatarSreekanth Reddy <sreekanth.reddy@broadcom.com>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 1550ec45
...@@ -3343,11 +3343,10 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr, ...@@ -3343,11 +3343,10 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
spinlock_t *writeq_lock) spinlock_t *writeq_lock)
{ {
unsigned long flags; unsigned long flags;
__u64 data_out = b;
spin_lock_irqsave(writeq_lock, flags); spin_lock_irqsave(writeq_lock, flags);
writel((u32)(data_out), addr); __raw_writel((u32)(b), addr);
writel((u32)(data_out >> 32), (addr + 4)); __raw_writel((u32)(b >> 32), (addr + 4));
mmiowb(); mmiowb();
spin_unlock_irqrestore(writeq_lock, flags); spin_unlock_irqrestore(writeq_lock, flags);
} }
...@@ -3367,7 +3366,8 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr, ...@@ -3367,7 +3366,8 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
static inline void static inline void
_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock) _base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock)
{ {
writeq(b, addr); __raw_writeq(b, addr);
mmiowb();
} }
#else #else
static inline void static inline void
...@@ -5268,7 +5268,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, ...@@ -5268,7 +5268,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
/* send message 32-bits at a time */ /* send message 32-bits at a time */
for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) { for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) {
writel((u32)(request[i]), &ioc->chip->Doorbell); writel(cpu_to_le32(request[i]), &ioc->chip->Doorbell);
if ((_base_wait_for_doorbell_ack(ioc, 5))) if ((_base_wait_for_doorbell_ack(ioc, 5)))
failed = 1; failed = 1;
} }
...@@ -5289,7 +5289,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, ...@@ -5289,7 +5289,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
} }
/* read the first two 16-bits, it gives the total length of the reply */ /* read the first two 16-bits, it gives the total length of the reply */
reply[0] = (u16)(readl(&ioc->chip->Doorbell) reply[0] = le16_to_cpu(readl(&ioc->chip->Doorbell)
& MPI2_DOORBELL_DATA_MASK); & MPI2_DOORBELL_DATA_MASK);
writel(0, &ioc->chip->HostInterruptStatus); writel(0, &ioc->chip->HostInterruptStatus);
if ((_base_wait_for_doorbell_int(ioc, 5))) { if ((_base_wait_for_doorbell_int(ioc, 5))) {
...@@ -5298,7 +5298,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, ...@@ -5298,7 +5298,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
ioc->name, __LINE__); ioc->name, __LINE__);
return -EFAULT; return -EFAULT;
} }
reply[1] = (u16)(readl(&ioc->chip->Doorbell) reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell)
& MPI2_DOORBELL_DATA_MASK); & MPI2_DOORBELL_DATA_MASK);
writel(0, &ioc->chip->HostInterruptStatus); writel(0, &ioc->chip->HostInterruptStatus);
...@@ -5312,7 +5312,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes, ...@@ -5312,7 +5312,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
if (i >= reply_bytes/2) /* overflow case */ if (i >= reply_bytes/2) /* overflow case */
readl(&ioc->chip->Doorbell); readl(&ioc->chip->Doorbell);
else else
reply[i] = (u16)(readl(&ioc->chip->Doorbell) reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell)
& MPI2_DOORBELL_DATA_MASK); & MPI2_DOORBELL_DATA_MASK);
writel(0, &ioc->chip->HostInterruptStatus); writel(0, &ioc->chip->HostInterruptStatus);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment