* [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
@ 2007-08-04 20:06 Bartlomiej Zolnierkiewicz
2007-08-06 18:14 ` Sergei Shtylyov
0 siblings, 1 reply; 9+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-08-04 20:06 UTC (permalink / raw)
To: linux-ide
* Add ->mdma_filter to ide_hwif_t and use it in ide_get_mode_mask().
* Remove needless setting of drive->using_dma from auide_dma_check().
* Split off auide_mdma_filter() from auide_dma_check().
* Use ide_tune_dma() in auide_dma_check(), this fixes following issues:
- device's DMA capability bit not being checked
- device not being checked against generic DMA blacklist
- transfer mode not being set on device/host
* Add PIO autotune fallback to auide_dma_check().
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
---
drivers/ide/ide-dma.c | 3 +++
drivers/ide/ide.c | 1 +
drivers/ide/mips/au1xxx-ide.c | 36 ++++++++++++++++++++++--------------
include/linux/ide.h | 1 +
4 files changed, 27 insertions(+), 14 deletions(-)
Index: b/drivers/ide/ide-dma.c
===================================================================
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -677,6 +677,9 @@ static unsigned int ide_get_mode_mask(id
case XFER_MW_DMA_0:
if (id->field_valid & 2)
mask = id->dma_mword & hwif->mwdma_mask;
+
+ if (hwif->mdma_filter)
+ mask &= hwif->mdma_filter(drive);
break;
case XFER_SW_DMA_0:
if (id->field_valid & 2) {
Index: b/drivers/ide/ide.c
===================================================================
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -398,6 +398,7 @@ static void ide_hwif_restore(ide_hwif_t
hwif->set_pio_mode = tmp_hwif->set_pio_mode;
hwif->set_dma_mode = tmp_hwif->set_dma_mode;
+ hwif->mdma_filter = tmp_hwif->mdma_filter;
hwif->udma_filter = tmp_hwif->udma_filter;
hwif->selectproc = tmp_hwif->selectproc;
hwif->reset_poll = tmp_hwif->reset_poll;
Index: b/drivers/ide/mips/au1xxx-ide.c
===================================================================
--- a/drivers/ide/mips/au1xxx-ide.c
+++ b/drivers/ide/mips/au1xxx-ide.c
@@ -351,11 +351,18 @@ static int auide_dma_setup(ide_drive_t *
return 0;
}
-static int auide_dma_check(ide_drive_t *drive)
+static u8 auide_mdma_filter(ide_drive_t *drive)
{
- u8 speed = ide_max_dma_mode(drive);
+ /*
+ * FIXME: ->white_list and ->black_list are based on completely bogus
+ * ->ide_dma_check implementation which didn't set neither the host
+ * controller timings nor the device for the desired transfer mode.
+ *
+ * They should be either removed or 0x00 MWDMA mask should be
+ * returned for devices on the ->black_list.
+ */
- if( dbdma_init_done == 0 ){
+ if (dbdma_init_done == 0) {
auide_hwif.white_list = ide_in_drive_list(drive->id,
dma_white_list);
auide_hwif.black_list = ide_in_drive_list(drive->id,
@@ -366,21 +373,20 @@ static int auide_dma_check(ide_drive_t *
}
/* Is the drive in our DMA black list? */
-
- if ( auide_hwif.black_list ) {
- drive->using_dma = 0;
-
- /* Borrowed the warning message from ide-dma.c */
-
+ if (auide_hwif.black_list)
printk(KERN_WARNING "%s: Disabling DMA for %s (blacklisted)\n",
- drive->name, drive->id->model);
- }
- else
- drive->using_dma = 1;
+ drive->name, drive->id->model);
- if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
+ return drive->hwif->mwdma_mask;
+}
+
+static int auide_dma_check(ide_drive_t *drive)
+{
+ if (ide_tune_dma(drive))
return 0;
+ ide_set_max_pio(drive);
+
return -1;
}
@@ -692,6 +698,8 @@ static int au_ide_probe(struct device *d
hwif->dma_off_quietly = &auide_dma_off_quietly;
hwif->dma_timeout = &auide_dma_timeout;
+ hwif->mdma_filter = &auide_mdma_filter;
+
hwif->ide_dma_check = &auide_dma_check;
hwif->dma_exec_cmd = &auide_dma_exec_cmd;
hwif->dma_start = &auide_dma_start;
Index: b/include/linux/ide.h
===================================================================
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -723,6 +723,7 @@ typedef struct hwif_s {
/* driver soft-power interface */
int (*busproc)(ide_drive_t *, int);
#endif
+ u8 (*mdma_filter)(ide_drive_t *);
u8 (*udma_filter)(ide_drive_t *);
void (*ata_input_data)(ide_drive_t *, void *, u32);
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-04 20:06 [PATCH 3/11] au1xxx-ide: use ide_tune_dma() Bartlomiej Zolnierkiewicz
@ 2007-08-06 18:14 ` Sergei Shtylyov
2007-08-08 22:57 ` Bartlomiej Zolnierkiewicz
0 siblings, 1 reply; 9+ messages in thread
From: Sergei Shtylyov @ 2007-08-06 18:14 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: linux-ide
Bartlomiej Zolnierkiewicz wrote:
Good, that's what I lacked for hpt366.c! Were you planning to push it to
Linus soon?
> * Add ->mdma_filter to ide_hwif_t and use it in ide_get_mode_mask().
Hm, why not mwdma_filter()? That "mdma" word has unneeded connotation. ;-)
> * Remove needless setting of drive->using_dma from auide_dma_check().
> * Split off auide_mdma_filter() from auide_dma_check().
> * Use ide_tune_dma() in auide_dma_check(), this fixes following issues:
> - device's DMA capability bit not being checked
> - device not being checked against generic DMA blacklist
> - transfer mode not being set on device/host
> * Add PIO autotune fallback to auide_dma_check().
> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
> Index: b/drivers/ide/mips/au1xxx-ide.c
> ===================================================================
> --- a/drivers/ide/mips/au1xxx-ide.c
> +++ b/drivers/ide/mips/au1xxx-ide.c
> @@ -351,11 +351,18 @@ static int auide_dma_setup(ide_drive_t *
> return 0;
> }
>
> -static int auide_dma_check(ide_drive_t *drive)
> +static u8 auide_mdma_filter(ide_drive_t *drive)
> {
> - u8 speed = ide_max_dma_mode(drive);
> + /*
> + * FIXME: ->white_list and ->black_list are based on completely bogus
> + * ->ide_dma_check implementation which didn't set neither the host
> + * controller timings nor the device for the desired transfer mode.
> + *
> + * They should be either removed or 0x00 MWDMA mask should be
> + * returned for devices on the ->black_list.
> + */
I don't get it -- why then introduce a method that does nothing?
> - if( dbdma_init_done == 0 ){
> + if (dbdma_init_done == 0) {
I wonder what this code is doing here at all...
> auide_hwif.white_list = ide_in_drive_list(drive->id,
> dma_white_list);
> auide_hwif.black_list = ide_in_drive_list(drive->id,
Why the results of the drive list lockup gets tied to auide_hwif? :-O
> @@ -366,21 +373,20 @@ static int auide_dma_check(ide_drive_t *
> }
>
> /* Is the drive in our DMA black list? */
> -
> - if ( auide_hwif.black_list ) {
> - drive->using_dma = 0;
> -
> - /* Borrowed the warning message from ide-dma.c */
> -
> + if (auide_hwif.black_list)
> printk(KERN_WARNING "%s: Disabling DMA for %s (blacklisted)\n",
> - drive->name, drive->id->model);
> - }
> - else
> - drive->using_dma = 1;
> + drive->name, drive->id->model);
*Disabling* it, really? :-O
> - if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
> + return drive->hwif->mwdma_mask;
> +}
> +
> +static int auide_dma_check(ide_drive_t *drive)
> +{
> + if (ide_tune_dma(drive))
> return 0;
>
> + ide_set_max_pio(drive);
> +
> return -1;
> }
MBR, Sergei
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-06 18:14 ` Sergei Shtylyov
@ 2007-08-08 22:57 ` Bartlomiej Zolnierkiewicz
2007-08-10 19:11 ` Sergei Shtylyov
0 siblings, 1 reply; 9+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-08-08 22:57 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: linux-ide
On Monday 06 August 2007, Sergei Shtylyov wrote:
> Bartlomiej Zolnierkiewicz wrote:
>
> Good, that's what I lacked for hpt366.c! Were you planning to push it to
> Linus soon?
Not really but if needed I will extract MWDMA filter part and push it sooner.
> > * Add ->mdma_filter to ide_hwif_t and use it in ide_get_mode_mask().
>
> Hm, why not mwdma_filter()? That "mdma" word has unneeded connotation. ;-)
Ha! As predicted:
->mdma_filter name would make people more ecstatic about the code
;)
> > * Remove needless setting of drive->using_dma from auide_dma_check().
>
> > * Split off auide_mdma_filter() from auide_dma_check().
>
> > * Use ide_tune_dma() in auide_dma_check(), this fixes following issues:
> > - device's DMA capability bit not being checked
> > - device not being checked against generic DMA blacklist
> > - transfer mode not being set on device/host
>
> > * Add PIO autotune fallback to auide_dma_check().
>
> > Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>
> > Index: b/drivers/ide/mips/au1xxx-ide.c
> > ===================================================================
> > --- a/drivers/ide/mips/au1xxx-ide.c
> > +++ b/drivers/ide/mips/au1xxx-ide.c
> > @@ -351,11 +351,18 @@ static int auide_dma_setup(ide_drive_t *
> > return 0;
> > }
> >
> > -static int auide_dma_check(ide_drive_t *drive)
> > +static u8 auide_mdma_filter(ide_drive_t *drive)
> > {
> > - u8 speed = ide_max_dma_mode(drive);
> > + /*
> > + * FIXME: ->white_list and ->black_list are based on completely bogus
> > + * ->ide_dma_check implementation which didn't set neither the host
> > + * controller timings nor the device for the desired transfer mode.
> > + *
> > + * They should be either removed or 0x00 MWDMA mask should be
> > + * returned for devices on the ->black_list.
> > + */
>
> I don't get it -- why then introduce a method that does nothing?
It does something as you've noticed yourself:
> > - if( dbdma_init_done == 0 ){
> > + if (dbdma_init_done == 0) {
>
> I wonder what this code is doing here at all...
>
> > auide_hwif.white_list = ide_in_drive_list(drive->id,
> > dma_white_list);
> > auide_hwif.black_list = ide_in_drive_list(drive->id,
>
> Why the results of the drive list lockup gets tied to auide_hwif? :-O
To use results in auide_ddma_init()... (which needs fixing of course).
The more interesting questions are: WTF is "safe MWDMA" mode (tsize == 1,
devwidth == 16) and whether ->white/black_list is really needed.
I planned to cc: AU1XXX platform maintainers on this patch but to my
surprise MAINTAINERS lacks AU1XXX entry.
Bart
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-08 22:57 ` Bartlomiej Zolnierkiewicz
@ 2007-08-10 19:11 ` Sergei Shtylyov
2007-08-10 21:58 ` Bartlomiej Zolnierkiewicz
0 siblings, 1 reply; 9+ messages in thread
From: Sergei Shtylyov @ 2007-08-10 19:11 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: linux-ide
Bartlomiej Zolnierkiewicz wrote:
>> Good, that's what I lacked for hpt366.c! Were you planning to push it to
>>Linus soon?
> Not really but if needed I will extract MWDMA filter part and push it sooner.
Erm, may I just merge it to my patch (mentioning you of course)?
>>>* Add ->mdma_filter to ide_hwif_t and use it in ide_get_mode_mask().
>> Hm, why not mwdma_filter()? That "mdma" word has unneeded connotation. ;-)
> Ha! As predicted:
> ->mdma_filter name would make people more ecstatic about the code
> ;)
Nice one. 8-)
>>>* Remove needless setting of drive->using_dma from auide_dma_check().
>>>* Split off auide_mdma_filter() from auide_dma_check().
>>>* Use ide_tune_dma() in auide_dma_check(), this fixes following issues:
>>> - device's DMA capability bit not being checked
>>> - device not being checked against generic DMA blacklist
>>> - transfer mode not being set on device/host
>>>* Add PIO autotune fallback to auide_dma_check().
>>>Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
>>>Index: b/drivers/ide/mips/au1xxx-ide.c
>>>===================================================================
>>>--- a/drivers/ide/mips/au1xxx-ide.c
>>>+++ b/drivers/ide/mips/au1xxx-ide.c
>>>@@ -351,11 +351,18 @@ static int auide_dma_setup(ide_drive_t *
>>> return 0;
>>> }
>>>
>>>-static int auide_dma_check(ide_drive_t *drive)
>>>+static u8 auide_mdma_filter(ide_drive_t *drive)
>>> {
>>>- u8 speed = ide_max_dma_mode(drive);
>>>+ /*
>>>+ * FIXME: ->white_list and ->black_list are based on completely bogus
>>>+ * ->ide_dma_check implementation which didn't set neither the host
>>>+ * controller timings nor the device for the desired transfer mode.
>>>+ *
>>>+ * They should be either removed or 0x00 MWDMA mask should be
>>>+ * returned for devices on the ->black_list.
>>>+ */
>> I don't get it -- why then introduce a method that does nothing?
> It does something as you've noticed yourself:
Yeah, I saw that it does something that shouldn't be done there. :-)
The more is the reason to move that method into my recent hpt366 filter patch.
>>>- if( dbdma_init_done == 0 ){
>>>+ if (dbdma_init_done == 0) {
>> I wonder what this code is doing here at all...
>>> auide_hwif.white_list = ide_in_drive_list(drive->id,
>>> dma_white_list);
>>> auide_hwif.black_list = ide_in_drive_list(drive->id,
>> Why the results of the drive list lockup gets tied to auide_hwif? :-O
Yet I was sure I'd typed "lookup". Probably a freudian slip. :-)
> To use results in auide_ddma_init()... (which needs fixing of course).
> The more interesting questions are: WTF is "safe MWDMA" mode (tsize == 1,
> devwidth == 16) and whether ->white/black_list is really needed.
No time to look into the manuals right now...
> I planned to cc: AU1XXX platform maintainers on this patch but to my
> surprise MAINTAINERS lacks AU1XXX entry.
It's been solt out to Raza Microelectronics last year and those guys never
sent a single patch to linux-mips...
> Bart
MBR, Sergei
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-10 19:11 ` Sergei Shtylyov
@ 2007-08-10 21:58 ` Bartlomiej Zolnierkiewicz
2007-08-11 17:00 ` Sergei Shtylyov
2007-08-11 17:01 ` Sergei Shtylyov
0 siblings, 2 replies; 9+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-08-10 21:58 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: linux-ide
On Friday 10 August 2007, Sergei Shtylyov wrote:
> Bartlomiej Zolnierkiewicz wrote:
>
> >> Good, that's what I lacked for hpt366.c! Were you planning to push it to
> >>Linus soon?
>
> > Not really but if needed I will extract MWDMA filter part and push it sooner.
>
> Erm, may I just merge it to my patch (mentioning you of course)?
Sure.
> > I planned to cc: AU1XXX platform maintainers on this patch but to my
> > surprise MAINTAINERS lacks AU1XXX entry.
>
> It's been solt out to Raza Microelectronics last year and those guys never
> sent a single patch to linux-mips...
Thanks for the info.
Bart
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-10 21:58 ` Bartlomiej Zolnierkiewicz
@ 2007-08-11 17:00 ` Sergei Shtylyov
2007-08-11 17:01 ` Sergei Shtylyov
1 sibling, 0 replies; 9+ messages in thread
From: Sergei Shtylyov @ 2007-08-11 17:00 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: linux-ide
Bartlomiej Zolnierkiewicz wrote:
>>>> Good, that's what I lacked for hpt366.c! Were you planning to push it to
>>>>Linus soon?
>>>Not really but if needed I will extract MWDMA filter part and push it sooner.
>> Erm, may I just merge it to my patch (mentioning you of course)?
> Sure.
I guess you want to keep the method's name? :-)
>>>I planned to cc: AU1XXX platform maintainers on this patch but to my
>>>surprise MAINTAINERS lacks AU1XXX entry.
>>
>> It's been solt out to Raza Microelectronics last year and those guys never
>>sent a single patch to linux-mips...
Unfortunately, I don't have direct access to DBAu1200 board (probably
could get a remote though) and ealier Alchemy SoCs (which we have here) don't
have the IDE support.
> Thanks for the info.
> Bart
MBR, Sergei
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-10 21:58 ` Bartlomiej Zolnierkiewicz
2007-08-11 17:00 ` Sergei Shtylyov
@ 2007-08-11 17:01 ` Sergei Shtylyov
2007-08-11 17:10 ` Bartlomiej Zolnierkiewicz
1 sibling, 1 reply; 9+ messages in thread
From: Sergei Shtylyov @ 2007-08-11 17:01 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: linux-ide
Bartlomiej Zolnierkiewicz wrote:
>>>> Good, that's what I lacked for hpt366.c! Were you planning to push it to
>>>>Linus soon?
>>>Not really but if needed I will extract MWDMA filter part and push it sooner.
>> Erm, may I just merge it to my patch (mentioning you of course)?
> Sure.
I guess you want to keep the method's name? :-)
>>>I planned to cc: AU1XXX platform maintainers on this patch but to my
>>>surprise MAINTAINERS lacks AU1XXX entry.
>> It's been solt out to Raza Microelectronics last year and those guys never
>>sent a single patch to linux-mips...
> Thanks for the info.
Unfortunately, I don't have direct access to DBAu1200 board (probably
could get a remote though) and ealier Alchemy SoCs (which we have here) don't
have the IDE support.
> Bart
MBR, Sergei
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-11 17:01 ` Sergei Shtylyov
@ 2007-08-11 17:10 ` Bartlomiej Zolnierkiewicz
2007-08-11 18:52 ` Sergei Shtylyov
0 siblings, 1 reply; 9+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2007-08-11 17:10 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: linux-ide
On Saturday 11 August 2007, you wrote:
> Bartlomiej Zolnierkiewicz wrote:
>
> >>>> Good, that's what I lacked for hpt366.c! Were you planning to push it to
> >>>>Linus soon?
>
> >>>Not really but if needed I will extract MWDMA filter part and push it sooner.
>
> >> Erm, may I just merge it to my patch (mentioning you of course)?
>
> > Sure.
>
> I guess you want to keep the method's name? :-)
Not really, it may be ->mwdma_filter (to keep consistency with ->mwmda_mask).
Bart
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/11] au1xxx-ide: use ide_tune_dma()
2007-08-11 17:10 ` Bartlomiej Zolnierkiewicz
@ 2007-08-11 18:52 ` Sergei Shtylyov
0 siblings, 0 replies; 9+ messages in thread
From: Sergei Shtylyov @ 2007-08-11 18:52 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: linux-ide
Bartlomiej Zolnierkiewicz wrote:
>>>>>> Good, that's what I lacked for hpt366.c! Were you planning to push it to
>>>>>>Linus soon?
>>>>>Not really but if needed I will extract MWDMA filter part and push it sooner.
>>>> Erm, may I just merge it to my patch (mentioning you of course)?
>>>Sure.
>> I guess you want to keep the method's name? :-)
> Not really, it may be ->mwdma_filter (to keep consistency with ->mwmda_mask).
Well, we have asimmetric udma_filter and ultra_mask, so the ecstatic name
seems to be in the same vein. :-)
> Bart
MBR, Sergei
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-08-11 18:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-04 20:06 [PATCH 3/11] au1xxx-ide: use ide_tune_dma() Bartlomiej Zolnierkiewicz
2007-08-06 18:14 ` Sergei Shtylyov
2007-08-08 22:57 ` Bartlomiej Zolnierkiewicz
2007-08-10 19:11 ` Sergei Shtylyov
2007-08-10 21:58 ` Bartlomiej Zolnierkiewicz
2007-08-11 17:00 ` Sergei Shtylyov
2007-08-11 17:01 ` Sergei Shtylyov
2007-08-11 17:10 ` Bartlomiej Zolnierkiewicz
2007-08-11 18:52 ` Sergei Shtylyov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).