aboutsummaryrefslogtreecommitdiff
path: root/drivers/scsi
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-05-10 02:28:45 -0700
committerDan Williams <dan.j.williams@intel.com>2011-07-03 04:04:47 -0700
commitf1f52e75939b56c40b3d153ae99faf2720250242 (patch)
tree9c5ba4f8bb6a589c6a038dac5bbba280f9de3ebe /drivers/scsi
parent3bff9d54ecba84e538da822349a9a6fd6e534539 (diff)
isci: uplevel request infrastructure
* Consolidate tiny header files * Move files out of core/ (drop core/scic_sds_ prefix) * Merge core/scic_sds_request.[ch] into request.[ch] * Cleanup request.c namespace (clean forward declarations and global namespace pollution) Reported-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/isci/Makefile8
-rw-r--r--drivers/scsi/isci/core/sci_util.c86
-rw-r--r--drivers/scsi/isci/core/sci_util.h97
-rw-r--r--drivers/scsi/isci/core/scic_io_request.h226
-rw-r--r--drivers/scsi/isci/core/scic_sds_phy.c1
-rw-r--r--drivers/scsi/isci/core/scic_sds_port.c2
-rw-r--r--drivers/scsi/isci/core/scic_sds_request.c1523
-rw-r--r--drivers/scsi/isci/core/scic_sds_request.h491
-rw-r--r--drivers/scsi/isci/core/scic_sds_smp_request.h67
-rw-r--r--drivers/scsi/isci/core/scic_sds_stp_packet_request.h113
-rw-r--r--drivers/scsi/isci/core/scic_sds_stp_pio_request.h104
-rw-r--r--drivers/scsi/isci/core/scic_task_request.h104
-rw-r--r--drivers/scsi/isci/host.c2
-rw-r--r--drivers/scsi/isci/isci.h19
-rw-r--r--drivers/scsi/isci/port.c1
-rw-r--r--drivers/scsi/isci/remote_device.c3
-rw-r--r--drivers/scsi/isci/remote_node_context.c1
-rw-r--r--drivers/scsi/isci/remote_node_table.c1
-rw-r--r--drivers/scsi/isci/request.c2016
-rw-r--r--drivers/scsi/isci/request.h442
-rw-r--r--drivers/scsi/isci/sata.c2
-rw-r--r--drivers/scsi/isci/smp_request.c (renamed from drivers/scsi/isci/core/scic_sds_smp_request.c)4
-rw-r--r--drivers/scsi/isci/ssp_request.c (renamed from drivers/scsi/isci/core/scic_sds_ssp_request.c)4
-rw-r--r--drivers/scsi/isci/stp_request.c (renamed from drivers/scsi/isci/core/scic_sds_stp_request.c)6
-rw-r--r--drivers/scsi/isci/stp_request.h (renamed from drivers/scsi/isci/core/scic_sds_stp_request.h)61
-rw-r--r--drivers/scsi/isci/task.c3
-rw-r--r--drivers/scsi/isci/unsolicited_frame_control.c5
27 files changed, 2194 insertions, 3198 deletions
diff --git a/drivers/scsi/isci/Makefile b/drivers/scsi/isci/Makefile
index cfc640f9dc3..a7d1eb33eca 100644
--- a/drivers/scsi/isci/Makefile
+++ b/drivers/scsi/isci/Makefile
@@ -7,11 +7,9 @@ isci-objs := init.o phy.o request.o sata.o \
remote_node_context.o \
remote_node_table.o \
unsolicited_frame_control.o \
- core/scic_sds_request.o \
- core/scic_sds_stp_request.o \
+ stp_request.o \
+ ssp_request.o \
+ smp_request.o \
core/scic_sds_port.o \
core/scic_sds_port_configuration_agent.o \
core/scic_sds_phy.o \
- core/scic_sds_ssp_request.o \
- core/scic_sds_smp_request.o \
- core/sci_util.o
diff --git a/drivers/scsi/isci/core/sci_util.c b/drivers/scsi/isci/core/sci_util.c
deleted file mode 100644
index 595d8da1abb..00000000000
--- a/drivers/scsi/isci/core/sci_util.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * This file is provided under a dual BSD/GPLv2 license. When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- * The full GNU General Public License is included in this distribution
- * in the file called LICENSE.GPL.
- *
- * BSD LICENSE
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <linux/kernel.h>
-#include "sci_util.h"
-#include "request.h"
-
-void *scic_request_get_virt_addr(struct scic_sds_request *sci_req, dma_addr_t phys_addr)
-{
- struct isci_request *ireq = sci_req_to_ireq(sci_req);
- dma_addr_t offset;
-
- BUG_ON(phys_addr < ireq->request_daddr);
-
- offset = phys_addr - ireq->request_daddr;
-
- BUG_ON(offset >= sizeof(*ireq));
-
- return (char *)ireq + offset;
-}
-
-dma_addr_t scic_io_request_get_dma_addr(struct scic_sds_request *sds_request,
- void *virt_addr)
-{
- struct isci_request *isci_request = sci_req_to_ireq(sds_request);
-
- char *requested_addr = (char *)virt_addr;
- char *base_addr = (char *)isci_request;
-
- BUG_ON(requested_addr < base_addr);
- BUG_ON((requested_addr - base_addr) >= sizeof(*isci_request));
-
- return isci_request->request_daddr + (requested_addr - base_addr);
-}
diff --git a/drivers/scsi/isci/core/sci_util.h b/drivers/scsi/isci/core/sci_util.h
deleted file mode 100644
index 0f9dd0fe126..00000000000
--- a/drivers/scsi/isci/core/sci_util.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * This file is provided under a dual BSD/GPLv2 license. When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- * The full GNU General Public License is included in this distribution
- * in the file called LICENSE.GPL.
- *
- * BSD LICENSE
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _SCI_UTIL_H_
-#define _SCI_UTIL_H_
-
-#include "scic_sds_request.h"
-
-#define SCIC_BUILD_DWORD(char_buffer) \
- (\
- ((char_buffer)[0] << 24) \
- | ((char_buffer)[1] << 16) \
- | ((char_buffer)[2] << 8) \
- | ((char_buffer)[3]) \
- )
-
-#define sci_cb_make_physical_address(physical_addr, addr_upper, addr_lower) \
- ((physical_addr) = (addr_lower) | ((u64)addr_upper) << 32)
-
-/**
- * sci_swab32_cpy - convert between scsi and scu-hardware byte format
- * @dest: receive the 4-byte endian swapped version of src
- * @src: word aligned source buffer
- *
- * scu hardware handles SSP/SMP control, response, and unidentified
- * frames in "big endian dword" order. Regardless of host endian this
- * is always a swab32()-per-dword conversion of the standard definition,
- * i.e. single byte fields swapped and multi-byte fields in little-
- * endian
- */
-static inline void sci_swab32_cpy(void *_dest, void *_src, ssize_t word_cnt)
-{
- u32 *dest = _dest, *src = _src;
-
- while (--word_cnt >= 0)
- dest[word_cnt] = swab32(src[word_cnt]);
-}
-
-void *scic_request_get_virt_addr(struct scic_sds_request *sds_request,
- dma_addr_t phys_addr);
-
-dma_addr_t scic_io_request_get_dma_addr(struct scic_sds_request *sds_request,
- void *virt_addr);
-
-#endif /* _SCI_UTIL_H_ */
diff --git a/drivers/scsi/isci/core/scic_io_request.h b/drivers/scsi/isci/core/scic_io_request.h
deleted file mode 100644
index a4664cc3c57..00000000000
--- a/drivers/scsi/isci/core/scic_io_request.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * This file is provided under a dual BSD/GPLv2 license. When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- * The full GNU General Public License is included in this distribution
- * in the file called LICENSE.GPL.
- *
- * BSD LICENSE
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _SCIC_IO_REQUEST_H_
-#define _SCIC_IO_REQUEST_H_
-
-#include <linux/kernel.h>
-
-struct scic_sds_request;
-struct scic_sds_remote_device;
-struct scic_sds_controller;
-
-/**
- * This enumeration specifies the transport protocol utilized for the request.
- *
- *
- */
-typedef enum {
- /**
- * This enumeration constant indicates that no protocol has yet been
- * set.
- */
- SCIC_NO_PROTOCOL,
-
- /**
- * This enumeration constant indicates that the protocol utilized
- * is the Serial Management Protocol.
- */
- SCIC_SMP_PROTOCOL,
-
- /**
- * This enumeration constant indicates that the protocol utilized
- * is the Serial SCSI Protocol.
- */
- SCIC_SSP_PROTOCOL,
-
- /**
- * This enumeration constant indicates that the protocol utilized
- * is the Serial-ATA Tunneling Protocol.
- */
- SCIC_STP_PROTOCOL
-
-} SCIC_TRANSPORT_PROTOCOL;
-
-enum sci_status scic_io_request_construct(
- struct scic_sds_controller *scic_controller,
- struct scic_sds_remote_device *scic_remote_device,
- u16 io_tag, struct scic_sds_request *sci_req);
-
-/**
- * scic_io_request_construct_basic_ssp() - This method is called by the SCI
- * user to build an SSP IO request.
- * @scic_io_request: This parameter specifies the handle to the io request
- * object to be built.
- *
- * - The user must have previously called scic_io_request_construct() on the
- * supplied IO request. Indicate if the controller successfully built the IO
- * request. SCI_SUCCESS This value is returned if the IO request was
- * successfully built. SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned
- * if the remote_device does not support the SSP protocol.
- * SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the user did not
- * properly set the association between the SCIC IO request and the user's IO
- * request.
- */
-enum sci_status scic_io_request_construct_basic_ssp(
- struct scic_sds_request *scic_io_request);
-
-
-
-
-
-/**
- * scic_io_request_construct_basic_sata() - This method is called by the SCI
- * Core user to build an STP IO request.
- * @scic_io_request: This parameter specifies the handle to the io request
- * object to be built.
- *
- * - The user must have previously called scic_io_request_construct() on the
- * supplied IO request. Indicate if the controller successfully built the IO
- * request. SCI_SUCCESS This value is returned if the IO request was
- * successfully built. SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned
- * if the remote_device does not support the STP protocol.
- * SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the user did not
- * properly set the association between the SCIC IO request and the user's IO
- * request.
- */
-enum sci_status scic_io_request_construct_basic_sata(
- struct scic_sds_request *scic_io_request);
-
-
-
-
-/**
- * scic_io_request_construct_smp() - This method is called by the SCI user to
- * build an SMP IO request.
- * @scic_io_request: This parameter specifies the handle to the io request
- * object to be built.
- *
- * - The user must have previously called scic_io_request_construct() on the
- * supplied IO request. Indicate if the controller successfully built the IO
- * request. SCI_SUCCESS This value is returned if the IO request was
- * successfully built. SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned
- * if the remote_device does not support the SMP protocol.
- * SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the user did not
- * properly set the association between the SCIC IO request and the user's IO
- * request.
- */
-enum sci_status scic_io_request_construct_smp(
- struct scic_sds_request *scic_io_request);
-
-
-
-/**
- * scic_request_get_controller_status() - This method returns the controller
- * specific IO/Task request status. These status values are unique to the
- * specific controller being managed by the SCIC.
- * @io_request: the handle to the IO or task management request object for
- * which to retrieve the status.
- *
- * This method returns a value indicating the controller specific request
- * status.
- */
-u32 scic_request_get_controller_status(
- struct scic_sds_request *io_request);
-
-/**
- * scic_io_request_get_io_tag() - This method will return the IO tag utilized
- * by the IO request.
- * @scic_io_request: This parameter specifies the handle to the io request
- * object for which to return the IO tag.
- *
- * An unsigned integer representing the IO tag being utilized.
- * SCI_CONTROLLER_INVALID_IO_TAG This value is returned if the IO does not
- * currently have an IO tag allocated to it. All return other values indicate a
- * legitimate tag.
- */
-u16 scic_io_request_get_io_tag(
- struct scic_sds_request *scic_io_request);
-
-
-/**
- * scic_stp_io_request_set_ncq_tag() - This method will assign an NCQ tag to
- * the io request object. The caller of this function must make sure that
- * only valid NCQ tags are assigned to the io request object.
- * @scic_io_request: This parameter specifies the handle to the io request
- * object to which to assign the ncq tag.
- * @ncq_tag: This parameter specifies the NCQ tag to be utilized for the
- * supplied core IO request. It is up to the user to make sure that this is
- * a valid NCQ tag.
- *
- * none This function is only valid for SATA NCQ requests.
- */
-void scic_stp_io_request_set_ncq_tag(
- struct scic_sds_request *scic_io_request,
- u16 ncq_tag);
-
-/**
- * scic_io_request_get_number_of_bytes_transferred() - This method will return
- * the number of bytes transferred from the SCU
- * @scic_io_request: This parameter specifies the handle to the io request
- * whose data length was not eqaul to the data length specified in the
- * request. When the driver gets an early io completion status from the
- * hardware, this routine should be called to get the actual number of bytes
- * transferred
- *
- * The return is the number of bytes transferred when the data legth is not
- * equal to the specified length in the io request
- */
-u32 scic_io_request_get_number_of_bytes_transferred(
- struct scic_sds_request *scic_io_request);
-
-
-#endif /* _SCIC_IO_REQUEST_H_ */
-
diff --git a/drivers/scsi/isci/core/scic_sds_phy.c b/drivers/scsi/isci/core/scic_sds_phy.c
index 6b49d94bc9c..150509b0c69 100644
--- a/drivers/scsi/isci/core/scic_sds_phy.c
+++ b/drivers/scsi/isci/core/scic_sds_phy.c
@@ -61,7 +61,6 @@
#include "scic_sds_phy.h"
#include "scic_sds_port.h"
#include "remote_node_context.h"
-#include "sci_util.h"
#include "scu_event_codes.h"
#include "timers.h"
diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c
index 652917eeead..a9f3ce111b8 100644
--- a/drivers/scsi/isci/core/scic_sds_port.c
+++ b/drivers/scsi/isci/core/scic_sds_port.c
@@ -60,9 +60,9 @@
#include "scic_sds_port.h"
#include "remote_device.h"
#include "remote_node_context.h"
-#include "scic_sds_request.h"
#include "registers.h"
#include "timers.h"
+#include "scu_task_context.h"
#define SCIC_SDS_PORT_MIN_TIMER_COUNT (SCI_MAX_PORTS)
#define SCIC_SDS_PORT_MAX_TIMER_COUNT (SCI_MAX_PORTS)
diff --git a/drivers/scsi/isci/core/scic_sds_request.c b/drivers/scsi/isci/core/scic_sds_request.c
deleted file mode 100644
index cd279601de0..00000000000
--- a/drivers/scsi/isci/core/scic_sds_request.c
+++ /dev/null
@@ -1,1523 +0,0 @@
-/*
- * This file is provided under a dual BSD/GPLv2 license. When using or
- * redistributing this file, you may do so under either license.
- *
- * GPL LICENSE SUMMARY
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- * The full GNU General Public License is included in this distribution
- * in the file called LICENSE.GPL.
- *
- * BSD LICENSE
- *
- * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <scsi/sas.h>
-#include "scic_io_request.h"
-#include "registers.h"
-#include "scic_sds_port.h"
-#include "remote_device.h"
-#include "scic_sds_request.h"
-#include "scic_sds_smp_request.h"
-#include "scic_sds_stp_request.h"
-#include "unsolicited_frame_control.h"
-#include "sci_util.h"
-#include "scu_completion_codes.h"
-#include "scu_task_context.h"
-#include "request.h"
-#include "task.h"
-
-/*
- * ****************************************************************************
- * * SCIC SDS IO REQUEST CONSTANTS
- * **************************************************************************** */
-
-/**
- *
- *
- * We have no timer requirements for IO requests right now
- */
-#define SCIC_SDS_IO_REQUEST_MINIMUM_TIMER_COUNT (0)
-#define SCIC_SDS_IO_REQUEST_MAXIMUM_TIMER_COUNT (0)
-
-/**
- * This method returns the sgl element pair for the specificed sgl_pair index.
- * @sci_req: This parameter specifies the IO request for which to retrieve
- * the Scatter-Gather List element pair.
- * @sgl_pair_index: This parameter specifies the index into the SGL element
- * pair to be retrieved.
- *
- * This method returns a pointer to an struct scu_sgl_element_pair.
- */
-static struct scu_sgl_element_pair *scic_sds_request_get_sgl_element_pair(
- struct scic_sds_request *sci_req,
- u32 sgl_pair_index
- ) {
- struct scu_task_context *task_context;
-
- task_context = (struct scu_task_context *)sci_req->task_context_buffer;
-
- if (sgl_pair_index == 0) {
- return &task_context->sgl_pair_ab;
- } else if (sgl_pair_index == 1) {
- return &task_context->sgl_pair_cd;
- }
-
- return &sci_req->sg_table[sgl_pair_index - 2];
-}
-
-/**
- * This function will build the SGL list for an IO request.
- * @sci_req: This parameter specifies the IO request for which to build
- * the Scatter-Gather List.
- *
- */
-void scic_sds_request_build_sgl(struct scic_sds_request *sds_request)
-{
- struct isci_request *isci_request = sci_req_to_ireq(sds_request);
- struct isci_host *isci_host = isci_request->isci_host;
- struct sas_task *task = isci_request_access_task(isci_request);
- struct scatterlist *sg = NULL;
- dma_addr_t dma_addr;
- u32 sg_idx = 0;
- struct scu_sgl_element_pair *scu_sg = NULL;
- struct scu_sgl_element_pair *prev_sg = NULL;
-
- if (task->num_scatter > 0) {
- sg = task->scatter;
-
- while (sg) {
- scu_sg = scic_sds_request_get_sgl_element_pair(
- sds_request,
- sg_idx);
-
- SCU_SGL_COPY(scu_sg->A, sg);
-
- sg = sg_next(sg);
-
- if (sg) {
- SCU_SGL_COPY(scu_sg->B, sg);
- sg = sg_next(sg);
- } else
- SCU_SGL_ZERO(scu_sg->B);
-
- if (prev_sg) {
- dma_addr =
- scic_io_request_get_dma_addr(
- sds_request,
- scu_sg);
-
- prev_sg->next_pair_upper =
- upper_32_bits(dma_addr);
- prev_sg->next_pair_lower =
- lower_32_bits(dma_addr);
- }
-
- prev_sg = scu_sg;
- sg_idx++;
- }
- } else { /* handle when no sg */
- scu_sg = scic_sds_request_get_sgl_element_pair(sds_request,
- sg_idx);
-
- dma_addr = dma_map_single(&isci_host->pdev->dev,
- task->scatter,
- task->total_xfer_len,
- task->data_dir);
-
- isci_request->zero_scatter_daddr = dma_addr;
-
- scu_sg->A.length = task->total_xfer_len;
- scu_sg->A.address_upper = upper_32_bits(dma_addr);
- scu_sg->A.address_lower = lower_32_bits(dma_addr);
- }
-
- if (scu_sg) {
- scu_sg->next_pair_upper = 0;
- scu_sg->next_pair_lower = 0;
- }
-}
-
-static void scic_sds_ssp_io_request_assign_buffers(struct scic_sds_request *sci_req)
-{
- if (sci_req->was_tag_assigned_by_user == false)
- sci_req->task_context_buffer = &sci_req->tc;
-}
-
-static void scic_sds_io_request_build_ssp_command_iu(struct scic_sds_request *sci_req)
-{
- struct ssp_cmd_iu *cmd_iu;
- struct isci_request *ireq = sci_req_to_ireq(sci_req);
- struct sas_task *task = isci_request_access_task(ireq);
-
- cmd_iu = &sci_req->ssp.cmd;
-
- memcpy(cmd_iu->LUN, task->ssp_task.LUN, 8);
- cmd_iu->add_cdb_len = 0;
- cmd_iu->_r_a = 0;
- cmd_iu->_r_b = 0;
- cmd_iu->en_fburst = 0; /* unsupported */
- cmd_iu->task_prio = task->ssp_task.task_prio;
- cmd_iu->task_attr = task->ssp_task.task_attr;
- cmd_iu->_r_c = 0;
-
- sci_swab32_cpy(&cmd_iu->cdb, task->ssp_task.cdb,
- sizeof(task->ssp_task.cdb) / sizeof(u32));
-}
-
-static void scic_sds_task_request_build_ssp_task_iu(struct scic_sds_request *sci_req)
-{
- struct ssp_task_iu *task_iu;
- struct isci_request *ireq = sci_req_to_ireq(sci_req);
- struct sas_task *task = isci_request_access_task(ireq);
- struct isci_tmf *isci_tmf = isci_request_access_tmf(ireq);
-
- task_iu = &sci_req->ssp.tmf;
-
- memset(task_iu, 0, sizeof(struct ssp_task_iu));
-
- memcpy(task_iu->LUN, task->ssp_task.LUN, 8);
-
- task_iu->task_func = isci_tmf->tmf_code;
- task_iu->task_tag =
- (ireq->ttype == tmf_task) ?
- isci_tmf->io_tag :
- SCI_CONTROLLER_INVALID_IO_TAG;
-}
-
-/**
- * This method is will fill in the SCU Task Context for any type of SSP request.
- * @sci_req:
- * @task_context:
- *
- */
-static void scu_ssp_reqeust_construct_task_context(
- struct scic_sds_request *sds_request,
- struct scu_task_context *task_context)
-{
- dma_addr_t dma_addr;
- struct scic_sds_controller *controller;
- struct scic_sds_remote_device *target_device;
- struct scic_sds_port *target_port;
-
- controller = scic_sds_request_get_controller(sds_request);
- target_device = scic_sds_request_get_device(sds_request);
- target_port = scic_sds_request_get_port(sds_request);
-
- /* Fill in the TC with the its required data */
- task_context->abort = 0;
- task_context->priority = 0;
- task_context->initiator_request = 1;
- task_context->connection_rate = target_device->connection_rate;
- task_context->protocol_engine_index =
- scic_sds_controller_get_protocol_engine_group(controller);
- task_context->logical_port_index =
- scic_sds_port_get_index(target_port);
- task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_SSP;
- task_context->valid = SCU_TASK_CONTEXT_VALID;
- task_context->context_type = SCU_TASK_CONTEXT_TYPE;
-
- task_context->remote_node_index =
- scic_sds_remote_device_get_index(sds_request->target_device);
- task_context->command_code = 0;
-
- task_context->link_layer_control = 0;
- task_context->do_not_dma_ssp_good_response = 1;
- task_context->strict_ordering = 0;
- task_context->control_frame = 0;
- task_context->timeout_enable = 0;
- task_context->block_guard_enable = 0;
-
- task_context->address_modifier = 0;
-
- /* task_context->type.ssp.tag = sci_req->io_tag; */
- task_context->task_phase = 0x01;
-
- if (sds_request->was_tag_assigned_by_user) {
- /*
- * Build the task context now since we have already read
- * the data
- */
- sds_request->post_context =
- (SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC |
- (scic_sds_controller_get_protocol_engine_group(
- controller) <<
- SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT) |
- (scic_sds_port_get_index(target_port) <<
- SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT) |
- scic_sds_io_tag_get_index(sds_request->io_tag));
- } else {
- /*
- * Build the task context now since we have already read
- * the data
- *
- * I/O tag index is not assigned because we have to wait
- *