Lines Matching refs:ioa_cfg
590 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_trc_hook() local
593 trace_index = atomic_add_return(1, &ioa_cfg->trace_index) & IPR_TRACE_INDEX_MASK; in ipr_trc_hook()
594 trace_entry = &ioa_cfg->trace[trace_index]; in ipr_trc_hook()
598 if (ipr_cmd->ioa_cfg->sis64) in ipr_trc_hook()
621 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_lock_and_done() local
623 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_lock_and_done()
625 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_lock_and_done()
651 if (ipr_cmd->ioa_cfg->sis64) { in ipr_reinit_ipr_cmnd()
719 struct ipr_cmnd *ipr_get_free_ipr_cmnd(struct ipr_ioa_cfg *ioa_cfg) in ipr_get_free_ipr_cmnd() argument
722 __ipr_get_free_ipr_cmnd(&ioa_cfg->hrrq[IPR_INIT_HRRQ]); in ipr_get_free_ipr_cmnd()
738 static void ipr_mask_and_clear_interrupts(struct ipr_ioa_cfg *ioa_cfg, in ipr_mask_and_clear_interrupts() argument
744 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_mask_and_clear_interrupts()
745 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_mask_and_clear_interrupts()
746 ioa_cfg->hrrq[i].allow_interrupts = 0; in ipr_mask_and_clear_interrupts()
747 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_mask_and_clear_interrupts()
751 if (ioa_cfg->sis64) in ipr_mask_and_clear_interrupts()
752 writeq(~0, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_mask_and_clear_interrupts()
754 writel(~0, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_mask_and_clear_interrupts()
757 if (ioa_cfg->sis64) in ipr_mask_and_clear_interrupts()
758 writel(~0, ioa_cfg->regs.clr_interrupt_reg); in ipr_mask_and_clear_interrupts()
759 writel(clr_ints, ioa_cfg->regs.clr_interrupt_reg32); in ipr_mask_and_clear_interrupts()
760 readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_mask_and_clear_interrupts()
770 static int ipr_save_pcix_cmd_reg(struct ipr_ioa_cfg *ioa_cfg) in ipr_save_pcix_cmd_reg() argument
772 int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX); in ipr_save_pcix_cmd_reg()
777 if (pci_read_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD, in ipr_save_pcix_cmd_reg()
778 &ioa_cfg->saved_pcix_cmd_reg) != PCIBIOS_SUCCESSFUL) { in ipr_save_pcix_cmd_reg()
779 dev_err(&ioa_cfg->pdev->dev, "Failed to save PCI-X command register\n"); in ipr_save_pcix_cmd_reg()
783 ioa_cfg->saved_pcix_cmd_reg |= PCI_X_CMD_DPERR_E | PCI_X_CMD_ERO; in ipr_save_pcix_cmd_reg()
794 static int ipr_set_pcix_cmd_reg(struct ipr_ioa_cfg *ioa_cfg) in ipr_set_pcix_cmd_reg() argument
796 int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX); in ipr_set_pcix_cmd_reg()
799 if (pci_write_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD, in ipr_set_pcix_cmd_reg()
800 ioa_cfg->saved_pcix_cmd_reg) != PCIBIOS_SUCCESSFUL) { in ipr_set_pcix_cmd_reg()
801 dev_err(&ioa_cfg->pdev->dev, "Failed to setup PCI-X command register\n"); in ipr_set_pcix_cmd_reg()
904 static void ipr_fail_all_ops(struct ipr_ioa_cfg *ioa_cfg) in ipr_fail_all_ops() argument
910 for_each_hrrq(hrrq, ioa_cfg) { in ipr_fail_all_ops()
949 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_send_command() local
952 if (ioa_cfg->sis64) { in ipr_send_command()
960 writeq(send_dma_addr, ioa_cfg->regs.ioarrin_reg); in ipr_send_command()
962 writel(send_dma_addr, ioa_cfg->regs.ioarrin_reg); in ipr_send_command()
1035 if (ipr_cmd->ioa_cfg->sis64) { in ipr_init_ioadl()
1072 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_send_blocking_cmd() local
1077 spin_unlock_irq(ioa_cfg->host->host_lock); in ipr_send_blocking_cmd()
1079 spin_lock_irq(ioa_cfg->host->host_lock); in ipr_send_blocking_cmd()
1082 static int ipr_get_hrrq_index(struct ipr_ioa_cfg *ioa_cfg) in ipr_get_hrrq_index() argument
1086 if (ioa_cfg->hrrq_num == 1) in ipr_get_hrrq_index()
1089 hrrq = atomic_add_return(1, &ioa_cfg->hrrq_index); in ipr_get_hrrq_index()
1090 hrrq = (hrrq % (ioa_cfg->hrrq_num - 1)) + 1; in ipr_get_hrrq_index()
1108 static void ipr_send_hcam(struct ipr_ioa_cfg *ioa_cfg, u8 type, in ipr_send_hcam() argument
1114 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) { in ipr_send_hcam()
1115 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_send_hcam()
1117 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_pending_q); in ipr_send_hcam()
1141 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); in ipr_send_hcam()
1183 struct ipr_ioa_cfg *ioa_cfg = res->ioa_cfg; in ipr_init_res_entry() local
1195 if (ioa_cfg->sis64) { in ipr_init_res_entry()
1211 list_for_each_entry(gscsi_res, &ioa_cfg->used_res_q, queue) { in ipr_init_res_entry()
1219 res->target = find_first_zero_bit(ioa_cfg->target_ids, in ipr_init_res_entry()
1220 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1221 set_bit(res->target, ioa_cfg->target_ids); in ipr_init_res_entry()
1228 res->target = find_first_zero_bit(ioa_cfg->array_ids, in ipr_init_res_entry()
1229 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1230 set_bit(res->target, ioa_cfg->array_ids); in ipr_init_res_entry()
1233 res->target = find_first_zero_bit(ioa_cfg->vset_ids, in ipr_init_res_entry()
1234 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1235 set_bit(res->target, ioa_cfg->vset_ids); in ipr_init_res_entry()
1237 res->target = find_first_zero_bit(ioa_cfg->target_ids, in ipr_init_res_entry()
1238 ioa_cfg->max_devs_supported); in ipr_init_res_entry()
1239 set_bit(res->target, ioa_cfg->target_ids); in ipr_init_res_entry()
1270 if (res->ioa_cfg->sis64) { in ipr_is_same_device()
1319 static char *ipr_format_res_path(struct ipr_ioa_cfg *ioa_cfg, in ipr_format_res_path() argument
1325 p += scnprintf(p, buffer + len - p, "%d/", ioa_cfg->host->host_no); in ipr_format_res_path()
1345 if (res->ioa_cfg->sis64) { in ipr_update_res_entry()
1370 ipr_format_res_path(res->ioa_cfg, in ipr_update_res_entry()
1401 struct ipr_ioa_cfg *ioa_cfg = res->ioa_cfg; in ipr_clear_res_target() local
1403 if (!ioa_cfg->sis64) in ipr_clear_res_target()
1407 clear_bit(res->target, ioa_cfg->array_ids); in ipr_clear_res_target()
1409 clear_bit(res->target, ioa_cfg->vset_ids); in ipr_clear_res_target()
1411 list_for_each_entry(gscsi_res, &ioa_cfg->used_res_q, queue) in ipr_clear_res_target()
1414 clear_bit(res->target, ioa_cfg->target_ids); in ipr_clear_res_target()
1417 clear_bit(res->target, ioa_cfg->target_ids); in ipr_clear_res_target()
1428 static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, in ipr_handle_config_change() argument
1437 if (ioa_cfg->sis64) { in ipr_handle_config_change()
1445 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_handle_config_change()
1453 if (list_empty(&ioa_cfg->free_res_q)) { in ipr_handle_config_change()
1454 ipr_send_hcam(ioa_cfg, in ipr_handle_config_change()
1460 res = list_entry(ioa_cfg->free_res_q.next, in ipr_handle_config_change()
1465 list_add_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_handle_config_change()
1474 schedule_work(&ioa_cfg->work_q); in ipr_handle_config_change()
1477 list_move_tail(&res->queue, &ioa_cfg->free_res_q); in ipr_handle_config_change()
1481 schedule_work(&ioa_cfg->work_q); in ipr_handle_config_change()
1484 ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb); in ipr_handle_config_change()
1499 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_process_ccn() local
1509 dev_err(&ioa_cfg->pdev->dev, in ipr_process_ccn()
1512 ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE, hostrcb); in ipr_process_ccn()
1514 ipr_handle_config_change(ioa_cfg, hostrcb); in ipr_process_ccn()
1627 static void ipr_log_enhanced_cache_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_enhanced_cache_error() argument
1632 if (ioa_cfg->sis64) in ipr_log_enhanced_cache_error()
1663 static void ipr_log_cache_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_cache_error() argument
1695 static void ipr_log_enhanced_config_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_enhanced_config_error() argument
1713 ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); in ipr_log_enhanced_config_error()
1735 static void ipr_log_sis64_config_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_sis64_config_error() argument
1778 static void ipr_log_config_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_config_error() argument
1796 ipr_phys_res_err(ioa_cfg, dev_entry->dev_res_addr, "Device %d", i + 1); in ipr_log_config_error()
1825 static void ipr_log_enhanced_array_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_enhanced_array_error() argument
1839 ioa_cfg->host->host_no, in ipr_log_enhanced_array_error()
1860 ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); in ipr_log_enhanced_array_error()
1861 ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, in ipr_log_enhanced_array_error()
1876 static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_array_error() argument
1890 ioa_cfg->host->host_no, in ipr_log_array_error()
1910 ipr_phys_res_err(ioa_cfg, array_entry->dev_res_addr, "Current Location"); in ipr_log_array_error()
1911 ipr_phys_res_err(ioa_cfg, array_entry->expected_dev_res_addr, in ipr_log_array_error()
1932 static void ipr_log_hex_data(struct ipr_ioa_cfg *ioa_cfg, __be32 *data, int len) in ipr_log_hex_data() argument
1939 if (ioa_cfg->log_level <= IPR_DEFAULT_LOG_LEVEL) in ipr_log_hex_data()
1959 static void ipr_log_enhanced_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_enhanced_dual_ioa_error() argument
1964 if (ioa_cfg->sis64) in ipr_log_enhanced_dual_ioa_error()
1975 ipr_log_hex_data(ioa_cfg, error->data, in ipr_log_enhanced_dual_ioa_error()
1989 static void ipr_log_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_dual_ioa_error() argument
2001 ipr_log_hex_data(ioa_cfg, error->data, in ipr_log_dual_ioa_error()
2102 ipr_format_res_path(hostrcb->ioa_cfg, in ipr_log64_fabric_path()
2110 ipr_format_res_path(hostrcb->ioa_cfg, fabric->res_path, in ipr_log64_fabric_path()
2252 ipr_format_res_path(hostrcb->ioa_cfg, in ipr_log64_path_elem()
2262 ipr_format_res_path(hostrcb->ioa_cfg, in ipr_log64_path_elem()
2276 static void ipr_log_fabric_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_fabric_error() argument
2302 ipr_log_hex_data(ioa_cfg, (__be32 *)fabric, add_len); in ipr_log_fabric_error()
2313 static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_sis64_array_error() argument
2328 ipr_format_res_path(ioa_cfg, error->last_res_path, in ipr_log_sis64_array_error()
2350 ipr_format_res_path(ioa_cfg, array_entry->res_path, in ipr_log_sis64_array_error()
2353 ipr_format_res_path(ioa_cfg, in ipr_log_sis64_array_error()
2369 static void ipr_log_sis64_fabric_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_sis64_fabric_error() argument
2396 ipr_log_hex_data(ioa_cfg, (__be32 *)fabric, add_len); in ipr_log_sis64_fabric_error()
2407 static void ipr_log_sis64_service_required_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_sis64_service_required_error() argument
2416 ipr_log_hex_data(ioa_cfg, error->data, in ipr_log_sis64_service_required_error()
2429 static void ipr_log_generic_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_generic_error() argument
2432 ipr_log_hex_data(ioa_cfg, hostrcb->hcam.u.raw.data, in ipr_log_generic_error()
2444 static void ipr_log_sis64_device_error(struct ipr_ioa_cfg *ioa_cfg, in ipr_log_sis64_device_error() argument
2464 ipr_log_hex_data(ioa_cfg, error->sense_data, sizeof(error->sense_data)); in ipr_log_sis64_device_error()
2466 ipr_log_hex_data(ioa_cfg, error->cdb, sizeof(error->cdb)); in ipr_log_sis64_device_error()
2469 ipr_log_hex_data(ioa_cfg, error->ioa_data, be32_to_cpu(error->length_of_error)); in ipr_log_sis64_device_error()
2504 static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, in ipr_handle_log_data() argument
2515 dev_err(&ioa_cfg->pdev->dev, "Error notifications lost\n"); in ipr_handle_log_data()
2517 if (ioa_cfg->sis64) in ipr_handle_log_data()
2522 if (!ioa_cfg->sis64 && (ioasc == IPR_IOASC_BUS_WAS_RESET || in ipr_handle_log_data()
2525 scsi_report_bus_reset(ioa_cfg->host, in ipr_handle_log_data()
2539 ioa_cfg->log_level <= IPR_DEFAULT_LOG_LEVEL) in ipr_handle_log_data()
2546 ioa_cfg->errors_logged++; in ipr_handle_log_data()
2548 if (ioa_cfg->log_level < ipr_error_table[error_index].log_hcam) in ipr_handle_log_data()
2555 ipr_log_cache_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2558 ipr_log_config_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2562 ipr_log_array_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2565 ipr_log_dual_ioa_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2568 ipr_log_enhanced_cache_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2571 ipr_log_enhanced_config_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2575 ipr_log_enhanced_array_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2578 ipr_log_enhanced_dual_ioa_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2581 ipr_log_fabric_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2584 ipr_log_sis64_device_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2587 ipr_log_sis64_config_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2591 ipr_log_sis64_array_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2594 ipr_log_sis64_fabric_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2597 ipr_log_sis64_service_required_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2602 ipr_log_generic_error(ioa_cfg, hostrcb); in ipr_handle_log_data()
2637 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_process_error() local
2642 if (ioa_cfg->sis64) in ipr_process_error()
2651 ipr_handle_log_data(ioa_cfg, hostrcb); in ipr_process_error()
2653 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV); in ipr_process_error()
2656 dev_err(&ioa_cfg->pdev->dev, in ipr_process_error()
2660 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_report_q); in ipr_process_error()
2661 schedule_work(&ioa_cfg->work_q); in ipr_process_error()
2662 hostrcb = ipr_get_free_hostrcb(ioa_cfg); in ipr_process_error()
2664 ipr_send_hcam(ioa_cfg, IPR_HCAM_CDB_OP_CODE_LOG_DATA, hostrcb); in ipr_process_error()
2681 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_timeout() local
2684 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_timeout()
2686 ioa_cfg->errors_logged++; in ipr_timeout()
2687 dev_err(&ioa_cfg->pdev->dev, in ipr_timeout()
2690 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_timeout()
2691 ioa_cfg->sdt_state = GET_DUMP; in ipr_timeout()
2693 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) in ipr_timeout()
2694 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_timeout()
2696 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_timeout()
2714 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_oper_timeout() local
2717 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_oper_timeout()
2719 ioa_cfg->errors_logged++; in ipr_oper_timeout()
2720 dev_err(&ioa_cfg->pdev->dev, in ipr_oper_timeout()
2723 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_oper_timeout()
2724 ioa_cfg->sdt_state = GET_DUMP; in ipr_oper_timeout()
2726 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) { in ipr_oper_timeout()
2728 ioa_cfg->reset_retries += IPR_NUM_RESET_RELOAD_RETRIES; in ipr_oper_timeout()
2729 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_oper_timeout()
2732 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_oper_timeout()
2781 static u32 ipr_get_max_scsi_speed(struct ipr_ioa_cfg *ioa_cfg, u8 bus, u8 bus_width) in ipr_get_max_scsi_speed() argument
2788 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_get_max_scsi_speed()
2814 static int ipr_wait_iodbg_ack(struct ipr_ioa_cfg *ioa_cfg, int max_delay) in ipr_wait_iodbg_ack() argument
2821 pcii_reg = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_wait_iodbg_ack()
2847 static int ipr_get_sis64_dump_data_section(struct ipr_ioa_cfg *ioa_cfg, in ipr_get_sis64_dump_data_section() argument
2854 writel(start_addr+(i*4), ioa_cfg->regs.dump_addr_reg); in ipr_get_sis64_dump_data_section()
2855 *dest = cpu_to_be32(readl(ioa_cfg->regs.dump_data_reg)); in ipr_get_sis64_dump_data_section()
2872 static int ipr_get_ldump_data_section(struct ipr_ioa_cfg *ioa_cfg, in ipr_get_ldump_data_section() argument
2879 if (ioa_cfg->sis64) in ipr_get_ldump_data_section()
2880 return ipr_get_sis64_dump_data_section(ioa_cfg, start_addr, in ipr_get_ldump_data_section()
2885 ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2888 if (ipr_wait_iodbg_ack(ioa_cfg, in ipr_get_ldump_data_section()
2890 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ldump_data_section()
2897 ioa_cfg->regs.clr_interrupt_reg); in ipr_get_ldump_data_section()
2900 writel(start_addr, ioa_cfg->ioa_mailbox); in ipr_get_ldump_data_section()
2904 ioa_cfg->regs.clr_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2908 if (ipr_wait_iodbg_ack(ioa_cfg, in ipr_get_ldump_data_section()
2910 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ldump_data_section()
2916 *dest = cpu_to_be32(readl(ioa_cfg->ioa_mailbox)); in ipr_get_ldump_data_section()
2923 ioa_cfg->regs.clr_interrupt_reg); in ipr_get_ldump_data_section()
2929 ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2932 ioa_cfg->regs.clr_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2936 ioa_cfg->regs.clr_interrupt_reg); in ipr_get_ldump_data_section()
2941 readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); in ipr_get_ldump_data_section()
2965 static int ipr_sdt_copy(struct ipr_ioa_cfg *ioa_cfg, in ipr_sdt_copy() argument
2972 struct ipr_ioa_dump *ioa_dump = &ioa_cfg->dump->ioa_dump; in ipr_sdt_copy()
2974 if (ioa_cfg->sis64) in ipr_sdt_copy()
3000 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_sdt_copy()
3001 if (ioa_cfg->sdt_state == ABORT_DUMP) { in ipr_sdt_copy()
3004 rc = ipr_get_ldump_data_section(ioa_cfg, in ipr_sdt_copy()
3009 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_sdt_copy()
3047 static void ipr_dump_ioa_type_data(struct ipr_ioa_cfg *ioa_cfg, in ipr_dump_ioa_type_data() argument
3050 struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; in ipr_dump_ioa_type_data()
3058 driver_dump->ioa_type_entry.type = ioa_cfg->type; in ipr_dump_ioa_type_data()
3073 static void ipr_dump_version_data(struct ipr_ioa_cfg *ioa_cfg, in ipr_dump_version_data() argument
3094 static void ipr_dump_trace_data(struct ipr_ioa_cfg *ioa_cfg, in ipr_dump_trace_data() argument
3103 memcpy(driver_dump->trace_entry.trace, ioa_cfg->trace, IPR_TRACE_SIZE); in ipr_dump_trace_data()
3115 static void ipr_dump_location_data(struct ipr_ioa_cfg *ioa_cfg, in ipr_dump_location_data() argument
3124 strcpy(driver_dump->location_entry.location, dev_name(&ioa_cfg->pdev->dev)); in ipr_dump_location_data()
3136 static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump) in ipr_get_ioa_dump() argument
3150 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3152 if (ioa_cfg->sdt_state != READ_DUMP) { in ipr_get_ioa_dump()
3153 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3157 if (ioa_cfg->sis64) { in ipr_get_ioa_dump()
3158 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3160 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3163 start_addr = readl(ioa_cfg->ioa_mailbox); in ipr_get_ioa_dump()
3165 if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(start_addr)) { in ipr_get_ioa_dump()
3166 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ioa_dump()
3168 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3172 dev_err(&ioa_cfg->pdev->dev, "Dump of IOA initiated\n"); in ipr_get_ioa_dump()
3184 ipr_dump_version_data(ioa_cfg, driver_dump); in ipr_get_ioa_dump()
3185 ipr_dump_location_data(ioa_cfg, driver_dump); in ipr_get_ioa_dump()
3186 ipr_dump_ioa_type_data(ioa_cfg, driver_dump); in ipr_get_ioa_dump()
3187 ipr_dump_trace_data(ioa_cfg, driver_dump); in ipr_get_ioa_dump()
3204 if (ioa_cfg->sis64) { in ipr_get_ioa_dump()
3214 rc = ipr_get_ldump_data_section(ioa_cfg, start_addr, (__be32 *)sdt, in ipr_get_ioa_dump()
3220 dev_err(&ioa_cfg->pdev->dev, in ipr_get_ioa_dump()
3224 ioa_cfg->sdt_state = DUMP_OBTAINED; in ipr_get_ioa_dump()
3225 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3236 if (ioa_cfg->sis64) in ipr_get_ioa_dump()
3241 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_get_ioa_dump()
3251 if (ioa_cfg->sis64) in ipr_get_ioa_dump()
3269 bytes_copied = ipr_sdt_copy(ioa_cfg, sdt_word, in ipr_get_ioa_dump()
3282 dev_err(&ioa_cfg->pdev->dev, "Dump of IOA completed.\n"); in ipr_get_ioa_dump()
3287 ioa_cfg->sdt_state = DUMP_OBTAINED; in ipr_get_ioa_dump()
3292 #define ipr_get_ioa_dump(ioa_cfg, dump) do { } while (0) argument
3305 struct ipr_ioa_cfg *ioa_cfg = dump->ioa_cfg; in ipr_release_dump() local
3310 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_release_dump()
3311 ioa_cfg->dump = NULL; in ipr_release_dump()
3312 ioa_cfg->sdt_state = INACTIVE; in ipr_release_dump()
3313 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_release_dump()
3328 struct ipr_ioa_cfg *ioa_cfg = in ipr_add_remove_thread() local
3334 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3339 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) { in ipr_add_remove_thread()
3340 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3344 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_add_remove_thread()
3350 list_move_tail(&res->queue, &ioa_cfg->free_res_q); in ipr_add_remove_thread()
3353 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3356 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3363 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_add_remove_thread()
3369 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3370 scsi_add_device(ioa_cfg->host, bus, target, lun); in ipr_add_remove_thread()
3371 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3376 ioa_cfg->scan_done = 1; in ipr_add_remove_thread()
3377 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_add_remove_thread()
3378 kobject_uevent(&ioa_cfg->host->shost_dev.kobj, KOBJ_CHANGE); in ipr_add_remove_thread()
3397 struct ipr_ioa_cfg *ioa_cfg = in ipr_worker_thread() local
3401 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3403 if (ioa_cfg->sdt_state == READ_DUMP) { in ipr_worker_thread()
3404 dump = ioa_cfg->dump; in ipr_worker_thread()
3406 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3410 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3411 ipr_get_ioa_dump(ioa_cfg, dump); in ipr_worker_thread()
3414 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3415 if (ioa_cfg->sdt_state == DUMP_OBTAINED && !ioa_cfg->dump_timeout) in ipr_worker_thread()
3416 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_worker_thread()
3417 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3421 if (ioa_cfg->scsi_unblock) { in ipr_worker_thread()
3422 ioa_cfg->scsi_unblock = 0; in ipr_worker_thread()
3423 ioa_cfg->scsi_blocked = 0; in ipr_worker_thread()
3424 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3425 scsi_unblock_requests(ioa_cfg->host); in ipr_worker_thread()
3426 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3427 if (ioa_cfg->scsi_blocked) in ipr_worker_thread()
3428 scsi_block_requests(ioa_cfg->host); in ipr_worker_thread()
3431 if (!ioa_cfg->scan_enabled) { in ipr_worker_thread()
3432 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3436 schedule_work(&ioa_cfg->scsi_add_work_q); in ipr_worker_thread()
3438 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_worker_thread()
3461 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_read_trace() local
3465 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_read_trace()
3466 ret = memory_read_from_buffer(buf, count, &off, ioa_cfg->trace, in ipr_read_trace()
3468 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_trace()
3496 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_fw_version() local
3497 struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; in ipr_show_fw_version()
3501 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_version()
3506 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_version()
3531 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_log_level() local
3535 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_log_level()
3536 len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->log_level); in ipr_show_log_level()
3537 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_log_level()
3556 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_log_level() local
3559 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_log_level()
3560 ioa_cfg->log_level = simple_strtoul(buf, NULL, 10); in ipr_store_log_level()
3561 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_log_level()
3592 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_diagnostics() local
3599 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3600 while (ioa_cfg->in_reset_reload) { in ipr_store_diagnostics()
3601 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3602 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_diagnostics()
3603 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3606 ioa_cfg->errors_logged = 0; in ipr_store_diagnostics()
3607 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); in ipr_store_diagnostics()
3609 if (ioa_cfg->in_reset_reload) { in ipr_store_diagnostics()
3610 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3611 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_diagnostics()
3616 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3620 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3621 if (ioa_cfg->in_reset_reload || ioa_cfg->errors_logged) in ipr_store_diagnostics()
3623 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_diagnostics()
3649 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_adapter_state() local
3653 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_state()
3654 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in ipr_show_adapter_state()
3658 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_state()
3679 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_adapter_state() local
3686 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_adapter_state()
3687 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead && in ipr_store_adapter_state()
3689 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_store_adapter_state()
3690 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_store_adapter_state()
3691 ioa_cfg->hrrq[i].ioa_is_dead = 0; in ipr_store_adapter_state()
3692 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_store_adapter_state()
3695 ioa_cfg->reset_retries = 0; in ipr_store_adapter_state()
3696 ioa_cfg->in_ioa_bringdown = 0; in ipr_store_adapter_state()
3697 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_store_adapter_state()
3699 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_adapter_state()
3700 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_adapter_state()
3731 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_reset_adapter() local
3738 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_reset_adapter()
3739 if (!ioa_cfg->in_reset_reload) in ipr_store_reset_adapter()
3740 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); in ipr_store_reset_adapter()
3741 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_reset_adapter()
3742 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_store_reset_adapter()
3769 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_iopoll_weight() local
3774 len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->iopoll_weight); in ipr_show_iopoll_weight()
3795 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_iopoll_weight() local
3800 if (!ioa_cfg->sis64) { in ipr_store_iopoll_weight()
3801 dev_info(&ioa_cfg->pdev->dev, "irq_poll not supported on this adapter\n"); in ipr_store_iopoll_weight()
3808 dev_info(&ioa_cfg->pdev->dev, "Invalid irq_poll weight. It must be less than 256\n"); in ipr_store_iopoll_weight()
3812 if (user_iopoll_weight == ioa_cfg->iopoll_weight) { in ipr_store_iopoll_weight()
3813 dev_info(&ioa_cfg->pdev->dev, "Current irq_poll weight has the same weight\n"); in ipr_store_iopoll_weight()
3817 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_store_iopoll_weight()
3818 for (i = 1; i < ioa_cfg->hrrq_num; i++) in ipr_store_iopoll_weight()
3819 irq_poll_disable(&ioa_cfg->hrrq[i].iopoll); in ipr_store_iopoll_weight()
3823 ioa_cfg->iopoll_weight = user_iopoll_weight; in ipr_store_iopoll_weight()
3824 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_store_iopoll_weight()
3825 for (i = 1; i < ioa_cfg->hrrq_num; i++) { in ipr_store_iopoll_weight()
3826 irq_poll_init(&ioa_cfg->hrrq[i].iopoll, in ipr_store_iopoll_weight()
3827 ioa_cfg->iopoll_weight, ipr_iopoll); in ipr_store_iopoll_weight()
4029 static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg, in ipr_update_ioa_ucode() argument
4034 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4035 while (ioa_cfg->in_reset_reload) { in ipr_update_ioa_ucode()
4036 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4037 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_update_ioa_ucode()
4038 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4041 if (ioa_cfg->ucode_sglist) { in ipr_update_ioa_ucode()
4042 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4043 dev_err(&ioa_cfg->pdev->dev, in ipr_update_ioa_ucode()
4048 sglist->num_dma_sg = dma_map_sg(&ioa_cfg->pdev->dev, in ipr_update_ioa_ucode()
4053 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4054 dev_err(&ioa_cfg->pdev->dev, in ipr_update_ioa_ucode()
4059 ioa_cfg->ucode_sglist = sglist; in ipr_update_ioa_ucode()
4060 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); in ipr_update_ioa_ucode()
4061 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4062 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_update_ioa_ucode()
4064 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4065 ioa_cfg->ucode_sglist = NULL; in ipr_update_ioa_ucode()
4066 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_update_ioa_ucode()
4087 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_store_update_fw() local
4105 if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) { in ipr_store_update_fw()
4106 dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname); in ipr_store_update_fw()
4117 dev_err(&ioa_cfg->pdev->dev, "Microcode buffer allocation failed\n"); in ipr_store_update_fw()
4125 dev_err(&ioa_cfg->pdev->dev, in ipr_store_update_fw()
4132 result = ipr_update_ioa_ucode(ioa_cfg, sglist); in ipr_store_update_fw()
4163 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_show_fw_type() local
4167 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_type()
4168 len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->sis64); in ipr_show_fw_type()
4169 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_fw_type()
4187 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_read_async_err_log() local
4192 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_read_async_err_log()
4193 hostrcb = list_first_entry_or_null(&ioa_cfg->hostrcb_report_q, in ipr_read_async_err_log()
4196 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_async_err_log()
4201 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_async_err_log()
4211 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_next_async_err_log() local
4215 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_next_async_err_log()
4216 hostrcb = list_first_entry_or_null(&ioa_cfg->hostrcb_report_q, in ipr_next_async_err_log()
4219 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_next_async_err_log()
4224 list_move_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); in ipr_next_async_err_log()
4225 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_next_async_err_log()
4270 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_read_dump() local
4280 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_read_dump()
4281 dump = ioa_cfg->dump; in ipr_read_dump()
4283 if (ioa_cfg->sdt_state != DUMP_OBTAINED || !dump) { in ipr_read_dump()
4284 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_dump()
4288 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_read_dump()
4314 if (ioa_cfg->sis64) in ipr_read_dump()
4360 static int ipr_alloc_dump(struct ipr_ioa_cfg *ioa_cfg) in ipr_alloc_dump() argument
4373 if (ioa_cfg->sis64) in ipr_alloc_dump()
4389 dump->ioa_cfg = ioa_cfg; in ipr_alloc_dump()
4391 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_alloc_dump()
4393 if (INACTIVE != ioa_cfg->sdt_state) { in ipr_alloc_dump()
4394 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_alloc_dump()
4400 ioa_cfg->dump = dump; in ipr_alloc_dump()
4401 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_alloc_dump()
4402 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead && !ioa_cfg->dump_taken) { in ipr_alloc_dump()
4403 ioa_cfg->dump_taken = 1; in ipr_alloc_dump()
4404 schedule_work(&ioa_cfg->work_q); in ipr_alloc_dump()
4406 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_alloc_dump()
4418 static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg) in ipr_free_dump() argument
4425 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_free_dump()
4426 dump = ioa_cfg->dump; in ipr_free_dump()
4428 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_free_dump()
4432 ioa_cfg->dump = NULL; in ipr_free_dump()
4433 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_free_dump()
4459 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_write_dump() local
4466 rc = ipr_alloc_dump(ioa_cfg); in ipr_write_dump()
4468 rc = ipr_free_dump(ioa_cfg); in ipr_write_dump()
4488 static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg) { return 0; }; in ipr_free_dump() argument
4501 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_change_queue_depth() local
4505 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_change_queue_depth()
4510 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_change_queue_depth()
4528 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_adapter_handle() local
4533 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_handle()
4537 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_adapter_handle()
4562 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_resource_path() local
4568 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_path()
4570 if (res && ioa_cfg->sis64) in ipr_show_resource_path()
4575 len = snprintf(buf, PAGE_SIZE, "%d:%d:%d:%d\n", ioa_cfg->host->host_no, in ipr_show_resource_path()
4578 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_path()
4602 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_device_id() local
4607 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_device_id()
4609 if (res && ioa_cfg->sis64) in ipr_show_device_id()
4614 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_device_id()
4638 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_resource_type() local
4643 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_type()
4649 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_resource_type()
4674 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_show_raw_mode() local
4679 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_show_raw_mode()
4685 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_show_raw_mode()
4704 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; in ipr_store_raw_mode() local
4709 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_store_raw_mode()
4722 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_store_raw_mode()
4789 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_find_starget() local
4792 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_find_starget()
4817 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_target_alloc() local
4823 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_target_alloc()
4828 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_target_alloc()
4833 ap = ata_sas_port_alloc(&ioa_cfg->ata_host, &sata_port_info, shost); in ipr_target_alloc()
4835 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_target_alloc()
4836 sata_port->ioa_cfg = ioa_cfg; in ipr_target_alloc()
4848 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_target_alloc()
4865 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_target_destroy() local
4867 if (ioa_cfg->sis64) { in ipr_target_destroy()
4870 clear_bit(starget->id, ioa_cfg->array_ids); in ipr_target_destroy()
4872 clear_bit(starget->id, ioa_cfg->vset_ids); in ipr_target_destroy()
4874 clear_bit(starget->id, ioa_cfg->target_ids); in ipr_target_destroy()
4894 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_find_sdev() local
4897 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_find_sdev()
4917 struct ipr_ioa_cfg *ioa_cfg; in ipr_slave_destroy() local
4920 ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_slave_destroy()
4922 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_destroy()
4931 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_destroy()
4945 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_slave_configure() local
4951 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_configure()
4969 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_configure()
4976 if (ioa_cfg->sis64) in ipr_slave_configure()
4978 ipr_format_res_path(ioa_cfg, in ipr_slave_configure()
4982 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_configure()
5031 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata; in ipr_slave_alloc() local
5038 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_alloc()
5050 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_alloc()
5055 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_slave_alloc()
5120 static int ipr_wait_for_ops(struct ipr_ioa_cfg *ioa_cfg, void *device, in ipr_wait_for_ops() argument
5134 for_each_hrrq(hrrq, ioa_cfg) { in ipr_wait_for_ops()
5137 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in ipr_wait_for_ops()
5154 for_each_hrrq(hrrq, ioa_cfg) { in ipr_wait_for_ops()
5157 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in ipr_wait_for_ops()
5169 dev_err(&ioa_cfg->pdev->dev, "Timed out waiting for aborted commands\n"); in ipr_wait_for_ops()
5182 struct ipr_ioa_cfg *ioa_cfg; in ipr_eh_host_reset() local
5187 ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata; in ipr_eh_host_reset()
5188 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
5190 if (!ioa_cfg->in_reset_reload && !ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { in ipr_eh_host_reset()
5191 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV); in ipr_eh_host_reset()
5192 dev_err(&ioa_cfg->pdev->dev, in ipr_eh_host_reset()
5195 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_eh_host_reset()
5196 ioa_cfg->sdt_state = GET_DUMP; in ipr_eh_host_reset()
5199 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
5200 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_eh_host_reset()
5201 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
5205 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { in ipr_eh_host_reset()
5210 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_eh_host_reset()
5229 static int ipr_device_reset(struct ipr_ioa_cfg *ioa_cfg, in ipr_device_reset() argument
5239 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_device_reset()
5243 if (ipr_cmd->ioa_cfg->sis64) { in ipr_device_reset()
5262 if (ipr_cmd->ioa_cfg->sis64) in ipr_device_reset()
5289 struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg; in ipr_sata_reset() local
5295 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5296 while (ioa_cfg->in_reset_reload) { in ipr_sata_reset()
5297 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5298 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_sata_reset()
5299 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5304 rc = ipr_device_reset(ioa_cfg, res); in ipr_sata_reset()
5306 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5308 ret = ipr_wait_for_ops(ioa_cfg, res, ipr_match_res); in ipr_sata_reset()
5310 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5311 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV); in ipr_sata_reset()
5312 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5314 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_sata_reset()
5317 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_sata_reset()
5337 struct ipr_ioa_cfg *ioa_cfg; in __ipr_eh_dev_reset() local
5344 ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; in __ipr_eh_dev_reset()
5352 if (ioa_cfg->in_reset_reload) in __ipr_eh_dev_reset()
5354 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in __ipr_eh_dev_reset()
5357 for_each_hrrq(hrrq, ioa_cfg) { in __ipr_eh_dev_reset()
5360 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in __ipr_eh_dev_reset()
5386 rc = ipr_device_reset(ioa_cfg, res); in __ipr_eh_dev_reset()
5397 struct ipr_ioa_cfg *ioa_cfg; in ipr_eh_dev_reset() local
5400 ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata; in ipr_eh_dev_reset()
5412 rc = ipr_wait_for_ops(ioa_cfg, res, ipr_match_res); in ipr_eh_dev_reset()
5414 rc = ipr_wait_for_ops(ioa_cfg, cmd->device, ipr_match_lun); in ipr_eh_dev_reset()
5431 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_bus_reset_done() local
5435 if (!ioa_cfg->sis64) in ipr_bus_reset_done()
5436 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_bus_reset_done()
5438 scsi_report_bus_reset(ioa_cfg->host, res->bus); in ipr_bus_reset_done()
5471 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_abort_timeout() local
5476 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_abort_timeout()
5477 if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) { in ipr_abort_timeout()
5478 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_abort_timeout()
5483 reset_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_abort_timeout()
5493 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_abort_timeout()
5509 struct ipr_ioa_cfg *ioa_cfg; in ipr_cancel_op() local
5517 ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata; in ipr_cancel_op()
5524 if (ioa_cfg->in_reset_reload || in ipr_cancel_op()
5525 ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in ipr_cancel_op()
5535 readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_cancel_op()
5540 for_each_hrrq(hrrq, ioa_cfg) { in ipr_cancel_op()
5543 if (ioa_cfg->ipr_cmnd_list[i]->scsi_cmd == scsi_cmd) { in ipr_cancel_op()
5544 if (!ipr_cmnd_is_free(ioa_cfg->ipr_cmnd_list[i])) { in ipr_cancel_op()
5556 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_cancel_op()
5596 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; in ipr_scan_finished() local
5600 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead || ioa_cfg->scan_done) in ipr_scan_finished()
5602 if ((elapsed_time/HZ) > (ioa_cfg->transop_timeout * 2)) in ipr_scan_finished()
5619 struct ipr_ioa_cfg *ioa_cfg; in ipr_eh_abort() local
5623 ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; in ipr_eh_abort()
5630 rc = ipr_wait_for_ops(ioa_cfg, scsi_cmd->device, ipr_match_lun); in ipr_eh_abort()
5643 static irqreturn_t ipr_handle_other_interrupt(struct ipr_ioa_cfg *ioa_cfg, in ipr_handle_other_interrupt() argument
5649 int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg32); in ipr_handle_other_interrupt()
5656 if (ioa_cfg->sis64) { in ipr_handle_other_interrupt()
5657 int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_handle_other_interrupt()
5658 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; in ipr_handle_other_interrupt()
5662 writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.clr_interrupt_reg); in ipr_handle_other_interrupt()
5663 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; in ipr_handle_other_interrupt()
5664 list_del(&ioa_cfg->reset_cmd->queue); in ipr_handle_other_interrupt()
5665 del_timer(&ioa_cfg->reset_cmd->timer); in ipr_handle_other_interrupt()
5666 ipr_reset_ioa_job(ioa_cfg->reset_cmd); in ipr_handle_other_interrupt()
5676 writel(IPR_PCII_IOA_TRANS_TO_OPER, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_handle_other_interrupt()
5677 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_handle_other_interrupt()
5679 list_del(&ioa_cfg->reset_cmd->queue); in ipr_handle_other_interrupt()
5680 del_timer(&ioa_cfg->reset_cmd->timer); in ipr_handle_other_interrupt()
5681 ipr_reset_ioa_job(ioa_cfg->reset_cmd); in ipr_handle_other_interrupt()
5683 if (ioa_cfg->clear_isr) { in ipr_handle_other_interrupt()
5685 dev_err(&ioa_cfg->pdev->dev, in ipr_handle_other_interrupt()
5687 writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg32); in ipr_handle_other_interrupt()
5688 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_handle_other_interrupt()
5693 ioa_cfg->ioa_unit_checked = 1; in ipr_handle_other_interrupt()
5695 dev_err(&ioa_cfg->pdev->dev, in ipr_handle_other_interrupt()
5698 dev_err(&ioa_cfg->pdev->dev, in ipr_handle_other_interrupt()
5701 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_handle_other_interrupt()
5702 ioa_cfg->sdt_state = GET_DUMP; in ipr_handle_other_interrupt()
5704 ipr_mask_and_clear_interrupts(ioa_cfg, ~0); in ipr_handle_other_interrupt()
5705 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_handle_other_interrupt()
5720 static void ipr_isr_eh(struct ipr_ioa_cfg *ioa_cfg, char *msg, u16 number) in ipr_isr_eh() argument
5722 ioa_cfg->errors_logged++; in ipr_isr_eh()
5723 dev_err(&ioa_cfg->pdev->dev, "%s %d\n", msg, number); in ipr_isr_eh()
5725 if (WAIT_FOR_DUMP == ioa_cfg->sdt_state) in ipr_isr_eh()
5726 ioa_cfg->sdt_state = GET_DUMP; in ipr_isr_eh()
5728 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_isr_eh()
5737 struct ipr_ioa_cfg *ioa_cfg = hrr_queue->ioa_cfg; in ipr_process_hrrq() local
5753 ipr_isr_eh(ioa_cfg, in ipr_process_hrrq()
5759 ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index]; in ipr_process_hrrq()
5817 struct ipr_ioa_cfg *ioa_cfg = hrrq->ioa_cfg; in ipr_isr() local
5837 if (!ioa_cfg->clear_isr) in ipr_isr()
5844 ioa_cfg->regs.clr_interrupt_reg32); in ipr_isr()
5845 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_isr()
5850 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_isr()
5854 ipr_isr_eh(ioa_cfg, in ipr_isr()
5863 rc = ipr_handle_other_interrupt(ioa_cfg, int_reg); in ipr_isr()
5885 struct ipr_ioa_cfg *ioa_cfg = hrrq->ioa_cfg; in ipr_isr_mhrrq() local
5899 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_isr_mhrrq()
5932 static int ipr_build_ioadl64(struct ipr_ioa_cfg *ioa_cfg, in ipr_build_ioadl64() argument
5950 dev_err(&ioa_cfg->pdev->dev, "scsi_dma_map failed!\n"); in ipr_build_ioadl64()
5984 static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg, in ipr_build_ioadl() argument
6001 dev_err(&ioa_cfg->pdev->dev, "scsi_dma_map failed!\n"); in ipr_build_ioadl()
6115 if (ipr_cmd->ioa_cfg->sis64) in ipr_reinit_ipr_cmnd_for_erp()
6229 static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, in ipr_dump_ioasa() argument
6245 if (ioa_cfg->log_level < IPR_DEFAULT_LOG_LEVEL) in ipr_dump_ioasa()
6253 if (ioa_cfg->log_level < IPR_MAX_LOG_LEVEL) { in ipr_dump_ioasa()
6265 ipr_res_err(ioa_cfg, res, "%s\n", ipr_error_table[error_index].error); in ipr_dump_ioasa()
6268 if (ioa_cfg->sis64 && sizeof(struct ipr_ioasa64) < data_len) in ipr_dump_ioasa()
6270 else if (!ioa_cfg->sis64 && sizeof(struct ipr_ioasa) < data_len) in ipr_dump_ioasa()
6392 if (ipr_cmd->ioa_cfg->sis64) in ipr_get_autosense()
6414 static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, in ipr_erp_start() argument
6430 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); in ipr_erp_start()
6469 scsi_report_bus_reset(ioa_cfg->host, scsi_cmd->device->channel); in ipr_erp_start()
6523 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_scsi_done() local
6540 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_scsi_done()
6542 ipr_erp_start(ioa_cfg, ipr_cmd); in ipr_scsi_done()
6544 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_scsi_done()
6563 struct ipr_ioa_cfg *ioa_cfg; in ipr_queuecommand() local
6572 ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; in ipr_queuecommand()
6578 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_queuecommand()
6580 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_queuecommand()
6584 hrrq_id = ipr_get_hrrq_index(ioa_cfg); in ipr_queuecommand()
6585 hrrq = &ioa_cfg->hrrq[hrrq_id]; in ipr_queuecommand()
6652 if (ioa_cfg->sis64) in ipr_queuecommand()
6653 rc = ipr_build_ioadl64(ioa_cfg, ipr_cmd); in ipr_queuecommand()
6655 rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); in ipr_queuecommand()
6727 struct ipr_ioa_cfg *ioa_cfg; in ipr_ioa_info() local
6730 ioa_cfg = (struct ipr_ioa_cfg *) host->hostdata; in ipr_ioa_info()
6733 sprintf(buffer, "IBM %X Storage Adapter", ioa_cfg->type); in ipr_ioa_info()
6780 struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg; in ipr_ata_phy_reset() local
6784 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_ata_phy_reset()
6785 while (ioa_cfg->in_reset_reload) { in ipr_ata_phy_reset()
6786 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_ata_phy_reset()
6787 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_ata_phy_reset()
6788 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_ata_phy_reset()
6791 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) in ipr_ata_phy_reset()
6794 rc = ipr_device_reset(ioa_cfg, res); in ipr_ata_phy_reset()
6806 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_ata_phy_reset()
6820 struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg; in ipr_ata_post_internal() local
6825 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_ata_post_internal()
6826 while (ioa_cfg->in_reset_reload) { in ipr_ata_post_internal()
6827 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_ata_post_internal()
6828 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_ata_post_internal()
6829 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_ata_post_internal()
6832 for_each_hrrq(hrrq, ioa_cfg) { in ipr_ata_post_internal()
6836 ipr_device_reset(ioa_cfg, sata_port->res); in ipr_ata_post_internal()
6842 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_ata_post_internal()
6883 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_sata_done() local
6890 if (ipr_cmd->ioa_cfg->sis64) in ipr_sata_done()
6896 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); in ipr_sata_done()
6899 scsi_report_device_reset(ioa_cfg->host, res->bus, res->target); in ipr_sata_done()
7012 struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg; in ipr_qc_defer() local
7017 hrrq_id = ipr_get_hrrq_index(ioa_cfg); in ipr_qc_defer()
7018 hrrq = &ioa_cfg->hrrq[hrrq_id]; in ipr_qc_defer()
7055 struct ipr_ioa_cfg *ioa_cfg = sata_port->ioa_cfg; in ipr_qc_issue() local
7079 if (ioa_cfg->sis64) { in ipr_qc_issue()
7097 if (ioa_cfg->sis64) in ipr_qc_issue()
7210 static int ipr_invalid_adapter(struct ipr_ioa_cfg *ioa_cfg) in ipr_invalid_adapter() argument
7214 if ((ioa_cfg->type == 0x5702) && (ioa_cfg->pdev->revision < 4)) { in ipr_invalid_adapter()
7223 #define ipr_invalid_adapter(ioa_cfg) 0 argument
7238 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioa_bringdown_done() local
7242 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) { in ipr_ioa_bringdown_done()
7244 ioa_cfg->scsi_unblock = 1; in ipr_ioa_bringdown_done()
7245 schedule_work(&ioa_cfg->work_q); in ipr_ioa_bringdown_done()
7248 ioa_cfg->in_reset_reload = 0; in ipr_ioa_bringdown_done()
7249 ioa_cfg->reset_retries = 0; in ipr_ioa_bringdown_done()
7250 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_ioa_bringdown_done()
7251 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_ioa_bringdown_done()
7252 ioa_cfg->hrrq[i].ioa_is_dead = 1; in ipr_ioa_bringdown_done()
7253 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_ioa_bringdown_done()
7258 wake_up_all(&ioa_cfg->reset_wait_q); in ipr_ioa_bringdown_done()
7277 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioa_reset_done() local
7282 ioa_cfg->in_reset_reload = 0; in ipr_ioa_reset_done()
7283 for (j = 0; j < ioa_cfg->hrrq_num; j++) { in ipr_ioa_reset_done()
7284 spin_lock(&ioa_cfg->hrrq[j]._lock); in ipr_ioa_reset_done()
7285 ioa_cfg->hrrq[j].allow_cmds = 1; in ipr_ioa_reset_done()
7286 spin_unlock(&ioa_cfg->hrrq[j]._lock); in ipr_ioa_reset_done()
7289 ioa_cfg->reset_cmd = NULL; in ipr_ioa_reset_done()
7290 ioa_cfg->doorbell |= IPR_RUNTIME_RESET; in ipr_ioa_reset_done()
7292 list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { in ipr_ioa_reset_done()
7298 schedule_work(&ioa_cfg->work_q); in ipr_ioa_reset_done()
7301 list_del_init(&ioa_cfg->hostrcb[j]->queue); in ipr_ioa_reset_done()
7303 ipr_send_hcam(ioa_cfg, in ipr_ioa_reset_done()
7305 ioa_cfg->hostrcb[j]); in ipr_ioa_reset_done()
7307 ipr_send_hcam(ioa_cfg, in ipr_ioa_reset_done()
7309 ioa_cfg->hostrcb[j]); in ipr_ioa_reset_done()
7312 scsi_report_bus_reset(ioa_cfg->host, IPR_VSET_BUS); in ipr_ioa_reset_done()
7313 dev_info(&ioa_cfg->pdev->dev, "IOA initialized.\n"); in ipr_ioa_reset_done()
7315 ioa_cfg->reset_retries = 0; in ipr_ioa_reset_done()
7317 wake_up_all(&ioa_cfg->reset_wait_q); in ipr_ioa_reset_done()
7319 ioa_cfg->scsi_unblock = 1; in ipr_ioa_reset_done()
7320 schedule_work(&ioa_cfg->work_q); in ipr_ioa_reset_done()
7355 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_set_supported_devs() local
7356 struct ipr_supported_device *supp_dev = &ioa_cfg->vpd_cbs->supp_dev; in ipr_set_supported_devs()
7362 list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) { in ipr_set_supported_devs()
7379 ioa_cfg->vpd_cbs_dma + in ipr_set_supported_devs()
7387 if (!ioa_cfg->sis64) in ipr_set_supported_devs()
7446 static void ipr_check_term_power(struct ipr_ioa_cfg *ioa_cfg, in ipr_check_term_power() argument
7463 dev_err(&ioa_cfg->pdev->dev, in ipr_check_term_power()
7483 static void ipr_scsi_bus_speed_limit(struct ipr_ioa_cfg *ioa_cfg) in ipr_scsi_bus_speed_limit() argument
7489 max_xfer_rate = ipr_get_max_scsi_speed(ioa_cfg, i, in ipr_scsi_bus_speed_limit()
7490 ioa_cfg->bus_attr[i].bus_width); in ipr_scsi_bus_speed_limit()
7492 if (max_xfer_rate < ioa_cfg->bus_attr[i].max_xfer_rate) in ipr_scsi_bus_speed_limit()
7493 ioa_cfg->bus_attr[i].max_xfer_rate = max_xfer_rate; in ipr_scsi_bus_speed_limit()
7507 static void ipr_modify_ioafp_mode_page_28(struct ipr_ioa_cfg *ioa_cfg, in ipr_modify_ioafp_mode_page_28() argument
7525 dev_err(&ioa_cfg->pdev->dev, in ipr_modify_ioafp_mode_page_28()
7531 bus_attr = &ioa_cfg->bus_attr[i]; in ipr_modify_ioafp_mode_page_28()
7582 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_select_page28() local
7583 struct ipr_mode_pages *mode_pages = &ioa_cfg->vpd_cbs->mode_pages; in ipr_ioafp_mode_select_page28()
7587 ipr_scsi_bus_speed_limit(ioa_cfg); in ipr_ioafp_mode_select_page28()
7588 ipr_check_term_power(ioa_cfg, mode_pages); in ipr_ioafp_mode_select_page28()
7589 ipr_modify_ioafp_mode_page_28(ioa_cfg, mode_pages); in ipr_ioafp_mode_select_page28()
7594 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), in ipr_ioafp_mode_select_page28()
7598 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, in ipr_ioafp_mode_select_page28()
7643 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cmd_failed() local
7646 dev_err(&ioa_cfg->pdev->dev, in ipr_reset_cmd_failed()
7650 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_reset_cmd_failed()
7667 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_mode_sense_failed() local
7672 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, in ipr_reset_mode_sense_failed()
7692 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_sense_page28() local
7696 0x28, ioa_cfg->vpd_cbs_dma + in ipr_ioafp_mode_sense_page28()
7720 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_select_page24() local
7721 struct ipr_mode_pages *mode_pages = &ioa_cfg->vpd_cbs->mode_pages; in ipr_ioafp_mode_select_page24()
7736 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), in ipr_ioafp_mode_select_page24()
7780 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_sense_page24() local
7784 0x24, ioa_cfg->vpd_cbs_dma + in ipr_ioafp_mode_sense_page24()
7811 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_init_res_table() local
7818 if (ioa_cfg->sis64) in ipr_init_res_table()
7819 flag = ioa_cfg->u.cfg_table64->hdr64.flags; in ipr_init_res_table()
7821 flag = ioa_cfg->u.cfg_table->hdr.flags; in ipr_init_res_table()
7824 dev_err(&ioa_cfg->pdev->dev, "Microcode download required\n"); in ipr_init_res_table()
7826 list_for_each_entry_safe(res, temp, &ioa_cfg->used_res_q, queue) in ipr_init_res_table()
7829 if (ioa_cfg->sis64) in ipr_init_res_table()
7830 entries = be16_to_cpu(ioa_cfg->u.cfg_table64->hdr64.num_entries); in ipr_init_res_table()
7832 entries = ioa_cfg->u.cfg_table->hdr.num_entries; in ipr_init_res_table()
7835 if (ioa_cfg->sis64) in ipr_init_res_table()
7836 cfgtew.u.cfgte64 = &ioa_cfg->u.cfg_table64->dev[i]; in ipr_init_res_table()
7838 cfgtew.u.cfgte = &ioa_cfg->u.cfg_table->dev[i]; in ipr_init_res_table()
7843 list_move_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_init_res_table()
7850 if (list_empty(&ioa_cfg->free_res_q)) { in ipr_init_res_table()
7851 dev_err(&ioa_cfg->pdev->dev, "Too many devices attached\n"); in ipr_init_res_table()
7856 res = list_entry(ioa_cfg->free_res_q.next, in ipr_init_res_table()
7858 list_move_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_init_res_table()
7872 list_move_tail(&res->queue, &ioa_cfg->used_res_q); in ipr_init_res_table()
7878 list_move_tail(&res->queue, &ioa_cfg->free_res_q); in ipr_init_res_table()
7881 if (ioa_cfg->dual_raid && ipr_dual_ioa_raid) in ipr_init_res_table()
7902 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_query_ioa_cfg() local
7904 struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; in ipr_ioafp_query_ioa_cfg()
7905 struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap; in ipr_ioafp_query_ioa_cfg()
7909 ioa_cfg->dual_raid = 1; in ipr_ioafp_query_ioa_cfg()
7910 dev_info(&ioa_cfg->pdev->dev, "Adapter firmware version: %02X%02X%02X%02X\n", in ipr_ioafp_query_ioa_cfg()
7917 ioarcb->cmd_pkt.cdb[6] = (ioa_cfg->cfg_table_size >> 16) & 0xff; in ipr_ioafp_query_ioa_cfg()
7918 ioarcb->cmd_pkt.cdb[7] = (ioa_cfg->cfg_table_size >> 8) & 0xff; in ipr_ioafp_query_ioa_cfg()
7919 ioarcb->cmd_pkt.cdb[8] = ioa_cfg->cfg_table_size & 0xff; in ipr_ioafp_query_ioa_cfg()
7921 ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size, in ipr_ioafp_query_ioa_cfg()
7964 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_set_caching_parameters() local
7965 struct ipr_inquiry_pageC4 *pageC4 = &ioa_cfg->vpd_cbs->pageC4_data; in ipr_ioafp_set_caching_parameters()
8056 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_pageC4_inquiry() local
8057 struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data; in ipr_ioafp_pageC4_inquiry()
8058 struct ipr_inquiry_pageC4 *pageC4 = &ioa_cfg->vpd_cbs->pageC4_data; in ipr_ioafp_pageC4_inquiry()
8066 (ioa_cfg->vpd_cbs_dma in ipr_ioafp_pageC4_inquiry()
8089 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_cap_inquiry() local
8090 struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data; in ipr_ioafp_cap_inquiry()
8091 struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap; in ipr_ioafp_cap_inquiry()
8099 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, cap), in ipr_ioafp_cap_inquiry()
8120 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_page3_inquiry() local
8127 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page3_data), in ipr_ioafp_page3_inquiry()
8146 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_page0_inquiry() local
8152 memcpy(type, ioa_cfg->vpd_cbs->ioa_vpd.std_inq_data.vpids.product_id, 4); in ipr_ioafp_page0_inquiry()
8154 ioa_cfg->type = simple_strtoul((char *)type, NULL, 16); in ipr_ioafp_page0_inquiry()
8156 if (ipr_invalid_adapter(ioa_cfg)) { in ipr_ioafp_page0_inquiry()
8157 dev_err(&ioa_cfg->pdev->dev, in ipr_ioafp_page0_inquiry()
8161 ioa_cfg->reset_retries += IPR_NUM_RESET_RELOAD_RETRIES; in ipr_ioafp_page0_inquiry()
8162 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_ioafp_page0_inquiry()
8164 &ioa_cfg->hrrq->hrrq_free_q); in ipr_ioafp_page0_inquiry()
8172 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, page0_data), in ipr_ioafp_page0_inquiry()
8190 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_std_inquiry() local
8196 ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, ioa_vpd), in ipr_ioafp_std_inquiry()
8215 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_identify_hrrq() local
8221 if (ioa_cfg->identify_hrrq_index == 0) in ipr_ioafp_identify_hrrq()
8222 dev_info(&ioa_cfg->pdev->dev, "Starting IOA initialization sequence.\n"); in ipr_ioafp_identify_hrrq()
8224 if (ioa_cfg->identify_hrrq_index < ioa_cfg->hrrq_num) { in ipr_ioafp_identify_hrrq()
8225 hrrq = &ioa_cfg->hrrq[ioa_cfg->identify_hrrq_index]; in ipr_ioafp_identify_hrrq()
8231 if (ioa_cfg->sis64) in ipr_ioafp_identify_hrrq()
8234 if (ioa_cfg->nvectors == 1) in ipr_ioafp_identify_hrrq()
8254 ioa_cfg->identify_hrrq_index; in ipr_ioafp_identify_hrrq()
8256 if (ioa_cfg->sis64) { in ipr_ioafp_identify_hrrq()
8269 ioa_cfg->identify_hrrq_index; in ipr_ioafp_identify_hrrq()
8274 if (++ioa_cfg->identify_hrrq_index < ioa_cfg->hrrq_num) in ipr_ioafp_identify_hrrq()
8301 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_timer_done() local
8304 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_timer_done()
8306 if (ioa_cfg->reset_cmd == ipr_cmd) { in ipr_reset_timer_done()
8311 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_timer_done()
8348 static void ipr_init_ioa_mem(struct ipr_ioa_cfg *ioa_cfg) in ipr_init_ioa_mem() argument
8352 for_each_hrrq(hrrq, ioa_cfg) { in ipr_init_ioa_mem()
8365 ioa_cfg->identify_hrrq_index = 0; in ipr_init_ioa_mem()
8366 if (ioa_cfg->hrrq_num == 1) in ipr_init_ioa_mem()
8367 atomic_set(&ioa_cfg->hrrq_index, 0); in ipr_init_ioa_mem()
8369 atomic_set(&ioa_cfg->hrrq_index, 1); in ipr_init_ioa_mem()
8372 memset(ioa_cfg->u.cfg_table, 0, ioa_cfg->cfg_table_size); in ipr_init_ioa_mem()
8387 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_next_stage() local
8390 feedback = readl(ioa_cfg->regs.init_feedback_reg); in ipr_reset_next_stage()
8405 writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_reset_next_stage()
8406 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_next_stage()
8407 stage_time = ioa_cfg->transop_timeout; in ipr_reset_next_stage()
8410 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_reset_next_stage()
8415 writeq(maskval, ioa_cfg->regs.set_interrupt_mask_reg); in ipr_reset_next_stage()
8416 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_next_stage()
8443 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_enable_ioa() local
8450 ipr_init_ioa_mem(ioa_cfg); in ipr_reset_enable_ioa()
8452 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_reset_enable_ioa()
8453 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_enable_ioa()
8454 ioa_cfg->hrrq[i].allow_interrupts = 1; in ipr_reset_enable_ioa()
8455 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_enable_ioa()
8457 if (ioa_cfg->sis64) { in ipr_reset_enable_ioa()
8459 writel(IPR_ENDIAN_SWAP_KEY, ioa_cfg->regs.endian_swap_reg); in ipr_reset_enable_ioa()
8460 int_reg = readl(ioa_cfg->regs.endian_swap_reg); in ipr_reset_enable_ioa()
8463 int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_reset_enable_ioa()
8467 ioa_cfg->regs.clr_interrupt_mask_reg32); in ipr_reset_enable_ioa()
8468 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_enable_ioa()
8473 writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_reset_enable_ioa()
8475 if (ioa_cfg->sis64) { in ipr_reset_enable_ioa()
8478 writeq(maskval, ioa_cfg->regs.clr_interrupt_mask_reg); in ipr_reset_enable_ioa()
8480 writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg32); in ipr_reset_enable_ioa()
8482 int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_reset_enable_ioa()
8484 dev_info(&ioa_cfg->pdev->dev, "Initializing IOA.\n"); in ipr_reset_enable_ioa()
8486 if (ioa_cfg->sis64) { in ipr_reset_enable_ioa()
8491 ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ); in ipr_reset_enable_ioa()
8513 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_wait_for_dump() local
8515 if (ioa_cfg->sdt_state == GET_DUMP) in ipr_reset_wait_for_dump()
8516 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_reset_wait_for_dump()
8517 else if (ioa_cfg->sdt_state == READ_DUMP) in ipr_reset_wait_for_dump()
8518 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_reset_wait_for_dump()
8520 ioa_cfg->dump_timeout = 1; in ipr_reset_wait_for_dump()
8536 static void ipr_unit_check_no_data(struct ipr_ioa_cfg *ioa_cfg) in ipr_unit_check_no_data() argument
8538 ioa_cfg->errors_logged++; in ipr_unit_check_no_data()
8539 dev_err(&ioa_cfg->pdev->dev, "IOA unit check with no data\n"); in ipr_unit_check_no_data()
8552 static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg) in ipr_get_unit_check_buffer() argument
8560 mailbox = readl(ioa_cfg->ioa_mailbox); in ipr_get_unit_check_buffer()
8562 if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(mailbox)) { in ipr_get_unit_check_buffer()
8563 ipr_unit_check_no_data(ioa_cfg); in ipr_get_unit_check_buffer()
8568 rc = ipr_get_ldump_data_section(ioa_cfg, mailbox, (__be32 *) &sdt, in ipr_get_unit_check_buffer()
8574 ipr_unit_check_no_data(ioa_cfg); in ipr_get_unit_check_buffer()
8586 hostrcb = list_entry(ioa_cfg->hostrcb_free_q.next, in ipr_get_unit_check_buffer()
8591 rc = ipr_get_ldump_data_section(ioa_cfg, in ipr_get_unit_check_buffer()
8597 ipr_handle_log_data(ioa_cfg, hostrcb); in ipr_get_unit_check_buffer()
8600 ioa_cfg->sdt_state == GET_DUMP) in ipr_get_unit_check_buffer()
8601 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_get_unit_check_buffer()
8603 ipr_unit_check_no_data(ioa_cfg); in ipr_get_unit_check_buffer()
8605 list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); in ipr_get_unit_check_buffer()
8619 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_get_unit_check_job() local
8622 ioa_cfg->ioa_unit_checked = 0; in ipr_reset_get_unit_check_job()
8623 ipr_get_unit_check_buffer(ioa_cfg); in ipr_reset_get_unit_check_job()
8633 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_dump_mailbox_wait() local
8637 if (ioa_cfg->sdt_state != GET_DUMP) in ipr_dump_mailbox_wait()
8640 if (!ioa_cfg->sis64 || !ipr_cmd->u.time_left || in ipr_dump_mailbox_wait()
8641 (readl(ioa_cfg->regs.sense_interrupt_reg) & in ipr_dump_mailbox_wait()
8645 dev_err(&ioa_cfg->pdev->dev, in ipr_dump_mailbox_wait()
8648 ioa_cfg->sdt_state = READ_DUMP; in ipr_dump_mailbox_wait()
8649 ioa_cfg->dump_timeout = 0; in ipr_dump_mailbox_wait()
8650 if (ioa_cfg->sis64) in ipr_dump_mailbox_wait()
8655 schedule_work(&ioa_cfg->work_q); in ipr_dump_mailbox_wait()
8680 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_restore_cfg_space() local
8683 ioa_cfg->pdev->state_saved = true; in ipr_reset_restore_cfg_space()
8684 pci_restore_state(ioa_cfg->pdev); in ipr_reset_restore_cfg_space()
8686 if (ipr_set_pcix_cmd_reg(ioa_cfg)) { in ipr_reset_restore_cfg_space()
8691 ipr_fail_all_ops(ioa_cfg); in ipr_reset_restore_cfg_space()
8693 if (ioa_cfg->sis64) { in ipr_reset_restore_cfg_space()
8695 writel(IPR_ENDIAN_SWAP_KEY, ioa_cfg->regs.endian_swap_reg); in ipr_reset_restore_cfg_space()
8696 readl(ioa_cfg->regs.endian_swap_reg); in ipr_reset_restore_cfg_space()
8699 if (ioa_cfg->ioa_unit_checked) { in ipr_reset_restore_cfg_space()
8700 if (ioa_cfg->sis64) { in ipr_reset_restore_cfg_space()
8705 ioa_cfg->ioa_unit_checked = 0; in ipr_reset_restore_cfg_space()
8706 ipr_get_unit_check_buffer(ioa_cfg); in ipr_reset_restore_cfg_space()
8713 if (ioa_cfg->in_ioa_bringdown) { in ipr_reset_restore_cfg_space()
8715 } else if (ioa_cfg->sdt_state == GET_DUMP) { in ipr_reset_restore_cfg_space()
8737 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_bist_done() local
8740 if (ioa_cfg->cfg_locked) in ipr_reset_bist_done()
8741 pci_cfg_access_unlock(ioa_cfg->pdev); in ipr_reset_bist_done()
8742 ioa_cfg->cfg_locked = 0; in ipr_reset_bist_done()
8759 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_start_bist() local
8763 if (ioa_cfg->ipr_chip->bist_method == IPR_MMIO) in ipr_reset_start_bist()
8765 ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_reset_start_bist()
8767 rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START); in ipr_reset_start_bist()
8774 if (ioa_cfg->cfg_locked) in ipr_reset_start_bist()
8775 pci_cfg_access_unlock(ipr_cmd->ioa_cfg->pdev); in ipr_reset_start_bist()
8776 ioa_cfg->cfg_locked = 0; in ipr_reset_start_bist()
8813 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_reset_work() local
8814 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_reset_reset_work()
8822 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_reset_work()
8823 if (ioa_cfg->reset_cmd == ipr_cmd) in ipr_reset_reset_work()
8825 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_reset_reset_work()
8840 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_slot_reset() local
8844 queue_work(ioa_cfg->reset_work_q, &ipr_cmd->work); in ipr_reset_slot_reset()
8861 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_block_config_access_wait() local
8864 if (pci_cfg_access_trylock(ioa_cfg->pdev)) { in ipr_reset_block_config_access_wait()
8865 ioa_cfg->cfg_locked = 1; in ipr_reset_block_config_access_wait()
8866 ipr_cmd->job_step = ioa_cfg->reset; in ipr_reset_block_config_access_wait()
8874 ipr_cmd->job_step = ioa_cfg->reset; in ipr_reset_block_config_access_wait()
8875 dev_err(&ioa_cfg->pdev->dev, in ipr_reset_block_config_access_wait()
8894 ipr_cmd->ioa_cfg->cfg_locked = 0; in ipr_reset_block_config_access()
8907 static int ipr_reset_allowed(struct ipr_ioa_cfg *ioa_cfg) in ipr_reset_allowed() argument
8911 temp_reg = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_reset_allowed()
8932 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_wait_to_start_bist() local
8935 if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) { in ipr_reset_wait_to_start_bist()
8960 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_alert() local
8965 rc = pci_read_config_word(ioa_cfg->pdev, PCI_COMMAND, &cmd_reg); in ipr_reset_alert()
8968 ipr_mask_and_clear_interrupts(ioa_cfg, ~0); in ipr_reset_alert()
8969 writel(IPR_UPROCI_RESET_ALERT, ioa_cfg->regs.set_uproc_interrupt_reg32); in ipr_reset_alert()
8993 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_quiesce_done() local
8997 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); in ipr_reset_quiesce_done()
9014 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cancel_hcam_done() local
9023 for_each_hrrq(hrrq, ioa_cfg) { in ipr_reset_cancel_hcam_done()
9027 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_reset_cancel_hcam_done()
9053 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cancel_hcam() local
9057 struct ipr_hrr_queue *hrrq = &ioa_cfg->hrrq[IPR_INIT_HRRQ]; in ipr_reset_cancel_hcam()
9063 if (!list_empty(&ioa_cfg->hostrcb_pending_q)) { in ipr_reset_cancel_hcam()
9109 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ucode_download_done() local
9110 struct ipr_sglist *sglist = ioa_cfg->ucode_sglist; in ipr_reset_ucode_download_done()
9112 dma_unmap_sg(&ioa_cfg->pdev->dev, sglist->scatterlist, in ipr_reset_ucode_download_done()
9131 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ucode_download() local
9132 struct ipr_sglist *sglist = ioa_cfg->ucode_sglist; in ipr_reset_ucode_download()
9148 if (ioa_cfg->sis64) in ipr_reset_ucode_download()
9174 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_shutdown_ioa() local
9183 !ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) { in ipr_reset_shutdown_ioa()
9193 else if (ioa_cfg->dual_raid && ipr_dual_ioa_raid) in ipr_reset_shutdown_ioa()
9221 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ioa_job() local
9226 if (ioa_cfg->reset_cmd != ipr_cmd) { in ipr_reset_ioa_job()
9262 static void _ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg, in _ipr_initiate_ioa_reset() argument
9269 ioa_cfg->in_reset_reload = 1; in _ipr_initiate_ioa_reset()
9270 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in _ipr_initiate_ioa_reset()
9271 spin_lock(&ioa_cfg->hrrq[i]._lock); in _ipr_initiate_ioa_reset()
9272 ioa_cfg->hrrq[i].allow_cmds = 0; in _ipr_initiate_ioa_reset()
9273 spin_unlock(&ioa_cfg->hrrq[i]._lock); in _ipr_initiate_ioa_reset()
9276 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) { in _ipr_initiate_ioa_reset()
9277 ioa_cfg->scsi_unblock = 0; in _ipr_initiate_ioa_reset()
9278 ioa_cfg->scsi_blocked = 1; in _ipr_initiate_ioa_reset()
9279 scsi_block_requests(ioa_cfg->host); in _ipr_initiate_ioa_reset()
9282 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in _ipr_initiate_ioa_reset()
9283 ioa_cfg->reset_cmd = ipr_cmd; in _ipr_initiate_ioa_reset()
9302 static void ipr_initiate_ioa_reset(struct ipr_ioa_cfg *ioa_cfg, in ipr_initiate_ioa_reset() argument
9307 if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) in ipr_initiate_ioa_reset()
9310 if (ioa_cfg->in_reset_reload) { in ipr_initiate_ioa_reset()
9311 if (ioa_cfg->sdt_state == GET_DUMP) in ipr_initiate_ioa_reset()
9312 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in ipr_initiate_ioa_reset()
9313 else if (ioa_cfg->sdt_state == READ_DUMP) in ipr_initiate_ioa_reset()
9314 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_initiate_ioa_reset()
9317 if (ioa_cfg->reset_retries++ >= IPR_NUM_RESET_RELOAD_RETRIES) { in ipr_initiate_ioa_reset()
9318 dev_err(&ioa_cfg->pdev->dev, in ipr_initiate_ioa_reset()
9321 ioa_cfg->reset_retries = 0; in ipr_initiate_ioa_reset()
9322 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_initiate_ioa_reset()
9323 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_initiate_ioa_reset()
9324 ioa_cfg->hrrq[i].ioa_is_dead = 1; in ipr_initiate_ioa_reset()
9325 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_initiate_ioa_reset()
9329 if (ioa_cfg->in_ioa_bringdown) { in ipr_initiate_ioa_reset()
9330 ioa_cfg->reset_cmd = NULL; in ipr_initiate_ioa_reset()
9331 ioa_cfg->in_reset_reload = 0; in ipr_initiate_ioa_reset()
9332 ipr_fail_all_ops(ioa_cfg); in ipr_initiate_ioa_reset()
9333 wake_up_all(&ioa_cfg->reset_wait_q); in ipr_initiate_ioa_reset()
9335 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].removing_ioa) { in ipr_initiate_ioa_reset()
9336 ioa_cfg->scsi_unblock = 1; in ipr_initiate_ioa_reset()
9337 schedule_work(&ioa_cfg->work_q); in ipr_initiate_ioa_reset()
9341 ioa_cfg->in_ioa_bringdown = 1; in ipr_initiate_ioa_reset()
9346 _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_shutdown_ioa, in ipr_initiate_ioa_reset()
9360 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_freeze() local
9364 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_reset_freeze()
9365 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_freeze()
9366 ioa_cfg->hrrq[i].allow_interrupts = 0; in ipr_reset_freeze()
9367 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_reset_freeze()
9385 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in ipr_pci_mmio_enabled() local
9387 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_mmio_enabled()
9388 if (!ioa_cfg->probe_done) in ipr_pci_mmio_enabled()
9390 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_mmio_enabled()
9405 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in ipr_pci_frozen() local
9407 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_frozen()
9408 if (ioa_cfg->probe_done) in ipr_pci_frozen()
9409 _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_freeze, IPR_SHUTDOWN_NONE); in ipr_pci_frozen()
9410 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_frozen()
9424 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in ipr_pci_slot_reset() local
9426 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_slot_reset()
9427 if (ioa_cfg->probe_done) { in ipr_pci_slot_reset()
9428 if (ioa_cfg->needs_warm_reset) in ipr_pci_slot_reset()
9429 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_pci_slot_reset()
9431 _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_restore_cfg_space, in ipr_pci_slot_reset()
9434 wake_up_all(&ioa_cfg->eeh_wait_q); in ipr_pci_slot_reset()
9435 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_slot_reset()
9449 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in ipr_pci_perm_failure() local
9452 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_pci_perm_failure()
9453 if (ioa_cfg->probe_done) { in ipr_pci_perm_failure()
9454 if (ioa_cfg->sdt_state == WAIT_FOR_DUMP) in ipr_pci_perm_failure()
9455 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_pci_perm_failure()
9456 ioa_cfg->reset_retries = IPR_NUM_RESET_RELOAD_RETRIES - 1; in ipr_pci_perm_failure()
9457 ioa_cfg->in_ioa_bringdown = 1; in ipr_pci_perm_failure()
9458 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_pci_perm_failure()
9459 spin_lock(&ioa_cfg->hrrq[i]._lock); in ipr_pci_perm_failure()
9460 ioa_cfg->hrrq[i].allow_cmds = 0; in ipr_pci_perm_failure()
9461 spin_unlock(&ioa_cfg->hrrq[i]._lock); in ipr_pci_perm_failure()
9464 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_pci_perm_failure()
9466 wake_up_all(&ioa_cfg->eeh_wait_q); in ipr_pci_perm_failure()
9467 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_pci_perm_failure()
9506 static int ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg) in ipr_probe_ioa_part2() argument
9512 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in ipr_probe_ioa_part2()
9513 dev_dbg(&ioa_cfg->pdev->dev, "ioa_cfg adx: 0x%p\n", ioa_cfg); in ipr_probe_ioa_part2()
9514 ioa_cfg->probe_done = 1; in ipr_probe_ioa_part2()
9515 if (ioa_cfg->needs_hard_reset) { in ipr_probe_ioa_part2()
9516 ioa_cfg->needs_hard_reset = 0; in ipr_probe_ioa_part2()
9517 ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); in ipr_probe_ioa_part2()
9519 _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa, in ipr_probe_ioa_part2()
9521 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in ipr_probe_ioa_part2()
9534 static void ipr_free_cmd_blks(struct ipr_ioa_cfg *ioa_cfg) in ipr_free_cmd_blks() argument
9538 if (ioa_cfg->ipr_cmnd_list) { in ipr_free_cmd_blks()
9540 if (ioa_cfg->ipr_cmnd_list[i]) in ipr_free_cmd_blks()
9541 dma_pool_free(ioa_cfg->ipr_cmd_pool, in ipr_free_cmd_blks()
9542 ioa_cfg->ipr_cmnd_list[i], in ipr_free_cmd_blks()
9543 ioa_cfg->ipr_cmnd_list_dma[i]); in ipr_free_cmd_blks()
9545 ioa_cfg->ipr_cmnd_list[i] = NULL; in ipr_free_cmd_blks()
9549 dma_pool_destroy(ioa_cfg->ipr_cmd_pool); in ipr_free_cmd_blks()
9551 kfree(ioa_cfg->ipr_cmnd_list); in ipr_free_cmd_blks()
9552 kfree(ioa_cfg->ipr_cmnd_list_dma); in ipr_free_cmd_blks()
9553 ioa_cfg->ipr_cmnd_list = NULL; in ipr_free_cmd_blks()
9554 ioa_cfg->ipr_cmnd_list_dma = NULL; in ipr_free_cmd_blks()
9555 ioa_cfg->ipr_cmd_pool = NULL; in ipr_free_cmd_blks()
9565 static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg) in ipr_free_mem() argument
9569 kfree(ioa_cfg->res_entries); in ipr_free_mem()
9570 dma_free_coherent(&ioa_cfg->pdev->dev, sizeof(struct ipr_misc_cbs), in ipr_free_mem()
9571 ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma); in ipr_free_mem()
9572 ipr_free_cmd_blks(ioa_cfg); in ipr_free_mem()
9574 for (i = 0; i < ioa_cfg->hrrq_num; i++) in ipr_free_mem()
9575 dma_free_coherent(&ioa_cfg->pdev->dev, in ipr_free_mem()
9576 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_free_mem()
9577 ioa_cfg->hrrq[i].host_rrq, in ipr_free_mem()
9578 ioa_cfg->hrrq[i].host_rrq_dma); in ipr_free_mem()
9580 dma_free_coherent(&ioa_cfg->pdev->dev, ioa_cfg->cfg_table_size, in ipr_free_mem()
9581 ioa_cfg->u.cfg_table, ioa_cfg->cfg_table_dma); in ipr_free_mem()
9584 dma_free_coherent(&ioa_cfg->pdev->dev, in ipr_free_mem()
9586 ioa_cfg->hostrcb[i], in ipr_free_mem()
9587 ioa_cfg->hostrcb_dma[i]); in ipr_free_mem()
9590 ipr_free_dump(ioa_cfg); in ipr_free_mem()
9591 kfree(ioa_cfg->trace); in ipr_free_mem()
9604 static void ipr_free_irqs(struct ipr_ioa_cfg *ioa_cfg) in ipr_free_irqs() argument
9606 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_free_irqs()
9609 for (i = 0; i < ioa_cfg->nvectors; i++) in ipr_free_irqs()
9610 free_irq(pci_irq_vector(pdev, i), &ioa_cfg->hrrq[i]); in ipr_free_irqs()
9624 static void ipr_free_all_resources(struct ipr_ioa_cfg *ioa_cfg) in ipr_free_all_resources() argument
9626 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_free_all_resources()
9629 ipr_free_irqs(ioa_cfg); in ipr_free_all_resources()
9630 if (ioa_cfg->reset_work_q) in ipr_free_all_resources()
9631 destroy_workqueue(ioa_cfg->reset_work_q); in ipr_free_all_resources()
9632 iounmap(ioa_cfg->hdw_dma_regs); in ipr_free_all_resources()
9634 ipr_free_mem(ioa_cfg); in ipr_free_all_resources()
9635 scsi_host_put(ioa_cfg->host); in ipr_free_all_resources()
9647 static int ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg) in ipr_alloc_cmd_blks() argument
9654 ioa_cfg->ipr_cmd_pool = dma_pool_create(IPR_NAME, &ioa_cfg->pdev->dev, in ipr_alloc_cmd_blks()
9657 if (!ioa_cfg->ipr_cmd_pool) in ipr_alloc_cmd_blks()
9660 ioa_cfg->ipr_cmnd_list = kcalloc(IPR_NUM_CMD_BLKS, sizeof(struct ipr_cmnd *), GFP_KERNEL); in ipr_alloc_cmd_blks()
9661 ioa_cfg->ipr_cmnd_list_dma = kcalloc(IPR_NUM_CMD_BLKS, sizeof(dma_addr_t), GFP_KERNEL); in ipr_alloc_cmd_blks()
9663 if (!ioa_cfg->ipr_cmnd_list || !ioa_cfg->ipr_cmnd_list_dma) { in ipr_alloc_cmd_blks()
9664 ipr_free_cmd_blks(ioa_cfg); in ipr_alloc_cmd_blks()
9668 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_alloc_cmd_blks()
9669 if (ioa_cfg->hrrq_num > 1) { in ipr_alloc_cmd_blks()
9672 ioa_cfg->hrrq[i].min_cmd_id = 0; in ipr_alloc_cmd_blks()
9673 ioa_cfg->hrrq[i].max_cmd_id = in ipr_alloc_cmd_blks()
9678 (ioa_cfg->hrrq_num - 1); in ipr_alloc_cmd_blks()
9679 ioa_cfg->hrrq[i].min_cmd_id = in ipr_alloc_cmd_blks()
9682 ioa_cfg->hrrq[i].max_cmd_id = in ipr_alloc_cmd_blks()
9688 ioa_cfg->hrrq[i].min_cmd_id = 0; in ipr_alloc_cmd_blks()
9689 ioa_cfg->hrrq[i].max_cmd_id = (entries_each_hrrq - 1); in ipr_alloc_cmd_blks()
9691 ioa_cfg->hrrq[i].size = entries_each_hrrq; in ipr_alloc_cmd_blks()
9694 BUG_ON(ioa_cfg->hrrq_num == 0); in ipr_alloc_cmd_blks()
9697 ioa_cfg->hrrq[ioa_cfg->hrrq_num - 1].max_cmd_id - 1; in ipr_alloc_cmd_blks()
9699 ioa_cfg->hrrq[ioa_cfg->hrrq_num - 1].size += i; in ipr_alloc_cmd_blks()
9700 ioa_cfg->hrrq[ioa_cfg->hrrq_num - 1].max_cmd_id += i; in ipr_alloc_cmd_blks()
9704 ipr_cmd = dma_pool_zalloc(ioa_cfg->ipr_cmd_pool, in ipr_alloc_cmd_blks()
9708 ipr_free_cmd_blks(ioa_cfg); in ipr_alloc_cmd_blks()
9712 ioa_cfg->ipr_cmnd_list[i] = ipr_cmd; in ipr_alloc_cmd_blks()
9713 ioa_cfg->ipr_cmnd_list_dma[i] = dma_addr; in ipr_alloc_cmd_blks()
9717 if (ioa_cfg->sis64) in ipr_alloc_cmd_blks()
9723 if (ioa_cfg->sis64) { in ipr_alloc_cmd_blks()
9737 ipr_cmd->ioa_cfg = ioa_cfg; in ipr_alloc_cmd_blks()
9742 ipr_cmd->hrrq = &ioa_cfg->hrrq[hrrq_id]; in ipr_alloc_cmd_blks()
9744 if (i >= ioa_cfg->hrrq[hrrq_id].max_cmd_id) in ipr_alloc_cmd_blks()
9758 static int ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg) in ipr_alloc_mem() argument
9760 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_alloc_mem()
9764 ioa_cfg->res_entries = kcalloc(ioa_cfg->max_devs_supported, in ipr_alloc_mem()
9768 if (!ioa_cfg->res_entries) in ipr_alloc_mem()
9771 for (i = 0; i < ioa_cfg->max_devs_supported; i++) { in ipr_alloc_mem()
9772 list_add_tail(&ioa_cfg->res_entries[i].queue, &ioa_cfg->free_res_q); in ipr_alloc_mem()
9773 ioa_cfg->res_entries[i].ioa_cfg = ioa_cfg; in ipr_alloc_mem()
9776 ioa_cfg->vpd_cbs = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
9778 &ioa_cfg->vpd_cbs_dma, in ipr_alloc_mem()
9781 if (!ioa_cfg->vpd_cbs) in ipr_alloc_mem()
9784 if (ipr_alloc_cmd_blks(ioa_cfg)) in ipr_alloc_mem()
9787 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_alloc_mem()
9788 ioa_cfg->hrrq[i].host_rrq = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
9789 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_alloc_mem()
9790 &ioa_cfg->hrrq[i].host_rrq_dma, in ipr_alloc_mem()
9793 if (!ioa_cfg->hrrq[i].host_rrq) { in ipr_alloc_mem()
9796 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_alloc_mem()
9797 ioa_cfg->hrrq[i].host_rrq, in ipr_alloc_mem()
9798 ioa_cfg->hrrq[i].host_rrq_dma); in ipr_alloc_mem()
9801 ioa_cfg->hrrq[i].ioa_cfg = ioa_cfg; in ipr_alloc_mem()
9804 ioa_cfg->u.cfg_table = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
9805 ioa_cfg->cfg_table_size, in ipr_alloc_mem()
9806 &ioa_cfg->cfg_table_dma, in ipr_alloc_mem()
9809 if (!ioa_cfg->u.cfg_table) in ipr_alloc_mem()
9813 ioa_cfg->hostrcb[i] = dma_alloc_coherent(&pdev->dev, in ipr_alloc_mem()
9815 &ioa_cfg->hostrcb_dma[i], in ipr_alloc_mem()
9818 if (!ioa_cfg->hostrcb[i]) in ipr_alloc_mem()
9821 ioa_cfg->hostrcb[i]->hostrcb_dma = in ipr_alloc_mem()
9822 ioa_cfg->hostrcb_dma[i] + offsetof(struct ipr_hostrcb, hcam); in ipr_alloc_mem()
9823 ioa_cfg->hostrcb[i]->ioa_cfg = ioa_cfg; in ipr_alloc_mem()
9824 list_add_tail(&ioa_cfg->hostrcb[i]->queue, &ioa_cfg->hostrcb_free_q); in ipr_alloc_mem()
9827 ioa_cfg->trace = kcalloc(IPR_NUM_TRACE_ENTRIES, in ipr_alloc_mem()
9831 if (!ioa_cfg->trace) in ipr_alloc_mem()
9842 ioa_cfg->hostrcb[i], in ipr_alloc_mem()
9843 ioa_cfg->hostrcb_dma[i]); in ipr_alloc_mem()
9845 dma_free_coherent(&pdev->dev, ioa_cfg->cfg_table_size, in ipr_alloc_mem()
9846 ioa_cfg->u.cfg_table, ioa_cfg->cfg_table_dma); in ipr_alloc_mem()
9848 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in ipr_alloc_mem()
9850 sizeof(u32) * ioa_cfg->hrrq[i].size, in ipr_alloc_mem()
9851 ioa_cfg->hrrq[i].host_rrq, in ipr_alloc_mem()
9852 ioa_cfg->hrrq[i].host_rrq_dma); in ipr_alloc_mem()
9855 ipr_free_cmd_blks(ioa_cfg); in ipr_alloc_mem()
9858 ioa_cfg->vpd_cbs, ioa_cfg->vpd_cbs_dma); in ipr_alloc_mem()
9860 kfree(ioa_cfg->res_entries); in ipr_alloc_mem()
9871 static void ipr_initialize_bus_attr(struct ipr_ioa_cfg *ioa_cfg) in ipr_initialize_bus_attr() argument
9876 ioa_cfg->bus_attr[i].bus = i; in ipr_initialize_bus_attr()
9877 ioa_cfg->bus_attr[i].qas_enabled = 0; in ipr_initialize_bus_attr()
9878 ioa_cfg->bus_attr[i].bus_width = IPR_DEFAULT_BUS_WIDTH; in ipr_initialize_bus_attr()
9880 ioa_cfg->bus_attr[i].max_xfer_rate = ipr_max_bus_speeds[ipr_max_speed]; in ipr_initialize_bus_attr()
9882 ioa_cfg->bus_attr[i].max_xfer_rate = IPR_U160_SCSI_RATE; in ipr_initialize_bus_attr()
9893 static void ipr_init_regs(struct ipr_ioa_cfg *ioa_cfg) in ipr_init_regs() argument
9899 p = &ioa_cfg->chip_cfg->regs; in ipr_init_regs()
9900 t = &ioa_cfg->regs; in ipr_init_regs()
9901 base = ioa_cfg->hdw_dma_regs; in ipr_init_regs()
9920 if (ioa_cfg->sis64) { in ipr_init_regs()
9937 static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, in ipr_init_ioa_cfg() argument
9942 ioa_cfg->host = host; in ipr_init_ioa_cfg()
9943 ioa_cfg->pdev = pdev; in ipr_init_ioa_cfg()
9944 ioa_cfg->log_level = ipr_log_level; in ipr_init_ioa_cfg()
9945 ioa_cfg->doorbell = IPR_DOORBELL; in ipr_init_ioa_cfg()
9946 sprintf(ioa_cfg->eye_catcher, IPR_EYECATCHER); in ipr_init_ioa_cfg()
9947 sprintf(ioa_cfg->trace_start, IPR_TRACE_START_LABEL); in ipr_init_ioa_cfg()
9948 sprintf(ioa_cfg->cfg_table_start, IPR_CFG_TBL_START); in ipr_init_ioa_cfg()
9949 sprintf(ioa_cfg->resource_table_label, IPR_RES_TABLE_LABEL); in ipr_init_ioa_cfg()
9950 sprintf(ioa_cfg->ipr_hcam_label, IPR_HCAM_LABEL); in ipr_init_ioa_cfg()
9951 sprintf(ioa_cfg->ipr_cmd_label, IPR_CMD_LABEL); in ipr_init_ioa_cfg()
9953 INIT_LIST_HEAD(&ioa_cfg->hostrcb_free_q); in ipr_init_ioa_cfg()
9954 INIT_LIST_HEAD(&ioa_cfg->hostrcb_pending_q); in ipr_init_ioa_cfg()
9955 INIT_LIST_HEAD(&ioa_cfg->hostrcb_report_q); in ipr_init_ioa_cfg()
9956 INIT_LIST_HEAD(&ioa_cfg->free_res_q); in ipr_init_ioa_cfg()
9957 INIT_LIST_HEAD(&ioa_cfg->used_res_q); in ipr_init_ioa_cfg()
9958 INIT_WORK(&ioa_cfg->work_q, ipr_worker_thread); in ipr_init_ioa_cfg()
9959 INIT_WORK(&ioa_cfg->scsi_add_work_q, ipr_add_remove_thread); in ipr_init_ioa_cfg()
9960 init_waitqueue_head(&ioa_cfg->reset_wait_q); in ipr_init_ioa_cfg()
9961 init_waitqueue_head(&ioa_cfg->msi_wait_q); in ipr_init_ioa_cfg()
9962 init_waitqueue_head(&ioa_cfg->eeh_wait_q); in ipr_init_ioa_cfg()
9963 ioa_cfg->sdt_state = INACTIVE; in ipr_init_ioa_cfg()
9965 ipr_initialize_bus_attr(ioa_cfg); in ipr_init_ioa_cfg()
9966 ioa_cfg->max_devs_supported = ipr_max_devs; in ipr_init_ioa_cfg()
9968 if (ioa_cfg->sis64) { in ipr_init_ioa_cfg()
9973 ioa_cfg->max_devs_supported = IPR_MAX_SIS64_DEVS; in ipr_init_ioa_cfg()
9974 ioa_cfg->cfg_table_size = (sizeof(struct ipr_config_table_hdr64) in ipr_init_ioa_cfg()
9976 * ioa_cfg->max_devs_supported))); in ipr_init_ioa_cfg()
9982 ioa_cfg->max_devs_supported = IPR_MAX_PHYSICAL_DEVS; in ipr_init_ioa_cfg()
9983 ioa_cfg->cfg_table_size = (sizeof(struct ipr_config_table_hdr) in ipr_init_ioa_cfg()
9985 * ioa_cfg->max_devs_supported))); in ipr_init_ioa_cfg()
9990 host->can_queue = ioa_cfg->max_cmds; in ipr_init_ioa_cfg()
9991 pci_set_drvdata(pdev, ioa_cfg); in ipr_init_ioa_cfg()
9993 for (i = 0; i < ARRAY_SIZE(ioa_cfg->hrrq); i++) { in ipr_init_ioa_cfg()
9994 INIT_LIST_HEAD(&ioa_cfg->hrrq[i].hrrq_free_q); in ipr_init_ioa_cfg()
9995 INIT_LIST_HEAD(&ioa_cfg->hrrq[i].hrrq_pending_q); in ipr_init_ioa_cfg()
9996 spin_lock_init(&ioa_cfg->hrrq[i]._lock); in ipr_init_ioa_cfg()
9998 ioa_cfg->hrrq[i].lock = ioa_cfg->host->host_lock; in ipr_init_ioa_cfg()
10000 ioa_cfg->hrrq[i].lock = &ioa_cfg->hrrq[i]._lock; in ipr_init_ioa_cfg()
10031 static void ipr_wait_for_pci_err_recovery(struct ipr_ioa_cfg *ioa_cfg) in ipr_wait_for_pci_err_recovery() argument
10033 struct pci_dev *pdev = ioa_cfg->pdev; in ipr_wait_for_pci_err_recovery()
10036 wait_event_timeout(ioa_cfg->eeh_wait_q, in ipr_wait_for_pci_err_recovery()
10043 static void name_msi_vectors(struct ipr_ioa_cfg *ioa_cfg) in name_msi_vectors() argument
10045 int vec_idx, n = sizeof(ioa_cfg->vectors_info[0].desc) - 1; in name_msi_vectors()
10047 for (vec_idx = 0; vec_idx < ioa_cfg->nvectors; vec_idx++) { in name_msi_vectors()
10048 snprintf(ioa_cfg->vectors_info[vec_idx].desc, n, in name_msi_vectors()
10049 "host%d-%d", ioa_cfg->host->host_no, vec_idx); in name_msi_vectors()
10050 ioa_cfg->vectors_info[vec_idx]. in name_msi_vectors()
10051 desc[strlen(ioa_cfg->vectors_info[vec_idx].desc)] = 0; in name_msi_vectors()
10055 static int ipr_request_other_msi_irqs(struct ipr_ioa_cfg *ioa_cfg, in ipr_request_other_msi_irqs() argument
10060 for (i = 1; i < ioa_cfg->nvectors; i++) { in ipr_request_other_msi_irqs()
10064 ioa_cfg->vectors_info[i].desc, in ipr_request_other_msi_irqs()
10065 &ioa_cfg->hrrq[i]); in ipr_request_other_msi_irqs()
10069 &ioa_cfg->hrrq[i]); in ipr_request_other_msi_irqs()
10089 struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)devp; in ipr_test_intr() local
10093 dev_info(&ioa_cfg->pdev->dev, "Received IRQ : %d\n", irq); in ipr_test_intr()
10094 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_test_intr()
10096 ioa_cfg->msi_received = 1; in ipr_test_intr()
10097 wake_up(&ioa_cfg->msi_wait_q); in ipr_test_intr()
10099 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_test_intr()
10115 static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev) in ipr_test_msi() argument
10123 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
10124 init_waitqueue_head(&ioa_cfg->msi_wait_q); in ipr_test_msi()
10125 ioa_cfg->msi_received = 0; in ipr_test_msi()
10126 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); in ipr_test_msi()
10127 writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.clr_interrupt_mask_reg32); in ipr_test_msi()
10128 readl(ioa_cfg->regs.sense_interrupt_mask_reg); in ipr_test_msi()
10129 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
10131 rc = request_irq(irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg); in ipr_test_msi()
10138 writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.sense_interrupt_reg32); in ipr_test_msi()
10139 readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_test_msi()
10140 wait_event_timeout(ioa_cfg->msi_wait_q, ioa_cfg->msi_received, HZ); in ipr_test_msi()
10141 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
10142 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); in ipr_test_msi()
10144 if (!ioa_cfg->msi_received) { in ipr_test_msi()
10151 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_test_msi()
10153 free_irq(irq, ioa_cfg); in ipr_test_msi()
10170 struct ipr_ioa_cfg *ioa_cfg; in ipr_probe_ioa() local
10182 host = scsi_host_alloc(&driver_template, sizeof(*ioa_cfg)); in ipr_probe_ioa()
10190 ioa_cfg = (struct ipr_ioa_cfg *)host->hostdata; in ipr_probe_ioa()
10191 memset(ioa_cfg, 0, sizeof(struct ipr_ioa_cfg)); in ipr_probe_ioa()
10192 ata_host_init(&ioa_cfg->ata_host, &pdev->dev, &ipr_sata_ops); in ipr_probe_ioa()
10194 ioa_cfg->ipr_chip = ipr_get_chip_info(dev_id); in ipr_probe_ioa()
10196 if (!ioa_cfg->ipr_chip) { in ipr_probe_ioa()
10203 ioa_cfg->sis64 = ioa_cfg->ipr_chip->sis_type == IPR_SIS64 ? 1 : 0; in ipr_probe_ioa()
10204 ioa_cfg->chip_cfg = ioa_cfg->ipr_chip->cfg; in ipr_probe_ioa()
10205 ioa_cfg->clear_isr = ioa_cfg->chip_cfg->clear_isr; in ipr_probe_ioa()
10206 ioa_cfg->max_cmds = ioa_cfg->chip_cfg->max_cmds; in ipr_probe_ioa()
10209 ioa_cfg->transop_timeout = ipr_transop_timeout; in ipr_probe_ioa()
10211 ioa_cfg->transop_timeout = IPR_LONG_OPERATIONAL_TIMEOUT; in ipr_probe_ioa()
10213 ioa_cfg->transop_timeout = IPR_OPERATIONAL_TIMEOUT; in ipr_probe_ioa()
10215 ioa_cfg->revid = pdev->revision; in ipr_probe_ioa()
10217 ipr_init_ioa_cfg(ioa_cfg, host, pdev); in ipr_probe_ioa()
10232 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10238 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10252 ioa_cfg->hdw_dma_regs = ipr_regs; in ipr_probe_ioa()
10253 ioa_cfg->hdw_dma_regs_pci = ipr_regs_pci; in ipr_probe_ioa()
10254 ioa_cfg->ioa_mailbox = ioa_cfg->chip_cfg->mailbox + ipr_regs; in ipr_probe_ioa()
10256 ipr_init_regs(ioa_cfg); in ipr_probe_ioa()
10258 if (ioa_cfg->sis64) { in ipr_probe_ioa()
10274 ioa_cfg->chip_cfg->cache_line_size); in ipr_probe_ioa()
10278 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10284 interrupts = readl(ioa_cfg->regs.sense_interrupt_reg); in ipr_probe_ioa()
10285 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10294 if (ioa_cfg->ipr_chip->has_msi) in ipr_probe_ioa()
10298 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10301 ioa_cfg->nvectors = rc; in ipr_probe_ioa()
10304 ioa_cfg->clear_isr = 1; in ipr_probe_ioa()
10309 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10318 rc = ipr_test_msi(ioa_cfg, pdev); in ipr_probe_ioa()
10322 "Request for %d MSI%ss succeeded.", ioa_cfg->nvectors, in ipr_probe_ioa()
10326 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10329 ioa_cfg->nvectors = 1; in ipr_probe_ioa()
10330 ioa_cfg->clear_isr = 1; in ipr_probe_ioa()
10337 ioa_cfg->hrrq_num = min3(ioa_cfg->nvectors, in ipr_probe_ioa()
10341 if ((rc = ipr_save_pcix_cmd_reg(ioa_cfg))) in ipr_probe_ioa()
10344 if ((rc = ipr_set_pcix_cmd_reg(ioa_cfg))) in ipr_probe_ioa()
10347 rc = ipr_alloc_mem(ioa_cfg); in ipr_probe_ioa()
10367 mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg32); in ipr_probe_ioa()
10368 interrupts = readl(ioa_cfg->regs.sense_interrupt_reg32); in ipr_probe_ioa()
10369 uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); in ipr_probe_ioa()
10371 ioa_cfg->needs_hard_reset = 1; in ipr_probe_ioa()
10373 ioa_cfg->needs_hard_reset = 1; in ipr_probe_ioa()
10375 ioa_cfg->ioa_unit_checked = 1; in ipr_probe_ioa()
10377 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_probe_ioa()
10378 ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); in ipr_probe_ioa()
10379 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_probe_ioa()
10382 name_msi_vectors(ioa_cfg); in ipr_probe_ioa()
10384 ioa_cfg->vectors_info[0].desc, in ipr_probe_ioa()
10385 &ioa_cfg->hrrq[0]); in ipr_probe_ioa()
10387 rc = ipr_request_other_msi_irqs(ioa_cfg, pdev); in ipr_probe_ioa()
10391 IPR_NAME, &ioa_cfg->hrrq[0]); in ipr_probe_ioa()
10400 (dev_id->device == PCI_DEVICE_ID_IBM_OBSIDIAN_E && !ioa_cfg->revid)) { in ipr_probe_ioa()
10401 ioa_cfg->needs_warm_reset = 1; in ipr_probe_ioa()
10402 ioa_cfg->reset = ipr_reset_slot_reset; in ipr_probe_ioa()
10404 ioa_cfg->reset_work_q = alloc_ordered_workqueue("ipr_reset_%d", in ipr_probe_ioa()
10407 if (!ioa_cfg->reset_work_q) { in ipr_probe_ioa()
10413 ioa_cfg->reset = ipr_reset_start_bist; in ipr_probe_ioa()
10416 list_add_tail(&ioa_cfg->queue, &ipr_ioa_head); in ipr_probe_ioa()
10424 ipr_free_irqs(ioa_cfg); in ipr_probe_ioa()
10426 ipr_free_mem(ioa_cfg); in ipr_probe_ioa()
10428 ipr_wait_for_pci_err_recovery(ioa_cfg); in ipr_probe_ioa()
10455 static void ipr_initiate_ioa_bringdown(struct ipr_ioa_cfg *ioa_cfg, in ipr_initiate_ioa_bringdown() argument
10459 if (ioa_cfg->sdt_state == WAIT_FOR_DUMP) in ipr_initiate_ioa_bringdown()
10460 ioa_cfg->sdt_state = ABORT_DUMP; in ipr_initiate_ioa_bringdown()
10461 ioa_cfg->reset_retries = 0; in ipr_initiate_ioa_bringdown()
10462 ioa_cfg->in_ioa_bringdown = 1; in ipr_initiate_ioa_bringdown()
10463 ipr_initiate_ioa_reset(ioa_cfg, shutdown_type); in ipr_initiate_ioa_bringdown()
10479 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in __ipr_remove() local
10484 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
10485 while (ioa_cfg->in_reset_reload) { in __ipr_remove()
10486 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
10487 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in __ipr_remove()
10488 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
10491 for (i = 0; i < ioa_cfg->hrrq_num; i++) { in __ipr_remove()
10492 spin_lock(&ioa_cfg->hrrq[i]._lock); in __ipr_remove()
10493 ioa_cfg->hrrq[i].removing_ioa = 1; in __ipr_remove()
10494 spin_unlock(&ioa_cfg->hrrq[i]._lock); in __ipr_remove()
10497 ipr_initiate_ioa_bringdown(ioa_cfg, IPR_SHUTDOWN_NORMAL); in __ipr_remove()
10499 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
10500 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in __ipr_remove()
10501 flush_work(&ioa_cfg->work_q); in __ipr_remove()
10502 if (ioa_cfg->reset_work_q) in __ipr_remove()
10503 flush_workqueue(ioa_cfg->reset_work_q); in __ipr_remove()
10504 INIT_LIST_HEAD(&ioa_cfg->used_res_q); in __ipr_remove()
10505 spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
10508 list_del(&ioa_cfg->queue); in __ipr_remove()
10511 if (ioa_cfg->sdt_state == ABORT_DUMP) in __ipr_remove()
10512 ioa_cfg->sdt_state = WAIT_FOR_DUMP; in __ipr_remove()
10513 spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); in __ipr_remove()
10515 ipr_free_all_resources(ioa_cfg); in __ipr_remove()
10531 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in ipr_remove() local
10535 ipr_remove_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_remove()
10537 ipr_remove_dump_file(&ioa_cfg->host->shost_dev.kobj, in ipr_remove()
10539 sysfs_remove_bin_file(&ioa_cfg->host->shost_dev.kobj, in ipr_remove()
10541 scsi_remove_host(ioa_cfg->host); in ipr_remove()
10558 struct ipr_ioa_cfg *ioa_cfg; in ipr_probe() local
10567 ioa_cfg = pci_get_drvdata(pdev); in ipr_probe()
10568 rc = ipr_probe_ioa_part2(ioa_cfg); in ipr_probe()
10575 rc = scsi_add_host(ioa_cfg->host, &pdev->dev); in ipr_probe()
10582 rc = ipr_create_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10586 scsi_remove_host(ioa_cfg->host); in ipr_probe()
10591 rc = sysfs_create_bin_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10595 ipr_remove_dump_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10597 ipr_remove_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10599 scsi_remove_host(ioa_cfg->host); in ipr_probe()
10604 rc = ipr_create_dump_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10608 sysfs_remove_bin_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10610 ipr_remove_trace_file(&ioa_cfg->host->shost_dev.kobj, in ipr_probe()
10612 scsi_remove_host(ioa_cfg->host); in ipr_probe()
10616 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_probe()
10617 ioa_cfg->scan_enabled = 1; in ipr_probe()
10618 schedule_work(&ioa_cfg->work_q); in ipr_probe()
10619 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_probe()
10621 ioa_cfg->iopoll_weight = ioa_cfg->chip_cfg->iopoll_weight; in ipr_probe()
10623 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_probe()
10624 for (i = 1; i < ioa_cfg->hrrq_num; i++) { in ipr_probe()
10625 irq_poll_init(&ioa_cfg->hrrq[i].iopoll, in ipr_probe()
10626 ioa_cfg->iopoll_weight, ipr_iopoll); in ipr_probe()
10630 scsi_scan_host(ioa_cfg->host); in ipr_probe()
10647 struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev); in ipr_shutdown() local
10652 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
10653 if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) { in ipr_shutdown()
10654 ioa_cfg->iopoll_weight = 0; in ipr_shutdown()
10655 for (i = 1; i < ioa_cfg->hrrq_num; i++) in ipr_shutdown()
10656 irq_poll_disable(&ioa_cfg->hrrq[i].iopoll); in ipr_shutdown()
10659 while (ioa_cfg->in_reset_reload) { in ipr_shutdown()
10660 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
10661 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_shutdown()
10662 spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
10665 if (ipr_fast_reboot && system_state == SYSTEM_RESTART && ioa_cfg->sis64) in ipr_shutdown()
10668 ipr_initiate_ioa_bringdown(ioa_cfg, shutdown_type); in ipr_shutdown()
10669 spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); in ipr_shutdown()
10670 wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); in ipr_shutdown()
10671 if (ipr_fast_reboot && system_state == SYSTEM_RESTART && ioa_cfg->sis64) { in ipr_shutdown()
10672 ipr_free_irqs(ioa_cfg); in ipr_shutdown()
10673 pci_disable_device(ioa_cfg->pdev); in ipr_shutdown()
10830 struct ipr_ioa_cfg *ioa_cfg; in ipr_halt() local
10838 list_for_each_entry(ioa_cfg, &ipr_ioa_head, queue) { in ipr_halt()
10839 spin_lock_irqsave(ioa_cfg->host->host_lock, flags); in ipr_halt()
10840 if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds || in ipr_halt()
10841 (ipr_fast_reboot && event == SYS_RESTART && ioa_cfg->sis64)) { in ipr_halt()
10842 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_halt()
10846 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_halt()
10853 spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); in ipr_halt()