[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