[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#345067: My understanding of the IDE mess, and why it does not make sense to apply the proposed patch

On Thu, 9 Mar 2006, Steve Langasek wrote:

What version of the kernel was this analysis done with?  The workaround in
yaird is explicitly commented as existing for the benefit of older kernel
versions; can you assure us that this aspect of the driver design is
unchanged from 2.6.8 through 2.6.15?

My testing confirms, that 2.6.8 from Debian fails to boot if ide-generic
module is not included in initrd:

Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
pivot_root: No such file or directory
/sbin/init: 432: cannot open /dev/console: No such file
Kernel panic: Attempted to kill init!

When ide-generic is included (it is loaded after all the native ide
modules), the kernel boots fine. The reason is that in the Debian
2.6.8 sources the ide-generic initialization procedure contains the
call to ide_scan_pcibus(), which actually does the detection of PCI
IDE devices. Function probe_for_hwifs() in ide.c contains a call to
ide_scan_pcibus() as well, but there it is only called if ide.c is
built-in, and not a part of a module (it normally goes into
ide-core). So, in Debian's 2.6.8 loading of ide-generic is really
essential, and it should be loaded after all the native modules, which
just register PCI drivers for specific chipsets. Note that the
upstream kernel source does not operate like this. ide-generic does
NOT contain a call to ide_scan_pcibus(), this situation is the result
of Debian-specific patches, in particular modular IDE patch,
originally introduced by Herbert Xu.

That patch has been dropped starting with the release of 2.6.15-1
Debian kernel packages, according to changelog. Since then
ide_scan_pcibus() in probe_for_hwifs() (which is called by ide_init())
is performed always, irrespectively of whether it is built as a module
or not, and there is no call to ide_scan_pcibus() in ide-generic.c.
So, if there is a native driver for chipset, it will always work,
independently of whether ide-generic is loaded afterwards or not.

To summarize: in some cases ide-generic has to be loaded last by
initrd to get it to work (when kernel is built from the Debian kernel
source, including the modular IDE patch). When it is built from the
vanilla source, it is completely optional, given that native drivers
exist, but nice to include as a last-resort option if it is
present. Unfortunately, I don't see a way to distinguish between these
two cases at the time of initrd generation (even though there might
be some nm or objdump trick to do that).

Best regards,

Jurij Smakov                                        jurij@wooyd.org
Key: http://www.wooyd.org/pgpkey/                   KeyID: C99E03CC

Reply to: