diff options
| author | Dan Williams <dan.j.williams@intel.com> | 2011-04-21 21:44:45 -0400 |
|---|---|---|
| committer | Dan Williams <dan.j.williams@intel.com> | 2011-07-03 07:00:38 -0400 |
| commit | a1a113b0a1ea437daf099b44f8a39e93a02a3f47 (patch) | |
| tree | c9576cfc8c12447d0932accee0e3b59d175c08d9 /drivers | |
| parent | b87ee3075b090e1dd0bdf40b295142b606d55e64 (diff) | |
isci: kill smp_discover_response_protocols in favor of domain_device.dev_type
This is step 1 of removing the contortions to:
1/ unparse expander phy data into a smp discover frame
2/ open-code-parse the smp discover fram into a domain_device.dev_type equivalent
libsas has already spent cycles determining the dev_type, so now that
scic_sds_remote_device is unified with isci_remote_device we can
directly reference dev_type.
This might also change multi-level expander detection as we previously only
looked at dev_type == EDGE_DEV and we did not consider the FANOUT_DEV case.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/scsi/isci/core/scic_sds_controller.h | 20 | ||||
| -rw-r--r-- | drivers/scsi/isci/core/scic_sds_port.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/isci/core/scic_sds_port.h | 4 | ||||
| -rw-r--r-- | drivers/scsi/isci/core/scic_sds_request.c | 24 | ||||
| -rw-r--r-- | drivers/scsi/isci/remote_device.c | 110 | ||||
| -rw-r--r-- | drivers/scsi/isci/remote_device.h | 34 | ||||
| -rw-r--r-- | drivers/scsi/isci/remote_node_context.c | 63 | ||||
| -rw-r--r-- | drivers/scsi/isci/request.c | 19 | ||||
| -rw-r--r-- | drivers/scsi/isci/task.c | 20 |
9 files changed, 118 insertions, 178 deletions
diff --git a/drivers/scsi/isci/core/scic_sds_controller.h b/drivers/scsi/isci/core/scic_sds_controller.h index e15c4e2fd76d..ce81286e52fd 100644 --- a/drivers/scsi/isci/core/scic_sds_controller.h +++ b/drivers/scsi/isci/core/scic_sds_controller.h | |||
| @@ -74,9 +74,9 @@ | |||
| 74 | #include "scic_sds_port.h" | 74 | #include "scic_sds_port.h" |
| 75 | #include "scic_sds_phy.h" | 75 | #include "scic_sds_phy.h" |
| 76 | #include "remote_node_table.h" | 76 | #include "remote_node_table.h" |
| 77 | #include "remote_device.h" | ||
| 77 | #include "scu_registers.h" | 78 | #include "scu_registers.h" |
| 78 | #include "scu_constants.h" | 79 | #include "scu_constants.h" |
| 79 | #include "scu_remote_node_context.h" | ||
| 80 | #include "scu_task_context.h" | 80 | #include "scu_task_context.h" |
| 81 | #include "scu_unsolicited_frame.h" | 81 | #include "scu_unsolicited_frame.h" |
| 82 | #include "scic_sds_unsolicited_frame_control.h" | 82 | #include "scic_sds_unsolicited_frame_control.h" |
| @@ -498,14 +498,16 @@ enum scic_sds_controller_states { | |||
| 498 | #define scic_sds_io_sequence_increment(value) \ | 498 | #define scic_sds_io_sequence_increment(value) \ |
| 499 | ((value) = (((value) + 1) & 0x000F)) | 499 | ((value) = (((value) + 1) & 0x000F)) |
| 500 | 500 | ||
| 501 | #define scic_sds_remote_device_node_count(device) \ | 501 | /* expander attached sata devices require 3 rnc slots */ |
| 502 | (\ | 502 | static inline int scic_sds_remote_device_node_count(struct scic_sds_remote_device *sci_dev) |
| 503 | (\ | 503 | { |
| 504 | (device)->target_protocols.u.bits.attached_stp_target \ | 504 | struct domain_device *dev = sci_dev_to_domain(sci_dev); |
| 505 | && ((device)->is_direct_attached != true) \ | 505 | |
| 506 | ) \ | 506 | if ((dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) && |
| 507 | ? SCU_STP_REMOTE_NODE_COUNT : SCU_SSP_REMOTE_NODE_COUNT \ | 507 | !sci_dev->is_direct_attached) |
| 508 | ) | 508 | return SCU_STP_REMOTE_NODE_COUNT; |
| 509 | return SCU_SSP_REMOTE_NODE_COUNT; | ||
| 510 | } | ||
| 509 | 511 | ||
| 510 | /** | 512 | /** |
| 511 | * scic_sds_controller_set_invalid_phy() - | 513 | * scic_sds_controller_set_invalid_phy() - |
diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c index b07e48e2f188..057f95a79be9 100644 --- a/drivers/scsi/isci/core/scic_sds_port.c +++ b/drivers/scsi/isci/core/scic_sds_port.c | |||
| @@ -434,7 +434,7 @@ void scic_sds_port_get_attached_sas_address( | |||
| 434 | * multi-protocol support. | 434 | * multi-protocol support. |
| 435 | * | 435 | * |
| 436 | */ | 436 | */ |
| 437 | void scic_sds_port_get_attached_protocols( | 437 | static void scic_sds_port_get_attached_protocols( |
| 438 | struct scic_sds_port *sci_port, | 438 | struct scic_sds_port *sci_port, |
| 439 | struct sci_sas_identify_address_frame_protocols *protocols) | 439 | struct sci_sas_identify_address_frame_protocols *protocols) |
| 440 | { | 440 | { |
diff --git a/drivers/scsi/isci/core/scic_sds_port.h b/drivers/scsi/isci/core/scic_sds_port.h index 964e3885dbf2..59c76cd3902f 100644 --- a/drivers/scsi/isci/core/scic_sds_port.h +++ b/drivers/scsi/isci/core/scic_sds_port.h | |||
| @@ -447,8 +447,4 @@ void scic_sds_port_get_attached_sas_address( | |||
| 447 | struct scic_sds_port *sci_port, | 447 | struct scic_sds_port *sci_port, |
| 448 | struct sci_sas_address *sas_address); | 448 | struct sci_sas_address *sas_address); |
| 449 | 449 | ||
| 450 | void scic_sds_port_get_attached_protocols( | ||
| 451 | struct scic_sds_port *sci_port, | ||
| 452 | struct sci_sas_identify_address_frame_protocols *protocols); | ||
| 453 | |||
| 454 | #endif /* _SCIC_SDS_PORT_H_ */ | 450 | #endif /* _SCIC_SDS_PORT_H_ */ |
diff --git a/drivers/scsi/isci/core/scic_sds_request.c b/drivers/scsi/isci/core/scic_sds_request.c index dfb94121d445..a66e7b248b24 100644 --- a/drivers/scsi/isci/core/scic_sds_request.c +++ b/drivers/scsi/isci/core/scic_sds_request.c | |||
| @@ -1758,8 +1758,8 @@ enum sci_status scic_io_request_construct(struct scic_sds_controller *scic, | |||
| 1758 | struct scic_sds_request *sci_req, | 1758 | struct scic_sds_request *sci_req, |
| 1759 | struct scic_sds_request **new_scic_io_request_handle) | 1759 | struct scic_sds_request **new_scic_io_request_handle) |
| 1760 | { | 1760 | { |
| 1761 | struct domain_device *dev = sci_dev_to_domain(sci_dev); | ||
| 1761 | enum sci_status status = SCI_SUCCESS; | 1762 | enum sci_status status = SCI_SUCCESS; |
| 1762 | struct smp_discover_response_protocols device_protocol; | ||
| 1763 | 1763 | ||
| 1764 | /* Build the common part of the request */ | 1764 | /* Build the common part of the request */ |
| 1765 | scic_sds_general_request_construct(scic, sci_dev, io_tag, | 1765 | scic_sds_general_request_construct(scic, sci_dev, io_tag, |
| @@ -1768,19 +1768,16 @@ enum sci_status scic_io_request_construct(struct scic_sds_controller *scic, | |||
| 1768 | if (sci_dev->rnc.remote_node_index == SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX) | 1768 | if (sci_dev->rnc.remote_node_index == SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX) |
| 1769 | return SCI_FAILURE_INVALID_REMOTE_DEVICE; | 1769 | return SCI_FAILURE_INVALID_REMOTE_DEVICE; |
| 1770 | 1770 | ||
| 1771 | scic_remote_device_get_protocols(sci_dev, &device_protocol); | 1771 | if (dev->dev_type == SAS_END_DEV) { |
| 1772 | |||
| 1773 | if (device_protocol.u.bits.attached_ssp_target) { | ||
| 1774 | scic_sds_ssp_io_request_assign_buffers(sci_req); | 1772 | scic_sds_ssp_io_request_assign_buffers(sci_req); |
| 1775 | } else if (device_protocol.u.bits.attached_stp_target) { | 1773 | } else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
| 1776 | scic_sds_stp_request_assign_buffers(sci_req); | 1774 | scic_sds_stp_request_assign_buffers(sci_req); |
| 1777 | memset(sci_req->command_buffer, 0, sizeof(struct sata_fis_reg_h2d)); | 1775 | memset(sci_req->command_buffer, 0, sizeof(struct sata_fis_reg_h2d)); |
| 1778 | } else if (device_protocol.u.bits.attached_smp_target) { | 1776 | } else if (dev_is_expander(dev)) { |
| 1779 | scic_sds_smp_request_assign_buffers(sci_req); | 1777 | scic_sds_smp_request_assign_buffers(sci_req); |
| 1780 | memset(sci_req->command_buffer, 0, sizeof(struct smp_request)); | 1778 | memset(sci_req->command_buffer, 0, sizeof(struct smp_request)); |
| 1781 | } else { | 1779 | } else |
| 1782 | status = SCI_FAILURE_UNSUPPORTED_PROTOCOL; | 1780 | status = SCI_FAILURE_UNSUPPORTED_PROTOCOL; |
| 1783 | } | ||
| 1784 | 1781 | ||
| 1785 | if (status == SCI_SUCCESS) { | 1782 | if (status == SCI_SUCCESS) { |
| 1786 | memset(sci_req->task_context_buffer, 0, | 1783 | memset(sci_req->task_context_buffer, 0, |
| @@ -1798,17 +1795,15 @@ enum sci_status scic_task_request_construct(struct scic_sds_controller *scic, | |||
| 1798 | struct scic_sds_request *sci_req, | 1795 | struct scic_sds_request *sci_req, |
| 1799 | struct scic_sds_request **new_sci_req) | 1796 | struct scic_sds_request **new_sci_req) |
| 1800 | { | 1797 | { |
| 1798 | struct domain_device *dev = sci_dev_to_domain(sci_dev); | ||
| 1801 | enum sci_status status = SCI_SUCCESS; | 1799 | enum sci_status status = SCI_SUCCESS; |
| 1802 | struct smp_discover_response_protocols device_protocol; | ||
| 1803 | 1800 | ||
| 1804 | /* Build the common part of the request */ | 1801 | /* Build the common part of the request */ |
| 1805 | scic_sds_general_request_construct(scic, sci_dev, io_tag, | 1802 | scic_sds_general_request_construct(scic, sci_dev, io_tag, |
| 1806 | user_io_request_object, | 1803 | user_io_request_object, |
| 1807 | sci_req); | 1804 | sci_req); |
| 1808 | 1805 | ||
| 1809 | scic_remote_device_get_protocols(sci_dev, &device_protocol); | 1806 | if (dev->dev_type == SAS_END_DEV) { |
| 1810 | |||
| 1811 | if (device_protocol.u.bits.attached_ssp_target) { | ||
| 1812 | scic_sds_ssp_task_request_assign_buffers(sci_req); | 1807 | scic_sds_ssp_task_request_assign_buffers(sci_req); |
| 1813 | 1808 | ||
| 1814 | sci_req->has_started_substate_machine = true; | 1809 | sci_req->has_started_substate_machine = true; |
| @@ -1820,11 +1815,10 @@ enum sci_status scic_task_request_construct(struct scic_sds_controller *scic, | |||
| 1820 | scic_sds_io_request_started_task_mgmt_substate_table, | 1815 | scic_sds_io_request_started_task_mgmt_substate_table, |
| 1821 | SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_COMPLETION | 1816 | SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_COMPLETION |
| 1822 | ); | 1817 | ); |
| 1823 | } else if (device_protocol.u.bits.attached_stp_target) { | 1818 | } else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) |
| 1824 | scic_sds_stp_request_assign_buffers(sci_req); | 1819 | scic_sds_stp_request_assign_buffers(sci_req); |
| 1825 | } else { | 1820 | else |
| 1826 | status = SCI_FAILURE_UNSUPPORTED_PROTOCOL; | 1821 | status = SCI_FAILURE_UNSUPPORTED_PROTOCOL; |
| 1827 | } | ||
| 1828 | 1822 | ||
| 1829 | if (status == SCI_SUCCESS) { | 1823 | if (status == SCI_SUCCESS) { |
| 1830 | sci_req->is_task_management_request = true; | 1824 | sci_req->is_task_management_request = true; |
diff --git a/drivers/scsi/isci/remote_device.c b/drivers/scsi/isci/remote_device.c index 70641818f602..fc79a5b47f72 100644 --- a/drivers/scsi/isci/remote_device.c +++ b/drivers/scsi/isci/remote_device.c | |||
| @@ -100,13 +100,6 @@ enum sas_linkrate scic_remote_device_get_connection_rate( | |||
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | 102 | ||
| 103 | void scic_remote_device_get_protocols( | ||
| 104 | struct scic_sds_remote_device *sci_dev, | ||
| 105 | struct smp_discover_response_protocols *pr) | ||
| 106 | { | ||
| 107 | pr->u.all = sci_dev->target_protocols.u.all; | ||
| 108 | } | ||
| 109 | |||
| 110 | #if !defined(DISABLE_ATAPI) | 103 | #if !defined(DISABLE_ATAPI) |
| 111 | bool scic_remote_device_is_atapi(struct scic_sds_remote_device *sci_dev) | 104 | bool scic_remote_device_is_atapi(struct scic_sds_remote_device *sci_dev) |
| 112 | { | 105 | { |
| @@ -1490,7 +1483,7 @@ static enum sci_status scic_remote_device_da_construct(struct scic_sds_port *sci | |||
| 1490 | { | 1483 | { |
| 1491 | enum sci_status status; | 1484 | enum sci_status status; |
| 1492 | u16 remote_node_index; | 1485 | u16 remote_node_index; |
| 1493 | struct sci_sas_identify_address_frame_protocols protocols; | 1486 | struct domain_device *dev = sci_dev_to_domain(sci_dev); |
| 1494 | 1487 | ||
| 1495 | scic_remote_device_construct(sci_port, sci_dev); | 1488 | scic_remote_device_construct(sci_port, sci_dev); |
| 1496 | 1489 | ||
| @@ -1498,53 +1491,46 @@ static enum sci_status scic_remote_device_da_construct(struct scic_sds_port *sci | |||
| 1498 | * This information is request to determine how many remote node context | 1491 | * This information is request to determine how many remote node context |
| 1499 | * entries will be needed to store the remote node. | 1492 | * entries will be needed to store the remote node. |
| 1500 | */ | 1493 | */ |
| 1501 | scic_sds_port_get_attached_protocols(sci_dev->owning_port, &protocols); | ||
| 1502 | sci_dev->target_protocols.u.all = protocols.u.all; | ||
| 1503 | sci_dev->is_direct_attached = true; | 1494 | sci_dev->is_direct_attached = true; |
| 1504 | #if !defined(DISABLE_ATAPI) | 1495 | status = scic_sds_controller_allocate_remote_node_context(sci_port->owning_controller, |
| 1505 | sci_dev->is_atapi = scic_sds_remote_device_is_atapi(sci_dev); | 1496 | sci_dev, |
| 1506 | #endif | 1497 | &remote_node_index); |
| 1507 | 1498 | ||
| 1508 | status = scic_sds_controller_allocate_remote_node_context( | 1499 | if (status != SCI_SUCCESS) |
| 1509 | sci_dev->owning_port->owning_controller, | 1500 | return status; |
| 1510 | sci_dev, | ||
| 1511 | &remote_node_index); | ||
| 1512 | 1501 | ||
| 1513 | if (status == SCI_SUCCESS) { | 1502 | sci_dev->rnc.remote_node_index = remote_node_index; |
| 1514 | sci_dev->rnc.remote_node_index = remote_node_index; | ||
| 1515 | 1503 | ||
| 1516 | scic_sds_port_get_attached_sas_address( | 1504 | scic_sds_port_get_attached_sas_address(sci_port, &sci_dev->device_address); |
| 1517 | sci_dev->owning_port, &sci_dev->device_address); | ||
| 1518 | 1505 | ||
| 1519 | if (sci_dev->target_protocols.u.bits.attached_ssp_target) { | 1506 | if (dev->dev_type == SAS_END_DEV) |
| 1520 | sci_dev->has_ready_substate_machine = false; | 1507 | sci_dev->has_ready_substate_machine = false; |
| 1521 | } else if (sci_dev->target_protocols.u.bits.attached_stp_target) { | 1508 | else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
| 1522 | sci_dev->has_ready_substate_machine = true; | 1509 | sci_dev->has_ready_substate_machine = true; |
| 1523 | 1510 | ||
| 1524 | sci_base_state_machine_construct( | 1511 | sci_base_state_machine_construct( |
| 1525 | &sci_dev->ready_substate_machine, | 1512 | &sci_dev->ready_substate_machine, |
| 1526 | &sci_dev->parent, | 1513 | &sci_dev->parent, |
| 1527 | scic_sds_stp_remote_device_ready_substate_table, | 1514 | scic_sds_stp_remote_device_ready_substate_table, |
| 1528 | SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); | 1515 | SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); |
| 1529 | } else if (sci_dev->target_protocols.u.bits.attached_smp_target) { | 1516 | } else if (dev_is_expander(dev)) { |
| 1530 | sci_dev->has_ready_substate_machine = true; | 1517 | sci_dev->has_ready_substate_machine = true; |
| 1531 | 1518 | ||
| 1532 | /* add the SMP ready substate machine construction here */ | 1519 | /* add the SMP ready substate machine construction here */ |
| 1533 | sci_base_state_machine_construct( | 1520 | sci_base_state_machine_construct( |
| 1534 | &sci_dev->ready_substate_machine, | 1521 | &sci_dev->ready_substate_machine, |
| 1535 | &sci_dev->parent, | 1522 | &sci_dev->parent, |
| 1536 | scic_sds_smp_remote_device_ready_substate_table, | 1523 | scic_sds_smp_remote_device_ready_substate_table, |
| 1537 | SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); | 1524 | SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); |
| 1538 | } | 1525 | } else |
| 1526 | return SCI_FAILURE_UNSUPPORTED_PROTOCOL; | ||
| 1539 | 1527 | ||
| 1540 | sci_dev->connection_rate = scic_sds_port_get_max_allowed_speed( | 1528 | sci_dev->connection_rate = scic_sds_port_get_max_allowed_speed(sci_port); |
| 1541 | sci_dev->owning_port); | ||
| 1542 | 1529 | ||
| 1543 | /* / @todo Should I assign the port width by reading all of the phys on the port? */ | 1530 | /* / @todo Should I assign the port width by reading all of the phys on the port? */ |
| 1544 | sci_dev->device_port_width = 1; | 1531 | sci_dev->device_port_width = 1; |
| 1545 | } | ||
| 1546 | 1532 | ||
| 1547 | return status; | 1533 | return SCI_SUCCESS; |
| 1548 | } | 1534 | } |
| 1549 | 1535 | ||
| 1550 | static void scic_sds_remote_device_get_info_from_smp_discover_response( | 1536 | static void scic_sds_remote_device_get_info_from_smp_discover_response( |
| @@ -1557,8 +1543,6 @@ static void scic_sds_remote_device_get_info_from_smp_discover_response( | |||
| 1557 | 1543 | ||
| 1558 | sci_dev->device_address.low = | 1544 | sci_dev->device_address.low = |
| 1559 | discover_response->attached_sas_address.low; | 1545 | discover_response->attached_sas_address.low; |
| 1560 | |||
| 1561 | sci_dev->target_protocols.u.all = discover_response->protocols.u.all; | ||
| 1562 | } | 1546 | } |
| 1563 | 1547 | ||
| 1564 | /** | 1548 | /** |
| @@ -1579,6 +1563,7 @@ static enum sci_status scic_remote_device_ea_construct(struct scic_sds_port *sci | |||
| 1579 | struct smp_response_discover *discover_response) | 1563 | struct smp_response_discover *discover_response) |
| 1580 | { | 1564 | { |
| 1581 | struct scic_sds_controller *scic = sci_port->owning_controller; | 1565 | struct scic_sds_controller *scic = sci_port->owning_controller; |
| 1566 | struct domain_device *dev = sci_dev_to_domain(sci_dev); | ||
| 1582 | enum sci_status status; | 1567 | enum sci_status status; |
| 1583 | 1568 | ||
| 1584 | scic_remote_device_construct(sci_port, sci_dev); | 1569 | scic_remote_device_construct(sci_port, sci_dev); |
| @@ -1588,43 +1573,42 @@ static enum sci_status scic_remote_device_ea_construct(struct scic_sds_port *sci | |||
| 1588 | 1573 | ||
| 1589 | status = scic_sds_controller_allocate_remote_node_context( | 1574 | status = scic_sds_controller_allocate_remote_node_context( |
| 1590 | scic, sci_dev, &sci_dev->rnc.remote_node_index); | 1575 | scic, sci_dev, &sci_dev->rnc.remote_node_index); |
| 1576 | if (status != SCI_SUCCESS) | ||
| 1577 | return status; | ||
| 1591 | 1578 | ||
| 1592 | if (status == SCI_SUCCESS) { | 1579 | if (dev->dev_type == SAS_END_DEV) |
| 1593 | if (sci_dev->target_protocols.u.bits.attached_ssp_target) { | 1580 | sci_dev->has_ready_substate_machine = false; |
| 1594 | sci_dev->has_ready_substate_machine = false; | 1581 | else if (dev_is_expander(dev)) { |
| 1595 | } else if (sci_dev->target_protocols.u.bits.attached_smp_target) { | 1582 | sci_dev->has_ready_substate_machine = true; |
| 1596 | sci_dev->has_ready_substate_machine = true; | ||
| 1597 | 1583 | ||
| 1598 | /* add the SMP ready substate machine construction here */ | 1584 | /* add the SMP ready substate machine construction here */ |
| 1599 | sci_base_state_machine_construct( | 1585 | sci_base_state_machine_construct( |
| 1600 | &sci_dev->ready_substate_machine, | 1586 | &sci_dev->ready_substate_machine, |
| 1601 | &sci_dev->parent, | 1587 | &sci_dev->parent, |
| 1602 | scic_sds_smp_remote_device_ready_substate_table, | 1588 | scic_sds_smp_remote_device_ready_substate_table, |
| 1603 | SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); | 1589 | SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); |
| 1604 | } else if (sci_dev->target_protocols.u.bits.attached_stp_target) { | 1590 | } else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
| 1605 | sci_dev->has_ready_substate_machine = true; | 1591 | sci_dev->has_ready_substate_machine = true; |
| 1606 | 1592 | ||
| 1607 | sci_base_state_machine_construct( | 1593 | sci_base_state_machine_construct( |
| 1608 | &sci_dev->ready_substate_machine, | 1594 | &sci_dev->ready_substate_machine, |
| 1609 | &sci_dev->parent, | 1595 | &sci_dev->parent, |
| 1610 | scic_sds_stp_remote_device_ready_substate_table, | 1596 | scic_sds_stp_remote_device_ready_substate_table, |
| 1611 | SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); | 1597 | SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE); |
| 1612 | } | 1598 | } |
| 1613 | 1599 | ||
| 1614 | /* | 1600 | /* |
| 1615 | * For SAS-2 the physical link rate is actually a logical link | 1601 | * For SAS-2 the physical link rate is actually a logical link |
| 1616 | * rate that incorporates multiplexing. The SCU doesn't | 1602 | * rate that incorporates multiplexing. The SCU doesn't |
| 1617 | * incorporate multiplexing and for the purposes of the | 1603 | * incorporate multiplexing and for the purposes of the |
| 1618 | * connection the logical link rate is that same as the | 1604 | * connection the logical link rate is that same as the |
| 1619 | * physical. Furthermore, the SAS-2 and SAS-1.1 fields overlay | 1605 | * physical. Furthermore, the SAS-2 and SAS-1.1 fields overlay |
| 1620 | * one another, so this code works for both situations. */ | 1606 | * one another, so this code works for both situations. */ |
| 1621 | sci_dev->connection_rate = min_t(u16, | 1607 | sci_dev->connection_rate = min_t(u16, scic_sds_port_get_max_allowed_speed(sci_port), |
| 1622 | scic_sds_port_get_max_allowed_speed(sci_port), | ||
| 1623 | discover_response->u2.sas1_1.negotiated_physical_link_rate); | 1608 | discover_response->u2.sas1_1.negotiated_physical_link_rate); |
| 1624 | 1609 | ||
| 1625 | /* / @todo Should I assign the port width by reading all of the phys on the port? */ | 1610 | /* / @todo Should I assign the port width by reading all of the phys on the port? */ |
| 1626 | sci_dev->device_port_width = 1; | 1611 | sci_dev->device_port_width = 1; |
| 1627 | } | ||
| 1628 | 1612 | ||
| 1629 | return status; | 1613 | return status; |
| 1630 | } | 1614 | } |
| @@ -1665,7 +1649,7 @@ static enum sci_status isci_remote_device_construct( | |||
| 1665 | enum sci_status status = SCI_SUCCESS; | 1649 | enum sci_status status = SCI_SUCCESS; |
| 1666 | 1650 | ||
| 1667 | if (isci_device->domain_dev->parent && | 1651 | if (isci_device->domain_dev->parent && |
| 1668 | (isci_device->domain_dev->parent->dev_type == EDGE_DEV)) { | 1652 | dev_is_expander(isci_device->domain_dev->parent)) { |
| 1669 | int i; | 1653 | int i; |
| 1670 | 1654 | ||
| 1671 | /* struct smp_response_discover discover_response; */ | 1655 | /* struct smp_response_discover discover_response; */ |
diff --git a/drivers/scsi/isci/remote_device.h b/drivers/scsi/isci/remote_device.h index 9d8fcbf72ded..39821601022b 100644 --- a/drivers/scsi/isci/remote_device.h +++ b/drivers/scsi/isci/remote_device.h | |||
| @@ -100,11 +100,6 @@ struct scic_sds_remote_device { | |||
| 100 | enum sas_linkrate connection_rate; | 100 | enum sas_linkrate connection_rate; |
| 101 | 101 | ||
| 102 | /** | 102 | /** |
| 103 | * This field contains the allowed target protocols for this remote device. | ||
| 104 | */ | ||
| 105 | struct smp_discover_response_protocols target_protocols; | ||
| 106 | |||
| 107 | /** | ||
| 108 | * This field contains the device SAS address. | 103 | * This field contains the device SAS address. |
| 109 | */ | 104 | */ |
| 110 | struct sci_sas_address device_address; | 105 | struct sci_sas_address device_address; |
| @@ -264,23 +259,6 @@ enum sci_status scic_remote_device_reset_complete( | |||
| 264 | enum sas_linkrate scic_remote_device_get_connection_rate( | 259 | enum sas_linkrate scic_remote_device_get_connection_rate( |
| 265 | struct scic_sds_remote_device *remote_device); | 260 | struct scic_sds_remote_device *remote_device); |
| 266 | 261 | ||
| 267 | /** | ||
| 268 | * scic_remote_device_get_protocols() - This method will indicate which | ||
| 269 | * protocols are supported by this remote device. | ||
| 270 | * @remote_device: This parameter specifies the device for which to return the | ||
| 271 | * protocol. | ||
| 272 | * @protocols: This parameter specifies the output values, from the remote | ||
| 273 | * device object, which indicate the protocols supported by the supplied | ||
| 274 | * remote_device. | ||
| 275 | * | ||
| 276 | * The type of protocols supported by this device. The values are returned as | ||
| 277 | * part of a bit mask in order to allow for multi-protocol support. | ||
| 278 | */ | ||
| 279 | void scic_remote_device_get_protocols( | ||
| 280 | struct scic_sds_remote_device *remote_device, | ||
| 281 | struct smp_discover_response_protocols *protocols); | ||
| 282 | |||
| 283 | |||
| 284 | #if !defined(DISABLE_ATAPI) | 262 | #if !defined(DISABLE_ATAPI) |
| 285 | /** | 263 | /** |
| 286 | * scic_remote_device_is_atapi() - | 264 | * scic_remote_device_is_atapi() - |
| @@ -477,6 +455,18 @@ static inline struct scic_sds_remote_device *rnc_to_dev(struct scic_sds_remote_n | |||
| 477 | return sci_dev; | 455 | return sci_dev; |
| 478 | } | 456 | } |
| 479 | 457 | ||
| 458 | static inline struct domain_device *sci_dev_to_domain(struct scic_sds_remote_device *sci_dev) | ||
| 459 | { | ||
| 460 | struct isci_remote_device *idev = container_of(sci_dev, typeof(*idev), sci); | ||
| 461 | |||
| 462 | return idev->domain_dev; | ||
| 463 | } | ||
| 464 | |||
| 465 | static inline bool dev_is_expander(struct domain_device *dev) | ||
| 466 | { | ||
| 467 | return dev->dev_type == EDGE_DEV || dev->dev_type == FANOUT_DEV; | ||
| 468 | } | ||
| 469 | |||
| 480 | typedef enum sci_status (*scic_sds_remote_device_request_handler_t)( | 470 | typedef enum sci_status (*scic_sds_remote_device_request_handler_t)( |
| 481 | struct scic_sds_remote_device *device, | 471 | struct scic_sds_remote_device *device, |
| 482 | struct scic_sds_request *request); | 472 | struct scic_sds_request *request); |
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c index bdf0b5101cfa..285232fd5e63 100644 --- a/drivers/scsi/isci/remote_node_context.c +++ b/drivers/scsi/isci/remote_node_context.c | |||
| @@ -106,8 +106,9 @@ bool scic_sds_remote_node_context_is_ready( | |||
| 106 | static void scic_sds_remote_node_context_construct_buffer( | 106 | static void scic_sds_remote_node_context_construct_buffer( |
| 107 | struct scic_sds_remote_node_context *sci_rnc) | 107 | struct scic_sds_remote_node_context *sci_rnc) |
| 108 | { | 108 | { |
| 109 | union scu_remote_node_context *rnc; | ||
| 110 | struct scic_sds_remote_device *sci_dev = rnc_to_dev(sci_rnc); | 109 | struct scic_sds_remote_device *sci_dev = rnc_to_dev(sci_rnc); |
| 110 | struct domain_device *dev = sci_dev_to_domain(sci_dev); | ||
| 111 | union scu_remote_node_context *rnc; | ||
| 111 | struct scic_sds_controller *scic; | 112 | struct scic_sds_controller *scic; |
| 112 | 113 | ||
| 113 | scic = scic_sds_remote_device_get_controller(sci_dev); | 114 | scic = scic_sds_remote_device_get_controller(sci_dev); |
| @@ -134,11 +135,7 @@ static void scic_sds_remote_node_context_construct_buffer( | |||
| 134 | 135 | ||
| 135 | rnc->ssp.arbitration_wait_time = 0; | 136 | rnc->ssp.arbitration_wait_time = 0; |
| 136 | 137 | ||
| 137 | 138 | if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { | |
| 138 | if ( | ||
| 139 | sci_dev->target_protocols.u.bits.attached_sata_device | ||
| 140 | || sci_dev->target_protocols.u.bits.attached_stp_target | ||
| 141 | ) { | ||
| 142 | rnc->ssp.connection_occupancy_timeout = | 139 | rnc->ssp.connection_occupancy_timeout = |
| 143 | scic->user_parameters.sds1.stp_max_occupancy_timeout; | 140 | scic->user_parameters.sds1.stp_max_occupancy_timeout; |
| 144 | rnc->ssp.connection_inactivity_timeout = | 141 | rnc->ssp.connection_inactivity_timeout = |
| @@ -639,45 +636,30 @@ static enum sci_status scic_sds_remote_node_context_tx_suspended_state_resume_ha | |||
| 639 | scics_sds_remote_node_context_callback callback, | 636 | scics_sds_remote_node_context_callback callback, |
| 640 | void *callback_parameter) | 637 | void *callback_parameter) |
| 641 | { | 638 | { |
| 642 | enum sci_status status; | 639 | struct scic_sds_remote_device *sci_dev = rnc_to_dev(sci_rnc); |
| 643 | struct smp_discover_response_protocols protocols; | 640 | struct domain_device *dev = sci_dev_to_domain(sci_dev); |
| 641 | enum sci_status status = SCI_SUCCESS; | ||
| 644 | 642 | ||
| 645 | scic_sds_remote_node_context_setup_to_resume( | 643 | scic_sds_remote_node_context_setup_to_resume(sci_rnc, callback, |
| 646 | sci_rnc, callback, callback_parameter | 644 | callback_parameter); |
| 647 | ); | ||
| 648 | 645 | ||
| 649 | /* TODO: consider adding a resume action of NONE, INVALIDATE, WRITE_TLCR */ | 646 | /* TODO: consider adding a resume action of NONE, INVALIDATE, WRITE_TLCR */ |
| 650 | 647 | if (dev->dev_type == SAS_END_DEV || dev_is_expander(dev)) | |
| 651 | scic_remote_device_get_protocols(rnc_to_dev(sci_rnc), &protocols); | 648 | sci_base_state_machine_change_state(&sci_rnc->state_machine, |
| 652 | 649 | SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE); | |
| 653 | if ( | 650 | else if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
| 654 | (protocols.u.bits.attached_ssp_target == 1) | 651 | if (sci_dev->is_direct_attached) { |
| 655 | || (protocols.u.bits.attached_smp_target == 1) | ||
| 656 | ) { | ||
| 657 | sci_base_state_machine_change_state( | ||
| 658 | &sci_rnc->state_machine, | ||
| 659 | SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE | ||
| 660 | ); | ||
| 661 | |||
| 662 | status = SCI_SUCCESS; | ||
| 663 | } else if (protocols.u.bits.attached_stp_target == 1) { | ||
| 664 | if (rnc_to_dev(sci_rnc)->is_direct_attached) { | ||
| 665 | /* @todo Fix this since I am being silly in writing to the STPTLDARNI register. */ | 652 | /* @todo Fix this since I am being silly in writing to the STPTLDARNI register. */ |
| 666 | sci_base_state_machine_change_state( | 653 | sci_base_state_machine_change_state( |
| 667 | &sci_rnc->state_machine, | 654 | &sci_rnc->state_machine, |
| 668 | SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE | 655 | SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE); |
| 669 | ); | ||
| 670 | } else { | 656 | } else { |
| 671 | sci_base_state_machine_change_state( | 657 | sci_base_state_machine_change_state( |
| 672 | &sci_rnc->state_machine, | 658 | &sci_rnc->state_machine, |
| 673 | SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE | 659 | SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE); |
| 674 | ); | ||
| 675 | } | 660 | } |
| 676 | 661 | } else | |
| 677 | status = SCI_SUCCESS; | ||
| 678 | } else { | ||
| 679 | status = SCI_FAILURE; | 662 | status = SCI_FAILURE; |
| 680 | } | ||
| 681 | 663 | ||
| 682 | return status; | 664 | return status; |
| 683 | } | 665 | } |
| @@ -932,6 +914,7 @@ static void scic_sds_remote_node_context_validate_context_buffer( | |||
| 932 | struct scic_sds_remote_node_context *sci_rnc) | 914 | struct scic_sds_remote_node_context *sci_rnc) |
| 933 | { | 915 | { |
| 934 | struct scic_sds_remote_device *sci_dev = rnc_to_dev(sci_rnc); | 916 | struct scic_sds_remote_device *sci_dev = rnc_to_dev(sci_rnc); |
| 917 | struct domain_device *dev = sci_dev_to_domain(sci_dev); | ||
| 935 | union scu_remote_node_context *rnc_buffer; | 918 | union scu_remote_node_context *rnc_buffer; |
| 936 | 919 | ||
| 937 | rnc_buffer = scic_sds_controller_get_remote_node_context_buffer( | 920 | rnc_buffer = scic_sds_controller_get_remote_node_context_buffer( |
| @@ -942,7 +925,7 @@ static void scic_sds_remote_node_context_validate_context_buffer( | |||
| 942 | rnc_buffer->ssp.is_valid = true; | 925 | rnc_buffer->ssp.is_valid = true; |
| 943 | 926 | ||
| 944 | if (!sci_dev->is_direct_attached && | 927 | if (!sci_dev->is_direct_attached && |
| 945 | sci_dev->target_protocols.u.bits.attached_stp_target) { | 928 | (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP))) { |
| 946 | scic_sds_remote_device_post_request(sci_dev, | 929 | scic_sds_remote_device_post_request(sci_dev, |
| 947 | SCU_CONTEXT_COMMAND_POST_RNC_96); | 930 | SCU_CONTEXT_COMMAND_POST_RNC_96); |
| 948 | } else { | 931 | } else { |
| @@ -1063,11 +1046,12 @@ static void scic_sds_remote_node_context_resuming_state_enter( | |||
| 1063 | struct sci_base_object *object) | 1046 | struct sci_base_object *object) |
| 1064 | { | 1047 | { |
| 1065 | struct scic_sds_remote_node_context *rnc; | 1048 | struct scic_sds_remote_node_context *rnc; |
| 1066 | struct smp_discover_response_protocols protocols; | ||
| 1067 | struct scic_sds_remote_device *sci_dev; | 1049 | struct scic_sds_remote_device *sci_dev; |
| 1050 | struct domain_device *dev; | ||
| 1068 | 1051 | ||
| 1069 | rnc = (struct scic_sds_remote_node_context *)object; | 1052 | rnc = (struct scic_sds_remote_node_context *)object; |
| 1070 | sci_dev = rnc_to_dev(rnc); | 1053 | sci_dev = rnc_to_dev(rnc); |
| 1054 | dev = sci_dev_to_domain(sci_dev); | ||
| 1071 | 1055 | ||
| 1072 | SET_STATE_HANDLER( | 1056 | SET_STATE_HANDLER( |
| 1073 | rnc, | 1057 | rnc, |
| @@ -1081,13 +1065,10 @@ static void scic_sds_remote_node_context_resuming_state_enter( | |||
| 1081 | * resume because of a target reset we also need to update | 1065 | * resume because of a target reset we also need to update |
| 1082 | * the STPTLDARNI register with the RNi of the device | 1066 | * the STPTLDARNI register with the RNi of the device |
| 1083 | */ | 1067 | */ |
| 1084 | scic_remote_device_get_protocols(sci_dev, &protocols); | 1068 | if ((dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) && |
| 1085 | 1069 | sci_dev->is_direct_attached) | |
| 1086 | if (protocols.u.bits.attached_stp_target == 1 && | ||
| 1087 | sci_dev->is_direct_attached) { | ||
| 1088 | scic_sds_port_setup_transports(sci_dev->owning_port, | 1070 | scic_sds_port_setup_transports(sci_dev->owning_port, |
| 1089 | rnc->remote_node_index); | 1071 | rnc->remote_node_index); |
| 1090 | } | ||
| 1091 | 1072 | ||
| 1092 | scic_sds_remote_device_post_request(sci_dev, SCU_CONTEXT_COMMAND_POST_RNC_RESUME); | 1073 | scic_sds_remote_device_post_request(sci_dev, SCU_CONTEXT_COMMAND_POST_RNC_RESUME); |
| 1093 | } | 1074 | } |
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c index ff5c05a19543..281a556f5eeb 100644 --- a/drivers/scsi/isci/request.c +++ b/drivers/scsi/isci/request.c | |||
| @@ -175,7 +175,6 @@ static enum sci_status isci_io_request_build( | |||
| 175 | struct isci_request *request, | 175 | struct isci_request *request, |
| 176 | struct isci_remote_device *isci_device) | 176 | struct isci_remote_device *isci_device) |
| 177 | { | 177 | { |
| 178 | struct smp_discover_response_protocols dev_protocols; | ||
| 179 | enum sci_status status = SCI_SUCCESS; | 178 | enum sci_status status = SCI_SUCCESS; |
| 180 | struct sas_task *task = isci_request_access_task(request); | 179 | struct sas_task *task = isci_request_access_task(request); |
| 181 | struct scic_sds_remote_device *sci_device = &isci_device->sci; | 180 | struct scic_sds_remote_device *sci_device = &isci_device->sci; |
| @@ -228,15 +227,19 @@ static enum sci_status isci_io_request_build( | |||
| 228 | 227 | ||
| 229 | sci_object_set_association(request->sci_request_handle, request); | 228 | sci_object_set_association(request->sci_request_handle, request); |
| 230 | 229 | ||
| 231 | /* Determine protocol and call the appropriate basic constructor */ | 230 | switch (task->task_proto) { |
| 232 | scic_remote_device_get_protocols(sci_device, &dev_protocols); | 231 | case SAS_PROTOCOL_SMP: |
| 233 | if (dev_protocols.u.bits.attached_ssp_target) | 232 | status = isci_smp_request_build(request); |
| 233 | break; | ||
| 234 | case SAS_PROTOCOL_SSP: | ||
| 234 | status = isci_request_ssp_request_construct(request); | 235 | status = isci_request_ssp_request_construct(request); |
| 235 | else if (dev_protocols.u.bits.attached_stp_target) | 236 | break; |
| 237 | case SAS_PROTOCOL_SATA: | ||
| 238 | case SAS_PROTOCOL_STP: | ||
| 239 | case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP: | ||
| 236 | status = isci_request_stp_request_construct(request); | 240 | status = isci_request_stp_request_construct(request); |
| 237 | else if (dev_protocols.u.bits.attached_smp_target) | 241 | break; |
| 238 | status = isci_smp_request_build(request); | 242 | default: |
| 239 | else { | ||
| 240 | dev_warn(&isci_host->pdev->dev, | 243 | dev_warn(&isci_host->pdev->dev, |
| 241 | "%s: unknown protocol\n", __func__); | 244 | "%s: unknown protocol\n", __func__); |
| 242 | return SCI_FAILURE; | 245 | return SCI_FAILURE; |
diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index e011d668949d..c6f1ffd713a8 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c | |||
| @@ -273,15 +273,14 @@ static enum sci_status isci_task_request_build( | |||
| 273 | enum sci_status status = SCI_FAILURE; | 273 | enum sci_status status = SCI_FAILURE; |
| 274 | struct isci_request *request = NULL; | 274 | struct isci_request *request = NULL; |
| 275 | struct isci_remote_device *isci_device; | 275 | struct isci_remote_device *isci_device; |
| 276 | /* struct sci_sas_identify_address_frame_protocols dev_protocols; */ | 276 | struct domain_device *dev; |
| 277 | struct smp_discover_response_protocols dev_protocols; | ||
| 278 | |||
| 279 | 277 | ||
| 280 | dev_dbg(&isci_host->pdev->dev, | 278 | dev_dbg(&isci_host->pdev->dev, |
| 281 | "%s: isci_tmf = %p\n", __func__, isci_tmf); | 279 | "%s: isci_tmf = %p\n", __func__, isci_tmf); |
| 282 | 280 | ||
| 283 | isci_device = isci_tmf->device; | 281 | isci_device = isci_tmf->device; |
| 284 | sci_device = &isci_device->sci; | 282 | sci_device = &isci_device->sci; |
| 283 | dev = isci_device->domain_dev; | ||
| 285 | 284 | ||
| 286 | /* do common allocation and init of request object. */ | 285 | /* do common allocation and init of request object. */ |
| 287 | status = isci_request_alloc_tmf( | 286 | status = isci_request_alloc_tmf( |
| @@ -319,16 +318,8 @@ static enum sci_status isci_task_request_build( | |||
| 319 | request | 318 | request |
| 320 | ); | 319 | ); |
| 321 | 320 | ||
| 322 | scic_remote_device_get_protocols( | 321 | /* XXX convert to get this from task->tproto like other drivers */ |
| 323 | sci_device, | 322 | if (dev->dev_type == SAS_END_DEV) { |
| 324 | &dev_protocols | ||
| 325 | ); | ||
| 326 | |||
| 327 | /* let the core do it's protocol | ||
| 328 | * specific construction. | ||
| 329 | */ | ||
| 330 | if (dev_protocols.u.bits.attached_ssp_target) { | ||
| 331 | |||
| 332 | isci_tmf->proto = SAS_PROTOCOL_SSP; | 323 | isci_tmf->proto = SAS_PROTOCOL_SSP; |
| 333 | status = scic_task_request_construct_ssp( | 324 | status = scic_task_request_construct_ssp( |
| 334 | request->sci_request_handle | 325 | request->sci_request_handle |
| @@ -337,8 +328,7 @@ static enum sci_status isci_task_request_build( | |||
| 337 | goto errout; | 328 | goto errout; |
| 338 | } | 329 | } |
| 339 | 330 | ||
| 340 | if (dev_protocols.u.bits.attached_stp_target) { | 331 | if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) { |
| 341 | |||
| 342 | isci_tmf->proto = SAS_PROTOCOL_SATA; | 332 | isci_tmf->proto = SAS_PROTOCOL_SATA; |
| 343 | status = isci_sata_management_task_request_build(request); | 333 | status = isci_sata_management_task_request_build(request); |
| 344 | 334 | ||
