diff options
Diffstat (limited to 'drivers/scsi/isci/port.c')
-rw-r--r-- | drivers/scsi/isci/port.c | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/drivers/scsi/isci/port.c b/drivers/scsi/isci/port.c index 5f4a4e3954db..0e84e29335dd 100644 --- a/drivers/scsi/isci/port.c +++ b/drivers/scsi/isci/port.c | |||
@@ -695,35 +695,21 @@ static void scic_sds_port_construct_dummy_rnc(struct scic_sds_port *sci_port, u1 | |||
695 | */ | 695 | */ |
696 | static void scic_sds_port_construct_dummy_task(struct scic_sds_port *sci_port, u16 tag) | 696 | static void scic_sds_port_construct_dummy_task(struct scic_sds_port *sci_port, u16 tag) |
697 | { | 697 | { |
698 | struct scic_sds_controller *scic = sci_port->owning_controller; | ||
698 | struct scu_task_context *task_context; | 699 | struct scu_task_context *task_context; |
699 | 700 | ||
700 | task_context = scic_sds_controller_get_task_context_buffer(sci_port->owning_controller, tag); | 701 | task_context = &scic->task_context_table[ISCI_TAG_TCI(tag)]; |
701 | |||
702 | memset(task_context, 0, sizeof(struct scu_task_context)); | 702 | memset(task_context, 0, sizeof(struct scu_task_context)); |
703 | 703 | ||
704 | task_context->abort = 0; | ||
705 | task_context->priority = 0; | ||
706 | task_context->initiator_request = 1; | 704 | task_context->initiator_request = 1; |
707 | task_context->connection_rate = 1; | 705 | task_context->connection_rate = 1; |
708 | task_context->protocol_engine_index = 0; | ||
709 | task_context->logical_port_index = sci_port->physical_port_index; | 706 | task_context->logical_port_index = sci_port->physical_port_index; |
710 | task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_SSP; | 707 | task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_SSP; |
711 | task_context->task_index = ISCI_TAG_TCI(tag); | 708 | task_context->task_index = ISCI_TAG_TCI(tag); |
712 | task_context->valid = SCU_TASK_CONTEXT_VALID; | 709 | task_context->valid = SCU_TASK_CONTEXT_VALID; |
713 | task_context->context_type = SCU_TASK_CONTEXT_TYPE; | 710 | task_context->context_type = SCU_TASK_CONTEXT_TYPE; |
714 | |||
715 | task_context->remote_node_index = sci_port->reserved_rni; | 711 | task_context->remote_node_index = sci_port->reserved_rni; |
716 | task_context->command_code = 0; | ||
717 | |||
718 | task_context->link_layer_control = 0; | ||
719 | task_context->do_not_dma_ssp_good_response = 1; | 712 | task_context->do_not_dma_ssp_good_response = 1; |
720 | task_context->strict_ordering = 0; | ||
721 | task_context->control_frame = 0; | ||
722 | task_context->timeout_enable = 0; | ||
723 | task_context->block_guard_enable = 0; | ||
724 | |||
725 | task_context->address_modifier = 0; | ||
726 | |||
727 | task_context->task_phase = 0x01; | 713 | task_context->task_phase = 0x01; |
728 | } | 714 | } |
729 | 715 | ||
@@ -731,15 +717,15 @@ static void scic_sds_port_destroy_dummy_resources(struct scic_sds_port *sci_port | |||
731 | { | 717 | { |
732 | struct scic_sds_controller *scic = sci_port->owning_controller; | 718 | struct scic_sds_controller *scic = sci_port->owning_controller; |
733 | 719 | ||
734 | if (sci_port->reserved_tci != SCU_DUMMY_INDEX) | 720 | if (sci_port->reserved_tag != SCI_CONTROLLER_INVALID_IO_TAG) |
735 | scic_controller_free_io_tag(scic, sci_port->reserved_tci); | 721 | isci_free_tag(scic_to_ihost(scic), sci_port->reserved_tag); |
736 | 722 | ||
737 | if (sci_port->reserved_rni != SCU_DUMMY_INDEX) | 723 | if (sci_port->reserved_rni != SCU_DUMMY_INDEX) |
738 | scic_sds_remote_node_table_release_remote_node_index(&scic->available_remote_nodes, | 724 | scic_sds_remote_node_table_release_remote_node_index(&scic->available_remote_nodes, |
739 | 1, sci_port->reserved_rni); | 725 | 1, sci_port->reserved_rni); |
740 | 726 | ||
741 | sci_port->reserved_rni = SCU_DUMMY_INDEX; | 727 | sci_port->reserved_rni = SCU_DUMMY_INDEX; |
742 | sci_port->reserved_tci = SCU_DUMMY_INDEX; | 728 | sci_port->reserved_tag = SCI_CONTROLLER_INVALID_IO_TAG; |
743 | } | 729 | } |
744 | 730 | ||
745 | /** | 731 | /** |
@@ -1119,18 +1105,17 @@ scic_sds_port_suspend_port_task_scheduler(struct scic_sds_port *port) | |||
1119 | */ | 1105 | */ |
1120 | static void scic_sds_port_post_dummy_request(struct scic_sds_port *sci_port) | 1106 | static void scic_sds_port_post_dummy_request(struct scic_sds_port *sci_port) |
1121 | { | 1107 | { |
1122 | u32 command; | ||
1123 | struct scu_task_context *task_context; | ||
1124 | struct scic_sds_controller *scic = sci_port->owning_controller; | 1108 | struct scic_sds_controller *scic = sci_port->owning_controller; |
1125 | u16 tci = sci_port->reserved_tci; | 1109 | u16 tag = sci_port->reserved_tag; |
1126 | 1110 | struct scu_task_context *tc; | |
1127 | task_context = scic_sds_controller_get_task_context_buffer(scic, tci); | 1111 | u32 command; |
1128 | 1112 | ||
1129 | task_context->abort = 0; | 1113 | tc = &scic->task_context_table[ISCI_TAG_TCI(tag)]; |
1114 | tc->abort = 0; | ||
1130 | 1115 | ||
1131 | command = SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC | | 1116 | command = SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC | |
1132 | sci_port->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | | 1117 | sci_port->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | |
1133 | tci; | 1118 | ISCI_TAG_TCI(tag); |
1134 | 1119 | ||
1135 | scic_sds_controller_post_request(scic, command); | 1120 | scic_sds_controller_post_request(scic, command); |
1136 | } | 1121 | } |
@@ -1145,17 +1130,16 @@ static void scic_sds_port_post_dummy_request(struct scic_sds_port *sci_port) | |||
1145 | static void scic_sds_port_abort_dummy_request(struct scic_sds_port *sci_port) | 1130 | static void scic_sds_port_abort_dummy_request(struct scic_sds_port *sci_port) |
1146 | { | 1131 | { |
1147 | struct scic_sds_controller *scic = sci_port->owning_controller; | 1132 | struct scic_sds_controller *scic = sci_port->owning_controller; |
1148 | u16 tci = sci_port->reserved_tci; | 1133 | u16 tag = sci_port->reserved_tag; |
1149 | struct scu_task_context *tc; | 1134 | struct scu_task_context *tc; |
1150 | u32 command; | 1135 | u32 command; |
1151 | 1136 | ||
1152 | tc = scic_sds_controller_get_task_context_buffer(scic, tci); | 1137 | tc = &scic->task_context_table[ISCI_TAG_TCI(tag)]; |
1153 | |||
1154 | tc->abort = 1; | 1138 | tc->abort = 1; |
1155 | 1139 | ||
1156 | command = SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT | | 1140 | command = SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT | |
1157 | sci_port->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | | 1141 | sci_port->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | |
1158 | tci; | 1142 | ISCI_TAG_TCI(tag); |
1159 | 1143 | ||
1160 | scic_sds_controller_post_request(scic, command); | 1144 | scic_sds_controller_post_request(scic, command); |
1161 | } | 1145 | } |
@@ -1333,15 +1317,16 @@ enum sci_status scic_sds_port_start(struct scic_sds_port *sci_port) | |||
1333 | sci_port->reserved_rni = rni; | 1317 | sci_port->reserved_rni = rni; |
1334 | } | 1318 | } |
1335 | 1319 | ||
1336 | if (sci_port->reserved_tci == SCU_DUMMY_INDEX) { | 1320 | if (sci_port->reserved_tag == SCI_CONTROLLER_INVALID_IO_TAG) { |
1337 | /* Allocate a TCI and remove the sequence nibble */ | 1321 | struct isci_host *ihost = scic_to_ihost(scic); |
1338 | u16 tci = scic_controller_allocate_io_tag(scic); | 1322 | u16 tag; |
1339 | 1323 | ||
1340 | if (tci != SCU_DUMMY_INDEX) | 1324 | tag = isci_alloc_tag(ihost); |
1341 | scic_sds_port_construct_dummy_task(sci_port, tci); | 1325 | if (tag == SCI_CONTROLLER_INVALID_IO_TAG) |
1342 | else | ||
1343 | status = SCI_FAILURE_INSUFFICIENT_RESOURCES; | 1326 | status = SCI_FAILURE_INSUFFICIENT_RESOURCES; |
1344 | sci_port->reserved_tci = tci; | 1327 | else |
1328 | scic_sds_port_construct_dummy_task(sci_port, tag); | ||
1329 | sci_port->reserved_tag = tag; | ||
1345 | } | 1330 | } |
1346 | 1331 | ||
1347 | if (status == SCI_SUCCESS) { | 1332 | if (status == SCI_SUCCESS) { |
@@ -1859,7 +1844,7 @@ void scic_sds_port_construct(struct scic_sds_port *sci_port, u8 index, | |||
1859 | sci_port->assigned_device_count = 0; | 1844 | sci_port->assigned_device_count = 0; |
1860 | 1845 | ||
1861 | sci_port->reserved_rni = SCU_DUMMY_INDEX; | 1846 | sci_port->reserved_rni = SCU_DUMMY_INDEX; |
1862 | sci_port->reserved_tci = SCU_DUMMY_INDEX; | 1847 | sci_port->reserved_tag = SCI_CONTROLLER_INVALID_IO_TAG; |
1863 | 1848 | ||
1864 | sci_init_timer(&sci_port->timer, port_timeout); | 1849 | sci_init_timer(&sci_port->timer, port_timeout); |
1865 | 1850 | ||