summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoruebayasi <uebayasi@openbsd.org>2015-02-12 11:38:42 +0000
committeruebayasi <uebayasi@openbsd.org>2015-02-12 11:38:42 +0000
commit7106ee74830ed8f53bae4595ebb5aff62b2a3e02 (patch)
tree5276c5e25750bd3312d265c5c7f0925f7d88fee1
parentWhen purging the routes corresponding to an ifp, skip the routing tables (diff)
downloadwireguard-openbsd-7106ee74830ed8f53bae4595ebb5aff62b2a3e02.tar.xz
wireguard-openbsd-7106ee74830ed8f53bae4595ebb5aff62b2a3e02.zip
Provide interface for external DMA address configuration.
-rw-r--r--sys/dev/usb/dwc2/dwc2.c9
-rw-r--r--sys/dev/usb/dwc2/dwc2_core.c30
-rw-r--r--sys/dev/usb/dwc2/dwc2_core.h8
-rw-r--r--sys/dev/usb/dwc2/dwc2_hcd.c9
-rw-r--r--sys/dev/usb/dwc2/dwc2_hcd.h4
-rw-r--r--sys/dev/usb/dwc2/dwc2var.h5
6 files changed, 53 insertions, 12 deletions
diff --git a/sys/dev/usb/dwc2/dwc2.c b/sys/dev/usb/dwc2/dwc2.c
index dc5fa7e3270..fadfc1935e5 100644
--- a/sys/dev/usb/dwc2/dwc2.c
+++ b/sys/dev/usb/dwc2/dwc2.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwc2.c,v 1.20 2015/02/12 06:46:23 uebayasi Exp $ */
+/* $OpenBSD: dwc2.c,v 1.21 2015/02/12 11:38:42 uebayasi Exp $ */
/* $NetBSD: dwc2.c,v 1.32 2014/09/02 23:26:20 macallan Exp $ */
/*-
@@ -1640,6 +1640,13 @@ fail1:
return err;
}
+int
+dwc2_dma_config(struct dwc2_softc *sc, struct dwc2_core_dma_config *config)
+{
+ sc->sc_dma_config = config;
+ return dwc2_hcd_dma_config(sc->sc_hsotg, sc->sc_dma_config);
+}
+
#if 0
/*
* curmode is a mode indication bit 0 = device, 1 = host
diff --git a/sys/dev/usb/dwc2/dwc2_core.c b/sys/dev/usb/dwc2/dwc2_core.c
index 897961b7225..3b17b256e38 100644
--- a/sys/dev/usb/dwc2/dwc2_core.c
+++ b/sys/dev/usb/dwc2/dwc2_core.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwc2_core.c,v 1.4 2015/02/12 06:46:23 uebayasi Exp $ */
+/* $OpenBSD: dwc2_core.c,v 1.5 2015/02/12 11:38:42 uebayasi Exp $ */
/* $NetBSD: dwc2_core.c,v 1.6 2014/04/03 06:34:58 skrll Exp $ */
/*
@@ -318,8 +318,13 @@ STATIC int dwc2_gahbcfg_init(struct dwc2_hsotg *hsotg)
switch (hsotg->hw_params.arch) {
case GHWCFG2_EXT_DMA_ARCH:
- dev_err(hsotg->dev, "External DMA Mode not supported\n");
- return -EINVAL;
+ dev_err(hsotg->dev, "External DMA Mode\n");
+ if (hsotg->core_params->ahbcfg != -1) {
+ ahbcfg &= GAHBCFG_CTRL_MASK;
+ ahbcfg |= hsotg->core_params->ahbcfg &
+ ~GAHBCFG_CTRL_MASK;
+ }
+ break;
case GHWCFG2_INT_DMA_ARCH:
dev_dbg(hsotg->dev, "Internal DMA Mode\n");
@@ -1402,10 +1407,21 @@ void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg,
} else {
dma_addr = chan->xfer_dma;
}
- DWC2_WRITE_4(hsotg, HCDMA(chan->hc_num), (u32)dma_addr);
- if (dbg_hc(chan))
- dev_vdbg(hsotg->dev, "Wrote %08lx to HCDMA(%d)\n",
- (unsigned long)dma_addr, chan->hc_num);
+ struct dwc2_core_dma_config *dma_config =
+ hsotg->core_dma_config;
+ if (dma_config == NULL) {
+ DWC2_WRITE_4(hsotg, HCDMA(chan->hc_num),
+ (u32)dma_addr);
+ if (dbg_hc(chan))
+ dev_vdbg(hsotg->dev,
+ "Wrote %08lx to HCDMA(%d)\n",
+ (unsigned long)dma_addr,
+ chan->hc_num);
+ } else {
+ (void)(*dma_config->set_dma_addr)(
+ dma_config->set_dma_addr_data, dma_addr,
+ chan->hc_num);
+ }
}
/* Start the split */
diff --git a/sys/dev/usb/dwc2/dwc2_core.h b/sys/dev/usb/dwc2/dwc2_core.h
index 0bd1ec12b8b..d6e25dc9ec1 100644
--- a/sys/dev/usb/dwc2/dwc2_core.h
+++ b/sys/dev/usb/dwc2/dwc2_core.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwc2_core.h,v 1.7 2015/02/10 23:43:46 uebayasi Exp $ */
+/* $OpenBSD: dwc2_core.h,v 1.8 2015/02/12 11:38:42 uebayasi Exp $ */
/* $NetBSD: dwc2_core.h,v 1.5 2014/04/03 06:34:58 skrll Exp $ */
/*
@@ -308,6 +308,11 @@ struct dwc2_hw_params {
u32 snpsid;
};
+struct dwc2_core_dma_config {
+ int (*set_dma_addr)(void *, dma_addr_t, int);
+ void *set_dma_addr_data;
+};
+
/**
* struct dwc2_hsotg - Holds the state of the driver, including the non-periodic
* and periodic schedules
@@ -411,6 +416,7 @@ struct dwc2_hsotg {
struct dwc2_hw_params hw_params;
/** Params to actually use */
struct dwc2_core_params *core_params;
+ struct dwc2_core_dma_config *core_dma_config;
enum usb_otg_state op_state;
unsigned int queuing_high_bandwidth:1;
diff --git a/sys/dev/usb/dwc2/dwc2_hcd.c b/sys/dev/usb/dwc2/dwc2_hcd.c
index f6539b5cd5e..d07408ece31 100644
--- a/sys/dev/usb/dwc2/dwc2_hcd.c
+++ b/sys/dev/usb/dwc2/dwc2_hcd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwc2_hcd.c,v 1.12 2015/02/12 06:46:23 uebayasi Exp $ */
+/* $OpenBSD: dwc2_hcd.c,v 1.13 2015/02/12 11:38:42 uebayasi Exp $ */
/* $NetBSD: dwc2_hcd.c,v 1.15 2014/11/24 10:14:14 skrll Exp $ */
/*
@@ -2324,3 +2324,10 @@ error1:
dev_err(hsotg->dev, "%s() FAILED, returning %d\n", __func__, retval);
return retval;
}
+
+int dwc2_hcd_dma_config(struct dwc2_hsotg *hsotg,
+ struct dwc2_core_dma_config *config)
+{
+ hsotg->core_dma_config = config;
+ return 0;
+}
diff --git a/sys/dev/usb/dwc2/dwc2_hcd.h b/sys/dev/usb/dwc2/dwc2_hcd.h
index b92ea3c1c4a..3fbf193bc4d 100644
--- a/sys/dev/usb/dwc2/dwc2_hcd.h
+++ b/sys/dev/usb/dwc2/dwc2_hcd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwc2_hcd.h,v 1.9 2015/02/12 06:46:23 uebayasi Exp $ */
+/* $OpenBSD: dwc2_hcd.h,v 1.10 2015/02/12 11:38:42 uebayasi Exp $ */
/* $NetBSD: dwc2_hcd.h,v 1.9 2014/09/03 10:00:08 skrll Exp $ */
/*
@@ -462,6 +462,8 @@ STATIC_INLINE u8 dwc2_hcd_is_pipe_out(struct dwc2_hcd_pipe_info *pipe)
extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg,
const struct dwc2_core_params *params);
+extern int dwc2_hcd_dma_config(struct dwc2_hsotg *hsotg,
+ struct dwc2_core_dma_config *config);
extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg);
extern void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
const struct dwc2_core_params *params);
diff --git a/sys/dev/usb/dwc2/dwc2var.h b/sys/dev/usb/dwc2/dwc2var.h
index 7b5533d4f77..261d9651eca 100644
--- a/sys/dev/usb/dwc2/dwc2var.h
+++ b/sys/dev/usb/dwc2/dwc2var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: dwc2var.h,v 1.13 2015/02/12 07:55:50 uebayasi Exp $ */
+/* $OpenBSD: dwc2var.h,v 1.14 2015/02/12 11:38:42 uebayasi Exp $ */
/* $NetBSD: dwc2var.h,v 1.3 2013/10/22 12:57:40 skrll Exp $ */
/*-
@@ -83,6 +83,7 @@ typedef struct dwc2_softc {
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
struct dwc2_core_params *sc_params;
+ struct dwc2_core_dma_config *sc_dma_config;
/*
* Private
@@ -118,6 +119,8 @@ typedef struct dwc2_softc {
} dwc2_softc_t;
int dwc2_init(struct dwc2_softc *);
+int dwc2_dma_config(struct dwc2_softc *,
+ struct dwc2_core_dma_config *);
int dwc2_intr(void *);
int dwc2_detach(dwc2_softc_t *, int);
bool dwc2_shutdown(struct device *, int);