diff options
author | Malcolm Priestley <tvboxspy@gmail.com> | 2010-12-07 17:49:24 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-12-29 05:17:03 -0500 |
commit | 75aecc3af22ae9063c96457d530f281a1e2d3276 (patch) | |
tree | d66903b3ecbf4e5012e28da59d5bfd61771dd6ea | |
parent | c59a9bfabfc2a6359f046652c6bfa0a82fb17a05 (diff) |
[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>
-rw-r--r-- | drivers/media/dvb/dvb-usb/lmedm04.c | 133 |
1 files changed, 86 insertions, 47 deletions
diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c index 1455c238b01b..9eea4188303b 100644 --- a/drivers/media/dvb/dvb-usb/lmedm04.c +++ b/drivers/media/dvb/dvb-usb/lmedm04.c | |||
@@ -584,6 +584,7 @@ static int lme2510_int_service(struct dvb_usb_adapter *adap) | |||
584 | ret = lme2510_int_read(adap); | 584 | ret = lme2510_int_read(adap); |
585 | if (ret < 0) { | 585 | if (ret < 0) { |
586 | rc_unregister_device(rc); | 586 | rc_unregister_device(rc); |
587 | info("INT Unable to start Interupt Service"); | ||
587 | return -ENODEV; | 588 | return -ENODEV; |
588 | } | 589 | } |
589 | 590 | ||
@@ -674,7 +675,7 @@ static void lme_coldreset(struct usb_device *dev) | |||
674 | return; | 675 | return; |
675 | } | 676 | } |
676 | 677 | ||
677 | static void lme_firmware_switch(struct usb_device *udev, int cold) | 678 | static int lme_firmware_switch(struct usb_device *udev, int cold) |
678 | { | 679 | { |
679 | const struct firmware *fw = NULL; | 680 | const struct firmware *fw = NULL; |
680 | char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; | 681 | char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; |
@@ -685,7 +686,7 @@ static void lme_firmware_switch(struct usb_device *udev, int cold) | |||
685 | cold = (cold > 0) ? (cold & 1) : 0; | 686 | cold = (cold > 0) ? (cold & 1) : 0; |
686 | 687 | ||
687 | if (udev->descriptor.idProduct == 0x1122) | 688 | if (udev->descriptor.idProduct == 0x1122) |
688 | return; | 689 | return 0; |
689 | 690 | ||
690 | switch (dvb_usb_lme2510_firmware) { | 691 | switch (dvb_usb_lme2510_firmware) { |
691 | case 0: | 692 | case 0: |
@@ -715,10 +716,12 @@ static void lme_firmware_switch(struct usb_device *udev, int cold) | |||
715 | 716 | ||
716 | release_firmware(fw); | 717 | release_firmware(fw); |
717 | 718 | ||
718 | if (cold) | 719 | if (cold) { |
719 | lme_coldreset(udev); | 720 | lme_coldreset(udev); |
721 | return -ENODEV; | ||
722 | } | ||
720 | 723 | ||
721 | return; | 724 | return ret; |
722 | } | 725 | } |
723 | 726 | ||
724 | static int lme2510_kill_urb(struct usb_data_stream *stream) | 727 | static int lme2510_kill_urb(struct usb_data_stream *stream) |
@@ -786,45 +789,43 @@ static int dm04_lme2510_set_voltage(struct dvb_frontend *fe, | |||
786 | return (ret < 0) ? -ENODEV : 0; | 789 | return (ret < 0) ? -ENODEV : 0; |
787 | } | 790 | } |
788 | 791 | ||
792 | static int lme_name(struct dvb_usb_adapter *adap) | ||
793 | { | ||
794 | struct lme2510_state *st = adap->dev->priv; | ||
795 | const char *desc = adap->dev->desc->name; | ||
796 | char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"}; | ||
797 | char *name = adap->fe->ops.info.name; | ||
798 | |||
799 | strlcpy(name, desc, 128); | ||
800 | strlcat(name, fe_name[st->tuner_config], 128); | ||
801 | |||
802 | return 0; | ||
803 | } | ||
804 | |||
789 | static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) | 805 | static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) |
790 | { | 806 | { |
791 | int ret = 0; | ||
792 | struct lme2510_state *st = adap->dev->priv; | 807 | struct lme2510_state *st = adap->dev->priv; |
793 | 808 | ||
794 | /* Interupt Start */ | 809 | int ret = 0; |
795 | ret = lme2510_int_service(adap); | ||
796 | if (ret < 0) { | ||
797 | info("INT Unable to start Interupt Service"); | ||
798 | return -ENODEV; | ||
799 | } | ||
800 | 810 | ||
801 | st->i2c_talk_onoff = 1; | 811 | st->i2c_talk_onoff = 1; |
802 | st->i2c_gate = 4; | ||
803 | 812 | ||
813 | st->i2c_gate = 4; | ||
804 | adap->fe = dvb_attach(tda10086_attach, &tda10086_config, | 814 | adap->fe = dvb_attach(tda10086_attach, &tda10086_config, |
805 | &adap->dev->i2c_adap); | 815 | &adap->dev->i2c_adap); |
806 | 816 | ||
807 | if (adap->fe) { | 817 | if (adap->fe) { |
808 | info("TUN Found Frontend TDA10086"); | 818 | info("TUN Found Frontend TDA10086"); |
809 | memcpy(&adap->fe->ops.info.name, | ||
810 | &"DM04_LG_TDQY-P001F DVB-S", 24); | ||
811 | adap->fe->ops.set_voltage = dm04_lme2510_set_voltage; | ||
812 | st->i2c_tuner_gate_w = 4; | 819 | st->i2c_tuner_gate_w = 4; |
813 | st->i2c_tuner_gate_r = 4; | 820 | st->i2c_tuner_gate_r = 4; |
814 | st->i2c_tuner_addr = 0xc0; | 821 | st->i2c_tuner_addr = 0xc0; |
815 | if (dvb_attach(tda826x_attach, adap->fe, 0xc0, | 822 | st->tuner_config = TUNER_LG; |
816 | &adap->dev->i2c_adap, 1)) { | 823 | if (dvb_usb_lme2510_firmware != 1) { |
817 | info("TUN TDA8263 Found"); | 824 | dvb_usb_lme2510_firmware = 1; |
818 | st->tuner_config = TUNER_LG; | 825 | ret = lme_firmware_switch(adap->dev->udev, 1); |
819 | if (dvb_usb_lme2510_firmware != 1) { | 826 | } else /*stops LG/Sharp multi tuner problems*/ |
820 | dvb_usb_lme2510_firmware = 1; | 827 | dvb_usb_lme2510_firmware = 0; |
821 | lme_firmware_switch(adap->dev->udev, 1); | 828 | goto end; |
822 | } else /*stops LG/Sharp multi tuner problems*/ | ||
823 | dvb_usb_lme2510_firmware = 0; | ||
824 | return 0; | ||
825 | } | ||
826 | kfree(adap->fe); | ||
827 | adap->fe = NULL; | ||
828 | } | 829 | } |
829 | 830 | ||
830 | st->i2c_gate = 5; | 831 | st->i2c_gate = 5; |
@@ -833,28 +834,64 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) | |||
833 | 834 | ||
834 | if (adap->fe) { | 835 | if (adap->fe) { |
835 | info("FE Found Stv0288"); | 836 | info("FE Found Stv0288"); |
836 | memcpy(&adap->fe->ops.info.name, | ||
837 | &"DM04_SHARP:BS2F7HZ7395", 22); | ||
838 | adap->fe->ops.set_voltage = dm04_lme2510_set_voltage; | ||
839 | st->i2c_tuner_gate_w = 4; | 837 | st->i2c_tuner_gate_w = 4; |
840 | st->i2c_tuner_gate_r = 5; | 838 | st->i2c_tuner_gate_r = 5; |
841 | st->i2c_tuner_addr = 0xc0; | 839 | st->i2c_tuner_addr = 0xc0; |
842 | if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, | 840 | st->tuner_config = TUNER_S7395; |
843 | &adap->dev->i2c_adap)) { | 841 | if (dvb_usb_lme2510_firmware != 0) { |
844 | st->tuner_config = TUNER_S7395; | 842 | dvb_usb_lme2510_firmware = 0; |
845 | info("TUN Sharp IX2505V silicon tuner"); | 843 | ret = lme_firmware_switch(adap->dev->udev, 1); |
846 | if (dvb_usb_lme2510_firmware != 0) { | ||
847 | dvb_usb_lme2510_firmware = 0; | ||
848 | lme_firmware_switch(adap->dev->udev, 1); | ||
849 | } | ||
850 | return 0; | ||
851 | } | 844 | } |
845 | } else { | ||
846 | info("DM04 Not Supported"); | ||
847 | return -ENODEV; | ||
848 | } | ||
849 | |||
850 | end: if (ret) { | ||
852 | kfree(adap->fe); | 851 | kfree(adap->fe); |
853 | adap->fe = NULL; | 852 | adap->fe = NULL; |
853 | return -ENODEV; | ||
854 | } | 854 | } |
855 | 855 | ||
856 | info("DM04 Not Supported"); | 856 | adap->fe->ops.set_voltage = dm04_lme2510_set_voltage; |
857 | return -ENODEV; | 857 | ret = lme_name(adap); |
858 | |||
859 | return ret; | ||
860 | } | ||
861 | |||
862 | static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap) | ||
863 | { | ||
864 | struct lme2510_state *st = adap->dev->priv; | ||
865 | char *tun_msg[] = {"", "TDA8263", "IX2505V"}; | ||
866 | int ret = 0; | ||
867 | |||
868 | switch (st->tuner_config) { | ||
869 | case TUNER_LG: | ||
870 | if (dvb_attach(tda826x_attach, adap->fe, 0xc0, | ||
871 | &adap->dev->i2c_adap, 1)) | ||
872 | ret = st->tuner_config; | ||
873 | break; | ||
874 | case TUNER_S7395: | ||
875 | if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, | ||
876 | &adap->dev->i2c_adap)) | ||
877 | ret = st->tuner_config; | ||
878 | break; | ||
879 | default: | ||
880 | break; | ||
881 | } | ||
882 | |||
883 | if (ret) | ||
884 | info("TUN Found %s tuner", tun_msg[ret]); | ||
885 | else { | ||
886 | info("TUN No tuner found --- reseting device"); | ||
887 | lme_coldreset(adap->dev->udev); | ||
888 | return -ENODEV; | ||
889 | } | ||
890 | |||
891 | /* Start the Interupt & Remote*/ | ||
892 | ret = lme2510_int_service(adap); | ||
893 | |||
894 | return ret; | ||
858 | } | 895 | } |
859 | 896 | ||
860 | static int lme2510_powerup(struct dvb_usb_device *d, int onoff) | 897 | static int lme2510_powerup(struct dvb_usb_device *d, int onoff) |
@@ -937,6 +974,7 @@ static struct dvb_usb_device_properties lme2510_properties = { | |||
937 | { | 974 | { |
938 | .streaming_ctrl = lme2510_streaming_ctrl, | 975 | .streaming_ctrl = lme2510_streaming_ctrl, |
939 | .frontend_attach = dm04_lme2510_frontend_attach, | 976 | .frontend_attach = dm04_lme2510_frontend_attach, |
977 | .tuner_attach = dm04_lme2510_tuner, | ||
940 | /* parameter for the MPEG2-data transfer */ | 978 | /* parameter for the MPEG2-data transfer */ |
941 | .stream = { | 979 | .stream = { |
942 | .type = USB_BULK, | 980 | .type = USB_BULK, |
@@ -957,7 +995,7 @@ static struct dvb_usb_device_properties lme2510_properties = { | |||
957 | .generic_bulk_ctrl_endpoint = 0, | 995 | .generic_bulk_ctrl_endpoint = 0, |
958 | .num_device_descs = 1, | 996 | .num_device_descs = 1, |
959 | .devices = { | 997 | .devices = { |
960 | { "DM04 LME2510 DVB-S USB 2.0", | 998 | { "DM04_LME2510_DVB-S", |
961 | { &lme2510_table[0], NULL }, | 999 | { &lme2510_table[0], NULL }, |
962 | }, | 1000 | }, |
963 | 1001 | ||
@@ -975,6 +1013,7 @@ static struct dvb_usb_device_properties lme2510c_properties = { | |||
975 | { | 1013 | { |
976 | .streaming_ctrl = lme2510_streaming_ctrl, | 1014 | .streaming_ctrl = lme2510_streaming_ctrl, |
977 | .frontend_attach = dm04_lme2510_frontend_attach, | 1015 | .frontend_attach = dm04_lme2510_frontend_attach, |
1016 | .tuner_attach = dm04_lme2510_tuner, | ||
978 | /* parameter for the MPEG2-data transfer */ | 1017 | /* parameter for the MPEG2-data transfer */ |
979 | .stream = { | 1018 | .stream = { |
980 | .type = USB_BULK, | 1019 | .type = USB_BULK, |
@@ -995,7 +1034,7 @@ static struct dvb_usb_device_properties lme2510c_properties = { | |||
995 | .generic_bulk_ctrl_endpoint = 0, | 1034 | .generic_bulk_ctrl_endpoint = 0, |
996 | .num_device_descs = 1, | 1035 | .num_device_descs = 1, |
997 | .devices = { | 1036 | .devices = { |
998 | { "DM04 LME2510C USB2.0", | 1037 | { "DM04_LME2510C_DVB-S", |
999 | { &lme2510_table[1], NULL }, | 1038 | { &lme2510_table[1], NULL }, |
1000 | }, | 1039 | }, |
1001 | } | 1040 | } |
@@ -1041,7 +1080,7 @@ void lme2510_exit(struct usb_interface *intf) | |||
1041 | } | 1080 | } |
1042 | 1081 | ||
1043 | static struct usb_driver lme2510_driver = { | 1082 | static struct usb_driver lme2510_driver = { |
1044 | .name = "LME2510C_DVBS", | 1083 | .name = "LME2510C_DVB-S", |
1045 | .probe = lme2510_probe, | 1084 | .probe = lme2510_probe, |
1046 | .disconnect = lme2510_exit, | 1085 | .disconnect = lme2510_exit, |
1047 | .id_table = lme2510_table, | 1086 | .id_table = lme2510_table, |
@@ -1069,6 +1108,6 @@ module_init(lme2510_module_init); | |||
1069 | module_exit(lme2510_module_exit); | 1108 | module_exit(lme2510_module_exit); |
1070 | 1109 | ||
1071 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); | 1110 | MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); |
1072 | MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0"); | 1111 | MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0"); |
1073 | MODULE_VERSION("1.71"); | 1112 | MODULE_VERSION("1.74"); |
1074 | MODULE_LICENSE("GPL"); | 1113 | MODULE_LICENSE("GPL"); |