Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Jan 2009 21:52:47 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r186878 - head/sys/dev/mpt
Message-ID:  <200901072152.n07Lql7h000807@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Wed Jan  7 21:52:47 2009
New Revision: 186878
URL: http://svn.freebsd.org/changeset/base/186878

Log:
  Make the whole initiator mode part of mpt(4) endian-clean,
  specifically SPI controllers now also work in big-endian
  machines and some conversions relevant for FC and SAS
  controllers as well as support for ILP32 machines which all
  were omitted in previous attempts are now also implemented.
  The IOCTL-interface is intentionally left (and where needed
  actually changed) to be completely little-endian as otherwise
  we would have to add conversion code for every possible
  configuration page to mpt(4), which didn't seem the right
  thing to do, neither did converting only half of the user-
  interface to the native byte order.
  This change was tested on amd64 (SAS+SPI), i386 (SAS) and
  sparc64 (SAS+SPI). Due to lack of the necessary hardware
  the target mode code is still left to be made endian-clean.
  
  Reviewed by:	scottl
  MFC after:	1 month

Modified:
  head/sys/dev/mpt/mpt.c
  head/sys/dev/mpt/mpt.h
  head/sys/dev/mpt/mpt_cam.c
  head/sys/dev/mpt/mpt_raid.c
  head/sys/dev/mpt/mpt_user.c

Modified: head/sys/dev/mpt/mpt.c
==============================================================================
--- head/sys/dev/mpt/mpt.c	Wed Jan  7 21:36:24 2009	(r186877)
+++ head/sys/dev/mpt/mpt.c	Wed Jan  7 21:52:47 2009	(r186878)
@@ -1637,7 +1637,7 @@ mpt_read_extcfg_header(struct mpt_softc 
 		rslt->PageVersion = cfgp->Header.PageVersion;
 		rslt->PageNumber = cfgp->Header.PageNumber;
 		rslt->PageType = cfgp->Header.PageType;
-		rslt->ExtPageLength = cfgp->ExtPageLength;
+		rslt->ExtPageLength = le16toh(cfgp->ExtPageLength);
 		rslt->ExtPageType = cfgp->ExtPageType;
 		error = 0;
 		break;
@@ -1668,7 +1668,7 @@ mpt_read_extcfg_page(struct mpt_softc *m
 
 	req = mpt_get_request(mpt, sleep_ok);
 	if (req == NULL) {
-		mpt_prt(mpt, "mpt_read_cfg_page: Get request failed!\n");
+		mpt_prt(mpt, "mpt_read_extcfg_page: Get request failed!\n");
 		return (-1);
 	}
 
@@ -2025,6 +2025,7 @@ mpt_read_config_info_ioc(struct mpt_soft
 		mpt_raid_free_mem(mpt);
 		return (EIO);
 	}
+	mpt2host_config_page_ioc3(mpt->ioc_page3);
 	mpt_raid_wakeup(mpt);
 	return (0);
 }
@@ -2760,6 +2761,7 @@ mpt_enable_ioc(struct mpt_softc *mpt, in
 void
 mpt2host_sge_simple_union(SGE_SIMPLE_UNION *sge)
 {
+
 	MPT_2_HOST32(sge, FlagsLength);
 	MPT_2_HOST32(sge, u.Address64.Low);
 	MPT_2_HOST32(sge, u.Address64.High);
@@ -2768,6 +2770,7 @@ mpt2host_sge_simple_union(SGE_SIMPLE_UNI
 void
 mpt2host_iocfacts_reply(MSG_IOC_FACTS_REPLY *rp)
 {
+
 	MPT_2_HOST16(rp, MsgVersion);
 	MPT_2_HOST16(rp, HeaderVersion);
 	MPT_2_HOST32(rp, MsgContext);
@@ -2794,6 +2797,7 @@ mpt2host_iocfacts_reply(MSG_IOC_FACTS_RE
 void
 mpt2host_portfacts_reply(MSG_PORT_FACTS_REPLY *pfp)
 {
+
 	MPT_2_HOST16(pfp, Reserved);
 	MPT_2_HOST16(pfp, Reserved1);
 	MPT_2_HOST32(pfp, MsgContext);
@@ -2809,20 +2813,139 @@ mpt2host_portfacts_reply(MSG_PORT_FACTS_
 	MPT_2_HOST16(pfp, Reserved4);
 	MPT_2_HOST32(pfp, Reserved5);
 }
+
 void
 mpt2host_config_page_ioc2(CONFIG_PAGE_IOC_2 *ioc2)
 {
 	int i;
-	ioc2->CapabilitiesFlags = htole32(ioc2->CapabilitiesFlags);
+
+	MPT_2_HOST32(ioc2, CapabilitiesFlags);
 	for (i = 0; i < MPI_IOC_PAGE_2_RAID_VOLUME_MAX; i++) {
 		MPT_2_HOST16(ioc2, RaidVolume[i].Reserved3);
 	}
 }
 
 void
+mpt2host_config_page_ioc3(CONFIG_PAGE_IOC_3 *ioc3)
+{
+
+	MPT_2_HOST16(ioc3, Reserved2);
+}
+
+void
+mpt2host_config_page_scsi_port_0(CONFIG_PAGE_SCSI_PORT_0 *sp0)
+{
+
+	MPT_2_HOST32(sp0, Capabilities);
+	MPT_2_HOST32(sp0, PhysicalInterface);
+}
+
+void
+mpt2host_config_page_scsi_port_1(CONFIG_PAGE_SCSI_PORT_1 *sp1)
+{
+
+	MPT_2_HOST32(sp1, Configuration);
+	MPT_2_HOST32(sp1, OnBusTimerValue);
+	MPT_2_HOST16(sp1, IDConfig);
+}
+
+void
+host2mpt_config_page_scsi_port_1(CONFIG_PAGE_SCSI_PORT_1 *sp1)
+{
+
+	HOST_2_MPT32(sp1, Configuration);
+	HOST_2_MPT32(sp1, OnBusTimerValue);
+	HOST_2_MPT16(sp1, IDConfig);
+}
+
+void
+mpt2host_config_page_scsi_port_2(CONFIG_PAGE_SCSI_PORT_2 *sp2)
+{
+	int i;
+
+	MPT_2_HOST32(sp2, PortFlags);
+	MPT_2_HOST32(sp2, PortSettings);
+	for (i = 0; i < sizeof(sp2->DeviceSettings) /
+	    sizeof(*sp2->DeviceSettings); i++) {
+		MPT_2_HOST16(sp2, DeviceSettings[i].DeviceFlags);
+	}
+}
+
+void
+mpt2host_config_page_scsi_device_0(CONFIG_PAGE_SCSI_DEVICE_0 *sd0)
+{
+
+	MPT_2_HOST32(sd0, NegotiatedParameters);
+	MPT_2_HOST32(sd0, Information);
+}
+
+void
+mpt2host_config_page_scsi_device_1(CONFIG_PAGE_SCSI_DEVICE_1 *sd1)
+{
+
+	MPT_2_HOST32(sd1, RequestedParameters);
+	MPT_2_HOST32(sd1, Reserved);
+	MPT_2_HOST32(sd1, Configuration);
+}
+
+void
+host2mpt_config_page_scsi_device_1(CONFIG_PAGE_SCSI_DEVICE_1 *sd1)
+{
+
+	HOST_2_MPT32(sd1, RequestedParameters);
+	HOST_2_MPT32(sd1, Reserved);
+	HOST_2_MPT32(sd1, Configuration);
+}
+
+void
+mpt2host_config_page_fc_port_0(CONFIG_PAGE_FC_PORT_0 *fp0)
+{
+
+	MPT_2_HOST32(fp0, Flags);
+	MPT_2_HOST32(fp0, PortIdentifier);
+	MPT_2_HOST32(fp0, WWNN.Low);
+	MPT_2_HOST32(fp0, WWNN.High);
+	MPT_2_HOST32(fp0, WWPN.Low);
+	MPT_2_HOST32(fp0, WWPN.High);
+	MPT_2_HOST32(fp0, SupportedServiceClass);
+	MPT_2_HOST32(fp0, SupportedSpeeds);
+	MPT_2_HOST32(fp0, CurrentSpeed);
+	MPT_2_HOST32(fp0, MaxFrameSize);
+	MPT_2_HOST32(fp0, FabricWWNN.Low);
+	MPT_2_HOST32(fp0, FabricWWNN.High);
+	MPT_2_HOST32(fp0, FabricWWPN.Low);
+	MPT_2_HOST32(fp0, FabricWWPN.High);
+	MPT_2_HOST32(fp0, DiscoveredPortsCount);
+	MPT_2_HOST32(fp0, MaxInitiators);
+}
+
+void
+mpt2host_config_page_fc_port_1(CONFIG_PAGE_FC_PORT_1 *fp1)
+{
+
+	MPT_2_HOST32(fp1, Flags);
+	MPT_2_HOST32(fp1, NoSEEPROMWWNN.Low);
+	MPT_2_HOST32(fp1, NoSEEPROMWWNN.High);
+	MPT_2_HOST32(fp1, NoSEEPROMWWPN.Low);
+	MPT_2_HOST32(fp1, NoSEEPROMWWPN.High);
+}
+
+void
+host2mpt_config_page_fc_port_1(CONFIG_PAGE_FC_PORT_1 *fp1)
+{
+
+	HOST_2_MPT32(fp1, Flags);
+	HOST_2_MPT32(fp1, NoSEEPROMWWNN.Low);
+	HOST_2_MPT32(fp1, NoSEEPROMWWNN.High);
+	HOST_2_MPT32(fp1, NoSEEPROMWWPN.Low);
+	HOST_2_MPT32(fp1, NoSEEPROMWWPN.High);
+}
+
+void
 mpt2host_config_page_raid_vol_0(CONFIG_PAGE_RAID_VOL_0 *volp)
 {
 	int i;
+
 	MPT_2_HOST16(volp, VolumeStatus.Reserved);
 	MPT_2_HOST16(volp, VolumeSettings.Settings);
 	MPT_2_HOST32(volp, MaxLBA);
@@ -2836,8 +2959,21 @@ mpt2host_config_page_raid_vol_0(CONFIG_P
 }
 
 void
+mpt2host_config_page_raid_phys_disk_0(CONFIG_PAGE_RAID_PHYS_DISK_0 *rpd0)
+{
+
+	MPT_2_HOST32(rpd0, Reserved1);
+	MPT_2_HOST16(rpd0, PhysDiskStatus.Reserved);
+	MPT_2_HOST32(rpd0, MaxLBA);
+	MPT_2_HOST16(rpd0, ErrorData.Reserved);
+	MPT_2_HOST16(rpd0, ErrorData.ErrorCount);
+	MPT_2_HOST16(rpd0, ErrorData.SmartCount);
+}
+
+void
 mpt2host_mpi_raid_vol_indicator(MPI_RAID_VOL_INDICATOR *vi)
 {
+
 	MPT_2_HOST16(vi, TotalBlocks.High);
 	MPT_2_HOST16(vi, TotalBlocks.Low);
 	MPT_2_HOST16(vi, BlocksRemaining.High);

Modified: head/sys/dev/mpt/mpt.h
==============================================================================
--- head/sys/dev/mpt/mpt.h	Wed Jan  7 21:36:24 2009	(r186877)
+++ head/sys/dev/mpt/mpt.h	Wed Jan  7 21:52:47 2009	(r186878)
@@ -317,14 +317,39 @@ void mpt2host_sge_simple_union(SGE_SIMPL
 void mpt2host_iocfacts_reply(MSG_IOC_FACTS_REPLY *);
 void mpt2host_portfacts_reply(MSG_PORT_FACTS_REPLY *);
 void mpt2host_config_page_ioc2(CONFIG_PAGE_IOC_2 *);
+void mpt2host_config_page_ioc3(CONFIG_PAGE_IOC_3 *);
+void mpt2host_config_page_scsi_port_0(CONFIG_PAGE_SCSI_PORT_0 *);
+void mpt2host_config_page_scsi_port_1(CONFIG_PAGE_SCSI_PORT_1 *);
+void host2mpt_config_page_scsi_port_1(CONFIG_PAGE_SCSI_PORT_1 *);
+void mpt2host_config_page_scsi_port_2(CONFIG_PAGE_SCSI_PORT_2 *);
+void mpt2host_config_page_scsi_device_0(CONFIG_PAGE_SCSI_DEVICE_0 *);
+void mpt2host_config_page_scsi_device_1(CONFIG_PAGE_SCSI_DEVICE_1 *);
+void host2mpt_config_page_scsi_device_1(CONFIG_PAGE_SCSI_DEVICE_1 *);
+void mpt2host_config_page_fc_port_0(CONFIG_PAGE_FC_PORT_0 *);
+void mpt2host_config_page_fc_port_1(CONFIG_PAGE_FC_PORT_1 *);
+void host2mpt_config_page_fc_port_1(CONFIG_PAGE_FC_PORT_1 *);
 void mpt2host_config_page_raid_vol_0(CONFIG_PAGE_RAID_VOL_0 *);
+void mpt2host_config_page_raid_phys_disk_0(CONFIG_PAGE_RAID_PHYS_DISK_0 *);
 void mpt2host_mpi_raid_vol_indicator(MPI_RAID_VOL_INDICATOR *);
 #else
 #define	mpt2host_sge_simple_union(x)		do { ; } while (0)
 #define	mpt2host_iocfacts_reply(x)		do { ; } while (0)
 #define	mpt2host_portfacts_reply(x)		do { ; } while (0)
 #define	mpt2host_config_page_ioc2(x)		do { ; } while (0)
+#define	mpt2host_config_page_ioc3(x)		do { ; } while (0)
+#define	mpt2host_config_page_scsi_port_0(x)	do { ; } while (0)
+#define	mpt2host_config_page_scsi_port_1(x)	do { ; } while (0)
+#define	host2mpt_config_page_scsi_port_1(x)	do { ; } while (0)
+#define	mpt2host_config_page_scsi_port_2(x)	do { ; } while (0)
+#define	mpt2host_config_page_scsi_device_0(x)	do { ; } while (0)
+#define	mpt2host_config_page_scsi_device_1(x)	do { ; } while (0)
+#define	host2mpt_config_page_scsi_device_1(x)	do { ; } while (0)
+#define	mpt2host_config_page_fc_port_0(x)	do { ; } while (0)
+#define	mpt2host_config_page_fc_port_1(x)	do { ; } while (0)
+#define	host2mpt_config_page_fc_port_1(x)	do { ; } while (0)
 #define	mpt2host_config_page_raid_vol_0(x)	do { ; } while (0)
+#define	mpt2host_config_page_raid_phys_disk_0(x)			\
+	do { ; } while (0)
 #define	mpt2host_mpi_raid_vol_indicator(x)	do { ; } while (0)
 #endif
 

Modified: head/sys/dev/mpt/mpt_cam.c
==============================================================================
--- head/sys/dev/mpt/mpt_cam.c	Wed Jan  7 21:36:24 2009	(r186877)
+++ head/sys/dev/mpt/mpt_cam.c	Wed Jan  7 21:52:47 2009	(r186878)
@@ -437,6 +437,7 @@ mpt_read_config_info_fc(struct mpt_softc
 		mpt_prt(mpt, "failed to read FC Port Page 0\n");
 		return (-1);
 	}
+	mpt2host_config_page_fc_port_0(&mpt->mpt_fcport_page0);
 
 	mpt->mpt_fcport_speed = mpt->mpt_fcport_page0.CurrentSpeed;
 
@@ -527,13 +528,14 @@ mpt_set_initial_config_fc(struct mpt_sof
 		mpt_prt(mpt, "failed to read FC page 1\n");
 		return (mpt_fc_reset_link(mpt, 1));
 	}
+	mpt2host_config_page_fc_port_1(&fc);
 
 	/*
 	 * Check our flags to make sure we support the role we want.
 	 */
 	doit = 0;
 	role = 0;
-	fl = le32toh(fc.Flags);;
+	fl = fc.Flags;
 
 	if (fl & MPI_FCPORTPAGE1_FLAGS_PROT_FCP_INIT) {
 		role |= MPT_ROLE_INITIATOR;
@@ -587,7 +589,8 @@ mpt_set_initial_config_fc(struct mpt_sof
 	}
 
 	if (doit) {
-		fc.Flags = htole32(fl);
+		fc.Flags = fl;
+		host2mpt_config_page_fc_port_1(&fc);
 		r = mpt_write_cfg_page(mpt,
 		    MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM, 0, &fc.Header,
 		    sizeof(fc), FALSE, 5000);
@@ -982,6 +985,7 @@ mpt_read_config_info_spi(struct mpt_soft
 	if (rv) {
 		mpt_prt(mpt, "failed to read SPI Port Page 0\n");
 	} else {
+		mpt2host_config_page_scsi_port_0(&mpt->mpt_port_page0);
 		mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
 		    "SPI Port Page 0: Capabilities %x PhysicalInterface %x\n",
 		    mpt->mpt_port_page0.Capabilities,
@@ -993,6 +997,7 @@ mpt_read_config_info_spi(struct mpt_soft
 	if (rv) {
 		mpt_prt(mpt, "failed to read SPI Port Page 1\n");
 	} else {
+		mpt2host_config_page_scsi_port_1(&mpt->mpt_port_page1);
 		mpt_lprt(mpt, MPT_PRT_DEBUG,
 		    "SPI Port Page 1: Configuration %x OnBusTimerValue %x\n",
 		    mpt->mpt_port_page1.Configuration,
@@ -1008,6 +1013,7 @@ mpt_read_config_info_spi(struct mpt_soft
 		    "Port Page 2: Flags %x Settings %x\n",
 		    mpt->mpt_port_page2.PortFlags,
 		    mpt->mpt_port_page2.PortSettings);
+		mpt2host_config_page_scsi_port_2(&mpt->mpt_port_page2);
 		for (i = 0; i < 16; i++) {
 			mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
 		  	    " Port Page 2 Tgt %d: timo %x SF %x Flags %x\n",
@@ -1026,6 +1032,7 @@ mpt_read_config_info_spi(struct mpt_soft
 			    "cannot read SPI Target %d Device Page 0\n", i);
 			continue;
 		}
+		mpt2host_config_page_scsi_device_0(&mpt->mpt_dev_page0[i]);
 		mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
 		    "target %d page 0: Negotiated Params %x Information %x\n",
 		    i, mpt->mpt_dev_page0[i].NegotiatedParameters,
@@ -1039,6 +1046,7 @@ mpt_read_config_info_spi(struct mpt_soft
 			    "cannot read SPI Target %d Device Page 1\n", i);
 			continue;
 		}
+		mpt2host_config_page_scsi_device_1(&mpt->mpt_dev_page1[i]);
 		mpt_lprt(mpt, MPT_PRT_NEGOTIATION,
 		    "target %d page 1: Requested Params %x Configuration %x\n",
 		    i, mpt->mpt_dev_page1[i].RequestedParameters,
@@ -1068,6 +1076,7 @@ mpt_set_initial_config_spi(struct mpt_so
 		    "be %x\n", mpt->mpt_port_page1.Configuration, pp1val);
 		tmp = mpt->mpt_port_page1;
 		tmp.Configuration = pp1val;
+		host2mpt_config_page_scsi_port_1(&tmp);
 		error = mpt_write_cur_cfg_page(mpt, 0,
 		    &tmp.Header, sizeof(tmp), FALSE, 5000);
 		if (error) {
@@ -1078,6 +1087,7 @@ mpt_set_initial_config_spi(struct mpt_so
 		if (error) {
 			return (-1);
 		}
+		mpt2host_config_page_scsi_port_1(&tmp);
 		if (tmp.Configuration != pp1val) {
 			mpt_prt(mpt,
 			    "failed to reset SPI Port Page 1 Config value\n");
@@ -1432,7 +1442,8 @@ bad:
 		memset(se, 0, sizeof (*se));
 		se->Address.Low = htole32(dm_segs->ds_addr & 0xffffffff);
 		if (sizeof(bus_addr_t) > 4) {
-			se->Address.High = ((uint64_t) dm_segs->ds_addr) >> 32;
+			se->Address.High =
+			    htole32(((uint64_t)dm_segs->ds_addr) >> 32);
 		}
 		MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len);
 		tf = flags;
@@ -1507,9 +1518,9 @@ bad:
 		chain_list_addr += cur_off;
 		if (sizeof (bus_addr_t) > 4) {
 			ce->Address.High =
-			    htole32((uint32_t) ((uint64_t)chain_list_addr >> 32));
+			    htole32(((uint64_t)chain_list_addr) >> 32);
 		}
-		ce->Address.Low = htole32((uint32_t) chain_list_addr);
+		ce->Address.Low = htole32(chain_list_addr & 0xffffffff);
 		ce->Flags = MPI_SGE_FLAGS_CHAIN_ELEMENT |
 			    MPI_SGE_FLAGS_64_BIT_ADDRESSING;
 
@@ -1536,6 +1547,7 @@ bad:
 			ce->Length = (this_seg_lim - seg) *
 			    sizeof (SGE_SIMPLE64);
 		}
+		ce->Length = htole16(ce->Length);
 
 		/*
 		 * Fill in the chain list SGE elements with our segment data.
@@ -1546,7 +1558,8 @@ bad:
 		 */
 		while (seg < this_seg_lim) {
 			memset(se, 0, sizeof (*se));
-			se->Address.Low = htole32(dm_segs->ds_addr);
+			se->Address.Low = htole32(dm_segs->ds_addr &
+			    0xffffffff);
 			if (sizeof (bus_addr_t) > 4) {
 				se->Address.High =
 				    htole32(((uint64_t)dm_segs->ds_addr) >> 32);
@@ -1830,7 +1843,7 @@ bad:
 		uint32_t tf;
 
 		memset(se, 0,sizeof (*se));
-		se->Address = dm_segs->ds_addr;
+		se->Address = htole32(dm_segs->ds_addr);
 
 
 
@@ -1908,7 +1921,7 @@ bad:
 
 
 
-		ce->Address = chain_list_addr;
+		ce->Address = htole32(chain_list_addr);
 		ce->Flags = MPI_SGE_FLAGS_CHAIN_ELEMENT;
 
 
@@ -1935,6 +1948,7 @@ bad:
 			ce->Length = (this_seg_lim - seg) *
 			    sizeof (SGE_SIMPLE32);
 		}
+		ce->Length = htole16(ce->Length);
 
 		/*
 		 * Fill in the chain list SGE elements with our segment data.
@@ -1945,7 +1959,7 @@ bad:
 		 */
 		while (seg < this_seg_lim) {
 			memset(se, 0, sizeof (*se));
-			se->Address = dm_segs->ds_addr;
+			se->Address = htole32(dm_segs->ds_addr);
 
 
 
@@ -2193,6 +2207,7 @@ mpt_start(struct cam_sim *sim, union ccb
 			mpt_req->Control |= MPI_SCSIIO_CONTROL_NO_DISCONNECT;
 		}
 	}
+	mpt_req->Control = htole32(mpt_req->Control);
 
 	/* Copy the scsi command block into place */
 	if ((ccb->ccb_h.flags & CAM_CDB_POINTER) != 0) {
@@ -2317,7 +2332,7 @@ mpt_bus_reset(struct mpt_softc *mpt, tar
 	error = mpt_wait_req(mpt, mpt->tmf_req, REQ_STATE_DONE,
 	    REQ_STATE_DONE, sleep_ok, 5000);
 
-	status = mpt->tmf_req->IOCStatus;
+	status = le16toh(mpt->tmf_req->IOCStatus);
 	response = mpt->tmf_req->ResponseCode;
 	mpt->tmf_req->state = REQ_STATE_FREE;
 
@@ -2524,10 +2539,11 @@ mpt_cam_event(struct mpt_softc *mpt, req
 		struct cam_sim *sim;
 		struct cam_path *tmppath;
 		struct ccb_relsim crs;
-		PTR_EVENT_DATA_QUEUE_FULL pqf =
-		    (PTR_EVENT_DATA_QUEUE_FULL) msg->Data;
+		PTR_EVENT_DATA_QUEUE_FULL pqf;
 		lun_id_t lun_id;
 
+		pqf = (PTR_EVENT_DATA_QUEUE_FULL)msg->Data;
+		pqf->CurrentDepth = le16toh(pqf->CurrentDepth);
 		mpt_prt(mpt, "QUEUE FULL EVENT: Bus 0x%02x Target 0x%02x Depth "
 		    "%d\n", pqf->Bus, pqf->TargetID, pqf->CurrentDepth);
 		if (mpt->phydisk_sim) {
@@ -3086,9 +3102,10 @@ mpt_scsi_reply_frame_handler(struct mpt_
 	 && (ccb->ccb_h.flags & (CAM_SENSE_PHYS | CAM_SENSE_PTR)) == 0) {
 		ccb->ccb_h.status |= CAM_AUTOSNS_VALID;
 		ccb->csio.sense_resid =
-		    ccb->csio.sense_len - scsi_io_reply->SenseCount;
+		    ccb->csio.sense_len - le32toh(scsi_io_reply->SenseCount);
 		bcopy(req->sense_vbuf, &ccb->csio.sense_data,
-		      min(ccb->csio.sense_len, scsi_io_reply->SenseCount));
+		    min(ccb->csio.sense_len,
+		    le32toh(scsi_io_reply->SenseCount)));
 	}
 
 	if ((sstate & MPI_SCSI_STATE_QUEUE_TAG_REJECTED) != 0) {
@@ -3776,6 +3793,8 @@ mpt_get_spi_settings(struct mpt_softc *m
 			mpt_prt(mpt, "can't get tgt %d config page 0\n", tgt);
 			return (rv);
 		}
+		mpt2host_config_page_scsi_device_0(&tmp);
+		
 		MPTLOCK_2_CAMLOCK(mpt);
 		mpt_lprt(mpt, MPT_PRT_DEBUG,
 		    "mpt_get_spi_settings[%d]: current NP %x Info %x\n", tgt,
@@ -3905,6 +3924,7 @@ mpt_update_spi_config(struct mpt_softc *
 	    "mpt_update_spi_config[%d].page1: Requested Params 0x%08x\n",
 	    tgt, mpt->mpt_dev_page1[tgt].RequestedParameters);
 	tmp = mpt->mpt_dev_page1[tgt];
+	host2mpt_config_page_scsi_device_1(&tmp);
 	rv = mpt_write_cur_cfg_page(mpt, tgt,
 	    &tmp.Header, sizeof(tmp), FALSE, 5000);
 	if (rv) {
@@ -4156,7 +4176,7 @@ mpt_recover_commands(struct mpt_softc *m
 		error = mpt_wait_req(mpt, mpt->tmf_req, REQ_STATE_DONE,
 		    REQ_STATE_DONE, TRUE, 500);
 
-		status = mpt->tmf_req->IOCStatus;
+		status = le16toh(mpt->tmf_req->IOCStatus);
 		response = mpt->tmf_req->ResponseCode;
 		mpt->tmf_req->state = REQ_STATE_FREE;
 

Modified: head/sys/dev/mpt/mpt_raid.c
==============================================================================
--- head/sys/dev/mpt/mpt_raid.c	Wed Jan  7 21:36:24 2009	(r186877)
+++ head/sys/dev/mpt/mpt_raid.c	Wed Jan  7 21:52:47 2009	(r186878)
@@ -564,7 +564,7 @@ mpt_raid_reply_frame_handler(struct mpt_
 	action_result = REQ_TO_RAID_ACTION_RESULT(req);
 	memcpy(&action_result->action_data, &reply->ActionData,
 	    sizeof(action_result->action_data));
-	action_result->action_status = reply->ActionStatus;
+	action_result->action_status = le16toh(reply->ActionStatus);
 	return (TRUE);
 }
 
@@ -583,7 +583,7 @@ mpt_issue_raid_req(struct mpt_softc *mpt
 	rap = req->req_vbuf;
 	memset(rap, 0, sizeof *rap);
 	rap->Action = Action;
-	rap->ActionDataWord = ActionDataWord;
+	rap->ActionDataWord = htole32(ActionDataWord);
 	rap->Function = MPI_FUNCTION_RAID_ACTION;
 	rap->VolumeID = vol->config_page->VolumeID;
 	rap->VolumeBus = vol->config_page->VolumeBus;
@@ -592,12 +592,13 @@ mpt_issue_raid_req(struct mpt_softc *mpt
 	else
 		rap->PhysDiskNum = 0xFF;
 	se = (SGE_SIMPLE32 *)&rap->ActionDataSGE;
-	se->Address = addr;
+	se->Address = htole32(addr);
 	MPI_pSGE_SET_LENGTH(se, len);
 	MPI_pSGE_SET_FLAGS(se, (MPI_SGE_FLAGS_SIMPLE_ELEMENT |
 	    MPI_SGE_FLAGS_LAST_ELEMENT | MPI_SGE_FLAGS_END_OF_BUFFER |
 	    MPI_SGE_FLAGS_END_OF_LIST |
 	    write ? MPI_SGE_FLAGS_HOST_TO_IOC : MPI_SGE_FLAGS_IOC_TO_HOST));
+	se->FlagsLength = htole32(se->FlagsLength);
 	rap->MsgContext = htole32(req->index | raid_handler_id);
 
 	mpt_check_doorbell(mpt);
@@ -1226,6 +1227,7 @@ mpt_refresh_raid_disk(struct mpt_softc *
 		mpt_prt(mpt, "mpt_refresh_raid_disk: "
 			"Failed to read RAID Disk Page(%d)\n",
 		 	ioc_disk->PhysDiskNum);
+	mpt2host_config_page_raid_phys_disk_0(&mpt_disk->config_page);
 }
 
 static void
@@ -1354,6 +1356,7 @@ mpt_refresh_raid_data(struct mpt_softc *
 		    "mpt_refresh_raid_data: Failed to read IOC Page 3\n");
 		return (-1);
 	}
+	mpt2host_config_page_ioc3(mpt->ioc_page3);
 
 	ioc_disk = mpt->ioc_page3->PhysDisk;
 	ioc_last_disk = ioc_disk + mpt->ioc_page3->NumPhysDisks;
@@ -1384,6 +1387,7 @@ mpt_refresh_raid_data(struct mpt_softc *
 			"Failed to read IOC Page 2\n");
 		return (-1);
 	}
+	mpt2host_config_page_ioc2(mpt->ioc_page2);
 
 	ioc_vol = mpt->ioc_page2->RaidVolume;
 	ioc_last_vol = ioc_vol + mpt->ioc_page2->NumActiveVolumes;

Modified: head/sys/dev/mpt/mpt_user.c
==============================================================================
--- head/sys/dev/mpt/mpt_user.c	Wed Jan  7 21:36:24 2009	(r186877)
+++ head/sys/dev/mpt/mpt_user.c	Wed Jan  7 21:52:47 2009	(r186878)
@@ -256,7 +256,7 @@ mpt_user_read_cfg_header(struct mpt_soft
 	params.PageLength = 0;
 	params.PageNumber = page_req->header.PageNumber;
 	params.PageType = page_req->header.PageType;
-	params.PageAddress = page_req->page_address;
+	params.PageAddress = le32toh(page_req->page_address);
 	error = mpt_issue_cfg_req(mpt, req, &params, /*addr*/0, /*len*/0,
 				  TRUE, 5000);
 	if (error != 0) {
@@ -270,7 +270,7 @@ mpt_user_read_cfg_header(struct mpt_soft
 		return (ETIMEDOUT);
 	}
 
-	page_req->ioc_status = req->IOCStatus;
+	page_req->ioc_status = htole16(req->IOCStatus);
 	if ((req->IOCStatus & MPI_IOCSTATUS_MASK) == MPI_IOCSTATUS_SUCCESS) {
 		cfgp = req->req_vbuf;
 		bcopy(&cfgp->Header, &page_req->header,
@@ -301,15 +301,15 @@ mpt_user_read_cfg_page(struct mpt_softc 
 	params.PageLength = hdr->PageLength;
 	params.PageNumber = hdr->PageNumber;
 	params.PageType = hdr->PageType & MPI_CONFIG_PAGETYPE_MASK;
-	params.PageAddress = page_req->page_address;
+	params.PageAddress = le32toh(page_req->page_address);
 	error = mpt_issue_cfg_req(mpt, req, &params, mpt_page->paddr,
-				  page_req->len, TRUE, 5000);
+	    le32toh(page_req->len), TRUE, 5000);
 	if (error != 0) {
 		mpt_prt(mpt, "mpt_user_read_cfg_page timed out\n");
 		return (ETIMEDOUT);
 	}
 
-	page_req->ioc_status = req->IOCStatus;
+	page_req->ioc_status = htole16(req->IOCStatus);
 	if ((req->IOCStatus & MPI_IOCSTATUS_MASK) == MPI_IOCSTATUS_SUCCESS)
 		bus_dmamap_sync(mpt_page->tag, mpt_page->map,
 		    BUS_DMASYNC_POSTREAD);
@@ -337,7 +337,7 @@ mpt_user_read_extcfg_header(struct mpt_s
 	params.PageLength = 0;
 	params.PageNumber = ext_page_req->header.PageNumber;
 	params.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
-	params.PageAddress = ext_page_req->page_address;
+	params.PageAddress = le32toh(ext_page_req->page_address);
 	params.ExtPageType = ext_page_req->header.ExtPageType;
 	params.ExtPageLength = 0;
 	error = mpt_issue_cfg_req(mpt, req, &params, /*addr*/0, /*len*/0,
@@ -353,7 +353,7 @@ mpt_user_read_extcfg_header(struct mpt_s
 		return (ETIMEDOUT);
 	}
 
-	ext_page_req->ioc_status = req->IOCStatus;
+	ext_page_req->ioc_status = htole16(req->IOCStatus);
 	if ((req->IOCStatus & MPI_IOCSTATUS_MASK) == MPI_IOCSTATUS_SUCCESS) {
 		cfgp = req->req_vbuf;
 		ext_page_req->header.PageVersion = cfgp->Header.PageVersion;
@@ -387,17 +387,17 @@ mpt_user_read_extcfg_page(struct mpt_sof
 	params.PageLength = 0;
 	params.PageNumber = hdr->PageNumber;
 	params.PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
-	params.PageAddress = ext_page_req->page_address;
+	params.PageAddress = le32toh(ext_page_req->page_address);
 	params.ExtPageType = hdr->ExtPageType;
 	params.ExtPageLength = hdr->ExtPageLength;
 	error = mpt_issue_cfg_req(mpt, req, &params, mpt_page->paddr,
-				  ext_page_req->len, TRUE, 5000);
+	    le32toh(ext_page_req->len), TRUE, 5000);
 	if (error != 0) {
 		mpt_prt(mpt, "mpt_user_read_extcfg_page timed out\n");
 		return (ETIMEDOUT);
 	}
 
-	ext_page_req->ioc_status = req->IOCStatus;
+	ext_page_req->ioc_status = htole16(req->IOCStatus);
 	if ((req->IOCStatus & MPI_IOCSTATUS_MASK) == MPI_IOCSTATUS_SUCCESS)
 		bus_dmamap_sync(mpt_page->tag, mpt_page->map,
 		    BUS_DMASYNC_POSTREAD);
@@ -446,7 +446,7 @@ mpt_user_write_cfg_page(struct mpt_softc
 	params.PageVersion = hdr->PageVersion;
 	params.PageLength = hdr->PageLength;
 	params.PageNumber = hdr->PageNumber;
-	params.PageAddress = page_req->page_address;
+	params.PageAddress = le32toh(page_req->page_address);
 #if	0
 	/* Restore stripped out attributes */
 	hdr->PageType |= hdr_attr;
@@ -455,13 +455,13 @@ mpt_user_write_cfg_page(struct mpt_softc
 	params.PageType = hdr->PageType;
 #endif
 	error = mpt_issue_cfg_req(mpt, req, &params, mpt_page->paddr,
-				  page_req->len, TRUE, 5000);
+	    le32toh(page_req->len), TRUE, 5000);
 	if (error != 0) {
 		mpt_prt(mpt, "mpt_write_cfg_page timed out\n");
 		return (ETIMEDOUT);
 	}
 
-	page_req->ioc_status = req->IOCStatus;
+	page_req->ioc_status = htole16(req->IOCStatus);
 	mpt_free_request(mpt, req);
 	return (0);
 }
@@ -536,14 +536,15 @@ mpt_user_raid_action(struct mpt_softc *m
 	if (mpt_page->vaddr != NULL && raid_act->len != 0) {
 		bus_dmamap_sync(mpt_page->tag, mpt_page->map,
 		    BUS_DMASYNC_PREWRITE);
-		se->Address = mpt_page->paddr;
-		MPI_pSGE_SET_LENGTH(se, raid_act->len);
+		se->Address = htole32(mpt_page->paddr);
+		MPI_pSGE_SET_LENGTH(se, le32toh(raid_act->len));
 		MPI_pSGE_SET_FLAGS(se, (MPI_SGE_FLAGS_SIMPLE_ELEMENT |
 		    MPI_SGE_FLAGS_LAST_ELEMENT | MPI_SGE_FLAGS_END_OF_BUFFER |
 		    MPI_SGE_FLAGS_END_OF_LIST |
 		    raid_act->write ? MPI_SGE_FLAGS_HOST_TO_IOC :
 		    MPI_SGE_FLAGS_IOC_TO_HOST));
 	}
+	se->FlagsLength = htole32(se->FlagsLength);
 	rap->MsgContext = htole32(req->index | user_handler_id);
 
 	mpt_check_doorbell(mpt);
@@ -559,7 +560,7 @@ mpt_user_raid_action(struct mpt_softc *m
 		return (error);
 	}
 
-	raid_act->ioc_status = req->IOCStatus;
+	raid_act->ioc_status = htole16(req->IOCStatus);
 	if ((req->IOCStatus & MPI_IOCSTATUS_MASK) != MPI_IOCSTATUS_SUCCESS) {
 		mpt_free_request(mpt, req);
 		return (0);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901072152.n07Lql7h000807>