|
@@ -89,14 +89,31 @@ struct avc_response_frame {
|
|
|
u8 operand[509];
|
|
|
};
|
|
|
|
|
|
-#define AVC_DEBUG_FCP_SUBACTIONS 1
|
|
|
-#define AVC_DEBUG_FCP_PAYLOADS 2
|
|
|
+#define AVC_DEBUG_READ_DESCRIPTOR 0x0001
|
|
|
+#define AVC_DEBUG_DSIT 0x0002
|
|
|
+#define AVC_DEBUG_DSD 0x0004
|
|
|
+#define AVC_DEBUG_REGISTER_REMOTE_CONTROL 0x0008
|
|
|
+#define AVC_DEBUG_LNB_CONTROL 0x0010
|
|
|
+#define AVC_DEBUG_TUNE_QPSK 0x0020
|
|
|
+#define AVC_DEBUG_TUNE_QPSK2 0x0040
|
|
|
+#define AVC_DEBUG_HOST2CA 0x0080
|
|
|
+#define AVC_DEBUG_CA2HOST 0x0100
|
|
|
+#define AVC_DEBUG_APPLICATION_PMT 0x4000
|
|
|
+#define AVC_DEBUG_FCP_PAYLOADS 0x8000
|
|
|
|
|
|
static int avc_debug;
|
|
|
module_param_named(debug, avc_debug, int, 0644);
|
|
|
-MODULE_PARM_DESC(debug, "Verbose logging (default = 0"
|
|
|
- ", FCP subactions = " __stringify(AVC_DEBUG_FCP_SUBACTIONS)
|
|
|
- ", FCP payloads = " __stringify(AVC_DEBUG_FCP_PAYLOADS)
|
|
|
+MODULE_PARM_DESC(debug, "Verbose logging bitmask (none (default) = 0"
|
|
|
+ ", FCP subaction(READ DESCRIPTOR) = " __stringify(AVC_DEBUG_READ_DESCRIPTOR)
|
|
|
+ ", FCP subaction(DSIT) = " __stringify(AVC_DEBUG_DSIT)
|
|
|
+ ", FCP subaction(REGISTER_REMOTE_CONTROL) = " __stringify(AVC_DEBUG_REGISTER_REMOTE_CONTROL)
|
|
|
+ ", FCP subaction(LNB CONTROL) = " __stringify(AVC_DEBUG_LNB_CONTROL)
|
|
|
+ ", FCP subaction(TUNE QPSK) = " __stringify(AVC_DEBUG_TUNE_QPSK)
|
|
|
+ ", FCP subaction(TUNE QPSK2) = " __stringify(AVC_DEBUG_TUNE_QPSK2)
|
|
|
+ ", FCP subaction(HOST2CA) = " __stringify(AVC_DEBUG_HOST2CA)
|
|
|
+ ", FCP subaction(CA2HOST) = " __stringify(AVC_DEBUG_CA2HOST)
|
|
|
+ ", Application sent PMT = " __stringify(AVC_DEBUG_APPLICATION_PMT)
|
|
|
+ ", FCP payloads(for selected subactions) = " __stringify(AVC_DEBUG_FCP_PAYLOADS)
|
|
|
", or all = -1)");
|
|
|
|
|
|
static const char *debug_fcp_ctype(unsigned int ctype)
|
|
@@ -142,24 +159,58 @@ static const char *debug_fcp_opcode(unsigned int opcode,
|
|
|
return "Vendor";
|
|
|
}
|
|
|
|
|
|
+static int debug_fcp_opcode_flag_set(unsigned int opcode,
|
|
|
+ const u8 *data, int length)
|
|
|
+{
|
|
|
+ switch (opcode) {
|
|
|
+ case AVC_OPCODE_VENDOR: break;
|
|
|
+ case AVC_OPCODE_READ_DESCRIPTOR: return avc_debug & AVC_DEBUG_READ_DESCRIPTOR;
|
|
|
+ case AVC_OPCODE_DSIT: return avc_debug & AVC_DEBUG_DSIT;
|
|
|
+ case AVC_OPCODE_DSD: return avc_debug & AVC_DEBUG_DSD;
|
|
|
+ default: return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (length < 7 ||
|
|
|
+ data[3] != SFE_VENDOR_DE_COMPANYID_0 ||
|
|
|
+ data[4] != SFE_VENDOR_DE_COMPANYID_1 ||
|
|
|
+ data[5] != SFE_VENDOR_DE_COMPANYID_2)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ switch (data[6]) {
|
|
|
+ case SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL: return avc_debug & AVC_DEBUG_REGISTER_REMOTE_CONTROL;
|
|
|
+ case SFE_VENDOR_OPCODE_LNB_CONTROL: return avc_debug & AVC_DEBUG_LNB_CONTROL;
|
|
|
+ case SFE_VENDOR_OPCODE_TUNE_QPSK: return avc_debug & AVC_DEBUG_TUNE_QPSK;
|
|
|
+ case SFE_VENDOR_OPCODE_TUNE_QPSK2: return avc_debug & AVC_DEBUG_TUNE_QPSK2;
|
|
|
+ case SFE_VENDOR_OPCODE_HOST2CA: return avc_debug & AVC_DEBUG_HOST2CA;
|
|
|
+ case SFE_VENDOR_OPCODE_CA2HOST: return avc_debug & AVC_DEBUG_CA2HOST;
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
static void debug_fcp(const u8 *data, int length)
|
|
|
{
|
|
|
unsigned int subunit_type, subunit_id, op;
|
|
|
const char *prefix = data[0] > 7 ? "FCP <- " : "FCP -> ";
|
|
|
|
|
|
- if (avc_debug & AVC_DEBUG_FCP_SUBACTIONS) {
|
|
|
- subunit_type = data[1] >> 3;
|
|
|
- subunit_id = data[1] & 7;
|
|
|
- op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2];
|
|
|
+ subunit_type = data[1] >> 3;
|
|
|
+ subunit_id = data[1] & 7;
|
|
|
+ op = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2];
|
|
|
+ if (debug_fcp_opcode_flag_set(op, data, length)) {
|
|
|
printk(KERN_INFO "%ssu=%x.%x l=%d: %-8s - %s\n",
|
|
|
prefix, subunit_type, subunit_id, length,
|
|
|
debug_fcp_ctype(data[0]),
|
|
|
debug_fcp_opcode(op, data, length));
|
|
|
+ if (avc_debug & AVC_DEBUG_FCP_PAYLOADS)
|
|
|
+ print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE,
|
|
|
+ 16, 1, data, length, false);
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
- if (avc_debug & AVC_DEBUG_FCP_PAYLOADS)
|
|
|
- print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE, 16, 1,
|
|
|
- data, length, false);
|
|
|
+static void debug_pmt(char *msg, int length)
|
|
|
+{
|
|
|
+ printk(KERN_INFO "APP PMT -> l=%d\n", length);
|
|
|
+ print_hex_dump(KERN_INFO, "APP PMT -> ", DUMP_PREFIX_NONE,
|
|
|
+ 16, 1, msg, length, false);
|
|
|
}
|
|
|
|
|
|
static int __avc_write(struct firedtv *fdtv,
|
|
@@ -983,6 +1034,9 @@ int avc_ca_pmt(struct firedtv *fdtv, char *msg, int length)
|
|
|
int es_info_length;
|
|
|
int crc32_csum;
|
|
|
|
|
|
+ if (unlikely(avc_debug & AVC_DEBUG_APPLICATION_PMT))
|
|
|
+ debug_pmt(msg, length);
|
|
|
+
|
|
|
memset(c, 0, sizeof(*c));
|
|
|
|
|
|
c->ctype = AVC_CTYPE_CONTROL;
|