Skip to content

Commit

Permalink
isci: remove redundant copies of IAF
Browse files Browse the repository at this point in the history
We need to remove the extra copies of identify address frame that's
being kept around. We only need the one copy that libsas is using.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
[further cleanups]
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Dave Jiang authored and Dan Williams committed Jul 3, 2011
1 parent d20930a commit f700ad4
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 136 deletions.
43 changes: 0 additions & 43 deletions drivers/scsi/isci/core/scic_phy.h
Original file line number Diff line number Diff line change
Expand Up @@ -287,47 +287,4 @@ enum scic_phy_counter_id {
SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR
};


/**
* scic_sas_phy_get_properties() - This method will enable the user to retrieve
* information specific to a SAS phy, such as: the received identify address
* frame, received phy capabilities, etc.
* @phy: this parameter specifies the phy for which to retrieve properties.
* @properties: This parameter specifies the properties structure into which to
* copy the requested information.
*
* This method returns an indication as to whether the SAS phy properties were
* successfully retrieved. SCI_SUCCESS This value is returned if the SAS
* properties are successfully retrieved. SCI_FAILURE This value is returned if
* the SAS properties are not successfully retrieved (e.g. It's not a SAS Phy).
*/
enum sci_status scic_sas_phy_get_properties(
struct scic_sds_phy *phy,
struct scic_sas_phy_properties *properties);

/**
* scic_sata_phy_get_properties() - This method will enable the user to
* retrieve information specific to a SATA phy, such as: the received
* signature FIS, if a port selector is present, etc.
* @phy: this parameter specifies the phy for which to retrieve properties.
* @properties: This parameter specifies the properties structure into which to
* copy the requested information.
*
* This method returns an indication as to whether the SATA phy properties were
* successfully retrieved. SCI_SUCCESS This value is returned if the SATA
* properties are successfully retrieved. SCI_FAILURE This value is returned if
* the SATA properties are not successfully retrieved (e.g. It's not a SATA
* Phy).
*/
enum sci_status scic_sata_phy_get_properties(
struct scic_sds_phy *phy,
struct scic_sata_phy_properties *properties);







#endif /* _SCIC_PHY_H_ */

69 changes: 11 additions & 58 deletions drivers/scsi/isci/core/scic_sds_phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,8 +436,9 @@ void scic_sds_phy_get_attached_sas_address(struct scic_sds_phy *sci_phy,
struct sci_sas_address *sas_address)
{
struct sas_identify_frame *iaf;
struct isci_phy *iphy = sci_phy->iphy;

iaf = &sci_phy->phy_type.sas_id_frame;
iaf = &iphy->frame_rcvd.iaf;
memcpy(sas_address, iaf->sas_addr, SAS_ADDR_SIZE);
}

Expand All @@ -458,13 +459,13 @@ void scic_sds_phy_get_attached_phy_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 = &sci_phy->phy_type.sas_id_frame;
iaf = &iphy->frame_rcvd.iaf;
memcpy(&protocols->u.all, &iaf->initiator_bits, 2);
} else if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) {
} else if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA)
protocols->u.bits.stp_target = 1;
}
}

/*
Expand Down Expand Up @@ -549,49 +550,6 @@ enum sci_status scic_sds_phy_consume_power_handler(
return sci_phy->state_handlers->consume_power_handler(sci_phy);
}

/*
* *****************************************************************************
* * SCIC PHY Public Methods
* ***************************************************************************** */


enum sci_status scic_sas_phy_get_properties(
struct scic_sds_phy *sci_phy,
struct scic_sas_phy_properties *properties)
{
if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) {
memcpy(&properties->rcvd_iaf,
&sci_phy->phy_type.sas_id_frame,
sizeof(struct sas_identify_frame));

properties->rcvd_cap.all =
readl(&sci_phy->link_layer_registers->receive_phycap);

return SCI_SUCCESS;
}

return SCI_FAILURE;
}


enum sci_status scic_sata_phy_get_properties(
struct scic_sds_phy *sci_phy,
struct scic_sata_phy_properties *properties)
{
if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) {
memcpy(&properties->signature_fis,
&sci_phy->phy_type.sata_sig_fis,
sizeof(struct dev_to_host_fis));

/* / @todo add support for port selectors. */
properties->is_port_selector_present = false;

return SCI_SUCCESS;
}

return SCI_FAILURE;
}

/*
* *****************************************************************************
* * SCIC SDS PHY HELPER FUNCTIONS
Expand Down Expand Up @@ -1163,6 +1121,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_iaf_uf_frame_handler
enum sci_status result;
u32 *frame_words;
struct sas_identify_frame *identify_frame;
struct isci_phy *iphy = sci_phy->iphy;

result = scic_sds_unsolicited_frame_control_get_header(
&(scic_sds_phy_get_controller(sci_phy)->uf_control),
Expand All @@ -1188,9 +1147,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_iaf_uf_frame_handler
frame_words[4] = SCIC_SWAP_DWORD(frame_words[4]);
frame_words[5] = SCIC_SWAP_DWORD(frame_words[5]);

memcpy(&sci_phy->phy_type.sas_id_frame,
identify_frame,
sizeof(struct sas_identify_frame));
memcpy(&iphy->frame_rcvd.iaf, identify_frame, sizeof(*identify_frame));

if (identify_frame->smp_tport) {
/* We got the IAF for an expander PHY go to the final state since
Expand Down Expand Up @@ -1239,6 +1196,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_sig_fis_frame_handle
enum sci_status result;
struct dev_to_host_fis *frame_header;
u32 *fis_frame_data;
struct isci_phy *iphy = sci_phy->iphy;

result = scic_sds_unsolicited_frame_control_get_header(
&(scic_sds_phy_get_controller(sci_phy)->uf_control),
Expand All @@ -1255,10 +1213,9 @@ static enum sci_status scic_sds_phy_starting_substate_await_sig_fis_frame_handle
frame_index,
(void **)&fis_frame_data);

scic_sds_controller_copy_sata_response(
&sci_phy->phy_type.sata_sig_fis,
frame_header,
fis_frame_data);
scic_sds_controller_copy_sata_response(&iphy->frame_rcvd.fis,
frame_header,
fis_frame_data);

/* got IAF we can now go to the await spinup semaphore state */
sci_base_state_machine_change_state(&sci_phy->starting_substate_machine,
Expand Down Expand Up @@ -2330,7 +2287,6 @@ static const struct sci_base_state scic_sds_phy_state_table[] = {
void scic_sds_phy_construct(struct scic_sds_phy *sci_phy,
struct scic_sds_port *owning_port, u8 phy_index)
{

sci_base_state_machine_construct(&sci_phy->state_machine,
sci_phy,
scic_sds_phy_state_table,
Expand All @@ -2347,9 +2303,6 @@ void scic_sds_phy_construct(struct scic_sds_phy *sci_phy,
sci_phy->max_negotiated_speed = SAS_LINK_RATE_UNKNOWN;
sci_phy->sata_timeout_timer = NULL;

/* Clear out the identification buffer data */
memset(&sci_phy->phy_type, 0, sizeof(sci_phy->phy_type));

/* Initialize the the substate machines */
sci_base_state_machine_construct(&sci_phy->starting_substate_machine,
sci_phy,
Expand Down
5 changes: 0 additions & 5 deletions drivers/scsi/isci/core/scic_sds_phy.h
Original file line number Diff line number Diff line change
Expand Up @@ -272,11 +272,6 @@ struct scic_sds_phy {
*/
bool is_in_link_training;

union {
struct sas_identify_frame sas_id_frame;
struct dev_to_host_fis sata_sig_fis;
} phy_type;

/**
* This field contains a reference to the timer utilized in detecting
* when a signature FIS timeout has occurred. The signature FIS is the
Expand Down
3 changes: 0 additions & 3 deletions drivers/scsi/isci/phy.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,8 @@
*/

struct isci_phy {

struct scic_sds_phy *sci_phy_handle;

struct asd_sas_phy sas_phy;
struct sas_identify_frame *frame;
struct isci_port *isci_port;
u8 sas_addr[SAS_ADDR_SIZE];

Expand Down
27 changes: 0 additions & 27 deletions drivers/scsi/isci/port.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ void isci_port_link_up(
struct scic_port_properties properties;
struct isci_phy *isci_phy = phy->iphy;
struct isci_port *isci_port = port->iport;
enum sci_status call_status;
unsigned long success = true;

BUG_ON(isci_phy->isci_port != NULL);
Expand All @@ -191,21 +190,7 @@ void isci_port_link_up(
if (properties.remote.protocols.u.bits.stp_target) {
u64 attached_sas_address;

struct scic_sata_phy_properties sata_phy_properties;

isci_phy->sas_phy.oob_mode = SATA_OOB_MODE;

/* Get a copy of the signature fis for libsas */
call_status = scic_sata_phy_get_properties(phy,
&sata_phy_properties);

/*
* XXX I am concerned about this "assert". shouldn't we
* handle the return appropriately?
*/
BUG_ON(call_status != SCI_SUCCESS);

isci_phy->frame_rcvd.fis = sata_phy_properties.signature_fis;
isci_phy->sas_phy.frame_rcvd_size = sizeof(struct dev_to_host_fis);

/*
Expand All @@ -225,24 +210,12 @@ void isci_port_link_up(

} else if (properties.remote.protocols.u.bits.ssp_target ||
properties.remote.protocols.u.bits.smp_target) {

struct scic_sas_phy_properties sas_phy_properties;

isci_phy->sas_phy.oob_mode = SAS_OOB_MODE;

/* Get a copy of the identify address frame for libsas */
call_status = scic_sas_phy_get_properties(phy,
&sas_phy_properties);

BUG_ON(call_status != SCI_SUCCESS);

isci_phy->frame_rcvd.iaf = sas_phy_properties.rcvd_iaf;
isci_phy->sas_phy.frame_rcvd_size = sizeof(struct sas_identify_frame);

/* Copy the attached SAS address from the IAF */
memcpy(isci_phy->sas_phy.attached_sas_addr,
isci_phy->frame_rcvd.iaf.sas_addr, SAS_ADDR_SIZE);

} else {
dev_err(&isci_host->pdev->dev, "%s: unkown target\n", __func__);
success = false;
Expand Down

0 comments on commit f700ad4

Please sign in to comment.