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

Commit f1bbb43a authored by Ben Backx's avatar Ben Backx Committed by Stefan Richter
Browse files

firesat: fix DVB-S2 device recognition



This only makes sure that a DVB-S2 device is really recognized as a S2,
nothing else is added yet. It's using the string containing the model
that is stored in the configuration ROM, the older version was using
some hardware revision dependent part of the ROM.

Signed-off-by: default avatarBen Backx <ben@bbackx.com>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent c81c8b68
Loading
Loading
Loading
Loading
+1 −16
Original line number Diff line number Diff line
@@ -251,7 +251,7 @@ int AVCTuner_DSD(struct firesat *firesat, struct dvb_frontend_parameters *params

//	printk(KERN_INFO "%s\n", __func__);

	if(firesat->type == FireSAT_DVB_S)
	if (firesat->type == FireSAT_DVB_S || firesat->type == FireSAT_DVB_S2)
		AVCTuner_tuneQPSK(firesat, params, &CmdFrm);
	else {
		if(firesat->type == FireSAT_DVB_T) {
@@ -654,21 +654,6 @@ int AVCIdentifySubunit(struct firesat *firesat, unsigned char *systemId, int *tr
	}
	if(systemId)
		*systemId = RspFrm.operand[7];
	if(transport)
		*transport = RspFrm.operand[14] & 0x7;
	switch(RspFrm.operand[14] & 0x7) {
		case 1:
			printk(KERN_INFO "%s: found DVB/S\n",__func__);
			break;
		case 2:
			printk(KERN_INFO "%s: found DVB/C\n",__func__);
			break;
		case 3:
			printk(KERN_INFO "%s: found DVB/T\n",__func__);
			break;
		default:
			printk(KERN_INFO "%s: found unknown tuner id %u\n",__func__,RspFrm.operand[14] & 0x7);
	}
	if(has_ci)
		*has_ci = (RspFrm.operand[14] >> 4) & 0x1;
	return 0;
+2 −1
Original line number Diff line number Diff line
@@ -13,7 +13,8 @@
enum model_type {
    FireSAT_DVB_S = 1,
    FireSAT_DVB_C = 2,
    FireSAT_DVB_T = 3
    FireSAT_DVB_T = 3,
    FireSAT_DVB_S2 = 4
};

struct firesat {
+28 −0
Original line number Diff line number Diff line
@@ -263,6 +263,8 @@ static int firesat_probe(struct device *dev)
	int result;
	unsigned char subunitcount = 0xff, subunit;
	struct firesat **firesats = kmalloc(sizeof (void*) * 2,GFP_KERNEL);
	int kv_len;
	char *kv_buf;

	if (!firesats) {
		printk("%s: couldn't allocate memory.\n", __func__);
@@ -329,6 +331,32 @@ static int firesat_probe(struct device *dev)

		firesat->subunit = subunit;

		/* Reading device model from ROM */
		kv_len = (ud->model_name_kv->value.leaf.len - 2) *
			sizeof(quadlet_t);
		kv_buf = kmalloc((sizeof(quadlet_t) * kv_len), GFP_KERNEL);
		memcpy(kv_buf,
			CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv),
			kv_len);
		while ((kv_buf + kv_len - 1) == '\0') kv_len--;
		kv_buf[kv_len++] = '\0';

		/* Determining the device model */
		if (strcmp(kv_buf, "FireDTV S/CI") == 0) {
			printk(KERN_INFO "%s: found DVB/S\n", __func__);
			firesat->type = 1;
		} else if (strcmp(kv_buf, "FireDTV C/CI") == 0) {
			printk(KERN_INFO "%s: found DVB/C\n", __func__);
			firesat->type = 2;
		} else if (strcmp(kv_buf, "FireDTV T/CI") == 0) {
			printk(KERN_INFO "%s: found DVB/T\n", __func__);
			firesat->type = 3;
		} else if (strcmp(kv_buf, "FireDTV S2  ") == 0) {
			printk(KERN_INFO "%s: found DVB/S2\n", __func__);
			firesat->type = 4;
		}
		kfree(kv_buf);

		if (AVCIdentifySubunit(firesat, NULL, (int*)&firesat->type, &firesat->has_ci)) {
			printk("%s: cannot identify subunit %d\n", __func__, subunit);
			spin_lock_irqsave(&firesat_list_lock, flags);