fix: DVB-S QPSK and TURBO QPSK have different fec tuning values add: DSS add: DCII Signed-off-by: Chris Lee <updatelee@xxxxxxxxx> --- drivers/media/usb/dvb-usb/gp8psk-fe.c | 180 ++++++++++++++++++++++------------ 1 file changed, 116 insertions(+), 64 deletions(-) diff --git a/drivers/media/usb/dvb-usb/gp8psk-fe.c b/drivers/media/usb/dvb-usb/gp8psk-fe.c index 4e61c48..4175cf0 100644 --- a/drivers/media/usb/dvb-usb/gp8psk-fe.c +++ b/drivers/media/usb/dvb-usb/gp8psk-fe.c @@ -235,93 +235,145 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend *fe) u32 freq = c->frequency * 1000; int gp_product_id = le16_to_cpu(state->d->udev->descriptor.idProduct); - deb_fe("%s()\n", __func__); + info("%s() freq: %d, sr: %d", __func__, freq, c->symbol_rate); + cmd[0] = c->symbol_rate & 0xff; + cmd[1] = (c->symbol_rate >> 8) & 0xff; + cmd[2] = (c->symbol_rate >> 16) & 0xff; + cmd[3] = (c->symbol_rate >> 24) & 0xff; cmd[4] = freq & 0xff; cmd[5] = (freq >> 8) & 0xff; cmd[6] = (freq >> 16) & 0xff; cmd[7] = (freq >> 24) & 0xff; - /* backwards compatibility: DVB-S + 8-PSK were used for Turbo-FEC */ - if (c->delivery_system == SYS_DVBS && c->modulation == PSK_8) + /* backwards compatibility: DVB-S2 used to be used for Turbo-FEC */ + if (c->delivery_system == SYS_DVBS2) c->delivery_system = SYS_TURBO; switch (c->delivery_system) { case SYS_DVBS: - if (c->modulation != QPSK) { - deb_fe("%s: unsupported modulation selected (%d)\n", + info("%s: DVB-S delivery system selected w/fec %d", __func__, c->fec_inner); + c->fec_inner = FEC_AUTO; + cmd[8] = ADV_MOD_DVB_QPSK; + cmd[9] = 5; + break; + case SYS_TURBO: + info("%s: Turbo-FEC delivery system selected", __func__); + switch (c->modulation) { + case QPSK: + info("%s: modulation QPSK selected w/fec %d", __func__, c->fec_inner); + cmd[8] = ADV_MOD_TURBO_QPSK; + switch (c->fec_inner) { + case FEC_1_2: cmd[9] = 1; break; + case FEC_2_3: cmd[9] = 3; break; + case FEC_3_4: cmd[9] = 2; break; + case FEC_5_6: cmd[9] = 4; break; + default: cmd[9] = 0; break; + } + break; + case PSK_8: + info("%s: modulation 8PSK selected w/fec %d", __func__, c->fec_inner); + cmd[8] = ADV_MOD_TURBO_8PSK; + switch (c->fec_inner) { + case FEC_2_3: cmd[9] = 0; break; + case FEC_3_4: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_5_6: cmd[9] = 3; break; + case FEC_8_9: cmd[9] = 4; break; + default: cmd[9] = 0; break; + } + break; + case QAM_16: /* QAM_16 is for compatibility with DN */ + info("%s: modulation QAM_16 selected w/fec %d", __func__, c->fec_inner); + cmd[8] = ADV_MOD_TURBO_16QAM; + cmd[9] = 0; + break; + default: /* Unknown modulation */ + info("%s: unsupported modulation selected (%d)", __func__, c->modulation); return -EOPNOTSUPP; } - c->fec_inner = FEC_AUTO; break; - case SYS_DVBS2: /* kept for backwards compatibility */ - deb_fe("%s: DVB-S2 delivery system selected\n", __func__); + case SYS_DSS: + info("%s: DSS delivery system selected w/fec %d", __func__, c->fec_inner); + cmd[8] = ADV_MOD_DSS_QPSK; + switch (c->fec_inner) { + case FEC_1_2: cmd[9] = 0; break; + case FEC_2_3: cmd[9] = 1; break; + case FEC_3_4: cmd[9] = 2; break; + case FEC_5_6: cmd[9] = 3; break; + case FEC_7_8: cmd[9] = 4; break; + case FEC_AUTO: cmd[9] = 5; break; + case FEC_6_7: cmd[9] = 6; break; + default: cmd[9] = 5; break; + } break; - case SYS_TURBO: - deb_fe("%s: Turbo-FEC delivery system selected\n", __func__); + case SYS_DCII_C_QPSK: + info("%s: DCII_C_QPSK delivery system selected w/fec %d", __func__, c->fec_inner); + cmd[8] = ADV_MOD_DCII_C_QPSK; + switch (c->fec_inner) { + /* 5/11 FEC is cmd[9] = 0 but not added to the API */ + case FEC_1_2: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_2_3: cmd[9] = 3; break; + case FEC_3_4: cmd[9] = 4; break; + case FEC_4_5: cmd[9] = 5; break; + case FEC_5_6: cmd[9] = 6; break; + case FEC_7_8: cmd[9] = 7; break; + case FEC_AUTO: cmd[9] = 8; break; + default: cmd[9] = 8; break; + } break; - - default: - deb_fe("%s: unsupported delivery system selected (%d)\n", - __func__, c->delivery_system); - return -EOPNOTSUPP; - } - - cmd[0] = c->symbol_rate & 0xff; - cmd[1] = (c->symbol_rate >> 8) & 0xff; - cmd[2] = (c->symbol_rate >> 16) & 0xff; - cmd[3] = (c->symbol_rate >> 24) & 0xff; - switch (c->modulation) { - case QPSK: - if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) - if (gp8psk_tuned_to_DCII(fe)) - gp8psk_bcm4500_reload(state->d); + case SYS_DCII_I_QPSK: + info("%s: DCII_I_QPSK delivery system selected w/fec %d", __func__, cmd[9]); + cmd[8] = ADV_MOD_DCII_I_QPSK; switch (c->fec_inner) { - case FEC_1_2: - cmd[9] = 0; break; - case FEC_2_3: - cmd[9] = 1; break; - case FEC_3_4: - cmd[9] = 2; break; - case FEC_5_6: - cmd[9] = 3; break; - case FEC_7_8: - cmd[9] = 4; break; - case FEC_AUTO: - cmd[9] = 5; break; - default: - cmd[9] = 5; break; + /* 5/11 FEC is cmd[9] = 0 but not added to the API */ + case FEC_1_2: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_2_3: cmd[9] = 3; break; + case FEC_3_4: cmd[9] = 4; break; + case FEC_4_5: cmd[9] = 5; break; + case FEC_5_6: cmd[9] = 6; break; + case FEC_7_8: cmd[9] = 7; break; + case FEC_AUTO: cmd[9] = 8; break; + default: cmd[9] = 8; break; } - if (c->delivery_system == SYS_TURBO) - cmd[8] = ADV_MOD_TURBO_QPSK; - else - cmd[8] = ADV_MOD_DVB_QPSK; break; - case PSK_8: /* PSK_8 is for compatibility with DN */ - cmd[8] = ADV_MOD_TURBO_8PSK; + case SYS_DCII_Q_QPSK: + info("%s: DCII_Q_QPSK delivery system selected w/fec %d", __func__, cmd[9]); + cmd[8] = ADV_MOD_DCII_Q_QPSK; switch (c->fec_inner) { - case FEC_2_3: - cmd[9] = 0; break; - case FEC_3_4: - cmd[9] = 1; break; - case FEC_3_5: - cmd[9] = 2; break; - case FEC_5_6: - cmd[9] = 3; break; - case FEC_8_9: - cmd[9] = 4; break; - default: - cmd[9] = 0; break; + /* 5/11 FEC is cmd[9] = 0 but not added to the API */ + case FEC_1_2: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_2_3: cmd[9] = 3; break; + case FEC_3_4: cmd[9] = 4; break; + case FEC_4_5: cmd[9] = 5; break; + case FEC_5_6: cmd[9] = 6; break; + case FEC_7_8: cmd[9] = 7; break; + case FEC_AUTO: cmd[9] = 8; break; + default: cmd[9] = 8; break; } break; - case QAM_16: /* QAM_16 is for compatibility with DN */ - cmd[8] = ADV_MOD_TURBO_16QAM; - cmd[9] = 0; + case SYS_DCII_C_OQPSK: + info("%s: DCII_C_OQPSK delivery system selected w/fec %d", __func__, cmd[9]); + cmd[8] = ADV_MOD_DCII_C_OQPSK; + switch (c->fec_inner) { + /* 5/11 FEC is cmd[9] = 0 but not added to the API */ + case FEC_1_2: cmd[9] = 1; break; + case FEC_3_5: cmd[9] = 2; break; + case FEC_2_3: cmd[9] = 3; break; + case FEC_3_4: cmd[9] = 4; break; + case FEC_4_5: cmd[9] = 5; break; + case FEC_5_6: cmd[9] = 6; break; + case FEC_7_8: cmd[9] = 7; break; + case FEC_AUTO: cmd[9] = 8; break; + default: cmd[9] = 8; break; + } break; - default: /* Unknown modulation */ - deb_fe("%s: unsupported modulation selected (%d)\n", - __func__, c->modulation); + default: + info("%s: unsupported delivery system selected (%d)", __func__, c->delivery_system); return -EOPNOTSUPP; } -- 1.8.1.2 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html