diff options
Diffstat (limited to 'drivers/media/dvb/firewire/firedtv-avc.c')
-rw-r--r-- | drivers/media/dvb/firewire/firedtv-avc.c | 78 |
1 files changed, 66 insertions, 12 deletions
diff --git a/drivers/media/dvb/firewire/firedtv-avc.c b/drivers/media/dvb/firewire/firedtv-avc.c index 1a94c6bb601c..570bea0dd177 100644 --- a/drivers/media/dvb/firewire/firedtv-avc.c +++ b/drivers/media/dvb/firewire/firedtv-avc.c | |||
@@ -89,14 +89,31 @@ struct avc_response_frame { | |||
89 | u8 operand[509]; | 89 | u8 operand[509]; |
90 | }; | 90 | }; |
91 | 91 | ||
92 | #define AVC_DEBUG_FCP_SUBACTIONS 1 | 92 | #define AVC_DEBUG_READ_DESCRIPTOR 0x0001 |
93 | #define AVC_DEBUG_FCP_PAYLOADS 2 | 93 | #define AVC_DEBUG_DSIT 0x0002 |
94 | #define AVC_DEBUG_DSD 0x0004 | ||
95 | #define AVC_DEBUG_REGISTER_REMOTE_CONTROL 0x0008 | ||
96 | #define AVC_DEBUG_LNB_CONTROL 0x0010 | ||
97 | #define AVC_DEBUG_TUNE_QPSK 0x0020 | ||
98 | #define AVC_DEBUG_TUNE_QPSK2 0x0040 | ||
99 | #define AVC_DEBUG_HOST2CA 0x0080 | ||
100 | #define AVC_DEBUG_CA2HOST 0x0100 | ||
101 | #define AVC_DEBUG_APPLICATION_PMT 0x4000 | ||
102 | #define AVC_DEBUG_FCP_PAYLOADS 0x8000 | ||
94 | 103 | ||
95 | static int avc_debug; | 104 | static int avc_debug; |
96 | module_param_named(debug, avc_debug, int, 0644); | 105 | module_param_named(debug, avc_debug, int, 0644); |
97 | MODULE_PARM_DESC(debug, "Verbose logging (default = 0" | 106 | MODULE_PARM_DESC(debug, "Verbose logging bitmask (none (default) = 0" |
98 | ", FCP subactions = " __stringify(AVC_DEBUG_FCP_SUBACTIONS) | 107 | ", FCP subaction(READ DESCRIPTOR) = " __stringify(AVC_DEBUG_READ_DESCRIPTOR) |
99 | ", FCP payloads = " __stringify(AVC_DEBUG_FCP_PAYLOADS) | 108 | ", FCP subaction(DSIT) = " __stringify(AVC_DEBUG_DSIT) |
109 | ", FCP subaction(REGISTER_REMOTE_CONTROL) = " __stringify(AVC_DEBUG_REGISTER_REMOTE_CONTROL) | ||
110 | ", FCP subaction(LNB CONTROL) = " __stringify(AVC_DEBUG_LNB_CONTROL) | ||
111 | ", FCP subaction(TUNE QPSK) = " __stringify(AVC_DEBUG_TUNE_QPSK) | ||
112 | ", FCP subaction(TUNE QPSK2) = " __stringify(AVC_DEBUG_TUNE_QPSK2) | ||
113 | ", FCP subaction(HOST2CA) = " __stringify(AVC_DEBUG_HOST2CA) | ||
114 | ", FCP subaction(CA2HOST) = " __stringify(AVC_DEBUG_CA2HOST) | ||
115 | ", Application sent PMT = " __stringify(AVC_DEBUG_APPLICATION_PMT) | ||
116 | ", FCP payloads(for selected subactions) = " __stringify(AVC_DEBUG_FCP_PAYLOADS) | ||
100 | ", or all = -1)"); | 117 | ", or all = -1)"); |
101 | 118 | ||
102 | static const char *debug_fcp_ctype(unsigned int ctype) | 119 | static const char *debug_fcp_ctype(unsigned int ctype) |
@@ -142,24 +159,58 @@ static const char *debug_fcp_opcode(unsigned int opcode, | |||
142 | return "Vendor"; | 159 | return "Vendor"; |
143 | } | 160 | } |
144 | 161 | ||
162 | static int debug_fcp_opcode_flag_set(unsigned int opcode, | ||
163 | const u8 *data, int length) | ||
164 | { | ||
165 | switch (opcode) { | ||
166 | case AVC_OPCODE_VENDOR: break; | ||
167 | case AVC_OPCODE_READ_DESCRIPTOR: return avc_debug & AVC_DEBUG_READ_DESCRIPTOR; | ||
168 | case AVC_OPCODE_DSIT: return avc_debug & AVC_DEBUG_DSIT; | ||
169 | case AVC_OPCODE_DSD: return avc_debug & AVC_DEBUG_DSD; | ||
170 | default: return 1; | ||
171 | } | ||
172 | |||
173 | if (length < 7 || | ||
174 | data[3] != SFE_VENDOR_DE_COMPANYID_0 || | ||
175 | data[4] != SFE_VENDOR_DE_COMPANYID_1 || | ||
176 | data[5] != SFE_VENDOR_DE_COMPANYID_2) | ||
177 | return 1; | ||
178 | |||
179 | switch (data[6]) { | ||
180 | case SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL: return avc_debug & AVC_DEBUG_REGISTER_REMOTE_CONTROL; | ||
181 | case SFE_VENDOR_OPCODE_LNB_CONTROL: return avc_debug & AVC_DEBUG_LNB_CONTROL; | ||
182 | case SFE_VENDOR_OPCODE_TUNE_QPSK: return avc_debug & AVC_DEBUG_TUNE_QPSK; | ||
183 | case SFE_VENDOR_OPCODE_TUNE_QPSK2: return avc_debug & AVC_DEBUG_TUNE_QPSK2; | ||
184 | case SFE_VENDOR_OPCODE_HOST2CA: return avc_debug & AVC_DEBUG_HOST2CA; | ||
185 | case SFE_VENDOR_OPCODE_CA2HOST: return avc_debug & AVC_DEBUG_CA2HOST; | ||
186 | } | ||
187 | return 1; | ||
188 | } | ||
189 | |||
145 | static void debug_fcp(const u8 *data, int length) | 190 | static void debug_fcp(const u8 *data, int length) |
146 | { | 191 | { |
147 | unsigned int subunit_type, subunit_id, op; | 192 | unsigned int subunit_type, subunit_id, op; |
148 | const char *prefix = data[0] > 7 ? "FCP <- " : "FCP -> "; | 193 | const char *prefix = data[0] > 7 ? "FCP <- " : "FCP -> "; |
149 | 194 | ||
150 | if (avc_debug & AVC_DEBUG_FCP_SUBACTIONS) { | 195 | subunit_type = data[1] >> 3; |
151 | subunit_type = data[1] >> 3; | 196 | subunit_id = data[1] & 7; |
152 | subunit_id = data[1] & 7; | 197 | op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2]; |
153 | op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2]; | 198 | if (debug_fcp_opcode_flag_set(op, data, length)) { |
154 | printk(KERN_INFO "%ssu=%x.%x l=%d: %-8s - %s\n", | 199 | printk(KERN_INFO "%ssu=%x.%x l=%d: %-8s - %s\n", |
155 | prefix, subunit_type, subunit_id, length, | 200 | prefix, subunit_type, subunit_id, length, |
156 | debug_fcp_ctype(data[0]), | 201 | debug_fcp_ctype(data[0]), |
157 | debug_fcp_opcode(op, data, length)); | 202 | debug_fcp_opcode(op, data, length)); |
203 | if (avc_debug & AVC_DEBUG_FCP_PAYLOADS) | ||
204 | print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE, | ||
205 | 16, 1, data, length, false); | ||
158 | } | 206 | } |
207 | } | ||
159 | 208 | ||
160 | if (avc_debug & AVC_DEBUG_FCP_PAYLOADS) | 209 | static void debug_pmt(char *msg, int length) |
161 | print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE, 16, 1, | 210 | { |
162 | data, length, false); | 211 | printk(KERN_INFO "APP PMT -> l=%d\n", length); |
212 | print_hex_dump(KERN_INFO, "APP PMT -> ", DUMP_PREFIX_NONE, | ||
213 | 16, 1, msg, length, false); | ||
163 | } | 214 | } |
164 | 215 | ||
165 | static int __avc_write(struct firedtv *fdtv, | 216 | static int __avc_write(struct firedtv *fdtv, |
@@ -983,6 +1034,9 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length) | |||
983 | int es_info_length; | 1034 | int es_info_length; |
984 | int crc32_csum; | 1035 | int crc32_csum; |
985 | 1036 | ||
1037 | if (unlikely(avc_debug & AVC_DEBUG_APPLICATION_PMT)) | ||
1038 | debug_pmt(msg, length); | ||
1039 | |||
986 | memset(c, 0, sizeof(*c)); | 1040 | memset(c, 0, sizeof(*c)); |
987 | 1041 | ||
988 | c->ctype = AVC_CTYPE_CONTROL; | 1042 | c->ctype = AVC_CTYPE_CONTROL; |