Lines Matching refs:iphy

75 enum sas_linkrate sci_phy_linkrate(struct isci_phy *iphy)
77 return iphy->max_negotiated_speed;
80 static struct isci_host *phy_to_host(struct isci_phy *iphy)
82 struct isci_phy *table = iphy - iphy->phy_index;
88 static struct device *sciphy_to_dev(struct isci_phy *iphy)
90 return &phy_to_host(iphy)->pdev->dev;
94 sci_phy_transport_layer_initialization(struct isci_phy *iphy,
99 iphy->transport_layer_registers = reg;
102 &iphy->transport_layer_registers->stp_rni);
108 tl_control = readl(&iphy->transport_layer_registers->control);
110 writel(tl_control, &iphy->transport_layer_registers->control);
116 sci_phy_link_layer_initialization(struct isci_phy *iphy,
119 struct isci_host *ihost = iphy->owning_port->owning_controller;
122 int phy_idx = iphy->phy_index;
133 iphy->link_layer_registers = llr;
313 sci_change_state(&iphy->sm, SCI_PHY_STOPPED);
321 struct isci_phy *iphy = container_of(tmr, typeof(*iphy), sata_timer);
322 struct isci_host *ihost = iphy->owning_port->owning_controller;
330 dev_dbg(sciphy_to_dev(iphy),
334 iphy);
336 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
353 struct isci_port *phy_get_non_dummy_port(struct isci_phy *iphy)
355 struct isci_port *iport = iphy->owning_port;
360 return iphy->owning_port;
365 * @out]: iphy This parameter specifies the phy for which to assign a port
371 struct isci_phy *iphy,
374 iphy->owning_port = iport;
376 if (iphy->bcn_received_while_port_unassigned) {
377 iphy->bcn_received_while_port_unassigned = false;
378 sci_port_broadcast_change_received(iphy->owning_port, iphy);
382 enum sci_status sci_phy_initialize(struct isci_phy *iphy,
387 sci_phy_transport_layer_initialization(iphy, tl);
390 sci_phy_link_layer_initialization(iphy, ll);
395 sci_change_state(&iphy->sm, SCI_PHY_STOPPED);
403 * @iphy The phy for which the direct attached device id is to
409 void sci_phy_setup_transport(struct isci_phy *iphy, u32 device_id)
413 writel(device_id, &iphy->transport_layer_registers->stp_rni);
419 tl_control = readl(&iphy->transport_layer_registers->control);
421 writel(tl_control, &iphy->transport_layer_registers->control);
424 static void sci_phy_suspend(struct isci_phy *iphy)
429 readl(&iphy->link_layer_registers->phy_configuration);
432 &iphy->link_layer_registers->phy_configuration);
434 sci_phy_setup_transport(iphy, SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX);
437 void sci_phy_resume(struct isci_phy *iphy)
442 readl(&iphy->link_layer_registers->phy_configuration);
445 &iphy->link_layer_registers->phy_configuration);
448 void sci_phy_get_sas_address(struct isci_phy *iphy, struct sci_sas_address *sas)
450 sas->high = readl(&iphy->link_layer_registers->source_sas_address_high);
451 sas->low = readl(&iphy->link_layer_registers->source_sas_address_low);
454 void sci_phy_get_attached_sas_address(struct isci_phy *iphy, struct sci_sas_address *sas)
458 iaf = &iphy->frame_rcvd.iaf;
462 void sci_phy_get_protocols(struct isci_phy *iphy, struct sci_phy_proto *proto)
464 proto->all = readl(&iphy->link_layer_registers->transmit_identification);
467 enum sci_status sci_phy_start(struct isci_phy *iphy)
469 enum sci_phy_states state = iphy->sm.current_state_id;
472 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
477 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
481 enum sci_status sci_phy_stop(struct isci_phy *iphy)
483 enum sci_phy_states state = iphy->sm.current_state_id;
498 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
503 sci_change_state(&iphy->sm, SCI_PHY_STOPPED);
507 enum sci_status sci_phy_reset(struct isci_phy *iphy)
509 enum sci_phy_states state = iphy->sm.current_state_id;
512 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
517 sci_change_state(&iphy->sm, SCI_PHY_RESETTING);
521 enum sci_status sci_phy_consume_power_handler(struct isci_phy *iphy)
523 enum sci_phy_states state = iphy->sm.current_state_id;
529 enable_spinup = readl(&iphy->link_layer_registers->notify_enable_spinup_control);
531 writel(enable_spinup, &iphy->link_layer_registers->notify_enable_spinup_control);
534 sci_change_state(&iphy->sm, SCI_PHY_SUB_FINAL);
543 readl(&iphy->link_layer_registers->phy_configuration);
548 &iphy->link_layer_registers->phy_configuration);
554 &iphy->link_layer_registers->phy_configuration);
557 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_PHY_EN);
562 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
568 static void sci_phy_start_sas_link_training(struct isci_phy *iphy)
576 phy_control = readl(&iphy->link_layer_registers->phy_configuration);
579 &iphy->link_layer_registers->phy_configuration);
581 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SAS_SPEED_EN);
583 iphy->protocol = SAS_PROTOCOL_SSP;
586 static void sci_phy_start_sata_link_training(struct isci_phy *iphy)
592 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_POWER);
594 iphy->protocol = SAS_PROTOCOL_SATA;
608 static void sci_phy_complete_link_training(struct isci_phy *iphy,
612 iphy->max_negotiated_speed = max_link_rate;
614 sci_change_state(&iphy->sm, next_state);
661 #define phy_event_dbg(iphy, state, code) \
662 dev_dbg(sciphy_to_dev(iphy), "phy-%d:%d: %s event: %s (%x)\n", \
663 phy_to_host(iphy)->id, iphy->phy_index, \
666 #define phy_event_warn(iphy, state, code) \
667 dev_warn(sciphy_to_dev(iphy), "phy-%d:%d: %s event: %s (%x)\n", \
668 phy_to_host(iphy)->id, iphy->phy_index, \
672 static void scu_link_layer_set_txcomsas_timeout(struct isci_phy *iphy, u32 timeout)
677 val = readl(&iphy->link_layer_registers->transmit_comsas_signal);
681 writel(val, &iphy->link_layer_registers->transmit_comsas_signal);
684 enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
686 enum sci_phy_states state = iphy->sm.current_state_id;
692 sci_phy_start_sas_link_training(iphy);
693 iphy->is_in_link_training = true;
696 sci_phy_start_sata_link_training(iphy);
697 iphy->is_in_link_training = true;
701 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_EXTENDED);
704 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
707 phy_event_dbg(iphy, state, event_code);
720 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_1_5_GBPS,
725 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_3_0_GBPS,
730 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_6_0_GBPS,
737 sci_phy_start_sata_link_training(iphy);
741 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
744 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
748 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_EXTENDED);
751 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
754 phy_event_warn(iphy, state, event_code);
763 sci_phy_start_sas_link_training(iphy);
770 sci_phy_start_sata_link_training(iphy);
774 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_EXTENDED);
777 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
780 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
784 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
787 phy_event_warn(iphy, state, event_code);
795 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
798 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
801 phy_event_warn(iphy, state, event_code);
809 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
812 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
824 sci_phy_start_sas_link_training(iphy);
828 phy_event_warn(iphy, state, event_code);
836 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
839 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
847 iphy->protocol = SAS_PROTOCOL_SATA;
850 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_SPEED_EN);
856 sci_phy_start_sas_link_training(iphy);
859 phy_event_warn(iphy, state, event_code);
872 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_1_5_GBPS,
877 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_3_0_GBPS,
882 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_6_0_GBPS,
887 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
890 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
896 sci_phy_start_sas_link_training(iphy);
899 phy_event_warn(iphy, state, event_code);
908 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_SPEED_EN);
913 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
916 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
920 phy_event_warn(iphy, state, event_code);
928 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
931 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
940 if (phy_get_non_dummy_port(iphy) != NULL)
941 sci_port_broadcast_change_received(iphy->owning_port, iphy);
943 iphy->bcn_received_while_port_unassigned = true;
948 phy_event_warn(iphy, state, event_code);
956 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
959 phy_event_warn(iphy, state, event_code);
965 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
971 enum sci_status sci_phy_frame_handler(struct isci_phy *iphy, u32 frame_index)
973 enum sci_phy_states state = iphy->sm.current_state_id;
974 struct isci_host *ihost = iphy->owning_port->owning_controller;
994 spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
995 memcpy(&iphy->frame_rcvd.iaf, &iaf, sizeof(iaf));
996 spin_unlock_irqrestore(&iphy->sas_phy.frame_rcvd_lock, flags);
1009 sci_change_state(&iphy->sm, state);
1012 dev_warn(sciphy_to_dev(iphy),
1037 spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
1038 sci_controller_copy_sata_response(&iphy->frame_rcvd.fis,
1041 spin_unlock_irqrestore(&iphy->sas_phy.frame_rcvd_lock, flags);
1044 sci_change_state(&iphy->sm, SCI_PHY_SUB_FINAL);
1048 dev_warn(sciphy_to_dev(iphy),
1059 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
1068 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1071 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_OSSP_EN);
1076 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1077 struct isci_host *ihost = iphy->owning_port->owning_controller;
1079 sci_controller_power_control_queue_insert(ihost, iphy);
1084 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1085 struct isci_host *ihost = iphy->owning_port->owning_controller;
1087 sci_controller_power_control_queue_remove(ihost, iphy);
1092 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1093 struct isci_host *ihost = iphy->owning_port->owning_controller;
1095 sci_controller_power_control_queue_insert(ihost, iphy);
1100 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1101 struct isci_host *ihost = iphy->owning_port->owning_controller;
1103 sci_controller_power_control_queue_remove(ihost, iphy);
1108 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1110 sci_mod_timer(&iphy->sata_timer, SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT);
1115 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1117 sci_del_timer(&iphy->sata_timer);
1122 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1124 sci_mod_timer(&iphy->sata_timer, SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT);
1129 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1131 sci_del_timer(&iphy->sata_timer);
1136 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1138 if (sci_port_link_detected(iphy->owning_port, iphy)) {
1146 sci_phy_resume(iphy);
1148 sci_mod_timer(&iphy->sata_timer,
1151 iphy->is_in_link_training = false;
1156 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1158 sci_del_timer(&iphy->sata_timer);
1163 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1168 sci_change_state(&iphy->sm, SCI_PHY_READY);
1180 struct isci_phy *iphy)
1187 readl(&iphy->link_layer_registers->phy_configuration);
1193 &iphy->link_layer_registers->phy_configuration);
1196 enable_spinup_value = readl(&iphy->link_layer_registers->notify_enable_spinup_control);
1198 writel(enable_spinup_value, &iphy->link_layer_registers->notify_enable_spinup_control);
1201 static void scu_link_layer_start_oob(struct isci_phy *iphy)
1203 struct scu_link_layer_registers __iomem *ll = iphy->link_layer_registers;
1232 struct isci_phy *iphy)
1240 readl(&iphy->link_layer_registers->phy_configuration);
1246 &iphy->link_layer_registers->phy_configuration);
1252 &iphy->link_layer_registers->phy_configuration);
1257 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1258 struct isci_port *iport = iphy->owning_port;
1265 sci_del_timer(&iphy->sata_timer);
1267 scu_link_layer_stop_protocol_engine(iphy);
1269 if (iphy->sm.previous_state_id != SCI_PHY_INITIAL)
1270 sci_controller_link_down(ihost, phy_get_non_dummy_port(iphy), iphy);
1275 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1276 struct isci_port *iport = iphy->owning_port;
1279 scu_link_layer_stop_protocol_engine(iphy);
1280 scu_link_layer_start_oob(iphy);
1283 iphy->protocol = SAS_PROTOCOL_NONE;
1284 iphy->bcn_received_while_port_unassigned = false;
1286 if (iphy->sm.previous_state_id == SCI_PHY_READY)
1287 sci_controller_link_down(ihost, phy_get_non_dummy_port(iphy), iphy);
1289 sci_change_state(&iphy->sm, SCI_PHY_SUB_INITIAL);
1294 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1295 struct isci_port *iport = iphy->owning_port;
1298 sci_controller_link_up(ihost, phy_get_non_dummy_port(iphy), iphy);
1303 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1305 sci_phy_suspend(iphy);
1310 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1316 sci_port_deactivate_phy(iphy->owning_port, iphy, false);
1318 if (iphy->protocol == SAS_PROTOCOL_SSP) {
1319 scu_link_layer_tx_hard_reset(iphy);
1324 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
1375 void sci_phy_construct(struct isci_phy *iphy,
1378 sci_init_sm(&iphy->sm, sci_phy_state_table, SCI_PHY_INITIAL);
1381 iphy->owning_port = iport;
1382 iphy->phy_index = phy_index;
1383 iphy->bcn_received_while_port_unassigned = false;
1384 iphy->protocol = SAS_PROTOCOL_NONE;
1385 iphy->link_layer_registers = NULL;
1386 iphy->max_negotiated_speed = SAS_LINK_RATE_UNKNOWN;
1389 sci_init_timer(&iphy->sata_timer, phy_sata_timeout);
1392 void isci_phy_init(struct isci_phy *iphy, struct isci_host *ihost, int index)
1402 memcpy(iphy->sas_addr, &sas_addr, sizeof(sas_addr));
1404 iphy->sas_phy.enabled = 0;
1405 iphy->sas_phy.id = index;
1406 iphy->sas_phy.sas_addr = &iphy->sas_addr[0];
1407 iphy->sas_phy.frame_rcvd = (u8 *)&iphy->frame_rcvd;
1408 iphy->sas_phy.ha = &ihost->sas_ha;
1409 iphy->sas_phy.lldd_phy = iphy;
1410 iphy->sas_phy.enabled = 1;
1411 iphy->sas_phy.class = SAS;
1412 iphy->sas_phy.iproto = SAS_PROTOCOL_ALL;
1413 iphy->sas_phy.tproto = 0;
1414 iphy->sas_phy.type = PHY_TYPE_PHYSICAL;
1415 iphy->sas_phy.role = PHY_ROLE_INITIATOR;
1416 iphy->sas_phy.oob_mode = OOB_NOT_CONNECTED;
1417 iphy->sas_phy.linkrate = SAS_LINK_RATE_UNKNOWN;
1418 memset(&iphy->frame_rcvd, 0, sizeof(iphy->frame_rcvd));
1436 struct isci_phy *iphy = sas_phy->lldd_phy;
1443 __func__, sas_phy, func, buf, iphy, port);
1448 scu_link_layer_start_oob(iphy);
1449 sci_phy_stop(iphy);
1455 scu_link_layer_start_oob(iphy);
1456 sci_phy_stop(iphy);
1457 sci_phy_start(iphy);
1465 ret = isci_port_perform_hard_reset(ihost, port->lldd_port, iphy);
1472 r = iphy->link_layer_registers;