[media] DM04/QQBOX Frontend attach change
authorMalcolm Priestley <tvboxspy@gmail.com>
Tue, 7 Dec 2010 22:49:24 +0000 (19:49 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 29 Dec 2010 10:17:03 +0000 (08:17 -0200)
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote:
> Em 27-11-2010 11:13, Malcolm Priestley escreveu:
> > Driver Version v1.73 - Frontend attach change.
> > To stop double rc registration in multi tuner environment or firmware change.
> >
> > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
> >
> >
> > +static int lme_name(struct dvb_usb_adapter *adap)
> > +{
> > + struct lme2510_state *st = adap->dev->priv;
> > + const char *desc = adap->dev->desc->name;
> > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
> > + char *name = adap->fe->ops.info.name;
> > +
> > + strcpy(name, desc);
> > + strcat(name, fe_name[st->tuner_config]);
>
> Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size.
>

Driver Version v1.74
Amended patch with change to strlcpy/strlcat.

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/dvb-usb/lmedm04.c

index 1455c23..9eea418 100644 (file)
@@ -584,6 +584,7 @@ static int lme2510_int_service(struct dvb_usb_adapter *adap)
        ret = lme2510_int_read(adap);
        if (ret < 0) {
                rc_unregister_device(rc);
+               info("INT Unable to start Interupt Service");
                return -ENODEV;
        }
 
@@ -674,7 +675,7 @@ static void lme_coldreset(struct usb_device *dev)
        return;
 }
 
-static void lme_firmware_switch(struct usb_device *udev, int cold)
+static int lme_firmware_switch(struct usb_device *udev, int cold)
 {
        const struct firmware *fw = NULL;
        char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw";
@@ -685,7 +686,7 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
        cold = (cold > 0) ? (cold & 1) : 0;
 
        if (udev->descriptor.idProduct == 0x1122)
-               return;
+               return 0;
 
        switch (dvb_usb_lme2510_firmware) {
        case 0:
@@ -715,10 +716,12 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
 
        release_firmware(fw);
 
-       if (cold)
+       if (cold) {
                lme_coldreset(udev);
+               return -ENODEV;
+       }
 
-       return;
+       return ret;
 }
 
 static int lme2510_kill_urb(struct usb_data_stream *stream)
@@ -786,45 +789,43 @@ static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
        return (ret < 0) ? -ENODEV : 0;
 }
 
+static int lme_name(struct dvb_usb_adapter *adap)
+{
+       struct lme2510_state *st = adap->dev->priv;
+       const char *desc = adap->dev->desc->name;
+       char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
+       char *name = adap->fe->ops.info.name;
+
+       strlcpy(name, desc, 128);
+       strlcat(name, fe_name[st->tuner_config], 128);
+
+       return 0;
+}
+
 static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
 {
-       int ret = 0;
        struct lme2510_state *st = adap->dev->priv;
 
-       /* Interupt Start  */
-       ret = lme2510_int_service(adap);
-       if (ret < 0) {
-               info("INT Unable to start Interupt Service");
-               return -ENODEV;
-       }
+       int ret = 0;
 
        st->i2c_talk_onoff = 1;
-       st->i2c_gate = 4;
 
+       st->i2c_gate = 4;
        adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
                &adap->dev->i2c_adap);
 
        if (adap->fe) {
                info("TUN Found Frontend TDA10086");
-               memcpy(&adap->fe->ops.info.name,
-                               &"DM04_LG_TDQY-P001F DVB-S", 24);
-               adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 4;
                st->i2c_tuner_addr = 0xc0;
-               if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
-                       &adap->dev->i2c_adap, 1)) {
-                       info("TUN TDA8263 Found");
-                       st->tuner_config = TUNER_LG;
-                       if (dvb_usb_lme2510_firmware != 1) {
-                               dvb_usb_lme2510_firmware = 1;
-                               lme_firmware_switch(adap->dev->udev, 1);
-                       } else /*stops LG/Sharp multi tuner problems*/
-                               dvb_usb_lme2510_firmware = 0;
-                       return 0;
-               }
-               kfree(adap->fe);
-               adap->fe = NULL;
+               st->tuner_config = TUNER_LG;
+               if (dvb_usb_lme2510_firmware != 1) {
+                       dvb_usb_lme2510_firmware = 1;
+                       ret = lme_firmware_switch(adap->dev->udev, 1);
+               } else /*stops LG/Sharp multi tuner problems*/
+                       dvb_usb_lme2510_firmware = 0;
+               goto end;
        }
 
        st->i2c_gate = 5;
@@ -833,28 +834,64 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
 
        if (adap->fe) {
                info("FE Found Stv0288");
-               memcpy(&adap->fe->ops.info.name,
-                               &"DM04_SHARP:BS2F7HZ7395", 22);
-               adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
                st->i2c_tuner_gate_w = 4;
                st->i2c_tuner_gate_r = 5;
                st->i2c_tuner_addr = 0xc0;
-               if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
-                                       &adap->dev->i2c_adap)) {
-                       st->tuner_config = TUNER_S7395;
-                       info("TUN Sharp IX2505V silicon tuner");
-                       if (dvb_usb_lme2510_firmware != 0) {
-                               dvb_usb_lme2510_firmware = 0;
-                               lme_firmware_switch(adap->dev->udev, 1);
-                       }
-                       return 0;
+               st->tuner_config = TUNER_S7395;
+               if (dvb_usb_lme2510_firmware != 0) {
+                       dvb_usb_lme2510_firmware = 0;
+                       ret = lme_firmware_switch(adap->dev->udev, 1);
                }
+       } else {
+               info("DM04 Not Supported");
+               return -ENODEV;
+       }
+
+end:   if (ret) {
                kfree(adap->fe);
                adap->fe = NULL;
+               return -ENODEV;
        }
 
-       info("DM04 Not Supported");
-       return -ENODEV;
+       adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
+       ret = lme_name(adap);
+
+       return ret;
+}
+
+static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
+{
+       struct lme2510_state *st = adap->dev->priv;
+       char *tun_msg[] = {"", "TDA8263", "IX2505V"};
+       int ret = 0;
+
+       switch (st->tuner_config) {
+       case TUNER_LG:
+               if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
+                       &adap->dev->i2c_adap, 1))
+                       ret = st->tuner_config;
+               break;
+       case TUNER_S7395:
+               if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
+                       &adap->dev->i2c_adap))
+                       ret = st->tuner_config;
+               break;
+       default:
+               break;
+       }
+
+       if (ret)
+               info("TUN Found %s tuner", tun_msg[ret]);
+       else {
+               info("TUN No tuner found --- reseting device");
+               lme_coldreset(adap->dev->udev);
+               return -ENODEV;
+       }
+
+       /* Start the Interupt & Remote*/
+       ret = lme2510_int_service(adap);
+
+       return ret;
 }
 
 static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
@@ -937,6 +974,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
                {
                        .streaming_ctrl   = lme2510_streaming_ctrl,
                        .frontend_attach  = dm04_lme2510_frontend_attach,
+                       .tuner_attach = dm04_lme2510_tuner,
                        /* parameter for the MPEG2-data transfer */
                        .stream = {
                                .type = USB_BULK,
@@ -957,7 +995,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
        .generic_bulk_ctrl_endpoint = 0,
        .num_device_descs = 1,
        .devices = {
-               {   "DM04 LME2510 DVB-S USB 2.0",
+               {   "DM04_LME2510_DVB-S",
                        { &lme2510_table[0], NULL },
                        },
 
@@ -975,6 +1013,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
                {
                        .streaming_ctrl   = lme2510_streaming_ctrl,
                        .frontend_attach  = dm04_lme2510_frontend_attach,
+                       .tuner_attach = dm04_lme2510_tuner,
                        /* parameter for the MPEG2-data transfer */
                        .stream = {
                                .type = USB_BULK,
@@ -995,7 +1034,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
        .generic_bulk_ctrl_endpoint = 0,
        .num_device_descs = 1,
        .devices = {
-               {   "DM04 LME2510C USB2.0",
+               {   "DM04_LME2510C_DVB-S",
                        { &lme2510_table[1], NULL },
                        },
        }
@@ -1041,7 +1080,7 @@ void lme2510_exit(struct usb_interface *intf)
 }
 
 static struct usb_driver lme2510_driver = {
-       .name           = "LME2510C_DVBS",
+       .name           = "LME2510C_DVB-S",
        .probe          = lme2510_probe,
        .disconnect     = lme2510_exit,
        .id_table       = lme2510_table,
@@ -1069,6 +1108,6 @@ module_init(lme2510_module_init);
 module_exit(lme2510_module_exit);
 
 MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
-MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0");
-MODULE_VERSION("1.71");
+MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
+MODULE_VERSION("1.74");
 MODULE_LICENSE("GPL");