Lines Matching refs:ihost

181 static bool sci_controller_completion_queue_has_entries(struct isci_host *ihost)  in sci_controller_completion_queue_has_entries()  argument
183 u32 get_value = ihost->completion_queue_get; in sci_controller_completion_queue_has_entries()
187 COMPLETION_QUEUE_CYCLE_BIT(ihost->completion_queue[get_index])) in sci_controller_completion_queue_has_entries()
193 static bool sci_controller_isr(struct isci_host *ihost) in sci_controller_isr() argument
195 if (sci_controller_completion_queue_has_entries(ihost)) in sci_controller_isr()
202 writel(SMU_ISR_COMPLETION, &ihost->smu_registers->interrupt_status); in sci_controller_isr()
210 spin_lock(&ihost->scic_lock); in sci_controller_isr()
211 if (test_bit(IHOST_IRQ_ENABLED, &ihost->flags)) { in sci_controller_isr()
212 writel(0xFF000000, &ihost->smu_registers->interrupt_mask); in sci_controller_isr()
213 writel(0, &ihost->smu_registers->interrupt_mask); in sci_controller_isr()
215 spin_unlock(&ihost->scic_lock); in sci_controller_isr()
222 struct isci_host *ihost = data; in isci_msix_isr() local
224 if (sci_controller_isr(ihost)) in isci_msix_isr()
225 tasklet_schedule(&ihost->completion_tasklet); in isci_msix_isr()
230 static bool sci_controller_error_isr(struct isci_host *ihost) in sci_controller_error_isr() argument
235 readl(&ihost->smu_registers->interrupt_status); in sci_controller_error_isr()
251 writel(0xff, &ihost->smu_registers->interrupt_mask); in sci_controller_error_isr()
252 writel(0, &ihost->smu_registers->interrupt_mask); in sci_controller_error_isr()
257 static void sci_controller_task_completion(struct isci_host *ihost, u32 ent) in sci_controller_task_completion() argument
260 struct isci_request *ireq = ihost->reqs[index]; in sci_controller_task_completion()
265 ISCI_TAG_SEQ(ireq->io_tag) == ihost->io_request_sequence[index]) in sci_controller_task_completion()
272 static void sci_controller_sdma_completion(struct isci_host *ihost, u32 ent) in sci_controller_sdma_completion() argument
283 ireq = ihost->reqs[index]; in sci_controller_sdma_completion()
284 dev_warn(&ihost->pdev->dev, "%s: %x for io request %p\n", in sci_controller_sdma_completion()
293 idev = ihost->device_table[index]; in sci_controller_sdma_completion()
294 dev_warn(&ihost->pdev->dev, "%s: %x for device %p\n", in sci_controller_sdma_completion()
301 dev_warn(&ihost->pdev->dev, "%s: unknown completion type %x\n", in sci_controller_sdma_completion()
307 static void sci_controller_unsolicited_frame(struct isci_host *ihost, u32 ent) in sci_controller_unsolicited_frame() argument
320 frame_header = ihost->uf_control.buffers.array[frame_index].header; in sci_controller_unsolicited_frame()
321 ihost->uf_control.buffers.array[frame_index].state = UNSOLICITED_FRAME_IN_USE; in sci_controller_unsolicited_frame()
328 sci_controller_release_frame(ihost, frame_index); in sci_controller_unsolicited_frame()
334 iphy = &ihost->phys[index]; in sci_controller_unsolicited_frame()
346 iphy = &ihost->phys[index]; in sci_controller_unsolicited_frame()
349 if (index < ihost->remote_node_entries) in sci_controller_unsolicited_frame()
350 idev = ihost->device_table[index]; in sci_controller_unsolicited_frame()
357 sci_controller_release_frame(ihost, frame_index); in sci_controller_unsolicited_frame()
368 static void sci_controller_event_completion(struct isci_host *ihost, u32 ent) in sci_controller_event_completion() argument
380 dev_err(&ihost->pdev->dev, in sci_controller_event_completion()
384 ihost, in sci_controller_event_completion()
394 dev_err(&ihost->pdev->dev, in sci_controller_event_completion()
398 ihost, in sci_controller_event_completion()
403 ireq = ihost->reqs[index]; in sci_controller_event_completion()
411 ireq = ihost->reqs[index]; in sci_controller_event_completion()
415 dev_warn(&ihost->pdev->dev, in sci_controller_event_completion()
420 ihost, in sci_controller_event_completion()
426 idev = ihost->device_table[index]; in sci_controller_event_completion()
430 dev_warn(&ihost->pdev->dev, in sci_controller_event_completion()
435 ihost, in sci_controller_event_completion()
452 iphy = &ihost->phys[index]; in sci_controller_event_completion()
459 if (index < ihost->remote_node_entries) { in sci_controller_event_completion()
460 idev = ihost->device_table[index]; in sci_controller_event_completion()
465 dev_err(&ihost->pdev->dev, in sci_controller_event_completion()
470 ihost, in sci_controller_event_completion()
477 dev_warn(&ihost->pdev->dev, in sci_controller_event_completion()
485 static void sci_controller_process_completions(struct isci_host *ihost) in sci_controller_process_completions() argument
494 dev_dbg(&ihost->pdev->dev, in sci_controller_process_completions()
497 ihost->completion_queue_get); in sci_controller_process_completions()
500 get_index = NORMALIZE_GET_POINTER(ihost->completion_queue_get); in sci_controller_process_completions()
501 get_cycle = SMU_CQGR_CYCLE_BIT & ihost->completion_queue_get; in sci_controller_process_completions()
503 event_get = NORMALIZE_EVENT_POINTER(ihost->completion_queue_get); in sci_controller_process_completions()
504 event_cycle = SMU_CQGR_EVENT_CYCLE_BIT & ihost->completion_queue_get; in sci_controller_process_completions()
508 == COMPLETION_QUEUE_CYCLE_BIT(ihost->completion_queue[get_index]) in sci_controller_process_completions()
512 ent = ihost->completion_queue[get_index]; in sci_controller_process_completions()
519 dev_dbg(&ihost->pdev->dev, in sci_controller_process_completions()
526 sci_controller_task_completion(ihost, ent); in sci_controller_process_completions()
530 sci_controller_sdma_completion(ihost, ent); in sci_controller_process_completions()
534 sci_controller_unsolicited_frame(ihost, ent); in sci_controller_process_completions()
538 sci_controller_event_completion(ihost, ent); in sci_controller_process_completions()
546 sci_controller_event_completion(ihost, ent); in sci_controller_process_completions()
550 dev_warn(&ihost->pdev->dev, in sci_controller_process_completions()
561 ihost->completion_queue_get = in sci_controller_process_completions()
569 writel(ihost->completion_queue_get, in sci_controller_process_completions()
570 &ihost->smu_registers->completion_queue_get); in sci_controller_process_completions()
574 dev_dbg(&ihost->pdev->dev, in sci_controller_process_completions()
577 ihost->completion_queue_get); in sci_controller_process_completions()
581 static void sci_controller_error_handler(struct isci_host *ihost) in sci_controller_error_handler() argument
586 readl(&ihost->smu_registers->interrupt_status); in sci_controller_error_handler()
589 sci_controller_completion_queue_has_entries(ihost)) { in sci_controller_error_handler()
591 sci_controller_process_completions(ihost); in sci_controller_error_handler()
592 writel(SMU_ISR_QUEUE_SUSPEND, &ihost->smu_registers->interrupt_status); in sci_controller_error_handler()
594 dev_err(&ihost->pdev->dev, "%s: status: %#x\n", __func__, in sci_controller_error_handler()
597 sci_change_state(&ihost->sm, SCIC_FAILED); in sci_controller_error_handler()
605 writel(0, &ihost->smu_registers->interrupt_mask); in sci_controller_error_handler()
611 struct isci_host *ihost = data; in isci_intx_isr() local
613 if (sci_controller_isr(ihost)) { in isci_intx_isr()
614 writel(SMU_ISR_COMPLETION, &ihost->smu_registers->interrupt_status); in isci_intx_isr()
615 tasklet_schedule(&ihost->completion_tasklet); in isci_intx_isr()
617 } else if (sci_controller_error_isr(ihost)) { in isci_intx_isr()
618 spin_lock(&ihost->scic_lock); in isci_intx_isr()
619 sci_controller_error_handler(ihost); in isci_intx_isr()
620 spin_unlock(&ihost->scic_lock); in isci_intx_isr()
629 struct isci_host *ihost = data; in isci_error_isr() local
631 if (sci_controller_error_isr(ihost)) in isci_error_isr()
632 sci_controller_error_handler(ihost); in isci_error_isr()
645 static void isci_host_start_complete(struct isci_host *ihost, enum sci_status completion_status) in isci_host_start_complete() argument
648 dev_info(&ihost->pdev->dev, in isci_host_start_complete()
650 clear_bit(IHOST_START_PENDING, &ihost->flags); in isci_host_start_complete()
651 wake_up(&ihost->eventq); in isci_host_start_complete()
657 struct isci_host *ihost = ha->lldd_ha; in isci_host_scan_finished() local
659 if (test_bit(IHOST_START_PENDING, &ihost->flags)) in isci_host_scan_finished()
679 static u32 sci_controller_get_suggested_start_timeout(struct isci_host *ihost) in sci_controller_get_suggested_start_timeout() argument
682 if (!ihost) in sci_controller_get_suggested_start_timeout()
704 static void sci_controller_enable_interrupts(struct isci_host *ihost) in sci_controller_enable_interrupts() argument
706 set_bit(IHOST_IRQ_ENABLED, &ihost->flags); in sci_controller_enable_interrupts()
707 writel(0, &ihost->smu_registers->interrupt_mask); in sci_controller_enable_interrupts()
710 void sci_controller_disable_interrupts(struct isci_host *ihost) in sci_controller_disable_interrupts() argument
712 clear_bit(IHOST_IRQ_ENABLED, &ihost->flags); in sci_controller_disable_interrupts()
713 writel(0xffffffff, &ihost->smu_registers->interrupt_mask); in sci_controller_disable_interrupts()
714 readl(&ihost->smu_registers->interrupt_mask); /* flush */ in sci_controller_disable_interrupts()
717 static void sci_controller_enable_port_task_scheduler(struct isci_host *ihost) in sci_controller_enable_port_task_scheduler() argument
722 readl(&ihost->scu_registers->peg0.ptsg.control); in sci_controller_enable_port_task_scheduler()
727 &ihost->scu_registers->peg0.ptsg.control); in sci_controller_enable_port_task_scheduler()
730 static void sci_controller_assign_task_entries(struct isci_host *ihost) in sci_controller_assign_task_entries() argument
740 readl(&ihost->smu_registers->task_context_assignment[0]); in sci_controller_assign_task_entries()
743 (SMU_TCA_GEN_VAL(ENDING, ihost->task_context_entries - 1)) | in sci_controller_assign_task_entries()
747 &ihost->smu_registers->task_context_assignment[0]); in sci_controller_assign_task_entries()
751 static void sci_controller_initialize_completion_queue(struct isci_host *ihost) in sci_controller_initialize_completion_queue() argument
758 ihost->completion_queue_get = 0; in sci_controller_initialize_completion_queue()
765 &ihost->smu_registers->completion_queue_control); in sci_controller_initialize_completion_queue()
777 &ihost->smu_registers->completion_queue_get); in sci_controller_initialize_completion_queue()
786 &ihost->smu_registers->completion_queue_put); in sci_controller_initialize_completion_queue()
794 ihost->completion_queue[index] = 0x80000000; in sci_controller_initialize_completion_queue()
798 static void sci_controller_initialize_unsolicited_frame_queue(struct isci_host *ihost) in sci_controller_initialize_unsolicited_frame_queue() argument
809 &ihost->scu_registers->sdma.unsolicited_frame_queue_control); in sci_controller_initialize_unsolicited_frame_queue()
818 &ihost->scu_registers->sdma.unsolicited_frame_get_pointer); in sci_controller_initialize_unsolicited_frame_queue()
822 &ihost->scu_registers->sdma.unsolicited_frame_put_pointer); in sci_controller_initialize_unsolicited_frame_queue()
825 void sci_controller_transition_to_ready(struct isci_host *ihost, enum sci_status status) in sci_controller_transition_to_ready() argument
827 if (ihost->sm.current_state_id == SCIC_STARTING) { in sci_controller_transition_to_ready()
832 sci_change_state(&ihost->sm, SCIC_READY); in sci_controller_transition_to_ready()
834 isci_host_start_complete(ihost, status); in sci_controller_transition_to_ready()
861 bool is_controller_start_complete(struct isci_host *ihost) in is_controller_start_complete() argument
866 struct isci_phy *iphy = &ihost->phys[i]; in is_controller_start_complete()
873 if (is_port_config_apc(ihost)) in is_controller_start_complete()
887 (ihost->port_agent.phy_ready_mask != ihost->port_agent.phy_configured_mask)) in is_controller_start_complete()
902 static enum sci_status sci_controller_start_next_phy(struct isci_host *ihost) in sci_controller_start_next_phy() argument
904 struct sci_oem_params *oem = &ihost->oem_parameters; in sci_controller_start_next_phy()
910 if (ihost->phy_startup_timer_pending) in sci_controller_start_next_phy()
913 if (ihost->next_phy_to_start >= SCI_MAX_PHYS) { in sci_controller_start_next_phy()
914 if (is_controller_start_complete(ihost)) { in sci_controller_start_next_phy()
915 sci_controller_transition_to_ready(ihost, SCI_SUCCESS); in sci_controller_start_next_phy()
916 sci_del_timer(&ihost->phy_timer); in sci_controller_start_next_phy()
917 ihost->phy_startup_timer_pending = false; in sci_controller_start_next_phy()
920 iphy = &ihost->phys[ihost->next_phy_to_start]; in sci_controller_start_next_phy()
924 ihost->next_phy_to_start++; in sci_controller_start_next_phy()
935 return sci_controller_start_next_phy(ihost); in sci_controller_start_next_phy()
942 sci_mod_timer(&ihost->phy_timer, in sci_controller_start_next_phy()
944 ihost->phy_startup_timer_pending = true; in sci_controller_start_next_phy()
946 dev_warn(&ihost->pdev->dev, in sci_controller_start_next_phy()
951 ihost->phys[ihost->next_phy_to_start].phy_index, in sci_controller_start_next_phy()
955 ihost->next_phy_to_start++; in sci_controller_start_next_phy()
964 struct isci_host *ihost = container_of(tmr, typeof(*ihost), phy_timer); in phy_startup_timeout() local
968 spin_lock_irqsave(&ihost->scic_lock, flags); in phy_startup_timeout()
973 ihost->phy_startup_timer_pending = false; in phy_startup_timeout()
976 status = sci_controller_start_next_phy(ihost); in phy_startup_timeout()
980 spin_unlock_irqrestore(&ihost->scic_lock, flags); in phy_startup_timeout()
983 static u16 isci_tci_active(struct isci_host *ihost) in isci_tci_active() argument
985 return CIRC_CNT(ihost->tci_head, ihost->tci_tail, SCI_MAX_IO_REQUESTS); in isci_tci_active()
988 static enum sci_status sci_controller_start(struct isci_host *ihost, in sci_controller_start() argument
994 if (ihost->sm.current_state_id != SCIC_INITIALIZED) { in sci_controller_start()
995 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_start()
996 __func__, ihost->sm.current_state_id); in sci_controller_start()
1001 BUILD_BUG_ON(SCI_MAX_IO_REQUESTS > 1 << sizeof(ihost->tci_pool[0]) * 8); in sci_controller_start()
1002 ihost->tci_head = 0; in sci_controller_start()
1003 ihost->tci_tail = 0; in sci_controller_start()
1004 for (index = 0; index < ihost->task_context_entries; index++) in sci_controller_start()
1005 isci_tci_free(ihost, index); in sci_controller_start()
1008 sci_remote_node_table_initialize(&ihost->available_remote_nodes, in sci_controller_start()
1009 ihost->remote_node_entries); in sci_controller_start()
1015 sci_controller_disable_interrupts(ihost); in sci_controller_start()
1018 sci_controller_enable_port_task_scheduler(ihost); in sci_controller_start()
1021 sci_controller_assign_task_entries(ihost); in sci_controller_start()
1024 sci_controller_initialize_completion_queue(ihost); in sci_controller_start()
1027 sci_controller_initialize_unsolicited_frame_queue(ihost); in sci_controller_start()
1030 for (index = 0; index < ihost->logical_port_entries; index++) { in sci_controller_start()
1031 struct isci_port *iport = &ihost->ports[index]; in sci_controller_start()
1038 sci_controller_start_next_phy(ihost); in sci_controller_start()
1040 sci_mod_timer(&ihost->timer, timeout); in sci_controller_start()
1042 sci_change_state(&ihost->sm, SCIC_STARTING); in sci_controller_start()
1049 struct isci_host *ihost = SHOST_TO_SAS_HA(shost)->lldd_ha; in isci_host_start() local
1050 unsigned long tmo = sci_controller_get_suggested_start_timeout(ihost); in isci_host_start()
1052 set_bit(IHOST_START_PENDING, &ihost->flags); in isci_host_start()
1054 spin_lock_irq(&ihost->scic_lock); in isci_host_start()
1055 sci_controller_start(ihost, tmo); in isci_host_start()
1056 sci_controller_enable_interrupts(ihost); in isci_host_start()
1057 spin_unlock_irq(&ihost->scic_lock); in isci_host_start()
1060 static void isci_host_stop_complete(struct isci_host *ihost) in isci_host_stop_complete() argument
1062 sci_controller_disable_interrupts(ihost); in isci_host_stop_complete()
1063 clear_bit(IHOST_STOP_PENDING, &ihost->flags); in isci_host_stop_complete()
1064 wake_up(&ihost->eventq); in isci_host_stop_complete()
1067 static void sci_controller_completion_handler(struct isci_host *ihost) in sci_controller_completion_handler() argument
1070 if (sci_controller_completion_queue_has_entries(ihost)) in sci_controller_completion_handler()
1071 sci_controller_process_completions(ihost); in sci_controller_completion_handler()
1074 writel(SMU_ISR_COMPLETION, &ihost->smu_registers->interrupt_status); in sci_controller_completion_handler()
1076 writel(0xFF000000, &ihost->smu_registers->interrupt_mask); in sci_controller_completion_handler()
1077 writel(0, &ihost->smu_registers->interrupt_mask); in sci_controller_completion_handler()
1080 void ireq_done(struct isci_host *ihost, struct isci_request *ireq, struct sas_task *task) in ireq_done() argument
1086 dev_dbg(&ihost->pdev->dev, in ireq_done()
1092 dev_dbg(&ihost->pdev->dev, in ireq_done()
1103 wake_up_all(&ihost->eventq); in ireq_done()
1106 isci_free_tag(ihost, ireq->io_tag); in ireq_done()
1118 struct isci_host *ihost = (struct isci_host *)data; in isci_host_completion_routine() local
1121 spin_lock_irq(&ihost->scic_lock); in isci_host_completion_routine()
1122 sci_controller_completion_handler(ihost); in isci_host_completion_routine()
1123 spin_unlock_irq(&ihost->scic_lock); in isci_host_completion_routine()
1129 active = isci_tci_active(ihost) - SCI_MAX_PORTS; in isci_host_completion_routine()
1137 &ihost->smu_registers->interrupt_coalesce_control); in isci_host_completion_routine()
1158 static enum sci_status sci_controller_stop(struct isci_host *ihost, u32 timeout) in sci_controller_stop() argument
1160 if (ihost->sm.current_state_id != SCIC_READY) { in sci_controller_stop()
1161 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_stop()
1162 __func__, ihost->sm.current_state_id); in sci_controller_stop()
1166 sci_mod_timer(&ihost->timer, timeout); in sci_controller_stop()
1167 sci_change_state(&ihost->sm, SCIC_STOPPING); in sci_controller_stop()
1183 static enum sci_status sci_controller_reset(struct isci_host *ihost) in sci_controller_reset() argument
1185 switch (ihost->sm.current_state_id) { in sci_controller_reset()
1194 sci_change_state(&ihost->sm, SCIC_RESETTING); in sci_controller_reset()
1197 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_reset()
1198 __func__, ihost->sm.current_state_id); in sci_controller_reset()
1203 static enum sci_status sci_controller_stop_phys(struct isci_host *ihost) in sci_controller_stop_phys() argument
1212 phy_status = sci_phy_stop(&ihost->phys[index]); in sci_controller_stop_phys()
1218 dev_warn(&ihost->pdev->dev, in sci_controller_stop_phys()
1222 ihost->phys[index].phy_index, phy_status); in sci_controller_stop_phys()
1241 void isci_host_deinit(struct isci_host *ihost) in isci_host_deinit() argument
1246 for (i = 0; i < isci_gpio_count(ihost); i++) in isci_host_deinit()
1247 writel(SGPIO_HW_CONTROL, &ihost->scu_registers->peg0.sgpio.output_data_select[i]); in isci_host_deinit()
1249 set_bit(IHOST_STOP_PENDING, &ihost->flags); in isci_host_deinit()
1251 spin_lock_irq(&ihost->scic_lock); in isci_host_deinit()
1252 sci_controller_stop(ihost, SCIC_CONTROLLER_STOP_TIMEOUT); in isci_host_deinit()
1253 spin_unlock_irq(&ihost->scic_lock); in isci_host_deinit()
1255 wait_for_stop(ihost); in isci_host_deinit()
1262 sci_controller_stop_phys(ihost); in isci_host_deinit()
1267 writel(0, &ihost->scu_registers->peg0.sgpio.interface_control); in isci_host_deinit()
1269 spin_lock_irq(&ihost->scic_lock); in isci_host_deinit()
1270 sci_controller_reset(ihost); in isci_host_deinit()
1271 spin_unlock_irq(&ihost->scic_lock); in isci_host_deinit()
1274 for (i = 0; i < ihost->logical_port_entries; i++) { in isci_host_deinit()
1275 struct isci_port *iport = &ihost->ports[i]; in isci_host_deinit()
1281 struct isci_phy *iphy = &ihost->phys[i]; in isci_host_deinit()
1285 del_timer_sync(&ihost->port_agent.timer.timer); in isci_host_deinit()
1287 del_timer_sync(&ihost->power_control.timer.timer); in isci_host_deinit()
1289 del_timer_sync(&ihost->timer.timer); in isci_host_deinit()
1291 del_timer_sync(&ihost->phy_timer.timer); in isci_host_deinit()
1312 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_initial_state_enter() local
1314 sci_change_state(&ihost->sm, SCIC_RESET); in sci_controller_initial_state_enter()
1319 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_starting_state_exit() local
1321 sci_del_timer(&ihost->timer); in sci_controller_starting_state_exit()
1349 sci_controller_set_interrupt_coalescence(struct isci_host *ihost, in sci_controller_set_interrupt_coalescence() argument
1434 &ihost->smu_registers->interrupt_coalesce_control); in sci_controller_set_interrupt_coalescence()
1437 ihost->interrupt_coalesce_number = (u16)coalesce_number; in sci_controller_set_interrupt_coalescence()
1438 ihost->interrupt_coalesce_timeout = coalesce_timeout / 100; in sci_controller_set_interrupt_coalescence()
1446 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_ready_state_enter() local
1450 val = readl(&ihost->smu_registers->clock_gating_control); in sci_controller_ready_state_enter()
1455 writel(val, &ihost->smu_registers->clock_gating_control); in sci_controller_ready_state_enter()
1458 sci_controller_set_interrupt_coalescence(ihost, 0, 0); in sci_controller_ready_state_enter()
1463 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_ready_state_exit() local
1466 sci_controller_set_interrupt_coalescence(ihost, 0, 0); in sci_controller_ready_state_exit()
1469 static enum sci_status sci_controller_stop_ports(struct isci_host *ihost) in sci_controller_stop_ports() argument
1475 for (index = 0; index < ihost->logical_port_entries; index++) { in sci_controller_stop_ports()
1476 struct isci_port *iport = &ihost->ports[index]; in sci_controller_stop_ports()
1484 dev_warn(&ihost->pdev->dev, in sci_controller_stop_ports()
1496 static enum sci_status sci_controller_stop_devices(struct isci_host *ihost) in sci_controller_stop_devices() argument
1504 for (index = 0; index < ihost->remote_node_entries; index++) { in sci_controller_stop_devices()
1505 if (ihost->device_table[index] != NULL) { in sci_controller_stop_devices()
1507 device_status = sci_remote_device_stop(ihost->device_table[index], 0); in sci_controller_stop_devices()
1511 dev_warn(&ihost->pdev->dev, in sci_controller_stop_devices()
1516 ihost->device_table[index], device_status); in sci_controller_stop_devices()
1526 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_stopping_state_enter() local
1528 sci_controller_stop_devices(ihost); in sci_controller_stopping_state_enter()
1529 sci_controller_stop_ports(ihost); in sci_controller_stopping_state_enter()
1531 if (!sci_controller_has_remote_devices_stopping(ihost)) in sci_controller_stopping_state_enter()
1532 isci_host_stop_complete(ihost); in sci_controller_stopping_state_enter()
1537 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_stopping_state_exit() local
1539 sci_del_timer(&ihost->timer); in sci_controller_stopping_state_exit()
1542 static void sci_controller_reset_hardware(struct isci_host *ihost) in sci_controller_reset_hardware() argument
1545 sci_controller_disable_interrupts(ihost); in sci_controller_reset_hardware()
1548 writel(0xFFFFFFFF, &ihost->smu_registers->soft_reset_control); in sci_controller_reset_hardware()
1554 writel(0x00000000, &ihost->smu_registers->completion_queue_get); in sci_controller_reset_hardware()
1557 writel(0, &ihost->scu_registers->sdma.unsolicited_frame_get_pointer); in sci_controller_reset_hardware()
1560 writel(~SMU_INTERRUPT_STATUS_RESERVED_MASK, &ihost->smu_registers->interrupt_status); in sci_controller_reset_hardware()
1565 struct isci_host *ihost = container_of(sm, typeof(*ihost), sm); in sci_controller_resetting_state_enter() local
1567 sci_controller_reset_hardware(ihost); in sci_controller_resetting_state_enter()
1568 sci_change_state(&ihost->sm, SCIC_RESET); in sci_controller_resetting_state_enter()
1598 struct isci_host *ihost = container_of(tmr, typeof(*ihost), timer); in controller_timeout() local
1599 struct sci_base_state_machine *sm = &ihost->sm; in controller_timeout()
1602 spin_lock_irqsave(&ihost->scic_lock, flags); in controller_timeout()
1608 sci_controller_transition_to_ready(ihost, SCI_FAILURE_TIMEOUT); in controller_timeout()
1611 isci_host_stop_complete(ihost); in controller_timeout()
1613 dev_err(&ihost->pdev->dev, in controller_timeout()
1619 spin_unlock_irqrestore(&ihost->scic_lock, flags); in controller_timeout()
1622 static enum sci_status sci_controller_construct(struct isci_host *ihost, in sci_controller_construct() argument
1628 sci_init_sm(&ihost->sm, sci_controller_state_table, SCIC_INITIAL); in sci_controller_construct()
1630 ihost->scu_registers = scu_base; in sci_controller_construct()
1631 ihost->smu_registers = smu_base; in sci_controller_construct()
1633 sci_port_configuration_agent_construct(&ihost->port_agent); in sci_controller_construct()
1637 sci_port_construct(&ihost->ports[i], i, ihost); in sci_controller_construct()
1638 sci_port_construct(&ihost->ports[i], SCIC_SDS_DUMMY_PORT, ihost); in sci_controller_construct()
1643 sci_phy_construct(&ihost->phys[i], in sci_controller_construct()
1644 &ihost->ports[SCI_MAX_PORTS], i); in sci_controller_construct()
1647 ihost->invalid_phy_mask = 0; in sci_controller_construct()
1649 sci_init_timer(&ihost->timer, controller_timeout); in sci_controller_construct()
1651 return sci_controller_reset(ihost); in sci_controller_construct()
1730 static u8 max_spin_up(struct isci_host *ihost) in max_spin_up() argument
1732 if (ihost->user_parameters.max_concurr_spinup) in max_spin_up()
1733 return min_t(u8, ihost->user_parameters.max_concurr_spinup, in max_spin_up()
1736 return min_t(u8, ihost->oem_parameters.controller.max_concurr_spin_up, in max_spin_up()
1743 struct isci_host *ihost = container_of(tmr, typeof(*ihost), power_control.timer); in power_control_timeout() local
1748 spin_lock_irqsave(&ihost->scic_lock, flags); in power_control_timeout()
1753 ihost->power_control.phys_granted_power = 0; in power_control_timeout()
1755 if (ihost->power_control.phys_waiting == 0) { in power_control_timeout()
1756 ihost->power_control.timer_started = false; in power_control_timeout()
1762 if (ihost->power_control.phys_waiting == 0) in power_control_timeout()
1765 iphy = ihost->power_control.requesters[i]; in power_control_timeout()
1769 if (ihost->power_control.phys_granted_power >= max_spin_up(ihost)) in power_control_timeout()
1772 ihost->power_control.requesters[i] = NULL; in power_control_timeout()
1773 ihost->power_control.phys_waiting--; in power_control_timeout()
1774 ihost->power_control.phys_granted_power++; in power_control_timeout()
1781 struct isci_phy *requester = ihost->power_control.requesters[j]; in power_control_timeout()
1794 ihost->power_control.requesters[j] = NULL; in power_control_timeout()
1795 ihost->power_control.phys_waiting--; in power_control_timeout()
1808 ihost->power_control.timer_started = true; in power_control_timeout()
1811 spin_unlock_irqrestore(&ihost->scic_lock, flags); in power_control_timeout()
1814 void sci_controller_power_control_queue_insert(struct isci_host *ihost, in sci_controller_power_control_queue_insert() argument
1819 if (ihost->power_control.phys_granted_power < max_spin_up(ihost)) { in sci_controller_power_control_queue_insert()
1820 ihost->power_control.phys_granted_power++; in sci_controller_power_control_queue_insert()
1827 if (ihost->power_control.timer_started) in sci_controller_power_control_queue_insert()
1828 sci_del_timer(&ihost->power_control.timer); in sci_controller_power_control_queue_insert()
1830 sci_mod_timer(&ihost->power_control.timer, in sci_controller_power_control_queue_insert()
1832 ihost->power_control.timer_started = true; in sci_controller_power_control_queue_insert()
1844 current_phy = &ihost->phys[i]; in sci_controller_power_control_queue_insert()
1860 ihost->power_control.requesters[iphy->phy_index] = iphy; in sci_controller_power_control_queue_insert()
1861 ihost->power_control.phys_waiting++; in sci_controller_power_control_queue_insert()
1866 void sci_controller_power_control_queue_remove(struct isci_host *ihost, in sci_controller_power_control_queue_remove() argument
1871 if (ihost->power_control.requesters[iphy->phy_index]) in sci_controller_power_control_queue_remove()
1872 ihost->power_control.phys_waiting--; in sci_controller_power_control_queue_remove()
1874 ihost->power_control.requesters[iphy->phy_index] = NULL; in sci_controller_power_control_queue_remove()
1895 static unsigned char *to_cable_select(struct isci_host *ihost) in to_cable_select() argument
1899 + ihost->id; in to_cable_select()
1901 return &ihost->oem_parameters.controller.cable_selection_mask; in to_cable_select()
1904 enum cable_selections decode_cable_selection(struct isci_host *ihost, int phy) in decode_cable_selection() argument
1906 return decode_selection_byte(phy, *to_cable_select(ihost)); in decode_cable_selection()
1923 static void sci_controller_afe_initialization(struct isci_host *ihost) in sci_controller_afe_initialization() argument
1925 struct scu_afe_registers __iomem *afe = &ihost->scu_registers->afe; in sci_controller_afe_initialization()
1926 const struct sci_oem_params *oem = &ihost->oem_parameters; in sci_controller_afe_initialization()
1927 struct pci_dev *pdev = ihost->pdev; in sci_controller_afe_initialization()
1930 unsigned char cable_selection_mask = *to_cable_select(ihost); in sci_controller_afe_initialization()
2124 static void sci_controller_initialize_power_control(struct isci_host *ihost) in sci_controller_initialize_power_control() argument
2126 sci_init_timer(&ihost->power_control.timer, power_control_timeout); in sci_controller_initialize_power_control()
2128 memset(ihost->power_control.requesters, 0, in sci_controller_initialize_power_control()
2129 sizeof(ihost->power_control.requesters)); in sci_controller_initialize_power_control()
2131 ihost->power_control.phys_waiting = 0; in sci_controller_initialize_power_control()
2132 ihost->power_control.phys_granted_power = 0; in sci_controller_initialize_power_control()
2135 static enum sci_status sci_controller_initialize(struct isci_host *ihost) in sci_controller_initialize() argument
2137 struct sci_base_state_machine *sm = &ihost->sm; in sci_controller_initialize()
2141 if (ihost->sm.current_state_id != SCIC_RESET) { in sci_controller_initialize()
2142 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_initialize()
2143 __func__, ihost->sm.current_state_id); in sci_controller_initialize()
2149 sci_init_timer(&ihost->phy_timer, phy_startup_timeout); in sci_controller_initialize()
2151 ihost->next_phy_to_start = 0; in sci_controller_initialize()
2152 ihost->phy_startup_timer_pending = false; in sci_controller_initialize()
2154 sci_controller_initialize_power_control(ihost); in sci_controller_initialize()
2161 sci_controller_afe_initialization(ihost); in sci_controller_initialize()
2165 writel(0, &ihost->smu_registers->soft_reset_control); in sci_controller_initialize()
2175 status = readl(&ihost->smu_registers->control_status); in sci_controller_initialize()
2186 val = readl(&ihost->smu_registers->device_context_capacity); in sci_controller_initialize()
2189 ihost->logical_port_entries = min(smu_max_ports(val), SCI_MAX_PORTS); in sci_controller_initialize()
2190 ihost->task_context_entries = min(smu_max_task_contexts(val), SCI_MAX_IO_REQUESTS); in sci_controller_initialize()
2191 ihost->remote_node_entries = min(smu_max_rncs(val), SCI_MAX_REMOTE_DEVICES); in sci_controller_initialize()
2197 for (i = 0; i < ihost->logical_port_entries; i++) { in sci_controller_initialize()
2199 *ptsg = &ihost->scu_registers->peg0.ptsg; in sci_controller_initialize()
2205 val = readl(&ihost->scu_registers->sdma.pdma_configuration); in sci_controller_initialize()
2207 writel(val, &ihost->scu_registers->sdma.pdma_configuration); in sci_controller_initialize()
2209 val = readl(&ihost->scu_registers->sdma.cdma_configuration); in sci_controller_initialize()
2211 writel(val, &ihost->scu_registers->sdma.cdma_configuration); in sci_controller_initialize()
2218 result = sci_phy_initialize(&ihost->phys[i], in sci_controller_initialize()
2219 &ihost->scu_registers->peg0.pe[i].tl, in sci_controller_initialize()
2220 &ihost->scu_registers->peg0.pe[i].ll); in sci_controller_initialize()
2225 for (i = 0; i < ihost->logical_port_entries; i++) { in sci_controller_initialize()
2226 struct isci_port *iport = &ihost->ports[i]; in sci_controller_initialize()
2228 iport->port_task_scheduler_registers = &ihost->scu_registers->peg0.ptsg.port[i]; in sci_controller_initialize()
2229 iport->port_pe_configuration_register = &ihost->scu_registers->peg0.ptsg.protocol_engine[0]; in sci_controller_initialize()
2230 iport->viit_registers = &ihost->scu_registers->peg0.viit[i]; in sci_controller_initialize()
2233 result = sci_port_configuration_agent_initialize(ihost, &ihost->port_agent); in sci_controller_initialize()
2246 static int sci_controller_dma_alloc(struct isci_host *ihost) in sci_controller_dma_alloc() argument
2248 struct device *dev = &ihost->pdev->dev; in sci_controller_dma_alloc()
2253 if (ihost->completion_queue) in sci_controller_dma_alloc()
2257 ihost->completion_queue = dmam_alloc_coherent(dev, size, &ihost->cq_dma, in sci_controller_dma_alloc()
2259 if (!ihost->completion_queue) in sci_controller_dma_alloc()
2262 size = ihost->remote_node_entries * sizeof(union scu_remote_node_context); in sci_controller_dma_alloc()
2263 ihost->remote_node_context_table = dmam_alloc_coherent(dev, size, &ihost->rnc_dma, in sci_controller_dma_alloc()
2266 if (!ihost->remote_node_context_table) in sci_controller_dma_alloc()
2269 size = ihost->task_context_entries * sizeof(struct scu_task_context), in sci_controller_dma_alloc()
2270 ihost->task_context_table = dmam_alloc_coherent(dev, size, &ihost->tc_dma, in sci_controller_dma_alloc()
2272 if (!ihost->task_context_table) in sci_controller_dma_alloc()
2276 ihost->ufi_buf = dmam_alloc_coherent(dev, size, &ihost->ufi_dma, GFP_KERNEL); in sci_controller_dma_alloc()
2277 if (!ihost->ufi_buf) in sci_controller_dma_alloc()
2288 ireq->tc = &ihost->task_context_table[i]; in sci_controller_dma_alloc()
2289 ireq->owning_controller = ihost; in sci_controller_dma_alloc()
2291 ireq->isci_host = ihost; in sci_controller_dma_alloc()
2292 ihost->reqs[i] = ireq; in sci_controller_dma_alloc()
2298 static int sci_controller_mem_init(struct isci_host *ihost) in sci_controller_mem_init() argument
2300 int err = sci_controller_dma_alloc(ihost); in sci_controller_mem_init()
2305 writel(lower_32_bits(ihost->cq_dma), &ihost->smu_registers->completion_queue_lower); in sci_controller_mem_init()
2306 writel(upper_32_bits(ihost->cq_dma), &ihost->smu_registers->completion_queue_upper); in sci_controller_mem_init()
2308 writel(lower_32_bits(ihost->rnc_dma), &ihost->smu_registers->remote_node_context_lower); in sci_controller_mem_init()
2309 writel(upper_32_bits(ihost->rnc_dma), &ihost->smu_registers->remote_node_context_upper); in sci_controller_mem_init()
2311 writel(lower_32_bits(ihost->tc_dma), &ihost->smu_registers->host_task_table_lower); in sci_controller_mem_init()
2312 writel(upper_32_bits(ihost->tc_dma), &ihost->smu_registers->host_task_table_upper); in sci_controller_mem_init()
2314 sci_unsolicited_frame_control_construct(ihost); in sci_controller_mem_init()
2320 writel(lower_32_bits(ihost->uf_control.headers.physical_address), in sci_controller_mem_init()
2321 &ihost->scu_registers->sdma.uf_header_base_address_lower); in sci_controller_mem_init()
2322 writel(upper_32_bits(ihost->uf_control.headers.physical_address), in sci_controller_mem_init()
2323 &ihost->scu_registers->sdma.uf_header_base_address_upper); in sci_controller_mem_init()
2325 writel(lower_32_bits(ihost->uf_control.address_table.physical_address), in sci_controller_mem_init()
2326 &ihost->scu_registers->sdma.uf_address_table_lower); in sci_controller_mem_init()
2327 writel(upper_32_bits(ihost->uf_control.address_table.physical_address), in sci_controller_mem_init()
2328 &ihost->scu_registers->sdma.uf_address_table_upper); in sci_controller_mem_init()
2341 int isci_host_init(struct isci_host *ihost) in isci_host_init() argument
2346 spin_lock_irq(&ihost->scic_lock); in isci_host_init()
2347 status = sci_controller_construct(ihost, scu_base(ihost), smu_base(ihost)); in isci_host_init()
2348 spin_unlock_irq(&ihost->scic_lock); in isci_host_init()
2350 dev_err(&ihost->pdev->dev, in isci_host_init()
2357 spin_lock_irq(&ihost->scic_lock); in isci_host_init()
2358 status = sci_controller_initialize(ihost); in isci_host_init()
2359 spin_unlock_irq(&ihost->scic_lock); in isci_host_init()
2361 dev_warn(&ihost->pdev->dev, in isci_host_init()
2368 err = sci_controller_mem_init(ihost); in isci_host_init()
2373 writel(1, &ihost->scu_registers->peg0.sgpio.interface_control); in isci_host_init()
2374 for (i = 0; i < isci_gpio_count(ihost); i++) in isci_host_init()
2375 writel(SGPIO_HW_CONTROL, &ihost->scu_registers->peg0.sgpio.output_data_select[i]); in isci_host_init()
2376 writel(0, &ihost->scu_registers->peg0.sgpio.vendor_specific_code); in isci_host_init()
2381 void sci_controller_link_up(struct isci_host *ihost, struct isci_port *iport, in sci_controller_link_up() argument
2384 switch (ihost->sm.current_state_id) { in sci_controller_link_up()
2386 sci_del_timer(&ihost->phy_timer); in sci_controller_link_up()
2387 ihost->phy_startup_timer_pending = false; in sci_controller_link_up()
2388 ihost->port_agent.link_up_handler(ihost, &ihost->port_agent, in sci_controller_link_up()
2390 sci_controller_start_next_phy(ihost); in sci_controller_link_up()
2393 ihost->port_agent.link_up_handler(ihost, &ihost->port_agent, in sci_controller_link_up()
2397 dev_dbg(&ihost->pdev->dev, in sci_controller_link_up()
2400 ihost->sm.current_state_id); in sci_controller_link_up()
2404 void sci_controller_link_down(struct isci_host *ihost, struct isci_port *iport, in sci_controller_link_down() argument
2407 switch (ihost->sm.current_state_id) { in sci_controller_link_down()
2410 ihost->port_agent.link_down_handler(ihost, &ihost->port_agent, in sci_controller_link_down()
2414 dev_dbg(&ihost->pdev->dev, in sci_controller_link_down()
2419 ihost->sm.current_state_id); in sci_controller_link_down()
2423 bool sci_controller_has_remote_devices_stopping(struct isci_host *ihost) in sci_controller_has_remote_devices_stopping() argument
2427 for (index = 0; index < ihost->remote_node_entries; index++) { in sci_controller_has_remote_devices_stopping()
2428 if ((ihost->device_table[index] != NULL) && in sci_controller_has_remote_devices_stopping()
2429 (ihost->device_table[index]->sm.current_state_id == SCI_DEV_STOPPING)) in sci_controller_has_remote_devices_stopping()
2436 void sci_controller_remote_device_stopped(struct isci_host *ihost, in sci_controller_remote_device_stopped() argument
2439 if (ihost->sm.current_state_id != SCIC_STOPPING) { in sci_controller_remote_device_stopped()
2440 dev_dbg(&ihost->pdev->dev, in sci_controller_remote_device_stopped()
2443 ihost, idev, in sci_controller_remote_device_stopped()
2444 ihost->sm.current_state_id); in sci_controller_remote_device_stopped()
2448 if (!sci_controller_has_remote_devices_stopping(ihost)) in sci_controller_remote_device_stopped()
2449 isci_host_stop_complete(ihost); in sci_controller_remote_device_stopped()
2452 void sci_controller_post_request(struct isci_host *ihost, u32 request) in sci_controller_post_request() argument
2454 dev_dbg(&ihost->pdev->dev, "%s[%d]: %#x\n", in sci_controller_post_request()
2455 __func__, ihost->id, request); in sci_controller_post_request()
2457 writel(request, &ihost->smu_registers->post_context_port); in sci_controller_post_request()
2460 struct isci_request *sci_request_by_tag(struct isci_host *ihost, u16 io_tag) in sci_request_by_tag() argument
2467 if (task_index < ihost->task_context_entries) { in sci_request_by_tag()
2468 struct isci_request *ireq = ihost->reqs[task_index]; in sci_request_by_tag()
2473 if (task_sequence == ihost->io_request_sequence[task_index]) in sci_request_by_tag()
2495 enum sci_status sci_controller_allocate_remote_node_context(struct isci_host *ihost, in sci_controller_allocate_remote_node_context() argument
2503 &ihost->available_remote_nodes, remote_node_count in sci_controller_allocate_remote_node_context()
2507 ihost->device_table[node_index] = idev; in sci_controller_allocate_remote_node_context()
2517 void sci_controller_free_remote_node_context(struct isci_host *ihost, in sci_controller_free_remote_node_context() argument
2523 if (ihost->device_table[node_id] == idev) { in sci_controller_free_remote_node_context()
2524 ihost->device_table[node_id] = NULL; in sci_controller_free_remote_node_context()
2527 &ihost->available_remote_nodes, remote_node_count, node_id in sci_controller_free_remote_node_context()
2544 void sci_controller_release_frame(struct isci_host *ihost, u32 frame_index) in sci_controller_release_frame() argument
2546 if (sci_unsolicited_frame_control_release_frame(&ihost->uf_control, frame_index)) in sci_controller_release_frame()
2547 writel(ihost->uf_control.get, in sci_controller_release_frame()
2548 &ihost->scu_registers->sdma.unsolicited_frame_get_pointer); in sci_controller_release_frame()
2551 void isci_tci_free(struct isci_host *ihost, u16 tci) in isci_tci_free() argument
2553 u16 tail = ihost->tci_tail & (SCI_MAX_IO_REQUESTS-1); in isci_tci_free()
2555 ihost->tci_pool[tail] = tci; in isci_tci_free()
2556 ihost->tci_tail = tail + 1; in isci_tci_free()
2559 static u16 isci_tci_alloc(struct isci_host *ihost) in isci_tci_alloc() argument
2561 u16 head = ihost->tci_head & (SCI_MAX_IO_REQUESTS-1); in isci_tci_alloc()
2562 u16 tci = ihost->tci_pool[head]; in isci_tci_alloc()
2564 ihost->tci_head = head + 1; in isci_tci_alloc()
2568 static u16 isci_tci_space(struct isci_host *ihost) in isci_tci_space() argument
2570 return CIRC_SPACE(ihost->tci_head, ihost->tci_tail, SCI_MAX_IO_REQUESTS); in isci_tci_space()
2573 u16 isci_alloc_tag(struct isci_host *ihost) in isci_alloc_tag() argument
2575 if (isci_tci_space(ihost)) { in isci_alloc_tag()
2576 u16 tci = isci_tci_alloc(ihost); in isci_alloc_tag()
2577 u8 seq = ihost->io_request_sequence[tci]; in isci_alloc_tag()
2585 enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag) in isci_free_tag() argument
2591 if (isci_tci_active(ihost) == 0) in isci_free_tag()
2594 if (seq == ihost->io_request_sequence[tci]) { in isci_free_tag()
2595 ihost->io_request_sequence[tci] = (seq+1) & (SCI_MAX_SEQ-1); in isci_free_tag()
2597 isci_tci_free(ihost, tci); in isci_free_tag()
2604 enum sci_status sci_controller_start_io(struct isci_host *ihost, in sci_controller_start_io() argument
2610 if (ihost->sm.current_state_id != SCIC_READY) { in sci_controller_start_io()
2611 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_start_io()
2612 __func__, ihost->sm.current_state_id); in sci_controller_start_io()
2616 status = sci_remote_device_start_io(ihost, idev, ireq); in sci_controller_start_io()
2621 sci_controller_post_request(ihost, ireq->post_context); in sci_controller_start_io()
2625 enum sci_status sci_controller_terminate_request(struct isci_host *ihost, in sci_controller_terminate_request() argument
2635 if (ihost->sm.current_state_id != SCIC_READY) { in sci_controller_terminate_request()
2636 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_terminate_request()
2637 __func__, ihost->sm.current_state_id); in sci_controller_terminate_request()
2642 dev_dbg(&ihost->pdev->dev, "%s: status=%d; ireq=%p; flags=%lx\n", in sci_controller_terminate_request()
2652 ihost, ireq->post_context | in sci_controller_terminate_request()
2669 enum sci_status sci_controller_complete_io(struct isci_host *ihost, in sci_controller_complete_io() argument
2676 switch (ihost->sm.current_state_id) { in sci_controller_complete_io()
2681 status = sci_remote_device_complete_io(ihost, idev, ireq); in sci_controller_complete_io()
2689 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_complete_io()
2690 __func__, ihost->sm.current_state_id); in sci_controller_complete_io()
2698 struct isci_host *ihost = ireq->owning_controller; in sci_controller_continue_io() local
2700 if (ihost->sm.current_state_id != SCIC_READY) { in sci_controller_continue_io()
2701 dev_warn(&ihost->pdev->dev, "%s invalid state: %d\n", in sci_controller_continue_io()
2702 __func__, ihost->sm.current_state_id); in sci_controller_continue_io()
2707 sci_controller_post_request(ihost, ireq->post_context); in sci_controller_continue_io()
2720 enum sci_task_status sci_controller_start_task(struct isci_host *ihost, in sci_controller_start_task() argument
2726 if (ihost->sm.current_state_id != SCIC_READY) { in sci_controller_start_task()
2727 dev_warn(&ihost->pdev->dev, in sci_controller_start_task()
2734 status = sci_remote_device_start_task(ihost, idev, ireq); in sci_controller_start_task()
2747 sci_controller_post_request(ihost, ireq->post_context); in sci_controller_start_task()
2756 static int sci_write_gpio_tx_gp(struct isci_host *ihost, u8 reg_index, u8 reg_count, u8 *write_data) in sci_write_gpio_tx_gp() argument
2764 for (d = 0; d < isci_gpio_count(ihost); d++) { in sci_write_gpio_tx_gp()
2783 writel(val, &ihost->scu_registers->peg0.sgpio.output_data_select[d]); in sci_write_gpio_tx_gp()
2795 struct isci_host *ihost = sas_ha->lldd_ha; in isci_gpio_write() local
2800 written = sci_write_gpio_tx_gp(ihost, reg_index, reg_count, write_data); in isci_gpio_write()