On Fri, 2008-09-12 at 15:16 -0400, Patrick Boisvenue wrote: > Patrick Boisvenue wrote: > > Michael Krufky wrote: > >> On Fri, Sep 12, 2008 at 2:24 PM, Patrick Boisvenue <patrbois@xxxxxxxx> wrote: > >>> Andy Walls wrote: > >>>> On Wed, 2008-09-10 at 20:37 -0400, Patrick Boisvenue wrote: > >>>>> Andy Walls wrote: > >>>>>> On Tue, 2008-09-09 at 22:37 -0400, Steven Toth wrote: > >>>>>>> Patrick Boisvenue wrote: > >>>>>>>> Steven Toth wrote: > >>>>>>>>> Patrick Boisvenue wrote: > >>>>>>>> When launching dvbscan I get the following in dmesg: > >>>>>>>> > >>>>>>>> xc5000: waiting for firmware upload (dvb-fe-xc5000-1.1.fw)... > >>>>>>>> firmware: requesting dvb-fe-xc5000-1.1.fw > >>>>>>>> kobject_add_internal failed for i2c-2 with -EEXIST, don't try to > >>>>>>>> register things with the same name in the same directory. > >>>>>>>> Pid: 8059, comm: kdvb-fe-0 Tainted: P 2.6.26-gentoo #11 > >>>>>>>> > >>>>>>>> Call Trace: > >>>>>>>> [<ffffffff8036abb5>] kobject_add_internal+0x13f/0x17e > >>>>>>>> [<ffffffff8036aff2>] kobject_add+0x74/0x7c > >>>>>>>> [<ffffffff80230b02>] printk+0x4e/0x56 > >>>>>>>> [<ffffffff803eb84a>] device_add+0x9b/0x483 > >>>>>>>> [<ffffffff8036a876>] kobject_init+0x41/0x69 > >>>>>>>> [<ffffffff803f059d>] _request_firmware+0x169/0x324 > >>>>>>>> [<ffffffffa00e9a7e>] :xc5000:xc_load_fw_and_init_tuner+0x64/0x293 > >>>>>>>> [<ffffffff804a7222>] i2c_transfer+0x75/0x7f > >>>>>>>> [<ffffffffa00e53ad>] :s5h1409:s5h1409_writereg+0x51/0x83 > >>>>>>>> [<ffffffffa00e9cea>] :xc5000:xc5000_init+0x3d/0x6f > >>>>>>>> [<ffffffffa0091b0c>] :dvb_core:dvb_frontend_init+0x49/0x63 > >>>>>>>> [<ffffffffa0092e2c>] :dvb_core:dvb_frontend_thread+0x78/0x2f0 > >>>>>>>> [<ffffffffa0092db4>] :dvb_core:dvb_frontend_thread+0x0/0x2f0 > >>>>>>>> [<ffffffff80240eaf>] kthread+0x47/0x74 > >>>>>>>> [<ffffffff8022bc41>] schedule_tail+0x27/0x5b > >>>>>>>> [<ffffffff8020be18>] child_rip+0xa/0x12 > >>>>>>>> [<ffffffff80240e68>] kthread+0x0/0x74 > >>>>>>>> [<ffffffff8020be0e>] child_rip+0x0/0x12 > >>>>>>>> > >>>>>>>> fw_register_device: device_register failed > >>>>>>>> xc5000: Upload failed. (file not found?) > >>>>>>>> xc5000: Unable to initialise tuner > >>>>>>>> > >>>>>>>> > >>>>>>>> I have the firmware file located here: > >>>>>>>> > >>>>>>>> # ls -l /lib/firmware/dvb-fe-xc5000-1.1.fw > >>>>>>>> -rw-r--r-- 1 root root 12332 Aug 31 12:56 > >>>>>>>> /lib/firmware/dvb-fe-xc5000-1.1.fw > >>>>>>>> > >>>>>>>> If there is anything else I can provide (or try) to help debug, let me > >>>>>>>> know, > >>>>>>>> ...Patrick > >>>>>>> > kobject_add_internal failed for i2c-2 with -EEXIST, don't try to > >>>>>>> > register things with the same name in the same directory. > >>>>>>> > >>>>>>> Ooh, that's nasty problem, this is new - and looks like it's i2c related. > >>>>>>> > >>>>>>> Why does this sound familiar? Anyone? > >>>>>> A cx18 user had a similar problem on one distro. I remeber running it > >>>>>> down to a race condition in creating device nodes in one of the > >>>>>> "virtual" filesystems (/proc or /sys) the device was looking for a > >>>>>> paretn PCI device entry to hook onto, but it wasn't created at the time > >>>>>> so it tries to create it itself. In the meantime some other part of the > >>>>>> kernel subsystem did actually finish creating the entry - so it exists > >>>>>> by the time the firmware load tries to make it. > >>>>>> > >>>>>> As far as I could tell, it should be non-fatal (not an Oops or panic), > >>>>>> but if the driver gives up on -EEXIST then things won't work obviously. > >>>>>> > >>>>>> I never resolved the problem for the user. I think some kernel change > >>>>>> outside of cx18 resolved it. That's all the details I have. > >>>>>> > >>>>>> Regards, > >>>>>> Andy > >>>>>> > >>>>> So what are my options? > >>>> Good question. I don't know. Working with kobjects is way out of my > >>>> knowledge base. > >>>> > >>>> I looked at the kernel code long enough to decide that without being > >>>> able to reproduce the problem myself, I won't be able to spot the root > >>>> cause. Part of the reason is that this problem is about looking for and > >>>> creating sysfs objects as it relates to driver probing and firmware > >>>> loading. I couldn't quite sort out what had to happen in series and > >>>> what the kernel could be executing in parallel. > >>>> > >>>> I think your best option would be to post to the LKML or wherever else > >>>> the sysfs and kobject experts hang out. > >>>> > >>>> Another option could be to modify the driver code that gives up when the > >>>> firmware operation returns an error code because a sysfs device node > >>>> already exists (-EEXIST). That's no big deal, and a driver should be > >>>> able to merrily go forward, if it can easily detect the condition. > >>>> > >>>> > >>> More observations before I go bother people LKML. This is the error > >>> with an older 2.6.25 kernel. The dmesg output is more interesting. OK. Let's look at where these sysfs entries exist and then how they get created. First look for the relevant sysfs entries on your running system. Here's an example from my system with a PVR-150 (i2c-0), an HVR-1600 (i2c-2 & i2c-3) and my mainboard (i2c-1): # find /sys -name "i2c-[0-9]" -print /sys/devices/pci0000:00/0000:00:14.0/i2c-adapter/i2c-1 /sys/devices/pci0000:00/0000:00:14.4/0000:03:02.0/i2c-adapter/i2c-0 /sys/devices/pci0000:00/0000:00:14.4/0000:03:03.0/i2c-adapter/i2c-2 /sys/devices/pci0000:00/0000:00:14.4/0000:03:03.0/i2c-adapter/i2c-3 /sys/class/i2c-adapter/i2c-0 /sys/class/i2c-adapter/i2c-1 /sys/class/i2c-adapter/i2c-2 /sys/class/i2c-adapter/i2c-3 You can also do this to see what's in the i2c-* directories: # find /sys -name "i2c-[0-9]" -print -exec ls -l {} \; So now you can know the i2c buses that loaded modules have registered on your system. You can look up the PCI or USB bus numbers to see which device has which i2c-bus. Look at what firmwares are registered in the sysfs. Here's an example from my system with an PVR150 with a CX25843 decoder hanging off of the I2C bus of a CX23416: # find /sys -name "firmware" -exec ls -ld {} \; drwxr-xr-x 2 root root 0 2008-09-12 18:30 /sys/class/firmware drwxr-xr-x 3 root root 0 2008-09-12 17:36 /sys/firmware -r--r--r-- 1 root root 4096 2008-09-12 20:36 /sys/module/cx25840/parameters/firmware # cat /sys/module/cx25840/parameters/firmware v4l-cx25840.fw (I don't have a card with an XC5000 or XC3028.) Looking at the cx23885 driver core code, this is the sequence wind-up from the driver being modprobed to one of these i2c-* sysfs directory nodes initially getting created for the cx23885 device: drivers/media/video/cx23885/cx23885-core.c:cx23885_init() include/linux/pci.h:pci_register_driver() drivers/pci/pci-driver.c:__pci_register_driver() drivers/base/driver.c:driver_register() drivers/base/bus.c:bus_add_driver() drivers/base/dd.c:driver_attach() drivers/base/bus.c:bus_for_each_dev() drivers/base/dd.c:__driver_attach() drivers/base/dd.c:driver_probe_device() drivers/base/dd.c:really_probe() drivers/pci/pci-driver.c:pci_device_probe() drivers/pci/pci-driver.c:__pci_device_probe() drivers/pci/pci-driver.c:pci_call_probe() drivers/media/video/cx23885/cx23885-core.c:cx23885_initdev() drivers/media/video/cx23885/cx23885-core.c:cx23885_dev_setup() drivers/media/video/cx23885/cx23885-i2c.c:cx23885_i2c_register() drivers/i2c/i2c-core.c:i2c_add_adapter() drivers/i2c/i2c-core.c:i2c_register_adapter() drivers/base/core.c:device_register() drivers/base/core.c:device_add() lib/kobject.c:kobject_add() lib/kobject.c:kobject_add_varg() lib/kobject.c:kobject_add_internal() lib/kobject.c:create_dir() fs/sysfs/dir.c:sysfs_create_dir() And here's the wind up to the system trying to create the node again upon dvb frontend open that loads firmware to the xc5000 tuner hanging off of that i2c bus: drivers/media/dvb/dvb-core/dvb_frontend.c:dvb_frontend_open() drivers/media/dvb/dvb-core/dvb_frontend.c:dvb_frontend_start() include/linux/kthread.h:kthread_run() kernel/kthread.c:kthread_create() drivers/media/dvb/dvb-core/dvb_frontend.c:dvb_frontend_thread() drivers/media/dvb/dvb-core/dvb_frontend.c:dvb_frontend_init() drivers/media/common/tuners/xc5000.c:xc5000_init() drivers/media/common/tuners/xc5000.c:xc_load_fw_and_init_tuner() drivers/media/common/tuners/xc5000.c:xc5000_fw_upload() drivers/base/firmware_class.c:request_firmware() drivers/base/firmware_class.c:_request_firmware() drivers/base/firmware_class.c:fw_setup_device() drivers/base/firmware_class.c:fw_register_device() drivers/base/core.c:device_register() drivers/base/core.c:device_add() lib/kobject.c:kobject_add() lib/kobject.c:kobject_add_varg() lib/kobject.c:kobject_add_internal() lib/kobject.c:create_dir() fs/sysfs/dir.c:sysfs_create_dir() And that last call is where the EEXIST gripe comes from. I can't tell why exactly it's trying to recreate the i2c-* directory node in sysfs again. (Maybe it's iterating over the parent node for some reason?) If you've waited a long time to open the dvb frontend, the driver load should have already created the i2c-* directory node, and it should exist. There doesn't seem to be any duplicate checking until the sysfs directory node is attempted to be created again. I don't know if the call to request_firmware() in xc5000_fw_upload() is passing in the right "dev" structure (&priv->i2c_props.adap->dev) or not. The parent of the i2c bus adapter dev is the pci bus dev. Request firmware does end up copying the bus_id from the parent i2c adapter dev to make sure it gets installed in the right place under sysfs. I just can't see what's going wrong, aside from everything is happening as it should: and that logically leads to the error. The source code I'm looking at comes from this system: $ uname -a Linux morgan.walls.org 2.6.25.10-86.fc9.x86_64 #1 SMP Mon Jul 7 20:23:46 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux Steve or Mike, Any ideas? Regards, Andy > >>> > >>> xc5000: waiting for firmware upload (dvb-fe-xc5000-1.1.fw)... > >>> > >>> > >>> sysfs: duplicate filename 'i2c-1' can not be created > >>> > >>> > >> Patrick, > >> > >> This particular issue may have been fixed by my recent xc5000 patches > >> that were merged into the master branch a few days ago... > >> > >> Try pulling the v4l-dvb master branch -- that might help. > >> > >> HTH, > >> > >> Mike > > > > No change. Same error. Just to confirm I'm up to date, this is an > > output of "hg heads" for what I pulled in. > > > > changeset: 8964:e5ca4534b543 > > tag: tip > > user: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> > > date: Tue Sep 09 08:29:56 2008 -0700 > > summary: s2255drv field count fix > > > > changeset: 8924:c793bb42e052 > > user: Steven Toth <stoth@xxxxxxxxxxx> > > date: Tue Sep 09 10:52:06 2008 -0400 > > summary: cx23885: Fix for HVR1500Q eeprom offset decoding > > > > ...Patrick > > > > see new dmesg output at end of message. > > > > >>> ------------[ cut here ]------------ > >>> > >>> > >>> WARNING: at fs/sysfs/dir.c:424 sysfs_add_one+0x3f/0x93() > >>> > >>> > >>> Modules linked in: wlan_wep xc5000 s5h1409 cx23885 compat_ioctl32 > >>> videodev v4l1_compat cx2341x wlan_scan_sta videobuf_dma_sg > >>> ath_rate_sample v4l2_common btcx_risc tveeprom ath_pci videobuf_dvb > >>> dvb_core wlan ath_hal(P) videobuf_core > >>> > >>> Pid: 7730, comm: kdvb-fe-0 Tainted: P 2.6.25-gentoo-r6 #2 > >>> > >>> > >>> > >>> Call Trace: > >>> [<ffffffff8023019d>] warn_on_slowpath+0x51/0x63 > >>> [<ffffffff80230ef4>] printk+0x4e/0x56 > >>> [<ffffffff8029143a>] find_inode+0x28/0x6d > >>> [<ffffffff802bea5c>] sysfs_ilookup_test+0x0/0xf > >>> [<ffffffff8029156e>] ifind+0x44/0x8d > >>> [<ffffffff802bec58>] sysfs_find_dirent+0x1b/0x2f > >>> [<ffffffff802becab>] sysfs_add_one+0x3f/0x93 > >>> [<ffffffff802bf1fe>] create_dir+0x4f/0x87 > >>> [<ffffffff802bf26b>] sysfs_create_dir+0x35/0x4a > >>> [<ffffffff80366f6a>] kobject_get+0x12/0x17 > >>> [<ffffffff8036708f>] kobject_add_internal+0xc3/0x17e > >>> [<ffffffff80367224>] kobject_add_varg+0x54/0x61 > >>> [<ffffffff802296d6>] __wake_up+0x38/0x4f > >>> [<ffffffff80367581>] kobject_add+0x74/0x7c > >>> [<ffffffff880cb43e>] :cx23885:i2c_readbytes+0x1ae/0x25d > >>> [<ffffffff80230ef4>] printk+0x4e/0x56 > >>> [<ffffffff803e647a>] device_add+0x85/0x4a4 > >>> [<ffffffff80366e05>] kobject_init+0x41/0x69 > >>> [<ffffffff803ebe58>] _request_firmware+0x154/0x30f > >>> [<ffffffff880e3a7e>] :xc5000:xc_load_fw_and_init_tuner+0x64/0x293 > >>> [<ffffffff804ac2c7>] i2c_transfer+0x75/0x7f > >>> [<ffffffff880df3ad>] :s5h1409:s5h1409_writereg+0x51/0x83 > >>> [<ffffffff880e3cea>] :xc5000:xc5000_init+0x3d/0x6f > >>> [<ffffffff8806ab0c>] :dvb_core:dvb_frontend_init+0x49/0x63 > >>> [<ffffffff8806be8d>] :dvb_core:dvb_frontend_thread+0x78/0x307 > >>> [<ffffffff8806be15>] :dvb_core:dvb_frontend_thread+0x0/0x307 > >>> [<ffffffff80241392>] kthread+0x47/0x75 > >>> [<ffffffff8022bc6a>] schedule_tail+0x27/0x5c > >>> [<ffffffff8020bc88>] child_rip+0xa/0x12 > >>> [<ffffffff8024134b>] kthread+0x0/0x75 > >>> [<ffffffff8020bc7e>] child_rip+0x0/0x12 > >>> > >>> ---[ end trace 01bdacc4ebef05bf ]--- > >>> kobject_add_internal failed for i2c-1 with -EEXIST, don't try to > >>> register things with the same name in the same directory. > >>> Pid: 7730, comm: kdvb-fe-0 Tainted: P 2.6.25-gentoo-r6 #2 > >>> > >>> Call Trace: > >>> [<ffffffff8036710b>] kobject_add_internal+0x13f/0x17e > >>> [<ffffffff80367224>] kobject_add_varg+0x54/0x61 > >>> [<ffffffff802296d6>] __wake_up+0x38/0x4f > >>> [<ffffffff80367581>] kobject_add+0x74/0x7c > >>> [<ffffffff880cb43e>] :cx23885:i2c_readbytes+0x1ae/0x25d > >>> [<ffffffff80230ef4>] printk+0x4e/0x56 > >>> [<ffffffff803e647a>] device_add+0x85/0x4a4 > >>> [<ffffffff80366e05>] kobject_init+0x41/0x69 > >>> [<ffffffff803ebe58>] _request_firmware+0x154/0x30f > >>> [<ffffffff880e3a7e>] :xc5000:xc_load_fw_and_init_tuner+0x64/0x293 > >>> [<ffffffff804ac2c7>] i2c_transfer+0x75/0x7f > >>> [<ffffffff880df3ad>] :s5h1409:s5h1409_writereg+0x51/0x83 > >>> [<ffffffff880e3cea>] :xc5000:xc5000_init+0x3d/0x6f > >>> [<ffffffff8806ab0c>] :dvb_core:dvb_frontend_init+0x49/0x63 > >>> [<ffffffff8806be8d>] :dvb_core:dvb_frontend_thread+0x78/0x307 > >>> [<ffffffff8806be15>] :dvb_core:dvb_frontend_thread+0x0/0x307 > >>> [<ffffffff80241392>] kthread+0x47/0x75 > >>> [<ffffffff8022bc6a>] schedule_tail+0x27/0x5c > >>> [<ffffffff8020bc88>] child_rip+0xa/0x12 > >>> [<ffffffff8024134b>] kthread+0x0/0x75 > >>> [<ffffffff8020bc7e>] child_rip+0x0/0x12 > >>> > >>> fw_register_device: device_register failed > >>> xc5000: Upload failed. (file not found?) > >>> xc5000: Unable to initialise tuner > > > > Attaching new dmesg output anyway since the address offsets have changed: > > xc5000: waiting for firmware upload (dvb-fe-xc5000-1.1.fw)... > > sysfs: duplicate filename 'i2c-1' can not be created > > ------------[ cut here ]------------ > > WARNING: at fs/sysfs/dir.c:424 sysfs_add_one+0x3f/0x93() > > Modules linked in: xc5000 s5h1409 cx23885 compat_ioctl32 videodev > v4l1_compat cx2341x videobuf_dma_sg v4l2_common btcx_risc tveeprom > videobuf_dvb dvb_core videobuf_core wlan_wep wlan_scan_sta > ath_rate_sample ath_pci wlan ath_hal(P) [last unloaded: v4l1_compat] > > Pid: 13677, comm: kdvb-fe-0 Tainted: P 2.6.25-gentoo-r6 #2 > > > > Call Trace: > [<ffffffff8023019d>] warn_on_slowpath+0x51/0x63 > [<ffffffff80230ef4>] printk+0x4e/0x56 > [<ffffffff8029143a>] find_inode+0x28/0x6d > [<ffffffff802bea5c>] sysfs_ilookup_test+0x0/0xf > [<ffffffff8029156e>] ifind+0x44/0x8d > [<ffffffff802bec58>] sysfs_find_dirent+0x1b/0x2f > [<ffffffff802becab>] sysfs_add_one+0x3f/0x93 > [<ffffffff802bf1fe>] create_dir+0x4f/0x87 > [<ffffffff802bf26b>] sysfs_create_dir+0x35/0x4a > [<ffffffff80366f6a>] kobject_get+0x12/0x17 > [<ffffffff8036708f>] kobject_add_internal+0xc3/0x17e > [<ffffffff80367224>] kobject_add_varg+0x54/0x61 > [<ffffffff802296d6>] __wake_up+0x38/0x4f > [<ffffffff80367581>] kobject_add+0x74/0x7c > [<ffffffff880cb43e>] :cx23885:i2c_readbytes+0x1ae/0x25d > [<ffffffff80230ef4>] printk+0x4e/0x56 > [<ffffffff803e647a>] device_add+0x85/0x4a4 > [<ffffffff80366e05>] kobject_init+0x41/0x69 > [<ffffffff803ebe58>] _request_firmware+0x154/0x30f > [<ffffffff880e2a29>] :xc5000:xc_load_fw_and_init_tuner+0x64/0x2ad > [<ffffffff804ac2c7>] i2c_transfer+0x75/0x7f > [<ffffffff880de3ad>] :s5h1409:s5h1409_writereg+0x51/0x83 > [<ffffffff880e2caf>] :xc5000:xc5000_init+0x3d/0x6f > [<ffffffff8806ab0c>] :dvb_core:dvb_frontend_init+0x49/0x63 > [<ffffffff8806be8d>] :dvb_core:dvb_frontend_thread+0x78/0x307 > [<ffffffff8806be15>] :dvb_core:dvb_frontend_thread+0x0/0x307 > [<ffffffff80241392>] kthread+0x47/0x75 > [<ffffffff8022bc6a>] schedule_tail+0x27/0x5c > [<ffffffff8020bc88>] child_rip+0xa/0x12 > [<ffffffff8024134b>] kthread+0x0/0x75 > [<ffffffff8020bc7e>] child_rip+0x0/0x12 > > ---[ end trace 01bdacc4ebef05bf ]--- > kobject_add_internal failed for i2c-1 with -EEXIST, don't try to > register things with the same name in the same directory. > Pid: 13677, comm: kdvb-fe-0 Tainted: P 2.6.25-gentoo-r6 #2 > > Call Trace: > [<ffffffff8036710b>] kobject_add_internal+0x13f/0x17e > [<ffffffff80367224>] kobject_add_varg+0x54/0x61 > [<ffffffff802296d6>] __wake_up+0x38/0x4f > [<ffffffff80367581>] kobject_add+0x74/0x7c > [<ffffffff880cb43e>] :cx23885:i2c_readbytes+0x1ae/0x25d > [<ffffffff80230ef4>] printk+0x4e/0x56 > [<ffffffff803e647a>] device_add+0x85/0x4a4 > [<ffffffff80366e05>] kobject_init+0x41/0x69 > [<ffffffff803ebe58>] _request_firmware+0x154/0x30f > [<ffffffff880e2a29>] :xc5000:xc_load_fw_and_init_tuner+0x64/0x2ad > [<ffffffff804ac2c7>] i2c_transfer+0x75/0x7f > [<ffffffff880de3ad>] :s5h1409:s5h1409_writereg+0x51/0x83 > [<ffffffff880e2caf>] :xc5000:xc5000_init+0x3d/0x6f > [<ffffffff8806ab0c>] :dvb_core:dvb_frontend_init+0x49/0x63 > [<ffffffff8806be8d>] :dvb_core:dvb_frontend_thread+0x78/0x307 > [<ffffffff8806be15>] :dvb_core:dvb_frontend_thread+0x0/0x307 > [<ffffffff80241392>] kthread+0x47/0x75 > [<ffffffff8022bc6a>] schedule_tail+0x27/0x5c > [<ffffffff8020bc88>] child_rip+0xa/0x12 > [<ffffffff8024134b>] kthread+0x0/0x75 > [<ffffffff8020bc7e>] child_rip+0x0/0x12 > > fw_register_device: device_register failed > xc5000: Upload failed. (file not found?) > xc5000: Unable to initialise tuner > > > _______________________________________________ > linux-dvb mailing list > linux-dvb@xxxxxxxxxxx > http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb > _______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb