For the last couple of nights, I have been continuing to work on getting the xc4000 running on the PCTV 340e. However, last night I made the mistake of updating the kernel in Ubuntu Karmic to the latest 2.6.31 snapshot, at which point I would get a kernel oops every time request_firmware() was called. After a good bit of backtracking to figure out where the breakage came in, it turns up the dib7000p i2c master implementation does not set the dev.parent field in the i2c adapter structure. As a result, the device argument to request_firmware() is NULL.
It looks like the field was never being populated, but the issue was not visible because very few tuners both are behind the dib7000p *and* use request_firmware(). Also, a printk() got added in 2.6.31 which makes use of the field, so it is no longer permitted to be a NULL pointer.
I’ll have to poke around at the dib7000p code and figure out how to get access to the usb_device pointer, at which point the code should start working again.
Also, I compared the trace for the xc4000 firmware loading against the Windows trace, and I noticed that the Windows driver never sends more than 32 bytes at a time, whereas the Linux driver sends 64 bytes. This might explain the failures seen a few hundred bytes into firmware loading. I do not know if the other 32 bytes are being truncated or not.