Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 077424e2 authored by Jing Huang's avatar Jing Huang Committed by James Bottomley
Browse files

[SCSI] bfa: sg addr big endian fix



sg address in IO request is not set up correctly for big endian platform.
add new macros to properly swap the address.

Signed-off-by: default avatarJing Huang <huangj@brocade.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 42b426ec
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -758,7 +758,7 @@ bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim)
	sge = &m->sges[0];
	if (ioim->nsges) {
		sg = (struct scatterlist *)scsi_sglist(cmnd);
		addr = (u64) sg_dma_address(sg);
		addr = bfa_os_sgaddr(sg_dma_address(sg));
		sge->sga = *(union bfi_addr_u *) &addr;
		pgdlen = sg_dma_len(sg);
		sge->sg_len = pgdlen;
@@ -891,7 +891,7 @@ bfa_ioim_sgpg_setup(struct bfa_ioim_s *ioim)

		pgcumsz = 0;
		for (i = 0; i < nsges; i++, sge++, sgeid++, sg = sg_next(sg)) {
			addr = (u64) sg_dma_address(sg);
			addr = bfa_os_sgaddr(sg_dma_address(sg));
			sge->sga = *(union bfi_addr_u *) &addr;
			sge->sg_len = sg_dma_len(sg);
			pgcumsz += sge->sg_len;
+15 −0
Original line number Diff line number Diff line
@@ -50,6 +50,10 @@
#include <scsi/scsi_transport_fc.h>
#include <scsi/scsi_transport.h>

#ifdef __BIG_ENDIAN
#define __BIGENDIAN
#endif

#define BFA_ERR			KERN_ERR
#define BFA_WARNING		KERN_WARNING
#define BFA_NOTICE		KERN_NOTICE
@@ -123,6 +127,15 @@ int bfa_os_MWB(void *);
	(((_x) & 0x00ff0000) >> 8)	|	\
	(((_x) & 0xff000000) >> 24))

#define bfa_os_swap_sgaddr(_x)	((u64)(					\
	(((u64)(_x) & (u64)0x00000000000000ffull) << 32)	|	\
	(((u64)(_x) & (u64)0x000000000000ff00ull) << 32)	|	\
	(((u64)(_x) & (u64)0x0000000000ff0000ull) << 32)	|	\
	(((u64)(_x) & (u64)0x00000000ff000000ull) << 32)	|	\
	(((u64)(_x) & (u64)0x000000ff00000000ull) >> 32)	|	\
	(((u64)(_x) & (u64)0x0000ff0000000000ull) >> 32)	|	\
	(((u64)(_x) & (u64)0x00ff000000000000ull) >> 32)	|	\
	(((u64)(_x) & (u64)0xff00000000000000ull) >> 32)))

#ifndef __BIGENDIAN
#define bfa_os_htons(_x) ((u16)((((_x) & 0xff00) >> 8) | \
@@ -133,6 +146,7 @@ int bfa_os_MWB(void *);
#define bfa_os_hton3b(_x)	bfa_swap_3b(_x)

#define bfa_os_wtole(_x)   (_x)
#define bfa_os_sgaddr(_x)  (_x)

#else

@@ -141,6 +155,7 @@ int bfa_os_MWB(void *);
#define bfa_os_hton3b(_x)  (_x)
#define bfa_os_htonll(_x)  (_x)
#define bfa_os_wtole(_x)   bfa_os_swap32(_x)
#define bfa_os_sgaddr(_x)  bfa_os_swap_sgaddr(_x)

#endif