firesat: fix DVB-S2 device recognition
authorBen Backx <ben@bbackx.com>
Sun, 22 Jun 2008 14:00:53 +0000 (16:00 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Tue, 24 Feb 2009 13:51:25 +0000 (14:51 +0100)
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: Ben Backx <ben@bbackx.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/media/dvb/firesat/avc_api.c
drivers/media/dvb/firesat/firesat.h
drivers/media/dvb/firesat/firesat_1394.c

index d70795623fb9d645e1ccabe610b304e96bfacf35..0ad6420e342f6419be4781d041013e258755293d 100644 (file)
@@ -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;
index f852a1ac7740c630b610e92ba5a51a9b372f8158..d1e2ce37063e1f1487a3284134a11b92b7097cc7 100644 (file)
@@ -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 {
index c7ccf633c24b08ce2751fafd94faf08bb1c491c0..dcac70a2991ef58805f04b97c4f90b5a84a13479 100644 (file)
@@ -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);