Changeset e682af1 in mainline for uspace/srv/bd/ata_bd/ata_bd.c


Ignore:
Timestamp:
2011-01-02T21:23:21Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1caeb2d
Parents:
f418e51 (diff), e092dc5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge ATA driver improvements.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/ata_bd/ata_bd.c

    rf418e51 re682af1  
    6565#include <macros.h>
    6666
     67#include "ata_hw.h"
    6768#include "ata_bd.h"
    6869
     
    7071#define NAMESPACE  "bd"
    7172
     73/** Number of defined legacy controller base addresses. */
     74#define LEGACY_CTLS 4
     75
    7276/** Physical block size. Should be always 512. */
    7377static const size_t block_size = 512;
     
    7781
    7882/** I/O base address of the command registers. */
    79 static uintptr_t cmd_physical = 0x1f0;
     83static uintptr_t cmd_physical;
    8084/** I/O base address of the control registers. */
    81 static uintptr_t ctl_physical = 0x170;
     85static uintptr_t ctl_physical;
     86
     87/** I/O base addresses for legacy (ISA-compatible) controllers. */
     88static ata_base_t legacy_base[LEGACY_CTLS] = {
     89        { 0x1f0, 0x3f0 },
     90        { 0x170, 0x370 },
     91        { 0x1e8, 0x3e8 },
     92        { 0x168, 0x368 }
     93};
    8294
    8395static ata_cmd_t *cmd;
     
    8799static disk_t disk[MAX_DISKS];
    88100
     101static void print_syntax(void);
    89102static int ata_bd_init(void);
    90103static void ata_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
     
    110123        int i, rc;
    111124        int n_disks;
     125        unsigned ctl_num;
     126        char *eptr;
    112127
    113128        printf(NAME ": ATA disk driver\n");
    114129
    115         printf("I/O address %p/%p\n", (void *) ctl_physical,
    116             (void *) cmd_physical);
     130        if (argc > 1) {
     131                ctl_num = strtoul(argv[1], &eptr, 0);
     132                if (*eptr != '\0' || ctl_num == 0 || ctl_num > 4) {
     133                        printf("Invalid argument.\n");
     134                        print_syntax();
     135                        return -1;
     136                }
     137        } else {
     138                ctl_num = 1;
     139        }
     140
     141        cmd_physical = legacy_base[ctl_num - 1].cmd;
     142        ctl_physical = legacy_base[ctl_num - 1].ctl;
     143
     144        printf("I/O address %p/%p\n", (void *) cmd_physical,
     145            (void *) ctl_physical);
    117146
    118147        if (ata_bd_init() != EOK)
     
    139168                        continue;
    140169               
    141                 snprintf(name, 16, "%s/disk%d", NAMESPACE, i);
     170                snprintf(name, 16, "%s/ata%udisk%d", NAMESPACE, ctl_num, i);
    142171                rc = devmap_device_register(name, &disk[i].devmap_handle);
    143172                if (rc != EOK) {
     
    160189        /* Not reached */
    161190        return 0;
     191}
     192
     193
     194static void print_syntax(void)
     195{
     196        printf("Syntax: " NAME " <controller_number>\n");
     197        printf("Controller number = 1..4\n");
    162198}
    163199
Note: See TracChangeset for help on using the changeset viewer.