Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6cab35a9 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "media/dvb-core: Migrate mpq demux driver from kernel 4.14 to 4.19"

parents 06f2d9b5 149c9346
Loading
Loading
Loading
Loading
+4043 −373

File changed.

Preview size limit exceeded, changes collapsed.

+2551 −396

File changed.

Preview size limit exceeded, changes collapsed.

+3 −2
Original line number Diff line number Diff line
@@ -1083,7 +1083,7 @@ static int dvb_net_feed_start(struct net_device *dev)
			goto error;
		}

		ret = priv->secfeed->set(priv->secfeed, priv->pid, 1);
		ret = priv->secfeed->set(priv->secfeed, priv->pid, 32768, 1);

		if (ret<0) {
			pr_err("%s: could not set section feed\n", dev->name);
@@ -1121,7 +1121,7 @@ static int dvb_net_feed_start(struct net_device *dev)
		netdev_dbg(dev, "start filtering\n");
		priv->secfeed->start_filtering(priv->secfeed);
	} else if (priv->feedtype == DVB_NET_FEEDTYPE_ULE) {
		ktime_t timeout = ns_to_ktime(10 * NSEC_PER_MSEC);
		ktime_t timeout = ktime_set(0, 10*NSEC_PER_MSEC); // 10 msec

		/* we have payloads encapsulated in TS */
		netdev_dbg(dev, "alloc tsfeed\n");
@@ -1137,6 +1137,7 @@ static int dvb_net_feed_start(struct net_device *dev)
					priv->pid, /* pid */
					TS_PACKET, /* type */
					DMX_PES_OTHER, /* pes type */
					32768,     /* circular buffer size */
					timeout    /* timeout */
					);

+56 −11
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@

#define PKT_READY 0
#define PKT_DISPOSED 1
#define PKT_PENDING 2



void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
@@ -207,16 +209,17 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t
ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf,
				  const u8 __user *buf, size_t len)
{
	int status;
	size_t todo = len;
	size_t split;
	ssize_t oldpwrite = rbuf->pwrite;

	split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
	split = (rbuf->pwrite + len > rbuf->size) ?
			rbuf->size - rbuf->pwrite :
			0;

	if (split > 0) {
		status = copy_from_user(rbuf->data+rbuf->pwrite, buf, split);
		if (status)
			return len - todo;
		if (copy_from_user(rbuf->data + rbuf->pwrite, buf, split))
			return -EFAULT;
		buf += split;
		todo -= split;
		/* smp_store_release() for write pointer update to ensure that
@@ -226,9 +229,12 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf,
		 */
		smp_store_release(&rbuf->pwrite, 0);
	}
	status = copy_from_user(rbuf->data+rbuf->pwrite, buf, todo);
	if (status)
		return len - todo;

	if (copy_from_user(rbuf->data + rbuf->pwrite, buf, todo)) {
		/* smp_store_release() for write pointer update */
		smp_store_release(&rbuf->pwrite, oldpwrite);
		return -EFAULT;
	}
	/* smp_store_release() for write pointer update, see above */
	smp_store_release(&rbuf->pwrite, (rbuf->pwrite + todo) % rbuf->size);

@@ -249,6 +255,31 @@ ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf, size_t le
	return status;
}

ssize_t dvb_ringbuffer_pkt_start(struct dvb_ringbuffer *rbuf, size_t len)
{
	ssize_t oldpwrite = rbuf->pwrite;

	DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8);
	DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff);
	DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_PENDING);

	return oldpwrite;
}
EXPORT_SYMBOL(dvb_ringbuffer_pkt_start);

int dvb_ringbuffer_pkt_close(struct dvb_ringbuffer *rbuf, ssize_t idx)
{
	idx = (idx + 2) % rbuf->size;

	if (rbuf->data[idx] != PKT_PENDING)
		return -EINVAL;

	rbuf->data[idx] = PKT_READY;

	return 0;
}
EXPORT_SYMBOL(dvb_ringbuffer_pkt_close);

ssize_t dvb_ringbuffer_pkt_read_user(struct dvb_ringbuffer *rbuf, size_t idx,
				int offset, u8 __user *buf, size_t len)
{
@@ -256,6 +287,9 @@ ssize_t dvb_ringbuffer_pkt_read_user(struct dvb_ringbuffer *rbuf, size_t idx,
	size_t split;
	size_t pktlen;

	if (DVB_RINGBUFFER_PEEK(rbuf, (idx+2)) != PKT_READY)
		return -EINVAL;

	pktlen = rbuf->data[idx] << 8;
	pktlen |= rbuf->data[(idx + 1) % rbuf->size];
	if (offset > pktlen) return -EINVAL;
@@ -276,6 +310,7 @@ ssize_t dvb_ringbuffer_pkt_read_user(struct dvb_ringbuffer *rbuf, size_t idx,

	return len;
}
EXPORT_SYMBOL(dvb_ringbuffer_pkt_read_user);

ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
				int offset, u8* buf, size_t len)
@@ -284,6 +319,9 @@ ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
	size_t split;
	size_t pktlen;

	if (rbuf->data[(idx + 2) % rbuf->size] != PKT_READY)
		return -EINVAL;

	pktlen = rbuf->data[idx] << 8;
	pktlen |= rbuf->data[(idx + 1) % rbuf->size];
	if (offset > pktlen) return -EINVAL;
@@ -301,6 +339,7 @@ ssize_t dvb_ringbuffer_pkt_read(struct dvb_ringbuffer *rbuf, size_t idx,
	memcpy(buf, rbuf->data+idx, todo);
	return len;
}
EXPORT_SYMBOL(dvb_ringbuffer_pkt_read);

void dvb_ringbuffer_pkt_dispose(struct dvb_ringbuffer *rbuf, size_t idx)
{
@@ -320,6 +359,7 @@ void dvb_ringbuffer_pkt_dispose(struct dvb_ringbuffer *rbuf, size_t idx)
		}
	}
}
EXPORT_SYMBOL(dvb_ringbuffer_pkt_dispose);

ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t* pktlen)
{
@@ -335,7 +375,10 @@ ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t*
		idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
	}

	consumed = (idx - rbuf->pread) % rbuf->size;
	if (idx >= rbuf->pread)
		consumed = idx - rbuf->pread;
	else
		consumed = rbuf->size - (rbuf->pread - idx);

	while((dvb_ringbuffer_avail(rbuf) - consumed) > DVB_RINGBUFFER_PKTHDRSIZE) {

@@ -348,6 +391,9 @@ ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t*
			return idx;
		}

		if (curpktstatus == PKT_PENDING)
			return -EFAULT;

		consumed += curpktlen + DVB_RINGBUFFER_PKTHDRSIZE;
		idx = (idx + curpktlen + DVB_RINGBUFFER_PKTHDRSIZE) % rbuf->size;
	}
@@ -355,8 +401,7 @@ ssize_t dvb_ringbuffer_pkt_next(struct dvb_ringbuffer *rbuf, size_t idx, size_t*
	// no packets available
	return -1;
}


EXPORT_SYMBOL(dvb_ringbuffer_pkt_next);

EXPORT_SYMBOL(dvb_ringbuffer_init);
EXPORT_SYMBOL(dvb_ringbuffer_empty);
+2 −2
Original line number Diff line number Diff line
@@ -907,7 +907,7 @@ static void xc5000_config_tv(struct dvb_frontend *fe,
static int xc5000_set_tv_freq(struct dvb_frontend *fe)
{
	struct xc5000_priv *priv = fe->tuner_priv;
	u16 pll_lock_status;
	u16 pll_lock_status = 0;
	int ret;

tune_channel:
@@ -1112,7 +1112,7 @@ static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe, int force)
	const struct xc5000_fw_cfg *desired_fw = xc5000_assign_firmware(priv->chip_id);
	const struct firmware *fw;
	int ret, i;
	u16 pll_lock_status;
	u16 pll_lock_status = 0;
	u16 fw_ck;

	cancel_delayed_work(&priv->timer_sleep);
Loading