aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/port.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/isci/port.c')
-rw-r--r--drivers/scsi/isci/port.c61
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 */
696static void scic_sds_port_construct_dummy_task(struct scic_sds_port *sci_port, u16 tag) 696static 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 */
1120static void scic_sds_port_post_dummy_request(struct scic_sds_port *sci_port) 1106static 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)
1145static void scic_sds_port_abort_dummy_request(struct scic_sds_port *sci_port) 1130static 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