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);
346 * @iphy: This parameter specifies the phy for which to retrieve the
354 struct isci_port *phy_get_non_dummy_port(struct isci_phy *iphy)
356 struct isci_port *iport = iphy->owning_port;
361 return iphy->owning_port;
368 struct isci_phy *iphy,
371 iphy->owning_port = iport;
373 if (iphy->bcn_received_while_port_unassigned) {
374 iphy->bcn_received_while_port_unassigned = false;
375 sci_port_broadcast_change_received(iphy->owning_port, iphy);
379 enum sci_status sci_phy_initialize(struct isci_phy *iphy,
384 sci_phy_transport_layer_initialization(iphy, tl);
387 sci_phy_link_layer_initialization(iphy, ll);
392 sci_change_state(&iphy->sm, SCI_PHY_STOPPED);
400 * @iphy: The phy for which the direct attached device id is to
406 void sci_phy_setup_transport(struct isci_phy *iphy, u32 device_id)
410 writel(device_id, &iphy->transport_layer_registers->stp_rni);
416 tl_control = readl(&iphy->transport_layer_registers->control);
418 writel(tl_control, &iphy->transport_layer_registers->control);
421 static void sci_phy_suspend(struct isci_phy *iphy)
426 readl(&iphy->link_layer_registers->phy_configuration);
429 &iphy->link_layer_registers->phy_configuration);
431 sci_phy_setup_transport(iphy, SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX);
434 void sci_phy_resume(struct isci_phy *iphy)
439 readl(&iphy->link_layer_registers->phy_configuration);
442 &iphy->link_layer_registers->phy_configuration);
445 void sci_phy_get_sas_address(struct isci_phy *iphy, struct sci_sas_address *sas)
447 sas->high = readl(&iphy->link_layer_registers->source_sas_address_high);
448 sas->low = readl(&iphy->link_layer_registers->source_sas_address_low);
451 void sci_phy_get_attached_sas_address(struct isci_phy *iphy, struct sci_sas_address *sas)
455 iaf = &iphy->frame_rcvd.iaf;
459 void sci_phy_get_protocols(struct isci_phy *iphy, struct sci_phy_proto *proto)
461 proto->all = readl(&iphy->link_layer_registers->transmit_identification);
464 enum sci_status sci_phy_start(struct isci_phy *iphy)
466 enum sci_phy_states state = iphy->sm.current_state_id;
469 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
474 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
478 enum sci_status sci_phy_stop(struct isci_phy *iphy)
480 enum sci_phy_states state = iphy->sm.current_state_id;
495 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
500 sci_change_state(&iphy->sm, SCI_PHY_STOPPED);
504 enum sci_status sci_phy_reset(struct isci_phy *iphy)
506 enum sci_phy_states state = iphy->sm.current_state_id;
509 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
514 sci_change_state(&iphy->sm, SCI_PHY_RESETTING);
518 enum sci_status sci_phy_consume_power_handler(struct isci_phy *iphy)
520 enum sci_phy_states state = iphy->sm.current_state_id;
526 enable_spinup = readl(&iphy->link_layer_registers->notify_enable_spinup_control);
528 writel(enable_spinup, &iphy->link_layer_registers->notify_enable_spinup_control);
531 sci_change_state(&iphy->sm, SCI_PHY_SUB_FINAL);
540 readl(&iphy->link_layer_registers->phy_configuration);
545 &iphy->link_layer_registers->phy_configuration);
551 &iphy->link_layer_registers->phy_configuration);
554 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_PHY_EN);
559 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
565 static void sci_phy_start_sas_link_training(struct isci_phy *iphy)
573 phy_control = readl(&iphy->link_layer_registers->phy_configuration);
576 &iphy->link_layer_registers->phy_configuration);
578 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SAS_SPEED_EN);
580 iphy->protocol = SAS_PROTOCOL_SSP;
583 static void sci_phy_start_sata_link_training(struct isci_phy *iphy)
589 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_POWER);
591 iphy->protocol = SAS_PROTOCOL_SATA;
597 * @iphy: This parameter specifies the phy object for which link training
605 static void sci_phy_complete_link_training(struct isci_phy *iphy,
609 iphy->max_negotiated_speed = max_link_rate;
611 sci_change_state(&iphy->sm, next_state);
658 #define phy_event_dbg(iphy, state, code) \
659 dev_dbg(sciphy_to_dev(iphy), "phy-%d:%d: %s event: %s (%x)\n", \
660 phy_to_host(iphy)->id, iphy->phy_index, \
663 #define phy_event_warn(iphy, state, code) \
664 dev_warn(sciphy_to_dev(iphy), "phy-%d:%d: %s event: %s (%x)\n", \
665 phy_to_host(iphy)->id, iphy->phy_index, \
669 static void scu_link_layer_set_txcomsas_timeout(struct isci_phy *iphy, u32 timeout)
674 val = readl(&iphy->link_layer_registers->transmit_comsas_signal);
678 writel(val, &iphy->link_layer_registers->transmit_comsas_signal);
681 enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
683 enum sci_phy_states state = iphy->sm.current_state_id;
689 sci_phy_start_sas_link_training(iphy);
690 iphy->is_in_link_training = true;
693 sci_phy_start_sata_link_training(iphy);
694 iphy->is_in_link_training = true;
698 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_EXTENDED);
701 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
704 phy_event_dbg(iphy, state, event_code);
717 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_1_5_GBPS,
722 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_3_0_GBPS,
727 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_6_0_GBPS,
734 sci_phy_start_sata_link_training(iphy);
738 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
741 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
745 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_EXTENDED);
748 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
751 phy_event_warn(iphy, state, event_code);
759 sci_phy_start_sas_link_training(iphy);
766 sci_phy_start_sata_link_training(iphy);
770 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_EXTENDED);
773 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
776 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
780 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
783 phy_event_warn(iphy, state, event_code);
791 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
794 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
797 phy_event_warn(iphy, state, event_code);
805 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
808 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
820 sci_phy_start_sas_link_training(iphy);
824 phy_event_warn(iphy, state, event_code);
832 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
835 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
843 iphy->protocol = SAS_PROTOCOL_SATA;
846 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_SPEED_EN);
852 sci_phy_start_sas_link_training(iphy);
855 phy_event_warn(iphy, state, event_code);
868 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_1_5_GBPS,
873 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_3_0_GBPS,
878 sci_phy_complete_link_training(iphy, SAS_LINK_RATE_6_0_GBPS,
883 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
886 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
892 sci_phy_start_sas_link_training(iphy);
895 phy_event_warn(iphy, state, event_code);
904 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_SATA_SPEED_EN);
909 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
912 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
916 phy_event_warn(iphy, state, event_code);
924 scu_link_layer_set_txcomsas_timeout(iphy, SCU_SAS_LINK_LAYER_TXCOMSAS_NEGTIME_DEFAULT);
927 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
936 if (phy_get_non_dummy_port(iphy) != NULL)
937 sci_port_broadcast_change_received(iphy->owning_port, iphy);
939 iphy->bcn_received_while_port_unassigned = true;
944 phy_event_warn(iphy, state, event_code);
952 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
955 phy_event_warn(iphy, state, event_code);
960 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
966 enum sci_status sci_phy_frame_handler(struct isci_phy *iphy, u32 frame_index)
968 enum sci_phy_states state = iphy->sm.current_state_id;
969 struct isci_host *ihost = iphy->owning_port->owning_controller;
989 spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
990 memcpy(&iphy->frame_rcvd.iaf, &iaf, sizeof(iaf));
991 spin_unlock_irqrestore(&iphy->sas_phy.frame_rcvd_lock, flags);
1004 sci_change_state(&iphy->sm, state);
1007 dev_warn(sciphy_to_dev(iphy),
1032 spin_lock_irqsave(&iphy->sas_phy.frame_rcvd_lock, flags);
1033 sci_controller_copy_sata_response(&iphy->frame_rcvd.fis,
1036 spin_unlock_irqrestore(&iphy->sas_phy.frame_rcvd_lock, flags);
1039 sci_change_state(&iphy->sm, SCI_PHY_SUB_FINAL);
1043 dev_warn(sciphy_to_dev(iphy),
1054 dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
1063 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1066 sci_change_state(&iphy->sm, SCI_PHY_SUB_AWAIT_OSSP_EN);
1071 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1072 struct isci_host *ihost = iphy->owning_port->owning_controller;
1074 sci_controller_power_control_queue_insert(ihost, iphy);
1079 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1080 struct isci_host *ihost = iphy->owning_port->owning_controller;
1082 sci_controller_power_control_queue_remove(ihost, iphy);
1087 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1088 struct isci_host *ihost = iphy->owning_port->owning_controller;
1090 sci_controller_power_control_queue_insert(ihost, iphy);
1095 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1096 struct isci_host *ihost = iphy->owning_port->owning_controller;
1098 sci_controller_power_control_queue_remove(ihost, iphy);
1103 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1105 sci_mod_timer(&iphy->sata_timer, SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT);
1110 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1112 sci_del_timer(&iphy->sata_timer);
1117 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1119 sci_mod_timer(&iphy->sata_timer, SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT);
1124 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1126 sci_del_timer(&iphy->sata_timer);
1131 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1133 if (sci_port_link_detected(iphy->owning_port, iphy)) {
1141 sci_phy_resume(iphy);
1143 sci_mod_timer(&iphy->sata_timer,
1146 iphy->is_in_link_training = false;
1151 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1153 sci_del_timer(&iphy->sata_timer);
1158 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1163 sci_change_state(&iphy->sm, SCI_PHY_READY);
1168 * @iphy: This is the struct isci_phy object to stop.
1175 struct isci_phy *iphy)
1182 readl(&iphy->link_layer_registers->phy_configuration);
1188 &iphy->link_layer_registers->phy_configuration);
1191 enable_spinup_value = readl(&iphy->link_layer_registers->notify_enable_spinup_control);
1193 writel(enable_spinup_value, &iphy->link_layer_registers->notify_enable_spinup_control);
1196 static void scu_link_layer_start_oob(struct isci_phy *iphy)
1198 struct scu_link_layer_registers __iomem *ll = iphy->link_layer_registers;
1220 * @iphy: This is the struct isci_phy object to stop.
1228 struct isci_phy *iphy)
1236 readl(&iphy->link_layer_registers->phy_configuration);
1242 &iphy->link_layer_registers->phy_configuration);
1248 &iphy->link_layer_registers->phy_configuration);
1253 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1254 struct isci_port *iport = iphy->owning_port;
1261 sci_del_timer(&iphy->sata_timer);
1263 scu_link_layer_stop_protocol_engine(iphy);
1265 if (iphy->sm.previous_state_id != SCI_PHY_INITIAL)
1266 sci_controller_link_down(ihost, phy_get_non_dummy_port(iphy), iphy);
1271 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1272 struct isci_port *iport = iphy->owning_port;
1275 scu_link_layer_stop_protocol_engine(iphy);
1276 scu_link_layer_start_oob(iphy);
1279 iphy->protocol = SAS_PROTOCOL_NONE;
1280 iphy->bcn_received_while_port_unassigned = false;
1282 if (iphy->sm.previous_state_id == SCI_PHY_READY)
1283 sci_controller_link_down(ihost, phy_get_non_dummy_port(iphy), iphy);
1285 sci_change_state(&iphy->sm, SCI_PHY_SUB_INITIAL);
1290 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1291 struct isci_port *iport = iphy->owning_port;
1294 sci_controller_link_up(ihost, phy_get_non_dummy_port(iphy), iphy);
1299 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1301 sci_phy_suspend(iphy);
1306 struct isci_phy *iphy = container_of(sm, typeof(*iphy), sm);
1312 sci_port_deactivate_phy(iphy->owning_port, iphy, false);
1314 if (iphy->protocol == SAS_PROTOCOL_SSP) {
1315 scu_link_layer_tx_hard_reset(iphy);
1320 sci_change_state(&iphy->sm, SCI_PHY_STARTING);
1371 void sci_phy_construct(struct isci_phy *iphy,
1374 sci_init_sm(&iphy->sm, sci_phy_state_table, SCI_PHY_INITIAL);
1377 iphy->owning_port = iport;
1378 iphy->phy_index = phy_index;
1379 iphy->bcn_received_while_port_unassigned = false;
1380 iphy->protocol = SAS_PROTOCOL_NONE;
1381 iphy->link_layer_registers = NULL;
1382 iphy->max_negotiated_speed = SAS_LINK_RATE_UNKNOWN;
1385 sci_init_timer(&iphy->sata_timer, phy_sata_timeout);
1388 void isci_phy_init(struct isci_phy *iphy, struct isci_host *ihost, int index)
1398 memcpy(iphy->sas_addr, &sas_addr, sizeof(sas_addr));
1400 iphy->sas_phy.enabled = 0;
1401 iphy->sas_phy.id = index;
1402 iphy->sas_phy.sas_addr = &iphy->sas_addr[0];
1403 iphy->sas_phy.frame_rcvd = (u8 *)&iphy->frame_rcvd;
1404 iphy->sas_phy.ha = &ihost->sas_ha;
1405 iphy->sas_phy.lldd_phy = iphy;
1406 iphy->sas_phy.enabled = 1;
1407 iphy->sas_phy.iproto = SAS_PROTOCOL_ALL;
1408 iphy->sas_phy.tproto = 0;
1409 iphy->sas_phy.role = PHY_ROLE_INITIATOR;
1410 iphy->sas_phy.oob_mode = OOB_NOT_CONNECTED;
1411 iphy->sas_phy.linkrate = SAS_LINK_RATE_UNKNOWN;
1412 memset(&iphy->frame_rcvd, 0, sizeof(iphy->frame_rcvd));
1430 struct isci_phy *iphy = sas_phy->lldd_phy;
1437 __func__, sas_phy, func, buf, iphy, port);
1442 scu_link_layer_start_oob(iphy);
1443 sci_phy_stop(iphy);
1449 scu_link_layer_start_oob(iphy);
1450 sci_phy_stop(iphy);
1451 sci_phy_start(iphy);
1459 ret = isci_port_perform_hard_reset(ihost, port->lldd_port, iphy);
1466 r = iphy->link_layer_registers;