diff options
| author | bouyer <bouyer@NetBSD.org> | 2007-01-18 21:42:57 +0000 |
|---|---|---|
| committer | bouyer <bouyer@NetBSD.org> | 2007-01-18 21:42:57 +0000 |
| commit | 26989657fbc6cede1e8a0f8c458b88cf4f7d321a (patch) | |
| tree | cd9e7bcb410f84cc4e3a1ccd49c63017ac6ee2d4 /sys/dev | |
| parent | bbdea713647b381489e230f1d0c24487218b3f63 (diff) | |
For the unaligned case:
Be consistant with the spaces around * and +
Use data32io[th] for 32bit access
Use stream bus_space access unless we have DRIVE_NOSTREAM
all pointed out by enami tsugutomo, thanks !
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ic/wdc.c | 114 |
1 files changed, 80 insertions, 34 deletions
diff --git a/sys/dev/ic/wdc.c b/sys/dev/ic/wdc.c index 2b1092f76b3..86c0bc4774c 100644 --- a/sys/dev/ic/wdc.c +++ b/sys/dev/ic/wdc.c @@ -1,4 +1,4 @@ -/* $NetBSD: wdc.c,v 1.244 2007/01/14 09:18:39 martin Exp $ */ +/* $NetBSD: wdc.c,v 1.245 2007/01/18 21:42:57 bouyer Exp $ */ /* * Copyright (c) 1998, 2001, 2003 Manuel Bouyer. All rights reserved. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.244 2007/01/14 09:18:39 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.245 2007/01/18 21:42:57 bouyer Exp $"); #ifndef ATADEBUG #define ATADEBUG @@ -1848,25 +1848,48 @@ wdc_datain_pio(struct ata_channel *chp, int flags, void *bf, size_t len) #ifndef __NO_STRICT_ALIGNMENT unaligned: - if (flags & DRIVE_CAP32) { - while (len > 3) { - uint32_t val; + if (flags & DRIVE_NOSTREAM) { + if (flags & DRIVE_CAP32) { + while (len > 3) { + uint32_t val; + + val = bus_space_read_4(wdr->data32iot, + wdr->data32ioh, 0); + memcpy(bf, &val, 4); + bf = (char *)bf + 4; + len -= 4; + } + } + while (len > 1) { + uint16_t val; - val = bus_space_read_4(wdr->cmd_iot, + val = bus_space_read_2(wdr->cmd_iot, wdr->cmd_iohs[wd_data], 0); - memcpy(bf, &val, 4); - bf = (char*)bf+4; - len -= 4; + memcpy(bf, &val, 2); + bf = (char *)bf + 2; + len -= 2; + } + } else { + if (flags & DRIVE_CAP32) { + while (len > 3) { + uint32_t val; + + val = bus_space_read_stream_4(wdr->data32iot, + wdr->data32ioh, 0); + memcpy(bf, &val, 4); + bf = (char *)bf + 4; + len -= 4; + } + } + while (len > 1) { + uint16_t val; + + val = bus_space_read_stream_2(wdr->cmd_iot, + wdr->cmd_iohs[wd_data], 0); + memcpy(bf, &val, 2); + bf = (char *)bf + 2; + len -= 2; } - } - while (len > 1) { - uint16_t val; - - val = bus_space_read_2(wdr->cmd_iot, - wdr->cmd_iohs[wd_data], 0); - memcpy(bf, &val, 2); - bf = (char*)bf+2; - len -= 2; } #endif } @@ -1910,25 +1933,48 @@ wdc_dataout_pio(struct ata_channel *chp, int flags, void *bf, size_t len) #ifndef __NO_STRICT_ALIGNMENT unaligned: - if (flags & DRIVE_CAP32) { - while (len > 3) { - uint32_t val; + if (flags & DRIVE_NOSTREAM) { + if (flags & DRIVE_CAP32) { + while (len > 3) { + uint32_t val; + + memcpy(&val, bf, 4); + bus_space_write_4(wdr->data32iot, + wdr->data32ioh, 0, val); + bf = (char *)bf + 4; + len -= 4; + } + } + while (len > 1) { + uint16_t val; - memcpy(&val, bf, 4); - bus_space_write_4(wdr->cmd_iot, + memcpy(&val, bf, 2); + bus_space_write_2(wdr->cmd_iot, wdr->cmd_iohs[wd_data], 0, val); - bf = (char*)bf+4; - len -= 4; + bf = (char *)bf + 2; + len -= 2; + } + } else { + if (flags & DRIVE_CAP32) { + while (len > 3) { + uint32_t val; + + memcpy(&val, bf, 4); + bus_space_write_stream_4(wdr->data32iot, + wdr->data32ioh, 0, val); + bf = (char *)bf + 4; + len -= 4; + } + } + while (len > 1) { + uint16_t val; + + memcpy(&val, bf, 2); + bus_space_write_stream_2(wdr->cmd_iot, + wdr->cmd_iohs[wd_data], 0, val); + bf = (char *)bf + 2; + len -= 2; } - } - while (len > 1) { - uint16_t val; - - memcpy(&val, bf, 2); - bus_space_write_2(wdr->cmd_iot, - wdr->cmd_iohs[wd_data], 0, val); - bf = (char*)bf+2; - len -= 2; } #endif } |
