diff options
author | 2015-02-12 11:38:42 +0000 | |
---|---|---|
committer | 2015-02-12 11:38:42 +0000 | |
commit | 7106ee74830ed8f53bae4595ebb5aff62b2a3e02 (patch) | |
tree | 5276c5e25750bd3312d265c5c7f0925f7d88fee1 | |
parent | When purging the routes corresponding to an ifp, skip the routing tables (diff) | |
download | wireguard-openbsd-7106ee74830ed8f53bae4595ebb5aff62b2a3e02.tar.xz wireguard-openbsd-7106ee74830ed8f53bae4595ebb5aff62b2a3e02.zip |
Provide interface for external DMA address configuration.
-rw-r--r-- | sys/dev/usb/dwc2/dwc2.c | 9 | ||||
-rw-r--r-- | sys/dev/usb/dwc2/dwc2_core.c | 30 | ||||
-rw-r--r-- | sys/dev/usb/dwc2/dwc2_core.h | 8 | ||||
-rw-r--r-- | sys/dev/usb/dwc2/dwc2_hcd.c | 9 | ||||
-rw-r--r-- | sys/dev/usb/dwc2/dwc2_hcd.h | 4 | ||||
-rw-r--r-- | sys/dev/usb/dwc2/dwc2var.h | 5 |
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); |