From a276a370cbf142e806c18894b8683e2a085231a6 Mon Sep 17 00:00:00 2001 From: none Date: Tue, 9 Feb 2021 17:30:48 +0100 Subject: [PATCH 01/19] always return lock with SDR mode --- ddbridge/ddbridge-sx8.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index 92177d5..dc6bf37 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -136,6 +136,10 @@ static int read_status(struct dvb_frontend *fe, enum fe_status *status) stat = ddb_mci_get_status(&state->mci, &res); if (stat) return stat; + if (sx8_base->iq_mode >= 2) { + *status = 0x1f; + return stat; + } *status = 0x00; ddb_mci_get_info(&state->mci); if (res.status == SX8_DEMOD_WAIT_MATYPE) From 37eb11fb4bab10a747d5bcbe9241209b360fcf75 Mon Sep 17 00:00:00 2001 From: none Date: Tue, 9 Feb 2021 17:40:49 +0100 Subject: [PATCH 02/19] set iq_mode to 2 in start_iq() --- ddbridge/ddbridge-sx8.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-sx8.c b/ddbridge/ddbridge-sx8.c index dc6bf37..8160a92 100644 --- a/ddbridge/ddbridge-sx8.c +++ b/ddbridge/ddbridge-sx8.c @@ -411,7 +411,7 @@ static int start_iq(struct dvb_frontend *fe, u32 flags, mci_set_tuner(fe, input, 1); */ sx8_base->tuner_use_count[input]++; - sx8_base->iq_mode = (ts_config > 1); + sx8_base->iq_mode = 2; unlock: mutex_unlock(&mci_base->tuner_lock); if (stat) From ee6787d2d0520eb9e5384b447523a4bbe381327a Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:12:54 +0100 Subject: [PATCH 03/19] add usage for force option --- apps/octonet/ddupdate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/octonet/ddupdate.c b/apps/octonet/ddupdate.c index 6129bda..e5c9257 100644 --- a/apps/octonet/ddupdate.c +++ b/apps/octonet/ddupdate.c @@ -200,6 +200,7 @@ static int usage() "-n N\n only update card N (default with N=0)\n\n" "-a \n update all cards\n\n" "-b file\n fpga image file override (ignored if -a is used)\n\n" + "-f \n force update\n\n" "-v \n more verbose (up to -v -v -v)\n\n" ); } From f1976b5f74abbb1287a97884eaf93ad502406487 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:13:24 +0100 Subject: [PATCH 04/19] always return if help requested --- apps/octonet/ddupdate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/octonet/ddupdate.c b/apps/octonet/ddupdate.c index e5c9257..89dee96 100644 --- a/apps/octonet/ddupdate.c +++ b/apps/octonet/ddupdate.c @@ -251,7 +251,7 @@ int main(int argc, char **argv) break; case 'h': usage(); - break; + return 0; default: break; From b3f2580e84a83493bd8787f27c8954ac3293ba5f Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:16:26 +0100 Subject: [PATCH 05/19] add flash name --- apps/octonet/flash.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index 121ec0d..c8b62e9 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -50,15 +50,15 @@ struct flash_info flashs[] = { { { 0x01, 0x40, 0x15 }, SPANSION_S25FL116K, 4096, 0x200000, "SPANSION S25FL116K 16 MBit" }, { { 0x01, 0x40, 0x16 }, SPANSION_S25FL132K, 4096, 0x400000, "SPANSION S25FL132K 32 MBit" }, { { 0x01, 0x40, 0x17 }, SPANSION_S25FL164K, 4096, 0x800000, "SPANSION S25FL164K 64 MBit" }, - { { 0xef, 0x40, 0x15 }, WINBOND_W25Q16JV, 4096, 0x200000, "Winbond 16 MBit" }, - { { 0xef, 0x40, 0x16 }, WINBOND_W25Q32JV, 4096, 0x400000, "Winbond 32 MBit" }, - { { 0xef, 0x40, 0x17 }, WINBOND_W25Q64JV, 4096, 0x800000, "Winbond 64 MBit" }, - { { 0xef, 0x40, 0x18 }, WINBOND_W25Q128JV, 4096, 0x1000000, "Winbond 128 MBit" }, - { { 0xef, 0x70, 0x15 }, WINBOND_W25Q16JV, 4096, 0x200000, "Winbond 16 MBit" }, - { { 0xef, 0x70, 0x16 }, WINBOND_W25Q32JV, 4096, 0x400000, "Winbond 32 MBit" }, - { { 0xef, 0x70, 0x17 }, WINBOND_W25Q64JV, 4096, 0x800000, "Winbond 64 MBit" }, - { { 0xef, 0x70, 0x18 }, WINBOND_W25Q128JV, 4096, 0x1000000, "Winbond 128 MBit" }, - { { 0x1f, 0x28, 0xff }, ATMEL_AT45DB642D, 1024, 0x800000, "Atmel AT45DB642D 64 MBit" }, + { { 0xef, 0x40, 0x15 }, WINBOND_W25Q16JV, 4096, 0x200000, "Winbond W25Q16JV 16 MBit" }, + { { 0xef, 0x40, 0x16 }, WINBOND_W25Q32JV, 4096, 0x400000, "Winbond W25Q32JV 32 MBit" }, + { { 0xef, 0x40, 0x17 }, WINBOND_W25Q64JV, 4096, 0x800000, "Winbond W25Q64JV 64 MBit" }, + { { 0xef, 0x40, 0x18 }, WINBOND_W25Q128JV, 4096, 0x1000000, "Winbond W25Q128JV 128 MBit" }, + { { 0xef, 0x70, 0x15 }, WINBOND_W25Q16JV, 4096, 0x200000, "Winbond W25Q16JV 16 MBit" }, + { { 0xef, 0x70, 0x16 }, WINBOND_W25Q32JV, 4096, 0x400000, "Winbond W25Q32JV 32 MBit" }, + { { 0xef, 0x70, 0x17 }, WINBOND_W25Q64JV, 4096, 0x800000, "Winbond W25Q64JV 64 MBit" }, + { { 0xef, 0x70, 0x18 }, WINBOND_W25Q128JV, 4096, 0x1000000, "Winbond W25Q128JV 128 MBit" }, + { { 0x1f, 0x28, 0xff }, ATMEL_AT45DB642D, 1024, 0x800000, "Atmel AT45DB642D 64 MBit" }, { { 0x00, 0x00, 0x00 }, UNKNOWN_FLASH, 0, 0, "Unknown" }, }; From b72f0365ea1d52d26ce18b73fa7191ae09bb2d53 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:16:43 +0100 Subject: [PATCH 06/19] correctly check id --- apps/octonet/flash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/octonet/flash.c b/apps/octonet/flash.c index c8b62e9..cb0dbc9 100644 --- a/apps/octonet/flash.c +++ b/apps/octonet/flash.c @@ -68,7 +68,7 @@ static struct flash_info *flash_getinfo(uint8_t *id) while (f->id[0]) { if ((f->id[0] == id[0]) && (f->id[1] == id[1]) && - ((id[0] == 0xff) || (f->id[0] == id[0]))) + ((id[2] == 0xff) || (f->id[2] == id[2]))) break; f++; } From cd3868afff66afd9231ef9e2079ff37140aa3a78 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:17:22 +0100 Subject: [PATCH 07/19] reenable gain control --- apps/setmod3.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/setmod3.c b/apps/setmod3.c index 1b99b18..f41491d 100644 --- a/apps/setmod3.c +++ b/apps/setmod3.c @@ -58,7 +58,7 @@ int main(int argc, char*argv[]) struct dvb_mod_params mp; struct dvb_mod_channel_params mc; uint32_t data; - int adapter = 0, channel = 0, gain = -1; + int32_t adapter = 0, channel = 0, gain = -1; int32_t base = -1, freq = -1, rate = -1; char mod_name[128]; @@ -134,6 +134,8 @@ int main(int argc, char*argv[]) //get_property(fd, MODULATOR_ATTENUATOR, &data); //printf("Modulator attenuator = %u\n", data); + if (gain > 0) + set_property(fd, MODULATOR_GAIN, gain); if (base > 0) set_property(fd, MODULATOR_BASE_FREQUENCY, base); if (freq > 0) From ea41e57ba3dd7ae013d1c6b7000ea1f8d43edeaa Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:17:50 +0100 Subject: [PATCH 08/19] disable master at driver shutdown --- ddbridge/ddbridge-main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ddbridge/ddbridge-main.c b/ddbridge/ddbridge-main.c index 23a414b..f84536c 100644 --- a/ddbridge/ddbridge-main.c +++ b/ddbridge/ddbridge-main.c @@ -139,6 +139,7 @@ static void __devexit ddb_remove(struct pci_dev *pdev) ddb_buffers_free(dev); ddb_unmap(dev); + pci_clear_master(pdev); pci_set_drvdata(pdev, NULL); pci_disable_device(pdev); } From fc728ab51e28a8a40a488b3995633a18c77151a4 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:19:06 +0100 Subject: [PATCH 09/19] only report I2C errors after probing is done --- frontends/cxd2843.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/frontends/cxd2843.c b/frontends/cxd2843.c index d6f0646..b2ce30f 100644 --- a/frontends/cxd2843.c +++ b/frontends/cxd2843.c @@ -54,6 +54,7 @@ struct cxd_state { struct dvb_frontend frontend; struct i2c_adapter *i2c; struct mutex mutex; + int repi2cerr; u8 adrt; u8 curbankt; @@ -91,12 +92,13 @@ struct cxd_state { u8 is24MHz; }; -static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len) +static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len, int flag) { struct i2c_msg msg = { .addr = adr, .flags = 0, .buf = data, .len = len}; if (i2c_transfer(adap, &msg, 1) != 1) { - pr_err("cxd2843: i2c_write error adr %02x data %02x\n", adr, data[0]); + if (flag) + pr_err("cxd2843: i2c_write error adr %02x data %02x\n", adr, data[0]); return -1; } return 0; @@ -113,14 +115,14 @@ static int writeregs(struct cxd_state *state, u8 adr, u8 reg, } data[0] = reg; memcpy(data + 1, regd, len); - return i2c_write(state->i2c, adr, data, len + 1); + return i2c_write(state->i2c, adr, data, len + 1, state->repi2cerr); } static int writereg(struct cxd_state *state, u8 adr, u8 reg, u8 dat) { u8 mm[2] = {reg, dat}; - return i2c_write(state->i2c, adr, mm, 2); + return i2c_write(state->i2c, adr, mm, 2, state->repi2cerr); } static int i2c_read(struct i2c_adapter *adap, @@ -130,17 +132,19 @@ static int i2c_read(struct i2c_adapter *adap, .buf = msg, .len = len}, { .addr = adr, .flags = I2C_M_RD, .buf = answ, .len = alen } }; - if (i2c_transfer(adap, msgs, 2) != 2) { - pr_err("cxd2843: i2c_read error\n"); + if (i2c_transfer(adap, msgs, 2) != 2) return -1; - } return 0; } static int readregs(struct cxd_state *state, u8 adr, u8 reg, u8 *val, int count) { - return i2c_read(state->i2c, adr, ®, 1, val, count); + int ret = i2c_read(state->i2c, adr, ®, 1, val, count); + + if (ret && state->repi2cerr) + pr_err("cxd2843: i2c_read error\n"); + return ret; } static int readregst_unlocked(struct cxd_state *cxd, u8 bank, @@ -1644,7 +1648,7 @@ static void init_state(struct cxd_state *state, struct cxd2843_cfg *cfg) /* IF Fullscale 0x50 = 1.4V, 0x39 = 1V, 0x28 = 0.7V */ state->IF_FS = 0x50; state->is24MHz = (cfg->osc == 24000000) ? 1 : 0; - printk("is24Mhz = %u\n", state->is24MHz); + printk("is24Mhz = %u, adr = %02x\n", state->is24MHz, cfg->adr); } static int get_tune_settings(struct dvb_frontend *fe, @@ -2646,8 +2650,9 @@ static int probe(struct cxd_state *state) status = readregsx(state, 0x00, 0xFD, &ChipID, 1); if (status) return status; - - printk("ChipID = %02X\n", ChipID); + + state->repi2cerr = 1; + //pr_info("cxd2843: ChipID = %02X\n", ChipID); switch (ChipID) { case 0xa4: state->type = CXD2843; @@ -2682,7 +2687,6 @@ struct dvb_frontend *cxd2843_attach(struct i2c_adapter *i2c, { struct cxd_state *state = NULL; - pr_info("attach\n"); state = kzalloc(sizeof(struct cxd_state), GFP_KERNEL); if (!state) return NULL; From 7efa935a30046fb3592f8b32c7d2777f79237305 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:20:10 +0100 Subject: [PATCH 10/19] remove debug messages --- frontends/tda18212dd.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/frontends/tda18212dd.c b/frontends/tda18212dd.c index cf43a22..1235437 100644 --- a/frontends/tda18212dd.c +++ b/frontends/tda18212dd.c @@ -447,18 +447,13 @@ static int attach_init(struct tda_state *state) if (!state->m_isMaster) state->m_bLTEnable = false; - /*pr_info("tda18212dd: ChipID %04x %s\n", state->m_ID, - state->m_isMaster ? "master" : "slave");*/ - if (state->m_ID != 18212) return -1; stat = read_reg(state, POWER_STATE_1 , &PowerState); if (stat < 0) return stat; - - /*pr_info("tda18212dd: PowerState %02x\n", PowerState);*/ - + if (state->m_isMaster) { if (PowerState & 0x02) { /* msleep for XTAL Calibration @@ -539,7 +534,6 @@ static int PowerMeasurement(struct tda_state *state, u8 *pPowerLevel) if (*pPowerLevel > 110) *pPowerLevel = 110; } while (0); - /* pr_info("PL %d\n", *pPowerLevel); */ return status; } @@ -806,7 +800,6 @@ static int set_params(struct dvb_frontend *fe) bw = (p->bandwidth_hz + 999999) / 1000000; state->m_Frequency = p->frequency; - /*pr_info("tuner bw=%u freq=%u\n", bw, state->m_Frequency);*/ if (p->delivery_system == SYS_DVBT || p->delivery_system == SYS_DVBT2 || p->delivery_system == SYS_ISDBT || From 1598ab98bc90aafd9e3762be7ddb6b7c72f18760 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:21:57 +0100 Subject: [PATCH 11/19] print MCI information at init --- ddbridge/ddbridge-mci.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index 760d9f5..f2633b3 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -59,7 +59,11 @@ static int mci_reset(struct ddb_link *link) dev_err(link->dev->dev, "MCI init failed!\n"); return -1; } - dev_info(link->dev->dev, "MCI port OK, init time %u msecs\n", (40-timeout)*50); + dev_info(link->dev->dev, "MCI port OK, init time %u msecs\n", (40 - timeout) * 50); + + print_hex_dump(KERN_INFO, "ddbridge: MCI INIT INFO: ", DUMP_PREFIX_NONE, 16, 1, + link->dev->regs + regmap->mci_buf->base + MCI_COMMAND_SIZE, + 16, false); return 0; } From c82c9d3218f1793353be4f1d80a0ba8f3ea7e7ce Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:22:08 +0100 Subject: [PATCH 12/19] old GCC does not like init in struct --- ddbridge/ddbridge-mci.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index f2633b3..91f3a7a 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -170,11 +170,17 @@ int mci_init(struct ddb_link *link) int mci_cmd_val(struct ddb_link *link, uint32_t cmd, uint32_t val) { struct mci_result result; +#if 0 struct mci_command command = { .command_word = cmd, .params = { val }, }; +#else + struct mci_command command; + command.command_word = cmd; + command.params[0] = val; +#endif return ddb_mci_cmd_link(link, &command, &result); } From f72c7b2256a54d2c47b555653d122455e6b71b51 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:22:36 +0100 Subject: [PATCH 13/19] print MCI info --- ddbridge/ddbridge-mci.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ddbridge/ddbridge-mci.c b/ddbridge/ddbridge-mci.c index 91f3a7a..0ae7630 100644 --- a/ddbridge/ddbridge-mci.c +++ b/ddbridge/ddbridge-mci.c @@ -219,6 +219,21 @@ int ddb_mci_get_status(struct mci *mci, struct mci_result *res) return ddb_mci_cmd_raw(mci, &cmd, 1, res, 1); } +static void ddb_mci_print_info(struct mci *mci) +{ + struct ddb_link *link = mci->base->link; + const struct ddb_regmap *regmap = link->info->regmap; + struct mci_command cmd; + struct mci_result res; + + cmd.command = 0x0f; + if (ddb_mci_cmd_raw(mci, &cmd, 1, &res, 1) < 0) + return; + print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, + link->dev->regs + regmap->mci_buf->base + MCI_COMMAND_SIZE, + 16, false); +} + int ddb_mci_get_snr(struct dvb_frontend *fe) { struct mci *mci = fe->demodulator_priv; From d259d69808277ed10c792978836245243efbbd4e Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:24:14 +0100 Subject: [PATCH 14/19] add packet loss function --- ddbridge/ddbridge-core.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 5071bb3..2ef2f17 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -527,6 +527,18 @@ static void ddb_output_stop(struct ddb_output *output) } } +static void update_loss(struct ddb_dma *dma) +{ + struct ddb_input *input = (struct ddb_input *)dma->io; + u32 packet_loss = dma->packet_loss; + u32 cur_counter = ddbreadl(input->port->dev, TS_STAT(input)) & 0xffff; + + if (cur_counter < (packet_loss & 0xffff)) + packet_loss += 0x10000; + packet_loss = ((packet_loss & 0xffff0000) | cur_counter); + dma->packet_loss = packet_loss; +} + static void ddb_input_stop_unlocked(struct ddb_input *input) { struct ddb *dev = input->port->dev; From baf6a090b8eb170f89af978a7d3417d028810c33 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:25:27 +0100 Subject: [PATCH 15/19] use packet loss function --- ddbridge/ddbridge-core.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 2ef2f17..8b8962b 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -552,7 +552,8 @@ static void ddb_input_stop_unlocked(struct ddb_input *input) dev_warn(input->port->dev->dev, "DMA stalled %u times!\n", input->dma->stall_count); - if (input->dma->packet_loss) + update_loss(input->dma); + if (input->dma->packet_loss > 1) dev_warn(input->port->dev->dev, "%u packets lost due to low DMA performance!\n", input->dma->packet_loss); @@ -2333,16 +2334,7 @@ static void input_tasklet(unsigned long data) } dma->stat = ddbreadl(dev, DMA_BUFFER_CURRENT(dma)); dma->ctrl = ddbreadl(dev, DMA_BUFFER_CONTROL(dma)); - - { - u32 packet_loss = dma->packet_loss; - u32 cur_counter = ddbreadl(dev, TS_STAT(input)) & 0xffff; - - if (cur_counter < (packet_loss & 0xffff)) - packet_loss += 0x10000; - packet_loss = ((packet_loss & 0xffff0000) | cur_counter); - dma->packet_loss = packet_loss; - } + update_loss(dma); if (4 & dma->ctrl) dma->stall_count++; if (input->redi) From c6ada48892fe06bf1526ebb06cab17275a3c265a Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:27:42 +0100 Subject: [PATCH 16/19] remove check for MCI base --- ddbridge/ddbridge-core.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 8b8962b..cc16984 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -3457,8 +3457,6 @@ static long ddb_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (msg.link > 3) return -EFAULT; link = &dev->link[msg.link]; - if (!link->mci_base) - return -EFAULT; res = ddb_mci_cmd_link(link, &msg.cmd, &msg.res); if (copy_to_user(parg, &msg, sizeof(msg))) return -EFAULT; From abb2c56ddc2c414bacae44c88e3d55f9415ddcc7 Mon Sep 17 00:00:00 2001 From: none Date: Wed, 24 Feb 2021 20:30:45 +0100 Subject: [PATCH 17/19] output overflow as warning --- ddbridge/ddbridge-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index cc16984..4eb0784 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -2290,7 +2290,7 @@ static void input_write_dvb(struct ddb_input *input, } while (dma->cbuf != ((dma->stat >> 11) & 0x1f) || (4 & dma->ctrl)) { if (4 & dma->ctrl) { - /*dev_err(dev->dev, "Overflow dma %d\n", dma->nr);*/ + dev_warn(dev->dev, "Overflow dma input %u\n", input->nr); ack = 1; } if (alt_dma) From 28e09191af8229eb41d1bb700c3d7fca82b54f75 Mon Sep 17 00:00:00 2001 From: none Date: Thu, 25 Feb 2021 14:57:33 +0100 Subject: [PATCH 18/19] Do not attach dummy with dvb attach. --- ddbridge/ddbridge-core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 4eb0784..19830ad 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -1081,7 +1081,11 @@ static int demod_attach_dummy(struct ddb_input *input) { struct ddb_dvb *dvb = &input->port->dvb[input->nr & 1]; +#if 0 dvb->fe = dvb_attach(dummy_attach); +#else + dvb->fe = dummy_attach(); +#endif return 0; } From 01ca1b8805e7fef999dde7133923948f0d5c05be Mon Sep 17 00:00:00 2001 From: none Date: Thu, 25 Feb 2021 14:58:42 +0100 Subject: [PATCH 19/19] Detect and report TS misalignment and switch to unaligned processing. --- ddbridge/ddbridge-core.c | 25 ++++++++++++++++++++----- ddbridge/ddbridge.h | 1 + 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 19830ad..40f7cbc 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -2300,15 +2300,30 @@ static void input_write_dvb(struct ddb_input *input, if (alt_dma) dma_sync_single_for_cpu(dev->dev, dma2->pbuf[dma->cbuf], dma2->size, DMA_FROM_DEVICE); - if (raw_stream || input->con) + if (raw_stream || input->con) { dvb_dmx_swfilter_raw(&dvb->demux, dma2->vbuf[dma->cbuf], dma2->size); - else - dvb_dmx_swfilter_packets(&dvb->demux, + } else { + if (dma2->vbuf[dma->cbuf][0] != 0x47) { + if (!dma2->unaligned) { + dma2->unaligned++; + dev_warn(dev->dev, "Input %u dma buffer unaligned, " + "switching to unaligned processing.\n", + input->nr); + print_hex_dump(KERN_INFO, "TS: ", DUMP_PREFIX_OFFSET, 32, 1, + dma2->vbuf[dma->cbuf], + 256, false); + } + dvb_dmx_swfilter(&dvb->demux, dma2->vbuf[dma->cbuf], - dma2->size / 188); - + dma2->size); + } else + dvb_dmx_swfilter_packets(&dvb->demux, + dma2->vbuf[dma->cbuf], + dma2->size / 188); + } + dma->cbuf = (dma->cbuf + 1) % dma2->num; if (ack) ddbwritel(dev, (dma->cbuf << 11), diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 62afb27..7002590 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -219,6 +219,7 @@ struct ddb_dma { u32 stall_count; u32 packet_loss; + u32 unaligned; }; struct ddb_dvb {