Skip to content

Commit cf6bf97

Browse files
Chaitra P Bmartinkpetersen
authored andcommitted
scsi: mpt3sas: Bug fix for big endian systems.
This patch fixes sparse warnings and bugs on big endian systems. Signed-off-by: Chaitra P B <chaitra.basappa@broadcom.com> Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 23b389c commit cf6bf97

File tree

6 files changed

+71
-63
lines changed

6 files changed

+71
-63
lines changed

drivers/scsi/mpt3sas/mpi/mpi2_init.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575

7676
typedef struct _MPI2_SCSI_IO_CDB_EEDP32 {
7777
U8 CDB[20]; /*0x00 */
78-
U32 PrimaryReferenceTag; /*0x14 */
78+
__be32 PrimaryReferenceTag; /*0x14 */
7979
U16 PrimaryApplicationTag; /*0x18 */
8080
U16 PrimaryApplicationTagMask; /*0x1A */
8181
U32 TransferLength; /*0x1C */

drivers/scsi/mpt3sas/mpt3sas_base.c

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -394,13 +394,14 @@ static void _clone_sg_entries(struct MPT3SAS_ADAPTER *ioc,
394394
buff_ptr_phys = buffer_iomem_phys;
395395
WARN_ON(buff_ptr_phys > U32_MAX);
396396

397-
if (sgel->FlagsLength &
397+
if (le32_to_cpu(sgel->FlagsLength) &
398398
(MPI2_SGE_FLAGS_HOST_TO_IOC << MPI2_SGE_FLAGS_SHIFT))
399399
is_write = 1;
400400

401401
for (i = 0; i < MPT_MIN_PHYS_SEGMENTS + ioc->facts.MaxChainDepth; i++) {
402402

403-
sgl_flags = (sgel->FlagsLength >> MPI2_SGE_FLAGS_SHIFT);
403+
sgl_flags =
404+
(le32_to_cpu(sgel->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT);
404405

405406
switch (sgl_flags & MPI2_SGE_FLAGS_ELEMENT_MASK) {
406407
case MPI2_SGE_FLAGS_CHAIN_ELEMENT:
@@ -411,7 +412,7 @@ static void _clone_sg_entries(struct MPT3SAS_ADAPTER *ioc,
411412
*/
412413
sgel_next =
413414
_base_get_chain_buffer_dma_to_chain_buffer(ioc,
414-
sgel->Address);
415+
le32_to_cpu(sgel->Address));
415416
if (sgel_next == NULL)
416417
return;
417418
/*
@@ -426,7 +427,8 @@ static void _clone_sg_entries(struct MPT3SAS_ADAPTER *ioc,
426427
dst_addr_phys = _base_get_chain_phys(ioc,
427428
smid, sge_chain_count);
428429
WARN_ON(dst_addr_phys > U32_MAX);
429-
sgel->Address = (u32)dst_addr_phys;
430+
sgel->Address =
431+
cpu_to_le32(lower_32_bits(dst_addr_phys));
430432
sgel = sgel_next;
431433
sge_chain_count++;
432434
break;
@@ -435,22 +437,28 @@ static void _clone_sg_entries(struct MPT3SAS_ADAPTER *ioc,
435437
if (is_scsiio_req) {
436438
_base_clone_to_sys_mem(buff_ptr,
437439
sg_virt(sg_scmd),
438-
(sgel->FlagsLength & 0x00ffffff));
440+
(le32_to_cpu(sgel->FlagsLength) &
441+
0x00ffffff));
439442
/*
440443
* FIXME: this relies on a a zero
441444
* PCI mem_offset.
442445
*/
443-
sgel->Address = (u32)buff_ptr_phys;
446+
sgel->Address =
447+
cpu_to_le32((u32)buff_ptr_phys);
444448
} else {
445449
_base_clone_to_sys_mem(buff_ptr,
446450
ioc->config_vaddr,
447-
(sgel->FlagsLength & 0x00ffffff));
448-
sgel->Address = (u32)buff_ptr_phys;
451+
(le32_to_cpu(sgel->FlagsLength) &
452+
0x00ffffff));
453+
sgel->Address =
454+
cpu_to_le32((u32)buff_ptr_phys);
449455
}
450456
}
451-
buff_ptr += (sgel->FlagsLength & 0x00ffffff);
452-
buff_ptr_phys += (sgel->FlagsLength & 0x00ffffff);
453-
if ((sgel->FlagsLength &
457+
buff_ptr += (le32_to_cpu(sgel->FlagsLength) &
458+
0x00ffffff);
459+
buff_ptr_phys += (le32_to_cpu(sgel->FlagsLength) &
460+
0x00ffffff);
461+
if ((le32_to_cpu(sgel->FlagsLength) &
454462
(MPI2_SGE_FLAGS_END_OF_BUFFER
455463
<< MPI2_SGE_FLAGS_SHIFT)))
456464
goto eob_clone_chain;
@@ -1433,7 +1441,7 @@ _base_interrupt(int irq, void *bus_id)
14331441
cpu_to_le32(reply);
14341442
if (ioc->is_mcpu_endpoint)
14351443
_base_clone_reply_to_sys_mem(ioc,
1436-
cpu_to_le32(reply),
1444+
reply,
14371445
ioc->reply_free_host_index);
14381446
writel(ioc->reply_free_host_index,
14391447
&ioc->chip->ReplyFreeHostIndex);
@@ -3044,7 +3052,7 @@ mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc)
30443052

30453053
for (i = 0; i < ioc->combined_reply_index_count; i++) {
30463054
ioc->replyPostRegisterIndex[i] = (resource_size_t *)
3047-
((u8 *)&ioc->chip->Doorbell +
3055+
((u8 __force *)&ioc->chip->Doorbell +
30483056
MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET +
30493057
(i * MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET));
30503058
}
@@ -3339,7 +3347,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
33393347
spinlock_t *writeq_lock)
33403348
{
33413349
unsigned long flags;
3342-
__u64 data_out = cpu_to_le64(b);
3350+
__u64 data_out = b;
33433351

33443352
spin_lock_irqsave(writeq_lock, flags);
33453353
writel((u32)(data_out), addr);
@@ -3362,7 +3370,7 @@ _base_mpi_ep_writeq(__u64 b, volatile void __iomem *addr,
33623370
static inline void
33633371
_base_writeq(__u64 b, volatile void __iomem *addr, spinlock_t *writeq_lock)
33643372
{
3365-
writeq(cpu_to_le64(b), addr);
3373+
writeq(b, addr);
33663374
}
33673375
#else
33683376
static inline void
@@ -3389,7 +3397,7 @@ _base_put_smid_mpi_ep_scsi_io(struct MPT3SAS_ADAPTER *ioc, u16 smid, u16 handle)
33893397
__le32 *mfp = (__le32 *)mpt3sas_base_get_msg_frame(ioc, smid);
33903398

33913399
_clone_sg_entries(ioc, (void *) mfp, smid);
3392-
mpi_req_iomem = (void *)ioc->chip +
3400+
mpi_req_iomem = (void __force *)ioc->chip +
33933401
MPI_FRAME_START_OFFSET + (smid * ioc->request_sz);
33943402
_base_clone_mpi_to_sys_mem(mpi_req_iomem, (void *)mfp,
33953403
ioc->request_sz);
@@ -3473,7 +3481,8 @@ mpt3sas_base_put_smid_hi_priority(struct MPT3SAS_ADAPTER *ioc, u16 smid,
34733481

34743482
request_hdr = (MPI2RequestHeader_t *)mfp;
34753483
/* TBD 256 is offset within sys register. */
3476-
mpi_req_iomem = (void *)ioc->chip + MPI_FRAME_START_OFFSET
3484+
mpi_req_iomem = (void __force *)ioc->chip
3485+
+ MPI_FRAME_START_OFFSET
34773486
+ (smid * ioc->request_sz);
34783487
_base_clone_mpi_to_sys_mem(mpi_req_iomem, (void *)mfp,
34793488
ioc->request_sz);
@@ -3542,7 +3551,7 @@ mpt3sas_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid)
35423551

35433552
_clone_sg_entries(ioc, (void *) mfp, smid);
35443553
/* TBD 256 is offset within sys register */
3545-
mpi_req_iomem = (void *)ioc->chip +
3554+
mpi_req_iomem = (void __force *)ioc->chip +
35463555
MPI_FRAME_START_OFFSET + (smid * ioc->request_sz);
35473556
_base_clone_mpi_to_sys_mem(mpi_req_iomem, (void *)mfp,
35483557
ioc->request_sz);
@@ -5002,7 +5011,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
50025011

50035012
/* send message 32-bits at a time */
50045013
for (i = 0, failed = 0; i < request_bytes/4 && !failed; i++) {
5005-
writel(cpu_to_le32(request[i]), &ioc->chip->Doorbell);
5014+
writel((u32)(request[i]), &ioc->chip->Doorbell);
50065015
if ((_base_wait_for_doorbell_ack(ioc, 5)))
50075016
failed = 1;
50085017
}
@@ -5023,7 +5032,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
50235032
}
50245033

50255034
/* read the first two 16-bits, it gives the total length of the reply */
5026-
reply[0] = le16_to_cpu(readl(&ioc->chip->Doorbell)
5035+
reply[0] = (u16)(readl(&ioc->chip->Doorbell)
50275036
& MPI2_DOORBELL_DATA_MASK);
50285037
writel(0, &ioc->chip->HostInterruptStatus);
50295038
if ((_base_wait_for_doorbell_int(ioc, 5))) {
@@ -5032,7 +5041,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
50325041
ioc->name, __LINE__);
50335042
return -EFAULT;
50345043
}
5035-
reply[1] = le16_to_cpu(readl(&ioc->chip->Doorbell)
5044+
reply[1] = (u16)(readl(&ioc->chip->Doorbell)
50365045
& MPI2_DOORBELL_DATA_MASK);
50375046
writel(0, &ioc->chip->HostInterruptStatus);
50385047

@@ -5046,7 +5055,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
50465055
if (i >= reply_bytes/2) /* overflow case */
50475056
readl(&ioc->chip->Doorbell);
50485057
else
5049-
reply[i] = le16_to_cpu(readl(&ioc->chip->Doorbell)
5058+
reply[i] = (u16)(readl(&ioc->chip->Doorbell)
50505059
& MPI2_DOORBELL_DATA_MASK);
50515060
writel(0, &ioc->chip->HostInterruptStatus);
50525061
}
@@ -6172,7 +6181,7 @@ _base_make_ioc_operational(struct MPT3SAS_ADAPTER *ioc)
61726181
ioc->reply_free[i] = cpu_to_le32(reply_address);
61736182
if (ioc->is_mcpu_endpoint)
61746183
_base_clone_reply_to_sys_mem(ioc,
6175-
(__le32)reply_address, i);
6184+
reply_address, i);
61766185
}
61776186

61786187
/* initialize reply queues */

drivers/scsi/mpt3sas/mpt3sas_base.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -829,8 +829,8 @@ struct _sc_list {
829829
*/
830830
struct _event_ack_list {
831831
struct list_head list;
832-
u16 Event;
833-
u32 EventContext;
832+
U16 Event;
833+
U32 EventContext;
834834
};
835835

836836
/**

drivers/scsi/mpt3sas/mpt3sas_ctl.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ mpt3sas_ctl_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
297297
nvme_error_reply =
298298
(Mpi26NVMeEncapsulatedErrorReply_t *)mpi_reply;
299299
sz = min_t(u32, NVME_ERROR_RESPONSE_SIZE,
300-
le32_to_cpu(nvme_error_reply->ErrorResponseCount));
300+
le16_to_cpu(nvme_error_reply->ErrorResponseCount));
301301
sense_data = mpt3sas_base_get_sense_buffer(ioc, smid);
302302
memcpy(ioc->ctl_cmds.sense, sense_data, sz);
303303
}
@@ -803,12 +803,13 @@ _ctl_do_mpt_command(struct MPT3SAS_ADAPTER *ioc, struct mpt3_ioctl_command karg,
803803
* Build the PRPs and set direction bits.
804804
* Send the request.
805805
*/
806-
nvme_encap_request->ErrorResponseBaseAddress = ioc->sense_dma &
807-
0xFFFFFFFF00000000;
806+
nvme_encap_request->ErrorResponseBaseAddress =
807+
cpu_to_le64(ioc->sense_dma & 0xFFFFFFFF00000000UL);
808808
nvme_encap_request->ErrorResponseBaseAddress |=
809-
(U64)mpt3sas_base_get_sense_buffer_dma(ioc, smid);
809+
cpu_to_le64(le32_to_cpu(
810+
mpt3sas_base_get_sense_buffer_dma(ioc, smid)));
810811
nvme_encap_request->ErrorResponseAllocationLength =
811-
NVME_ERROR_RESPONSE_SIZE;
812+
cpu_to_le16(NVME_ERROR_RESPONSE_SIZE);
812813
memset(ioc->ctl_cmds.sense, 0, NVME_ERROR_RESPONSE_SIZE);
813814
ioc->build_nvme_prp(ioc, smid, nvme_encap_request,
814815
data_out_dma, data_out_sz, data_in_dma, data_in_sz);

0 commit comments

Comments
 (0)