//     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) {
        }
        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;
 
        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__);
 
                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);