Crash in IDE code
Forwarded SuSE Mail
suse at linux-ide.org
Sun Jul 9 13:57:43 EST 2000
Thanks Geert,
We both know that I should have known better.
Regardless if PPC has an issue, you will.
This I need to flag this better.
This adds a whole new wrinkle in the total rework of the TASK commands.
Cheers,
Andre Hedrick
The Linux ATA/IDE guy
On 8 Jul 2000, Geert Uytterhoeven wrote:
> On Sat, 8 Jul 2000, Michel Lanners wrote:
> > I've taken the time to disassemble the code part where it crashes. It's
> > in drivers/ide/ide.c, in this code inlined from ide_intr():
> >
> > static inline int drive_is_ready (ide_drive_t *drive)
> > {
> > if (drive->waiting_for_dma)
> > return HWIF(drive)->dmaproc(ide_dma_test_irq, drive);
> > #if 0
> > udelay(1); /* need to guarantee 400ns since last command was issued */
> > #endif
> > // if (GET_STAT() & BUSY_STAT) /* Note: this may clear a pending IRQ!! */
> > if (IN_BYTE(IDE_ALTSTATUS_REG) & BUSY_STAT)
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^
> >
> > return 0; /* drive busy: definitely not interrupting */
> > return 1; /* drive ready: *might* be interrupting */
> > }
> >
> > The crashing part is marked above; it's the IN_BYTE which tries to read
> > from addr. 0 :-(
> >
> > Above code translates to this:
> >
> > IN_BYTE( (((ide_hwif_t *)((drive)->hwif))->io_ports[IDE_CONTROL_OFFSET]) )
>
> Yep, ALTSTATUS == CONTROL
>
> > So, io_ports[IDE_CONTROL_OFFSET] is obviously zero; it's suposed to be
> > in GPR11 in the oops above. One point where it is explicitly set to zero
> > is in ide_pmac.c:
> >
> > if (ix >= MAX_HWIFS) {
> > /* Probably a PCI interface... */
> > for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; ++i)
> > hw->io_ports[i] = data_port + i - IDE_DATA_OFFSET;
> > /* XXX is this right? */
> > hw->io_ports[IDE_CONTROL_OFFSET] = 0;
> >
> > So, question is: is it right to zero hw->io_ports[IDE_CONTROL_OFFSET]?
> > Should I compile without PMac IDE support, since my box has no 'native'
> > IDE? Or should the test above in drive_is_ready() be protected against a
> > NULL pointer, like most other occurences are?
>
> It's indeed true that some hardware doesn't have the CONTROL/ALTSTATUS
> register. I don't know about the PowerMac, but I know about the Amiga
> IDE-doublers[*]. So there _must_ be a test for a non-zero register offset
> prior to the usage of CONTROL/ALTSTATUS. Hence this is a bug.
>
> Gr{oetje,eeting}s,
>
> Geert
>
> [*] IDE-doublers are actually something that can be used on most IDE
> interfaces. IDE defines 2 banks of 8 registers to access the drive. From
> the second bank, only one register is actually used (CONTROL/ALTSTATUS).
> Since CONTROL/ALTSTATUS is not vital to the functionality of the IDE
> interface, the second bank of registers can be sacrificed and one IDE chain
> that supports 2 devices can be `split' into 2 chains supporting 2x2 devices
> using only a few diodes (schematic available on request). Then accessing
> the first bank of registers will still access the first bank of registers
> on the first chain, while accessing the second bank of registers will
> access the first bank of registers on the second chain.
> Driver: see the IDE-doubler option in drivers/ide/gayle.c.
> --
> Geert Uytterhoeven -- Linux/{m68k~Amiga,PPC~CHRP} -- geert at linux-m68k.org
>
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
> -- Linus Torvalds
>
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-dev
mailing list