summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/isci/core/intel_sas.h27
-rw-r--r--drivers/scsi/isci/core/scic_phy.h26
-rw-r--r--drivers/scsi/isci/core/scic_port.h4
-rw-r--r--drivers/scsi/isci/core/scic_sds_phy.c28
-rw-r--r--drivers/scsi/isci/core/scic_sds_phy.h9
-rw-r--r--drivers/scsi/isci/core/scic_sds_port.c97
-rw-r--r--drivers/scsi/isci/port.c6
7 files changed, 59 insertions, 138 deletions
diff --git a/drivers/scsi/isci/core/intel_sas.h b/drivers/scsi/isci/core/intel_sas.h
index 58bf1fb9b2f5..f2d5ca1c72ed 100644
--- a/drivers/scsi/isci/core/intel_sas.h
+++ b/drivers/scsi/isci/core/intel_sas.h
@@ -85,33 +85,6 @@ struct sci_sas_address {
};
/**
- * struct sci_sas_identify_address_frame_protocols - This structure depicts the
- * contents of bytes 2 and 3 in the SAS IDENTIFY ADDRESS FRAME (IAF).
- *
- * For specific information on each of these individual fields please reference
- * the SAS specification Link layer section on address frames.
- */
-struct sci_sas_identify_address_frame_protocols {
- union {
- struct {
- u16 restricted1:1;
- u16 smp_initiator:1;
- u16 stp_initiator:1;
- u16 ssp_initiator:1;
- u16 reserved3:4;
- u16 restricted2:1;
- u16 smp_target:1;
- u16 stp_target:1;
- u16 ssp_target:1;
- u16 reserved4:4;
- } bits;
-
- u16 all;
- } u;
-
-};
-
-/**
* enum _SCI_SAS_TASK_ATTRIBUTE - This enumeration depicts the SAM/SAS
* specification defined task attribute values for a command information
* unit.
diff --git a/drivers/scsi/isci/core/scic_phy.h b/drivers/scsi/isci/core/scic_phy.h
index 3f43e8d69c4f..451d7977bf6d 100644
--- a/drivers/scsi/isci/core/scic_phy.h
+++ b/drivers/scsi/isci/core/scic_phy.h
@@ -103,6 +103,26 @@ struct scic_phy_cap {
};
} __packed;
+/* this data structure reflects the link layer transmit identification reg */
+struct scic_phy_proto {
+ union {
+ struct {
+ u16 _r_a:1;
+ u16 smp_iport:1;
+ u16 stp_iport:1;
+ u16 ssp_iport:1;
+ u16 _r_b:4;
+ u16 _r_c:1;
+ u16 smp_tport:1;
+ u16 stp_tport:1;
+ u16 ssp_tport:1;
+ u16 _r_d:4;
+ };
+ u16 all;
+ };
+} __packed;
+
+
/**
* struct scic_phy_properties - This structure defines the properties common to
* all phys that can be retrieved.
@@ -124,16 +144,10 @@ struct scic_phy_properties {
enum sas_linkrate negotiated_link_rate;
/**
- * This field indicates the protocols supported by the phy.
- */
- struct sci_sas_identify_address_frame_protocols protocols;
-
- /**
* This field specifies the index of the phy in relation to other
* phys within the controller. This index is zero relative.
*/
u8 index;
-
};
/**
diff --git a/drivers/scsi/isci/core/scic_port.h b/drivers/scsi/isci/core/scic_port.h
index 56d05073f9c5..4ae9b6cdf04f 100644
--- a/drivers/scsi/isci/core/scic_port.h
+++ b/drivers/scsi/isci/core/scic_port.h
@@ -57,6 +57,7 @@
#define _SCIC_PORT_H_
#include "sci_status.h"
+#include "scic_phy.h"
#include "intel_sas.h"
struct scic_sds_port;
@@ -72,8 +73,7 @@ enum scic_port_not_ready_reason_code {
struct scic_port_end_point_properties {
struct sci_sas_address sas_address;
- struct sci_sas_identify_address_frame_protocols protocols;
-
+ struct scic_phy_proto protocols;
};
struct scic_port_properties {
diff --git a/drivers/scsi/isci/core/scic_sds_phy.c b/drivers/scsi/isci/core/scic_sds_phy.c
index 4afdb422ab98..b9d6fc7e8ae0 100644
--- a/drivers/scsi/isci/core/scic_sds_phy.c
+++ b/drivers/scsi/isci/core/scic_sds_phy.c
@@ -442,37 +442,15 @@ void scic_sds_phy_get_attached_sas_address(struct scic_sds_phy *sci_phy,
memcpy(sas_address, iaf->sas_addr, SAS_ADDR_SIZE);
}
-void scic_sds_phy_get_protocols(
- struct scic_sds_phy *sci_phy,
- struct sci_sas_identify_address_frame_protocols *protocols)
+void scic_sds_phy_get_protocols(struct scic_sds_phy *sci_phy,
+ struct scic_phy_proto *protocols)
{
- protocols->u.all =
+ protocols->all =
(u16)(readl(&sci_phy->
link_layer_registers->transmit_identification) &
0x0000FFFF);
}
-void scic_sds_phy_get_attached_phy_protocols(
- struct scic_sds_phy *sci_phy,
- struct sci_sas_identify_address_frame_protocols *protocols)
-{
- protocols->u.all = 0;
-
- if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) {
- struct isci_phy *iphy = sci_phy->iphy;
- struct sas_identify_frame *iaf;
-
- iaf = &iphy->frame_rcvd.iaf;
- memcpy(&protocols->u.all, &iaf->initiator_bits, 2);
- } else if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA)
- protocols->u.bits.stp_target = 1;
-}
-
-/*
- * *****************************************************************************
- * * SCIC SDS PHY Handler Redirects
- * ***************************************************************************** */
-
/**
* This method will attempt to start the phy object. This request is only valid
* when the phy is in the stopped state
diff --git a/drivers/scsi/isci/core/scic_sds_phy.h b/drivers/scsi/isci/core/scic_sds_phy.h
index e91f28316c00..b0cebdc669eb 100644
--- a/drivers/scsi/isci/core/scic_sds_phy.h
+++ b/drivers/scsi/isci/core/scic_sds_phy.h
@@ -57,6 +57,7 @@
#define _SCIC_SDS_PHY_H_
#include "intel_sas.h"
+#include "scic_phy.h"
#include "scu_registers.h"
#include "sci_base_state_machine.h"
#include <scsi/libsas.h>
@@ -438,11 +439,7 @@ void scic_sds_phy_get_attached_sas_address(
struct sci_sas_address *sas_address);
void scic_sds_phy_get_protocols(
- struct scic_sds_phy *this_phy,
- struct sci_sas_identify_address_frame_protocols *protocols);
-
-void scic_sds_phy_get_attached_phy_protocols(
- struct scic_sds_phy *this_phy,
- struct sci_sas_identify_address_frame_protocols *protocols);
+ struct scic_sds_phy *sci_phy,
+ struct scic_phy_proto *protocols);
#endif /* _SCIC_SDS_PHY_H_ */
diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c
index 3697211e7ca9..05bc3bff4f6f 100644
--- a/drivers/scsi/isci/core/scic_sds_port.c
+++ b/drivers/scsi/isci/core/scic_sds_port.c
@@ -53,6 +53,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include "sas.h"
#include "intel_sas.h"
#include "scic_controller.h"
#include "scic_phy.h"
@@ -362,33 +363,32 @@ void scic_sds_port_get_sas_address(
}
}
-/**
- * This method will indicate which protocols are supported by this port.
+/*
+ * This function will indicate which protocols are supported by this port.
* @sci_port: a handle corresponding to the SAS port for which to return the
* supported protocols.
- * @protocols: This parameter specifies a pointer to an IAF protocol field
- * structure into which the core will copy the protocol values for the port.
- * The values are returned as part of a bit mask in order to allow for
- * multi-protocol support.
- *
+ * @protocols: This parameter specifies a pointer to a data structure
+ * which the core will copy the protocol values for the port from the
+ * transmit_identification register.
*/
-static void scic_sds_port_get_protocols(
- struct scic_sds_port *sci_port,
- struct sci_sas_identify_address_frame_protocols *protocols)
+static void
+scic_sds_port_get_protocols(struct scic_sds_port *sci_port,
+ struct scic_phy_proto *protocols)
{
u8 index;
- protocols->u.all = 0;
+ protocols->all = 0;
for (index = 0; index < SCI_MAX_PHYS; index++) {
if (sci_port->phy_table[index] != NULL) {
- scic_sds_phy_get_protocols(sci_port->phy_table[index], protocols);
+ scic_sds_phy_get_protocols(sci_port->phy_table[index],
+ protocols);
}
}
}
-/**
- * This method requests the SAS address for the device directly attached to
+/*
+ * This function requests the SAS address for the device directly attached to
* this SAS port.
* @sci_port: a handle corresponding to the SAS port for which to return the
* SAS address.
@@ -401,21 +401,20 @@ void scic_sds_port_get_attached_sas_address(
struct scic_sds_port *sci_port,
struct sci_sas_address *sas_address)
{
- struct sci_sas_identify_address_frame_protocols protocols;
- struct scic_sds_phy *phy;
+ struct scic_sds_phy *sci_phy;
/*
* Ensure that the phy is both part of the port and currently
- * connected to the remote end-point. */
- phy = scic_sds_port_get_a_connected_phy(sci_port);
- if (phy != NULL) {
- scic_sds_phy_get_attached_phy_protocols(phy, &protocols);
-
- if (!protocols.u.bits.stp_target) {
- scic_sds_phy_get_attached_sas_address(phy, sas_address);
+ * connected to the remote end-point.
+ */
+ sci_phy = scic_sds_port_get_a_connected_phy(sci_port);
+ if (sci_phy) {
+ if (sci_phy->protocol != SCIC_SDS_PHY_PROTOCOL_SATA) {
+ scic_sds_phy_get_attached_sas_address(sci_phy,
+ sas_address);
} else {
- scic_sds_phy_get_sas_address(phy, sas_address);
- sas_address->low += phy->phy_index;
+ scic_sds_phy_get_sas_address(sci_phy, sas_address);
+ sas_address->low += sci_phy->phy_index;
}
} else {
sas_address->high = 0;
@@ -424,33 +423,6 @@ void scic_sds_port_get_attached_sas_address(
}
/**
- * This method will indicate which protocols are supported by this remote
- * device.
- * @sci_port: a handle corresponding to the SAS port for which to return the
- * supported protocols.
- * @protocols: This parameter specifies a pointer to an IAF protocol field
- * structure into which the core will copy the protocol values for the port.
- * The values are returned as part of a bit mask in order to allow for
- * multi-protocol support.
- *
- */
-static void scic_sds_port_get_attached_protocols(
- struct scic_sds_port *sci_port,
- struct sci_sas_identify_address_frame_protocols *protocols)
-{
- struct scic_sds_phy *phy;
-
- /*
- * Ensure that the phy is both part of the port and currently
- * connected to the remote end-point. */
- phy = scic_sds_port_get_a_connected_phy(sci_port);
- if (phy != NULL)
- scic_sds_phy_get_attached_phy_protocols(phy, protocols);
- else
- protocols->u.all = 0;
-}
-
-/**
* scic_sds_port_construct_dummy_rnc() - create dummy rnc for si workaround
*
* @sci_port: logical port on which we need to create the remote node context
@@ -595,7 +567,6 @@ enum sci_status scic_port_get_properties(
scic_sds_port_get_sas_address(port, &prop->local.sas_address);
scic_sds_port_get_protocols(port, &prop->local.protocols);
scic_sds_port_get_attached_sas_address(port, &prop->remote.sas_address);
- scic_sds_port_get_attached_protocols(port, &prop->remote.protocols);
return SCI_SUCCESS;
}
@@ -655,14 +626,10 @@ static void scic_sds_port_activate_phy(struct scic_sds_port *sci_port,
struct scic_sds_phy *sci_phy,
bool do_notify_user)
{
- struct scic_sds_controller *scic = scic_sds_port_get_controller(sci_port);
- struct sci_sas_identify_address_frame_protocols protocols;
+ struct scic_sds_controller *scic = sci_port->owning_controller;
struct isci_host *ihost = scic->ihost;
- scic_sds_phy_get_attached_phy_protocols(sci_phy, &protocols);
-
- /* If this is sata port then the phy has already been resumed */
- if (!protocols.u.bits.stp_target)
+ if (sci_phy->protocol != SCIC_SDS_PHY_PROTOCOL_SATA)
scic_sds_phy_resume(sci_phy);
sci_port->active_phy_mask |= 1 << sci_phy->phy_index;
@@ -803,15 +770,9 @@ bool scic_sds_port_link_detected(
struct scic_sds_port *sci_port,
struct scic_sds_phy *sci_phy)
{
- struct sci_sas_identify_address_frame_protocols protocols;
-
- scic_sds_phy_get_attached_phy_protocols(sci_phy, &protocols);
-
- if (
- (sci_port->logical_port_index != SCIC_SDS_DUMMY_PORT)
- && (protocols.u.bits.stp_target)
- && scic_sds_port_is_wide(sci_port)
- ) {
+ if ((sci_port->logical_port_index != SCIC_SDS_DUMMY_PORT) &&
+ (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) &&
+ scic_sds_port_is_wide(sci_port)) {
scic_sds_port_invalid_link_up(sci_port, sci_phy);
return false;
diff --git a/drivers/scsi/isci/port.c b/drivers/scsi/isci/port.c
index 96a2002dadea..2decafbeb968 100644
--- a/drivers/scsi/isci/port.c
+++ b/drivers/scsi/isci/port.c
@@ -187,7 +187,7 @@ void isci_port_link_up(
scic_port_get_properties(port, &properties);
- if (properties.remote.protocols.u.bits.stp_target) {
+ if (phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) {
u64 attached_sas_address;
isci_phy->sas_phy.oob_mode = SATA_OOB_MODE;
@@ -207,9 +207,7 @@ void isci_port_link_up(
memcpy(&isci_phy->sas_phy.attached_sas_addr,
&attached_sas_address, sizeof(attached_sas_address));
-
- } else if (properties.remote.protocols.u.bits.ssp_target ||
- properties.remote.protocols.u.bits.smp_target) {
+ } else if (phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) {
isci_phy->sas_phy.oob_mode = SAS_OOB_MODE;
isci_phy->sas_phy.frame_rcvd_size = sizeof(struct sas_identify_frame);