Skip to contentSkip to conversation

IDE 2.5.69 possible bogosity...

DISCUSSION Ian Molton 2 participants 2 messages May 22, 2003

lore
Share & tools
lore

Ian Molton

author
#0 lore raw

Hi.

Im wondering if this is correct. is the test for initializing in the second for loop correct?

Im building an IDE driver into my kernel that calls ide_register_hw() twice to register its primary and secondary ports, but only the secondary port is recognised. the first fails, since the test in the first for loop fails and so does the second, so it then 'unregisters' it, despite never having been registered. somehow, this puts my drive INTO the hwif array, so the secondary interface registers OK, passing the other tests.

a hack that allowed the primary interface to register was to register it twice, but that sucks.

int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp)

{
        int index, retry = 1;
        ide_hwif_t *hwif;

        do {
                for (index = 0; index < MAX_HWIFS; ++index) {
                        hwif = &ide_hwifs[index];
                        if (hwif->hw.io_ports[IDE_DATA_OFFSET] ==
hw->io_ports[IDE_DATA_OFFSET])
                                goto found;
                }
                for (index = 0; index < MAX_HWIFS; ++index) {
                        hwif = &ide_hwifs[index];

*** is the test for initialising (not the !initialising one) here ok?
***

                    if ((!hwif->present && !hwif->mate && !initializing)
||
                        (!hwif->hw.io_ports[IDE_DATA_OFFSET] &&
initializing))
                                goto found;
                }
                for (index = 0; index < MAX_HWIFS; index++)
                        ide_unregister(index);
        } while (retry--);
#1 lore raw
Quoted 4 lines · Ian Molton

Hi.

Im wondering if this is correct. is the test for initializing in the second for loop correct?

Unfortunately, yes.

Quoted 4 lines

Im building an IDE driver into my kernel that calls ide_register_hw() twice to register its primary and secondary ports, but only the secondary port is recognised. the first fails, since the test in the first for loop fails and so does the second, so it then 'unregisters'

Too little information, your MAX_HWIFS and default io ports?

Quoted 3 lines

it, despite never having been registered. somehow, this puts my drive INTO the hwif array, so the secondary interface registers OK, passing the other tests.

Where is your driver?

Quoted 30 lines

a hack that allowed the primary interface to register was to register it twice, but that sucks.

int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp)

{
        int index, retry = 1;
        ide_hwif_t *hwif;

        do {
                for (index = 0; index < MAX_HWIFS; ++index) {
                        hwif = &ide_hwifs[index];
                        if (hwif->hw.io_ports[IDE_DATA_OFFSET] ==
hw->io_ports[IDE_DATA_OFFSET])
                                goto found;
                }
                for (index = 0; index < MAX_HWIFS; ++index) {
                        hwif = &ide_hwifs[index];

*** is the test for initialising (not the !initialising one) here ok?
***

                    if ((!hwif->present && !hwif->mate && !initializing)
||
                        (!hwif->hw.io_ports[IDE_DATA_OFFSET] &&
initializing))
                                goto found;
                }
                for (index = 0; index < MAX_HWIFS; index++)
                        ide_unregister(index);
        } while (retry--);