isci: unify remote_device data structures

Make it explicit that isci_remote_device and scic_sds_remote_device are
one in the same object.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
diff --git a/drivers/scsi/isci/core/scic_remote_device.h b/drivers/scsi/isci/core/scic_remote_device.h
index 62fa7fd..23e90af 100644
--- a/drivers/scsi/isci/core/scic_remote_device.h
+++ b/drivers/scsi/isci/core/scic_remote_device.h
@@ -87,18 +87,6 @@
 };
 
 /**
- * scic_remote_device_get_object_size() - This method simply returns the
- *    maximum memory space needed to store a remote device object.
- *
- * a positive integer value indicating the size (in bytes) of the remote device
- * object.
- */
-u32 scic_remote_device_get_object_size(
-	void);
-
-struct scic_sds_port;
-struct scic_sds_remote_device;
-/**
  * scic_remote_device_construct() - This method will perform the construction
  *    common to all remote device objects.
  * @sci_port: SAS/SATA port through which this device is accessed.
diff --git a/drivers/scsi/isci/core/scic_sds_remote_device.c b/drivers/scsi/isci/core/scic_sds_remote_device.c
index 22788bf..d314e2b 100644
--- a/drivers/scsi/isci/core/scic_sds_remote_device.c
+++ b/drivers/scsi/isci/core/scic_sds_remote_device.c
@@ -71,21 +71,6 @@
 
 #define SCIC_SDS_REMOTE_DEVICE_RESET_TIMEOUT  (1000)
 
-/*
- * *****************************************************************************
- * *  CORE REMOTE DEVICE PRIVATE METHODS
- * ***************************************************************************** */
-
-/*
- * *****************************************************************************
- * *  CORE REMOTE DEVICE PUBLIC METHODS
- * ***************************************************************************** */
-
-u32 scic_remote_device_get_object_size(void)
-{
-	return sizeof (struct scic_sds_remote_device);
-}
-
 enum sci_status scic_remote_device_da_construct(
 	struct scic_sds_remote_device *sci_dev)
 {
diff --git a/drivers/scsi/isci/host.c b/drivers/scsi/isci/host.c
index 0d706b2..3aceb92 100644
--- a/drivers/scsi/isci/host.c
+++ b/drivers/scsi/isci/host.c
@@ -467,7 +467,7 @@
 		isci_phy_init(&isci_host->phys[i], isci_host, i);
 
 	for (i = 0; i < SCI_MAX_REMOTE_DEVICES; i++) {
-		struct isci_remote_device *idev = idev_by_id(isci_host, i);
+		struct isci_remote_device *idev = &isci_host->devices[i];
 
 		INIT_LIST_HEAD(&idev->reqs_in_process);
 		INIT_LIST_HEAD(&idev->node);
diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h
index 6e66074..21bd7d8 100644
--- a/drivers/scsi/isci/host.h
+++ b/drivers/scsi/isci/host.h
@@ -110,18 +110,9 @@
 	struct list_head requests_to_errorback;
 	spinlock_t scic_lock;
 
-	/* careful only access this via idev_by_id */
-	struct isci_remote_device devices[0];
+	struct isci_remote_device devices[SCI_MAX_REMOTE_DEVICES];
 };
 
-static inline struct isci_remote_device *idev_by_id(struct isci_host *ihost, int i)
-{
-	void *p = ihost->devices;
-
-	return p + i * (sizeof(struct isci_remote_device) +
-			scic_remote_device_get_object_size());
-}
-
 /**
  * struct isci_pci_info - This class represents the pci function containing the
  *    controllers. Depending on PCI SKU, there could be up to 2 controllers in
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index 5a9cd5f..a23ea2c 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -396,10 +396,7 @@
 	struct Scsi_Host *shost;
 	int err;
 
-	isci_host = devm_kzalloc(&pdev->dev, sizeof(*isci_host) +
-				 SCI_MAX_REMOTE_DEVICES *
-				 (sizeof(struct isci_remote_device) +
-				  scic_remote_device_get_object_size()), GFP_KERNEL);
+	isci_host = devm_kzalloc(&pdev->dev, sizeof(*isci_host), GFP_KERNEL);
 	if (!isci_host)
 		return NULL;
 
diff --git a/drivers/scsi/isci/remote_device.c b/drivers/scsi/isci/remote_device.c
index 9301e25..1553221 100644
--- a/drivers/scsi/isci/remote_device.c
+++ b/drivers/scsi/isci/remote_device.c
@@ -87,7 +87,7 @@
 		BUG();
 	}
 
-	scic_remote_device_destruct(to_sci_dev(idev));
+	scic_remote_device_destruct(&idev->sci);
 	idev->domain_dev->lldd_dev = NULL;
 	idev->domain_dev = NULL;
 	idev->isci_port = NULL;
@@ -117,7 +117,7 @@
 
 	/* let the core do it's common constuction. */
 	scic_remote_device_construct(port->sci_port_handle,
-				     to_sci_dev(isci_device));
+				     &isci_device->sci);
 
 	/* let the core do it's device specific constuction. */
 	if (isci_device->domain_dev->parent &&
@@ -183,11 +183,11 @@
 			"%s: parent->dev_type = EDGE_DEV\n",
 			__func__);
 
-		status = scic_remote_device_ea_construct(to_sci_dev(isci_device),
+		status = scic_remote_device_ea_construct(&isci_device->sci,
 				(struct smp_response_discover *)&discover_response);
 
 	} else
-		status = scic_remote_device_da_construct(to_sci_dev(isci_device));
+		status = scic_remote_device_da_construct(&isci_device->sci);
 
 
 	if (status != SCI_SUCCESS) {
@@ -200,10 +200,11 @@
 		return status;
 	}
 
-	sci_object_set_association(to_sci_dev(isci_device), isci_device);
+	/* XXX will be killed with sci_base_object removal */
+	sci_object_set_association(&isci_device->sci, isci_device);
 
 	/* start the device. */
-	status = scic_remote_device_start(to_sci_dev(isci_device),
+	status = scic_remote_device_start(&isci_device->sci,
 					  ISCI_REMOTE_DEVICE_START_TIMEOUT);
 
 	if (status != SCI_SUCCESS) {
@@ -245,7 +246,7 @@
 	int i;
 
 	for (i = 0; i < SCI_MAX_REMOTE_DEVICES; i++) {
-		idev = idev_by_id(ihost, i);
+		idev = &ihost->devices[i];
 		if (!test_and_set_bit(IDEV_ALLOCATED, &idev->flags))
 			break;
 	}
@@ -374,7 +375,7 @@
 	set_bit(IDEV_STOP_PENDING, &idev->flags);
 
 	spin_lock_irqsave(&ihost->scic_lock, flags);
-	status = scic_remote_device_stop(to_sci_dev(idev), 50);
+	status = scic_remote_device_stop(&idev->sci, 50);
 	spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
 	/* Wait for the stop complete callback. */
diff --git a/drivers/scsi/isci/remote_device.h b/drivers/scsi/isci/remote_device.h
index 9925316..aeda395 100644
--- a/drivers/scsi/isci/remote_device.h
+++ b/drivers/scsi/isci/remote_device.h
@@ -55,9 +55,9 @@
 
 #if !defined(_ISCI_REMOTE_DEVICE_H_)
 #define _ISCI_REMOTE_DEVICE_H_
+#include "scic_sds_remote_device.h"
 
 struct isci_host;
-struct scic_sds_remote_device;
 
 struct isci_remote_device {
 	enum isci_status status;
@@ -70,14 +70,9 @@
 	struct list_head node;
 	struct list_head reqs_in_process;
 	spinlock_t state_lock;
+	struct scic_sds_remote_device sci;
 };
 
-static inline struct scic_sds_remote_device *to_sci_dev(struct isci_remote_device *idev)
-{
-	/* core data is an opaque buffer at the end of the idev */
-	return (struct scic_sds_remote_device *) &idev[1];
-}
-
 #define ISCI_REMOTE_DEVICE_START_TIMEOUT 5000
 
 void isci_remote_device_start_complete(struct isci_host *ihost,
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
index a90c299..8d2125b 100644
--- a/drivers/scsi/isci/request.c
+++ b/drivers/scsi/isci/request.c
@@ -179,7 +179,7 @@
 	struct smp_discover_response_protocols dev_protocols;
 	enum sci_status status = SCI_SUCCESS;
 	struct sas_task *task = isci_request_access_task(request);
-	struct scic_sds_remote_device *sci_device = to_sci_dev(isci_device);
+	struct scic_sds_remote_device *sci_device = &isci_device->sci;
 
 	dev_dbg(&isci_host->pdev->dev,
 		"%s: isci_device = 0x%p; request = %p, "
@@ -380,7 +380,7 @@
 	unsigned long flags;
 
 	isci_device = task->dev->lldd_dev;
-	sci_device = to_sci_dev(isci_device);
+	sci_device = &isci_device->sci;
 
 	/* do common allocation and init of request object. */
 	ret = isci_request_alloc_io(
@@ -1194,11 +1194,9 @@
 						  );
 
 	/* complete the io request to the core. */
-	scic_controller_complete_io(
-		isci_host->core_controller,
-		to_sci_dev(isci_device),
-		request->sci_request_handle
-		);
+	scic_controller_complete_io(isci_host->core_controller,
+				    &isci_device->sci,
+				    request->sci_request_handle);
 	/* NULL the request handle so it cannot be completed or
 	 * terminated again, and to cause any calls into abort
 	 * task to recognize the already completed case.
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c
index c79968d..f54f523 100644
--- a/drivers/scsi/isci/task.c
+++ b/drivers/scsi/isci/task.c
@@ -282,7 +282,7 @@
 		"%s: isci_tmf = %p\n", __func__, isci_tmf);
 
 	isci_device = isci_tmf->device;
-	sci_device = to_sci_dev(isci_device);
+	sci_device = &isci_device->sci;
 
 	/* do common allocation and init of request object. */
 	status = isci_request_alloc_tmf(
@@ -390,7 +390,7 @@
 		/* Terminate the TMF transmit request. */
 		status = scic_controller_terminate_request(
 			request->isci_host->core_controller,
-			to_sci_dev(request->isci_device),
+			&request->isci_device->sci,
 			request->sci_request_handle
 			);
 
@@ -448,7 +448,7 @@
 			"%s: isci_device = %p\n",
 			__func__, isci_device);
 
-	sci_device = to_sci_dev(isci_device);
+	sci_device = &isci_device->sci;
 
 	/* Assign the pointer to the TMF's completion kernel wait structure. */
 	tmf->complete = &completion;
@@ -784,9 +784,8 @@
 		needs_cleanup_handling = true;
 		status = scic_controller_terminate_request(
 			isci_host->core_controller,
-			to_sci_dev(isci_device),
-			isci_request->sci_request_handle
-			);
+			&isci_device->sci,
+			isci_request->sci_request_handle);
 	}
 	spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
@@ -1483,9 +1482,8 @@
 
 	scic_controller_complete_io(
 		isci_host->core_controller,
-		to_sci_dev(isci_device),
-		request->sci_request_handle
-		);
+		&isci_device->sci,
+		request->sci_request_handle);
 	/* NULL the request handle to make sure it cannot be terminated
 	 *  or completed again.
 	 */
@@ -1611,7 +1609,7 @@
 	}
 
 	spin_lock_irqsave(&isci_host->scic_lock, flags);
-	status = scic_remote_device_reset(to_sci_dev(isci_dev));
+	status = scic_remote_device_reset(&isci_dev->sci);
 	if (status != SCI_SUCCESS) {
 		spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
@@ -1645,7 +1643,7 @@
 
 	/* WHAT TO DO HERE IF sas_phy_reset FAILS? */
 	spin_lock_irqsave(&isci_host->scic_lock, flags);
-	status = scic_remote_device_reset_complete(to_sci_dev(isci_dev));
+	status = scic_remote_device_reset_complete(&isci_dev->sci);
 	spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
 	if (status != SCI_SUCCESS) {