diff options
-rw-r--r-- | drivers/scsi/isci/core/scic_phy.h | 43 | ||||
-rw-r--r-- | drivers/scsi/isci/core/scic_sds_phy.c | 69 | ||||
-rw-r--r-- | drivers/scsi/isci/core/scic_sds_phy.h | 5 | ||||
-rw-r--r-- | drivers/scsi/isci/phy.h | 3 | ||||
-rw-r--r-- | drivers/scsi/isci/port.c | 27 |
5 files changed, 11 insertions, 136 deletions
diff --git a/drivers/scsi/isci/core/scic_phy.h b/drivers/scsi/isci/core/scic_phy.h index 8fcd3a4c5744..3f43e8d69c4f 100644 --- a/drivers/scsi/isci/core/scic_phy.h +++ b/drivers/scsi/isci/core/scic_phy.h | |||
@@ -287,47 +287,4 @@ enum scic_phy_counter_id { | |||
287 | SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR | 287 | SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR |
288 | }; | 288 | }; |
289 | 289 | ||
290 | |||
291 | /** | ||
292 | * scic_sas_phy_get_properties() - This method will enable the user to retrieve | ||
293 | * information specific to a SAS phy, such as: the received identify address | ||
294 | * frame, received phy capabilities, etc. | ||
295 | * @phy: this parameter specifies the phy for which to retrieve properties. | ||
296 | * @properties: This parameter specifies the properties structure into which to | ||
297 | * copy the requested information. | ||
298 | * | ||
299 | * This method returns an indication as to whether the SAS phy properties were | ||
300 | * successfully retrieved. SCI_SUCCESS This value is returned if the SAS | ||
301 | * properties are successfully retrieved. SCI_FAILURE This value is returned if | ||
302 | * the SAS properties are not successfully retrieved (e.g. It's not a SAS Phy). | ||
303 | */ | ||
304 | enum sci_status scic_sas_phy_get_properties( | ||
305 | struct scic_sds_phy *phy, | ||
306 | struct scic_sas_phy_properties *properties); | ||
307 | |||
308 | /** | ||
309 | * scic_sata_phy_get_properties() - This method will enable the user to | ||
310 | * retrieve information specific to a SATA phy, such as: the received | ||
311 | * signature FIS, if a port selector is present, etc. | ||
312 | * @phy: this parameter specifies the phy for which to retrieve properties. | ||
313 | * @properties: This parameter specifies the properties structure into which to | ||
314 | * copy the requested information. | ||
315 | * | ||
316 | * This method returns an indication as to whether the SATA phy properties were | ||
317 | * successfully retrieved. SCI_SUCCESS This value is returned if the SATA | ||
318 | * properties are successfully retrieved. SCI_FAILURE This value is returned if | ||
319 | * the SATA properties are not successfully retrieved (e.g. It's not a SATA | ||
320 | * Phy). | ||
321 | */ | ||
322 | enum sci_status scic_sata_phy_get_properties( | ||
323 | struct scic_sds_phy *phy, | ||
324 | struct scic_sata_phy_properties *properties); | ||
325 | |||
326 | |||
327 | |||
328 | |||
329 | |||
330 | |||
331 | |||
332 | #endif /* _SCIC_PHY_H_ */ | 290 | #endif /* _SCIC_PHY_H_ */ |
333 | |||
diff --git a/drivers/scsi/isci/core/scic_sds_phy.c b/drivers/scsi/isci/core/scic_sds_phy.c index bd2b30587703..4afdb422ab98 100644 --- a/drivers/scsi/isci/core/scic_sds_phy.c +++ b/drivers/scsi/isci/core/scic_sds_phy.c | |||
@@ -436,8 +436,9 @@ void scic_sds_phy_get_attached_sas_address(struct scic_sds_phy *sci_phy, | |||
436 | struct sci_sas_address *sas_address) | 436 | struct sci_sas_address *sas_address) |
437 | { | 437 | { |
438 | struct sas_identify_frame *iaf; | 438 | struct sas_identify_frame *iaf; |
439 | struct isci_phy *iphy = sci_phy->iphy; | ||
439 | 440 | ||
440 | iaf = &sci_phy->phy_type.sas_id_frame; | 441 | iaf = &iphy->frame_rcvd.iaf; |
441 | memcpy(sas_address, iaf->sas_addr, SAS_ADDR_SIZE); | 442 | memcpy(sas_address, iaf->sas_addr, SAS_ADDR_SIZE); |
442 | } | 443 | } |
443 | 444 | ||
@@ -458,13 +459,13 @@ void scic_sds_phy_get_attached_phy_protocols( | |||
458 | protocols->u.all = 0; | 459 | protocols->u.all = 0; |
459 | 460 | ||
460 | if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) { | 461 | if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) { |
462 | struct isci_phy *iphy = sci_phy->iphy; | ||
461 | struct sas_identify_frame *iaf; | 463 | struct sas_identify_frame *iaf; |
462 | 464 | ||
463 | iaf = &sci_phy->phy_type.sas_id_frame; | 465 | iaf = &iphy->frame_rcvd.iaf; |
464 | memcpy(&protocols->u.all, &iaf->initiator_bits, 2); | 466 | memcpy(&protocols->u.all, &iaf->initiator_bits, 2); |
465 | } else if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) { | 467 | } else if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) |
466 | protocols->u.bits.stp_target = 1; | 468 | protocols->u.bits.stp_target = 1; |
467 | } | ||
468 | } | 469 | } |
469 | 470 | ||
470 | /* | 471 | /* |
@@ -551,49 +552,6 @@ enum sci_status scic_sds_phy_consume_power_handler( | |||
551 | 552 | ||
552 | /* | 553 | /* |
553 | * ***************************************************************************** | 554 | * ***************************************************************************** |
554 | * * SCIC PHY Public Methods | ||
555 | * ***************************************************************************** */ | ||
556 | |||
557 | |||
558 | enum sci_status scic_sas_phy_get_properties( | ||
559 | struct scic_sds_phy *sci_phy, | ||
560 | struct scic_sas_phy_properties *properties) | ||
561 | { | ||
562 | if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) { | ||
563 | memcpy(&properties->rcvd_iaf, | ||
564 | &sci_phy->phy_type.sas_id_frame, | ||
565 | sizeof(struct sas_identify_frame)); | ||
566 | |||
567 | properties->rcvd_cap.all = | ||
568 | readl(&sci_phy->link_layer_registers->receive_phycap); | ||
569 | |||
570 | return SCI_SUCCESS; | ||
571 | } | ||
572 | |||
573 | return SCI_FAILURE; | ||
574 | } | ||
575 | |||
576 | |||
577 | enum sci_status scic_sata_phy_get_properties( | ||
578 | struct scic_sds_phy *sci_phy, | ||
579 | struct scic_sata_phy_properties *properties) | ||
580 | { | ||
581 | if (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) { | ||
582 | memcpy(&properties->signature_fis, | ||
583 | &sci_phy->phy_type.sata_sig_fis, | ||
584 | sizeof(struct dev_to_host_fis)); | ||
585 | |||
586 | /* / @todo add support for port selectors. */ | ||
587 | properties->is_port_selector_present = false; | ||
588 | |||
589 | return SCI_SUCCESS; | ||
590 | } | ||
591 | |||
592 | return SCI_FAILURE; | ||
593 | } | ||
594 | |||
595 | /* | ||
596 | * ***************************************************************************** | ||
597 | * * SCIC SDS PHY HELPER FUNCTIONS | 555 | * * SCIC SDS PHY HELPER FUNCTIONS |
598 | * ***************************************************************************** */ | 556 | * ***************************************************************************** */ |
599 | 557 | ||
@@ -1163,6 +1121,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_iaf_uf_frame_handler | |||
1163 | enum sci_status result; | 1121 | enum sci_status result; |
1164 | u32 *frame_words; | 1122 | u32 *frame_words; |
1165 | struct sas_identify_frame *identify_frame; | 1123 | struct sas_identify_frame *identify_frame; |
1124 | struct isci_phy *iphy = sci_phy->iphy; | ||
1166 | 1125 | ||
1167 | result = scic_sds_unsolicited_frame_control_get_header( | 1126 | result = scic_sds_unsolicited_frame_control_get_header( |
1168 | &(scic_sds_phy_get_controller(sci_phy)->uf_control), | 1127 | &(scic_sds_phy_get_controller(sci_phy)->uf_control), |
@@ -1188,9 +1147,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_iaf_uf_frame_handler | |||
1188 | frame_words[4] = SCIC_SWAP_DWORD(frame_words[4]); | 1147 | frame_words[4] = SCIC_SWAP_DWORD(frame_words[4]); |
1189 | frame_words[5] = SCIC_SWAP_DWORD(frame_words[5]); | 1148 | frame_words[5] = SCIC_SWAP_DWORD(frame_words[5]); |
1190 | 1149 | ||
1191 | memcpy(&sci_phy->phy_type.sas_id_frame, | 1150 | memcpy(&iphy->frame_rcvd.iaf, identify_frame, sizeof(*identify_frame)); |
1192 | identify_frame, | ||
1193 | sizeof(struct sas_identify_frame)); | ||
1194 | 1151 | ||
1195 | if (identify_frame->smp_tport) { | 1152 | if (identify_frame->smp_tport) { |
1196 | /* We got the IAF for an expander PHY go to the final state since | 1153 | /* We got the IAF for an expander PHY go to the final state since |
@@ -1239,6 +1196,7 @@ static enum sci_status scic_sds_phy_starting_substate_await_sig_fis_frame_handle | |||
1239 | enum sci_status result; | 1196 | enum sci_status result; |
1240 | struct dev_to_host_fis *frame_header; | 1197 | struct dev_to_host_fis *frame_header; |
1241 | u32 *fis_frame_data; | 1198 | u32 *fis_frame_data; |
1199 | struct isci_phy *iphy = sci_phy->iphy; | ||
1242 | 1200 | ||
1243 | result = scic_sds_unsolicited_frame_control_get_header( | 1201 | result = scic_sds_unsolicited_frame_control_get_header( |
1244 | &(scic_sds_phy_get_controller(sci_phy)->uf_control), | 1202 | &(scic_sds_phy_get_controller(sci_phy)->uf_control), |
@@ -1255,10 +1213,9 @@ static enum sci_status scic_sds_phy_starting_substate_await_sig_fis_frame_handle | |||
1255 | frame_index, | 1213 | frame_index, |
1256 | (void **)&fis_frame_data); | 1214 | (void **)&fis_frame_data); |
1257 | 1215 | ||
1258 | scic_sds_controller_copy_sata_response( | 1216 | scic_sds_controller_copy_sata_response(&iphy->frame_rcvd.fis, |
1259 | &sci_phy->phy_type.sata_sig_fis, | 1217 | frame_header, |
1260 | frame_header, | 1218 | fis_frame_data); |
1261 | fis_frame_data); | ||
1262 | 1219 | ||
1263 | /* got IAF we can now go to the await spinup semaphore state */ | 1220 | /* got IAF we can now go to the await spinup semaphore state */ |
1264 | sci_base_state_machine_change_state(&sci_phy->starting_substate_machine, | 1221 | sci_base_state_machine_change_state(&sci_phy->starting_substate_machine, |
@@ -2330,7 +2287,6 @@ static const struct sci_base_state scic_sds_phy_state_table[] = { | |||
2330 | void scic_sds_phy_construct(struct scic_sds_phy *sci_phy, | 2287 | void scic_sds_phy_construct(struct scic_sds_phy *sci_phy, |
2331 | struct scic_sds_port *owning_port, u8 phy_index) | 2288 | struct scic_sds_port *owning_port, u8 phy_index) |
2332 | { | 2289 | { |
2333 | |||
2334 | sci_base_state_machine_construct(&sci_phy->state_machine, | 2290 | sci_base_state_machine_construct(&sci_phy->state_machine, |
2335 | sci_phy, | 2291 | sci_phy, |
2336 | scic_sds_phy_state_table, | 2292 | scic_sds_phy_state_table, |
@@ -2347,9 +2303,6 @@ void scic_sds_phy_construct(struct scic_sds_phy *sci_phy, | |||
2347 | sci_phy->max_negotiated_speed = SAS_LINK_RATE_UNKNOWN; | 2303 | sci_phy->max_negotiated_speed = SAS_LINK_RATE_UNKNOWN; |
2348 | sci_phy->sata_timeout_timer = NULL; | 2304 | sci_phy->sata_timeout_timer = NULL; |
2349 | 2305 | ||
2350 | /* Clear out the identification buffer data */ | ||
2351 | memset(&sci_phy->phy_type, 0, sizeof(sci_phy->phy_type)); | ||
2352 | |||
2353 | /* Initialize the the substate machines */ | 2306 | /* Initialize the the substate machines */ |
2354 | sci_base_state_machine_construct(&sci_phy->starting_substate_machine, | 2307 | sci_base_state_machine_construct(&sci_phy->starting_substate_machine, |
2355 | sci_phy, | 2308 | sci_phy, |
diff --git a/drivers/scsi/isci/core/scic_sds_phy.h b/drivers/scsi/isci/core/scic_sds_phy.h index 47b2194574a0..e91f28316c00 100644 --- a/drivers/scsi/isci/core/scic_sds_phy.h +++ b/drivers/scsi/isci/core/scic_sds_phy.h | |||
@@ -272,11 +272,6 @@ struct scic_sds_phy { | |||
272 | */ | 272 | */ |
273 | bool is_in_link_training; | 273 | bool is_in_link_training; |
274 | 274 | ||
275 | union { | ||
276 | struct sas_identify_frame sas_id_frame; | ||
277 | struct dev_to_host_fis sata_sig_fis; | ||
278 | } phy_type; | ||
279 | |||
280 | /** | 275 | /** |
281 | * This field contains a reference to the timer utilized in detecting | 276 | * This field contains a reference to the timer utilized in detecting |
282 | * when a signature FIS timeout has occurred. The signature FIS is the | 277 | * when a signature FIS timeout has occurred. The signature FIS is the |
diff --git a/drivers/scsi/isci/phy.h b/drivers/scsi/isci/phy.h index 3100fd87c788..d4c4975546e3 100644 --- a/drivers/scsi/isci/phy.h +++ b/drivers/scsi/isci/phy.h | |||
@@ -71,11 +71,8 @@ | |||
71 | */ | 71 | */ |
72 | 72 | ||
73 | struct isci_phy { | 73 | struct isci_phy { |
74 | |||
75 | struct scic_sds_phy *sci_phy_handle; | 74 | struct scic_sds_phy *sci_phy_handle; |
76 | |||
77 | struct asd_sas_phy sas_phy; | 75 | struct asd_sas_phy sas_phy; |
78 | struct sas_identify_frame *frame; | ||
79 | struct isci_port *isci_port; | 76 | struct isci_port *isci_port; |
80 | u8 sas_addr[SAS_ADDR_SIZE]; | 77 | u8 sas_addr[SAS_ADDR_SIZE]; |
81 | 78 | ||
diff --git a/drivers/scsi/isci/port.c b/drivers/scsi/isci/port.c index 0a1577327d61..96a2002dadea 100644 --- a/drivers/scsi/isci/port.c +++ b/drivers/scsi/isci/port.c | |||
@@ -171,7 +171,6 @@ void isci_port_link_up( | |||
171 | struct scic_port_properties properties; | 171 | struct scic_port_properties properties; |
172 | struct isci_phy *isci_phy = phy->iphy; | 172 | struct isci_phy *isci_phy = phy->iphy; |
173 | struct isci_port *isci_port = port->iport; | 173 | struct isci_port *isci_port = port->iport; |
174 | enum sci_status call_status; | ||
175 | unsigned long success = true; | 174 | unsigned long success = true; |
176 | 175 | ||
177 | BUG_ON(isci_phy->isci_port != NULL); | 176 | BUG_ON(isci_phy->isci_port != NULL); |
@@ -191,21 +190,7 @@ void isci_port_link_up( | |||
191 | if (properties.remote.protocols.u.bits.stp_target) { | 190 | if (properties.remote.protocols.u.bits.stp_target) { |
192 | u64 attached_sas_address; | 191 | u64 attached_sas_address; |
193 | 192 | ||
194 | struct scic_sata_phy_properties sata_phy_properties; | ||
195 | |||
196 | isci_phy->sas_phy.oob_mode = SATA_OOB_MODE; | 193 | isci_phy->sas_phy.oob_mode = SATA_OOB_MODE; |
197 | |||
198 | /* Get a copy of the signature fis for libsas */ | ||
199 | call_status = scic_sata_phy_get_properties(phy, | ||
200 | &sata_phy_properties); | ||
201 | |||
202 | /* | ||
203 | * XXX I am concerned about this "assert". shouldn't we | ||
204 | * handle the return appropriately? | ||
205 | */ | ||
206 | BUG_ON(call_status != SCI_SUCCESS); | ||
207 | |||
208 | isci_phy->frame_rcvd.fis = sata_phy_properties.signature_fis; | ||
209 | isci_phy->sas_phy.frame_rcvd_size = sizeof(struct dev_to_host_fis); | 194 | isci_phy->sas_phy.frame_rcvd_size = sizeof(struct dev_to_host_fis); |
210 | 195 | ||
211 | /* | 196 | /* |
@@ -225,24 +210,12 @@ void isci_port_link_up( | |||
225 | 210 | ||
226 | } else if (properties.remote.protocols.u.bits.ssp_target || | 211 | } else if (properties.remote.protocols.u.bits.ssp_target || |
227 | properties.remote.protocols.u.bits.smp_target) { | 212 | properties.remote.protocols.u.bits.smp_target) { |
228 | |||
229 | struct scic_sas_phy_properties sas_phy_properties; | ||
230 | |||
231 | isci_phy->sas_phy.oob_mode = SAS_OOB_MODE; | 213 | isci_phy->sas_phy.oob_mode = SAS_OOB_MODE; |
232 | |||
233 | /* Get a copy of the identify address frame for libsas */ | ||
234 | call_status = scic_sas_phy_get_properties(phy, | ||
235 | &sas_phy_properties); | ||
236 | |||
237 | BUG_ON(call_status != SCI_SUCCESS); | ||
238 | |||
239 | isci_phy->frame_rcvd.iaf = sas_phy_properties.rcvd_iaf; | ||
240 | isci_phy->sas_phy.frame_rcvd_size = sizeof(struct sas_identify_frame); | 214 | isci_phy->sas_phy.frame_rcvd_size = sizeof(struct sas_identify_frame); |
241 | 215 | ||
242 | /* Copy the attached SAS address from the IAF */ | 216 | /* Copy the attached SAS address from the IAF */ |
243 | memcpy(isci_phy->sas_phy.attached_sas_addr, | 217 | memcpy(isci_phy->sas_phy.attached_sas_addr, |
244 | isci_phy->frame_rcvd.iaf.sas_addr, SAS_ADDR_SIZE); | 218 | isci_phy->frame_rcvd.iaf.sas_addr, SAS_ADDR_SIZE); |
245 | |||
246 | } else { | 219 | } else { |
247 | dev_err(&isci_host->pdev->dev, "%s: unkown target\n", __func__); | 220 | dev_err(&isci_host->pdev->dev, "%s: unkown target\n", __func__); |
248 | success = false; | 221 | success = false; |