From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: "João Ramos" <joao.ramos@inov.pt>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>,
Sergei Shtylyov <sshtylyov@ru.mvista.com>,
linux-ide@vger.kernel.org
Subject: Re: EP93xx PIO IDE driver proposal
Date: Tue, 12 May 2009 18:30:01 +0200 [thread overview]
Message-ID: <200905121830.07023.bzolnier@gmail.com> (raw)
In-Reply-To: <4A099D71.5040703@inov.pt>
On Tuesday 12 May 2009 18:01:53 João Ramos wrote:
> João Ramos escreveu:
> >
> >>
> >> Yes! :)
> >>
> >> There is still a room for improvement though -- it would be better to
> >> fix
> >> IDE core to set PIO0 before probing devices for all host controllers.
> >>
> >> Moreover it seems that doing it this way would allow us to remove
> >> ->init_hwif
> >> method from this driver and do all necessary setup in ep93xx_ide_probe()
> >> (this controller is a single port one so theoretically there
> >> shouldn't be
> >> a need for having per-port ->init_hwif implementation).
> >>
> >
> > So after all this discussion ;-) , my driver will have no 'init_hwif'
> > method, and the setup code will be on 'ep93xx_ide_probe', which will
> > configure entirely the IDE host controller.
> > Moreover, this initial configuration will setup the controller to work
> > at PIO Mode 0. Later on, the 'set_pio_mode' method will be called and
> > the controller will configure itself according to the PIO mode
> > reported by the IDE core.
> >
> > Can I proceed this way?
> >
> >>
> >>> There's just only one issue; normally, I would setup the specific
> >>> timings (t0, t1, t2, t2i, etc) in the 'pio_set_mode' hook. However,
> >>> if you look further in the driver, those timings aren't defined
> >>> through a memory controller but instead manually enforced by
> >>> 'ndelay' calls (arghhh).
> >>> This means that in my low-level procedures for reading and writing,
> >>> I need to have access to the timings (or the struct ide_timing)
> >>> corresponding to the PIO mode selected, in order to use the correct
> >>> delays.
> >>>
> >>> My question is: which is the best way to accomplish this? Declaring
> >>> a global struct ide_timing variable pointer that always holds the
> >>> correct ide_timing struct to the selected PIO mode? Or should I
> >>> always check (in some manner) what is the current PIO mode and then
> >>> select the adequate delays?
> >>>
> >>
> >> I think that the setting variable pointer in ->set_pio_mode method would
> >> work best. Seems like the existing drive_data field of ide_drive_t
> >> is well
> >> suited for this purpose (however it may be worth to convert it to
> >> 'void *'
> >> type while we are it).
> >>
>
> Are you sure I can do this safely?
>
> Using the patch i've sent earlier, I am using the 'drive_data' field
> (now converted to void * type) to store the struct ide_timing pointer
> that holds the adequate timings for the selected PIO mode.
> This is working, and the fix you suggested works, but sometimes I get a
> null pointer dereference I can't seem to figure why.
> As I needed to define low-level read/write procedures, I've defined the
> entire ide_tp_ops structure with my own provided methods.
> For the tf_load, tf_read, input_data and output_data methods, the fix is
> easy since I have an ide_drive_t structure pointer as a parameter, so I
> access the timing structure using:
>
> struct ide_timing *t = (struct ide_timing *) ide_get_drivedata(drive);
>
> However, for the remaining methods (exec_command, read_status,
> read_altstatus, write_devctl and dev_select), I only have access to an
> ide_hwif_t pointer, so in order to get access to the containing
> ide_drive_t and then to the struct ide_timing pointer stored before, I do:
>
> ide_drive_t *drive = (ide_drive_t *) container_of(&hwif, ide_drive_t, hwif);
This doesn't look correct.
> struct ide_timing *t = (struct ide_timing *) ide_get_drivedata(drive);
>
> And this seems to work, however at some point, after a while I get a
> kernel Oops pointing out a null pointer dereference.
>
> Can someone help me here?
> Is there a better way to retrieve the ide_drive_t pointer from the
> ide_hwif_t structure?
hwif->devices[0] / hwif->devices[1]
However, I see the problem -- we need timing data also for command PIO.
Sergei, seems like we should just stuff pointer to command PIO timings
(which would be maximum PIO supported by both devices on the port) into
hwif->hwif_data and use it everywhere except ->*put_data methods?
Or maybe there is some better way to do it?
Thanks,
Bart
next prev parent reply other threads:[~2009-05-12 16:31 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <49CCD7C4.8000207@inov.pt>
[not found] ` <49CFDD8F.1030306@bluewatersys.com>
[not found] ` <BD79186B4FD85F4B8E60E381CAEE1909014E2E09@mi8nycmail19.Mi8.com>
[not found] ` <49D0CAE4.9090306@inov.pt>
2009-03-30 15:34 ` EP93xx PIO IDE driver proposal Sergei Shtylyov
2009-05-04 11:24 ` João Ramos
2009-05-05 12:04 ` Sergei Shtylyov
2009-05-06 14:17 ` João Ramos
2009-05-06 17:05 ` Sergei Shtylyov
2009-05-07 9:36 ` João Ramos
2009-05-07 11:01 ` João Ramos
2009-05-07 13:53 ` Alan Cox
2009-05-07 15:33 ` João Ramos
2009-05-08 12:04 ` Bartlomiej Zolnierkiewicz
2009-05-08 12:16 ` João Ramos
2009-05-08 12:40 ` Bartlomiej Zolnierkiewicz
2009-05-08 13:30 ` Sergei Shtylyov
2009-05-08 14:09 ` Bartlomiej Zolnierkiewicz
2009-05-08 17:28 ` João Ramos
2009-05-08 18:02 ` Bartlomiej Zolnierkiewicz
2009-05-08 18:16 ` João Ramos
2009-05-08 18:55 ` Bartlomiej Zolnierkiewicz
2009-05-08 20:24 ` joao.ramos
2009-05-08 21:01 ` Sergei Shtylyov
2009-05-08 22:07 ` Bartlomiej Zolnierkiewicz
2009-05-11 11:10 ` João Ramos
2009-05-12 16:49 ` Sergei Shtylyov
2009-05-12 17:23 ` Bartlomiej Zolnierkiewicz
2009-05-13 11:01 ` João Ramos
2009-05-17 15:20 ` Bartlomiej Zolnierkiewicz
2009-05-22 17:52 ` Sergei Shtylyov
2009-05-13 14:18 ` João Ramos
2009-05-14 19:44 ` Bartlomiej Zolnierkiewicz
2009-05-15 17:01 ` João Ramos
2009-05-17 16:16 ` Bartlomiej Zolnierkiewicz
2009-05-18 13:49 ` João Ramos
2009-05-19 13:06 ` Bartlomiej Zolnierkiewicz
2009-05-19 13:20 ` João Ramos
2009-05-19 13:56 ` Bartlomiej Zolnierkiewicz
2009-05-19 14:05 ` João Ramos
2009-05-19 15:50 ` João Ramos
2009-06-06 15:26 ` Sergei Shtylyov
2009-06-22 10:01 ` Bartlomiej Zolnierkiewicz
2009-05-14 16:30 ` Sergei Shtylyov
2009-05-14 16:36 ` Sergei Shtylyov
2009-05-14 18:58 ` Bartlomiej Zolnierkiewicz
2009-05-11 13:20 ` João Ramos
2009-05-12 16:41 ` Bartlomiej Zolnierkiewicz
2009-05-12 16:57 ` Sergei Shtylyov
2009-05-12 16:01 ` João Ramos
2009-05-12 16:30 ` Bartlomiej Zolnierkiewicz [this message]
2009-05-12 16:45 ` João Ramos
2009-05-07 16:52 ` H Hartley Sweeten
2009-05-07 22:09 ` Ryan Mallon
2009-05-07 22:31 ` H Hartley Sweeten
2009-05-07 22:51 ` Ryan Mallon
2009-05-07 23:01 ` H Hartley Sweeten
2009-05-07 23:12 ` Ryan Mallon
2009-05-07 23:32 ` João Ramos
2009-05-07 23:58 ` H Hartley Sweeten
2009-05-08 11:23 ` Sergei Shtylyov
2009-05-08 12:47 ` João Ramos
[not found] ` <49D12669.4030207@bluewatersys.com>
2009-03-31 10:36 ` Sergei Shtylyov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200905121830.07023.bzolnier@gmail.com \
--to=bzolnier@gmail.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=joao.ramos@inov.pt \
--cc=linux-ide@vger.kernel.org \
--cc=sshtylyov@ru.mvista.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).