From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
To: Karl Hiramoto <karl@hiramoto.org>
Cc: linux-ide@vger.kernel.org, Sergei Shtylyov <sshtylyov@ru.mvista.com>
Subject: Re: [RFC]hpt366/ide-probe reset drive on probe error.
Date: Fri, 8 May 2009 15:57:19 +0200 [thread overview]
Message-ID: <200905081557.20733.bzolnier@gmail.com> (raw)
In-Reply-To: <200905081550.11297.bzolnier@gmail.com>
On Friday 08 May 2009 15:50:11 Bartlomiej Zolnierkiewicz wrote:
>
> On Tuesday 05 May 2009 16:53:31 Karl Hiramoto wrote:
> > Hi,
> >
> > Part of this patch (htp366.c) is commented in an #if 0 in older
> > kernels. 2.6.11 for sure.
> >
> > I have an ARM IXP4xx based board with CompactFlash slot that this patch
> > fixes some issues for. I think the case, is only with a warm boot,
> > where the drive was busy before the board was reset. There is no
> > BIOS, only the redboot loader which loads the kernel.
> >
> >
> > A few questions:
> >
> > 1. Would this be considerd to be brought into mainline?
>
> When it comes to ide-probe.c changes: yes given that you split them on
> smaller patches. hpt366.c change also seems to be correct on the first
> glance but I think that Sergei's opinion would be more suited here.
>
> > 2. How would you port something like this to using the SATA layer?
> >
> > Would it go to the ata_port_operations.prereset, softreset or hardreset?
> >
> > --
> > Karl
> >
> > diff --git a/drivers/ide/hpt366.c b/drivers/ide/hpt366.c
> > index 3377766..ba4b802 100644
> > --- a/drivers/ide/hpt366.c
> > +++ b/drivers/ide/hpt366.c
> > @@ -1280,6 +1280,31 @@ static u8 hpt3xx_cable_detect(ide_hwif_t *hwif)
> > return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80;
> > }
> >
> > +/** routine to reset disk
> > + *
> > + * Since SUN Cobalt is attempting to do this operation, I should disclose
> > + * this has been a long time ago Thu Jul 27 16:40:57 2000 was the patch date
> > + * HOTSWAP ATA Infrastructure.
> > + */
> > +
> > +static void hpt3xx_reset (ide_drive_t *drive)
> > +{
> > + ide_hwif_t *hwif = drive->hwif;
> > + struct pci_dev *dev = to_pci_dev(hwif->dev);
> > + unsigned long high_16;
> > + u8 reset;
> > + u8 reg59h = 0;
> > +
> > + printk(KERN_INFO "%s reset drive channel %d\n", __func__, hwif->channel);
> > + high_16 = pci_resource_start(dev, 4);
> > +
> > + reset = hwif->channel ? 0x80 : 0x40;
> > +
> > + pci_read_config_byte(dev, 0x59, ®59h);
> > + pci_write_config_byte(dev, 0x59, reg59h|reset);
> > + pci_write_config_byte(dev, 0x59, reg59h);
> > +}
> > +
> > static void __devinit init_hwif_hpt366(ide_hwif_t *hwif)
> > {
> > struct hpt_info *info = hpt3xx_get_info(hwif->dev);
> > @@ -1406,6 +1431,7 @@ static const struct ide_port_ops hpt3xx_port_ops = {
> > .set_pio_mode = hpt3xx_set_pio_mode,
> > .set_dma_mode = hpt3xx_set_mode,
> > .quirkproc = hpt3xx_quirkproc,
> > + .resetproc = hpt3xx_reset,
> > .maskproc = hpt3xx_maskproc,
> > .mdma_filter = hpt3xx_mdma_filter,
> > .udma_filter = hpt3xx_udma_filter,
> > diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
> > index 7f264ed..09295b4 100644
> > --- a/drivers/ide/ide-probe.c
> > +++ b/drivers/ide/ide-probe.c
> > @@ -367,6 +367,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
> > {
> > ide_hwif_t *hwif = drive->hwif;
> > const struct ide_tp_ops *tp_ops = hwif->tp_ops;
> > + const struct ide_port_ops *port_ops = hwif->port_ops;
> > u16 *id = drive->id;
> > int rc;
> > u8 present = !!(drive->dev_flags & IDE_DFLAG_PRESENT), stat;
> > @@ -427,9 +428,20 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
> > /* ensure drive IRQ is clear */
> > stat = tp_ops->read_status(hwif);
> >
> > - if (rc == 1)
> > + if (rc == 1) {
> > printk(KERN_ERR "%s: no response (status = 0x%02x)\n",
> > drive->name, stat);
> > +
> > + if (port_ops->resetproc) {
> > + port_ops->resetproc(drive);
> > + msleep(50);
> > + }
> > + tp_ops->dev_select(drive);
> > + msleep(50);
> > + tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
> > + (void)ide_busy_sleep(hwif, WAIT_WORSTCASE, 0);
> > + rc = ide_dev_read_id(drive, cmd, id);
> > + }
> > } else {
> > /* not present or maybe ATAPI */
> > rc = 3;
>
> Since the current code in ide-probe.c looks like this:
>
> stat = tp_ops->read_status(hwif);
>
> if (stat == (ATA_BUSY | ATA_DRDY))
> return 4;
>
> if (rc == 1 && cmd == ATA_CMD_ID_ATAPI) {
> printk(KERN_ERR "%s: no response (status = 0x%02x), "
> "resetting drive\n", drive->name, stat);
> msleep(50);
> tp_ops->dev_select(drive);
> msleep(50);
> tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
> (void)ide_busy_sleep(hwif, WAIT_WORSTCASE, 0);
> rc = ide_dev_read_id(drive, cmd, id);
> }
>
> /* ensure drive IRQ is clear */
> stat = tp_ops->read_status(hwif);
>
> if (rc == 1)
> printk(KERN_ERR "%s: no response (status = 0x%02x)\n",
> drive->name, stat);
>
> I would really prefer fixing ATAPI case while we are at it
> (+ this would also get rid of code duplication).
>
> IOW:
>
> - in patch #1 we would add ->resetproc call
>
> - in patch #2 we would remove 'cmd == ATA_CMD_ID_ATAPI' check
[ looking a bit closer at the code in ide-probe.c ]
- in patch #2 we would move the ATAPI check to cover device selection/reset
inside 'if ()' block
next prev parent reply other threads:[~2009-05-08 13:53 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-05 14:53 [RFC]hpt366/ide-probe reset drive on probe error Karl Hiramoto
2009-05-08 13:50 ` Bartlomiej Zolnierkiewicz
2009-05-08 13:57 ` Bartlomiej Zolnierkiewicz [this message]
2009-05-08 14:07 ` Bartlomiej Zolnierkiewicz
2009-05-08 15:29 ` Sergei Shtylyov
2009-05-08 14:57 ` Sergei Shtylyov
2009-05-08 15:13 ` Sergei Shtylyov
2009-05-09 12:09 ` Karl Hiramoto
2009-05-09 16:07 ` Bartlomiej Zolnierkiewicz
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=200905081557.20733.bzolnier@gmail.com \
--to=bzolnier@gmail.com \
--cc=karl@hiramoto.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.