forked from mirrors/linux
		
	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 cf6bf9710c
(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: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
			
			
This commit is contained in:
		
							parent
							
								
									1550ec458e
								
							
						
					
					
						commit
						09c2f95ad4
					
				
					 1 changed files with 8 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -3343,11 +3343,10 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
 | 
			
		|||
					spinlock_t *writeq_lock)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
	__u64 data_out = b;
 | 
			
		||||
 | 
			
		||||
	spin_lock_irqsave(writeq_lock, flags);
 | 
			
		||||
	writel((u32)(data_out), addr);
 | 
			
		||||
	writel((u32)(data_out >> 32), (addr + 4));
 | 
			
		||||
	__raw_writel((u32)(b), addr);
 | 
			
		||||
	__raw_writel((u32)(b >> 32), (addr + 4));
 | 
			
		||||
	mmiowb();
 | 
			
		||||
	spin_unlock_irqrestore(writeq_lock, flags);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3367,7 +3366,8 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
 | 
			
		|||
static inline void
 | 
			
		||||
_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock)
 | 
			
		||||
{
 | 
			
		||||
	writeq(b, addr);
 | 
			
		||||
	__raw_writeq(b, addr);
 | 
			
		||||
	mmiowb();
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static inline void
 | 
			
		||||
| 
						 | 
				
			
			@ -5268,7 +5268,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 | 
			
		|||
 | 
			
		||||
	/* send message 32-bits at a time */
 | 
			
		||||
	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)))
 | 
			
		||||
			failed = 1;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
	reply[0] = (u16)(readl(&ioc->chip->Doorbell)
 | 
			
		||||
	reply[0] = le16_to_cpu(readl(&ioc->chip->Doorbell)
 | 
			
		||||
	    & MPI2_DOORBELL_DATA_MASK);
 | 
			
		||||
	writel(0, &ioc->chip->HostInterruptStatus);
 | 
			
		||||
	if ((_base_wait_for_doorbell_int(ioc, 5))) {
 | 
			
		||||
| 
						 | 
				
			
			@ -5298,7 +5298,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 | 
			
		|||
			ioc->name, __LINE__);
 | 
			
		||||
		return -EFAULT;
 | 
			
		||||
	}
 | 
			
		||||
	reply[1] = (u16)(readl(&ioc->chip->Doorbell)
 | 
			
		||||
	reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell)
 | 
			
		||||
	    & MPI2_DOORBELL_DATA_MASK);
 | 
			
		||||
	writel(0, &ioc->chip->HostInterruptStatus);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5312,7 +5312,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 | 
			
		|||
		if (i >=  reply_bytes/2) /* overflow case */
 | 
			
		||||
			readl(&ioc->chip->Doorbell);
 | 
			
		||||
		else
 | 
			
		||||
			reply[i] = (u16)(readl(&ioc->chip->Doorbell)
 | 
			
		||||
			reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell)
 | 
			
		||||
			    & MPI2_DOORBELL_DATA_MASK);
 | 
			
		||||
		writel(0, &ioc->chip->HostInterruptStatus);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue