From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 23:17:28 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A0EB1106564A; Mon, 20 Sep 2010 23:17:28 +0000 (UTC) (envelope-from weongyo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 8E5D98FC19; Mon, 20 Sep 2010 23:17:28 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o8KNHR1I071017; Mon, 20 Sep 2010 23:17:27 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KNHRVD071008; Mon, 20 Sep 2010 23:17:27 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009202317.o8KNHRVD071008@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 23:17:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r212937 - in user/weongyo/usb/sys/dev/usb: . controller X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Sep 2010 23:17:28 -0000 Author: weongyo Date: Mon Sep 20 23:17:26 2010 New Revision: 212937 URL: http://svn.freebsd.org/changeset/base/212937 Log: Adds a variable `npage' to struct usb_page_cache which points the number of DMA pages for a usb_page_cache structure. In the previous it just pointed a pointer of the array for page_start variable so USB stack explicitly didn't know how many array could be accessed by bus_dmamap_load(9) callback. Only a developer of the host controller driver knows it in their mind not in code. Modified: user/weongyo/usb/sys/dev/usb/controller/ehci.c user/weongyo/usb/sys/dev/usb/controller/ohci.c user/weongyo/usb/sys/dev/usb/controller/uhci.c user/weongyo/usb/sys/dev/usb/controller/usb_controller.c user/weongyo/usb/sys/dev/usb/usb_busdma.c user/weongyo/usb/sys/dev/usb/usb_busdma.h user/weongyo/usb/sys/dev/usb/usb_controller.h user/weongyo/usb/sys/dev/usb/usb_transfer.c Modified: user/weongyo/usb/sys/dev/usb/controller/ehci.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/controller/ehci.c Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/controller/ehci.c Mon Sep 20 23:17:26 2010 (r212937) @@ -153,27 +153,27 @@ ehci_iterate_hw_softc(struct usb_bus *bu ehci_softc_t *sc = EHCI_BUS2SC(bus); uint32_t i; - (*func)(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, + (*func)(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, 1, sizeof(uint32_t) * EHCI_FRAMELIST_COUNT, EHCI_FRAMELIST_ALIGN); - (*func)(bus, &sc->sc_hw.async_start_pc, &sc->sc_hw.async_start_pg, + (*func)(bus, &sc->sc_hw.async_start_pc, &sc->sc_hw.async_start_pg, 1, sizeof(ehci_qh_t), EHCI_QH_ALIGN); for (i = 0; i != EHCI_VIRTUAL_FRAMELIST_COUNT; i++) { (*func)(bus, sc->sc_hw.intr_start_pc + i, - sc->sc_hw.intr_start_pg + i, + sc->sc_hw.intr_start_pg + i, 1, sizeof(ehci_qh_t), EHCI_QH_ALIGN); } for (i = 0; i != EHCI_VIRTUAL_FRAMELIST_COUNT; i++) { (*func)(bus, sc->sc_hw.isoc_hs_start_pc + i, - sc->sc_hw.isoc_hs_start_pg + i, + sc->sc_hw.isoc_hs_start_pg + i, 1, sizeof(ehci_itd_t), EHCI_ITD_ALIGN); } for (i = 0; i != EHCI_VIRTUAL_FRAMELIST_COUNT; i++) { (*func)(bus, sc->sc_hw.isoc_fs_start_pc + i, - sc->sc_hw.isoc_fs_start_pg + i, + sc->sc_hw.isoc_fs_start_pg + i, 1, sizeof(ehci_sitd_t), EHCI_SITD_ALIGN); } } Modified: user/weongyo/usb/sys/dev/usb/controller/ohci.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/controller/ohci.c Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/controller/ohci.c Mon Sep 20 23:17:26 2010 (r212937) @@ -147,21 +147,21 @@ ohci_iterate_hw_softc(struct usb_bus *bu struct ohci_softc *sc = OHCI_BUS2SC(bus); uint32_t i; - (*func)(bus, &sc->sc_hw.hcca_pc, &sc->sc_hw.hcca_pg, + (*func)(bus, &sc->sc_hw.hcca_pc, &sc->sc_hw.hcca_pg, 1, sizeof(ohci_hcca_t), OHCI_HCCA_ALIGN); - (*func)(bus, &sc->sc_hw.ctrl_start_pc, &sc->sc_hw.ctrl_start_pg, + (*func)(bus, &sc->sc_hw.ctrl_start_pc, &sc->sc_hw.ctrl_start_pg, 1, sizeof(ohci_ed_t), OHCI_ED_ALIGN); - (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, + (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, 1, sizeof(ohci_ed_t), OHCI_ED_ALIGN); - (*func)(bus, &sc->sc_hw.isoc_start_pc, &sc->sc_hw.isoc_start_pg, + (*func)(bus, &sc->sc_hw.isoc_start_pc, &sc->sc_hw.isoc_start_pg, 1, sizeof(ohci_ed_t), OHCI_ED_ALIGN); for (i = 0; i != OHCI_NO_EDS; i++) { (*func)(bus, sc->sc_hw.intr_start_pc + i, - sc->sc_hw.intr_start_pg + i, + sc->sc_hw.intr_start_pg + i, 1, sizeof(ohci_ed_t), OHCI_ED_ALIGN); } } Modified: user/weongyo/usb/sys/dev/usb/controller/uhci.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/controller/uhci.c Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/controller/uhci.c Mon Sep 20 23:17:26 2010 (r212937) @@ -169,33 +169,33 @@ uhci_iterate_hw_softc(struct usb_bus *bu struct uhci_softc *sc = UHCI_BUS2SC(bus); uint32_t i; - (*func)(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, + (*func)(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, 1, sizeof(uint32_t) * UHCI_FRAMELIST_COUNT, UHCI_FRAMELIST_ALIGN); - (*func)(bus, &sc->sc_hw.ls_ctl_start_pc, &sc->sc_hw.ls_ctl_start_pg, + (*func)(bus, &sc->sc_hw.ls_ctl_start_pc, &sc->sc_hw.ls_ctl_start_pg, 1, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.fs_ctl_start_pc, &sc->sc_hw.fs_ctl_start_pg, + (*func)(bus, &sc->sc_hw.fs_ctl_start_pc, &sc->sc_hw.fs_ctl_start_pg, 1, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, + (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, 1, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.last_qh_pc, &sc->sc_hw.last_qh_pg, + (*func)(bus, &sc->sc_hw.last_qh_pc, &sc->sc_hw.last_qh_pg, 1, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.last_td_pc, &sc->sc_hw.last_td_pg, + (*func)(bus, &sc->sc_hw.last_td_pc, &sc->sc_hw.last_td_pg, 1, sizeof(uhci_td_t), UHCI_TD_ALIGN); for (i = 0; i != UHCI_VFRAMELIST_COUNT; i++) { (*func)(bus, sc->sc_hw.isoc_start_pc + i, - sc->sc_hw.isoc_start_pg + i, + sc->sc_hw.isoc_start_pg + i, 1, sizeof(uhci_td_t), UHCI_TD_ALIGN); } for (i = 0; i != UHCI_IFRAMELIST_COUNT; i++) { (*func)(bus, sc->sc_hw.intr_start_pc + i, - sc->sc_hw.intr_start_pg + i, + sc->sc_hw.intr_start_pg + i, 1, sizeof(uhci_qh_t), UHCI_QH_ALIGN); } } Modified: user/weongyo/usb/sys/dev/usb/controller/usb_controller.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/controller/usb_controller.c Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/controller/usb_controller.c Mon Sep 20 23:17:26 2010 (r212937) @@ -431,7 +431,7 @@ SYSUNINIT(usb_bus_unload, SI_SUB_KLD, SI #if USB_HAVE_BUSDMA static void usb_bus_mem_flush_all_cb(struct usb_bus *bus, struct usb_page_cache *pc, - struct usb_page *pg, usb_size_t size, usb_size_t align) + struct usb_page *pg, int npg, usb_size_t size, usb_size_t align) { usb_pc_cpu_flush(pc); @@ -457,13 +457,13 @@ usb_bus_mem_flush_all(struct usb_bus *bu #if USB_HAVE_BUSDMA static void usb_bus_mem_alloc_all_cb(struct usb_bus *bus, struct usb_page_cache *pc, - struct usb_page *pg, usb_size_t size, usb_size_t align) + struct usb_page *pg, int npg, usb_size_t size, usb_size_t align) { /* need to initialize the page cache */ pc->tag_parent = bus->dma_parent_tag; - if (usb_pc_alloc_mem(pc, pg, size, align)) + if (usb_pc_alloc_mem(pc, pg, npg, size, align)) bus->alloc_failed = 1; } #endif @@ -496,7 +496,7 @@ usb_bus_mem_alloc_all(struct usb_bus *bu #if USB_HAVE_BUSDMA static void usb_bus_mem_free_all_cb(struct usb_bus *bus, struct usb_page_cache *pc, - struct usb_page *pg, usb_size_t size, usb_size_t align) + struct usb_page *pg, int npg, usb_size_t size, usb_size_t align) { usb_pc_free_mem(pc); Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 23:17:26 2010 (r212937) @@ -428,7 +428,7 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ if (error) goto done; - USB_ASSERT(nseg == 1, ("too many segments (%d)", nseg)); + USB_ASSERT(nseg <= pc->npage, ("too many segments (%d)", nseg)); pg = pc->page_start; pg->physaddr = segs[0].ds_addr & ~(USB_PAGE_SIZE - 1); @@ -463,7 +463,7 @@ done: * Else: Failure *------------------------------------------------------------------------*/ uint8_t -usb_pc_alloc_mem(struct usb_page_cache *pc, struct usb_page *pg, +usb_pc_alloc_mem(struct usb_page_cache *pc, struct usb_page *pg, int npg, usb_size_t size, usb_size_t align) { struct usb_dma_parent_tag *uptag; @@ -519,6 +519,7 @@ usb_pc_alloc_mem(struct usb_page_cache * /* setup page cache */ pc->buffer = ptr; pc->page_start = pg; + pc->npage = npg; pc->page_offset_buf = 0; pc->page_offset_end = size; pc->map = map; @@ -552,6 +553,7 @@ error: /* reset most of the page cache */ pc->buffer = NULL; pc->page_start = NULL; + pc->npage = 0; pc->page_offset_buf = 0; pc->page_offset_end = 0; pc->map = NULL; @@ -910,6 +912,7 @@ usb_bdma_work_loop(struct usb_xfer_queue * the USB page caches. */ xfer->frbuffers[0].page_start = pg; + xfer->frbuffers[0].npage = (frlength_0 / USB_PAGE_SIZE) + 2; info->dma_nframes = nframes; info->dma_currframe = 0; @@ -921,6 +924,8 @@ usb_bdma_work_loop(struct usb_xfer_queue while (--nframes > 0) { xfer->frbuffers[nframes].isread = isread; xfer->frbuffers[nframes].page_start = pg; + xfer->frbuffers[nframes].npage = + (xfer->frlengths[nframes] / USB_PAGE_SIZE); pg += (xfer->frlengths[nframes] / USB_PAGE_SIZE); pg += 2; Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Mon Sep 20 23:17:26 2010 (r212937) @@ -88,6 +88,7 @@ struct usb_page_cache { bus_dma_tag_t tag; bus_dmamap_t map; struct usb_page *page_start; + int npage; #endif struct usb_dma_parent_tag *tag_parent; /* always set */ void *buffer; /* virtual buffer pointer */ @@ -141,7 +142,7 @@ int usb_uiomove(struct usb_page_cache *p struct usb_dma_tag *usb_dma_tag_find(struct usb_dma_parent_tag *udpt, usb_size_t size, usb_size_t align); uint8_t usb_pc_alloc_mem(struct usb_page_cache *pc, struct usb_page *pg, - usb_size_t size, usb_size_t align); + int npg, usb_size_t size, usb_size_t align); uint8_t usb_pc_dmamap_create(struct usb_page_cache *pc, usb_size_t size); uint8_t usb_pc_load_mem(struct usb_page_cache *pc, usb_size_t size, uint8_t sync); Modified: user/weongyo/usb/sys/dev/usb/usb_controller.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_controller.h Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/usb_controller.h Mon Sep 20 23:17:26 2010 (r212937) @@ -46,8 +46,8 @@ struct usb_endpoint_descriptor; /* typedefs */ typedef void (usb_bus_mem_callback_t)(struct usb_bus *, - struct usb_page_cache *, struct usb_page *, usb_size_t, - usb_size_t); + struct usb_page_cache *, struct usb_page *, int, + usb_size_t, usb_size_t); /* * The following structure is used to define all the USB BUS Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_transfer.c Mon Sep 20 23:00:21 2010 (r212936) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Mon Sep 20 23:17:26 2010 (r212937) @@ -268,7 +268,7 @@ usbd_transfer_setup_sub_malloc(struct us n_obj = r; } if (usb_pc_alloc_mem(parm->dma_page_cache_ptr, - pg, z, align)) { + pg, 1, z, align)) { return (1); /* failure */ } /* Set beginning of current buffer */ @@ -285,6 +285,7 @@ usbd_transfer_setup_sub_malloc(struct us } pc->buffer = USB_ADD_BYTES(buf, y * size); pc->page_start = pg; + pc->npage = 1; mtx_lock(pc->tag_parent->mtx); if (usb_pc_load_mem(pc, size, 1 /* synchronous */ )) {