* IDE driver in polling mode
@ 2007-04-10 13:35 Michael
2007-04-10 14:19 ` Sergei Shtylyov
0 siblings, 1 reply; 14+ messages in thread
From: Michael @ 2007-04-10 13:35 UTC (permalink / raw)
To: linuxppc-embedded
Hi.
I have a board with MPC8541(PPC PQ3) platform running 2.6.14 Linux.
I'd like to know whether it is possible to use IDE driver (ide-disk)
in polling mode, instead of using IRQ.
In case you wonder - the reason why I need this weired thing is that I
have a compact flash connected directly to the host local bus using
memory mode. It is more-or-less IDE-compatible, except that it doesn't
issue interrupts.
Thanks,
Michael.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 13:35 IDE driver in polling mode Michael
@ 2007-04-10 14:19 ` Sergei Shtylyov
2007-04-10 14:44 ` Mark Lord
2007-04-10 16:11 ` Alan Cox
0 siblings, 2 replies; 14+ messages in thread
From: Sergei Shtylyov @ 2007-04-10 14:19 UTC (permalink / raw)
To: Michael; +Cc: linux-ide, linuxppc-embedded
Hello.
Michael wrote:
> I'd like to know whether it is possible to use IDE driver (ide-disk)
> in polling mode, instead of using IRQ.
I generally wouldn't recommend using this mode since the ATA polling
protocol had been racy for years, WRT to the interrupt pending condition.
> In case you wonder - the reason why I need this weired thing is that I
> have a compact flash connected directly to the host local bus using
> memory mode. It is more-or-less IDE-compatible, except that it doesn't
> issue interrupts.
Ah, no interrupts at all...
The old IDE core in drivers/ide/ certainly doesn't support polling mode
and IRQ-less devices. AFAICS, libata also doesn't support the latter...
MBR, Sergei
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 14:19 ` Sergei Shtylyov
@ 2007-04-10 14:44 ` Mark Lord
2007-04-10 15:31 ` Michael
2007-04-10 16:11 ` Alan Cox
1 sibling, 1 reply; 14+ messages in thread
From: Mark Lord @ 2007-04-10 14:44 UTC (permalink / raw)
To: Michael; +Cc: linux-ide, linuxppc-embedded
> Michael wrote:
>
>> I'd like to know whether it is possible to use IDE driver (ide-disk)
>> in polling mode, instead of using IRQ.
This should be doable, with a small amount of hacking.
Mostly, you just need to use add_timer() to set up a polling
function that simply calls ide_intr() and then does add_timer()
again for the next poll.
For your purposes, it could be as simple as five lines of C.
Cheers
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 14:44 ` Mark Lord
@ 2007-04-10 15:31 ` Michael
0 siblings, 0 replies; 14+ messages in thread
From: Michael @ 2007-04-10 15:31 UTC (permalink / raw)
To: Mark Lord; +Cc: linux-ide, linuxppc-embedded
Thanks, looks like a good plan...
On 4/10/07, Mark Lord <liml@rtr.ca> wrote:
> > Michael wrote:
> >
> >> I'd like to know whether it is possible to use IDE driver (ide-disk)
> >> in polling mode, instead of using IRQ.
>
> This should be doable, with a small amount of hacking.
> Mostly, you just need to use add_timer() to set up a polling
> function that simply calls ide_intr() and then does add_timer()
> again for the next poll.
>
> For your purposes, it could be as simple as five lines of C.
>
> Cheers
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 14:19 ` Sergei Shtylyov
2007-04-10 14:44 ` Mark Lord
@ 2007-04-10 16:11 ` Alan Cox
2007-04-10 16:18 ` Jeff Garzik
1 sibling, 1 reply; 14+ messages in thread
From: Alan Cox @ 2007-04-10 16:11 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: linux-ide, linuxppc-embedded
> Ah, no interrupts at all...
> The old IDE core in drivers/ide/ certainly doesn't support polling mode
> and IRQ-less devices. AFAICS, libata also doesn't support the latter...
libata has much of the framework to do this as it originally did all of
its PIO work much this way. That is probably the most productive place to
start hacking.
Alan
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 16:11 ` Alan Cox
@ 2007-04-10 16:18 ` Jeff Garzik
2007-04-10 16:29 ` Alan Cox
0 siblings, 1 reply; 14+ messages in thread
From: Jeff Garzik @ 2007-04-10 16:18 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-ide, linuxppc-embedded
Alan Cox wrote:
>> Ah, no interrupts at all...
>> The old IDE core in drivers/ide/ certainly doesn't support polling mode
>> and IRQ-less devices. AFAICS, libata also doesn't support the latter...
>
> libata has much of the framework to do this as it originally did all of
> its PIO work much this way. That is probably the most productive place to
> start hacking.
Yep.
The only real restriction in libata is in ata_device_add(), which
unconditionally registers an irq handler. Make a few changes there, add
a few flags, and the existing polling code will kick in.
Once we have higher priority stuff sorted, I would like to look into
things like activating the polling code when it becomes obvious that the
system is not delivering interrupts.
Jeff
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 16:18 ` Jeff Garzik
@ 2007-04-10 16:29 ` Alan Cox
2007-04-11 8:39 ` Michael
0 siblings, 1 reply; 14+ messages in thread
From: Alan Cox @ 2007-04-10 16:29 UTC (permalink / raw)
To: Jeff Garzik; +Cc: linux-ide, linuxppc-embedded
> The only real restriction in libata is in ata_device_add(), which
> unconditionally registers an irq handler. Make a few changes there, add
> a few flags, and the existing polling code will kick in.
Obvious thing to do would be to do this if the IRQ number passed in is 0
rather than aborting as we do now. In theory ISAPnP devices may be
IRQless too.
Alan
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-10 16:29 ` Alan Cox
@ 2007-04-11 8:39 ` Michael
2007-04-11 8:47 ` Alan Cox
0 siblings, 1 reply; 14+ messages in thread
From: Michael @ 2007-04-11 8:39 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-ide, Jeff Garzik, linuxppc-embedded
Doesn't libata have to do with SCSI devices? I'm afraid it wouldn't
work with CF, which is P-ATA compatible.
Wouldn't it work just to call ide_intr() explicitly from some polling
function, as Mark suggested?
Michael
On 4/10/07, Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> > The only real restriction in libata is in ata_device_add(), which
> > unconditionally registers an irq handler. Make a few changes there, add
> > a few flags, and the existing polling code will kick in.
>
> Obvious thing to do would be to do this if the IRQ number passed in is 0
> rather than aborting as we do now. In theory ISAPnP devices may be
> IRQless too.
>
> Alan
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-11 8:39 ` Michael
@ 2007-04-11 8:47 ` Alan Cox
2007-04-11 15:10 ` Michael
2007-04-12 13:43 ` Mark Lord
0 siblings, 2 replies; 14+ messages in thread
From: Alan Cox @ 2007-04-11 8:47 UTC (permalink / raw)
To: Michael; +Cc: linux-ide, Jeff Garzik, linuxppc-embedded
On Wed, 11 Apr 2007 10:39:58 +0200
Michael <michaelzwrk@gmail.com> wrote:
> Doesn't libata have to do with SCSI devices? I'm afraid it wouldn't
> work with CF, which is P-ATA compatible.
libata drives PATA and SATA devices, including CF.
> Wouldn't it work just to call ide_intr() explicitly from some polling
> function, as Mark suggested?
No. See the ATA spec - polling command issue is subtly different.
Alan
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-11 8:47 ` Alan Cox
@ 2007-04-11 15:10 ` Michael
2007-04-11 15:23 ` Alan Cox
2007-04-12 13:39 ` Mark Lord
2007-04-12 13:43 ` Mark Lord
1 sibling, 2 replies; 14+ messages in thread
From: Michael @ 2007-04-11 15:10 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-ide, Jeff Garzik, linuxppc-embedded
I see.
The problem is I am constrained to 2.6.14 kernel.
Is it still correct to say it is P-ATA compatible?
On 4/11/07, Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> On Wed, 11 Apr 2007 10:39:58 +0200
> Michael <michaelzwrk@gmail.com> wrote:
>
> > Doesn't libata have to do with SCSI devices? I'm afraid it wouldn't
> > work with CF, which is P-ATA compatible.
>
> libata drives PATA and SATA devices, including CF.
>
> > Wouldn't it work just to call ide_intr() explicitly from some polling
> > function, as Mark suggested?
>
> No. See the ATA spec - polling command issue is subtly different.
>
> Alan
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-11 15:10 ` Michael
@ 2007-04-11 15:23 ` Alan Cox
2007-04-12 13:39 ` Mark Lord
1 sibling, 0 replies; 14+ messages in thread
From: Alan Cox @ 2007-04-11 15:23 UTC (permalink / raw)
To: Michael; +Cc: linux-ide, Jeff Garzik, linuxppc-embedded
On Wed, 11 Apr 2007 17:10:12 +0200
Michael <michaelzwrk@gmail.com> wrote:
> I see.
> The problem is I am constrained to 2.6.14 kernel.
Make sure you backport any relevant network security fixes in that case.
If you are working to 2.6.14, then your easiest route may be to write a
polling CF driver from scratch. If you only have to support PIO and you
only do ATA not ATAPI then it isn't a large amount of code.
Alan
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-11 15:10 ` Michael
2007-04-11 15:23 ` Alan Cox
@ 2007-04-12 13:39 ` Mark Lord
2007-04-12 13:40 ` Mark Lord
1 sibling, 1 reply; 14+ messages in thread
From: Mark Lord @ 2007-04-12 13:39 UTC (permalink / raw)
To: Michael; +Cc: linux-ide, Jeff Garzik, Alan Cox, linuxppc-embedded
Michael,
Here is a patch to have drivers/ide use polling
for all operations, in addition to IRQs.
Patch is against 2.6.21, but should apply and work equally well
on earlier kernels (including 2.6.14).
This quick hack is *not* for general kernel inclusion.
It works for me. I tested it using a CF card in a PC-CARD adapter.
Signed-off-by: Mark Lord <mlord@pobox.com>
--- 2.6.21/drivers/ide/ide-probe.c 2007-04-11 00:18:51.000000000 -0400
+++ new/drivers/ide/ide-probe.c 2007-04-12 09:26:14.000000000 -0400
@@ -1014,6 +1014,27 @@
* but anything else has led to problems on some machines. We re-enable
* interrupts as much as we can safely do in most places.
*/
+struct timer_list polling_timer;
+static void ide_polling (unsigned long data)
+{
+ ide_hwgroup_t *hwgroup = (void *)data;
+ ide_hwif_t *hwif;
+ int irq = 0;
+
+ if (hwgroup) {
+ hwif = hwgroup->hwif;
+ if (hwif)
+ irq = hwif->irq;
+ }
+
+ ide_intr(irq, hwgroup);
+ init_timer(&polling_timer);
+ polling_timer.expires = jiffies + 1;
+ polling_timer.function = &ide_polling;
+ polling_timer.data = (unsigned long) hwgroup;
+ add_timer(&polling_timer);
+}
+
static int init_irq (ide_hwif_t *hwif)
{
unsigned int index;
@@ -1110,9 +1131,12 @@
if (hwif->io_ports[IDE_CONTROL_OFFSET])
/* clear nIEN */
hwif->OUTB(0x08, hwif->io_ports[IDE_CONTROL_OFFSET]);
-
+#if 0
if (request_irq(hwif->irq,&ide_intr,sa,hwif->name,hwgroup))
goto out_unlink;
+#else
+ ide_polling((unsigned long)hwgroup);
+#endif
}
/*
@@ -1156,6 +1180,7 @@
printk("\n");
up(&ide_cfg_sem);
return 0;
+#if 0
out_unlink:
spin_lock_irq(&ide_lock);
if (hwif->next == hwif) {
@@ -1176,6 +1201,7 @@
BUG_ON(hwgroup->hwif == hwif);
}
spin_unlock_irq(&ide_lock);
+#endif
out_up:
up(&ide_cfg_sem);
return 1;
--- 2.6.21/drivers/ide/ide.c 2007-04-11 00:18:51.000000000 -0400
+++ new/drivers/ide/ide.c 2007-04-12 09:31:59.000000000 -0400
@@ -569,6 +569,8 @@
* This is raving bonkers.
*/
+extern struct timer_list polling_timer;
+
void ide_unregister(unsigned int index)
{
ide_drive_t *drive;
@@ -612,7 +614,11 @@
g = g->next;
} while (g != hwgroup->hwif);
if (irq_count == 1)
+#if 0
free_irq(hwif->irq, hwgroup);
+#else
+ del_timer(&polling_timer);
+#endif
spin_lock_irq(&ide_lock);
/*
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-12 13:39 ` Mark Lord
@ 2007-04-12 13:40 ` Mark Lord
0 siblings, 0 replies; 14+ messages in thread
From: Mark Lord @ 2007-04-12 13:40 UTC (permalink / raw)
To: Michael; +Cc: linux-ide, Jeff Garzik, Alan Cox, linuxppc-embedded
Mark Lord wrote:
> Michael,
>
> Here is a patch to have drivers/ide use polling
> for all operations, in addition to IRQs.
s/in addition to/instead of/
If you need IRQs + polling, then just un-ifdef
the request_irq() and free_irq() lines.
Cheers
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: IDE driver in polling mode
2007-04-11 8:47 ` Alan Cox
2007-04-11 15:10 ` Michael
@ 2007-04-12 13:43 ` Mark Lord
1 sibling, 0 replies; 14+ messages in thread
From: Mark Lord @ 2007-04-12 13:43 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-ide, Jeff Garzik, linuxppc-embedded
Alan Cox wrote:
> Michael <michaelzwrk@gmail.com> wrote:
>
>> Wouldn't it work just to call ide_intr() explicitly from some polling
>> function, as Mark suggested?
>
> No. See the ATA spec - polling command issue is subtly different.
I beg to differ, and have posted a patch to demonstrate it.
Cheers!
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2007-04-12 13:43 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-10 13:35 IDE driver in polling mode Michael
2007-04-10 14:19 ` Sergei Shtylyov
2007-04-10 14:44 ` Mark Lord
2007-04-10 15:31 ` Michael
2007-04-10 16:11 ` Alan Cox
2007-04-10 16:18 ` Jeff Garzik
2007-04-10 16:29 ` Alan Cox
2007-04-11 8:39 ` Michael
2007-04-11 8:47 ` Alan Cox
2007-04-11 15:10 ` Michael
2007-04-11 15:23 ` Alan Cox
2007-04-12 13:39 ` Mark Lord
2007-04-12 13:40 ` Mark Lord
2007-04-12 13:43 ` Mark Lord
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).