Commit 8e65e2f0 authored by Bradley Grove's avatar Bradley Grove Committed by James Bottomley
Browse files

[SCSI] esas2r: Fixes for big-endian platforms



In esas2r_format_init_msg(), sgl_page_size and epoch_time params
are converted to little endian and the firmware version read from
the hba is converted to cpu endianess.

In esas2r_rq_init_request, correct and simplify the construction
of the SCSI handle.

These fixes are the result of testing on a PPC64 machine.

Signed-off-by: default avatarBradley Grove <bgrove@attotech.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 9588d24e
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -1207,7 +1207,6 @@ static inline void esas2r_rq_init_request(struct esas2r_request *rq,
					  struct esas2r_adapter *a)
{
	union atto_vda_req *vrq = rq->vrq;
	u32 handle;

	INIT_LIST_HEAD(&rq->sg_table_head);
	rq->data_buf = (void *)(vrq + 1);
@@ -1243,11 +1242,9 @@ static inline void esas2r_rq_init_request(struct esas2r_request *rq,

	/*
	 * add a reference number to the handle to make it unique (until it
	 * wraps of course) while preserving the upper word
	 * wraps of course) while preserving the least significant word
	 */

	handle = be32_to_cpu(vrq->scsi.handle) & 0xFFFF0000;
	vrq->scsi.handle = cpu_to_be32(handle + a->cmd_ref_no++);
	vrq->scsi.handle = (a->cmd_ref_no++ << 16) | (u16)vrq->scsi.handle;

	/*
	 * the following formats a SCSI request.  the caller can override as
+7 −4
Original line number Diff line number Diff line
@@ -1235,8 +1235,8 @@ static bool esas2r_format_init_msg(struct esas2r_adapter *a,
				     0,
				     NULL);
		ci = (struct atto_vda_cfg_init *)&rq->vrq->cfg.data.init;
		ci->sgl_page_size = sgl_page_size;
		ci->epoch_time = now.tv_sec;
		ci->sgl_page_size = cpu_to_le32(sgl_page_size);
		ci->epoch_time = cpu_to_le32(now.tv_sec);
		rq->flags |= RF_FAILURE_OK;
		a->init_msg = ESAS2R_INIT_MSG_INIT;
		break;
@@ -1246,12 +1246,15 @@ static bool esas2r_format_init_msg(struct esas2r_adapter *a,
		if (rq->req_stat == RS_SUCCESS) {
			u32 major;
			u32 minor;
			u16 fw_release;

			a->fw_version = le16_to_cpu(
				rq->func_rsp.cfg_rsp.vda_version);
			a->fw_build = rq->func_rsp.cfg_rsp.fw_build;
			major = LOBYTE(rq->func_rsp.cfg_rsp.fw_release);
			minor = HIBYTE(rq->func_rsp.cfg_rsp.fw_release);
			fw_release = le16_to_cpu(
				rq->func_rsp.cfg_rsp.fw_release);
			major = LOBYTE(fw_release);
			minor = HIBYTE(fw_release);
			a->fw_version += (major << 16) + (minor << 24);
		} else {
			esas2r_hdebug("FAILED");