[Midnightbsd-cvs] src [7877] trunk/sys/dev/ata/ata-lowlevel.c: use 16bit PIO instead of 32bit in case of misaligned buffers.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Wed Sep 14 12:43:58 EDT 2016
Revision: 7877
http://svnweb.midnightbsd.org/src/?rev=7877
Author: laffer1
Date: 2016-09-14 12:43:58 -0400 (Wed, 14 Sep 2016)
Log Message:
-----------
use 16bit PIO instead of 32bit in case of misaligned buffers.
Modified Paths:
--------------
trunk/sys/dev/ata/ata-lowlevel.c
Modified: trunk/sys/dev/ata/ata-lowlevel.c
===================================================================
--- trunk/sys/dev/ata/ata-lowlevel.c 2016-09-14 16:30:35 UTC (rev 7876)
+++ trunk/sys/dev/ata/ata-lowlevel.c 2016-09-14 16:43:58 UTC (rev 7877)
@@ -836,23 +836,21 @@
ata_pio_read(struct ata_request *request, int length)
{
struct ata_channel *ch = device_get_softc(request->parent);
+ uint8_t *addr;
int size = min(request->transfersize, length);
int resid;
uint8_t buf[2];
- if (ch->flags & ATA_USE_16BIT || (size % sizeof(int32_t))) {
- ATA_IDX_INSW_STRM(ch, ATA_DATA,
- (void*)((uintptr_t)request->data+request->donecount),
- size / sizeof(int16_t));
+ addr = (uint8_t *)request->data + request->donecount;
+ if (ch->flags & ATA_USE_16BIT || (size % sizeof(int32_t)) ||
+ ((uintptr_t)addr % sizeof(int32_t))) {
+ ATA_IDX_INSW_STRM(ch, ATA_DATA, (void*)addr, size / sizeof(int16_t));
if (size & 1) {
ATA_IDX_INSW_STRM(ch, ATA_DATA, (void*)buf, 1);
- ((uint8_t *)request->data + request->donecount +
- (size & ~1))[0] = buf[0];
+ (addr + (size & ~1))[0] = buf[0];
}
} else
- ATA_IDX_INSL_STRM(ch, ATA_DATA,
- (void*)((uintptr_t)request->data+request->donecount),
- size / sizeof(int32_t));
+ ATA_IDX_INSL_STRM(ch, ATA_DATA, (void*)addr, size / sizeof(int32_t));
if (request->transfersize < length) {
device_printf(request->parent, "WARNING - %s read data overrun %d>%d\n",
@@ -867,23 +865,21 @@
ata_pio_write(struct ata_request *request, int length)
{
struct ata_channel *ch = device_get_softc(request->parent);
+ uint8_t *addr;
int size = min(request->transfersize, length);
int resid;
uint8_t buf[2];
- if (ch->flags & ATA_USE_16BIT || (size % sizeof(int32_t))) {
- ATA_IDX_OUTSW_STRM(ch, ATA_DATA,
- (void*)((uintptr_t)request->data+request->donecount),
- size / sizeof(int16_t));
+ addr = (uint8_t *)request->data + request->donecount;
+ if (ch->flags & ATA_USE_16BIT || (size % sizeof(int32_t)) ||
+ ((uintptr_t)addr % sizeof(int32_t))) {
+ ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (void*)addr, size / sizeof(int16_t));
if (size & 1) {
- buf[0] = ((uint8_t *)request->data + request->donecount +
- (size & ~1))[0];
+ buf[0] = (addr + (size & ~1))[0];
ATA_IDX_OUTSW_STRM(ch, ATA_DATA, (void*)buf, 1);
}
} else
- ATA_IDX_OUTSL_STRM(ch, ATA_DATA,
- (void*)((uintptr_t)request->data+request->donecount),
- size / sizeof(int32_t));
+ ATA_IDX_OUTSL_STRM(ch, ATA_DATA, (void*)addr, size / sizeof(int32_t));
if (request->transfersize < length) {
device_printf(request->parent, "WARNING - %s write data underrun %d>%d\n",
More information about the Midnightbsd-cvs
mailing list