summaryrefslogtreecommitdiff
path: root/drivers/scsi/isci/core
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-04-22 01:44:45 (GMT)
committerDan Williams <dan.j.williams@intel.com>2011-07-03 11:00:38 (GMT)
commita1a113b0a1ea437daf099b44f8a39e93a02a3f47 (patch)
treec9576cfc8c12447d0932accee0e3b59d175c08d9 /drivers/scsi/isci/core
parentb87ee3075b090e1dd0bdf40b295142b606d55e64 (diff)
downloadlinux-fsl-qoriq-a1a113b0a1ea437daf099b44f8a39e93a02a3f47.tar.xz
isci: kill smp_discover_response_protocols in favor of domain_device.dev_type
This is step 1 of removing the contortions to: 1/ unparse expander phy data into a smp discover frame 2/ open-code-parse the smp discover fram into a domain_device.dev_type equivalent libsas has already spent cycles determining the dev_type, so now that scic_sds_remote_device is unified with isci_remote_device we can directly reference dev_type. This might also change multi-level expander detection as we previously only looked at dev_type == EDGE_DEV and we did not consider the FANOUT_DEV case. Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi/isci/core')
-rw-r--r--drivers/scsi/isci/core/scic_sds_controller.h20
-rw-r--r--drivers/scsi/isci/core/scic_sds_port.c2
-rw-r--r--drivers/scsi/isci/core/scic_sds_port.h4
-rw-r--r--drivers/scsi/isci/core/scic_sds_request.c24
4 files changed, 21 insertions, 29 deletions
diff --git a/drivers/scsi/isci/core/scic_sds_controller.h b/drivers/scsi/isci/core/scic_sds_controller.h
index e15c4e2..ce81286 100644
--- a/drivers/scsi/isci/core/scic_sds_controller.h
+++ b/drivers/scsi/isci/core/scic_sds_controller.h
@@ -74,9 +74,9 @@
#include "scic_sds_port.h"
#include "scic_sds_phy.h"
#include "remote_node_table.h"
+#include "remote_device.h"
#include "scu_registers.h"
#include "scu_constants.h"
-#include "scu_remote_node_context.h"
#include "scu_task_context.h"
#include "scu_unsolicited_frame.h"
#include "scic_sds_unsolicited_frame_control.h"
@@ -498,14 +498,16 @@ enum scic_sds_controller_states {
#define scic_sds_io_sequence_increment(value) \
((value) = (((value) + 1) & 0x000F))
-#define scic_sds_remote_device_node_count(device) \
- (\
- (\
- (device)->target_protocols.u.bits.attached_stp_target \
- && ((device)->is_direct_attached != true) \
- ) \
- ? SCU_STP_REMOTE_NODE_COUNT : SCU_SSP_REMOTE_NODE_COUNT \
- )
+/* expander attached sata devices require 3 rnc slots */
+static inline int scic_sds_remote_device_node_count(struct scic_sds_remote_device *sci_dev)
+{
+ struct domain_device *dev = sci_dev_to_domain(sci_dev);
+
+ if ((dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) &&
+ !sci_dev->is_direct_attached)
+ return SCU_STP_REMOTE_NODE_COUNT;
+ return SCU_SSP_REMOTE_NODE_COUNT;
+}
/**
* scic_sds_controller_set_invalid_phy() -
diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c
index b07e48e..057f95a 100644
--- a/drivers/scsi/isci/core/scic_sds_port.c
+++ b/drivers/scsi/isci/core/scic_sds_port.c
@@ -434,7 +434,7 @@ void scic_sds_port_get_attached_sas_address(
* multi-protocol support.
*
*/
-void scic_sds_port_get_attached_protocols(
+static void scic_sds_port_get_attached_protocols(
struct scic_sds_port *sci_port,
struct sci_sas_identify_address_frame_protocols *protocols)
{
diff --git a/drivers/scsi/isci/core/scic_sds_port.h b/drivers/scsi/isci/core/scic_sds_port.h
index 964e388..59c76cd 100644
--- a/drivers/scsi/isci/core/scic_sds_port.h
+++ b/drivers/scsi/isci/core/scic_sds_port.h
@@ -447,8 +447,4 @@ void scic_sds_port_get_attached_sas_address(
struct scic_sds_port *sci_port,
struct sci_sas_address *sas_address);
-void scic_sds_port_get_attached_protocols(
- struct scic_sds_port *sci_port,
- struct sci_sas_identify_address_frame_protocols *protocols);
-
#endif /* _SCIC_SDS_PORT_H_ */
diff --git a/drivers/scsi/isci/core/scic_sds_request.c b/drivers/scsi/isci/core/scic_sds_request.c
index dfb9412..a66e7b2 100644
--- a/drivers/scsi/isci/core/scic_sds_request.c
+++ b/drivers/scsi/isci/core/scic_sds_request.c
@@ -1758,8 +1758,8 @@ enum sci_status scic_io_request_construct(struct scic_sds_controller *scic,
struct scic_sds_request *sci_req,
struct scic_sds_request **new_scic_io_request_handle)
{
+ struct domain_device *dev = sci_dev_to_domain(sci_dev);
enum sci_status status = SCI_SUCCESS;
- struct smp_discover_response_protocols device_protocol;
/* Build the common part of the request */
scic_sds_general_request_construct(scic, sci_dev, io_tag,
@@ -1768,19 +1768,16 @@ enum sci_status scic_io_request_construct(struct scic_sds_controller *scic,
if (sci_dev->rnc.remote_node_index == SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX)
return SCI_FAILURE_INVALID_REMOTE_DEVICE;
- scic_remote_device_get_protocols(sci_dev, &device_protocol);
-
- if (device_protocol.u.bits.attached_ssp_target) {
+ if (dev->dev_type == SAS_END_DEV) {
scic_sds_ssp_io_request_assign_buffers(sci_req);
- } else if (device_protocol.u.bits.attached_stp_target) {
+ } else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) {
scic_sds_stp_request_assign_buffers(sci_req);
memset(sci_req->command_buffer, 0, sizeof(struct sata_fis_reg_h2d));
- } else if (device_protocol.u.bits.attached_smp_target) {
+ } else if (dev_is_expander(dev)) {
scic_sds_smp_request_assign_buffers(sci_req);
memset(sci_req->command_buffer, 0, sizeof(struct smp_request));
- } else {
+ } else
status = SCI_FAILURE_UNSUPPORTED_PROTOCOL;
- }
if (status == SCI_SUCCESS) {
memset(sci_req->task_context_buffer, 0,
@@ -1798,17 +1795,15 @@ enum sci_status scic_task_request_construct(struct scic_sds_controller *scic,
struct scic_sds_request *sci_req,
struct scic_sds_request **new_sci_req)
{
+ struct domain_device *dev = sci_dev_to_domain(sci_dev);
enum sci_status status = SCI_SUCCESS;
- struct smp_discover_response_protocols device_protocol;
/* Build the common part of the request */
scic_sds_general_request_construct(scic, sci_dev, io_tag,
user_io_request_object,
sci_req);
- scic_remote_device_get_protocols(sci_dev, &device_protocol);
-
- if (device_protocol.u.bits.attached_ssp_target) {
+ if (dev->dev_type == SAS_END_DEV) {
scic_sds_ssp_task_request_assign_buffers(sci_req);
sci_req->has_started_substate_machine = true;
@@ -1820,11 +1815,10 @@ enum sci_status scic_task_request_construct(struct scic_sds_controller *scic,
scic_sds_io_request_started_task_mgmt_substate_table,
SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_COMPLETION
);
- } else if (device_protocol.u.bits.attached_stp_target) {
+ } else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP))
scic_sds_stp_request_assign_buffers(sci_req);
- } else {
+ else
status = SCI_FAILURE_UNSUPPORTED_PROTOCOL;
- }
if (status == SCI_SUCCESS) {
sci_req->is_task_management_request = true;