Changeset 116


Ignore:
Timestamp:
Mar 26, 2010, 12:01:39 PM (5 years ago)
Author:
stepan
Message:

improve IDE error handling

Signed-off-by: Stefan Reinauer <stepan@…>

Location:
trunk/filo
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/filo/drivers/ide_new.c

    r103 r116  
    44 *   Copyright (C) 2004 Jens Axboe <axboe@suse.de>
    55 *   Copyright (C) 2005 Stefan Reinauer <stepan@openbios.org>
    6  *   Copyright (C) 2009 coresystems GmbH
     6 *   Copyright (C) 2009-2010 coresystems GmbH
    77 *
    88 *   Credit goes to Hale Landis for his excellent ata demo software
     
    165165                stat = ob_ide_pio_readb(drive, IDEREG_STATUS);
    166166
    167         printf("ob_ide_error drive<%d>: %s:\n", drive->nr, msg);
    168         printf("    cmd=%x, stat=%x", chan->ata_cmd.command, stat);
     167        debug("ob_ide_error ");
     168        printf("drive<%d>: %s:\n", drive->nr, msg);
     169        debug("    cmd=%x, stat=%x", chan->ata_cmd.command, stat);
    169170
    170171        if ((stat & (BUSY_STAT | ERR_STAT)) == ERR_STAT) {
    171172                err = ob_ide_pio_readb(drive, IDEREG_ERROR);
    172                 printf(", err=%x", err);
    173         }
    174         printf("\n");
     173                debug(", err=%x", err);
     174        }
     175        debug("\n");
    175176
    176177        /*
     
    184185                        old_cdb = cmd->old_cdb;
    185186
    186                         printf("    atapi opcode=%02x", old_cdb);
     187                        debug("    atapi opcode=%02x", old_cdb);
    187188                } else {
    188189                        int i;
    189190
    190                         printf("    cdb: ");
     191                        debug("    cdb: ");
    191192                        for (i = 0; i < sizeof(cmd->cdb); i++)
    192                                 printf("%02x ", cmd->cdb[i]);
     193                                debug("%02x ", cmd->cdb[i]);
    193194                }
    194195                if (cmd->sense_valid)
    195                         printf(", sense: %02x/%02x/%02x", cmd->sense.sense_key, cmd->sense.asc, cmd->sense.ascq);
     196                        debug(", sense: %02x/%02x/%02x", cmd->sense.sense_key, cmd->sense.asc, cmd->sense.ascq);
    196197                else
    197                         printf(", no sense");
    198                 printf("\n");
     198                        debug(", no sense");
     199                debug("\n");
    199200        }
    200201}
     
    568569                 * ... except 'medium not present'
    569570                 */
    570                 if (cmd->sense.asc == 0x3a)
    571                         break;
    572 
    573                 udelay(1000000);
     571                if (cmd->sense.asc == 0x3a) {
     572                        /* 'medium not present' is not an error */
     573                        ret = 0;
     574                        /* force reevaluation */
     575                        drive->channel->present = 0;
     576                        break;
     577                }
     578
     579                mdelay(1000);
    574580        } while (retries--);
    575581
     
    614620        struct atapi_command *cmd = &drive->channel->atapi_cmd;
    615621        struct atapi_capacity cap;
     622        int i;
    616623
    617624        /*
    618625         * Test Unit Ready is like a ping
    619          */
     626         * But wait a bit, as the drive might take a while
     627         */
     628        i = 30;
     629        while (i-- != 0) {
     630                memset(cmd, 0, sizeof(*cmd));
     631                cmd->cdb[0] = ATAPI_TUR;
     632
     633                if (!ob_ide_atapi_packet(drive,cmd)) break;
     634
     635                /* Give the drive some time to breathe */
     636                mdelay(500);
     637        }
     638
    620639        memset(cmd, 0, sizeof(*cmd));
    621640        cmd->cdb[0] = ATAPI_TUR;
     
    672691
    673692        if (ob_ide_atapi_drive_ready(drive))
    674                 return 1;
     693                return RETURN_NO_MEDIUM;
    675694
    676695        if (drive->bs == 2048) {
     
    11501169                                continue;
    11511170
    1152                         if (val == 0xac8f104c) {
     1171                        // skip TI bridges on Rocky (ac8f) and Getac (803b)
     1172                        // There must be a better way to do this...
     1173                        if (val == 0xac8f104c || val == 0x803b104c) {
    11531174                                debug("Skipping TI bridge\n");
    11541175                                continue;
  • trunk/filo/drivers/ide_new.h

    r103 r116  
    44#include <arch/io.h>
    55#include "hdreg.h"
     6
     7/*
     8 * Return values
     9 */
     10
     11#define RETURN_OK               0x00
     12#define RETURN_ERROR            0x01
     13#define RETURN_NO_MEDIUM        0x02
    614
    715/*
  • trunk/filo/fs/blockdev.c

    r103 r116  
    395395                {
    396396                        int count = (NUM_CACHE-hash>8)?8:(NUM_CACHE-hash);
    397                         if (ide_read_blocks(dev_drive, sector, count, buf) != 0)
     397                        int ret;
     398                        ret = ide_read_blocks(dev_drive, sector, count, buf);
     399                        if (ret == 2)
     400                                goto nomedium;
     401                        if (ret != 0)
    398402                                goto readerr;
    399403                        while (--count>0) {
     
    440444        printf("Disk read error dev=%d drive=%d sector=%lu\n",
    441445               dev_type, dev_drive, sector);
     446        flush_cache();
     447        dev_name[0] = '\0';     /* force re-open the device next time */
     448        return 0;
     449      nomedium:
     450        printf("No disk in drive.\n");
     451        flush_cache();
    442452        dev_name[0] = '\0';     /* force re-open the device next time */
    443453        return 0;
Note: See TracChangeset for help on using the changeset viewer.