diff options
Diffstat (limited to 'drivers/s390/cio/qdio_debug.c')
-rw-r--r-- | drivers/s390/cio/qdio_debug.c | 104 |
1 files changed, 47 insertions, 57 deletions
diff --git a/drivers/s390/cio/qdio_debug.c b/drivers/s390/cio/qdio_debug.c index f05590355be8..f8a3b6967f69 100644 --- a/drivers/s390/cio/qdio_debug.c +++ b/drivers/s390/cio/qdio_debug.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include "qdio.h" | 14 | #include "qdio.h" |
15 | 15 | ||
16 | debug_info_t *qdio_dbf_setup; | 16 | debug_info_t *qdio_dbf_setup; |
17 | debug_info_t *qdio_dbf_trace; | 17 | debug_info_t *qdio_dbf_error; |
18 | 18 | ||
19 | static struct dentry *debugfs_root; | 19 | static struct dentry *debugfs_root; |
20 | #define MAX_DEBUGFS_QUEUES 32 | 20 | #define MAX_DEBUGFS_QUEUES 32 |
@@ -22,59 +22,33 @@ static struct dentry *debugfs_queues[MAX_DEBUGFS_QUEUES] = { NULL }; | |||
22 | static DEFINE_MUTEX(debugfs_mutex); | 22 | static DEFINE_MUTEX(debugfs_mutex); |
23 | #define QDIO_DEBUGFS_NAME_LEN 40 | 23 | #define QDIO_DEBUGFS_NAME_LEN 40 |
24 | 24 | ||
25 | void qdio_allocate_do_dbf(struct qdio_initialize *init_data) | 25 | void qdio_allocate_dbf(struct qdio_initialize *init_data, |
26 | struct qdio_irq *irq_ptr) | ||
26 | { | 27 | { |
27 | char dbf_text[20]; | 28 | char text[20]; |
28 | 29 | ||
29 | sprintf(dbf_text, "qfmt:%x", init_data->q_format); | 30 | DBF_EVENT("qfmt:%1d", init_data->q_format); |
30 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 31 | DBF_HEX(init_data->adapter_name, 8); |
31 | QDIO_DBF_HEX0(0, setup, init_data->adapter_name, 8); | 32 | DBF_EVENT("qpff%4x", init_data->qib_param_field_format); |
32 | sprintf(dbf_text, "qpff%4x", init_data->qib_param_field_format); | 33 | DBF_HEX(&init_data->qib_param_field, sizeof(void *)); |
33 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 34 | DBF_HEX(&init_data->input_slib_elements, sizeof(void *)); |
34 | QDIO_DBF_HEX0(0, setup, &init_data->qib_param_field, sizeof(void *)); | 35 | DBF_HEX(&init_data->output_slib_elements, sizeof(void *)); |
35 | QDIO_DBF_HEX0(0, setup, &init_data->input_slib_elements, sizeof(void *)); | 36 | DBF_EVENT("niq:%1d noq:%1d", init_data->no_input_qs, |
36 | QDIO_DBF_HEX0(0, setup, &init_data->output_slib_elements, sizeof(void *)); | 37 | init_data->no_output_qs); |
37 | sprintf(dbf_text, "niq:%4x", init_data->no_input_qs); | 38 | DBF_HEX(&init_data->input_handler, sizeof(void *)); |
38 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 39 | DBF_HEX(&init_data->output_handler, sizeof(void *)); |
39 | sprintf(dbf_text, "noq:%4x", init_data->no_output_qs); | 40 | DBF_HEX(&init_data->int_parm, sizeof(long)); |
40 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 41 | DBF_HEX(&init_data->flags, sizeof(long)); |
41 | QDIO_DBF_HEX0(0, setup, &init_data->input_handler, sizeof(void *)); | 42 | DBF_HEX(&init_data->input_sbal_addr_array, sizeof(void *)); |
42 | QDIO_DBF_HEX0(0, setup, &init_data->output_handler, sizeof(void *)); | 43 | DBF_HEX(&init_data->output_sbal_addr_array, sizeof(void *)); |
43 | QDIO_DBF_HEX0(0, setup, &init_data->int_parm, sizeof(long)); | 44 | DBF_EVENT("irq:%8lx", (unsigned long)irq_ptr); |
44 | QDIO_DBF_HEX0(0, setup, &init_data->flags, sizeof(long)); | 45 | |
45 | QDIO_DBF_HEX0(0, setup, &init_data->input_sbal_addr_array, sizeof(void *)); | 46 | /* allocate trace view for the interface */ |
46 | QDIO_DBF_HEX0(0, setup, &init_data->output_sbal_addr_array, sizeof(void *)); | 47 | snprintf(text, 20, "qdio_%s", dev_name(&init_data->cdev->dev)); |
47 | } | 48 | irq_ptr->debug_area = debug_register(text, 2, 1, 16); |
48 | 49 | debug_register_view(irq_ptr->debug_area, &debug_hex_ascii_view); | |
49 | static void qdio_unregister_dbf_views(void) | 50 | debug_set_level(irq_ptr->debug_area, DBF_WARN); |
50 | { | 51 | DBF_DEV_EVENT(DBF_ERR, irq_ptr, "dbf created"); |
51 | if (qdio_dbf_setup) | ||
52 | debug_unregister(qdio_dbf_setup); | ||
53 | if (qdio_dbf_trace) | ||
54 | debug_unregister(qdio_dbf_trace); | ||
55 | } | ||
56 | |||
57 | static int qdio_register_dbf_views(void) | ||
58 | { | ||
59 | qdio_dbf_setup = debug_register("qdio_setup", QDIO_DBF_SETUP_PAGES, | ||
60 | QDIO_DBF_SETUP_NR_AREAS, | ||
61 | QDIO_DBF_SETUP_LEN); | ||
62 | if (!qdio_dbf_setup) | ||
63 | goto oom; | ||
64 | debug_register_view(qdio_dbf_setup, &debug_hex_ascii_view); | ||
65 | debug_set_level(qdio_dbf_setup, QDIO_DBF_SETUP_LEVEL); | ||
66 | |||
67 | qdio_dbf_trace = debug_register("qdio_trace", QDIO_DBF_TRACE_PAGES, | ||
68 | QDIO_DBF_TRACE_NR_AREAS, | ||
69 | QDIO_DBF_TRACE_LEN); | ||
70 | if (!qdio_dbf_trace) | ||
71 | goto oom; | ||
72 | debug_register_view(qdio_dbf_trace, &debug_hex_ascii_view); | ||
73 | debug_set_level(qdio_dbf_trace, QDIO_DBF_TRACE_LEVEL); | ||
74 | return 0; | ||
75 | oom: | ||
76 | qdio_unregister_dbf_views(); | ||
77 | return -ENOMEM; | ||
78 | } | 52 | } |
79 | 53 | ||
80 | static int qstat_show(struct seq_file *m, void *v) | 54 | static int qstat_show(struct seq_file *m, void *v) |
@@ -86,16 +60,18 @@ static int qstat_show(struct seq_file *m, void *v) | |||
86 | if (!q) | 60 | if (!q) |
87 | return 0; | 61 | return 0; |
88 | 62 | ||
89 | seq_printf(m, "device state indicator: %d\n", *q->irq_ptr->dsci); | 63 | seq_printf(m, "device state indicator: %d\n", *(u32 *)q->irq_ptr->dsci); |
90 | seq_printf(m, "nr_used: %d\n", atomic_read(&q->nr_buf_used)); | 64 | seq_printf(m, "nr_used: %d\n", atomic_read(&q->nr_buf_used)); |
91 | seq_printf(m, "ftc: %d\n", q->first_to_check); | 65 | seq_printf(m, "ftc: %d\n", q->first_to_check); |
92 | seq_printf(m, "last_move_ftc: %d\n", q->last_move_ftc); | 66 | seq_printf(m, "last_move_ftc: %d\n", q->last_move_ftc); |
93 | seq_printf(m, "polling: %d\n", q->u.in.polling); | 67 | seq_printf(m, "polling: %d\n", q->u.in.polling); |
68 | seq_printf(m, "ack count: %d\n", q->u.in.ack_count); | ||
94 | seq_printf(m, "slsb buffer states:\n"); | 69 | seq_printf(m, "slsb buffer states:\n"); |
70 | seq_printf(m, "|0 |8 |16 |24 |32 |40 |48 |56 63|\n"); | ||
95 | 71 | ||
96 | qdio_siga_sync_q(q); | 72 | qdio_siga_sync_q(q); |
97 | for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) { | 73 | for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) { |
98 | get_buf_state(q, i, &state); | 74 | get_buf_state(q, i, &state, 0); |
99 | switch (state) { | 75 | switch (state) { |
100 | case SLSB_P_INPUT_NOT_INIT: | 76 | case SLSB_P_INPUT_NOT_INIT: |
101 | case SLSB_P_OUTPUT_NOT_INIT: | 77 | case SLSB_P_OUTPUT_NOT_INIT: |
@@ -127,6 +103,7 @@ static int qstat_show(struct seq_file *m, void *v) | |||
127 | seq_printf(m, "\n"); | 103 | seq_printf(m, "\n"); |
128 | } | 104 | } |
129 | seq_printf(m, "\n"); | 105 | seq_printf(m, "\n"); |
106 | seq_printf(m, "|64 |72 |80 |88 |96 |104 |112 | 127|\n"); | ||
130 | return 0; | 107 | return 0; |
131 | } | 108 | } |
132 | 109 | ||
@@ -223,11 +200,24 @@ void qdio_shutdown_debug_entries(struct qdio_irq *irq_ptr, struct ccw_device *cd | |||
223 | int __init qdio_debug_init(void) | 200 | int __init qdio_debug_init(void) |
224 | { | 201 | { |
225 | debugfs_root = debugfs_create_dir("qdio_queues", NULL); | 202 | debugfs_root = debugfs_create_dir("qdio_queues", NULL); |
226 | return qdio_register_dbf_views(); | 203 | |
204 | qdio_dbf_setup = debug_register("qdio_setup", 16, 1, 16); | ||
205 | debug_register_view(qdio_dbf_setup, &debug_hex_ascii_view); | ||
206 | debug_set_level(qdio_dbf_setup, DBF_INFO); | ||
207 | DBF_EVENT("dbf created\n"); | ||
208 | |||
209 | qdio_dbf_error = debug_register("qdio_error", 4, 1, 16); | ||
210 | debug_register_view(qdio_dbf_error, &debug_hex_ascii_view); | ||
211 | debug_set_level(qdio_dbf_error, DBF_INFO); | ||
212 | DBF_ERROR("dbf created\n"); | ||
213 | return 0; | ||
227 | } | 214 | } |
228 | 215 | ||
229 | void qdio_debug_exit(void) | 216 | void qdio_debug_exit(void) |
230 | { | 217 | { |
231 | debugfs_remove(debugfs_root); | 218 | debugfs_remove(debugfs_root); |
232 | qdio_unregister_dbf_views(); | 219 | if (qdio_dbf_setup) |
220 | debug_unregister(qdio_dbf_setup); | ||
221 | if (qdio_dbf_error) | ||
222 | debug_unregister(qdio_dbf_error); | ||
233 | } | 223 | } |