diff options
author | James Smart <James.Smart@Emulex.Com> | 2008-01-11 01:53:23 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-23 12:29:23 -0500 |
commit | c95d6c6c2b0a303a113fd468efce7430d5b20eac (patch) | |
tree | cc4ebba08495c50433a62430002432b3061789de /drivers/scsi/lpfc/lpfc_debugfs.c | |
parent | 9c2face68782d5b7a322df6aade0512b47d29f10 (diff) |
[SCSI] lpfc 8.2.4 : Enhance debugfs use
Enhance debugfs to dump HBA SLIM as well as Host SLIM
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_debugfs.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_debugfs.c | 144 |
1 files changed, 120 insertions, 24 deletions
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); |