[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: Jing Huang <huangj@brocade.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
committed by
James Bottomley
parent
42b426ecb4
commit
077424e2e2
@@ -758,7 +758,7 @@ bfa_ioim_send_ioreq(struct bfa_ioim_s *ioim)
|
|||||||
sge = &m->sges[0];
|
sge = &m->sges[0];
|
||||||
if (ioim->nsges) {
|
if (ioim->nsges) {
|
||||||
sg = (struct scatterlist *)scsi_sglist(cmnd);
|
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;
|
sge->sga = *(union bfi_addr_u *) &addr;
|
||||||
pgdlen = sg_dma_len(sg);
|
pgdlen = sg_dma_len(sg);
|
||||||
sge->sg_len = pgdlen;
|
sge->sg_len = pgdlen;
|
||||||
@@ -891,7 +891,7 @@ bfa_ioim_sgpg_setup(struct bfa_ioim_s *ioim)
|
|||||||
|
|
||||||
pgcumsz = 0;
|
pgcumsz = 0;
|
||||||
for (i = 0; i < nsges; i++, sge++, sgeid++, sg = sg_next(sg)) {
|
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->sga = *(union bfi_addr_u *) &addr;
|
||||||
sge->sg_len = sg_dma_len(sg);
|
sge->sg_len = sg_dma_len(sg);
|
||||||
pgcumsz += sge->sg_len;
|
pgcumsz += sge->sg_len;
|
||||||
|
@@ -50,6 +50,10 @@
|
|||||||
#include <scsi/scsi_transport_fc.h>
|
#include <scsi/scsi_transport_fc.h>
|
||||||
#include <scsi/scsi_transport.h>
|
#include <scsi/scsi_transport.h>
|
||||||
|
|
||||||
|
#ifdef __BIG_ENDIAN
|
||||||
|
#define __BIGENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BFA_ERR KERN_ERR
|
#define BFA_ERR KERN_ERR
|
||||||
#define BFA_WARNING KERN_WARNING
|
#define BFA_WARNING KERN_WARNING
|
||||||
#define BFA_NOTICE KERN_NOTICE
|
#define BFA_NOTICE KERN_NOTICE
|
||||||
@@ -123,6 +127,15 @@ int bfa_os_MWB(void *);
|
|||||||
(((_x) & 0x00ff0000) >> 8) | \
|
(((_x) & 0x00ff0000) >> 8) | \
|
||||||
(((_x) & 0xff000000) >> 24))
|
(((_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
|
#ifndef __BIGENDIAN
|
||||||
#define bfa_os_htons(_x) ((u16)((((_x) & 0xff00) >> 8) | \
|
#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_hton3b(_x) bfa_swap_3b(_x)
|
||||||
|
|
||||||
#define bfa_os_wtole(_x) (_x)
|
#define bfa_os_wtole(_x) (_x)
|
||||||
|
#define bfa_os_sgaddr(_x) (_x)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -141,6 +155,7 @@ int bfa_os_MWB(void *);
|
|||||||
#define bfa_os_hton3b(_x) (_x)
|
#define bfa_os_hton3b(_x) (_x)
|
||||||
#define bfa_os_htonll(_x) (_x)
|
#define bfa_os_htonll(_x) (_x)
|
||||||
#define bfa_os_wtole(_x) bfa_os_swap32(_x)
|
#define bfa_os_wtole(_x) bfa_os_swap32(_x)
|
||||||
|
#define bfa_os_sgaddr(_x) bfa_os_swap_sgaddr(_x)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user