summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-04-22 19:18:03 -0700
committerDan Williams <dan.j.williams@intel.com>2011-07-03 04:00:38 -0700
commit88f3b62ac131e2549b6c262cacbd47e8cca42d6e (patch)
tree331870b812b2cb7c4c8ce89779df8473f9570b9c
parent57f20f4ed6fb702339be2ef4dea9d15e6a7d0d07 (diff)
downloadlinux-88f3b62ac131e2549b6c262cacbd47e8cca42d6e.tar.gz
linux-88f3b62ac131e2549b6c262cacbd47e8cca42d6e.tar.bz2
linux-88f3b62ac131e2549b6c262cacbd47e8cca42d6e.zip
isci: move remote_device handling out of the core
Now that the core/lldd remote_device data structures are nominally unified merge the corresponding sources into the top-level directory. Also move the remote_node_context infrastructure which has no analog at the lldd level. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--drivers/scsi/isci/Makefile9
-rw-r--r--drivers/scsi/isci/core/scic_remote_device.h282
-rw-r--r--drivers/scsi/isci/core/scic_sds_controller.c3
-rw-r--r--drivers/scsi/isci/core/scic_sds_controller.h2
-rw-r--r--drivers/scsi/isci/core/scic_sds_phy.c2
-rw-r--r--drivers/scsi/isci/core/scic_sds_port.c4
-rw-r--r--drivers/scsi/isci/core/scic_sds_remote_device.c1664
-rw-r--r--drivers/scsi/isci/core/scic_sds_remote_device.h694
-rw-r--r--drivers/scsi/isci/core/scic_sds_request.c3
-rw-r--r--drivers/scsi/isci/core/scic_sds_smp_request.c3
-rw-r--r--drivers/scsi/isci/core/scic_sds_stp_packet_request.c3
-rw-r--r--drivers/scsi/isci/core/scic_sds_stp_request.c3
-rw-r--r--drivers/scsi/isci/host.c4
-rw-r--r--drivers/scsi/isci/host.h1
-rw-r--r--drivers/scsi/isci/init.c1
-rw-r--r--drivers/scsi/isci/port.c1
-rw-r--r--drivers/scsi/isci/port.h1
-rw-r--r--drivers/scsi/isci/probe_roms.c1
-rw-r--r--drivers/scsi/isci/remote_device.c1636
-rw-r--r--drivers/scsi/isci/remote_device.h742
-rw-r--r--drivers/scsi/isci/remote_node_context.c (renamed from drivers/scsi/isci/core/scic_sds_remote_node_context.c)5
-rw-r--r--drivers/scsi/isci/remote_node_context.h (renamed from drivers/scsi/isci/core/scic_sds_remote_node_context.h)0
-rw-r--r--drivers/scsi/isci/remote_node_table.c (renamed from drivers/scsi/isci/core/scic_sds_remote_node_table.c)4
-rw-r--r--drivers/scsi/isci/remote_node_table.h (renamed from drivers/scsi/isci/core/scic_sds_remote_node_table.h)0
-rw-r--r--drivers/scsi/isci/request.c1
-rw-r--r--drivers/scsi/isci/sata.c3
-rw-r--r--drivers/scsi/isci/scu_remote_node_context.h (renamed from drivers/scsi/isci/core/scu_remote_node_context.h)0
-rw-r--r--drivers/scsi/isci/smp_remote_device.c (renamed from drivers/scsi/isci/core/scic_sds_smp_remote_device.c)3
-rw-r--r--drivers/scsi/isci/stp_remote_device.c (renamed from drivers/scsi/isci/core/scic_sds_stp_remote_device.c)3
-rw-r--r--drivers/scsi/isci/task.c5
30 files changed, 2325 insertions, 2758 deletions
diff --git a/drivers/scsi/isci/Makefile b/drivers/scsi/isci/Makefile
index 522e7a7c062e..ccc8c53f501d 100644
--- a/drivers/scsi/isci/Makefile
+++ b/drivers/scsi/isci/Makefile
@@ -10,20 +10,19 @@ obj-$(CONFIG_SCSI_ISCI) += isci.o
isci-objs := init.o phy.o request.o sata.o \
remote_device.o port.o timers.o \
host.o task.o probe_roms.o \
+ stp_remote_device.o \
+ smp_remote_device.o \
+ remote_node_context.o \
+ remote_node_table.o \
core/scic_sds_controller.o \
- core/scic_sds_remote_device.o \
core/scic_sds_request.o \
core/scic_sds_stp_request.o \
core/scic_sds_stp_packet_request.o \
- core/scic_sds_stp_remote_device.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_remote_node_context.o \
core/scic_sds_smp_request.o \
- core/scic_sds_smp_remote_device.o \
- core/scic_sds_remote_node_table.o \
core/scic_sds_unsolicited_frame_control.o \
core/sci_base_state_machine.o \
core/sci_util.o
diff --git a/drivers/scsi/isci/core/scic_remote_device.h b/drivers/scsi/isci/core/scic_remote_device.h
deleted file mode 100644
index 23e90af5a01b..000000000000
--- a/drivers/scsi/isci/core/scic_remote_device.h
+++ /dev/null
@@ -1,282 +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_REMOTE_DEVICE_H_
-#define _SCIC_REMOTE_DEVICE_H_
-
-/**
- * This file contains all of the interface methods that can be called by an
- * SCIC user on the device object.
- *
- *
- */
-
-
-#include "sci_status.h"
-#include "intel_sas.h"
-
-struct scic_sds_port;
-struct scic_sds_remote_device;
-
-/**
- *
- *
- *
- */
-enum scic_remote_device_not_ready_reason_code {
- SCIC_REMOTE_DEVICE_NOT_READY_START_REQUESTED,
- SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED,
- SCIC_REMOTE_DEVICE_NOT_READY_SATA_REQUEST_STARTED,
- SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED,
- SCIC_REMOTE_DEVICE_NOT_READY_SMP_REQUEST_STARTED,
-
- SCIC_REMOTE_DEVICE_NOT_READY_REASON_CODE_MAX
-
-};
-
-/**
- * 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.
- * @sci_dev: remote device to construct
- *
- * It isn't necessary to call scic_remote_device_destruct() for device objects
- * that have only called this method for construction. Once subsequent
- * construction methods have been invoked (e.g.
- * scic_remote_device_da_construct()), then destruction should occur. none
- */
-void scic_remote_device_construct(struct scic_sds_port *sci_port,
- struct scic_sds_remote_device *sci_dev);
-
-/**
- * scic_remote_device_da_construct() - This method will construct a
- * SCIC_REMOTE_DEVICE object for a direct attached (da) device. The
- * information (e.g. IAF, Signature FIS, etc.) necessary to build the device
- * is known to the SCI Core since it is contained in the scic_phy object.
- * @remote_device: This parameter specifies the remote device to be destructed.
- *
- * The user must have previously called scic_remote_device_construct() Remote
- * device objects are a limited resource. As such, they must be protected.
- * Thus calls to construct and destruct are mutually exclusive and
- * non-reentrant. Indicate if the remote device was successfully constructed.
- * SCI_SUCCESS Returned if the device was successfully constructed.
- * SCI_FAILURE_DEVICE_EXISTS Returned if the device has already been
- * constructed. If it's an additional phy for the target, then call
- * scic_remote_device_da_add_phy(). SCI_FAILURE_UNSUPPORTED_PROTOCOL Returned
- * if the supplied parameters necessitate creation of a remote device for which
- * the protocol is not supported by the underlying controller hardware.
- * SCI_FAILURE_INSUFFICIENT_RESOURCES This value is returned if the core
- * controller associated with the supplied parameters is unable to support
- * additional remote devices.
- */
-enum sci_status scic_remote_device_da_construct(
- struct scic_sds_remote_device *remote_device);
-
-/**
- * scic_remote_device_ea_construct() - This method will construct an
- * SCIC_REMOTE_DEVICE object for an expander attached (ea) device from an
- * SMP Discover Response.
- * @remote_device: This parameter specifies the remote device to be destructed.
- * @discover_response: This parameter specifies the SMP Discovery Response to
- * be used in device creation.
- *
- * The user must have previously called scic_remote_device_construct() Remote
- * device objects are a limited resource. As such, they must be protected.
- * Thus calls to construct and destruct are mutually exclusive and
- * non-reentrant. Indicate if the remote device was successfully constructed.
- * SCI_SUCCESS Returned if the device was successfully constructed.
- * SCI_FAILURE_DEVICE_EXISTS Returned if the device has already been
- * constructed. If it's an additional phy for the target, then call
- * scic_ea_remote_device_add_phy(). SCI_FAILURE_UNSUPPORTED_PROTOCOL Returned
- * if the supplied parameters necessitate creation of a remote device for which
- * the protocol is not supported by the underlying controller hardware.
- * SCI_FAILURE_INSUFFICIENT_RESOURCES This value is returned if the core
- * controller associated with the supplied parameters is unable to support
- * additional remote devices.
- */
-enum sci_status scic_remote_device_ea_construct(
- struct scic_sds_remote_device *remote_device,
- struct smp_response_discover *discover_response);
-
-/**
- * scic_remote_device_destruct() - This method is utilized to free up a core's
- * remote device object.
- * @remote_device: This parameter specifies the remote device to be destructed.
- *
- * Remote device objects are a limited resource. As such, they must be
- * protected. Thus calls to construct and destruct are mutually exclusive and
- * non-reentrant. The return value shall indicate if the device was
- * successfully destructed or if some failure occurred. enum sci_status This value
- * is returned if the device is successfully destructed.
- * SCI_FAILURE_INVALID_REMOTE_DEVICE This value is returned if the supplied
- * device isn't valid (e.g. it's already been destoryed, the handle isn't
- * valid, etc.).
- */
-enum sci_status scic_remote_device_destruct(
- struct scic_sds_remote_device *remote_device);
-
-
-
-
-
-/**
- * scic_remote_device_start() - This method will start the supplied remote
- * device. This method enables normal IO requests to flow through to the
- * remote device.
- * @remote_device: This parameter specifies the device to be started.
- * @timeout: This parameter specifies the number of milliseconds in which the
- * start operation should complete.
- *
- * An indication of whether the device was successfully started. SCI_SUCCESS
- * This value is returned if the device was successfully started.
- * SCI_FAILURE_INVALID_PHY This value is returned if the user attempts to start
- * the device when there have been no phys added to it.
- */
-enum sci_status scic_remote_device_start(
- struct scic_sds_remote_device *remote_device,
- u32 timeout);
-
-/**
- * scic_remote_device_stop() - This method will stop both transmission and
- * reception of link activity for the supplied remote device. This method
- * disables normal IO requests from flowing through to the remote device.
- * @remote_device: This parameter specifies the device to be stopped.
- * @timeout: This parameter specifies the number of milliseconds in which the
- * stop operation should complete.
- *
- * An indication of whether the device was successfully stopped. SCI_SUCCESS
- * This value is returned if the transmission and reception for the device was
- * successfully stopped.
- */
-enum sci_status scic_remote_device_stop(
- struct scic_sds_remote_device *remote_device,
- u32 timeout);
-
-/**
- * scic_remote_device_reset() - This method will reset the device making it
- * ready for operation. This method must be called anytime the device is
- * reset either through a SMP phy control or a port hard reset request.
- * @remote_device: This parameter specifies the device to be reset.
- *
- * This method does not actually cause the device hardware to be reset. This
- * method resets the software object so that it will be operational after a
- * device hardware reset completes. An indication of whether the device reset
- * was accepted. SCI_SUCCESS This value is returned if the device reset is
- * started.
- */
-enum sci_status scic_remote_device_reset(
- struct scic_sds_remote_device *remote_device);
-
-/**
- * scic_remote_device_reset_complete() - This method informs the device object
- * that the reset operation is complete and the device can resume operation
- * again.
- * @remote_device: This parameter specifies the device which is to be informed
- * of the reset complete operation.
- *
- * An indication that the device is resuming operation. SCI_SUCCESS the device
- * is resuming operation.
- */
-enum sci_status scic_remote_device_reset_complete(
- struct scic_sds_remote_device *remote_device);
-
-
-
-/**
- * scic_remote_device_get_connection_rate() - This method simply returns the
- * link rate at which communications to the remote device occur.
- * @remote_device: This parameter specifies the device for which to get the
- * connection rate.
- *
- * Return the link rate at which we transfer for the supplied remote device.
- */
-enum sas_linkrate scic_remote_device_get_connection_rate(
- struct scic_sds_remote_device *remote_device);
-
-/**
- * scic_remote_device_get_protocols() - This method will indicate which
- * protocols are supported by this remote device.
- * @remote_device: This parameter specifies the device for which to return the
- * protocol.
- * @protocols: This parameter specifies the output values, from the remote
- * device object, which indicate the protocols supported by the supplied
- * remote_device.
- *
- * The type of protocols supported by this device. The values are returned as
- * part of a bit mask in order to allow for multi-protocol support.
- */
-void scic_remote_device_get_protocols(
- struct scic_sds_remote_device *remote_device,
- struct smp_discover_response_protocols *protocols);
-
-
-#if !defined(DISABLE_ATAPI)
-/**
- * scic_remote_device_is_atapi() -
- * @this_device: The device whose type is to be decided.
- *
- * This method first decide whether a device is a stp target, then decode the
- * signature fis of a DA STP device to tell whether it is a standard end disk
- * or an ATAPI device. bool Indicate a device is ATAPI device or not.
- */
-bool scic_remote_device_is_atapi(
- struct scic_sds_remote_device *device_handle);
-#else /* !defined(DISABLE_ATAPI) */
-#define scic_remote_device_is_atapi(device_handle) false
-#endif /* !defined(DISABLE_ATAPI) */
-
-
-#endif /* _SCIC_REMOTE_DEVICE_H_ */
-
diff --git a/drivers/scsi/isci/core/scic_sds_controller.c b/drivers/scsi/isci/core/scic_sds_controller.c
index 63f4cd130d1d..c684d9ec8c97 100644
--- a/drivers/scsi/isci/core/scic_sds_controller.c
+++ b/drivers/scsi/isci/core/scic_sds_controller.c
@@ -57,13 +57,12 @@
#include "scic_controller.h"
#include "scic_phy.h"
#include "scic_port.h"
-#include "scic_remote_device.h"
#include "scic_sds_controller.h"
#include "scu_registers.h"
#include "scic_sds_phy.h"
#include "scic_sds_port_configuration_agent.h"
#include "scic_sds_port.h"
-#include "scic_sds_remote_device.h"
+#include "remote_device.h"
#include "scic_sds_request.h"
#include "sci_environment.h"
#include "sci_util.h"
diff --git a/drivers/scsi/isci/core/scic_sds_controller.h b/drivers/scsi/isci/core/scic_sds_controller.h
index 4bb9a43fbe4d..e15c4e2fd76d 100644
--- a/drivers/scsi/isci/core/scic_sds_controller.h
+++ b/drivers/scsi/isci/core/scic_sds_controller.h
@@ -73,7 +73,7 @@
#include "scic_config_parameters.h"
#include "scic_sds_port.h"
#include "scic_sds_phy.h"
-#include "scic_sds_remote_node_table.h"
+#include "remote_node_table.h"
#include "scu_registers.h"
#include "scu_constants.h"
#include "scu_remote_node_context.h"
diff --git a/drivers/scsi/isci/core/scic_sds_phy.c b/drivers/scsi/isci/core/scic_sds_phy.c
index 34bd3b25ccf6..09018466f993 100644
--- a/drivers/scsi/isci/core/scic_sds_phy.c
+++ b/drivers/scsi/isci/core/scic_sds_phy.c
@@ -61,7 +61,7 @@
#include "scic_sds_controller.h"
#include "scic_sds_phy.h"
#include "scic_sds_port.h"
-#include "scic_sds_remote_node_context.h"
+#include "remote_node_context.h"
#include "sci_environment.h"
#include "sci_util.h"
#include "scu_event_codes.h"
diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c
index a8d7e51bdf7b..b07e48e2f188 100644
--- a/drivers/scsi/isci/core/scic_sds_port.c
+++ b/drivers/scsi/isci/core/scic_sds_port.c
@@ -60,8 +60,8 @@
#include "scic_sds_controller.h"
#include "scic_sds_phy.h"
#include "scic_sds_port.h"
-#include "scic_sds_remote_device.h"
-#include "scic_sds_remote_node_context.h"
+#include "remote_device.h"
+#include "remote_node_context.h"
#include "scic_sds_request.h"
#include "sci_environment.h"
#include "scu_registers.h"
diff --git a/drivers/scsi/isci/core/scic_sds_remote_device.c b/drivers/scsi/isci/core/scic_sds_remote_device.c
deleted file mode 100644
index d314e2b2088b..000000000000
--- a/drivers/scsi/isci/core/scic_sds_remote_device.c
+++ /dev/null
@@ -1,1664 +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 "intel_sas.h"
-#include "scic_controller.h"
-#include "scic_phy.h"
-#include "scic_port.h"
-#include "scic_remote_device.h"
-#include "scic_sds_controller.h"
-#include "scic_sds_phy.h"
-#include "scic_sds_port.h"
-#include "scic_sds_remote_device.h"
-#include "scic_sds_remote_node_context.h"
-#include "scic_sds_request.h"
-#include "sci_environment.h"
-#include "sci_util.h"
-#include "scu_event_codes.h"
-
-
-#define SCIC_SDS_REMOTE_DEVICE_RESET_TIMEOUT (1000)
-
-enum sci_status scic_remote_device_da_construct(
- struct scic_sds_remote_device *sci_dev)
-{
- enum sci_status status;
- u16 remote_node_index;
- struct sci_sas_identify_address_frame_protocols protocols;
-
- /*
- * This information is request to determine how many remote node context
- * entries will be needed to store the remote node.
- */
- scic_sds_port_get_attached_protocols(sci_dev->owning_port, &protocols);
- sci_dev->target_protocols.u.all = protocols.u.all;
- sci_dev->is_direct_attached = true;
-#if !defined(DISABLE_ATAPI)
- sci_dev->is_atapi = scic_sds_remote_device_is_atapi(sci_dev);
-#endif
-
- status = scic_sds_controller_allocate_remote_node_context(
- sci_dev->owning_port->owning_controller,
- sci_dev,
- &remote_node_index);
-
- if (status == SCI_SUCCESS) {
- sci_dev->rnc.remote_node_index = remote_node_index;
-
- scic_sds_port_get_attached_sas_address(
- sci_dev->owning_port, &sci_dev->device_address);
-
- if (sci_dev->target_protocols.u.bits.attached_ssp_target) {
- sci_dev->has_ready_substate_machine = false;
- } else if (sci_dev->target_protocols.u.bits.attached_stp_target) {
- sci_dev->has_ready_substate_machine = true;
-
- sci_base_state_machine_construct(
- &sci_dev->ready_substate_machine,
- &sci_dev->parent,
- scic_sds_stp_remote_device_ready_substate_table,
- SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
- } else if (sci_dev->target_protocols.u.bits.attached_smp_target) {
- sci_dev->has_ready_substate_machine = true;
-
- /* add the SMP ready substate machine construction here */
- sci_base_state_machine_construct(
- &sci_dev->ready_substate_machine,
- &sci_dev->parent,
- scic_sds_smp_remote_device_ready_substate_table,
- SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
- }
-
- sci_dev->connection_rate = scic_sds_port_get_max_allowed_speed(
- sci_dev->owning_port);
-
- /* / @todo Should I assign the port width by reading all of the phys on the port? */
- sci_dev->device_port_width = 1;
- }
-
- return status;
-}
-
-
-static void scic_sds_remote_device_get_info_from_smp_discover_response(
- struct scic_sds_remote_device *sci_dev,
- struct smp_response_discover *discover_response)
-{
- /* decode discover_response to set sas_address to sci_dev. */
- sci_dev->device_address.high =
- discover_response->attached_sas_address.high;
-
- sci_dev->device_address.low =
- discover_response->attached_sas_address.low;
-
- sci_dev->target_protocols.u.all = discover_response->protocols.u.all;
-}
-
-
-enum sci_status scic_remote_device_ea_construct(
- struct scic_sds_remote_device *sci_dev,
- struct smp_response_discover *discover_response)
-{
- enum sci_status status;
- struct scic_sds_controller *scic;
-
- scic = scic_sds_port_get_controller(sci_dev->owning_port);
-
- scic_sds_remote_device_get_info_from_smp_discover_response(
- sci_dev, discover_response);
-
- status = scic_sds_controller_allocate_remote_node_context(
- scic, sci_dev, &sci_dev->rnc.remote_node_index);
-
- if (status == SCI_SUCCESS) {
- if (sci_dev->target_protocols.u.bits.attached_ssp_target) {
- sci_dev->has_ready_substate_machine = false;
- } else if (sci_dev->target_protocols.u.bits.attached_smp_target) {
- sci_dev->has_ready_substate_machine = true;
-
- /* add the SMP ready substate machine construction here */
- sci_base_state_machine_construct(
- &sci_dev->ready_substate_machine,
- &sci_dev->parent,
- scic_sds_smp_remote_device_ready_substate_table,
- SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
- } else if (sci_dev->target_protocols.u.bits.attached_stp_target) {
- sci_dev->has_ready_substate_machine = true;
-
- sci_base_state_machine_construct(
- &sci_dev->ready_substate_machine,
- &sci_dev->parent,
- scic_sds_stp_remote_device_ready_substate_table,
- SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE);
- }
-
- /*
- * For SAS-2 the physical link rate is actually a logical link
- * rate that incorporates multiplexing. The SCU doesn't
- * incorporate multiplexing and for the purposes of the
- * connection the logical link rate is that same as the
- * physical. Furthermore, the SAS-2 and SAS-1.1 fields overlay
- * one another, so this code works for both situations. */
- sci_dev->connection_rate = min_t(u16,
- scic_sds_port_get_max_allowed_speed(sci_dev->owning_port),
- discover_response->u2.sas1_1.negotiated_physical_link_rate
- );
-
- /* / @todo Should I assign the port width by reading all of the phys on the port? */
- sci_dev->device_port_width = 1;
- }
-
- return status;
-}
-
-enum sci_status scic_remote_device_destruct(
- struct scic_sds_remote_device *sci_dev)
-{
- return sci_dev->state_handlers->destruct_handler(sci_dev);
-}
-
-
-enum sci_status scic_remote_device_start(
- struct scic_sds_remote_device *sci_dev,
- u32 timeout)
-{
- return sci_dev->state_handlers->start_handler(sci_dev);
-}
-
-
-enum sci_status scic_remote_device_stop(
- struct scic_sds_remote_device *sci_dev,
- u32 timeout)
-{
- return sci_dev->state_handlers->stop_handler(sci_dev);
-}
-
-
-enum sci_status scic_remote_device_reset(
- struct scic_sds_remote_device *sci_dev)
-{
- return sci_dev->state_handlers->reset_handler(sci_dev);
-}
-
-
-enum sci_status scic_remote_device_reset_complete(
- struct scic_sds_remote_device *sci_dev)
-{
- return sci_dev->state_handlers->reset_complete_handler(sci_dev);
-}
-
-
-enum sas_linkrate scic_remote_device_get_connection_rate(
- struct scic_sds_remote_device *sci_dev)
-{
- return sci_dev->connection_rate;
-}
-
-
-void scic_remote_device_get_protocols(
- struct scic_sds_remote_device *sci_dev,
- struct smp_discover_response_protocols *pr)
-{
- pr->u.all = sci_dev->target_protocols.u.all;
-}
-
-#if !defined(DISABLE_ATAPI)
-bool scic_remote_device_is_atapi(struct scic_sds_remote_device *sci_dev)
-{
- return sci_dev->is_atapi;
-}
-#endif
-
-
-/*
- * *****************************************************************************
- * * SCU DRIVER STANDARD (SDS) REMOTE DEVICE IMPLEMENTATIONS
- * ***************************************************************************** */
-
-/**
- *
- *
- * Remote device timer requirements
- */
-#define SCIC_SDS_REMOTE_DEVICE_MINIMUM_TIMER_COUNT (0)
-#define SCIC_SDS_REMOTE_DEVICE_MAXIMUM_TIMER_COUNT (SCI_MAX_REMOTE_DEVICES)
-
-
-/**
- *
- * @sci_dev: The remote device for which the suspend is being requested.
- *
- * This method invokes the remote device suspend state handler. enum sci_status
- */
-enum sci_status scic_sds_remote_device_suspend(
- struct scic_sds_remote_device *sci_dev,
- u32 suspend_type)
-{
- return sci_dev->state_handlers->suspend_handler(sci_dev, suspend_type);
-}
-
-/**
- *
- * @sci_dev: The remote device for which the resume is being requested.
- *
- * This method invokes the remote device resume state handler. enum sci_status
- */
-enum sci_status scic_sds_remote_device_resume(
- struct scic_sds_remote_device *sci_dev)
-{
- return sci_dev->state_handlers->resume_handler(sci_dev);
-}
-
-/**
- *
- * @sci_dev: The remote device for which the event handling is being
- * requested.
- * @frame_index: This is the frame index that is being processed.
- *
- * This method invokes the frame handler for the remote device state machine
- * enum sci_status
- */
-enum sci_status scic_sds_remote_device_frame_handler(
- struct scic_sds_remote_device *sci_dev,
- u32 frame_index)
-{
- return sci_dev->state_handlers->frame_handler(sci_dev, frame_index);
-}
-
-/**
- *
- * @sci_dev: The remote device for which the event handling is being
- * requested.
- * @event_code: This is the event code that is to be processed.
- *
- * This method invokes the remote device event handler. enum sci_status
- */
-enum sci_status scic_sds_remote_device_event_handler(
- struct scic_sds_remote_device *sci_dev,
- u32 event_code)
-{
- return sci_dev->state_handlers->event_handler(sci_dev, event_code);
-}
-
-/**
- *
- * @controller: The controller that is starting the io request.
- * @sci_dev: The remote device for which the start io handling is being
- * requested.
- * @io_request: The io request that is being started.
- *
- * This method invokes the remote device start io handler. enum sci_status
- */
-enum sci_status scic_sds_remote_device_start_io(
- struct scic_sds_controller *controller,