All of lore.kernel.org
 help / color / mirror / Atom feed
From: Karl Hiramoto <karl@hiramoto.org>
To: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>,
	linux-ide@vger.kernel.org
Subject: Re: [RFC]hpt366/ide-probe  reset drive on probe error.
Date: Sat, 09 May 2009 14:09:05 +0200	[thread overview]
Message-ID: <4A057261.3090404@hiramoto.org> (raw)
In-Reply-To: <4A044C25.6010709@ru.mvista.com>

Sergei Shtylyov wrote:
> Hello, I wrote:
>
>>>> +
>>>> +    reset = hwif->channel ? 0x80 : 0x40;
>
>>    These HighPoint's "soft reset" (WTF does that mean I wonder?) bits 
>> are not the same between HPT366 and HPT370, so this code doesn't look 
>> right...
>
>    Ah, these "soft" reset bits correspond to PRST_/SRST_ signals which 
> are really primary/secondary channel hard resets (RESET- signal). This 
> explains everything; and this patch is a pure hack then.
>
>>>> +
>>>> +    pci_read_config_byte(dev, 0x59, &reg59h);
>>>> +    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);
>
>>    Karl, why are you calling resetproc() without doing a reset? What 
>> this achieves?
>
>    To reset the drives, apparently. But it's not the function of 
> resetproc(). We should try soft-reset instead.
>
Yes, to reset the drive that does not respond.

>>>> +            }
>>>> +            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
>
>>    I would first like to hear an explanation of what it does...
>
>    I have to NAK this resetproc() addition. It tries to do things that 
> it's not designed to do. We should instead try soft-resetting the 
> channel...

Where should the soft reset be done, for this to not be called a hack?   
should it be in ide_port_ops->reset_poll?
>
>>> Care to revise your patch?
>
>    I see no point in "revising" this hack now...

Why not reset the drive if it does not respond?  OK, you could blame 
this on a bugy board, or redboot that does not reset the drive on warm 
boot if it is busy.


--
Karl

  reply	other threads:[~2009-05-09 12:09 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
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 [this message]
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=4A057261.3090404@hiramoto.org \
    --to=karl@hiramoto.org \
    --cc=bzolnier@gmail.com \
    --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.