lkml.org 
[lkml]   [2006]   [Sep]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] libata: improve handling of diagostic fail (and hardware that misreports it)
    From
    Date

    Our ATA probe code checks that a device is not reporting a diagnostic
    failure during start up. Unfortunately at least one device seems to like
    doing this - the Gigabyte iRAM.

    This is only done for the master right now (which is fine for the iRAM
    as it is SATA), as with PATA some combinations of ATAPI device seem to
    fool the check into seeing a drive that isn't there if it is applied to
    the slave.

    Please review

    Signed-off-by: Alan Cox <alan@redhat.com>

    diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.18-rc6-mm1/drivers/ata/libata-core.c linux-2.6.18-rc6-mm1/drivers/ata/libata-core.c
    --- linux.vanilla-2.6.18-rc6-mm1/drivers/ata/libata-core.c 2006-09-11 17:00:08.000000000 +0100
    +++ linux-2.6.18-rc6-mm1/drivers/ata/libata-core.c 2006-09-12 11:18:34.000000000 +0100
    @@ -616,8 +616,11 @@
    if (r_err)
    *r_err = err;

    - /* see if device passed diags */
    - if (err == 1)
    + /* see if device passed diags: if master then continue and warn later */
    + if (err == 0 && device == 0)
    + /* diagnostic fail : do nothing _YET_ */
    + ap->device[device].horkage |= ATA_HORKAGE_DIAGNOSTIC;
    + else if(err == 1)
    /* do nothing */ ;
    else if ((device == 0) && (err == 0x81))
    /* do nothing */ ;
    @@ -1523,6 +1526,18 @@
    cdb_intr_string);
    }

    + if (dev->horkage & ATA_HORKAGE_DIAGNOSTIC) {
    + /* Let the user know. We don't want to disallow opens for
    + rescue purposes, or in case the vendor is just a blithering
    + idiot */
    + if (print_info) {
    + ata_dev_printk(dev, KERN_WARNING,
    +"Drive reports diagnostics failure. This may indicate a drive\n");
    + ata_dev_printk(dev, KERN_WARNING,
    +"fault or invalid emulation. Contact drive vendor for information.\n");
    + }
    + }
    +
    ata_set_port_max_cmd_len(ap);

    /* limit bridge transfers to udma5, 200 sectors */
    diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.18-rc6-mm1/include/linux/libata.h linux-2.6.18-rc6-mm1/include/linux/libata.h
    --- linux.vanilla-2.6.18-rc6-mm1/include/linux/libata.h 2006-09-11 17:00:24.000000000 +0100
    +++ linux-2.6.18-rc6-mm1/include/linux/libata.h 2006-09-11 17:21:16.000000000 +0100
    @@ -289,6 +289,11 @@
    * most devices.
    */
    ATA_SPINUP_WAIT = 8000,
    +
    + /* Horkage types. May be set by libata or controller on drives
    + (some horkage may be drive/controller pair dependant */
    +
    + ATA_HORKAGE_DIAGNOSTIC = 1, /* Failed boot diag */
    };

    enum hsm_task_states {
    @@ -469,6 +474,7 @@

    /* error history */
    struct ata_ering ering;
    + unsigned int horkage; /* List of broken features */
    };

    /* Offset into struct ata_device. Fields above it are maintained
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-09-12 19:17    [W:0.036 / U:89.996 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site