Module Name:    src
Committed By:   skrll
Date:           Tue Dec 23 19:31:45 UTC 2014

Modified Files:
        src/sys/dev/usb [nick-nhusb]: ehci.c ehcivar.h

Log Message:
Remove an item and use a union to reduce the size of ehci_xfer


To generate a diff of this commit:
cvs rdiff -u -r1.234.2.18 -r1.234.2.19 src/sys/dev/usb/ehci.c
cvs rdiff -u -r1.42.14.5 -r1.42.14.6 src/sys/dev/usb/ehcivar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/ehci.c
diff -u src/sys/dev/usb/ehci.c:1.234.2.18 src/sys/dev/usb/ehci.c:1.234.2.19
--- src/sys/dev/usb/ehci.c:1.234.2.18	Mon Dec 22 08:24:20 2014
+++ src/sys/dev/usb/ehci.c	Tue Dec 23 19:31:44 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehci.c,v 1.234.2.18 2014/12/22 08:24:20 skrll Exp $ */
+/*	$NetBSD: ehci.c,v 1.234.2.19 2014/12/23 19:31:44 skrll Exp $ */
 
 /*
  * Copyright (c) 2004-2012 The NetBSD Foundation, Inc.
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.234.2.18 2014/12/22 08:24:20 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ehci.c,v 1.234.2.19 2014/12/23 19:31:44 skrll Exp $");
 
 #include "ohci.h"
 #include "uhci.h"
@@ -1130,6 +1130,7 @@ ehci_idone(struct ehci_xfer *ex)
 		xfer->ux_status = USBD_NORMAL_COMPLETION;
 		goto end;
 	}
+	KASSERT(xfertype != UE_ISOCHRONOUS);
 
 	/* Continue processing xfers using queue heads */
 
@@ -3272,37 +3273,42 @@ ehci_abort_isoc_xfer(usbd_xfer_handle xf
 	xfer->ux_status = status;
 	callout_stop(&xfer->ux_callout);
 
-	for (itd = exfer->itdstart; itd != NULL; itd = itd->xfer_next) {
-		usb_syncmem(&itd->dma,
-		    itd->offs + offsetof(ehci_itd_t, itd_ctl),
-		    sizeof(itd->itd.itd_ctl),
-		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+	if (xfer->ux_pipe->up_dev->ud_speed == USB_SPEED_HIGH) {
+		for (itd = exfer->itdstart; itd != NULL;
+		     itd = itd->xfer_next) {
+			usb_syncmem(&itd->dma,
+			    itd->offs + offsetof(ehci_itd_t, itd_ctl),
+			    sizeof(itd->itd.itd_ctl),
+			    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 
-		for (i = 0; i < 8; i++) {
-			trans_status = le32toh(itd->itd.itd_ctl[i]);
-			trans_status &= ~EHCI_ITD_ACTIVE;
-			itd->itd.itd_ctl[i] = htole32(trans_status);
-		}
+			for (i = 0; i < 8; i++) {
+				trans_status = le32toh(itd->itd.itd_ctl[i]);
+				trans_status &= ~EHCI_ITD_ACTIVE;
+				itd->itd.itd_ctl[i] = htole32(trans_status);
+			}
 
-		usb_syncmem(&itd->dma,
-		    itd->offs + offsetof(ehci_itd_t, itd_ctl),
-		    sizeof(itd->itd.itd_ctl),
-		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
-	}
-	for (sitd = exfer->sitdstart; sitd != NULL; sitd = sitd->xfer_next) {
-		usb_syncmem(&sitd->dma,
-		    sitd->offs + offsetof(ehci_sitd_t, sitd_buffer),
-		    sizeof(sitd->sitd.sitd_buffer),
-		    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
+			usb_syncmem(&itd->dma,
+			    itd->offs + offsetof(ehci_itd_t, itd_ctl),
+			    sizeof(itd->itd.itd_ctl),
+			    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+		}
+	} else {
+		for (sitd = exfer->sitdstart; sitd != NULL;
+		     sitd = sitd->xfer_next) {
+			usb_syncmem(&sitd->dma,
+			    sitd->offs + offsetof(ehci_sitd_t, sitd_buffer),
+			    sizeof(sitd->sitd.sitd_buffer),
+			    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
 
-		trans_status = le32toh(sitd->sitd.sitd_trans);
-		trans_status &= ~EHCI_SITD_ACTIVE;
-		sitd->sitd.sitd_trans = htole32(trans_status);
+			trans_status = le32toh(sitd->sitd.sitd_trans);
+			trans_status &= ~EHCI_SITD_ACTIVE;
+			sitd->sitd.sitd_trans = htole32(trans_status);
 
-		usb_syncmem(&sitd->dma,
-		    sitd->offs + offsetof(ehci_sitd_t, sitd_buffer),
-		    sizeof(sitd->sitd.sitd_buffer),
-		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+			usb_syncmem(&sitd->dma,
+			    sitd->offs + offsetof(ehci_sitd_t, sitd_buffer),
+			    sizeof(sitd->sitd.sitd_buffer),
+			    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+		}
 	}
 
 	sc->sc_softwake = 1;
@@ -4242,7 +4248,6 @@ ehci_device_fs_isoc_start(usbd_xfer_hand
 
 	stop = sitd;
 	stop->xfer_next = NULL;
-	exfer->isoc_len = total_length;
 
 	usb_syncmem(&exfer->xfer.ux_dmabuf, 0, total_length,
 		BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
@@ -4314,8 +4319,6 @@ ehci_device_fs_isoc_start(usbd_xfer_hand
 
 	exfer->sitdstart = start;
 	exfer->sitdend = stop;
-	exfer->sqtdstart = NULL;
-	exfer->sqtdstart = NULL;
 
 	ehci_add_intr_list(sc, exfer);
 	xfer->ux_status = USBD_IN_PROGRESS;
@@ -4572,7 +4575,6 @@ ehci_device_isoc_start(usbd_xfer_handle 
 
 	stop = itd;
 	stop->xfer_next = NULL;
-	exfer->isoc_len = total_length;
 
 	usb_syncmem(&exfer->xfer.ux_dmabuf, 0, total_length,
 		BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
@@ -4647,8 +4649,6 @@ ehci_device_isoc_start(usbd_xfer_handle 
 
 	exfer->itdstart = start;
 	exfer->itdend = stop;
-	exfer->sqtdstart = NULL;
-	exfer->sqtdend = NULL;
 
 	ehci_add_intr_list(sc, exfer);
 	xfer->ux_status = USBD_IN_PROGRESS;

Index: src/sys/dev/usb/ehcivar.h
diff -u src/sys/dev/usb/ehcivar.h:1.42.14.5 src/sys/dev/usb/ehcivar.h:1.42.14.6
--- src/sys/dev/usb/ehcivar.h:1.42.14.5	Fri Dec  5 13:23:38 2014
+++ src/sys/dev/usb/ehcivar.h	Tue Dec 23 19:31:44 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ehcivar.h,v 1.42.14.5 2014/12/05 13:23:38 skrll Exp $ */
+/*	$NetBSD: ehcivar.h,v 1.42.14.6 2014/12/23 19:31:44 skrll Exp $ */
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -94,13 +94,23 @@ struct ehci_xfer {
 	struct usbd_xfer xfer;
 	struct usb_task	abort_task;
 	TAILQ_ENTRY(ehci_xfer) inext; /* list of active xfers */
-	ehci_soft_qtd_t *sqtdstart;
-	ehci_soft_qtd_t *sqtdend;
-	ehci_soft_itd_t *itdstart;
-	ehci_soft_itd_t *itdend;
-	ehci_soft_sitd_t *sitdstart;
-	ehci_soft_sitd_t *sitdend;
-	u_int isoc_len;
+	union {
+		/* ctrl/bulk/intr */
+		struct {
+			ehci_soft_qtd_t *sqtdstart;
+			ehci_soft_qtd_t *sqtdend;
+		};
+		/* isoc */
+		struct {
+			ehci_soft_itd_t *itdstart;
+			ehci_soft_itd_t *itdend;
+		};
+		/* split isoc */
+		struct {
+			ehci_soft_sitd_t *sitdstart;
+			ehci_soft_sitd_t *sitdend;
+		};
+	};
 	int isdone;	/* used only when DIAGNOSTIC is defined */
 };
 #define EXFER(xfer) ((struct ehci_xfer *)(xfer))

Reply via email to