[0/3] Support for AF9035/AF9033

Message ID 4F466BEF.9050204@gmail.com (mailing list archive)
State Superseded, archived
Headers

Commit Message

Gianluca Gennari Feb. 23, 2012, 4:40 p.m. UTC
  Il 22/02/2012 23:20, Hans-Frieder Vogt ha scritto:
> I have written a driver for the AF9035 & AF9033 (called af903x), based on the 
> various drivers and information floating around for these chips.
> Currently, my driver only supports the devices that I am able to test. These 
> are
> - Terratec T5 Ver.2 (also known as T6)
> - Avermedia Volar HD Nano (A867)
> 
> The driver supports:
> - diversity and dual tuner (when the first frontend is used, it is in diversity 
> mode, when two frontends are used in dual tuner mode)
> - multiple devices
> - pid filtering
> - remote control in NEC and RC-6 mode (currently not switchable, but depending 
> on device)
> - support for kernel 3.1, 3.2 and 3.3 series
> 
> I have not tried to split the driver in a DVB-T receiver (af9035) and a 
> frontend (af9033), because I do not see the sense in doing that for a 
> demodulator, that seems to be always used in combination with the very same 
> receiver.
> 
> The patch is split in three parts:
> Patch 1: support for tuner fitipower FC0012
> Patch 2: basic driver
> Patch 3: firmware
> 
> Hans-Frieder Vogt                       e-mail: hfvogt <at> gmx .dot. net

Hi Hans,
thank you for the new af903x driver.
A few comments:

1) I think you should set up a git repository with your driver and then
send a PULL request to the list; as it is, the first patch is affected
by line-wrapping problems so it must be manually edited to be
applicable, and the second patch is compressed so it will be ignored by
patchwork.

2) There are a couple of small errors in the patches (see my attached
patches): in the dvb-usb Makefile,  DVB_USB_AF903X must be replaced by
CONFIG_DVB_USB_AF903X otherwise the driver will not compile; also, in
the dvb_frontend_ops struct, the field info.type should be removed for
kernels >= 3.3.0.

3) The USB VID/PID IDs should be moved into dvb-usb-ids.h (see patch 3);
I also added a few IDs from the Avermedia A867 driver*. As your driver
supports both AF9007 and mxl5007t tuners I think this is safe.

*http://www.avermedia.com/Support/DownloadCount.aspx?FDFId=4591

4) the driver also looks for a firmware file called "af35irtbl.bin" that
comes from the "official" ITEtech driver (if it's not present the driver
works anyway, but it prints an error message);

I tested the driver with an Avermedia A867 stick (it's an OEM stick also
known as the Sky Italia Digital Key with blue led: 07ca:a867) on a
Ubuntu 10.04 system with kernel 2.6.32-38-generic-pae and the latest
media_build tree installed.

The good news:
the driver loads properly, and, using Kaffeine, I could watch several
channels with a small portable antenna; I could also perform a full
frequency scan, finding several UHF and VHF stations. Signal strength
and SNR reports works really well, and they seems to give a "realistic"
figure of the signal quality (with both the portable and the rooftop
antenna).
When the stick is unplugged from the USB port, the driver unloads properly.

The bad news:
the driver seems to "lock" the application when it tries to tune a weak
channel: in this cases, Kaffeine becomes unresponsive and sometimes it
gives a stream error; for the same reason, the full scan fails to find
all stations and takes a long time to complete.
Also, when I tried to extract the stick from the USB port during one of
this "freezing" periods, the system crashed :-(
I reproduced this bug 3 times, and the last time I was able to see a
kernel dump for a moment: the function that crashed the kernel was
"af903x_streaming_ctrl".
Neither of those issues are present with the Avermedia A867 original
driver or Antti Palosaari's af9035 driver modified to support the A867
stick.

I hope this feedback will be useful to improve the driver.

Best regards,
Gianluca Gennari
  

Comments

Hans-Frieder Vogt Feb. 23, 2012, 10:12 p.m. UTC | #1
Am Donnerstag, 23. Februar 2012 schrieb Gianluca Gennari:
> Il 22/02/2012 23:20, Hans-Frieder Vogt ha scritto:
> > I have written a driver for the AF9035 & AF9033 (called af903x), based on
> > the various drivers and information floating around for these chips.
> > Currently, my driver only supports the devices that I am able to test.
> > These are
> > - Terratec T5 Ver.2 (also known as T6)
> > - Avermedia Volar HD Nano (A867)
> > 
> > The driver supports:
> > - diversity and dual tuner (when the first frontend is used, it is in
> > diversity mode, when two frontends are used in dual tuner mode)
> > - multiple devices
> > - pid filtering
> > - remote control in NEC and RC-6 mode (currently not switchable, but
> > depending on device)
> > - support for kernel 3.1, 3.2 and 3.3 series
> > 
> > I have not tried to split the driver in a DVB-T receiver (af9035) and a
> > frontend (af9033), because I do not see the sense in doing that for a
> > demodulator, that seems to be always used in combination with the very
> > same receiver.
> > 
> > The patch is split in three parts:
> > Patch 1: support for tuner fitipower FC0012
> > Patch 2: basic driver
> > Patch 3: firmware
> > 
> > Hans-Frieder Vogt                       e-mail: hfvogt <at> gmx .dot. net
> 
> Hi Hans,
> thank you for the new af903x driver.
> A few comments:
> 
> 1) I think you should set up a git repository with your driver and then
> send a PULL request to the list; as it is, the first patch is affected
> by line-wrapping problems so it must be manually edited to be
> applicable, and the second patch is compressed so it will be ignored by
> patchwork.
> 
> 2) There are a couple of small errors in the patches (see my attached
> patches): in the dvb-usb Makefile,  DVB_USB_AF903X must be replaced by
> CONFIG_DVB_USB_AF903X otherwise the driver will not compile; also, in
> the dvb_frontend_ops struct, the field info.type should be removed for
> kernels >= 3.3.0.
> 
> 3) The USB VID/PID IDs should be moved into dvb-usb-ids.h (see patch 3);
> I also added a few IDs from the Avermedia A867 driver*. As your driver
> supports both AF9007 and mxl5007t tuners I think this is safe.
> 
> *http://www.avermedia.com/Support/DownloadCount.aspx?FDFId=4591
> 
> 4) the driver also looks for a firmware file called "af35irtbl.bin" that
> comes from the "official" ITEtech driver (if it's not present the driver
> works anyway, but it prints an error message);
> 
> I tested the driver with an Avermedia A867 stick (it's an OEM stick also
> known as the Sky Italia Digital Key with blue led: 07ca:a867) on a
> Ubuntu 10.04 system with kernel 2.6.32-38-generic-pae and the latest
> media_build tree installed.
> 
> The good news:
> the driver loads properly, and, using Kaffeine, I could watch several
> channels with a small portable antenna; I could also perform a full
> frequency scan, finding several UHF and VHF stations. Signal strength
> and SNR reports works really well, and they seems to give a "realistic"
> figure of the signal quality (with both the portable and the rooftop
> antenna).
> When the stick is unplugged from the USB port, the driver unloads properly.
> 
> The bad news:
> the driver seems to "lock" the application when it tries to tune a weak
> channel: in this cases, Kaffeine becomes unresponsive and sometimes it
> gives a stream error; for the same reason, the full scan fails to find
> all stations and takes a long time to complete.
> Also, when I tried to extract the stick from the USB port during one of
> this "freezing" periods, the system crashed :-(
> I reproduced this bug 3 times, and the last time I was able to see a
> kernel dump for a moment: the function that crashed the kernel was
> "af903x_streaming_ctrl".
> Neither of those issues are present with the Avermedia A867 original
> driver or Antti Palosaari's af9035 driver modified to support the A867
> stick.
> 
> I hope this feedback will be useful to improve the driver.
> 
> Best regards,
> Gianluca Gennari

Gianluca,

thanks very much for your comments and patches. I will try the patches over 
the weekend.

With respect to your comment about the locking: I suspect this is because I 
have used quite a lot of mutex locks. In particular the dual tuner stick 
behaves very sensitive to any code changes and I have fought for months (no 
joke) to get it working reasonably well (besides the bad reception problems).
A lot of the complexity in the driver is for the dual tuner and to support the 
diversity feature.

As to the af35irtbl.bin firmware: this is something I just copied from previous 
drivers. I will probably just throw it out, because, as you also saw, it is 
not needed (only needed for the HID mode of the remote control).

Thanks very much for your input!

Regards,

Hans-Frieder Vogt                       e-mail: hfvogt <at> gmx .dot. net
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  
Gianluca Gennari Feb. 24, 2012, 3:44 p.m. UTC | #2
Il 23/02/2012 23:12, Hans-Frieder Vogt ha scritto:
> Am Donnerstag, 23. Februar 2012 schrieb Gianluca Gennari:
>> Il 22/02/2012 23:20, Hans-Frieder Vogt ha scritto:
>>> I have written a driver for the AF9035 & AF9033 (called af903x), based on
>>> the various drivers and information floating around for these chips.
>>> Currently, my driver only supports the devices that I am able to test.
>>> These are
>>> - Terratec T5 Ver.2 (also known as T6)
>>> - Avermedia Volar HD Nano (A867)
>>>
>>> The driver supports:
>>> - diversity and dual tuner (when the first frontend is used, it is in
>>> diversity mode, when two frontends are used in dual tuner mode)
>>> - multiple devices
>>> - pid filtering
>>> - remote control in NEC and RC-6 mode (currently not switchable, but
>>> depending on device)
>>> - support for kernel 3.1, 3.2 and 3.3 series
>>>
>>> I have not tried to split the driver in a DVB-T receiver (af9035) and a
>>> frontend (af9033), because I do not see the sense in doing that for a
>>> demodulator, that seems to be always used in combination with the very
>>> same receiver.
>>>
>>> The patch is split in three parts:
>>> Patch 1: support for tuner fitipower FC0012
>>> Patch 2: basic driver
>>> Patch 3: firmware
>>>
>>> Hans-Frieder Vogt                       e-mail: hfvogt <at> gmx .dot. net
>>
>> Hi Hans,
>> thank you for the new af903x driver.
>> A few comments:
>>
>> 1) I think you should set up a git repository with your driver and then
>> send a PULL request to the list; as it is, the first patch is affected
>> by line-wrapping problems so it must be manually edited to be
>> applicable, and the second patch is compressed so it will be ignored by
>> patchwork.
>>
>> 2) There are a couple of small errors in the patches (see my attached
>> patches): in the dvb-usb Makefile,  DVB_USB_AF903X must be replaced by
>> CONFIG_DVB_USB_AF903X otherwise the driver will not compile; also, in
>> the dvb_frontend_ops struct, the field info.type should be removed for
>> kernels >= 3.3.0.
>>
>> 3) The USB VID/PID IDs should be moved into dvb-usb-ids.h (see patch 3);
>> I also added a few IDs from the Avermedia A867 driver*. As your driver
>> supports both AF9007 and mxl5007t tuners I think this is safe.
>>
>> *http://www.avermedia.com/Support/DownloadCount.aspx?FDFId=4591
>>
>> 4) the driver also looks for a firmware file called "af35irtbl.bin" that
>> comes from the "official" ITEtech driver (if it's not present the driver
>> works anyway, but it prints an error message);
>>
>> I tested the driver with an Avermedia A867 stick (it's an OEM stick also
>> known as the Sky Italia Digital Key with blue led: 07ca:a867) on a
>> Ubuntu 10.04 system with kernel 2.6.32-38-generic-pae and the latest
>> media_build tree installed.
>>
>> The good news:
>> the driver loads properly, and, using Kaffeine, I could watch several
>> channels with a small portable antenna; I could also perform a full
>> frequency scan, finding several UHF and VHF stations. Signal strength
>> and SNR reports works really well, and they seems to give a "realistic"
>> figure of the signal quality (with both the portable and the rooftop
>> antenna).
>> When the stick is unplugged from the USB port, the driver unloads properly.
>>
>> The bad news:
>> the driver seems to "lock" the application when it tries to tune a weak
>> channel: in this cases, Kaffeine becomes unresponsive and sometimes it
>> gives a stream error; for the same reason, the full scan fails to find
>> all stations and takes a long time to complete.
>> Also, when I tried to extract the stick from the USB port during one of
>> this "freezing" periods, the system crashed :-(
>> I reproduced this bug 3 times, and the last time I was able to see a
>> kernel dump for a moment: the function that crashed the kernel was
>> "af903x_streaming_ctrl".
>> Neither of those issues are present with the Avermedia A867 original
>> driver or Antti Palosaari's af9035 driver modified to support the A867
>> stick.
>>
>> I hope this feedback will be useful to improve the driver.
>>
>> Best regards,
>> Gianluca Gennari
> 
> Gianluca,
> 
> thanks very much for your comments and patches. I will try the patches over 
> the weekend.
> 
> With respect to your comment about the locking: I suspect this is because I 
> have used quite a lot of mutex locks. In particular the dual tuner stick 
> behaves very sensitive to any code changes and I have fought for months (no 
> joke) to get it working reasonably well (besides the bad reception problems).
> A lot of the complexity in the driver is for the dual tuner and to support the 
> diversity feature.


Hi Hans,
I'm not an expert on this kind of problems, so take this further
comments with a grain of salt.

I see you always use mutex_lock(), while both the it913x driver and
Antti's af9035 driver are often using mutex_lock_interruptible() and
returning -EAGAIN when the lock request is interrupted. Could this be
the reason of the kernel crash when the stick is unplugged from the USB
port?

Moreover, you are requesting a mutex lock even for functions that are
just reading a bunch of registers (for example, to get the status or the
SNR/signal strength values). Is this really necessary? I guess this is
what is making Kaffeine unresponsive while the driver is struggling to
tune a weak channel.

Finally, I noticed that af903x_set_bus_tuner() is just setting up the
tuner_desc data structure. Is a mutex_lock really necessary in this
function?

A possible small bug: af903x_streaming_ctrl is always returning 0. I
think it should be returning "ret" in case of errors.

> As to the af35irtbl.bin firmware: this is something I just copied from previous 
> drivers. I will probably just throw it out, because, as you also saw, it is 
> not needed (only needed for the HID mode of the remote control).
> 
> Thanks very much for your input!
> 
> Regards,
> 
> Hans-Frieder Vogt                       e-mail: hfvogt <at> gmx .dot. net
> 

Thank you for your effort.

Regards,
Gianluca
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
  

Patch

[PATCH 3/3] af903x: add new USB VID/PID IDs and move definitions to dvb-usb-ids.h

Signed-off-by: Gianluca Gennari <gennarone@gmail.com>
---
 drivers/media/dvb/dvb-usb/af903x-devices.c |   72 +++++++++++++++++++++++-----
 drivers/media/dvb/dvb-usb/dvb-usb-ids.h    |   16 ++++++
 2 files changed, 76 insertions(+), 12 deletions(-)

diff --git a/drivers/media/dvb/dvb-usb/af903x-devices.c b/drivers/media/dvb/dvb-usb/af903x-devices.c
index 21ece97..06e96f4 100644
--- a/drivers/media/dvb/dvb-usb/af903x-devices.c
+++ b/drivers/media/dvb/dvb-usb/af903x-devices.c
@@ -1216,18 +1216,50 @@  enum af903x_table_entry {
 	AFATECH_AF9035,
 	TERRATEC_T6,		/* Terratec T6 */
 	TERRATEC_T5_REV2,	/* Terratec T5 Rev.2 */
+	AVERMEDIA_TWINSTAR,	/* Avermedia TwinStar */
 	AVERMEDIA_A867,		/* Avermedia HD Volar / A867 */
+	AVERMEDIA_A333,		/* Avermedia A333 */
+	AVERMEDIA_B867,
+	AVERMEDIA_1867,
+	AVERMEDIA_0337,
+	AVERMEDIA_0867,
+	AVERMEDIA_F337,
+	AVERMEDIA_3867,
 };
 
 struct usb_device_id af903x_usb_table[] = {
-	[AFATECH_1000] = { USB_DEVICE(0x15A4,0x1000) },
-	[AFATECH_1001] = { USB_DEVICE(0x15A4,0x1001) },
-	[AFATECH_1002] = { USB_DEVICE(0x15A4,0x1002) },
-	[AFATECH_1003] = { USB_DEVICE(0x15A4,0x1003) },
-	[AFATECH_AF9035] = { USB_DEVICE(0x15A4,0x9035) },
-	[TERRATEC_T6] = { USB_DEVICE(0x0ccd,0x10b3) },
-	[TERRATEC_T5_REV2] = { USB_DEVICE(0x0ccd,0x10b7) },
-	[AVERMEDIA_A867] = { USB_DEVICE(0x07ca,0x1867) },
+	[AFATECH_1000] = {USB_DEVICE(USB_VID_AFATECH,
+				USB_PID_AFATECH_AF9035_1000)},
+	[AFATECH_1001] = {USB_DEVICE(USB_VID_AFATECH,
+				USB_PID_AFATECH_AF9035_1001)},
+	[AFATECH_1002] = {USB_DEVICE(USB_VID_AFATECH,
+				USB_PID_AFATECH_AF9035_1002)},
+	[AFATECH_1003] = {USB_DEVICE(USB_VID_AFATECH,
+				USB_PID_AFATECH_AF9035_1003)},
+	[AFATECH_AF9035] = {USB_DEVICE(USB_VID_AFATECH,
+				USB_PID_AFATECH_AF9035_9035)},
+	[TERRATEC_T6] = {USB_DEVICE(USB_VID_TERRATEC,
+				USB_PID_TERRATEC_T6)},
+	[TERRATEC_T5_REV2] = {USB_DEVICE(USB_VID_TERRATEC,
+				USB_PID_TERRATEC_T5_REV2)},
+	[AVERMEDIA_TWINSTAR] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_A825)},
+	[AVERMEDIA_A333] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_A333)},
+	[AVERMEDIA_B867] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_B867)},
+	[AVERMEDIA_1867] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_1867)},
+	[AVERMEDIA_0337] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_0337)},
+	[AVERMEDIA_A867] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_A867)},
+	[AVERMEDIA_0867] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_0867)},
+	[AVERMEDIA_F337] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_F337)},
+	[AVERMEDIA_3867] = {USB_DEVICE(USB_VID_AVERMEDIA,
+				USB_PID_AVERMEDIA_3867)},
 	{ 0},		/* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, af903x_usb_table);
@@ -1310,9 +1342,9 @@  struct dvb_usb_device_properties af903x_properties[] = {
 			.rc_codes	= NULL, /* will be set in
 						   af903x_identify_state */
 		},
-		.num_device_descs =4,
+		.num_device_descs = 6,
 		.devices =  {
-			{   	"ITEtech USB2.0 DVB-T Recevier",
+			{   	"ITEtech AF903x USB2.0 DVB-T Receiver",
 				{ &af903x_usb_table[AFATECH_1000],
 				  &af903x_usb_table[AFATECH_1001],
 				  &af903x_usb_table[AFATECH_1002], 
@@ -1329,8 +1361,24 @@  struct dvb_usb_device_properties af903x_properties[] = {
 				{ NULL },
 			},
 			{
-				"AVerMedia A867 DVB-T Recevier",
-				{ &af903x_usb_table[AVERMEDIA_A867], NULL},
+				"Avermedia TwinStar",
+				{ &af903x_usb_table[AVERMEDIA_TWINSTAR], NULL},
+				{ NULL },
+			},
+			{
+				"AVerMedia A333 DVB-T Receiver",
+				{ &af903x_usb_table[AVERMEDIA_A333],
+				  &af903x_usb_table[AVERMEDIA_B867], NULL},
+                            	{ NULL },
+			},
+			{
+				"AVerMedia A867 DVB-T Receiver",
+				{ &af903x_usb_table[AVERMEDIA_1867],
+				  &af903x_usb_table[AVERMEDIA_0337],
+				  &af903x_usb_table[AVERMEDIA_A867],
+				  &af903x_usb_table[AVERMEDIA_0867],
+				  &af903x_usb_table[AVERMEDIA_F337],
+				  &af903x_usb_table[AVERMEDIA_3867], NULL},
                             	{ NULL },
 			},
 			{NULL},
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
index 9c3dae1..6ed83fd 100644
--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
@@ -75,6 +75,11 @@ 
 #define USB_PID_AFATECH_AF9005				0x9020
 #define USB_PID_AFATECH_AF9015_9015			0x9015
 #define USB_PID_AFATECH_AF9015_9016			0x9016
+#define USB_PID_AFATECH_AF9035_1000			0x1000
+#define USB_PID_AFATECH_AF9035_1001			0x1001
+#define USB_PID_AFATECH_AF9035_1002			0x1002
+#define USB_PID_AFATECH_AF9035_1003			0x1003
+#define USB_PID_AFATECH_AF9035_9035			0x9035
 #define USB_PID_TREKSTOR_DVBT				0x901b
 #define USB_VID_ALINK_DTU				0xf170
 #define USB_PID_ANSONIC_DVBT_USB			0x6000
@@ -218,6 +223,15 @@ 
 #define USB_PID_AVERMEDIA_A850T				0x850b
 #define USB_PID_AVERMEDIA_A805				0xa805
 #define USB_PID_AVERMEDIA_A815M				0x815a
+#define USB_PID_AVERMEDIA_A825				0x0825
+#define USB_PID_AVERMEDIA_A333				0xa333
+#define USB_PID_AVERMEDIA_B867				0xb867
+#define USB_PID_AVERMEDIA_1867				0x1867
+#define USB_PID_AVERMEDIA_0337				0x0337
+#define USB_PID_AVERMEDIA_A867				0xa867
+#define USB_PID_AVERMEDIA_0867				0x0867
+#define USB_PID_AVERMEDIA_F337				0xf337
+#define USB_PID_AVERMEDIA_3867				0x3867
 #define USB_PID_TECHNOTREND_CONNECT_S2400               0x3006
 #define USB_PID_TECHNOTREND_CONNECT_CT3650		0x300d
 #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY	0x005a
@@ -231,6 +245,8 @@ 
 #define USB_PID_TERRATEC_H7_2				0x10a3
 #define USB_PID_TERRATEC_T3				0x10a0
 #define USB_PID_TERRATEC_T5				0x10a1
+#define USB_PID_TERRATEC_T5_REV2			0x10b7
+#define USB_PID_TERRATEC_T6				0x10b3
 #define USB_PID_PINNACLE_EXPRESSCARD_320CX		0x022e
 #define USB_PID_PINNACLE_PCTV2000E			0x022c
 #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH		0x0228
-- 
1.7.0.4