isci: make sgl explicit/aligned request object member

Towards unifying request objects we need all members to be defined in the
object and not carved out of anonymous buffer space.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
diff --git a/drivers/scsi/isci/core/scic_sds_request.c b/drivers/scsi/isci/core/scic_sds_request.c
index fd7bd33..189a799 100644
--- a/drivers/scsi/isci/core/scic_sds_request.c
+++ b/drivers/scsi/isci/core/scic_sds_request.c
@@ -212,8 +212,7 @@
 	return sizeof(struct scic_sds_request)
 	       + scic_ssp_io_request_get_object_size()
 	       + sizeof(struct scu_task_context)
-	       + SMP_CACHE_BYTES
-	       + sizeof(struct scu_sgl_element_pair) * SCU_MAX_SGL_ELEMENT_PAIRS;
+	       + SMP_CACHE_BYTES;
 }
 
 /**
@@ -239,7 +238,7 @@
 		return &task_context->sgl_pair_cd;
 	}
 
-	return &sci_req->sgl_element_pair_buffer[sgl_pair_index - 2];
+	return &sci_req->sg_table[sgl_pair_index - 2];
 }
 
 /**
@@ -328,11 +327,6 @@
 		scic_sds_ssp_request_get_command_buffer(sci_req);
 	sci_req->response_buffer =
 		scic_sds_ssp_request_get_response_buffer(sci_req);
-	sci_req->sgl_element_pair_buffer =
-		scic_sds_ssp_request_get_sgl_element_buffer(sci_req);
-	sci_req->sgl_element_pair_buffer =
-		PTR_ALIGN(sci_req->sgl_element_pair_buffer,
-			  sizeof(struct scu_sgl_element_pair));
 
 	if (sci_req->was_tag_assigned_by_user == false) {
 		sci_req->task_context_buffer =
@@ -535,7 +529,6 @@
 		scic_sds_ssp_task_request_get_command_buffer(sci_req);
 	sci_req->response_buffer =
 		scic_sds_ssp_task_request_get_response_buffer(sci_req);
-	sci_req->sgl_element_pair_buffer = NULL;
 
 	if (sci_req->was_tag_assigned_by_user == false) {
 		sci_req->task_context_buffer =
diff --git a/drivers/scsi/isci/core/scic_sds_request.h b/drivers/scsi/isci/core/scic_sds_request.h
index c93f3ed..83d737ad 100644
--- a/drivers/scsi/isci/core/scic_sds_request.h
+++ b/drivers/scsi/isci/core/scic_sds_request.h
@@ -60,6 +60,7 @@
 #include "sci_base_state_machine.h"
 #include "scu_task_context.h"
 #include "scic_sds_stp_request.h"
+#include "scu_constants.h"
 
 struct scic_sds_controller;
 struct scic_sds_remote_device;
@@ -183,7 +184,10 @@
 	void *command_buffer;
 	void *response_buffer;
 	struct scu_task_context *task_context_buffer;
-	struct scu_sgl_element_pair *sgl_element_pair_buffer;
+
+	/* could be larger with sg chaining */
+	#define SCU_SGL_SIZE ((SCU_IO_REQUEST_SGE_COUNT + 1) / 2)
+	struct scu_sgl_element_pair sg_table[SCU_SGL_SIZE] __attribute__ ((aligned(32)));
 
 	/**
 	 * This field indicates if this request is a task management request or
@@ -328,14 +332,6 @@
 extern const struct sci_base_state scic_sds_io_request_started_task_mgmt_substate_table[];
 
 /**
- *
- *
- * This macro returns the maximum number of SGL element paris that we will
- * support in a single IO request.
- */
-#define SCU_MAX_SGL_ELEMENT_PAIRS ((SCU_IO_REQUEST_SGE_COUNT + 1) / 2)
-
-/**
  * scic_sds_request_get_controller() -
  *
  * This macro will return the controller for this io request object
diff --git a/drivers/scsi/isci/core/scic_sds_smp_request.c b/drivers/scsi/isci/core/scic_sds_smp_request.c
index 1f8773d..cb1adef 100644
--- a/drivers/scsi/isci/core/scic_sds_smp_request.c
+++ b/drivers/scsi/isci/core/scic_sds_smp_request.c
@@ -131,7 +131,6 @@
 		scic_sds_smp_request_get_command_buffer(sci_req);
 	sci_req->response_buffer =
 		scic_sds_smp_request_get_response_buffer(sci_req);
-	sci_req->sgl_element_pair_buffer = NULL;
 
 	if (sci_req->was_tag_assigned_by_user == false) {
 		sci_req->task_context_buffer =
diff --git a/drivers/scsi/isci/core/scic_sds_stp_request.c b/drivers/scsi/isci/core/scic_sds_stp_request.c
index 7dba40f..013af11 100644
--- a/drivers/scsi/isci/core/scic_sds_stp_request.c
+++ b/drivers/scsi/isci/core/scic_sds_stp_request.c
@@ -106,18 +106,6 @@
 		 ))
 
 /**
- * scic_sds_stp_request_get_sgl_element_buffer() -
- *
- * This macro returns the address of the sgl elment pairs in the io request
- * memory buffer
- */
-#define scic_sds_stp_request_get_sgl_element_buffer(memory) \
-	((struct scu_sgl_element_pair *)(\
-		 ((char *)(scic_sds_stp_request_get_task_context_buffer(memory))) \
-		 + sizeof(struct scu_task_context) \
-		 ))
-
-/**
  *
  *
  * This method return the memory space required for STP PIO requests. u32
@@ -128,8 +116,7 @@
 	       + sizeof(struct host_to_dev_fis)
 	       + sizeof(struct dev_to_host_fis)
 	       + sizeof(struct scu_task_context)
-	       + SMP_CACHE_BYTES
-	       + sizeof(struct scu_sgl_element_pair) * SCU_MAX_SGL_ELEMENT_PAIRS;
+	       + SMP_CACHE_BYTES;
 }
 
 void scic_sds_stp_request_assign_buffers(struct scic_sds_request *sci_req)
@@ -138,9 +125,6 @@
 
 	sci_req->command_buffer = scic_sds_stp_request_get_h2d_reg_buffer(stp_req);
 	sci_req->response_buffer = scic_sds_stp_request_get_response_buffer(stp_req);
-	sci_req->sgl_element_pair_buffer = scic_sds_stp_request_get_sgl_element_buffer(stp_req);
-	sci_req->sgl_element_pair_buffer = PTR_ALIGN(sci_req->sgl_element_pair_buffer,
-						     sizeof(struct scu_sgl_element_pair));
 
 	if (sci_req->was_tag_assigned_by_user == false) {
 		sci_req->task_context_buffer =
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c
index e01c2c9..9dd971a 100644
--- a/drivers/scsi/isci/request.c
+++ b/drivers/scsi/isci/request.c
@@ -200,14 +200,10 @@
 	/* build the common request object. For now,
 	 * we will let the core allocate the IO tag.
 	 */
-	status = scic_io_request_construct(
-		&isci_host->sci,
-		sci_device,
-		SCI_CONTROLLER_INVALID_IO_TAG,
-		request,
-		request->sci_request_mem_ptr,
-		(struct scic_sds_request **)&request->sci_request_handle
-		);
+	status = scic_io_request_construct(&isci_host->sci, sci_device,
+					   SCI_CONTROLLER_INVALID_IO_TAG,
+					   request, request->sci_req,
+					   &request->sci_request_handle);
 
 	if (status != SCI_SUCCESS) {
 		dev_warn(&isci_host->pdev->dev,
@@ -277,8 +273,6 @@
 
 	/* initialize the request object.	*/
 	spin_lock_init(&request->state_lock);
-	request->sci_request_mem_ptr = ((u8 *)request) +
-				       sizeof(struct isci_request);
 	request->request_daddr = handle;
 	request->isci_host = isci_host;
 	request->isci_device = isci_device;
diff --git a/drivers/scsi/isci/request.h b/drivers/scsi/isci/request.h
index 9c97715..ddfbf71 100644
--- a/drivers/scsi/isci/request.h
+++ b/drivers/scsi/isci/request.h
@@ -53,10 +53,11 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#if !defined(_ISCI_REQUEST_H_)
+#ifndef _ISCI_REQUEST_H_
 #define _ISCI_REQUEST_H_
 
 #include "isci.h"
+#include "scic_sds_request.h"
 
 /**
  * struct isci_request_status - This enum defines the possible states of an I/O
@@ -80,16 +81,8 @@
 	tmf_task = 1
 };
 
-/**
- * struct isci_request - This class represents the request object used to track
- *    IO, smp and TMF request internal. It wraps the SCIC request object.
- *
- *
- */
 struct isci_request {
-
 	struct scic_sds_request *sci_request_handle;
-
 	enum isci_request_status status;
 	enum task_type ttype;
 	unsigned short io_tag;
@@ -105,7 +98,6 @@
 	struct list_head completed_node;
 	/* For use in the reqs_in_process list: */
 	struct list_head dev_node;
-	void *sci_request_mem_ptr;
 	spinlock_t state_lock;
 	dma_addr_t request_daddr;
 	dma_addr_t zero_scatter_daddr;
@@ -123,6 +115,7 @@
 	 * TMF was aborting is guaranteed to have completed.
 	 */
 	struct completion *io_request_completion;
+	struct scic_sds_request sci_req[0] ____cacheline_aligned;
 };
 
 /**
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c
index 12f2df9..7d5f793 100644
--- a/drivers/scsi/isci/task.c
+++ b/drivers/scsi/isci/task.c
@@ -298,14 +298,10 @@
 		goto out;
 
 	/* let the core do it's construct. */
-	status = scic_task_request_construct(
-		&isci_host->sci,
-		sci_device,
-		SCI_CONTROLLER_INVALID_IO_TAG,
-		request,
-		request->sci_request_mem_ptr,
-		&request->sci_request_handle
-		);
+	status = scic_task_request_construct(&isci_host->sci, sci_device,
+					     SCI_CONTROLLER_INVALID_IO_TAG,
+					     request, &request->sci_req,
+					     &request->sci_request_handle);
 
 	if (status != SCI_SUCCESS) {
 		dev_warn(&isci_host->pdev->dev,