diff options
| -rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 3 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_debugfs.c | 144 |
2 files changed, 122 insertions, 25 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 80719bb3511e..f26b9538affe 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
| @@ -578,7 +578,8 @@ struct lpfc_hba { | |||
| 578 | struct dentry *hba_debugfs_root; | 578 | struct dentry *hba_debugfs_root; |
| 579 | atomic_t debugfs_vport_count; | 579 | atomic_t debugfs_vport_count; |
| 580 | struct dentry *debug_hbqinfo; | 580 | struct dentry *debug_hbqinfo; |
| 581 | struct dentry *debug_dumpslim; | 581 | struct dentry *debug_dumpHostSlim; |
| 582 | struct dentry *debug_dumpHBASlim; | ||
| 582 | struct dentry *debug_slow_ring_trc; | 583 | struct dentry *debug_slow_ring_trc; |
| 583 | struct lpfc_debugfs_trc *slow_ring_trc; | 584 | struct lpfc_debugfs_trc *slow_ring_trc; |
| 584 | atomic_t slow_ring_trc_cnt; | 585 | atomic_t slow_ring_trc_cnt; |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index da607c775cfc..783d1eea13ef 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include "lpfc_crtn.h" | 43 | #include "lpfc_crtn.h" |
| 44 | #include "lpfc_vport.h" | 44 | #include "lpfc_vport.h" |
| 45 | #include "lpfc_version.h" | 45 | #include "lpfc_version.h" |
| 46 | #include "lpfc_compat.h" | ||
| 46 | #include "lpfc_debugfs.h" | 47 | #include "lpfc_debugfs.h" |
| 47 | 48 | ||
| 48 | #ifdef CONFIG_LPFC_DEBUG_FS | 49 | #ifdef CONFIG_LPFC_DEBUG_FS |
| @@ -75,18 +76,18 @@ module_param(lpfc_debugfs_enable, int, 0); | |||
| 75 | MODULE_PARM_DESC(lpfc_debugfs_enable, "Enable debugfs services"); | 76 | MODULE_PARM_DESC(lpfc_debugfs_enable, "Enable debugfs services"); |
| 76 | 77 | ||
| 77 | /* This MUST be a power of 2 */ | 78 | /* This MUST be a power of 2 */ |
| 78 | static int lpfc_debugfs_max_disc_trc = 0; | 79 | static int lpfc_debugfs_max_disc_trc; |
| 79 | module_param(lpfc_debugfs_max_disc_trc, int, 0); | 80 | module_param(lpfc_debugfs_max_disc_trc, int, 0); |
| 80 | MODULE_PARM_DESC(lpfc_debugfs_max_disc_trc, | 81 | MODULE_PARM_DESC(lpfc_debugfs_max_disc_trc, |
| 81 | "Set debugfs discovery trace depth"); | 82 | "Set debugfs discovery trace depth"); |
| 82 | 83 | ||
| 83 | /* This MUST be a power of 2 */ | 84 | /* This MUST be a power of 2 */ |
| 84 | static int lpfc_debugfs_max_slow_ring_trc = 0; | 85 | static int lpfc_debugfs_max_slow_ring_trc; |
| 85 | module_param(lpfc_debugfs_max_slow_ring_trc, int, 0); | 86 | module_param(lpfc_debugfs_max_slow_ring_trc, int, 0); |
| 86 | MODULE_PARM_DESC(lpfc_debugfs_max_slow_ring_trc, | 87 | MODULE_PARM_DESC(lpfc_debugfs_max_slow_ring_trc, |
| 87 | "Set debugfs slow ring trace depth"); | 88 | "Set debugfs slow ring trace depth"); |
| 88 | 89 | ||
| 89 | static int lpfc_debugfs_mask_disc_trc = 0; | 90 | int lpfc_debugfs_mask_disc_trc; |
| 90 | module_param(lpfc_debugfs_mask_disc_trc, int, 0); | 91 | module_param(lpfc_debugfs_mask_disc_trc, int, 0); |
| 91 | MODULE_PARM_DESC(lpfc_debugfs_mask_disc_trc, | 92 | MODULE_PARM_DESC(lpfc_debugfs_mask_disc_trc, |
| 92 | "Set debugfs discovery trace mask"); | 93 | "Set debugfs discovery trace mask"); |
| @@ -100,8 +101,11 @@ MODULE_PARM_DESC(lpfc_debugfs_mask_disc_trc, | |||
| 100 | #define LPFC_NODELIST_SIZE 8192 | 101 | #define LPFC_NODELIST_SIZE 8192 |
| 101 | #define LPFC_NODELIST_ENTRY_SIZE 120 | 102 | #define LPFC_NODELIST_ENTRY_SIZE 120 |
| 102 | 103 | ||
| 103 | /* dumpslim output buffer size */ | 104 | /* dumpHBASlim output buffer size */ |
| 104 | #define LPFC_DUMPSLIM_SIZE 4096 | 105 | #define LPFC_DUMPHBASLIM_SIZE 4096 |
| 106 | |||
| 107 | /* dumpHostSlim output buffer size */ | ||
| 108 | #define LPFC_DUMPHOSTSLIM_SIZE 4096 | ||
| 105 | 109 | ||
| 106 | /* hbqinfo output buffer size */ | 110 | /* hbqinfo output buffer size */ |
| 107 | #define LPFC_HBQINFO_SIZE 8192 | 111 | #define LPFC_HBQINFO_SIZE 8192 |
| @@ -298,18 +302,58 @@ skipit: | |||
| 298 | return len; | 302 | return len; |
| 299 | } | 303 | } |
| 300 | 304 | ||
| 305 | static int lpfc_debugfs_last_hba_slim_off; | ||
| 306 | |||
| 307 | static int | ||
| 308 | lpfc_debugfs_dumpHBASlim_data(struct lpfc_hba *phba, char *buf, int size) | ||
| 309 | { | ||
| 310 | int len = 0; | ||
| 311 | int i, off; | ||
| 312 | uint32_t *ptr; | ||
| 313 | char buffer[1024]; | ||
| 314 | |||
| 315 | off = 0; | ||
| 316 | spin_lock_irq(&phba->hbalock); | ||
| 317 | |||
| 318 | len += snprintf(buf+len, size-len, "HBA SLIM\n"); | ||
| 319 | lpfc_memcpy_from_slim(buffer, | ||
| 320 | ((uint8_t *)phba->MBslimaddr) + lpfc_debugfs_last_hba_slim_off, | ||
| 321 | 1024); | ||
| 322 | |||
| 323 | ptr = (uint32_t *)&buffer[0]; | ||
| 324 | off = lpfc_debugfs_last_hba_slim_off; | ||
| 325 | |||
| 326 | /* Set it up for the next time */ | ||
| 327 | lpfc_debugfs_last_hba_slim_off += 1024; | ||
| 328 | if (lpfc_debugfs_last_hba_slim_off >= 4096) | ||
| 329 | lpfc_debugfs_last_hba_slim_off = 0; | ||
| 330 | |||
| 331 | i = 1024; | ||
| 332 | while (i > 0) { | ||
| 333 | len += snprintf(buf+len, size-len, | ||
| 334 | "%08x: %08x %08x %08x %08x %08x %08x %08x %08x\n", | ||
| 335 | off, *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), | ||
| 336 | *(ptr+5), *(ptr+6), *(ptr+7)); | ||
| 337 | ptr += 8; | ||
| 338 | i -= (8 * sizeof(uint32_t)); | ||
| 339 | off += (8 * sizeof(uint32_t)); | ||
| 340 | } | ||
| 341 | |||
| 342 | spin_unlock_irq(&phba->hbalock); | ||
| 343 | return len; | ||
| 344 | } | ||
| 345 | |||
| 301 | static int | 346 | static int |
| 302 | lpfc_debugfs_dumpslim_data(struct lpfc_hba *phba, char *buf, int size) | 347 | lpfc_debugfs_dumpHostSlim_data(struct lpfc_hba *phba, char *buf, int size) |
| 303 | { | 348 | { |
| 304 | int len = 0; | 349 | int len = 0; |
| 305 | int cnt, i, off; | 350 | int i, off; |
| 306 | uint32_t word0, word1, word2, word3; | 351 | uint32_t word0, word1, word2, word3; |
| 307 | uint32_t *ptr; | 352 | uint32_t *ptr; |
| 308 | struct lpfc_pgp *pgpp; | 353 | struct lpfc_pgp *pgpp; |
| 309 | struct lpfc_sli *psli = &phba->sli; | 354 | struct lpfc_sli *psli = &phba->sli; |
| 310 | struct lpfc_sli_ring *pring; | 355 | struct lpfc_sli_ring *pring; |
| 311 | 356 | ||
| 312 | cnt = LPFC_DUMPSLIM_SIZE; | ||
| 313 | off = 0; | 357 | off = 0; |
| 314 | spin_lock_irq(&phba->hbalock); | 358 | spin_lock_irq(&phba->hbalock); |
| 315 | 359 | ||
| @@ -621,7 +665,7 @@ out: | |||
| 621 | } | 665 | } |
| 622 | 666 | ||
| 623 | static int | 667 | static int |
| 624 | lpfc_debugfs_dumpslim_open(struct inode *inode, struct file *file) | 668 | lpfc_debugfs_dumpHBASlim_open(struct inode *inode, struct file *file) |
| 625 | { | 669 | { |
| 626 | struct lpfc_hba *phba = inode->i_private; | 670 | struct lpfc_hba *phba = inode->i_private; |
| 627 | struct lpfc_debug *debug; | 671 | struct lpfc_debug *debug; |
| @@ -632,14 +676,41 @@ lpfc_debugfs_dumpslim_open(struct inode *inode, struct file *file) | |||
| 632 | goto out; | 676 | goto out; |
| 633 | 677 | ||
| 634 | /* Round to page boundry */ | 678 | /* Round to page boundry */ |
| 635 | debug->buffer = kmalloc(LPFC_DUMPSLIM_SIZE, GFP_KERNEL); | 679 | debug->buffer = kmalloc(LPFC_DUMPHBASLIM_SIZE, GFP_KERNEL); |
| 636 | if (!debug->buffer) { | 680 | if (!debug->buffer) { |
| 637 | kfree(debug); | 681 | kfree(debug); |
| 638 | goto out; | 682 | goto out; |
| 639 | } | 683 | } |
| 640 | 684 | ||
| 641 | debug->len = lpfc_debugfs_dumpslim_data(phba, debug->buffer, | 685 | debug->len = lpfc_debugfs_dumpHBASlim_data(phba, debug->buffer, |
| 642 | LPFC_DUMPSLIM_SIZE); | 686 | LPFC_DUMPHBASLIM_SIZE); |
| 687 | file->private_data = debug; | ||
| 688 | |||
| 689 | rc = 0; | ||
| 690 | out: | ||
| 691 | return rc; | ||
| 692 | } | ||
| 693 | |||
| 694 | static int | ||
| 695 | lpfc_debugfs_dumpHostSlim_open(struct inode *inode, struct file *file) | ||
| 696 | { | ||
| 697 | struct lpfc_hba *phba = inode->i_private; | ||
| 698 | struct lpfc_debug *debug; | ||
| 699 | int rc = -ENOMEM; | ||
| 700 | |||
| 701 | debug = kmalloc(sizeof(*debug), GFP_KERNEL); | ||
| 702 | if (!debug) | ||
| 703 | goto out; | ||
| 704 | |||
| 705 | /* Round to page boundry */ | ||
| 706 | debug->buffer = kmalloc(LPFC_DUMPHOSTSLIM_SIZE, GFP_KERNEL); | ||
| 707 | if (!debug->buffer) { | ||
| 708 | kfree(debug); | ||
| 709 | goto out; | ||
| 710 | } | ||
| 711 | |||
| 712 | debug->len = lpfc_debugfs_dumpHostSlim_data(phba, debug->buffer, | ||
| 713 | LPFC_DUMPHOSTSLIM_SIZE); | ||
| 643 | file->private_data = debug; | 714 | file->private_data = debug; |
| 644 | 715 | ||
| 645 | rc = 0; | 716 | rc = 0; |
| @@ -742,10 +813,19 @@ static struct file_operations lpfc_debugfs_op_hbqinfo = { | |||
| 742 | .release = lpfc_debugfs_release, | 813 | .release = lpfc_debugfs_release, |
| 743 | }; | 814 | }; |
| 744 | 815 | ||
| 745 | #undef lpfc_debugfs_op_dumpslim | 816 | #undef lpfc_debugfs_op_dumpHBASlim |
| 746 | static struct file_operations lpfc_debugfs_op_dumpslim = { | 817 | static struct file_operations lpfc_debugfs_op_dumpHBASlim = { |
| 818 | .owner = THIS_MODULE, | ||
| 819 | .open = lpfc_debugfs_dumpHBASlim_open, | ||
| 820 | .llseek = lpfc_debugfs_lseek, | ||
| 821 | .read = lpfc_debugfs_read, | ||
| 822 | .release = lpfc_debugfs_release, | ||
| 823 | }; | ||
| 824 | |||
| 825 | #undef lpfc_debugfs_op_dumpHostSlim | ||
| 826 | static struct file_operations lpfc_debugfs_op_dumpHostSlim = { | ||
| 747 | .owner = THIS_MODULE, | 827 | .owner = THIS_MODULE, |
| 748 | .open = lpfc_debugfs_dumpslim_open, | 828 | .open = lpfc_debugfs_dumpHostSlim_open, |
| 749 | .llseek = lpfc_debugfs_lseek, | 829 | .llseek = lpfc_debugfs_lseek, |
| 750 | .read = lpfc_debugfs_read, | 830 | .read = lpfc_debugfs_read, |
| 751 | .release = lpfc_debugfs_release, | 831 | .release = lpfc_debugfs_release, |
| @@ -813,15 +893,27 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport) | |||
| 813 | goto debug_failed; | 893 | goto debug_failed; |
| 814 | } | 894 | } |
| 815 | 895 | ||
| 816 | /* Setup dumpslim */ | 896 | /* Setup dumpHBASlim */ |
| 817 | snprintf(name, sizeof(name), "dumpslim"); | 897 | snprintf(name, sizeof(name), "dumpHBASlim"); |
| 818 | phba->debug_dumpslim = | 898 | phba->debug_dumpHBASlim = |
| 819 | debugfs_create_file(name, S_IFREG|S_IRUGO|S_IWUSR, | 899 | debugfs_create_file(name, S_IFREG|S_IRUGO|S_IWUSR, |
| 820 | phba->hba_debugfs_root, | 900 | phba->hba_debugfs_root, |
| 821 | phba, &lpfc_debugfs_op_dumpslim); | 901 | phba, &lpfc_debugfs_op_dumpHBASlim); |
| 822 | if (!phba->debug_dumpslim) { | 902 | if (!phba->debug_dumpHBASlim) { |
| 823 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, | 903 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, |
| 824 | "0409 Cannot create debugfs dumpslim\n"); | 904 | "0409 Cannot create debugfs dumpHBASlim\n"); |
| 905 | goto debug_failed; | ||
| 906 | } | ||
| 907 | |||
| 908 | /* Setup dumpHostSlim */ | ||
| 909 | snprintf(name, sizeof(name), "dumpHostSlim"); | ||
| 910 | phba->debug_dumpHostSlim = | ||
| 911 | debugfs_create_file(name, S_IFREG|S_IRUGO|S_IWUSR, | ||
| 912 | phba->hba_debugfs_root, | ||
| 913 | phba, &lpfc_debugfs_op_dumpHostSlim); | ||
| 914 | if (!phba->debug_dumpHostSlim) { | ||
| 915 | lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, | ||
| 916 | "0409 Cannot create debugfs dumpHostSlim\n"); | ||
| 825 | goto debug_failed; | 917 | goto debug_failed; |
| 826 | } | 918 | } |
| 827 | 919 | ||
| @@ -971,9 +1063,13 @@ lpfc_debugfs_terminate(struct lpfc_vport *vport) | |||
| 971 | debugfs_remove(phba->debug_hbqinfo); /* hbqinfo */ | 1063 | debugfs_remove(phba->debug_hbqinfo); /* hbqinfo */ |
| 972 | phba->debug_hbqinfo = NULL; | 1064 | phba->debug_hbqinfo = NULL; |
| 973 | } | 1065 | } |
| 974 | if (phba->debug_dumpslim) { | 1066 | if (phba->debug_dumpHBASlim) { |
| 975 | debugfs_remove(phba->debug_dumpslim); /* dumpslim */ | 1067 | debugfs_remove(phba->debug_dumpHBASlim); /* HBASlim */ |
| 976 | phba->debug_dumpslim = NULL; | 1068 | phba->debug_dumpHBASlim = NULL; |
| 1069 | } | ||
| 1070 | if (phba->debug_dumpHostSlim) { | ||
| 1071 | debugfs_remove(phba->debug_dumpHostSlim); /* HostSlim */ | ||
| 1072 | phba->debug_dumpHostSlim = NULL; | ||
| 977 | } | 1073 | } |
| 978 | if (phba->slow_ring_trc) { | 1074 | if (phba->slow_ring_trc) { |
| 979 | kfree(phba->slow_ring_trc); | 1075 | kfree(phba->slow_ring_trc); |
