Date: Thu, 23 Sep 2010 01:19:31 +0000 (UTC) From: Weongyo Jeong <weongyo@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r213043 - in user/weongyo/usb/sys/dev/usb: . controller Message-ID: <201009230119.o8N1JVet049865@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: weongyo Date: Thu Sep 23 01:19:31 2010 New Revision: 213043 URL: http://svn.freebsd.org/changeset/base/213043 Log: Reverts partial commits from r212937 - r213022; looks wrong approach to verify the boundaries of DMA segments. 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/controller/ehci.c Thu Sep 23 01:19:31 2010 (r213043) @@ -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, 1, + (*func)(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, sizeof(uint32_t) * EHCI_FRAMELIST_COUNT, EHCI_FRAMELIST_ALIGN); - (*func)(bus, &sc->sc_hw.async_start_pc, &sc->sc_hw.async_start_pg, 1, + (*func)(bus, &sc->sc_hw.async_start_pc, &sc->sc_hw.async_start_pg, 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, 1, + sc->sc_hw.intr_start_pg + i, 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, 1, + sc->sc_hw.isoc_hs_start_pg + i, 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, 1, + sc->sc_hw.isoc_fs_start_pg + i, 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/controller/ohci.c Thu Sep 23 01:19:31 2010 (r213043) @@ -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, 1, + (*func)(bus, &sc->sc_hw.hcca_pc, &sc->sc_hw.hcca_pg, sizeof(ohci_hcca_t), OHCI_HCCA_ALIGN); - (*func)(bus, &sc->sc_hw.ctrl_start_pc, &sc->sc_hw.ctrl_start_pg, 1, + (*func)(bus, &sc->sc_hw.ctrl_start_pc, &sc->sc_hw.ctrl_start_pg, sizeof(ohci_ed_t), OHCI_ED_ALIGN); - (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, 1, + (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, sizeof(ohci_ed_t), OHCI_ED_ALIGN); - (*func)(bus, &sc->sc_hw.isoc_start_pc, &sc->sc_hw.isoc_start_pg, 1, + (*func)(bus, &sc->sc_hw.isoc_start_pc, &sc->sc_hw.isoc_start_pg, 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, 1, + sc->sc_hw.intr_start_pg + i, 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/controller/uhci.c Thu Sep 23 01:19:31 2010 (r213043) @@ -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, 1, + (*func)(bus, &sc->sc_hw.pframes_pc, &sc->sc_hw.pframes_pg, 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, 1, + (*func)(bus, &sc->sc_hw.ls_ctl_start_pc, &sc->sc_hw.ls_ctl_start_pg, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.fs_ctl_start_pc, &sc->sc_hw.fs_ctl_start_pg, 1, + (*func)(bus, &sc->sc_hw.fs_ctl_start_pc, &sc->sc_hw.fs_ctl_start_pg, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, 1, + (*func)(bus, &sc->sc_hw.bulk_start_pc, &sc->sc_hw.bulk_start_pg, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.last_qh_pc, &sc->sc_hw.last_qh_pg, 1, + (*func)(bus, &sc->sc_hw.last_qh_pc, &sc->sc_hw.last_qh_pg, sizeof(uhci_qh_t), UHCI_QH_ALIGN); - (*func)(bus, &sc->sc_hw.last_td_pc, &sc->sc_hw.last_td_pg, 1, + (*func)(bus, &sc->sc_hw.last_td_pc, &sc->sc_hw.last_td_pg, 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, 1, + sc->sc_hw.isoc_start_pg + i, 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, 1, + sc->sc_hw.intr_start_pg + i, 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/controller/usb_controller.c Thu Sep 23 01:19:31 2010 (r213043) @@ -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, int npg, usb_size_t size, usb_size_t align) + struct usb_page *pg, 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, int npg, usb_size_t size, usb_size_t align) + struct usb_page *pg, 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, npg, size, align)) + if (usb_pc_alloc_mem(pc, pg, 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, int npg, usb_size_t size, usb_size_t align) + struct usb_page *pg, 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Thu Sep 23 01:19:31 2010 (r213043) @@ -78,61 +78,51 @@ static void usb_pc_common_mem_cb(void *, * been properly initialized ! *------------------------------------------------------------------------*/ void -usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset0, +usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset, struct usb_page_search *res) { struct usb_page *page; - usb_frlength_t end, offset = offset0; - int index; #if USB_HAVE_BUSDMA - if (pc->pages != NULL) { - USB_ASSERT(pc->npages > 0, - ("wrong numbers of pages (%d)", pc->npages)); + if (pc->page_start) { + /* Case 1 - something has been loaded into DMA */ + if (pc->buffer) { + /* Case 1a - Kernel Virtual Address */ + res->buffer = USB_ADD_BYTES(pc->buffer, offset); } offset += pc->page_offset_buf; + /* compute destination page */ - page = pc->pages; - index = 0; + + page = pc->page_start; + if (pc->ismultiseg) { - index += (offset / USB_PAGE_SIZE); - USB_ASSERT(index < pc->npages, - ("invalid index number (%d / %d)", index, - pc->npages)); + + page += (offset / USB_PAGE_SIZE); + offset %= USB_PAGE_SIZE; - /* If it's the last segment handle differently */ - if ((index + 1) != pc->npages) - res->length = USB_PAGE_SIZE - offset; - else { - end = page[index].physlen; - if (index == 0) - end += pc->page_offset_buf; - USB_ASSERT(end >= offset, - ("wrong offset (%d / %d)", end, offset)); - res->length = end - offset; - } - res->physaddr = page[index].physaddr + offset; + + res->length = USB_PAGE_SIZE - offset; + res->physaddr = page->physaddr + offset; } else { - USB_ASSERT(pc->npages == 1, - ("multiple DMA segments without pc->ismultiseg")); - USB_ASSERT(page[index].physlen > offset0, - ("wrong offset (%zd/ %d)", page[index].physlen, - offset0)); - res->length = page[index].physlen - offset0; - res->physaddr = page[index].physaddr + offset; + res->length = 0 - 1; + res->physaddr = page->physaddr + offset; } if (!pc->buffer) { + /* Case 1b - Non Kernel Virtual Address */ - res->buffer = USB_ADD_BYTES(page[index].buffer, offset); + + res->buffer = USB_ADD_BYTES(page->buffer, offset); } return; } #endif /* Case 2 - Plain PIO */ + res->buffer = USB_ADD_BYTES(pc->buffer, offset); res->length = 0 - 1; #if USB_HAVE_BUSDMA @@ -439,12 +429,8 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ if (error) goto done; - USB_ASSERT(nseg <= pc->npages, - ("too many segments (%d <= %d)", nseg, pc->npages)); - - pg = pc->pages; + pg = pc->page_start; pg->physaddr = segs[0].ds_addr & ~(USB_PAGE_SIZE - 1); - pg->physlen = segs[0].ds_len; rem = segs[0].ds_addr & (USB_PAGE_SIZE - 1); pc->page_offset_buf = rem; pc->page_offset_end += rem; @@ -458,18 +444,8 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ goto done; } #endif - for (i = 1; i < nseg; i++) { - /* - * XXX Currently USB stack has a assumption that after second - * segments always the address would be aligned by - * USB_PAGE_SIZE. If it's failed, all DMA operations would - * be wrong. - */ - USB_ASSERT((segs[i].ds_addr & (USB_PAGE_SIZE - 1)) == 0, - ("wrong DMA alignment (%#jx)", segs[i].ds_addr)); - pg[i].physaddr = segs[i].ds_addr; - pg[i].physlen = segs[i].ds_len; - } + for (i = 1; i < nseg; i++) + pg[i].physaddr = segs[i].ds_addr & ~(USB_PAGE_SIZE - 1); done: uptag->dma_error = (error ? 1 : 0); if (isload) @@ -486,7 +462,7 @@ done: * Else: Failure *------------------------------------------------------------------------*/ uint8_t -usb_pc_alloc_mem(struct usb_page_cache *pc, struct usb_page *pg, int npg, +usb_pc_alloc_mem(struct usb_page_cache *pc, struct usb_page *pg, usb_size_t size, usb_size_t align) { struct usb_dma_parent_tag *uptag; @@ -547,8 +523,7 @@ usb_pc_alloc_mem(struct usb_page_cache * } /* setup page cache */ pc->buffer = ptr; - pc->pages = pg; - pc->npages = npg; + pc->page_start = pg; pc->page_offset_buf = 0; pc->page_offset_end = size; pc->map = map; @@ -581,8 +556,7 @@ usb_pc_alloc_mem(struct usb_page_cache * error: /* reset most of the page cache */ pc->buffer = NULL; - pc->pages = NULL; - pc->npages = 0; + pc->page_start = NULL; pc->page_offset_buf = 0; pc->page_offset_end = 0; pc->map = NULL; @@ -935,32 +909,25 @@ usb_bdma_work_loop(struct usb_xfer_queue } /* - * Setup the "pages" pointer which points to an array of + * Setup the "page_start" pointer which points to an array of * USB pages where information about the physical address of a * page will be stored. Also initialise the "isread" field of * the USB page caches. */ - xfer->frbuffers[0].pages = pg; - /* XXX why +2 here? It looks it's a quirk */ - xfer->frbuffers[0].npages = (frlength_0 / USB_PAGE_SIZE) + 2; + xfer->frbuffers[0].page_start = pg; info->dma_nframes = nframes; info->dma_currframe = 0; info->dma_frlength_0 = frlength_0; pg += (frlength_0 / USB_PAGE_SIZE); - /* XXX why +2 here? It looks it's a quirk */ pg += 2; while (--nframes > 0) { xfer->frbuffers[nframes].isread = isread; - xfer->frbuffers[nframes].pages = pg; - /* XXX why +2 here? It looks it's a quirk */ - xfer->frbuffers[nframes].npages = - (xfer->frlengths[nframes] / USB_PAGE_SIZE) + 2; + xfer->frbuffers[nframes].page_start = pg; pg += (xfer->frlengths[nframes] / USB_PAGE_SIZE); - /* XXX why +2 here? It looks it's a quirk */ pg += 2; } Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Thu Sep 23 01:19:31 2010 (r213043) @@ -61,7 +61,6 @@ typedef void (usb_dma_callback_t)(struct struct usb_page { #if USB_HAVE_BUSDMA bus_addr_t physaddr; - bus_size_t physlen; void *buffer; /* non Kernel Virtual Address */ #endif }; @@ -88,8 +87,7 @@ struct usb_page_cache { #if USB_HAVE_BUSDMA bus_dma_tag_t tag; bus_dmamap_t map; - struct usb_page *pages; /* the array pointer of DMA segments */ - int npages; /* numbers of DMA segments */ + struct usb_page *page_start; #endif struct usb_dma_parent_tag *tag_parent; /* always set */ void *buffer; /* virtual buffer pointer */ @@ -143,7 +141,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, - int npg, usb_size_t size, usb_size_t align); + 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/usb_controller.h Thu Sep 23 01:19:31 2010 (r213043) @@ -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 *, int, - usb_size_t, usb_size_t); + struct usb_page_cache *, struct usb_page *, 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 Wed Sep 22 23:41:02 2010 (r213042) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Thu Sep 23 01:19:31 2010 (r213043) @@ -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, 1, z, align)) { + pg, z, align)) { return (1); /* failure */ } /* Set beginning of current buffer */ @@ -284,8 +284,7 @@ usbd_transfer_setup_sub_malloc(struct us return (1); /* failure */ } pc->buffer = USB_ADD_BYTES(buf, y * size); - pc->pages = pg; - pc->npages = 1; + pc->page_start = pg; mtx_lock(pc->tag_parent->mtx); if (usb_pc_load_mem(pc, size, 1 /* synchronous */ )) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009230119.o8N1JVet049865>