|
|
|
@ -103,18 +103,19 @@ struct avc_response_frame { |
|
|
|
|
|
|
|
|
|
static int avc_debug; |
|
|
|
|
module_param_named(debug, avc_debug, int, 0644); |
|
|
|
|
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)"); |
|
|
|
|
MODULE_PARM_DESC(debug, "Verbose logging (none = 0" |
|
|
|
|
", FCP subactions" |
|
|
|
|
": READ DESCRIPTOR = " __stringify(AVC_DEBUG_READ_DESCRIPTOR) |
|
|
|
|
", DSIT = " __stringify(AVC_DEBUG_DSIT) |
|
|
|
|
", REGISTER_REMOTE_CONTROL = " __stringify(AVC_DEBUG_REGISTER_REMOTE_CONTROL) |
|
|
|
|
", LNB CONTROL = " __stringify(AVC_DEBUG_LNB_CONTROL) |
|
|
|
|
", TUNE QPSK = " __stringify(AVC_DEBUG_TUNE_QPSK) |
|
|
|
|
", TUNE QPSK2 = " __stringify(AVC_DEBUG_TUNE_QPSK2) |
|
|
|
|
", HOST2CA = " __stringify(AVC_DEBUG_HOST2CA) |
|
|
|
|
", CA2HOST = " __stringify(AVC_DEBUG_CA2HOST) |
|
|
|
|
"; Application sent PMT = " __stringify(AVC_DEBUG_APPLICATION_PMT) |
|
|
|
|
", FCP payloads = " __stringify(AVC_DEBUG_FCP_PAYLOADS) |
|
|
|
|
", or a combination, or all = -1)"); |
|
|
|
|
|
|
|
|
|
static const char *debug_fcp_ctype(unsigned int ctype) |
|
|
|
|
{ |
|
|
|
@ -135,71 +136,59 @@ static const char *debug_fcp_opcode(unsigned int opcode, |
|
|
|
|
const u8 *data, int length) |
|
|
|
|
{ |
|
|
|
|
switch (opcode) { |
|
|
|
|
case AVC_OPCODE_VENDOR: break; |
|
|
|
|
case AVC_OPCODE_READ_DESCRIPTOR: return "ReadDescriptor"; |
|
|
|
|
case AVC_OPCODE_DSIT: return "DirectSelectInfo.Type"; |
|
|
|
|
case AVC_OPCODE_DSD: return "DirectSelectData"; |
|
|
|
|
default: return "?"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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 "Vendor"; |
|
|
|
|
|
|
|
|
|
switch (data[6]) { |
|
|
|
|
case SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL: return "RegisterRC"; |
|
|
|
|
case SFE_VENDOR_OPCODE_LNB_CONTROL: return "LNBControl"; |
|
|
|
|
case SFE_VENDOR_OPCODE_TUNE_QPSK: return "TuneQPSK"; |
|
|
|
|
case SFE_VENDOR_OPCODE_TUNE_QPSK2: return "TuneQPSK2"; |
|
|
|
|
case SFE_VENDOR_OPCODE_HOST2CA: return "Host2CA"; |
|
|
|
|
case SFE_VENDOR_OPCODE_CA2HOST: return "CA2Host"; |
|
|
|
|
} |
|
|
|
|
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; |
|
|
|
|
case AVC_OPCODE_VENDOR: |
|
|
|
|
break; |
|
|
|
|
case AVC_OPCODE_READ_DESCRIPTOR: |
|
|
|
|
return avc_debug & AVC_DEBUG_READ_DESCRIPTOR ? |
|
|
|
|
"ReadDescriptor" : NULL; |
|
|
|
|
case AVC_OPCODE_DSIT: |
|
|
|
|
return avc_debug & AVC_DEBUG_DSIT ? |
|
|
|
|
"DirectSelectInfo.Type" : NULL; |
|
|
|
|
case AVC_OPCODE_DSD: |
|
|
|
|
return avc_debug & AVC_DEBUG_DSD ? "DirectSelectData" : NULL; |
|
|
|
|
default: |
|
|
|
|
return "Unknown"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
return "Vendor/Unknown"; |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
case SFE_VENDOR_OPCODE_REGISTER_REMOTE_CONTROL: |
|
|
|
|
return avc_debug & AVC_DEBUG_REGISTER_REMOTE_CONTROL ? |
|
|
|
|
"RegisterRC" : NULL; |
|
|
|
|
case SFE_VENDOR_OPCODE_LNB_CONTROL: |
|
|
|
|
return avc_debug & AVC_DEBUG_LNB_CONTROL ? "LNBControl" : NULL; |
|
|
|
|
case SFE_VENDOR_OPCODE_TUNE_QPSK: |
|
|
|
|
return avc_debug & AVC_DEBUG_TUNE_QPSK ? "TuneQPSK" : NULL; |
|
|
|
|
case SFE_VENDOR_OPCODE_TUNE_QPSK2: |
|
|
|
|
return avc_debug & AVC_DEBUG_TUNE_QPSK2 ? "TuneQPSK2" : NULL; |
|
|
|
|
case SFE_VENDOR_OPCODE_HOST2CA: |
|
|
|
|
return avc_debug & AVC_DEBUG_HOST2CA ? "Host2CA" : NULL; |
|
|
|
|
case SFE_VENDOR_OPCODE_CA2HOST: |
|
|
|
|
return avc_debug & AVC_DEBUG_CA2HOST ? "CA2Host" : NULL; |
|
|
|
|
} |
|
|
|
|
return 1; |
|
|
|
|
return "Vendor/Unknown"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void debug_fcp(const u8 *data, int length) |
|
|
|
|
{ |
|
|
|
|
unsigned int subunit_type, subunit_id, op; |
|
|
|
|
const char *prefix = data[0] > 7 ? "FCP <- " : "FCP -> "; |
|
|
|
|
unsigned int subunit_type, subunit_id, opcode; |
|
|
|
|
const char *op, *prefix; |
|
|
|
|
|
|
|
|
|
prefix = data[0] > 7 ? "FCP <- " : "FCP -> "; |
|
|
|
|
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)) { |
|
|
|
|
subunit_id = data[1] & 7; |
|
|
|
|
opcode = subunit_type == 0x1e || subunit_id == 5 ? ~0 : data[2]; |
|
|
|
|
op = debug_fcp_opcode(opcode, data, length); |
|
|
|
|
|
|
|
|
|
if (op) { |
|
|
|
|
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)); |
|
|
|
|
debug_fcp_ctype(data[0]), op); |
|
|
|
|
if (avc_debug & AVC_DEBUG_FCP_PAYLOADS) |
|
|
|
|
print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_NONE, |
|
|
|
|
16, 1, data, length, false); |
|
|
|
|