[media] DM04/QQBOX Frontend attach change

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>
This commit is contained in:
Malcolm Priestley 2010-12-07 19:49:24 -03:00 committed by Mauro Carvalho Chehab
parent c59a9bfabf
commit 75aecc3af2
1 changed files with 88 additions and 49 deletions

View File

@ -584,6 +584,7 @@ static int lme2510_int_service(struct dvb_usb_adapter *adap)
ret = lme2510_int_read(adap); ret = lme2510_int_read(adap);
if (ret < 0) { if (ret < 0) {
rc_unregister_device(rc); rc_unregister_device(rc);
info("INT Unable to start Interupt Service");
return -ENODEV; return -ENODEV;
} }
@ -674,7 +675,7 @@ static void lme_coldreset(struct usb_device *dev)
return; 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; const struct firmware *fw = NULL;
char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; 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; cold = (cold > 0) ? (cold & 1) : 0;
if (udev->descriptor.idProduct == 0x1122) if (udev->descriptor.idProduct == 0x1122)
return; return 0;
switch (dvb_usb_lme2510_firmware) { switch (dvb_usb_lme2510_firmware) {
case 0: case 0:
@ -715,10 +716,12 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
release_firmware(fw); release_firmware(fw);
if (cold) if (cold) {
lme_coldreset(udev); lme_coldreset(udev);
return -ENODEV;
}
return; return ret;
} }
static int lme2510_kill_urb(struct usb_data_stream *stream) 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; 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) static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
{ {
int ret = 0;
struct lme2510_state *st = adap->dev->priv; struct lme2510_state *st = adap->dev->priv;
/* Interupt Start */ int ret = 0;
ret = lme2510_int_service(adap);
if (ret < 0) {
info("INT Unable to start Interupt Service");
return -ENODEV;
}
st->i2c_talk_onoff = 1; st->i2c_talk_onoff = 1;
st->i2c_gate = 4;
st->i2c_gate = 4;
adap->fe = dvb_attach(tda10086_attach, &tda10086_config, adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
&adap->dev->i2c_adap); &adap->dev->i2c_adap);
if (adap->fe) { if (adap->fe) {
info("TUN Found Frontend TDA10086"); 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_w = 4;
st->i2c_tuner_gate_r = 4; st->i2c_tuner_gate_r = 4;
st->i2c_tuner_addr = 0xc0; st->i2c_tuner_addr = 0xc0;
if (dvb_attach(tda826x_attach, adap->fe, 0xc0, st->tuner_config = TUNER_LG;
&adap->dev->i2c_adap, 1)) { if (dvb_usb_lme2510_firmware != 1) {
info("TUN TDA8263 Found"); dvb_usb_lme2510_firmware = 1;
st->tuner_config = TUNER_LG; ret = lme_firmware_switch(adap->dev->udev, 1);
if (dvb_usb_lme2510_firmware != 1) { } else /*stops LG/Sharp multi tuner problems*/
dvb_usb_lme2510_firmware = 1; dvb_usb_lme2510_firmware = 0;
lme_firmware_switch(adap->dev->udev, 1); goto end;
} else /*stops LG/Sharp multi tuner problems*/
dvb_usb_lme2510_firmware = 0;
return 0;
}
kfree(adap->fe);
adap->fe = NULL;
} }
st->i2c_gate = 5; st->i2c_gate = 5;
@ -833,28 +834,64 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
if (adap->fe) { if (adap->fe) {
info("FE Found Stv0288"); 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_w = 4;
st->i2c_tuner_gate_r = 5; st->i2c_tuner_gate_r = 5;
st->i2c_tuner_addr = 0xc0; st->i2c_tuner_addr = 0xc0;
if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, st->tuner_config = TUNER_S7395;
&adap->dev->i2c_adap)) { if (dvb_usb_lme2510_firmware != 0) {
st->tuner_config = TUNER_S7395; dvb_usb_lme2510_firmware = 0;
info("TUN Sharp IX2505V silicon tuner"); ret = lme_firmware_switch(adap->dev->udev, 1);
if (dvb_usb_lme2510_firmware != 0) {
dvb_usb_lme2510_firmware = 0;
lme_firmware_switch(adap->dev->udev, 1);
}
return 0;
} }
kfree(adap->fe); } else {
adap->fe = NULL; info("DM04 Not Supported");
return -ENODEV;
} }
info("DM04 Not Supported"); end: if (ret) {
return -ENODEV; kfree(adap->fe);
adap->fe = NULL;
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) 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, .streaming_ctrl = lme2510_streaming_ctrl,
.frontend_attach = dm04_lme2510_frontend_attach, .frontend_attach = dm04_lme2510_frontend_attach,
.tuner_attach = dm04_lme2510_tuner,
/* parameter for the MPEG2-data transfer */ /* parameter for the MPEG2-data transfer */
.stream = { .stream = {
.type = USB_BULK, .type = USB_BULK,
@ -957,7 +995,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
.generic_bulk_ctrl_endpoint = 0, .generic_bulk_ctrl_endpoint = 0,
.num_device_descs = 1, .num_device_descs = 1,
.devices = { .devices = {
{ "DM04 LME2510 DVB-S USB 2.0", { "DM04_LME2510_DVB-S",
{ &lme2510_table[0], NULL }, { &lme2510_table[0], NULL },
}, },
@ -975,6 +1013,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
{ {
.streaming_ctrl = lme2510_streaming_ctrl, .streaming_ctrl = lme2510_streaming_ctrl,
.frontend_attach = dm04_lme2510_frontend_attach, .frontend_attach = dm04_lme2510_frontend_attach,
.tuner_attach = dm04_lme2510_tuner,
/* parameter for the MPEG2-data transfer */ /* parameter for the MPEG2-data transfer */
.stream = { .stream = {
.type = USB_BULK, .type = USB_BULK,
@ -995,7 +1034,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
.generic_bulk_ctrl_endpoint = 0, .generic_bulk_ctrl_endpoint = 0,
.num_device_descs = 1, .num_device_descs = 1,
.devices = { .devices = {
{ "DM04 LME2510C USB2.0", { "DM04_LME2510C_DVB-S",
{ &lme2510_table[1], NULL }, { &lme2510_table[1], NULL },
}, },
} }
@ -1041,7 +1080,7 @@ void lme2510_exit(struct usb_interface *intf)
} }
static struct usb_driver lme2510_driver = { static struct usb_driver lme2510_driver = {
.name = "LME2510C_DVBS", .name = "LME2510C_DVB-S",
.probe = lme2510_probe, .probe = lme2510_probe,
.disconnect = lme2510_exit, .disconnect = lme2510_exit,
.id_table = lme2510_table, .id_table = lme2510_table,
@ -1069,6 +1108,6 @@ module_init(lme2510_module_init);
module_exit(lme2510_module_exit); module_exit(lme2510_module_exit);
MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0"); MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
MODULE_VERSION("1.71"); MODULE_VERSION("1.74");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");