diff options
author | James Smart <James.Smart@Emulex.Com> | 2009-10-02 15:16:51 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-12-04 13:01:41 -0500 |
commit | 6a9c52cf22e4ca13816bb2bd9899129cd4445de7 (patch) | |
tree | 02c44960d58fbaada692062ed96287425d0cd853 /drivers/scsi/lpfc/lpfc_init.c | |
parent | 6669f9bb902b8c3f5e33cb8c32c8c0eec6ed68ed (diff) |
[SCSI] lpfc 8.3.5: fix sysfs parameters, vport creation and other bugs and update logging
This patch include the following fixes and changes:
- Fix crash when "error" is echoed to board_mode sysfs parameter
- Fix FCoE Parameter parsing in regions 23
- Fix driver crash when creating vport with large number of targets on SLI4
- Fix bug with npiv message being logged when it is not supported by the adapter
- Fix a potential dereferencing mailbox structure after free bug
- Fix firmware crash after vport create with high target count
- Error out requests to set board_mode to warm restart via sysfs on SLI4 HBAs
- Fix Block guard logging
- Fix a memory corruption issue during GID_FT IO prep
- Fix crash while processing unsolicited FC frames
- Fix failed to allocate XRI message is not a critical failure
- Update and fix formatting in some log messages
- Fix missing new line characters in log messages
- Removed the use of the locally defined FC transport layer related macros
- Check the rsplen in lpfc_handle_fcp_err function before using rsplen
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index a7b5566ea0b5..12ab1eae47f9 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -3004,12 +3004,11 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
3004 | spin_unlock_irq(&phba->hbalock); | 3004 | spin_unlock_irq(&phba->hbalock); |
3005 | 3005 | ||
3006 | /* Read the FCF table and re-discover SAN. */ | 3006 | /* Read the FCF table and re-discover SAN. */ |
3007 | rc = lpfc_sli4_read_fcf_record(phba, | 3007 | rc = lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); |
3008 | LPFC_FCOE_FCF_GET_FIRST); | ||
3009 | if (rc) | 3008 | if (rc) |
3010 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, | 3009 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, |
3011 | "2547 Read FCF record failed 0x%x\n", | 3010 | "2547 Read FCF record failed 0x%x\n", |
3012 | rc); | 3011 | rc); |
3013 | break; | 3012 | break; |
3014 | 3013 | ||
3015 | case LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL: | 3014 | case LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL: |
@@ -3021,7 +3020,7 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, | |||
3021 | 3020 | ||
3022 | case LPFC_FCOE_EVENT_TYPE_FCF_DEAD: | 3021 | case LPFC_FCOE_EVENT_TYPE_FCF_DEAD: |
3023 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, | 3022 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, |
3024 | "2549 FCF disconnected fron network index 0x%x" | 3023 | "2549 FCF disconnected from network index 0x%x" |
3025 | " tag 0x%x\n", acqe_fcoe->index, | 3024 | " tag 0x%x\n", acqe_fcoe->index, |
3026 | acqe_fcoe->event_tag); | 3025 | acqe_fcoe->event_tag); |
3027 | /* If the event is not for currently used fcf do nothing */ | 3026 | /* If the event is not for currently used fcf do nothing */ |
@@ -3917,7 +3916,7 @@ lpfc_free_sgl_list(struct lpfc_hba *phba) | |||
3917 | rc = lpfc_sli4_remove_all_sgl_pages(phba); | 3916 | rc = lpfc_sli4_remove_all_sgl_pages(phba); |
3918 | if (rc) { | 3917 | if (rc) { |
3919 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 3918 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
3920 | "2005 Unable to deregister pages from HBA: %x", rc); | 3919 | "2005 Unable to deregister pages from HBA: %x\n", rc); |
3921 | } | 3920 | } |
3922 | kfree(phba->sli4_hba.lpfc_els_sgl_array); | 3921 | kfree(phba->sli4_hba.lpfc_els_sgl_array); |
3923 | } | 3922 | } |
@@ -4366,7 +4365,8 @@ lpfc_setup_bg(struct lpfc_hba *phba, struct Scsi_Host *shost) | |||
4366 | _dump_buf_data = | 4365 | _dump_buf_data = |
4367 | (char *) __get_free_pages(GFP_KERNEL, pagecnt); | 4366 | (char *) __get_free_pages(GFP_KERNEL, pagecnt); |
4368 | if (_dump_buf_data) { | 4367 | if (_dump_buf_data) { |
4369 | printk(KERN_ERR "BLKGRD allocated %d pages for " | 4368 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
4369 | "9043 BLKGRD: allocated %d pages for " | ||
4370 | "_dump_buf_data at 0x%p\n", | 4370 | "_dump_buf_data at 0x%p\n", |
4371 | (1 << pagecnt), _dump_buf_data); | 4371 | (1 << pagecnt), _dump_buf_data); |
4372 | _dump_buf_data_order = pagecnt; | 4372 | _dump_buf_data_order = pagecnt; |
@@ -4377,17 +4377,20 @@ lpfc_setup_bg(struct lpfc_hba *phba, struct Scsi_Host *shost) | |||
4377 | --pagecnt; | 4377 | --pagecnt; |
4378 | } | 4378 | } |
4379 | if (!_dump_buf_data_order) | 4379 | if (!_dump_buf_data_order) |
4380 | printk(KERN_ERR "BLKGRD ERROR unable to allocate " | 4380 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
4381 | "9044 BLKGRD: ERROR unable to allocate " | ||
4381 | "memory for hexdump\n"); | 4382 | "memory for hexdump\n"); |
4382 | } else | 4383 | } else |
4383 | printk(KERN_ERR "BLKGRD already allocated _dump_buf_data=0x%p" | 4384 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
4385 | "9045 BLKGRD: already allocated _dump_buf_data=0x%p" | ||
4384 | "\n", _dump_buf_data); | 4386 | "\n", _dump_buf_data); |
4385 | if (!_dump_buf_dif) { | 4387 | if (!_dump_buf_dif) { |
4386 | while (pagecnt) { | 4388 | while (pagecnt) { |
4387 | _dump_buf_dif = | 4389 | _dump_buf_dif = |
4388 | (char *) __get_free_pages(GFP_KERNEL, pagecnt); | 4390 | (char *) __get_free_pages(GFP_KERNEL, pagecnt); |
4389 | if (_dump_buf_dif) { | 4391 | if (_dump_buf_dif) { |
4390 | printk(KERN_ERR "BLKGRD allocated %d pages for " | 4392 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
4393 | "9046 BLKGRD: allocated %d pages for " | ||
4391 | "_dump_buf_dif at 0x%p\n", | 4394 | "_dump_buf_dif at 0x%p\n", |
4392 | (1 << pagecnt), _dump_buf_dif); | 4395 | (1 << pagecnt), _dump_buf_dif); |
4393 | _dump_buf_dif_order = pagecnt; | 4396 | _dump_buf_dif_order = pagecnt; |
@@ -4398,10 +4401,12 @@ lpfc_setup_bg(struct lpfc_hba *phba, struct Scsi_Host *shost) | |||
4398 | --pagecnt; | 4401 | --pagecnt; |
4399 | } | 4402 | } |
4400 | if (!_dump_buf_dif_order) | 4403 | if (!_dump_buf_dif_order) |
4401 | printk(KERN_ERR "BLKGRD ERROR unable to allocate " | 4404 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
4405 | "9047 BLKGRD: ERROR unable to allocate " | ||
4402 | "memory for hexdump\n"); | 4406 | "memory for hexdump\n"); |
4403 | } else | 4407 | } else |
4404 | printk(KERN_ERR "BLKGRD already allocated _dump_buf_dif=0x%p\n", | 4408 | lpfc_printf_log(phba, KERN_ERR, LOG_BG, |
4409 | "9048 BLKGRD: already allocated _dump_buf_dif=0x%p\n", | ||
4405 | _dump_buf_dif); | 4410 | _dump_buf_dif); |
4406 | } | 4411 | } |
4407 | 4412 | ||
@@ -5072,10 +5077,9 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba) | |||
5072 | /* It does not make sense to have more EQs than WQs */ | 5077 | /* It does not make sense to have more EQs than WQs */ |
5073 | if (cfg_fcp_eq_count > phba->cfg_fcp_wq_count) { | 5078 | if (cfg_fcp_eq_count > phba->cfg_fcp_wq_count) { |
5074 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, | 5079 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, |
5075 | "2593 The number of FCP EQs (%d) is more " | 5080 | "2593 The FCP EQ count(%d) cannot be greater " |
5076 | "than the number of FCP WQs (%d), take " | 5081 | "than the FCP WQ count(%d), limiting the " |
5077 | "the number of FCP EQs same as than of " | 5082 | "FCP EQ count to %d\n", cfg_fcp_eq_count, |
5078 | "WQs (%d)\n", cfg_fcp_eq_count, | ||
5079 | phba->cfg_fcp_wq_count, | 5083 | phba->cfg_fcp_wq_count, |
5080 | phba->cfg_fcp_wq_count); | 5084 | phba->cfg_fcp_wq_count); |
5081 | cfg_fcp_eq_count = phba->cfg_fcp_wq_count; | 5085 | cfg_fcp_eq_count = phba->cfg_fcp_wq_count; |
@@ -7271,15 +7275,15 @@ lpfc_sli4_get_els_iocb_cnt(struct lpfc_hba *phba) | |||
7271 | 7275 | ||
7272 | if (phba->sli_rev == LPFC_SLI_REV4) { | 7276 | if (phba->sli_rev == LPFC_SLI_REV4) { |
7273 | if (max_xri <= 100) | 7277 | if (max_xri <= 100) |
7274 | return 4; | 7278 | return 10; |
7275 | else if (max_xri <= 256) | 7279 | else if (max_xri <= 256) |
7276 | return 8; | 7280 | return 25; |
7277 | else if (max_xri <= 512) | 7281 | else if (max_xri <= 512) |
7278 | return 16; | 7282 | return 50; |
7279 | else if (max_xri <= 1024) | 7283 | else if (max_xri <= 1024) |
7280 | return 32; | 7284 | return 100; |
7281 | else | 7285 | else |
7282 | return 48; | 7286 | return 150; |
7283 | } else | 7287 | } else |
7284 | return 0; | 7288 | return 0; |
7285 | } | 7289 | } |
@@ -8117,15 +8121,15 @@ lpfc_exit(void) | |||
8117 | if (lpfc_enable_npiv) | 8121 | if (lpfc_enable_npiv) |
8118 | fc_release_transport(lpfc_vport_transport_template); | 8122 | fc_release_transport(lpfc_vport_transport_template); |
8119 | if (_dump_buf_data) { | 8123 | if (_dump_buf_data) { |
8120 | printk(KERN_ERR "BLKGRD freeing %lu pages for _dump_buf_data " | 8124 | printk(KERN_ERR "9062 BLKGRD: freeing %lu pages for " |
8121 | "at 0x%p\n", | 8125 | "_dump_buf_data at 0x%p\n", |
8122 | (1L << _dump_buf_data_order), _dump_buf_data); | 8126 | (1L << _dump_buf_data_order), _dump_buf_data); |
8123 | free_pages((unsigned long)_dump_buf_data, _dump_buf_data_order); | 8127 | free_pages((unsigned long)_dump_buf_data, _dump_buf_data_order); |
8124 | } | 8128 | } |
8125 | 8129 | ||
8126 | if (_dump_buf_dif) { | 8130 | if (_dump_buf_dif) { |
8127 | printk(KERN_ERR "BLKGRD freeing %lu pages for _dump_buf_dif " | 8131 | printk(KERN_ERR "9049 BLKGRD: freeing %lu pages for " |
8128 | "at 0x%p\n", | 8132 | "_dump_buf_dif at 0x%p\n", |
8129 | (1L << _dump_buf_dif_order), _dump_buf_dif); | 8133 | (1L << _dump_buf_dif_order), _dump_buf_dif); |
8130 | free_pages((unsigned long)_dump_buf_dif, _dump_buf_dif_order); | 8134 | free_pages((unsigned long)_dump_buf_dif, _dump_buf_dif_order); |
8131 | } | 8135 | } |