diff options
author | James Smart <James.Smart@Emulex.Com> | 2008-08-24 21:50:30 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-10-13 09:28:55 -0400 |
commit | 9399627f340794baebf7e4581470ccb92f019acc (patch) | |
tree | c30e656a1c353e2f025bb5ca3daf142128434a34 /drivers/scsi/lpfc/lpfc_init.c | |
parent | 0f1f53a7efd60d7cdd8e82925f0c62dcf64ba092 (diff) |
[SCSI] lpfc 8.2.8 : Add MSI-X support
Add support for MSI-X Multi-Message interrupts. We use different vectors
for fast-path interrupts (i/o) and slow-patch interrupts (discovery, etc).
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 230 |
1 files changed, 185 insertions, 45 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 333166b17908..49577d5f130f 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -389,6 +389,29 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
389 | if (phba->sli_rev != 3) | 389 | if (phba->sli_rev != 3) |
390 | lpfc_post_rcv_buf(phba); | 390 | lpfc_post_rcv_buf(phba); |
391 | 391 | ||
392 | /* | ||
393 | * Configure HBA MSI-X attention conditions to messages if MSI-X mode | ||
394 | */ | ||
395 | if (phba->intr_type == MSIX) { | ||
396 | rc = lpfc_config_msi(phba, pmb); | ||
397 | if (rc) { | ||
398 | mempool_free(pmb, phba->mbox_mem_pool); | ||
399 | return -EIO; | ||
400 | } | ||
401 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); | ||
402 | if (rc != MBX_SUCCESS) { | ||
403 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX, | ||
404 | "0352 Config MSI mailbox command " | ||
405 | "failed, mbxCmd x%x, mbxStatus x%x\n", | ||
406 | pmb->mb.mbxCommand, pmb->mb.mbxStatus); | ||
407 | mempool_free(pmb, phba->mbox_mem_pool); | ||
408 | return -EIO; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | /* Initialize ERATT handling flag */ | ||
413 | phba->hba_flag &= ~HBA_ERATT_HANDLED; | ||
414 | |||
392 | /* Enable appropriate host interrupts */ | 415 | /* Enable appropriate host interrupts */ |
393 | spin_lock_irq(&phba->hbalock); | 416 | spin_lock_irq(&phba->hbalock); |
394 | status = readl(phba->HCregaddr); | 417 | status = readl(phba->HCregaddr); |
@@ -404,20 +427,21 @@ lpfc_config_port_post(struct lpfc_hba *phba) | |||
404 | 427 | ||
405 | if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) && | 428 | if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) && |
406 | (phba->cfg_poll & DISABLE_FCP_RING_INT)) | 429 | (phba->cfg_poll & DISABLE_FCP_RING_INT)) |
407 | status &= ~(HC_R0INT_ENA << LPFC_FCP_RING); | 430 | status &= ~(HC_R0INT_ENA); |
408 | 431 | ||
409 | writel(status, phba->HCregaddr); | 432 | writel(status, phba->HCregaddr); |
410 | readl(phba->HCregaddr); /* flush */ | 433 | readl(phba->HCregaddr); /* flush */ |
411 | spin_unlock_irq(&phba->hbalock); | 434 | spin_unlock_irq(&phba->hbalock); |
412 | 435 | ||
413 | /* | 436 | /* Set up ring-0 (ELS) timer */ |
414 | * Setup the ring 0 (els) timeout handler | 437 | timeout = phba->fc_ratov * 2; |
415 | */ | ||
416 | timeout = phba->fc_ratov << 1; | ||
417 | mod_timer(&vport->els_tmofunc, jiffies + HZ * timeout); | 438 | mod_timer(&vport->els_tmofunc, jiffies + HZ * timeout); |
439 | /* Set up heart beat (HB) timer */ | ||
418 | mod_timer(&phba->hb_tmofunc, jiffies + HZ * LPFC_HB_MBOX_INTERVAL); | 440 | mod_timer(&phba->hb_tmofunc, jiffies + HZ * LPFC_HB_MBOX_INTERVAL); |
419 | phba->hb_outstanding = 0; | 441 | phba->hb_outstanding = 0; |
420 | phba->last_completion_time = jiffies; | 442 | phba->last_completion_time = jiffies; |
443 | /* Set up error attention (ERATT) polling timer */ | ||
444 | mod_timer(&phba->eratt_poll, jiffies + HZ * LPFC_ERATT_POLL_INTERVAL); | ||
421 | 445 | ||
422 | lpfc_init_link(phba, pmb, phba->cfg_topology, phba->cfg_link_speed); | 446 | lpfc_init_link(phba, pmb, phba->cfg_topology, phba->cfg_link_speed); |
423 | pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; | 447 | pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; |
@@ -581,12 +605,15 @@ lpfc_hb_timeout(unsigned long ptr) | |||
581 | unsigned long iflag; | 605 | unsigned long iflag; |
582 | 606 | ||
583 | phba = (struct lpfc_hba *)ptr; | 607 | phba = (struct lpfc_hba *)ptr; |
608 | |||
609 | /* Check for heart beat timeout conditions */ | ||
584 | spin_lock_irqsave(&phba->pport->work_port_lock, iflag); | 610 | spin_lock_irqsave(&phba->pport->work_port_lock, iflag); |
585 | tmo_posted = phba->pport->work_port_events & WORKER_HB_TMO; | 611 | tmo_posted = phba->pport->work_port_events & WORKER_HB_TMO; |
586 | if (!tmo_posted) | 612 | if (!tmo_posted) |
587 | phba->pport->work_port_events |= WORKER_HB_TMO; | 613 | phba->pport->work_port_events |= WORKER_HB_TMO; |
588 | spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag); | 614 | spin_unlock_irqrestore(&phba->pport->work_port_lock, iflag); |
589 | 615 | ||
616 | /* Tell the worker thread there is work to do */ | ||
590 | if (!tmo_posted) | 617 | if (!tmo_posted) |
591 | lpfc_worker_wake_up(phba); | 618 | lpfc_worker_wake_up(phba); |
592 | return; | 619 | return; |
@@ -617,6 +644,7 @@ lpfc_hb_mbox_cmpl(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmboxq) | |||
617 | phba->hb_outstanding = 0; | 644 | phba->hb_outstanding = 0; |
618 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); | 645 | spin_unlock_irqrestore(&phba->hbalock, drvr_flag); |
619 | 646 | ||
647 | /* Check and reset heart-beat timer is necessary */ | ||
620 | mempool_free(pmboxq, phba->mbox_mem_pool); | 648 | mempool_free(pmboxq, phba->mbox_mem_pool); |
621 | if (!(phba->pport->fc_flag & FC_OFFLINE_MODE) && | 649 | if (!(phba->pport->fc_flag & FC_OFFLINE_MODE) && |
622 | !(phba->link_state == LPFC_HBA_ERROR) && | 650 | !(phba->link_state == LPFC_HBA_ERROR) && |
@@ -856,8 +884,8 @@ lpfc_handle_eratt(struct lpfc_hba *phba) | |||
856 | 884 | ||
857 | } else { | 885 | } else { |
858 | /* The if clause above forces this code path when the status | 886 | /* The if clause above forces this code path when the status |
859 | * failure is a value other than FFER6. Do not call the offline | 887 | * failure is a value other than FFER6. Do not call the offline |
860 | * twice. This is the adapter hardware error path. | 888 | * twice. This is the adapter hardware error path. |
861 | */ | 889 | */ |
862 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 890 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
863 | "0457 Adapter Hardware Error " | 891 | "0457 Adapter Hardware Error " |
@@ -873,6 +901,7 @@ lpfc_handle_eratt(struct lpfc_hba *phba) | |||
873 | 901 | ||
874 | lpfc_offline_eratt(phba); | 902 | lpfc_offline_eratt(phba); |
875 | } | 903 | } |
904 | return; | ||
876 | } | 905 | } |
877 | 906 | ||
878 | /** | 907 | /** |
@@ -1656,6 +1685,7 @@ lpfc_stop_phba_timers(struct lpfc_hba *phba) | |||
1656 | del_timer_sync(&phba->fabric_block_timer); | 1685 | del_timer_sync(&phba->fabric_block_timer); |
1657 | phba->hb_outstanding = 0; | 1686 | phba->hb_outstanding = 0; |
1658 | del_timer_sync(&phba->hb_tmofunc); | 1687 | del_timer_sync(&phba->hb_tmofunc); |
1688 | del_timer_sync(&phba->eratt_poll); | ||
1659 | return; | 1689 | return; |
1660 | } | 1690 | } |
1661 | 1691 | ||
@@ -2172,30 +2202,97 @@ void lpfc_host_attrib_init(struct Scsi_Host *shost) | |||
2172 | static int | 2202 | static int |
2173 | lpfc_enable_msix(struct lpfc_hba *phba) | 2203 | lpfc_enable_msix(struct lpfc_hba *phba) |
2174 | { | 2204 | { |
2175 | int error; | 2205 | int rc, i; |
2206 | LPFC_MBOXQ_t *pmb; | ||
2176 | 2207 | ||
2177 | phba->msix_entries[0].entry = 0; | 2208 | /* Set up MSI-X multi-message vectors */ |
2178 | phba->msix_entries[0].vector = 0; | 2209 | for (i = 0; i < LPFC_MSIX_VECTORS; i++) |
2210 | phba->msix_entries[i].entry = i; | ||
2179 | 2211 | ||
2180 | error = pci_enable_msix(phba->pcidev, phba->msix_entries, | 2212 | /* Configure MSI-X capability structure */ |
2213 | rc = pci_enable_msix(phba->pcidev, phba->msix_entries, | ||
2181 | ARRAY_SIZE(phba->msix_entries)); | 2214 | ARRAY_SIZE(phba->msix_entries)); |
2182 | if (error) { | 2215 | if (rc) { |
2183 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | 2216 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, |
2184 | "0420 Enable MSI-X failed (%d), continuing " | 2217 | "0420 Enable MSI-X failed (%d), continuing " |
2185 | "with MSI\n", error); | 2218 | "with MSI\n", rc); |
2186 | pci_disable_msix(phba->pcidev); | 2219 | goto msi_fail_out; |
2187 | return error; | 2220 | } else |
2221 | for (i = 0; i < LPFC_MSIX_VECTORS; i++) | ||
2222 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2223 | "0477 MSI-X entry[%d]: vector=x%x " | ||
2224 | "message=%d\n", i, | ||
2225 | phba->msix_entries[i].vector, | ||
2226 | phba->msix_entries[i].entry); | ||
2227 | /* | ||
2228 | * Assign MSI-X vectors to interrupt handlers | ||
2229 | */ | ||
2230 | |||
2231 | /* vector-0 is associated to slow-path handler */ | ||
2232 | rc = request_irq(phba->msix_entries[0].vector, &lpfc_sp_intr_handler, | ||
2233 | IRQF_SHARED, LPFC_SP_DRIVER_HANDLER_NAME, phba); | ||
2234 | if (rc) { | ||
2235 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
2236 | "0421 MSI-X slow-path request_irq failed " | ||
2237 | "(%d), continuing with MSI\n", rc); | ||
2238 | goto msi_fail_out; | ||
2188 | } | 2239 | } |
2189 | 2240 | ||
2190 | error = request_irq(phba->msix_entries[0].vector, lpfc_intr_handler, 0, | 2241 | /* vector-1 is associated to fast-path handler */ |
2191 | LPFC_DRIVER_NAME, phba); | 2242 | rc = request_irq(phba->msix_entries[1].vector, &lpfc_fp_intr_handler, |
2192 | if (error) { | 2243 | IRQF_SHARED, LPFC_FP_DRIVER_HANDLER_NAME, phba); |
2244 | |||
2245 | if (rc) { | ||
2193 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 2246 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
2194 | "0421 MSI-X request_irq failed (%d), " | 2247 | "0429 MSI-X fast-path request_irq failed " |
2195 | "continuing with MSI\n", error); | 2248 | "(%d), continuing with MSI\n", rc); |
2196 | pci_disable_msix(phba->pcidev); | 2249 | goto irq_fail_out; |
2197 | } | 2250 | } |
2198 | return error; | 2251 | |
2252 | /* | ||
2253 | * Configure HBA MSI-X attention conditions to messages | ||
2254 | */ | ||
2255 | pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
2256 | |||
2257 | if (!pmb) { | ||
2258 | rc = -ENOMEM; | ||
2259 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
2260 | "0474 Unable to allocate memory for issuing " | ||
2261 | "MBOX_CONFIG_MSI command\n"); | ||
2262 | goto mem_fail_out; | ||
2263 | } | ||
2264 | rc = lpfc_config_msi(phba, pmb); | ||
2265 | if (rc) | ||
2266 | goto mbx_fail_out; | ||
2267 | rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL); | ||
2268 | if (rc != MBX_SUCCESS) { | ||
2269 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX, | ||
2270 | "0351 Config MSI mailbox command failed, " | ||
2271 | "mbxCmd x%x, mbxStatus x%x\n", | ||
2272 | pmb->mb.mbxCommand, pmb->mb.mbxStatus); | ||
2273 | goto mbx_fail_out; | ||
2274 | } | ||
2275 | |||
2276 | /* Free memory allocated for mailbox command */ | ||
2277 | mempool_free(pmb, phba->mbox_mem_pool); | ||
2278 | return rc; | ||
2279 | |||
2280 | mbx_fail_out: | ||
2281 | /* Free memory allocated for mailbox command */ | ||
2282 | mempool_free(pmb, phba->mbox_mem_pool); | ||
2283 | |||
2284 | mem_fail_out: | ||
2285 | /* free the irq already requested */ | ||
2286 | free_irq(phba->msix_entries[1].vector, phba); | ||
2287 | |||
2288 | irq_fail_out: | ||
2289 | /* free the irq already requested */ | ||
2290 | free_irq(phba->msix_entries[0].vector, phba); | ||
2291 | |||
2292 | msi_fail_out: | ||
2293 | /* Unconfigure MSI-X capability structure */ | ||
2294 | pci_disable_msix(phba->pcidev); | ||
2295 | return rc; | ||
2199 | } | 2296 | } |
2200 | 2297 | ||
2201 | /** | 2298 | /** |
@@ -2208,7 +2305,12 @@ lpfc_enable_msix(struct lpfc_hba *phba) | |||
2208 | static void | 2305 | static void |
2209 | lpfc_disable_msix(struct lpfc_hba *phba) | 2306 | lpfc_disable_msix(struct lpfc_hba *phba) |
2210 | { | 2307 | { |
2211 | free_irq(phba->msix_entries[0].vector, phba); | 2308 | int i; |
2309 | |||
2310 | /* Free up MSI-X multi-message vectors */ | ||
2311 | for (i = 0; i < LPFC_MSIX_VECTORS; i++) | ||
2312 | free_irq(phba->msix_entries[i].vector, phba); | ||
2313 | /* Disable MSI-X */ | ||
2212 | pci_disable_msix(phba->pcidev); | 2314 | pci_disable_msix(phba->pcidev); |
2213 | } | 2315 | } |
2214 | 2316 | ||
@@ -2288,6 +2390,9 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2288 | init_timer(&phba->fabric_block_timer); | 2390 | init_timer(&phba->fabric_block_timer); |
2289 | phba->fabric_block_timer.function = lpfc_fabric_block_timeout; | 2391 | phba->fabric_block_timer.function = lpfc_fabric_block_timeout; |
2290 | phba->fabric_block_timer.data = (unsigned long) phba; | 2392 | phba->fabric_block_timer.data = (unsigned long) phba; |
2393 | init_timer(&phba->eratt_poll); | ||
2394 | phba->eratt_poll.function = lpfc_poll_eratt; | ||
2395 | phba->eratt_poll.data = (unsigned long) phba; | ||
2291 | 2396 | ||
2292 | pci_set_master(pdev); | 2397 | pci_set_master(pdev); |
2293 | pci_try_set_mwi(pdev); | 2398 | pci_try_set_mwi(pdev); |
@@ -2307,7 +2412,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2307 | bar2map_len = pci_resource_len(phba->pcidev, 2); | 2412 | bar2map_len = pci_resource_len(phba->pcidev, 2); |
2308 | 2413 | ||
2309 | /* Map HBA SLIM to a kernel virtual address. */ | 2414 | /* Map HBA SLIM to a kernel virtual address. */ |
2310 | phba->slim_memmap_p = ioremap(phba->pci_bar0_map, bar0map_len); | 2415 | phba->slim_memmap_p = ioremap(phba->pci_bar0_map, bar0map_len); |
2311 | if (!phba->slim_memmap_p) { | 2416 | if (!phba->slim_memmap_p) { |
2312 | error = -ENODEV; | 2417 | error = -ENODEV; |
2313 | dev_printk(KERN_ERR, &pdev->dev, | 2418 | dev_printk(KERN_ERR, &pdev->dev, |
@@ -2405,7 +2510,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2405 | phba->fc_arbtov = FF_DEF_ARBTOV; | 2510 | phba->fc_arbtov = FF_DEF_ARBTOV; |
2406 | 2511 | ||
2407 | INIT_LIST_HEAD(&phba->work_list); | 2512 | INIT_LIST_HEAD(&phba->work_list); |
2408 | phba->work_ha_mask = (HA_ERATT|HA_MBATT|HA_LATT); | 2513 | phba->work_ha_mask = (HA_ERATT | HA_MBATT | HA_LATT); |
2409 | phba->work_ha_mask |= (HA_RXMASK << (LPFC_ELS_RING * 4)); | 2514 | phba->work_ha_mask |= (HA_RXMASK << (LPFC_ELS_RING * 4)); |
2410 | 2515 | ||
2411 | /* Initialize the wait queue head for the kernel thread */ | 2516 | /* Initialize the wait queue head for the kernel thread */ |
@@ -2440,21 +2545,42 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2440 | pci_set_drvdata(pdev, shost); | 2545 | pci_set_drvdata(pdev, shost); |
2441 | phba->intr_type = NONE; | 2546 | phba->intr_type = NONE; |
2442 | 2547 | ||
2548 | phba->MBslimaddr = phba->slim_memmap_p; | ||
2549 | phba->HAregaddr = phba->ctrl_regs_memmap_p + HA_REG_OFFSET; | ||
2550 | phba->CAregaddr = phba->ctrl_regs_memmap_p + CA_REG_OFFSET; | ||
2551 | phba->HSregaddr = phba->ctrl_regs_memmap_p + HS_REG_OFFSET; | ||
2552 | phba->HCregaddr = phba->ctrl_regs_memmap_p + HC_REG_OFFSET; | ||
2553 | |||
2554 | /* Configure and enable interrupt */ | ||
2443 | if (phba->cfg_use_msi == 2) { | 2555 | if (phba->cfg_use_msi == 2) { |
2444 | error = lpfc_enable_msix(phba); | 2556 | /* Need to issue conf_port mbox cmd before conf_msi mbox cmd */ |
2445 | if (!error) | 2557 | error = lpfc_sli_config_port(phba, 3); |
2446 | phba->intr_type = MSIX; | 2558 | if (error) |
2559 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2560 | "0427 Firmware not capable of SLI 3 mode.\n"); | ||
2561 | else { | ||
2562 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2563 | "0426 Firmware capable of SLI 3 mode.\n"); | ||
2564 | /* Now, try to enable MSI-X interrupt mode */ | ||
2565 | error = lpfc_enable_msix(phba); | ||
2566 | if (!error) { | ||
2567 | phba->intr_type = MSIX; | ||
2568 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2569 | "0430 enable MSI-X mode.\n"); | ||
2570 | } | ||
2571 | } | ||
2447 | } | 2572 | } |
2448 | 2573 | ||
2449 | /* Fallback to MSI if MSI-X initialization failed */ | 2574 | /* Fallback to MSI if MSI-X initialization failed */ |
2450 | if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) { | 2575 | if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) { |
2451 | retval = pci_enable_msi(phba->pcidev); | 2576 | retval = pci_enable_msi(phba->pcidev); |
2452 | if (!retval) | 2577 | if (!retval) { |
2453 | phba->intr_type = MSI; | 2578 | phba->intr_type = MSI; |
2454 | else | ||
2455 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | 2579 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, |
2456 | "0452 Enable MSI failed, continuing " | 2580 | "0473 enable MSI mode.\n"); |
2457 | "with IRQ\n"); | 2581 | } else |
2582 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2583 | "0452 enable IRQ mode.\n"); | ||
2458 | } | 2584 | } |
2459 | 2585 | ||
2460 | /* MSI-X is the only case the doesn't need to call request_irq */ | 2586 | /* MSI-X is the only case the doesn't need to call request_irq */ |
@@ -2470,18 +2596,16 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2470 | phba->intr_type = INTx; | 2596 | phba->intr_type = INTx; |
2471 | } | 2597 | } |
2472 | 2598 | ||
2473 | phba->MBslimaddr = phba->slim_memmap_p; | ||
2474 | phba->HAregaddr = phba->ctrl_regs_memmap_p + HA_REG_OFFSET; | ||
2475 | phba->CAregaddr = phba->ctrl_regs_memmap_p + CA_REG_OFFSET; | ||
2476 | phba->HSregaddr = phba->ctrl_regs_memmap_p + HS_REG_OFFSET; | ||
2477 | phba->HCregaddr = phba->ctrl_regs_memmap_p + HC_REG_OFFSET; | ||
2478 | |||
2479 | if (lpfc_alloc_sysfs_attr(vport)) { | 2599 | if (lpfc_alloc_sysfs_attr(vport)) { |
2600 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
2601 | "1476 Failed to allocate sysfs attr\n"); | ||
2480 | error = -ENOMEM; | 2602 | error = -ENOMEM; |
2481 | goto out_free_irq; | 2603 | goto out_free_irq; |
2482 | } | 2604 | } |
2483 | 2605 | ||
2484 | if (lpfc_sli_hba_setup(phba)) { | 2606 | if (lpfc_sli_hba_setup(phba)) { |
2607 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
2608 | "1477 Failed to set up hba\n"); | ||
2485 | error = -ENODEV; | 2609 | error = -ENODEV; |
2486 | goto out_remove_device; | 2610 | goto out_remove_device; |
2487 | } | 2611 | } |
@@ -2500,6 +2624,8 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) | |||
2500 | spin_unlock_irq(shost->host_lock); | 2624 | spin_unlock_irq(shost->host_lock); |
2501 | } | 2625 | } |
2502 | 2626 | ||
2627 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2628 | "0428 Perform SCSI scan\n"); | ||
2503 | scsi_scan_host(shost); | 2629 | scsi_scan_host(shost); |
2504 | 2630 | ||
2505 | return 0; | 2631 | return 0; |
@@ -2732,20 +2858,34 @@ static pci_ers_result_t lpfc_io_slot_reset(struct pci_dev *pdev) | |||
2732 | /* Enable configured interrupt method */ | 2858 | /* Enable configured interrupt method */ |
2733 | phba->intr_type = NONE; | 2859 | phba->intr_type = NONE; |
2734 | if (phba->cfg_use_msi == 2) { | 2860 | if (phba->cfg_use_msi == 2) { |
2735 | error = lpfc_enable_msix(phba); | 2861 | /* Need to issue conf_port mbox cmd before conf_msi mbox cmd */ |
2736 | if (!error) | 2862 | error = lpfc_sli_config_port(phba, 3); |
2737 | phba->intr_type = MSIX; | 2863 | if (error) |
2864 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2865 | "0478 Firmware not capable of SLI 3 mode.\n"); | ||
2866 | else { | ||
2867 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2868 | "0479 Firmware capable of SLI 3 mode.\n"); | ||
2869 | /* Now, try to enable MSI-X interrupt mode */ | ||
2870 | error = lpfc_enable_msix(phba); | ||
2871 | if (!error) { | ||
2872 | phba->intr_type = MSIX; | ||
2873 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2874 | "0480 enable MSI-X mode.\n"); | ||
2875 | } | ||
2876 | } | ||
2738 | } | 2877 | } |
2739 | 2878 | ||
2740 | /* Fallback to MSI if MSI-X initialization failed */ | 2879 | /* Fallback to MSI if MSI-X initialization failed */ |
2741 | if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) { | 2880 | if (phba->cfg_use_msi >= 1 && phba->intr_type == NONE) { |
2742 | retval = pci_enable_msi(phba->pcidev); | 2881 | retval = pci_enable_msi(phba->pcidev); |
2743 | if (!retval) | 2882 | if (!retval) { |
2744 | phba->intr_type = MSI; | 2883 | phba->intr_type = MSI; |
2745 | else | ||
2746 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | 2884 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, |
2747 | "0470 Enable MSI failed, continuing " | 2885 | "0481 enable MSI mode.\n"); |
2748 | "with IRQ\n"); | 2886 | } else |
2887 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | ||
2888 | "0470 enable IRQ mode.\n"); | ||
2749 | } | 2889 | } |
2750 | 2890 | ||
2751 | /* MSI-X is the only case the doesn't need to call request_irq */ | 2891 | /* MSI-X is the only case the doesn't need to call request_irq */ |