Lines Matching defs:iport

73 static struct device *sciport_to_dev(struct isci_port *iport)
75 int i = iport->physical_port_index;
82 table = iport - i;
88 static void sci_port_get_protocols(struct isci_port *iport, struct sci_phy_proto *proto)
94 struct isci_phy *iphy = iport->phy_table[index];
102 static u32 sci_port_get_phys(struct isci_port *iport)
109 if (iport->phy_table[index])
118 * @iport: this parameter specifies the port for which to retrieve the physical
128 enum sci_status sci_port_get_properties(struct isci_port *iport,
131 if (!iport || iport->logical_port_index == SCIC_SDS_DUMMY_PORT)
134 prop->index = iport->logical_port_index;
135 prop->phy_mask = sci_port_get_phys(iport);
136 sci_port_get_sas_address(iport, &prop->local.sas_address);
137 sci_port_get_protocols(iport, &prop->local.protocols);
138 sci_port_get_attached_sas_address(iport, &prop->remote.sas_address);
143 static void sci_port_bcn_enable(struct isci_port *iport)
149 for (i = 0; i < ARRAY_SIZE(iport->phy_table); i++) {
150 iphy = iport->phy_table[i];
160 struct isci_port *iport,
169 sci_port_bcn_enable(iport);
173 struct isci_port *iport,
182 __func__, iport);
186 sci_port_get_properties(iport, &properties);
295 static void port_state_machine_change(struct isci_port *iport,
298 struct sci_base_state_machine *sm = &iport->sm;
302 iport->ready_exit = true;
305 iport->ready_exit = false;
363 bool sci_port_is_valid_phy_assignment(struct isci_port *iport, u32 phy_index)
365 struct isci_host *ihost = iport->owning_controller;
372 if ((iport->physical_port_index == 1) && (phy_index != 1))
375 if (iport->physical_port_index == 3 && phy_index != 3)
378 if (iport->physical_port_index == 2 &&
383 if (iport->phy_table[index] && index != phy_index)
399 * @iport: This is the port object for which to determine if the phy mask
411 struct isci_port *iport,
414 if (iport->physical_port_index == 0) {
420 } else if (iport->physical_port_index == 1) {
424 } else if (iport->physical_port_index == 2) {
429 } else if (iport->physical_port_index == 3) {
446 static struct isci_phy *sci_port_get_a_connected_phy(struct isci_port *iport)
455 iphy = iport->phy_table[index];
456 if (iphy && sci_port_active_phy(iport, iphy))
463 static enum sci_status sci_port_set_phy(struct isci_port *iport, struct isci_phy *iphy)
469 if (!iport->phy_table[iphy->phy_index] &&
471 sci_port_is_valid_phy_assignment(iport, iphy->phy_index)) {
475 iport->logical_port_index = iport->physical_port_index;
476 iport->phy_table[iphy->phy_index] = iphy;
477 sci_phy_set_port(iphy, iport);
485 static enum sci_status sci_port_clear_phy(struct isci_port *iport, struct isci_phy *iphy)
488 if (iport->phy_table[iphy->phy_index] == iphy &&
489 phy_get_non_dummy_port(iphy) == iport) {
490 struct isci_host *ihost = iport->owning_controller;
494 iport->phy_table[iphy->phy_index] = NULL;
501 void sci_port_get_sas_address(struct isci_port *iport, struct sci_sas_address *sas)
508 if (iport->phy_table[index])
509 sci_phy_get_sas_address(iport->phy_table[index], sas);
512 void sci_port_get_attached_sas_address(struct isci_port *iport, struct sci_sas_address *sas)
520 iphy = sci_port_get_a_connected_phy(iport);
537 * @iport: logical port on which we need to create the remote node context
544 static void sci_port_construct_dummy_rnc(struct isci_port *iport, u16 rni)
548 rnc = &iport->owning_controller->remote_node_context_table[rni];
557 rnc->ssp.logical_port_index = iport->physical_port_index;
572 static void sci_port_construct_dummy_task(struct isci_port *iport, u16 tag)
574 struct isci_host *ihost = iport->owning_controller;
582 task_context->logical_port_index = iport->physical_port_index;
587 task_context->remote_node_index = iport->reserved_rni;
592 static void sci_port_destroy_dummy_resources(struct isci_port *iport)
594 struct isci_host *ihost = iport->owning_controller;
596 if (iport->reserved_tag != SCI_CONTROLLER_INVALID_IO_TAG)
597 isci_free_tag(ihost, iport->reserved_tag);
599 if (iport->reserved_rni != SCU_DUMMY_INDEX)
601 1, iport->reserved_rni);
603 iport->reserved_rni = SCU_DUMMY_INDEX;
604 iport->reserved_tag = SCI_CONTROLLER_INVALID_IO_TAG;
607 void sci_port_setup_transports(struct isci_port *iport, u32 device_id)
612 if (iport->active_phy_mask & (1 << index))
613 sci_phy_setup_transport(iport->phy_table[index], device_id);
617 static void sci_port_resume_phy(struct isci_port *iport, struct isci_phy *iphy)
620 iport->enabled_phy_mask |= 1 << iphy->phy_index;
623 static void sci_port_activate_phy(struct isci_port *iport,
627 struct isci_host *ihost = iport->owning_controller;
632 iport->active_phy_mask |= 1 << iphy->phy_index;
637 isci_port_link_up(ihost, iport, iphy);
640 void sci_port_deactivate_phy(struct isci_port *iport, struct isci_phy *iphy,
643 struct isci_host *ihost = iport->owning_controller;
645 iport->active_phy_mask &= ~(1 << iphy->phy_index);
646 iport->enabled_phy_mask &= ~(1 << iphy->phy_index);
647 if (!iport->active_phy_mask)
648 iport->last_active_phy = iphy->phy_index;
655 if (iport->owning_controller->oem_parameters.controller.mode_type ==
658 &iport->port_pe_configuration_register[iphy->phy_index]);
661 isci_port_link_down(ihost, iphy, iport);
664 static void sci_port_invalid_link_up(struct isci_port *iport, struct isci_phy *iphy)
666 struct isci_host *ihost = iport->owning_controller;
681 * @iport: sci_port object for which has a phy that has gone link up.
690 static void sci_port_general_link_up_handler(struct isci_port *iport,
697 sci_port_get_attached_sas_address(iport, &port_sas_address);
707 iport->active_phy_mask == 0) {
708 struct sci_base_state_machine *sm = &iport->sm;
710 sci_port_activate_phy(iport, iphy, flags);
712 port_state_machine_change(iport, SCI_PORT_READY);
714 sci_port_invalid_link_up(iport, iphy);
724 * @iport: The port for which the wide port condition is to be checked.
729 static bool sci_port_is_wide(struct isci_port *iport)
735 if (iport->phy_table[index] != NULL) {
749 * @iport: The port associated with the phy object.
758 bool sci_port_link_detected(struct isci_port *iport, struct isci_phy *iphy)
760 if ((iport->logical_port_index != SCIC_SDS_DUMMY_PORT) &&
762 if (sci_port_is_wide(iport)) {
763 sci_port_invalid_link_up(iport, iphy);
766 struct isci_host *ihost = iport->owning_controller;
779 struct isci_port *iport = container_of(tmr, typeof(*iport), timer);
780 struct isci_host *ihost = iport->owning_controller;
789 current_state = iport->sm.current_state_id;
795 port_state_machine_change(iport, SCI_PORT_FAILED);
800 dev_err(sciport_to_dev(iport),
803 iport);
805 dev_dbg(sciport_to_dev(iport),
807 __func__, iport->physical_port_index);
812 dev_err(sciport_to_dev(iport),
814 "in state %d.\n", __func__, iport, current_state);
826 static void sci_port_update_viit_entry(struct isci_port *iport)
830 sci_port_get_sas_address(iport, &sas_address);
833 &iport->viit_registers->initiator_sas_address_hi);
835 &iport->viit_registers->initiator_sas_address_lo);
838 writel(0, &iport->viit_registers->reserved);
843 ((1 << iport->physical_port_index) << SCU_VIIT_ENTRY_LPVIE_SHIFT) |
845 &iport->viit_registers->status);
848 enum sas_linkrate sci_port_get_max_allowed_speed(struct isci_port *iport)
858 iphy = iport->phy_table[index];
859 if (iphy && sci_port_active_phy(iport, iphy) &&
867 static void sci_port_suspend_port_task_scheduler(struct isci_port *iport)
871 pts_control_value = readl(&iport->port_task_scheduler_registers->control);
873 writel(pts_control_value, &iport->port_task_scheduler_registers->control);
878 * @iport: port to post task
885 static void sci_port_post_dummy_request(struct isci_port *iport)
887 struct isci_host *ihost = iport->owning_controller;
888 u16 tag = iport->reserved_tag;
896 iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT |
907 * @iport: The port on which the task must be aborted.
910 static void sci_port_abort_dummy_request(struct isci_port *iport)
912 struct isci_host *ihost = iport->owning_controller;
913 u16 tag = iport->reserved_tag;
921 iport->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT |
929 * @iport: This is the struct isci_port object to resume.
934 sci_port_resume_port_task_scheduler(struct isci_port *iport)
938 pts_control_value = readl(&iport->port_task_scheduler_registers->control);
940 writel(pts_control_value, &iport->port_task_scheduler_registers->control);
945 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
947 sci_port_suspend_port_task_scheduler(iport);
949 iport->not_ready_reason = SCIC_PORT_NOT_READY_NO_ACTIVE_PHYS;
951 if (iport->active_phy_mask != 0) {
953 port_state_machine_change(iport,
961 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
962 sci_port_resume_port_task_scheduler(iport);
968 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
969 struct isci_host *ihost = iport->owning_controller;
972 __func__, iport->physical_port_index);
975 if (iport->phy_table[index]) {
976 writel(iport->physical_port_index,
977 &iport->port_pe_configuration_register[
978 iport->phy_table[index]->phy_index]);
979 if (((iport->active_phy_mask^iport->enabled_phy_mask) & (1 << index)) != 0)
980 sci_port_resume_phy(iport, iport->phy_table[index]);
984 sci_port_update_viit_entry(iport);
990 sci_port_post_dummy_request(iport);
993 static void sci_port_invalidate_dummy_remote_node(struct isci_port *iport)
995 struct isci_host *ihost = iport->owning_controller;
996 u8 phys_index = iport->physical_port_index;
998 u16 rni = iport->reserved_rni;
1028 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1029 struct isci_host *ihost = iport->owning_controller;
1036 sci_port_abort_dummy_request(iport);
1039 __func__, iport->physical_port_index);
1041 if (iport->ready_exit)
1042 sci_port_invalidate_dummy_remote_node(iport);
1047 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1048 struct isci_host *ihost = iport->owning_controller;
1050 if (iport->active_phy_mask == 0) {
1052 __func__, iport->physical_port_index);
1054 port_state_machine_change(iport, SCI_PORT_SUB_WAITING);
1056 port_state_machine_change(iport, SCI_PORT_SUB_OPERATIONAL);
1059 enum sci_status sci_port_start(struct isci_port *iport)
1061 struct isci_host *ihost = iport->owning_controller;
1066 state = iport->sm.current_state_id;
1068 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1073 if (iport->assigned_device_count > 0) {
1082 if (iport->reserved_rni == SCU_DUMMY_INDEX) {
1087 sci_port_construct_dummy_rnc(iport, rni);
1090 iport->reserved_rni = rni;
1093 if (iport->reserved_tag == SCI_CONTROLLER_INVALID_IO_TAG) {
1100 sci_port_construct_dummy_task(iport, tag);
1101 iport->reserved_tag = tag;
1105 phy_mask = sci_port_get_phys(iport);
1112 if (sci_port_is_phy_mask_valid(iport, phy_mask) == true) {
1113 port_state_machine_change(iport,
1122 sci_port_destroy_dummy_resources(iport);
1127 enum sci_status sci_port_stop(struct isci_port *iport)
1131 state = iport->sm.current_state_id;
1139 port_state_machine_change(iport,
1143 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1149 static enum sci_status sci_port_hard_reset(struct isci_port *iport, u32 timeout)
1156 state = iport->sm.current_state_id;
1158 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1165 iphy = iport->phy_table[phy_index];
1166 if (iphy && !sci_port_active_phy(iport, iphy)) {
1183 sci_mod_timer(&iport->timer, timeout);
1184 iport->not_ready_reason = SCIC_PORT_NOT_READY_HARD_RESET_REQUESTED;
1186 port_state_machine_change(iport, SCI_PORT_RESETTING);
1192 * @iport: This parameter specifies the port in which the phy will be added.
1199 enum sci_status sci_port_add_phy(struct isci_port *iport,
1205 sci_port_bcn_enable(iport);
1207 state = iport->sm.current_state_id;
1213 sci_port_get_sas_address(iport, &port_sas_address);
1227 return sci_port_set_phy(iport, iphy);
1231 status = sci_port_set_phy(iport, iphy);
1236 sci_port_general_link_up_handler(iport, iphy, PF_NOTIFY|PF_RESUME);
1237 iport->not_ready_reason = SCIC_PORT_NOT_READY_RECONFIGURING;
1238 port_state_machine_change(iport, SCI_PORT_SUB_CONFIGURING);
1242 status = sci_port_set_phy(iport, iphy);
1246 sci_port_general_link_up_handler(iport, iphy, PF_NOTIFY);
1251 port_state_machine_change(iport,
1255 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1263 * @iport: This parameter specifies the port in which the phy will be added.
1270 enum sci_status sci_port_remove_phy(struct isci_port *iport,
1276 state = iport->sm.current_state_id;
1280 return sci_port_clear_phy(iport, iphy);
1282 status = sci_port_clear_phy(iport, iphy);
1286 sci_port_deactivate_phy(iport, iphy, true);
1287 iport->not_ready_reason = SCIC_PORT_NOT_READY_RECONFIGURING;
1288 port_state_machine_change(iport,
1292 status = sci_port_clear_phy(iport, iphy);
1296 sci_port_deactivate_phy(iport, iphy, true);
1301 port_state_machine_change(iport,
1305 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1311 enum sci_status sci_port_link_up(struct isci_port *iport,
1316 state = iport->sm.current_state_id;
1322 sci_port_activate_phy(iport, iphy, PF_NOTIFY|PF_RESUME);
1324 port_state_machine_change(iport,
1328 sci_port_general_link_up_handler(iport, iphy, PF_NOTIFY|PF_RESUME);
1345 sci_port_general_link_up_handler(iport, iphy, PF_RESUME);
1348 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1354 enum sci_status sci_port_link_down(struct isci_port *iport,
1359 state = iport->sm.current_state_id;
1362 sci_port_deactivate_phy(iport, iphy, true);
1368 if (iport->active_phy_mask == 0)
1369 port_state_machine_change(iport,
1375 sci_port_deactivate_phy(iport, iphy, false);
1378 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1384 enum sci_status sci_port_start_io(struct isci_port *iport,
1390 state = iport->sm.current_state_id;
1395 iport->started_request_count++;
1398 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1404 enum sci_status sci_port_complete_io(struct isci_port *iport,
1410 state = iport->sm.current_state_id;
1413 dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
1417 sci_port_decrement_request_count(iport);
1419 if (iport->started_request_count == 0)
1420 port_state_machine_change(iport,
1428 sci_port_decrement_request_count(iport);
1431 sci_port_decrement_request_count(iport);
1432 if (iport->started_request_count == 0) {
1433 port_state_machine_change(iport,
1441 static void sci_port_enable_port_task_scheduler(struct isci_port *iport)
1446 pts_control_value = readl(&iport->port_task_scheduler_registers->control);
1448 writel(pts_control_value, &iport->port_task_scheduler_registers->control);
1451 static void sci_port_disable_port_task_scheduler(struct isci_port *iport)
1455 pts_control_value = readl(&iport->port_task_scheduler_registers->control);
1458 writel(pts_control_value, &iport->port_task_scheduler_registers->control);
1461 static void sci_port_post_dummy_remote_node(struct isci_port *iport)
1463 struct isci_host *ihost = iport->owning_controller;
1464 u8 phys_index = iport->physical_port_index;
1466 u16 rni = iport->reserved_rni;
1491 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1493 if (iport->sm.previous_state_id == SCI_PORT_STOPPING) {
1498 sci_port_disable_port_task_scheduler(iport);
1504 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1507 sci_port_enable_port_task_scheduler(iport);
1512 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1513 struct isci_host *ihost = iport->owning_controller;
1516 prev_state = iport->sm.previous_state_id;
1518 isci_port_hard_reset_complete(iport, SCI_SUCCESS);
1521 __func__, iport->physical_port_index);
1524 sci_port_post_dummy_remote_node(iport);
1527 port_state_machine_change(iport,
1533 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1535 sci_del_timer(&iport->timer);
1540 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1542 sci_del_timer(&iport->timer);
1544 sci_port_destroy_dummy_resources(iport);
1549 struct isci_port *iport = container_of(sm, typeof(*iport), sm);
1551 isci_port_hard_reset_complete(iport, SCI_FAILURE_TIMEOUT);
1554 void sci_port_set_hang_detection_timeout(struct isci_port *iport, u32 timeout)
1557 u32 phy_mask = iport->active_phy_mask;
1560 ++iport->hang_detect_users;
1561 else if (iport->hang_detect_users > 1)
1562 --iport->hang_detect_users;
1564 iport->hang_detect_users = 0;
1566 if (timeout || (iport->hang_detect_users == 0)) {
1570 &iport->phy_table[phy_index]
1609 void sci_port_construct(struct isci_port *iport, u8 index,
1612 sci_init_sm(&iport->sm, sci_port_state_table, SCI_PORT_STOPPED);
1614 iport->logical_port_index = SCIC_SDS_DUMMY_PORT;
1615 iport->physical_port_index = index;
1616 iport->active_phy_mask = 0;
1617 iport->enabled_phy_mask = 0;
1618 iport->last_active_phy = 0;
1619 iport->ready_exit = false;
1621 iport->owning_controller = ihost;
1623 iport->started_request_count = 0;
1624 iport->assigned_device_count = 0;
1625 iport->hang_detect_users = 0;
1627 iport->reserved_rni = SCU_DUMMY_INDEX;
1628 iport->reserved_tag = SCI_CONTROLLER_INVALID_IO_TAG;
1630 sci_init_timer(&iport->timer, port_timeout);
1632 iport->port_task_scheduler_registers = NULL;
1635 iport->phy_table[index] = NULL;
1638 void sci_port_broadcast_change_received(struct isci_port *iport, struct isci_phy *iphy)
1640 struct isci_host *ihost = iport->owning_controller;
1643 isci_port_bc_change_received(ihost, iport, iphy);
1646 static void wait_port_reset(struct isci_host *ihost, struct isci_port *iport)
1648 wait_event(ihost->eventq, !test_bit(IPORT_RESET_PENDING, &iport->state));
1651 int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport,
1658 dev_dbg(&ihost->pdev->dev, "%s: iport = %p\n",
1659 __func__, iport);
1662 set_bit(IPORT_RESET_PENDING, &iport->state);
1665 status = sci_port_hard_reset(iport, ISCI_PORT_RESET_TIMEOUT);
1670 wait_port_reset(ihost, iport);
1673 "%s: iport = %p; hard reset completion\n",
1674 __func__, iport);
1676 if (iport->hard_reset_status != SCI_SUCCESS) {
1680 "%s: iport = %p; hard reset failed (0x%x)\n",
1681 __func__, iport, iport->hard_reset_status);
1684 clear_bit(IPORT_RESET_PENDING, &iport->state);
1689 "%s: iport = %p; sci_port_hard_reset call"
1691 __func__, iport, status);
1699 struct isci_port *iport = dev->port->lldd_port;
1712 if (test_bit(IPORT_RESET_PENDING, &iport->state))
1715 rc = !!iport->active_phy_mask;
1725 struct isci_port *iport = phy->port->lldd_port;
1732 if (!iport)
1737 if (iport->active_phy_mask & 1 << i)
1744 __func__, (long) (iport - &ihost->ports[0]));
1752 struct isci_port *iport = NULL;
1763 iport = &ihost->ports[i];
1764 if (iport->active_phy_mask & 1 << iphy->phy_index)
1770 iport = NULL;
1772 port->lldd_port = iport;