Hi,
On Saturday 10 March 2007, Sergei Shtylyov wrote:
> Hello.
>
> Bartlomiej Zolnierkiewicz wrote:
> > [PATCH] sl82c105: add ->speedproc support
>
> > * add sl82c105_tunepio() wrapper for sl82c105_tune_drive()
> > (just to get the error value)
>
> > * add sl82c105_tune_chipset() (->speedproc method) for setting
> > transfer mode
>
> Thanks for the patch!
>
> > Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
> > ---
>
> > Index: b/drivers/ide/pci/sl82c105.c
> > ===================================================================
> > --- a/drivers/ide/pci/sl82c105.c
> > +++ b/drivers/ide/pci/sl82c105.c
> > @@ -77,7 +77,7 @@ static unsigned int get_timing_sl82c105(
> > /*
> > * Configure the drive and chipset for PIO
> > */
> > -static void sl82c105_tune_drive(ide_drive_t *drive, u8 pio)
> > +static int sl82c105_tunepio(ide_drive_t *drive, u8 pio)
>
> The name sl82c105_tune_pio() would have been more in line with the other
> drivers but well, that's your patch (and the function behaves somewhat
> differently anyway :-)
I will change it.
> > {
> > ide_hwif_t *hwif = HWIF(drive);
> > struct pci_dev *dev = hwif->pci_dev;
> > @@ -91,7 +91,7 @@ static void sl82c105_tune_drive(ide_driv
> > xfer_mode = ide_get_best_pio_mode(drive, pio, 5, &p) + XFER_PIO_0;
> >
> > if (ide_config_drive_speed(drive, xfer_mode))
> > - return;
> > + return 1;
> >
> > drive->drive_data = drv_ctrl = get_timing_sl82c105(&p);
> >
> > @@ -114,17 +114,45 @@ static void sl82c105_tune_drive(ide_driv
> > */
> > drive->io_32bit = 1;
> > drive->unmask = 1;
> > +
> > + return 0;
> > +}
> > +
> > +static void sl82c105_tune_drive(ide_drive_t *drive, u8 pio)
> > +{
> > + /*
> > + * TODO: find best PIO mode and set device speed here
> > + * (requires adding helper function for getting PIO cycle time)
> > + */
>
> I thought we were doing it by calling ide_get_best_pio_mode() above...
We are also using ide_get_best_pio_mode() to get PIO cycle time
so we can't move it here ATM.
> > + (void)sl82c105_tunepio(drive, pio);
>
> Erm, I thought afterwards that I vainly folded one into another. I think
> it's worth moving those io_32bit and unmask flag assignments above back
> there... May also recast my patch. :-)
Moving them to ->init_hwif where they belong would be even better... ;-)
> > +}
> > +
> > +static int sl82c105_tune_chipset(ide_drive_t *drive, u8 mode)
> > +{
> > + mode = ide_rate_filter(drive, mode);
> > +
> > + if (mode >= XFER_PIO_0 && mode <= XFER_PIO_5)
> > + return sl82c105_tunepio(drive, mode - XFER_PIO_0);
> > +
> > + /*
> > + * TODO: add MWDMA0/1 support
> > + */
> > + BUG_ON(mode != XFER_MW_DMA_2);
>
> Well, the other drivers just return non-zero in this case...
They are are buggy and need fixing.
IDE driver itself should never ask for an unsupported mode and if user passes
such through ->speedproc interface OOPSing is IMO better than possible data
corruption. On the second thought ide_rate_filter() takes care of filtering
UDMA modes, so it may as well take care of filtering SWDMA/MWDMA/PIO and the
problem will be solved in more gracefull way... but more work is needed...
Thanks,
Bart
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html