From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 18:49:29 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 366A41065672; Mon, 20 Sep 2010 18:49:29 +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 2614A8FC1D; Mon, 20 Sep 2010 18:49:29 +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 o8KInTkM063242; Mon, 20 Sep 2010 18:49:29 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KInTRP063240; Mon, 20 Sep 2010 18:49:29 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009201849.o8KInTRP063240@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 18:49:29 +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: r212913 - user/weongyo/usb/sys/dev/usb 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 18:49:29 -0000 Author: weongyo Date: Mon Sep 20 18:49:28 2010 New Revision: 212913 URL: http://svn.freebsd.org/changeset/base/212913 Log: Don't check `align' value 0 whenever it multiplies alignment value and 2 that it looks it's meaningless. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 18:41:15 2010 (r212912) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 18:49:28 2010 (r212913) @@ -490,18 +490,16 @@ usb_pc_alloc_mem(struct usb_page_cache * uptag = pc->tag_parent; + if (align == 0) + goto error; if (align != 1) { /* * The alignment must be greater or equal to the * "size" else the object can be split between two * memory pages and we get a problem! */ - while (align < size) { + while (align < size) align *= 2; - if (align == 0) { - goto error; - } - } #if 1 /* * XXX BUS-DMA workaround - FIXME later: From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 19:13:01 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 E17BC106566B; Mon, 20 Sep 2010 19:13:00 +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 D153A8FC15; Mon, 20 Sep 2010 19:13:00 +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 o8KJD0Iq063992; Mon, 20 Sep 2010 19:13:00 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KJD0EH063990; Mon, 20 Sep 2010 19:13:00 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009201913.o8KJD0EH063990@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 19:13:00 +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: r212916 - user/weongyo/usb/sys/dev/usb 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 19:13:01 -0000 Author: weongyo Date: Mon Sep 20 19:13:00 2010 New Revision: 212916 URL: http://svn.freebsd.org/changeset/base/212916 Log: Commits a experimental commit to remove a trick that this commit would cause a crash when the recursive holding is happend but I'd like to see where it comes from and solves it with better approach. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 18:58:44 2010 (r212915) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:13:00 2010 (r212916) @@ -418,18 +418,10 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ struct usb_page_cache *pc; struct usb_page *pg; usb_size_t rem; - uint8_t owned; pc = arg; uptag = pc->tag_parent; - /* - * XXX There is sometimes recursive locking here. - * XXX We should try to find a better solution. - * XXX Until further the "owned" variable does - * XXX the trick. - */ - if (error) { goto done; } @@ -457,18 +449,14 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ } done: - owned = mtx_owned(uptag->mtx); - if (!owned) - mtx_lock(uptag->mtx); - + mtx_lock(uptag->mtx); uptag->dma_error = (error ? 1 : 0); if (isload) { (uptag->func) (uptag); } else { cv_broadcast(uptag->cv); } - if (!owned) - mtx_unlock(uptag->mtx); + mtx_unlock(uptag->mtx); } /*------------------------------------------------------------------------* From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 19:14:45 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 E7C10106566B; Mon, 20 Sep 2010 19:14:45 +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 D773C8FC16; Mon, 20 Sep 2010 19:14:45 +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 o8KJEj1E064068; Mon, 20 Sep 2010 19:14:45 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KJEjDn064066; Mon, 20 Sep 2010 19:14:45 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009201914.o8KJEjDn064066@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 19:14:45 +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: r212917 - user/weongyo/usb/sys/dev/usb 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 19:14:46 -0000 Author: weongyo Date: Mon Sep 20 19:14:45 2010 New Revision: 212917 URL: http://svn.freebsd.org/changeset/base/212917 Log: style(9) Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:13:00 2010 (r212916) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:14:45 2010 (r212917) @@ -422,9 +422,9 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ pc = arg; uptag = pc->tag_parent; - if (error) { + if (error) goto done; - } + pg = pc->page_start; pg->physaddr = segs->ds_addr & ~(USB_PAGE_SIZE - 1); rem = segs->ds_addr & (USB_PAGE_SIZE - 1); @@ -447,15 +447,13 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ pg++; pg->physaddr = segs->ds_addr & ~(USB_PAGE_SIZE - 1); } - done: mtx_lock(uptag->mtx); uptag->dma_error = (error ? 1 : 0); - if (isload) { + if (isload) (uptag->func) (uptag); - } else { + else cv_broadcast(uptag->cv); - } mtx_unlock(uptag->mtx); } From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 19:20:37 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 AF4CA106566C; Mon, 20 Sep 2010 19:20:37 +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 849DE8FC12; Mon, 20 Sep 2010 19:20:37 +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 o8KJKbRO064365; Mon, 20 Sep 2010 19:20:37 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KJKbDS064363; Mon, 20 Sep 2010 19:20:37 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009201920.o8KJKbDS064363@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 19:20:37 +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: r212920 - user/weongyo/usb/sys/dev/usb 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 19:20:37 -0000 Author: weongyo Date: Mon Sep 20 19:20:37 2010 New Revision: 212920 URL: http://svn.freebsd.org/changeset/base/212920 Log: For readability explicitly takes a argument `needwakeup'. In the previous `isload' had two meanings that first the callback registered should be called, second the wakeup isn't allowed that it's confusing. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:17:31 2010 (r212919) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:20:37 2010 (r212920) @@ -67,7 +67,7 @@ static void usb_dma_lock_cb(void *, bus_ static void usb_pc_alloc_mem_cb(void *, bus_dma_segment_t *, int, int); static void usb_pc_load_mem_cb(void *, bus_dma_segment_t *, int, int); static void usb_pc_common_mem_cb(void *, bus_dma_segment_t *, int, int, - uint8_t); + uint8_t, uint8_t); #endif /*------------------------------------------------------------------------* @@ -394,7 +394,7 @@ static void usb_pc_alloc_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) { - usb_pc_common_mem_cb(arg, segs, nseg, error, 0); + usb_pc_common_mem_cb(arg, segs, nseg, error, 0, 1); } /*------------------------------------------------------------------------* @@ -404,7 +404,7 @@ static void usb_pc_load_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) { - usb_pc_common_mem_cb(arg, segs, nseg, error, 1); + usb_pc_common_mem_cb(arg, segs, nseg, error, 1, 0); } /*------------------------------------------------------------------------* @@ -412,7 +412,7 @@ usb_pc_load_mem_cb(void *arg, bus_dma_se *------------------------------------------------------------------------*/ static void usb_pc_common_mem_cb(void *arg, bus_dma_segment_t *segs, - int nseg, int error, uint8_t isload) + int nseg, int error, uint8_t isload, uint8_t needwakeup) { struct usb_dma_parent_tag *uptag; struct usb_page_cache *pc; @@ -452,7 +452,7 @@ done: uptag->dma_error = (error ? 1 : 0); if (isload) (uptag->func) (uptag); - else + if (needwakeup != 0) cv_broadcast(uptag->cv); mtx_unlock(uptag->mtx); } From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 19:36:53 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 6E5641065673; Mon, 20 Sep 2010 19:36:53 +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 5E1A88FC0A; Mon, 20 Sep 2010 19:36:53 +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 o8KJarJj065052; Mon, 20 Sep 2010 19:36:53 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KJar4B065050; Mon, 20 Sep 2010 19:36:53 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009201936.o8KJar4B065050@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 19:36:53 +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: r212925 - user/weongyo/usb/sys/dev/usb 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 19:36:53 -0000 Author: weongyo Date: Mon Sep 20 19:36:53 2010 New Revision: 212925 URL: http://svn.freebsd.org/changeset/base/212925 Log: Just assumes that the number of segment by bus_dmamap_load(9) is always 1 because currently it looks handling the multiple segments cause a kernel crash that the number of array `pc->page_start' isn't known. It means it could lead invalid memory access and override the kernel memory value when the array size is 1 and segments are over 1. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:30:20 2010 (r212924) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:36:53 2010 (r212925) @@ -425,12 +425,13 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ if (error) goto done; + USB_ASSERT(nseg == 1, ("too many segments (%d)", nseg)); + pg = pc->page_start; pg->physaddr = segs->ds_addr & ~(USB_PAGE_SIZE - 1); rem = segs->ds_addr & (USB_PAGE_SIZE - 1); pc->page_offset_buf = rem; pc->page_offset_end += rem; - nseg--; #ifdef USB_DEBUG if (rem != (USB_P2U(pc->buffer) & (USB_PAGE_SIZE - 1))) { /* @@ -441,12 +442,6 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ goto done; } #endif - while (nseg > 0) { - nseg--; - segs++; - pg++; - pg->physaddr = segs->ds_addr & ~(USB_PAGE_SIZE - 1); - } done: mtx_lock(uptag->mtx); uptag->dma_error = (error ? 1 : 0); From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 19:47:59 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 3FA8F1065679; Mon, 20 Sep 2010 19:47:59 +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 2F6038FC0C; Mon, 20 Sep 2010 19:47:59 +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 o8KJlxjv065460; Mon, 20 Sep 2010 19:47:59 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KJlxIh065458; Mon, 20 Sep 2010 19:47:59 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009201947.o8KJlxIh065458@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 19:47:59 +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: r212928 - user/weongyo/usb/sys/dev/usb 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 19:47:59 -0000 Author: weongyo Date: Mon Sep 20 19:47:58 2010 New Revision: 212928 URL: http://svn.freebsd.org/changeset/base/212928 Log: usb_pc_common_mem_cb() would always be called with holding uptag->mtx lock. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:42:52 2010 (r212927) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 19:47:58 2010 (r212928) @@ -422,6 +422,8 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ pc = arg; uptag = pc->tag_parent; + mtx_assert(uptag->mtx, MA_OWNED); + if (error) goto done; @@ -443,13 +445,11 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ } #endif done: - mtx_lock(uptag->mtx); uptag->dma_error = (error ? 1 : 0); if (isload) (uptag->func) (uptag); if (needwakeup != 0) cv_broadcast(uptag->cv); - mtx_unlock(uptag->mtx); } /*------------------------------------------------------------------------* From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 22:57:42 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 59DC9106564A; Mon, 20 Sep 2010 22:57:42 +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 49B958FC13; Mon, 20 Sep 2010 22:57:42 +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 o8KMvg3a070462; Mon, 20 Sep 2010 22:57:42 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KMvglq070460; Mon, 20 Sep 2010 22:57:42 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009202257.o8KMvglq070460@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 22:57:42 +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: r212935 - user/weongyo/usb/sys/dev/usb 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 22:57:42 -0000 Author: weongyo Date: Mon Sep 20 22:57:42 2010 New Revision: 212935 URL: http://svn.freebsd.org/changeset/base/212935 Log: Changes the style of accessing DMA segments; no functional changes. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 22:04:59 2010 (r212934) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 22:57:42 2010 (r212935) @@ -430,8 +430,8 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ USB_ASSERT(nseg == 1, ("too many segments (%d)", nseg)); pg = pc->page_start; - pg->physaddr = segs->ds_addr & ~(USB_PAGE_SIZE - 1); - rem = segs->ds_addr & (USB_PAGE_SIZE - 1); + pg->physaddr = segs[0].ds_addr & ~(USB_PAGE_SIZE - 1); + rem = segs[0].ds_addr & (USB_PAGE_SIZE - 1); pc->page_offset_buf = rem; pc->page_offset_end += rem; #ifdef USB_DEBUG From owner-svn-src-user@FreeBSD.ORG Mon Sep 20 23:00:21 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 8591F10656A3; Mon, 20 Sep 2010 23:00:21 +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 75AE08FC1F; Mon, 20 Sep 2010 23:00:21 +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 o8KN0LKU070583; Mon, 20 Sep 2010 23:00:21 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8KN0LSK070581; Mon, 20 Sep 2010 23:00:21 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009202300.o8KN0LSK070581@svn.freebsd.org> From: Weongyo Jeong Date: Mon, 20 Sep 2010 23:00:21 +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: r212936 - user/weongyo/usb/sys/dev/usb 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:00:21 -0000 Author: weongyo Date: Mon Sep 20 23:00:21 2010 New Revision: 212936 URL: http://svn.freebsd.org/changeset/base/212936 Log: If the number of DMA segments are over 1 we needs to store the physical address for further use though usb_pc_common_mem_cb() only supports 1 segment now. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 22:57:42 2010 (r212935) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 23:00:21 2010 (r212936) @@ -418,6 +418,7 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ struct usb_page_cache *pc; struct usb_page *pg; usb_size_t rem; + int i; pc = arg; uptag = pc->tag_parent; @@ -444,6 +445,8 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ goto done; } #endif + 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) 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 */ )) { From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 00:05:10 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 8BDD7106564A; Tue, 21 Sep 2010 00:05:10 +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 7B9FF8FC12; Tue, 21 Sep 2010 00:05:10 +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 o8L05Ahr072313; Tue, 21 Sep 2010 00:05:10 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8L05AQ7072311; Tue, 21 Sep 2010 00:05:10 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009210005.o8L05AQ7072311@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 00:05:10 +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: r212940 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 00:05:10 -0000 Author: weongyo Date: Tue Sep 21 00:05:10 2010 New Revision: 212940 URL: http://svn.freebsd.org/changeset/base/212940 Log: More verbose. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Mon Sep 20 23:39:00 2010 (r212939) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:05:10 2010 (r212940) @@ -428,7 +428,8 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ if (error) goto done; - USB_ASSERT(nseg <= pc->npage, ("too many segments (%d)", nseg)); + USB_ASSERT(nseg <= pc->npage, + ("too many segments (%d <= %d)", nseg, pc->npage)); pg = pc->page_start; pg->physaddr = segs[0].ds_addr & ~(USB_PAGE_SIZE - 1); From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 00:06:19 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 9A4EA1065673; Tue, 21 Sep 2010 00:06:19 +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 8A1F58FC0A; Tue, 21 Sep 2010 00:06:19 +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 o8L06JGp072370; Tue, 21 Sep 2010 00:06:19 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8L06Jpt072368; Tue, 21 Sep 2010 00:06:19 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009210006.o8L06Jpt072368@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 00:06:19 +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: r212941 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 00:06:19 -0000 Author: weongyo Date: Tue Sep 21 00:06:19 2010 New Revision: 212941 URL: http://svn.freebsd.org/changeset/base/212941 Log: Adds a magic +2 for the number of DMA pages. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:05:10 2010 (r212940) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:06:19 2010 (r212941) @@ -926,7 +926,7 @@ usb_bdma_work_loop(struct usb_xfer_queue xfer->frbuffers[nframes].isread = isread; xfer->frbuffers[nframes].page_start = pg; xfer->frbuffers[nframes].npage = - (xfer->frlengths[nframes] / USB_PAGE_SIZE); + (xfer->frlengths[nframes] / USB_PAGE_SIZE) + 2; pg += (xfer->frlengths[nframes] / USB_PAGE_SIZE); pg += 2; From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 00:07:19 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 463E7106564A; Tue, 21 Sep 2010 00:07:19 +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 362A08FC0A; Tue, 21 Sep 2010 00:07:19 +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 o8L07JpC072425; Tue, 21 Sep 2010 00:07:19 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8L07JEM072423; Tue, 21 Sep 2010 00:07:19 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009210007.o8L07JEM072423@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 00:07:19 +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: r212942 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 00:07:19 -0000 Author: weongyo Date: Tue Sep 21 00:07:18 2010 New Revision: 212942 URL: http://svn.freebsd.org/changeset/base/212942 Log: Adds XXX comments looking ambiguous. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:06:19 2010 (r212941) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:07:18 2010 (r212942) @@ -913,6 +913,7 @@ usb_bdma_work_loop(struct usb_xfer_queue * the USB page caches. */ xfer->frbuffers[0].page_start = pg; + /* XXX why +2 here? It looks it's a quirk */ xfer->frbuffers[0].npage = (frlength_0 / USB_PAGE_SIZE) + 2; info->dma_nframes = nframes; @@ -920,15 +921,18 @@ usb_bdma_work_loop(struct usb_xfer_queue 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].page_start = pg; + /* XXX why +2 here? It looks it's a quirk */ xfer->frbuffers[nframes].npage = (xfer->frlengths[nframes] / USB_PAGE_SIZE) + 2; pg += (xfer->frlengths[nframes] / USB_PAGE_SIZE); + /* XXX why +2 here? It looks it's a quirk */ pg += 2; } From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 00:14:00 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 C14451065670; Tue, 21 Sep 2010 00:14:00 +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 B0B258FC0A; Tue, 21 Sep 2010 00:14:00 +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 o8L0E0Ou072616; Tue, 21 Sep 2010 00:14:00 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8L0E0wl072612; Tue, 21 Sep 2010 00:14:00 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009210014.o8L0E0wl072612@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 00:14:00 +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: r212943 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 00:14:00 -0000 Author: weongyo Date: Tue Sep 21 00:14:00 2010 New Revision: 212943 URL: http://svn.freebsd.org/changeset/base/212943 Log: Renames two variable names of struct usb_page_cache. Modified: 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_transfer.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:07:18 2010 (r212942) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:14:00 2010 (r212943) @@ -83,7 +83,7 @@ usbd_get_page(struct usb_page_cache *pc, struct usb_page *page; #if USB_HAVE_BUSDMA - if (pc->page_start) { + if (pc->pages != NULL) { /* Case 1 - something has been loaded into DMA */ @@ -97,7 +97,7 @@ usbd_get_page(struct usb_page_cache *pc, /* compute destination page */ - page = pc->page_start; + page = pc->pages; if (pc->ismultiseg) { @@ -428,10 +428,10 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ if (error) goto done; - USB_ASSERT(nseg <= pc->npage, - ("too many segments (%d <= %d)", nseg, pc->npage)); + USB_ASSERT(nseg <= pc->npages, + ("too many segments (%d <= %d)", nseg, pc->npages)); - pg = pc->page_start; + pg = pc->pages; pg->physaddr = segs[0].ds_addr & ~(USB_PAGE_SIZE - 1); rem = segs[0].ds_addr & (USB_PAGE_SIZE - 1); pc->page_offset_buf = rem; @@ -519,8 +519,8 @@ usb_pc_alloc_mem(struct usb_page_cache * } /* setup page cache */ pc->buffer = ptr; - pc->page_start = pg; - pc->npage = npg; + pc->pages = pg; + pc->npages = npg; pc->page_offset_buf = 0; pc->page_offset_end = size; pc->map = map; @@ -553,8 +553,8 @@ usb_pc_alloc_mem(struct usb_page_cache * error: /* reset most of the page cache */ pc->buffer = NULL; - pc->page_start = NULL; - pc->npage = 0; + pc->pages = NULL; + pc->npages = 0; pc->page_offset_buf = 0; pc->page_offset_end = 0; pc->map = NULL; @@ -912,9 +912,9 @@ usb_bdma_work_loop(struct usb_xfer_queue * page will be stored. Also initialise the "isread" field of * the USB page caches. */ - xfer->frbuffers[0].page_start = pg; + xfer->frbuffers[0].pages = pg; /* XXX why +2 here? It looks it's a quirk */ - xfer->frbuffers[0].npage = (frlength_0 / USB_PAGE_SIZE) + 2; + xfer->frbuffers[0].npages = (frlength_0 / USB_PAGE_SIZE) + 2; info->dma_nframes = nframes; info->dma_currframe = 0; @@ -926,9 +926,9 @@ 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].pages = pg; /* XXX why +2 here? It looks it's a quirk */ - xfer->frbuffers[nframes].npage = + xfer->frbuffers[nframes].npages = (xfer->frlengths[nframes] / USB_PAGE_SIZE) + 2; pg += (xfer->frlengths[nframes] / USB_PAGE_SIZE); Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 00:07:18 2010 (r212942) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 00:14:00 2010 (r212943) @@ -87,8 +87,8 @@ struct usb_page_cache { #if USB_HAVE_BUSDMA bus_dma_tag_t tag; bus_dmamap_t map; - struct usb_page *page_start; - int npage; + struct usb_page *pages; /* the array pointer of DMA segments */ + int npages; /* numbers of DMA segments */ #endif struct usb_dma_parent_tag *tag_parent; /* always set */ void *buffer; /* virtual buffer pointer */ Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_transfer.c Tue Sep 21 00:07:18 2010 (r212942) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Tue Sep 21 00:14:00 2010 (r212943) @@ -284,8 +284,8 @@ usbd_transfer_setup_sub_malloc(struct us return (1); /* failure */ } pc->buffer = USB_ADD_BYTES(buf, y * size); - pc->page_start = pg; - pc->npage = 1; + pc->pages = pg; + pc->npages = 1; mtx_lock(pc->tag_parent->mtx); if (usb_pc_load_mem(pc, size, 1 /* synchronous */ )) { From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 00:27:50 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 68C8A1065673; Tue, 21 Sep 2010 00:27:50 +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 58CFA8FC1A; Tue, 21 Sep 2010 00:27:50 +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 o8L0Ro3D072947; Tue, 21 Sep 2010 00:27:50 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8L0Rolv072945; Tue, 21 Sep 2010 00:27:50 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009210027.o8L0Rolv072945@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 00:27:50 +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: r212944 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 00:27:50 -0000 Author: weongyo Date: Tue Sep 21 00:27:50 2010 New Revision: 212944 URL: http://svn.freebsd.org/changeset/base/212944 Log: Uses roundup() macro instead of inventing the wheel again. Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_transfer.c Tue Sep 21 00:14:00 2010 (r212943) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Tue Sep 21 00:27:50 2010 (r212944) @@ -214,7 +214,7 @@ usbd_transfer_setup_sub_malloc(struct us /* * Make sure that the size is aligned properly. */ - size = -((-size) & (-align)); + size = roundup(size, align); /* * Try multi-allocation chunks to reduce the number of DMA From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 02:24:12 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 16D8410656C4; Tue, 21 Sep 2010 02:24:12 +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 C3A7C8FC1D; Tue, 21 Sep 2010 02:24:11 +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 o8L2OBf9075577; Tue, 21 Sep 2010 02:24:11 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8L2OBY5075575; Tue, 21 Sep 2010 02:24:11 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009210224.o8L2OBY5075575@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 02:24:11 +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: r212945 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 02:24:12 -0000 Author: weongyo Date: Tue Sep 21 02:24:11 2010 New Revision: 212945 URL: http://svn.freebsd.org/changeset/base/212945 Log: Reflects the changes of variable names. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 00:27:50 2010 (r212944) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 02:24:11 2010 (r212945) @@ -907,7 +907,7 @@ usb_bdma_work_loop(struct usb_xfer_queue } /* - * Setup the "page_start" pointer which points to an array of + * Setup the "pages" 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. From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 18:25:34 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 516301065679; Tue, 21 Sep 2010 18:25:34 +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 40DD78FC18; Tue, 21 Sep 2010 18:25:34 +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 o8LIPYwu002643; Tue, 21 Sep 2010 18:25:34 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8LIPYwV002641; Tue, 21 Sep 2010 18:25:34 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009211825.o8LIPYwV002641@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 18:25:34 +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: r212973 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 18:25:34 -0000 Author: weongyo Date: Tue Sep 21 18:25:33 2010 New Revision: 212973 URL: http://svn.freebsd.org/changeset/base/212973 Log: Checks the requested size whether it's over INT_MAX or not. If it's over explicitly make a panic. Most of cases the size would be less than 128 Kbytes (even if it's a worst case it'll be smaller than 1 Mbytes) because the buffer is for DMA operations. So if it's larger than 2G it means the driver writer did something wrong. Pointed by: imp Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 17:52:32 2010 (r212972) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 18:25:33 2010 (r212973) @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -475,6 +476,12 @@ usb_pc_alloc_mem(struct usb_page_cache * uptag = pc->tag_parent; + /* + * Checks the requested size first before allocating DMA-able buffer + * that if the size is over 2G the alignment value could be overflowed. + */ + if (size >= INT_MAX) + panic("too big size (%d) for DMA-able buffer", size); if (align == 0) goto error; if (align != 1) { From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 20:21:57 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 2FD9E1065670; Tue, 21 Sep 2010 20:21:57 +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 1F31A8FC12; Tue, 21 Sep 2010 20:21:57 +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 o8LKLvY2005807; Tue, 21 Sep 2010 20:21:57 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8LKLvVk005805; Tue, 21 Sep 2010 20:21:57 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009212021.o8LKLvVk005805@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 20:21:56 +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: r212975 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 20:21:57 -0000 Author: weongyo Date: Tue Sep 21 20:21:56 2010 New Revision: 212975 URL: http://svn.freebsd.org/changeset/base/212975 Log: Wrong type for DMA physical address. Its type should be bus_addr_t not bus_size_t. The difference could be that the size would be uint64_t if PAE or other is enabled. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 19:12:22 2010 (r212974) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 20:21:56 2010 (r212975) @@ -73,7 +73,7 @@ struct usb_page { struct usb_page_search { void *buffer; #if USB_HAVE_BUSDMA - bus_size_t physaddr; + bus_addr_t physaddr; #endif usb_size_t length; }; From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 20:51:41 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 38380106566C; Tue, 21 Sep 2010 20:51:41 +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 27BFA8FC1D; Tue, 21 Sep 2010 20:51:41 +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 o8LKpflu006519; Tue, 21 Sep 2010 20:51:41 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8LKpfg7006517; Tue, 21 Sep 2010 20:51:41 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009212051.o8LKpfg7006517@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 20:51:41 +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: r212977 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 20:51:41 -0000 Author: weongyo Date: Tue Sep 21 20:51:40 2010 New Revision: 212977 URL: http://svn.freebsd.org/changeset/base/212977 Log: One more wrong type for DMA physical address. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 20:23:19 2010 (r212976) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 20:51:40 2010 (r212977) @@ -60,7 +60,7 @@ typedef void (usb_dma_callback_t)(struct */ struct usb_page { #if USB_HAVE_BUSDMA - bus_size_t physaddr; + bus_addr_t physaddr; void *buffer; /* non Kernel Virtual Address */ #endif }; From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 23:08:13 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 6682B106566C; Tue, 21 Sep 2010 23:08:13 +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 54FC58FC12; Tue, 21 Sep 2010 23:08:13 +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 o8LN8DW2009458; Tue, 21 Sep 2010 23:08:13 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8LN8DSl009450; Tue, 21 Sep 2010 23:08:13 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009212308.o8LN8DSl009450@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 23:08:13 +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: r212981 - user/weongyo/usb/sys/dev/usb/net 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: Tue, 21 Sep 2010 23:08:13 -0000 Author: weongyo Date: Tue Sep 21 23:08:12 2010 New Revision: 212981 URL: http://svn.freebsd.org/changeset/base/212981 Log: Fixes a regression that [devname]_start API could be called without holding the device lock if it's called from ifp->if_start(). Modified: user/weongyo/usb/sys/dev/usb/net/if_aue.c user/weongyo/usb/sys/dev/usb/net/if_axe.c user/weongyo/usb/sys/dev/usb/net/if_cdce.c user/weongyo/usb/sys/dev/usb/net/if_cue.c user/weongyo/usb/sys/dev/usb/net/if_kue.c user/weongyo/usb/sys/dev/usb/net/if_rue.c user/weongyo/usb/sys/dev/usb/net/if_udav.c Modified: user/weongyo/usb/sys/dev/usb/net/if_aue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_aue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_aue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -223,6 +223,7 @@ static int aue_ifmedia_upd(struct ifnet static void aue_ifmedia_sts(struct ifnet *, struct ifmediareq *); static int aue_ioctl(struct ifnet *, u_long, caddr_t); static void aue_start(struct ifnet *); +static void aue_start_locked(struct ifnet *); static void aue_init(void *); static void aue_setmulti(void *, int); static void aue_setmulti_locked(struct aue_softc *); @@ -985,7 +986,7 @@ aue_tick(struct aue_softc *sc) && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sc_flags |= AUE_FLAG_LINK; - aue_start(sc->sc_ifp); + aue_start_locked(sc->sc_ifp); } } @@ -994,6 +995,18 @@ aue_start(struct ifnet *ifp) { struct aue_softc *sc = ifp->if_softc; + AUE_LOCK(sc); + aue_start_locked(ifp); + AUE_UNLOCK(sc); +} + +static void +aue_start_locked(struct ifnet *ifp) +{ + struct aue_softc *sc = ifp->if_softc; + + AUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -1044,7 +1057,7 @@ aue_init_locked(struct aue_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, aue_watchdog, sc); - aue_start(sc->sc_ifp); + aue_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_axe.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_axe.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_axe.c Tue Sep 21 23:08:12 2010 (r212981) @@ -202,6 +202,7 @@ static void axe_init(void *); static void axe_init_locked(struct axe_softc *); static int axe_ioctl(struct ifnet *, u_long, caddr_t); static void axe_start(struct ifnet *); +static void axe_start_locked(struct ifnet *); static void axe_tick(struct axe_softc *); static void axe_stop(struct axe_softc *); static void axe_setmulti_locked(struct axe_softc *); @@ -1140,7 +1141,7 @@ axe_tick(struct axe_softc *sc) if ((sc->sc_flags & AXE_FLAG_LINK) == 0) { axe_miibus_statchg(sc->sc_dev); if ((sc->sc_flags & AXE_FLAG_LINK) != 0) - axe_start(sc->sc_ifp); + axe_start_locked(sc->sc_ifp); } } @@ -1149,6 +1150,18 @@ axe_start(struct ifnet *ifp) { struct axe_softc *sc = ifp->if_softc; + AXE_LOCK(sc); + axe_start_locked(ifp); + AXE_UNLOCK(sc); +} + +static void +axe_start_locked(struct ifnet *ifp) +{ + struct axe_softc *sc = ifp->if_softc; + + AXE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -1226,7 +1239,7 @@ axe_init_locked(struct axe_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, axe_watchdog, sc); - axe_start(sc->sc_ifp); + axe_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_cdce.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_cdce.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_cdce.c Tue Sep 21 23:08:12 2010 (r212981) @@ -108,6 +108,7 @@ static usb_callback_t cdce_ncm_bulk_read static uint32_t cdce_m_crc32(struct mbuf *, uint32_t, uint32_t); static int cdce_ioctl(struct ifnet *, u_long, caddr_t); static void cdce_start(struct ifnet *); +static void cdce_start_locked(struct ifnet *); static void cdce_init(void *); static void cdce_init_locked(struct cdce_softc *); static int cdce_rxmbuf(struct cdce_softc *, struct mbuf *, unsigned int); @@ -633,6 +634,18 @@ cdce_start(struct ifnet *ifp) { struct cdce_softc *sc = ifp->if_softc; + CDCE_LOCK(sc); + cdce_start_locked(ifp); + CDCE_UNLOCK(sc); +} + +static void +cdce_start_locked(struct ifnet *ifp) +{ + struct cdce_softc *sc = ifp->if_softc; + + CDCE_LOCK_ASSERT(sc, MA_OWNED); + /* * Start the USB transfers, if not already started: */ @@ -795,7 +808,7 @@ cdce_init_locked(struct cdce_softc *sc) usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]); /* start data transfers */ - cdce_start(sc->sc_ifp); + cdce_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_cue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_cue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_cue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -127,6 +127,7 @@ static void cue_init(void *); static void cue_init_locked(struct cue_softc *); static int cue_ioctl(struct ifnet *, u_long, caddr_t); static void cue_start(struct ifnet *); +static void cue_start_locked(struct ifnet *); static int cue_rxbuf(struct cue_softc *, struct usb_page_cache *, unsigned int, unsigned int); static void cue_rxflush(struct cue_softc *); @@ -599,6 +600,18 @@ cue_start(struct ifnet *ifp) { struct cue_softc *sc = ifp->if_softc; + CUE_LOCK(sc); + cue_start_locked(ifp); + CUE_UNLOCK(sc); +} + +static void +cue_start_locked(struct ifnet *ifp) +{ + struct cue_softc *sc = ifp->if_softc; + + CUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -659,7 +672,7 @@ cue_init_locked(struct cue_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, cue_watchdog, sc); - cue_start(sc->sc_ifp); + cue_start_locked(sc->sc_ifp); } /* Modified: user/weongyo/usb/sys/dev/usb/net/if_kue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_kue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_kue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -168,6 +168,7 @@ static void kue_init(void *); static void kue_init_locked(struct kue_softc *); static int kue_ioctl(struct ifnet *, u_long, caddr_t); static void kue_start(struct ifnet *); +static void kue_start_locked(struct ifnet *); #ifdef USB_DEBUG static int kue_debug = 0; @@ -734,6 +735,18 @@ kue_start(struct ifnet *ifp) { struct kue_softc *sc = ifp->if_softc; + KUE_LOCK(sc); + kue_start_locked(ifp); + KUE_UNLOCK(sc); +} + +static void +kue_start_locked(struct ifnet *ifp) +{ + struct kue_softc *sc = ifp->if_softc; + + KUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -778,7 +791,7 @@ kue_init_locked(struct kue_softc *sc) usbd_xfer_set_stall(sc->sc_xfer[KUE_BULK_DT_WR]); ifp->if_drv_flags |= IFF_DRV_RUNNING; - kue_start(sc->sc_ifp); + kue_start_locked(sc->sc_ifp); } static void Modified: user/weongyo/usb/sys/dev/usb/net/if_rue.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_rue.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_rue.c Tue Sep 21 23:08:12 2010 (r212981) @@ -157,6 +157,7 @@ static void rue_init(void *); static void rue_init_locked(struct rue_softc *); static int rue_ioctl(struct ifnet *, u_long, caddr_t); static void rue_start(struct ifnet *); +static void rue_start_locked(struct ifnet *); static void rue_stop(struct rue_softc *); static void rue_watchdog(void *); @@ -901,7 +902,7 @@ rue_tick(struct rue_softc *sc) && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sc_flags |= RUE_FLAG_LINK; - rue_start(sc->sc_ifp); + rue_start_locked(sc->sc_ifp); } } @@ -910,6 +911,18 @@ rue_start(struct ifnet *ifp) { struct rue_softc *sc = ifp->if_softc; + RUE_LOCK(sc); + rue_start_locked(ifp); + RUE_UNLOCK(sc); +} + +static void +rue_start_locked(struct ifnet *ifp) +{ + struct rue_softc *sc = ifp->if_softc; + + RUE_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -963,7 +976,7 @@ rue_init_locked(struct rue_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, rue_watchdog, sc); - rue_start(sc->sc_ifp); + rue_start_locked(sc->sc_ifp); } /* Modified: user/weongyo/usb/sys/dev/usb/net/if_udav.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/net/if_udav.c Tue Sep 21 22:42:14 2010 (r212980) +++ user/weongyo/usb/sys/dev/usb/net/if_udav.c Tue Sep 21 23:08:12 2010 (r212981) @@ -113,6 +113,7 @@ static void udav_init(void *); static void udav_init_locked(struct udav_softc *); static int udav_ioctl(struct ifnet *, u_long, caddr_t); static void udav_start(struct ifnet *); +static void udav_start_locked(struct ifnet *); static void udav_setmulti(void *, int); static void udav_stop(struct udav_softc *); static void udav_setpromisc(struct udav_softc *); @@ -481,7 +482,7 @@ udav_init_locked(struct udav_softc *sc) ifp->if_drv_flags |= IFF_DRV_RUNNING; sleepout_reset(&sc->sc_watchdog, hz, udav_watchdog, sc); - udav_start(sc->sc_ifp); + udav_start_locked(sc->sc_ifp); } static void @@ -578,6 +579,18 @@ udav_start(struct ifnet *ifp) { struct udav_softc *sc = ifp->if_softc; + UDAV_LOCK(sc); + udav_start_locked(ifp); + UDAV_UNLOCK(sc); +} + +static void +udav_start_locked(struct ifnet *ifp) +{ + struct udav_softc *sc = ifp->if_softc; + + UDAV_LOCK_ASSERT(sc, MA_OWNED); + /* * start the USB transfers, if not already started: */ @@ -873,7 +886,7 @@ udav_tick(struct udav_softc *sc) && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sc_flags |= UDAV_FLAG_LINK; - udav_start(sc->sc_ifp); + udav_start_locked(sc->sc_ifp); } } From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 23:25:38 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 CFCBD106564A; Tue, 21 Sep 2010 23:25:38 +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 BF2E78FC13; Tue, 21 Sep 2010 23:25:38 +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 o8LNPcLw009816; Tue, 21 Sep 2010 23:25:38 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8LNPcbO009813; Tue, 21 Sep 2010 23:25:38 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009212325.o8LNPcbO009813@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 23:25:38 +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: r212982 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 23:25:38 -0000 Author: weongyo Date: Tue Sep 21 23:25:38 2010 New Revision: 212982 URL: http://svn.freebsd.org/changeset/base/212982 Log: Records the length of DMA physical buffer also that it looks handling the DMA segments is completely wrong because there are no any places to check the DMA buffer length in USB stack. It means some physical address are overwrited by invalid USB transfers. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c user/weongyo/usb/sys/dev/usb/usb_busdma.h Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 23:08:12 2010 (r212981) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 23:25:38 2010 (r212982) @@ -434,6 +434,7 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ pg = pc->pages; 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; @@ -447,8 +448,10 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ goto done; } #endif - for (i = 1; i < nseg; i++) + for (i = 1; i < nseg; i++) { pg[i].physaddr = segs[i].ds_addr & ~(USB_PAGE_SIZE - 1); + pg[i].physlen = segs[i].ds_len; + } done: uptag->dma_error = (error ? 1 : 0); if (isload) Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 23:08:12 2010 (r212981) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Tue Sep 21 23:25:38 2010 (r212982) @@ -61,6 +61,7 @@ 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 }; From owner-svn-src-user@FreeBSD.ORG Tue Sep 21 23:47:05 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 AB506106564A; Tue, 21 Sep 2010 23:47:05 +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 9ADCD8FC0A; Tue, 21 Sep 2010 23:47:05 +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 o8LNl59U010240; Tue, 21 Sep 2010 23:47:05 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8LNl5S0010238; Tue, 21 Sep 2010 23:47:05 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009212347.o8LNl5S0010238@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 21 Sep 2010 23:47:05 +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: r212983 - user/weongyo/usb/sys/dev/usb 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: Tue, 21 Sep 2010 23:47:05 -0000 Author: weongyo Date: Tue Sep 21 23:47:05 2010 New Revision: 212983 URL: http://svn.freebsd.org/changeset/base/212983 Log: Adds a XXX comment about assertion by USB stack when it handles multiple DMA segments. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 23:25:38 2010 (r212982) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Tue Sep 21 23:47:05 2010 (r212983) @@ -449,7 +449,15 @@ usb_pc_common_mem_cb(void *arg, bus_dma_ } #endif for (i = 1; i < nseg; i++) { - pg[i].physaddr = segs[i].ds_addr & ~(USB_PAGE_SIZE - 1); + /* + * 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; } done: From owner-svn-src-user@FreeBSD.ORG Wed Sep 22 00:54:51 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 37C64106566C; Wed, 22 Sep 2010 00:54:51 +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 275468FC1C; Wed, 22 Sep 2010 00:54:51 +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 o8M0spBl011718; Wed, 22 Sep 2010 00:54:51 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8M0spjC011716; Wed, 22 Sep 2010 00:54:51 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009220054.o8M0spjC011716@svn.freebsd.org> From: Weongyo Jeong Date: Wed, 22 Sep 2010 00:54:51 +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: r212986 - user/weongyo/usb/sys/dev/usb 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: Wed, 22 Sep 2010 00:54:51 -0000 Author: weongyo Date: Wed Sep 22 00:54:50 2010 New Revision: 212986 URL: http://svn.freebsd.org/changeset/base/212986 Log: Removes unnecessary spaces; no functional changes. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 00:25:16 2010 (r212985) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 00:54:50 2010 (r212986) @@ -85,27 +85,17 @@ usbd_get_page(struct usb_page_cache *pc, #if USB_HAVE_BUSDMA if (pc->pages != NULL) { - /* 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; - if (pc->ismultiseg) { - page += (offset / USB_PAGE_SIZE); - offset %= USB_PAGE_SIZE; - res->length = USB_PAGE_SIZE - offset; res->physaddr = page->physaddr + offset; } else { @@ -113,16 +103,13 @@ usbd_get_page(struct usb_page_cache *pc, res->physaddr = page->physaddr + offset; } if (!pc->buffer) { - /* Case 1b - Non Kernel Virtual Address */ - 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 From owner-svn-src-user@FreeBSD.ORG Wed Sep 22 01:20:06 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 1322F106564A; Wed, 22 Sep 2010 01:20:06 +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 024458FC14; Wed, 22 Sep 2010 01:20:06 +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 o8M1K5lH012279; Wed, 22 Sep 2010 01:20:05 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8M1K5NE012277; Wed, 22 Sep 2010 01:20:05 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009220120.o8M1K5NE012277@svn.freebsd.org> From: Weongyo Jeong Date: Wed, 22 Sep 2010 01:20:05 +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: r212987 - user/weongyo/usb/sys/dev/usb 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: Wed, 22 Sep 2010 01:20:06 -0000 Author: weongyo Date: Wed Sep 22 01:20:05 2010 New Revision: 212987 URL: http://svn.freebsd.org/changeset/base/212987 Log: Changes the style to access pc->pages information based on the array index to make easy to check the maximum boundary of the array. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 00:54:50 2010 (r212986) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 01:20:05 2010 (r212987) @@ -82,6 +82,7 @@ usbd_get_page(struct usb_page_cache *pc, struct usb_page_search *res) { struct usb_page *page; + int index; #if USB_HAVE_BUSDMA if (pc->pages != NULL) { @@ -93,18 +94,19 @@ usbd_get_page(struct usb_page_cache *pc, offset += pc->page_offset_buf; /* compute destination page */ page = pc->pages; + index = 0; if (pc->ismultiseg) { - page += (offset / USB_PAGE_SIZE); + index += (offset / USB_PAGE_SIZE); offset %= USB_PAGE_SIZE; res->length = USB_PAGE_SIZE - offset; - res->physaddr = page->physaddr + offset; + res->physaddr = page[index].physaddr + offset; } else { res->length = 0 - 1; - res->physaddr = page->physaddr + offset; + res->physaddr = page[index].physaddr + offset; } if (!pc->buffer) { /* Case 1b - Non Kernel Virtual Address */ - res->buffer = USB_ADD_BYTES(page->buffer, offset); + res->buffer = USB_ADD_BYTES(page[index].buffer, offset); } return; } From owner-svn-src-user@FreeBSD.ORG Wed Sep 22 01:39:55 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 80F531065670; Wed, 22 Sep 2010 01:39:55 +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 708368FC13; Wed, 22 Sep 2010 01:39:55 +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 o8M1dt3R012752; Wed, 22 Sep 2010 01:39:55 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8M1dtQ8012750; Wed, 22 Sep 2010 01:39:55 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009220139.o8M1dtQ8012750@svn.freebsd.org> From: Weongyo Jeong Date: Wed, 22 Sep 2010 01:39:55 +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: r212988 - user/weongyo/usb/sys/dev/usb 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: Wed, 22 Sep 2010 01:39:55 -0000 Author: weongyo Date: Wed Sep 22 01:39:55 2010 New Revision: 212988 URL: http://svn.freebsd.org/changeset/base/212988 Log: Adds two assertion to check invalid usages of DMA pages. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 01:20:05 2010 (r212987) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 01:39:55 2010 (r212988) @@ -86,6 +86,8 @@ usbd_get_page(struct usb_page_cache *pc, #if USB_HAVE_BUSDMA if (pc->pages != NULL) { + USB_ASSERT(pc->npages > 0, + ("wrong numbers of pages (%d)", pc->npages)); /* Case 1 - something has been loaded into DMA */ if (pc->buffer) { /* Case 1a - Kernel Virtual Address */ @@ -97,6 +99,9 @@ usbd_get_page(struct usb_page_cache *pc, index = 0; if (pc->ismultiseg) { index += (offset / USB_PAGE_SIZE); + USB_ASSERT(index < pc->npages, + ("invalid index number (%d / %d)", index, + pc->npages)); offset %= USB_PAGE_SIZE; res->length = USB_PAGE_SIZE - offset; res->physaddr = page[index].physaddr + offset; From owner-svn-src-user@FreeBSD.ORG Wed Sep 22 19:08:17 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 C368C1065744; Wed, 22 Sep 2010 19:08:17 +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 B459E8FC12; Wed, 22 Sep 2010 19:08:17 +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 o8MJ8HBP039896; Wed, 22 Sep 2010 19:08:17 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8MJ8HNJ039894; Wed, 22 Sep 2010 19:08:17 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009221908.o8MJ8HNJ039894@svn.freebsd.org> From: Weongyo Jeong Date: Wed, 22 Sep 2010 19:08:17 +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: r213010 - user/weongyo/usb/sys/dev/usb 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: Wed, 22 Sep 2010 19:08:17 -0000 Author: weongyo Date: Wed Sep 22 19:08:17 2010 New Revision: 213010 URL: http://svn.freebsd.org/changeset/base/213010 Log: Returns with correct buffer length for a single page case. In the previous there was no way to check the boundary because the length was always -1. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 19:08:11 2010 (r213009) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 19:08:17 2010 (r213010) @@ -78,10 +78,11 @@ static void usb_pc_common_mem_cb(void *, * been properly initialized ! *------------------------------------------------------------------------*/ void -usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset, +usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset0, struct usb_page_search *res) { struct usb_page *page; + usb_frlength_t offset = offset0; int index; #if USB_HAVE_BUSDMA @@ -106,7 +107,10 @@ usbd_get_page(struct usb_page_cache *pc, res->length = USB_PAGE_SIZE - offset; res->physaddr = page[index].physaddr + offset; } else { - res->length = 0 - 1; + 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; } if (!pc->buffer) { From owner-svn-src-user@FreeBSD.ORG Wed Sep 22 19:12:23 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 F3720106566C; Wed, 22 Sep 2010 19:12:22 +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 E47B58FC1D; Wed, 22 Sep 2010 19:12:22 +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 o8MJCMcu040013; Wed, 22 Sep 2010 19:12:22 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8MJCMk8040011; Wed, 22 Sep 2010 19:12:22 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009221912.o8MJCMk8040011@svn.freebsd.org> From: Weongyo Jeong Date: Wed, 22 Sep 2010 19:12:22 +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: r213011 - user/weongyo/usb/sys/dev/usb 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: Wed, 22 Sep 2010 19:12:23 -0000 Author: weongyo Date: Wed Sep 22 19:12:22 2010 New Revision: 213011 URL: http://svn.freebsd.org/changeset/base/213011 Log: Adds a assertion. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 19:08:17 2010 (r213010) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 19:12:22 2010 (r213011) @@ -107,6 +107,8 @@ usbd_get_page(struct usb_page_cache *pc, res->length = USB_PAGE_SIZE - offset; res->physaddr = page[index].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)); From owner-svn-src-user@FreeBSD.ORG Wed Sep 22 20:07:03 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 43D60106564A; Wed, 22 Sep 2010 20:07:03 +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 34C9F8FC13; Wed, 22 Sep 2010 20:07:03 +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 o8MK73xj041862; Wed, 22 Sep 2010 20:07:03 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8MK73sY041860; Wed, 22 Sep 2010 20:07:03 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009222007.o8MK73sY041860@svn.freebsd.org> From: Weongyo Jeong Date: Wed, 22 Sep 2010 20:07:03 +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: r213022 - user/weongyo/usb/sys/dev/usb 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: Wed, 22 Sep 2010 20:07:03 -0000 Author: weongyo Date: Wed Sep 22 20:07:02 2010 New Revision: 213022 URL: http://svn.freebsd.org/changeset/base/213022 Log: Calculates the remained buffer if pc->ismultiseg == 1. According to the current implementation the last segment should be handled carefully because its position could vary. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 20:04:03 2010 (r213021) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Wed Sep 22 20:07:02 2010 (r213022) @@ -82,7 +82,7 @@ usbd_get_page(struct usb_page_cache *pc, struct usb_page_search *res) { struct usb_page *page; - usb_frlength_t offset = offset0; + usb_frlength_t end, offset = offset0; int index; #if USB_HAVE_BUSDMA @@ -104,7 +104,17 @@ usbd_get_page(struct usb_page_cache *pc, ("invalid index number (%d / %d)", index, pc->npages)); offset %= USB_PAGE_SIZE; - res->length = USB_PAGE_SIZE - offset; + /* 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; } else { USB_ASSERT(pc->npages == 1, From owner-svn-src-user@FreeBSD.ORG Thu Sep 23 01:19:31 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 A5588106566C; Thu, 23 Sep 2010 01:19:31 +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 92D968FC13; Thu, 23 Sep 2010 01:19:31 +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 o8N1JVBX049874; Thu, 23 Sep 2010 01:19:31 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8N1JVet049865; Thu, 23 Sep 2010 01:19:31 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009230119.o8N1JVet049865@svn.freebsd.org> From: Weongyo Jeong Date: Thu, 23 Sep 2010 01:19:31 +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: r213043 - 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: Thu, 23 Sep 2010 01:19:31 -0000 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 */ )) { From owner-svn-src-user@FreeBSD.ORG Fri Sep 24 21:40: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 9E7121065670; Fri, 24 Sep 2010 21:40: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 8DFE48FC19; Fri, 24 Sep 2010 21:40: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 o8OLeS4E040481; Fri, 24 Sep 2010 21:40:28 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8OLeSqP040478; Fri, 24 Sep 2010 21:40:28 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009242140.o8OLeSqP040478@svn.freebsd.org> From: Weongyo Jeong Date: Fri, 24 Sep 2010 21:40:28 +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: r213141 - user/weongyo/usb/sys/dev/usb 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: Fri, 24 Sep 2010 21:40:28 -0000 Author: weongyo Date: Fri Sep 24 21:40:28 2010 New Revision: 213141 URL: http://svn.freebsd.org/changeset/base/213141 Log: Removes `buffer' variable of struct usb_page that could not find any places to set this. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c user/weongyo/usb/sys/dev/usb/usb_busdma.h Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 21:23:23 2010 (r213140) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 21:40:28 2010 (r213141) @@ -112,12 +112,6 @@ usbd_get_page(struct usb_page_cache *pc, res->length = 0 - 1; res->physaddr = page->physaddr + offset; } - if (!pc->buffer) { - - /* Case 1b - Non Kernel Virtual Address */ - - res->buffer = USB_ADD_BYTES(page->buffer, offset); - } return; } #endif Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Fri Sep 24 21:23:23 2010 (r213140) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Fri Sep 24 21:40:28 2010 (r213141) @@ -61,7 +61,6 @@ typedef void (usb_dma_callback_t)(struct struct usb_page { #if USB_HAVE_BUSDMA bus_addr_t physaddr; - void *buffer; /* non Kernel Virtual Address */ #endif }; From owner-svn-src-user@FreeBSD.ORG Fri Sep 24 21:41:57 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 3E278106564A; Fri, 24 Sep 2010 21:41:57 +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 2DEE58FC0C; Fri, 24 Sep 2010 21:41:57 +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 o8OLfvd9040549; Fri, 24 Sep 2010 21:41:57 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8OLfvOA040547; Fri, 24 Sep 2010 21:41:57 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009242141.o8OLfvOA040547@svn.freebsd.org> From: Weongyo Jeong Date: Fri, 24 Sep 2010 21:41:57 +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: r213142 - user/weongyo/usb/sys/dev/usb 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: Fri, 24 Sep 2010 21:41:57 -0000 Author: weongyo Date: Fri Sep 24 21:41:56 2010 New Revision: 213142 URL: http://svn.freebsd.org/changeset/base/213142 Log: Removes unnecessary spaces Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 21:40:28 2010 (r213141) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 21:41:56 2010 (r213142) @@ -85,27 +85,17 @@ usbd_get_page(struct usb_page_cache *pc, #if USB_HAVE_BUSDMA 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->page_start; - if (pc->ismultiseg) { - page += (offset / USB_PAGE_SIZE); - offset %= USB_PAGE_SIZE; - res->length = USB_PAGE_SIZE - offset; res->physaddr = page->physaddr + offset; } else { @@ -116,7 +106,6 @@ usbd_get_page(struct usb_page_cache *pc, } #endif /* Case 2 - Plain PIO */ - res->buffer = USB_ADD_BYTES(pc->buffer, offset); res->length = 0 - 1; #if USB_HAVE_BUSDMA From owner-svn-src-user@FreeBSD.ORG Fri Sep 24 21:55:45 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 027E0106564A; Fri, 24 Sep 2010 21:55:45 +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 E649F8FC08; Fri, 24 Sep 2010 21:55:44 +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 o8OLti0g040858; Fri, 24 Sep 2010 21:55:44 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8OLtir5040856; Fri, 24 Sep 2010 21:55:44 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009242155.o8OLtir5040856@svn.freebsd.org> From: Weongyo Jeong Date: Fri, 24 Sep 2010 21:55:44 +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: r213143 - user/weongyo/usb/sys/dev/usb 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: Fri, 24 Sep 2010 21:55:45 -0000 Author: weongyo Date: Fri Sep 24 21:55:44 2010 New Revision: 213143 URL: http://svn.freebsd.org/changeset/base/213143 Log: Commits a experimental patch that I couldn't find cases when pc->buffer is NULL. If this assertion is failed it means `struct usb_page_cache' is accessed after free or after encounting errors. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 21:41:56 2010 (r213142) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 21:55:44 2010 (r213143) @@ -85,11 +85,8 @@ usbd_get_page(struct usb_page_cache *pc, #if USB_HAVE_BUSDMA 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); - } + USB_ASSERT(pc->buffer != NULL, ("pc->buffer is NULL")); + res->buffer = USB_ADD_BYTES(pc->buffer, offset); offset += pc->page_offset_buf; /* compute destination page */ page = pc->page_start; From owner-svn-src-user@FreeBSD.ORG Fri Sep 24 23:56:25 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 D9EEC1065694; Fri, 24 Sep 2010 23:56:25 +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 C925C8FC08; Fri, 24 Sep 2010 23:56:25 +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 o8ONuPtw043451; Fri, 24 Sep 2010 23:56:25 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8ONuPYg043448; Fri, 24 Sep 2010 23:56:25 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009242356.o8ONuPYg043448@svn.freebsd.org> From: Weongyo Jeong Date: Fri, 24 Sep 2010 23:56:25 +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: r213148 - user/weongyo/usb/sys/dev/usb 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: Fri, 24 Sep 2010 23:56:25 -0000 Author: weongyo Date: Fri Sep 24 23:56:25 2010 New Revision: 213148 URL: http://svn.freebsd.org/changeset/base/213148 Log: Records the length of the local buffer. It'd be used to check the buffer boundary. Modified: user/weongyo/usb/sys/dev/usb/usb_core.h user/weongyo/usb/sys/dev/usb/usb_transfer.c Modified: user/weongyo/usb/sys/dev/usb/usb_core.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_core.h Fri Sep 24 23:54:03 2010 (r213147) +++ user/weongyo/usb/sys/dev/usb/usb_core.h Fri Sep 24 23:56:25 2010 (r213148) @@ -136,6 +136,7 @@ struct usb_xfer { void *priv_sc; /* device driver data pointer 1 */ void *priv_fifo; /* device driver data pointer 2 */ void *local_buffer; + int local_buflen; usb_frlength_t *frlengths; struct usb_page_cache *frbuffers; usb_callback_t *callback; Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_transfer.c Fri Sep 24 23:54:03 2010 (r213147) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Fri Sep 24 23:56:25 2010 (r213148) @@ -628,6 +628,7 @@ usbd_transfer_setup_sub(struct usb_setup xfer->local_buffer = USB_ADD_BYTES(parm->buf, parm->size[0]); + xfer->local_buflen = parm->bufsize; usbd_xfer_set_frame_offset(xfer, 0, 0); From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 00:01:56 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 72FF6106566B; Sat, 25 Sep 2010 00:01:56 +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 47F038FC14; Sat, 25 Sep 2010 00:01:56 +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 o8P01uIV043670; Sat, 25 Sep 2010 00:01:56 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8P01u2N043666; Sat, 25 Sep 2010 00:01:56 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009250001.o8P01u2N043666@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 00:01:56 +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: r213149 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 00:01:56 -0000 Author: weongyo Date: Sat Sep 25 00:01:55 2010 New Revision: 213149 URL: http://svn.freebsd.org/changeset/base/213149 Log: Records the buffer length also at struct usb_page_cahce. It'd be used to check the buffer boundary. Modified: 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_transfer.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Fri Sep 24 23:56:25 2010 (r213148) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 00:01:55 2010 (r213149) @@ -503,6 +503,7 @@ usb_pc_alloc_mem(struct usb_page_cache * } /* setup page cache */ pc->buffer = ptr; + pc->buflen = size; pc->page_start = pg; pc->page_offset_buf = 0; pc->page_offset_end = size; @@ -536,6 +537,7 @@ usb_pc_alloc_mem(struct usb_page_cache * error: /* reset most of the page cache */ pc->buffer = NULL; + pc->buflen = 0; pc->page_start = NULL; pc->page_offset_buf = 0; pc->page_offset_end = 0; @@ -559,6 +561,7 @@ usb_pc_free_mem(struct usb_page_cache *p bus_dmamem_free(pc->tag, pc->buffer, pc->map); pc->buffer = NULL; + pc->buflen = 0; } } Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.h Fri Sep 24 23:56:25 2010 (r213148) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.h Sat Sep 25 00:01:55 2010 (r213149) @@ -90,6 +90,7 @@ struct usb_page_cache { #endif struct usb_dma_parent_tag *tag_parent; /* always set */ void *buffer; /* virtual buffer pointer */ + int buflen; #if USB_HAVE_BUSDMA usb_size_t page_offset_buf; usb_size_t page_offset_end; Modified: user/weongyo/usb/sys/dev/usb/usb_transfer.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_transfer.c Fri Sep 24 23:56:25 2010 (r213148) +++ user/weongyo/usb/sys/dev/usb/usb_transfer.c Sat Sep 25 00:01:55 2010 (r213149) @@ -284,6 +284,7 @@ usbd_transfer_setup_sub_malloc(struct us return (1); /* failure */ } pc->buffer = USB_ADD_BYTES(buf, y * size); + pc->buflen = size; pc->page_start = pg; mtx_lock(pc->tag_parent->mtx); @@ -1888,6 +1889,7 @@ usbd_xfer_set_frame_data(struct usb_xfer /* set virtual address to load and length */ xfer->frbuffers[frindex].buffer = ptr; + xfer->frbuffers[frindex].buflen = len; usbd_xfer_set_frame_len(xfer, frindex, len); } @@ -1934,6 +1936,7 @@ usbd_xfer_set_frame_offset(struct usb_xf /* set virtual address to load */ xfer->frbuffers[frindex].buffer = USB_ADD_BYTES(xfer->local_buffer, offset); + xfer->frbuffers[frindex].buflen = xfer->local_buflen - offset; } void From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 01:23:27 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 1BA021065698; Sat, 25 Sep 2010 01:23:27 +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 F40478FC36; Sat, 25 Sep 2010 01:23:26 +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 o8P1NQ6Z045346; Sat, 25 Sep 2010 01:23:26 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8P1NQG2045344; Sat, 25 Sep 2010 01:23:26 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009250123.o8P1NQG2045344@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 01:23:26 +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: r213151 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 01:23:27 -0000 Author: weongyo Date: Sat Sep 25 01:23:26 2010 New Revision: 213151 URL: http://svn.freebsd.org/changeset/base/213151 Log: Adds an assertion to check the buffer boundary. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 01:18:01 2010 (r213150) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 01:23:26 2010 (r213151) @@ -126,6 +126,13 @@ usbd_copy_in(struct usb_page_cache *cach if (buf_res.length > len) { buf_res.length = len; } + + /* Checks the buffer boundary */ + USB_ASSERT((char *)buf_res.buffer + buf_res.length <= + (char *)cache->buffer + cache->buflen, + ("overflow is happened (%p %d/%p %d)", buf_res.buffer, + buf_res.length, cache->buffer, cache->buflen)); + bcopy(ptr, buf_res.buffer, buf_res.length); offset += buf_res.length; @@ -156,6 +163,13 @@ usbd_copy_in_user(struct usb_page_cache if (buf_res.length > len) { buf_res.length = len; } + + /* Checks the buffer boundary */ + USB_ASSERT((char *)buf_res.buffer + buf_res.length <= + (char *)cache->buffer + cache->buflen, + ("overflow is happened (%p %d/%p %d)", buf_res.buffer, + buf_res.length, cache->buffer, cache->buflen)); + error = copyin(ptr, buf_res.buffer, buf_res.length); if (error) return (error); @@ -216,6 +230,13 @@ usb_uiomove(struct usb_page_cache *pc, s if (res.length > len) { res.length = len; } + + /* Checks the buffer boundary */ + USB_ASSERT((char *)res.buffer + res.length <= + (char *)pc->buffer + pc->buflen, + ("overflow is happened (%p %d/%p %d)", res.buffer, + res.length, pc->buffer, pc->buflen)); + /* * "uiomove()" can sleep so one needs to make a wrapper, * exiting the mutex and checking things @@ -248,6 +269,13 @@ usbd_copy_out(struct usb_page_cache *cac if (res.length > len) { res.length = len; } + + /* Checks the buffer boundary */ + USB_ASSERT((char *)res.buffer + res.length <= + (char *)cache->buffer + cache->buflen, + ("overflow is happened (%p %d/%p %d)", res.buffer, + res.length, cache->buffer, cache->buflen)); + bcopy(res.buffer, ptr, res.length); offset += res.length; @@ -278,6 +306,13 @@ usbd_copy_out_user(struct usb_page_cache if (res.length > len) { res.length = len; } + + /* Checks the buffer boundary */ + USB_ASSERT((char *)res.buffer + res.length <= + (char *)cache->buffer + cache->buflen, + ("overflow is happened (%p %d/%p %d)", res.buffer, + res.length, cache->buffer, cache->buflen)); + error = copyout(res.buffer, ptr, res.length); if (error) return (error); @@ -306,6 +341,13 @@ usbd_frame_zero(struct usb_page_cache *c if (res.length > len) { res.length = len; } + + /* Checks the buffer boundary */ + USB_ASSERT((char *)res.buffer + res.length <= + (char *)cache->buffer + cache->buflen, + ("overflow is happened (%p %d/%p %d)", res.buffer, + res.length, cache->buffer, cache->buflen)); + bzero(res.buffer, res.length); offset += res.length; From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 01:25:48 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 97B281065674; Sat, 25 Sep 2010 01:25:48 +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 6C25F8FC17; Sat, 25 Sep 2010 01:25:48 +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 o8P1PmEJ045424; Sat, 25 Sep 2010 01:25:48 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8P1PmJB045422; Sat, 25 Sep 2010 01:25:48 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009250125.o8P1PmJB045422@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 01:25:48 +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: r213152 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 01:25:48 -0000 Author: weongyo Date: Sat Sep 25 01:25:48 2010 New Revision: 213152 URL: http://svn.freebsd.org/changeset/base/213152 Log: Renames `buf_res' to `res' for readability that in some places it named as `res' but in other places it named as `buf_res'. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 01:23:26 2010 (r213151) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 01:25:48 2010 (r213152) @@ -117,27 +117,27 @@ void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len) { - struct usb_page_search buf_res; + struct usb_page_search res; while (len != 0) { - usbd_get_page(cache, offset, &buf_res); + usbd_get_page(cache, offset, &res); - if (buf_res.length > len) { - buf_res.length = len; + if (res.length > len) { + res.length = len; } /* Checks the buffer boundary */ - USB_ASSERT((char *)buf_res.buffer + buf_res.length <= + USB_ASSERT((char *)res.buffer + res.length <= (char *)cache->buffer + cache->buflen, - ("overflow is happened (%p %d/%p %d)", buf_res.buffer, - buf_res.length, cache->buffer, cache->buflen)); + ("overflow is happened (%p %d/%p %d)", res.buffer, + res.length, cache->buffer, cache->buflen)); - bcopy(ptr, buf_res.buffer, buf_res.length); + bcopy(ptr, res.buffer, res.length); - offset += buf_res.length; - len -= buf_res.length; - ptr = USB_ADD_BYTES(ptr, buf_res.length); + offset += res.length; + len -= res.length; + ptr = USB_ADD_BYTES(ptr, res.length); } } @@ -153,30 +153,30 @@ int usbd_copy_in_user(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len) { - struct usb_page_search buf_res; + struct usb_page_search res; int error; while (len != 0) { - usbd_get_page(cache, offset, &buf_res); + usbd_get_page(cache, offset, &res); - if (buf_res.length > len) { - buf_res.length = len; + if (res.length > len) { + res.length = len; } /* Checks the buffer boundary */ - USB_ASSERT((char *)buf_res.buffer + buf_res.length <= + USB_ASSERT((char *)res.buffer + res.length <= (char *)cache->buffer + cache->buflen, - ("overflow is happened (%p %d/%p %d)", buf_res.buffer, - buf_res.length, cache->buffer, cache->buflen)); + ("overflow is happened (%p %d/%p %d)", res.buffer, + res.length, cache->buffer, cache->buflen)); - error = copyin(ptr, buf_res.buffer, buf_res.length); + error = copyin(ptr, res.buffer, res.length); if (error) return (error); - offset += buf_res.length; - len -= buf_res.length; - ptr = USB_ADD_BYTES(ptr, buf_res.length); + offset += res.length; + len -= res.length; + ptr = USB_ADD_BYTES(ptr, res.length); } return (0); /* success */ } From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 21:02:42 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 A2F2B106566B; Sat, 25 Sep 2010 21:02:42 +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 92D588FC08; Sat, 25 Sep 2010 21:02:42 +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 o8PL2gt2072955; Sat, 25 Sep 2010 21:02:42 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8PL2gsN072953; Sat, 25 Sep 2010 21:02:42 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009252102.o8PL2gsN072953@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 21:02:42 +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: r213175 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 21:02:42 -0000 Author: weongyo Date: Sat Sep 25 21:02:42 2010 New Revision: 213175 URL: http://svn.freebsd.org/changeset/base/213175 Log: Removes a wrong comment; this path is reached even if the host controller is not PIO mode. For example transfering the request to the default pipe would be reached here. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 18:27:29 2010 (r213174) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:02:42 2010 (r213175) @@ -102,7 +102,6 @@ usbd_get_page(struct usb_page_cache *pc, return; } #endif - /* Case 2 - Plain PIO */ res->buffer = USB_ADD_BYTES(pc->buffer, offset); res->length = 0 - 1; #if USB_HAVE_BUSDMA From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 21:06:53 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 8CF75106566B; Sat, 25 Sep 2010 21:06:53 +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 7CE3F8FC1B; Sat, 25 Sep 2010 21:06:53 +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 o8PL6rZt073066; Sat, 25 Sep 2010 21:06:53 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8PL6rPU073064; Sat, 25 Sep 2010 21:06:53 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009252106.o8PL6rPU073064@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 21:06:53 +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: r213176 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 21:06:53 -0000 Author: weongyo Date: Sat Sep 25 21:06:53 2010 New Revision: 213176 URL: http://svn.freebsd.org/changeset/base/213176 Log: A code cleanup. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:02:42 2010 (r213175) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:06:53 2010 (r213176) @@ -84,12 +84,10 @@ usbd_get_page(struct usb_page_cache *pc, struct usb_page *page; #if USB_HAVE_BUSDMA - if (pc->page_start) { + if ((page = pc->page_start) != NULL) { USB_ASSERT(pc->buffer != NULL, ("pc->buffer is NULL")); res->buffer = USB_ADD_BYTES(pc->buffer, offset); offset += pc->page_offset_buf; - /* compute destination page */ - page = pc->page_start; if (pc->ismultiseg) { page += (offset / USB_PAGE_SIZE); offset %= USB_PAGE_SIZE; From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 21:25:16 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 20D6D106566C; Sat, 25 Sep 2010 21:25:16 +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 0FA638FC0A; Sat, 25 Sep 2010 21:25:16 +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 o8PLPFS9073453; Sat, 25 Sep 2010 21:25:15 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8PLPFcM073451; Sat, 25 Sep 2010 21:25:15 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009252125.o8PLPFcM073451@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 21:25:15 +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: r213177 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 21:25:16 -0000 Author: weongyo Date: Sat Sep 25 21:25:15 2010 New Revision: 213177 URL: http://svn.freebsd.org/changeset/base/213177 Log: style(9); no functional changes. Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:06:53 2010 (r213176) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:25:15 2010 (r213177) @@ -117,12 +117,9 @@ usbd_copy_in(struct usb_page_cache *cach struct usb_page_search res; while (len != 0) { - usbd_get_page(cache, offset, &res); - - if (res.length > len) { + if (res.length > len) res.length = len; - } /* Checks the buffer boundary */ USB_ASSERT((char *)res.buffer + res.length <= @@ -154,12 +151,9 @@ usbd_copy_in_user(struct usb_page_cache int error; while (len != 0) { - usbd_get_page(cache, offset, &res); - - if (res.length > len) { + if (res.length > len) res.length = len; - } /* Checks the buffer boundary */ USB_ASSERT((char *)res.buffer + res.length <= @@ -221,12 +215,9 @@ usb_uiomove(struct usb_page_cache *pc, s int error = 0; while (len != 0) { - usbd_get_page(pc, pc_offset, &res); - - if (res.length > len) { + if (res.length > len) res.length = len; - } /* Checks the buffer boundary */ USB_ASSERT((char *)res.buffer + res.length <= @@ -239,7 +230,6 @@ usb_uiomove(struct usb_page_cache *pc, s * exiting the mutex and checking things */ error = uiomove(res.buffer, res.length, uio); - if (error) { break; } @@ -260,12 +250,9 @@ usbd_copy_out(struct usb_page_cache *cac struct usb_page_search res; while (len != 0) { - usbd_get_page(cache, offset, &res); - - if (res.length > len) { + if (res.length > len) res.length = len; - } /* Checks the buffer boundary */ USB_ASSERT((char *)res.buffer + res.length <= @@ -297,12 +284,9 @@ usbd_copy_out_user(struct usb_page_cache int error; while (len != 0) { - usbd_get_page(cache, offset, &res); - - if (res.length > len) { + if (res.length > len) res.length = len; - } /* Checks the buffer boundary */ USB_ASSERT((char *)res.buffer + res.length <= @@ -332,12 +316,9 @@ usbd_frame_zero(struct usb_page_cache *c struct usb_page_search res; while (len != 0) { - usbd_get_page(cache, offset, &res); - - if (res.length > len) { + if (res.length > len) res.length = len; - } /* Checks the buffer boundary */ USB_ASSERT((char *)res.buffer + res.length <= @@ -404,6 +385,7 @@ usb_dma_tag_create(struct usb_dma_tag *u static void usb_dma_tag_destroy(struct usb_dma_tag *udt) { + bus_dma_tag_destroy(udt->tag); } @@ -414,6 +396,7 @@ static void usb_pc_alloc_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) { + usb_pc_common_mem_cb(arg, segs, nseg, error, 0, 1); } @@ -424,6 +407,7 @@ static void usb_pc_load_mem_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) { + usb_pc_common_mem_cb(arg, segs, nseg, error, 1, 0); } @@ -525,21 +509,18 @@ usb_pc_alloc_mem(struct usb_page_cache * * memory, hence we sometimes to a large number of * small allocations! */ - if (size <= (USB_PAGE_SIZE / 2)) { + if (size <= (USB_PAGE_SIZE / 2)) size *= 2; - } #endif } /* get the correct DMA tag */ utag = usb_dma_tag_find(uptag, size, align); - if (utag == NULL) { + if (utag == NULL) goto error; - } /* allocate memory */ - if (bus_dmamem_alloc( - utag->tag, &ptr, (BUS_DMA_WAITOK | BUS_DMA_COHERENT), &map)) { + if (bus_dmamem_alloc(utag->tag, &ptr, + (BUS_DMA_WAITOK | BUS_DMA_COHERENT), &map)) goto error; - } /* setup page cache */ pc->buffer = ptr; pc->buflen = size; @@ -553,14 +534,13 @@ usb_pc_alloc_mem(struct usb_page_cache * mtx_lock(uptag->mtx); /* load memory into DMA */ - err = bus_dmamap_load( - utag->tag, map, ptr, size, &usb_pc_alloc_mem_cb, + err = bus_dmamap_load(utag->tag, map, ptr, size, &usb_pc_alloc_mem_cb, pc, (BUS_DMA_WAITOK | BUS_DMA_COHERENT)); - if (err == EINPROGRESS) { cv_wait(uptag->cv, uptag->mtx); err = 0; } + mtx_unlock(uptag->mtx); if (err || uptag->dma_error) { @@ -593,12 +573,10 @@ error: void usb_pc_free_mem(struct usb_page_cache *pc) { - if (pc && pc->buffer) { + if (pc && pc->buffer) { bus_dmamap_unload(pc->tag, pc->map); - bus_dmamem_free(pc->tag, pc->buffer, pc->map); - pc->buffer = NULL; pc->buflen = 0; } @@ -614,6 +592,7 @@ usb_pc_free_mem(struct usb_page_cache *p uint8_t usb_pc_load_mem(struct usb_page_cache *pc, usb_size_t size, uint8_t sync) { + /* setup page cache */ pc->page_offset_buf = 0; pc->page_offset_end = size; @@ -637,16 +616,14 @@ usb_pc_load_mem(struct usb_page_cache *p /* * Try to load memory into DMA. */ - err = bus_dmamap_load( - pc->tag, pc->map, pc->buffer, size, - &usb_pc_alloc_mem_cb, pc, BUS_DMA_WAITOK); + err = bus_dmamap_load(pc->tag, pc->map, pc->buffer, + size, &usb_pc_alloc_mem_cb, pc, BUS_DMA_WAITOK); if (err == EINPROGRESS) { cv_wait(uptag->cv, uptag->mtx); err = 0; } - if (err || uptag->dma_error) { + if (err || uptag->dma_error) return (1); - } } else { /* @@ -659,10 +636,8 @@ usb_pc_load_mem(struct usb_page_cache *p * Try to load memory into DMA. The callback * will be called in all cases: */ - if (bus_dmamap_load( - pc->tag, pc->map, pc->buffer, size, - &usb_pc_load_mem_cb, pc, BUS_DMA_WAITOK)) { - } + (void)bus_dmamap_load(pc->tag, pc->map, pc->buffer, + size, &usb_pc_load_mem_cb, pc, BUS_DMA_WAITOK); } } else { if (!sync) { @@ -683,6 +658,7 @@ usb_pc_load_mem(struct usb_page_cache *p void usb_pc_cpu_invalidate(struct usb_page_cache *pc) { + if (pc->page_offset_end == pc->page_offset_buf) { /* nothing has been loaded into this page cache! */ return; @@ -703,6 +679,7 @@ usb_pc_cpu_invalidate(struct usb_page_ca void usb_pc_cpu_flush(struct usb_page_cache *pc) { + if (pc->page_offset_end == pc->page_offset_buf) { /* nothing has been loaded into this page cache! */ return; @@ -723,24 +700,18 @@ usb_pc_dmamap_create(struct usb_page_cac struct usb_xfer_root *info; struct usb_dma_tag *utag; - /* get info */ + /* get info and sanity check */ info = USB_DMATAG_TO_XROOT(pc->tag_parent); - - /* sanity check */ - if (info == NULL) { + if (info == NULL) goto error; - } utag = usb_dma_tag_find(pc->tag_parent, size, 1); - if (utag == NULL) { + if (utag == NULL) goto error; - } /* create DMA map */ - if (bus_dmamap_create(utag->tag, 0, &pc->map)) { + if (bus_dmamap_create(utag->tag, 0, &pc->map)) goto error; - } pc->tag = utag->tag; return 0; /* success */ - error: pc->map = NULL; pc->tag = NULL; @@ -755,6 +726,7 @@ error: void usb_pc_dmamap_destroy(struct usb_page_cache *pc) { + if (pc && pc->tag) { bus_dmamap_destroy(pc->tag, pc->map); pc->tag = NULL; @@ -769,29 +741,23 @@ struct usb_dma_tag * usb_dma_tag_find(struct usb_dma_parent_tag *udpt, usb_size_t size, usb_size_t align) { - struct usb_dma_tag *udt; - uint8_t nudt; + struct usb_dma_tag *udt = udpt->utag_first; + uint8_t nudt = udpt->utag_max; USB_ASSERT(align > 0, ("Invalid parameter align = 0\n")); USB_ASSERT(size > 0, ("Invalid parameter size = 0\n")); - udt = udpt->utag_first; - nudt = udpt->utag_max; - while (nudt--) { - if (udt->align == 0) { usb_dma_tag_create(udt, size, align); - if (udt->tag == NULL) { + if (udt->tag == NULL) return (NULL); - } udt->align = align; udt->size = size; return (udt); } - if ((udt->align == align) && (udt->size == size)) { + if ((udt->align == align) && (udt->size == size)) return (udt); - } udt++; } return (NULL); @@ -801,20 +767,17 @@ usb_dma_tag_find(struct usb_dma_parent_t * usb_dma_tag_setup - initialise USB DMA tags *------------------------------------------------------------------------*/ void -usb_dma_tag_setup(struct usb_dma_parent_tag *udpt, - struct usb_dma_tag *udt, bus_dma_tag_t dmat, - struct mtx *mtx, usb_dma_callback_t *func, +usb_dma_tag_setup(struct usb_dma_parent_tag *udpt, struct usb_dma_tag *udt, + bus_dma_tag_t dmat, struct mtx *mtx, usb_dma_callback_t *func, uint8_t ndmabits, uint8_t nudt) { + bzero(udpt, sizeof(*udpt)); /* sanity checking */ - if ((nudt == 0) || - (ndmabits == 0) || - (mtx == NULL)) { - /* something is corrupt */ + if (nudt == 0 || ndmabits == 0 || mtx == NULL) return; - } + /* initialise condition variable */ cv_init(udpt->cv, "USB DMA CV"); @@ -839,14 +802,10 @@ usb_dma_tag_setup(struct usb_dma_parent_ void usb_dma_tag_unsetup(struct usb_dma_parent_tag *udpt) { - struct usb_dma_tag *udt; - uint8_t nudt; - - udt = udpt->utag_first; - nudt = udpt->utag_max; + struct usb_dma_tag *udt = udpt->utag_first; + uint8_t nudt = udpt->utag_max; while (nudt--) { - if (udt->align) { /* destroy the USB DMA tag */ usb_dma_tag_destroy(udt); @@ -961,7 +920,6 @@ usb_bdma_work_loop(struct usb_xfer_queue return; } if (info->dma_currframe != info->dma_nframes) { - if (info->dma_currframe == 0) { /* special case */ usb_pc_load_mem(xfer->frbuffers, @@ -975,15 +933,12 @@ usb_bdma_work_loop(struct usb_xfer_queue /* advance frame index */ info->dma_currframe++; - return; } /* go ahead */ usb_bdma_pre_sync(xfer); - /* start loading next USB transfer, if any */ usb_command_wrapper(pq, NULL); - /* finally start the hardware */ usbd_pipe_enter(xfer); } @@ -997,9 +952,7 @@ usb_bdma_work_loop(struct usb_xfer_queue void usb_bdma_done_event(struct usb_dma_parent_tag *udpt) { - struct usb_xfer_root *info; - - info = USB_DMATAG_TO_XROOT(udpt); + struct usb_xfer_root *info = USB_DMATAG_TO_XROOT(udpt); mtx_assert(info->xfer_mtx, MA_OWNED); @@ -1034,12 +987,10 @@ usb_bdma_pre_sync(struct usb_xfer *xfer) pc = xfer->frbuffers; while (nframes--) { - - if (pc->isread) { + if (pc->isread) usb_pc_cpu_invalidate(pc); - } else { + else usb_pc_cpu_flush(pc); - } pc++; } } @@ -1067,9 +1018,8 @@ usb_bdma_post_sync(struct usb_xfer *xfer pc = xfer->frbuffers; while (nframes--) { - if (pc->isread) { + if (pc->isread) usb_pc_cpu_invalidate(pc); - } pc++; } } From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 21:25:46 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 E25E71065670; Sat, 25 Sep 2010 21:25:46 +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 D24668FC13; Sat, 25 Sep 2010 21:25:46 +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 o8PLPklU073498; Sat, 25 Sep 2010 21:25:46 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8PLPkOR073496; Sat, 25 Sep 2010 21:25:46 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009252125.o8PLPkOR073496@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 21:25:46 +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: r213178 - user/weongyo/usb/sys/dev/usb 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: Sat, 25 Sep 2010 21:25:47 -0000 Author: weongyo Date: Sat Sep 25 21:25:46 2010 New Revision: 213178 URL: http://svn.freebsd.org/changeset/base/213178 Log: style(9) Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c Modified: user/weongyo/usb/sys/dev/usb/usb_busdma.c ============================================================================== --- user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:25:15 2010 (r213177) +++ user/weongyo/usb/sys/dev/usb/usb_busdma.c Sat Sep 25 21:25:46 2010 (r213178) @@ -62,7 +62,8 @@ #include #if USB_HAVE_BUSDMA -static void usb_dma_tag_create(struct usb_dma_tag *, usb_size_t, usb_size_t); +static void usb_dma_tag_create(struct usb_dma_tag *, usb_size_t, + usb_size_t); static void usb_dma_tag_destroy(struct usb_dma_tag *); static void usb_dma_lock_cb(void *, bus_dma_lock_op_t); static void usb_pc_alloc_mem_cb(void *, bus_dma_segment_t *, int, int); From owner-svn-src-user@FreeBSD.ORG Sat Sep 25 21:55:40 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 D5641106566C; Sat, 25 Sep 2010 21:55:40 +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 C498D8FC14; Sat, 25 Sep 2010 21:55:40 +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 o8PLteoE074066; Sat, 25 Sep 2010 21:55:40 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8PLteq2074064; Sat, 25 Sep 2010 21:55:40 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201009252155.o8PLteq2074064@svn.freebsd.org> From: Weongyo Jeong Date: Sat, 25 Sep 2010 21:55:40 +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: r213179 - 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: Sat, 25 Sep 2010 21:55:40 -0000 Author: weongyo Date: Sat Sep 25 21:55:40 2010 New Revision: 213179 URL: http://svn.freebsd.org/changeset/base/213179 Log: Code cleanup; no functional changes. Modified: user/weongyo/usb/sys/dev/usb/controller/uhci.h Modified: user/weongyo/usb/sys/dev/usb/controller/uhci.h ============================================================================== --- user/weongyo/usb/sys/dev/usb/controller/uhci.h Sat Sep 25 21:25:46 2010 (r213178) +++ user/weongyo/usb/sys/dev/usb/controller/uhci.h Sat Sep 25 21:55:40 2010 (r213179) @@ -32,7 +32,7 @@ #ifndef _UHCI_H_ #define _UHCI_H_ -#define UHCI_MAX_DEVICES MIN(USB_MAX_DEVICES, 128) +#define UHCI_MAX_DEVICES MIN(USB_MAX_DEVICES, 128) #define UHCI_FRAMELIST_COUNT 1024 /* units */ #define UHCI_FRAMELIST_ALIGN 4096 /* bytes */ @@ -41,8 +41,8 @@ #define UHCI_TD_ALIGN 16 #define UHCI_QH_ALIGN 16 -#if ((USB_PAGE_SIZE < UHCI_TD_ALIGN) || (UHCI_TD_ALIGN == 0) || \ - (USB_PAGE_SIZE < UHCI_QH_ALIGN) || (UHCI_QH_ALIGN == 0)) +#if ((USB_PAGE_SIZE < UHCI_TD_ALIGN) || (UHCI_TD_ALIGN == 0) || \ + (USB_PAGE_SIZE < UHCI_QH_ALIGN) || (UHCI_QH_ALIGN == 0)) #error "Invalid USB page size!" #endif @@ -64,12 +64,12 @@ typedef uint32_t uhci_physaddr_t; */ struct uhci_td { -/* - * Data used by the UHCI controller. - * volatile is used in order to mantain struct members ordering. - */ - volatile uint32_t td_next; - volatile uint32_t td_status; + /* + * Data used by the UHCI controller. + * volatile is used in order to mantain struct members ordering. + */ + volatile uint32_t td_next; + volatile uint32_t td_status; #define UHCI_TD_GET_ACTLEN(s) (((s) + 1) & 0x3ff) #define UHCI_TD_ZERO_ACTLEN(t) ((t) | 0x3ff) #define UHCI_TD_BITSTUFF 0x00020000 @@ -85,7 +85,7 @@ struct uhci_td { #define UHCI_TD_GET_ERRCNT(s) (((s) >> 27) & 3) #define UHCI_TD_SET_ERRCNT(n) ((n) << 27) #define UHCI_TD_SPD 0x20000000 - volatile uint32_t td_token; + volatile uint32_t td_token; #define UHCI_TD_PID 0x000000ff #define UHCI_TD_PID_IN 0x00000069 #define UHCI_TD_PID_OUT 0x000000e1 @@ -100,55 +100,50 @@ struct uhci_td { #define UHCI_TD_SET_MAXLEN(l) (((l)-1) << 21) #define UHCI_TD_GET_MAXLEN(s) ((((s) >> 21) + 1) & 0x7ff) #define UHCI_TD_MAXLEN_MASK 0xffe00000 - volatile uint32_t td_buffer; -/* - * Extra information needed: - */ - struct uhci_td *next; - struct uhci_td *prev; - struct uhci_td *obj_next; - struct usb_page_cache *page_cache; - struct usb_page_cache *fix_pc; - uint32_t td_self; - uint16_t len; + volatile uint32_t td_buffer; + /* + * Extra information needed: + */ + struct uhci_td *next; + struct uhci_td *prev; + struct uhci_td *obj_next; + struct usb_page_cache *page_cache; + struct usb_page_cache *fix_pc; + uint32_t td_self; + uint16_t len; } __aligned(UHCI_TD_ALIGN); typedef struct uhci_td uhci_td_t; -#define UHCI_TD_ERROR (UHCI_TD_BITSTUFF | UHCI_TD_CRCTO | \ - UHCI_TD_BABBLE | UHCI_TD_DBUFFER | UHCI_TD_STALLED) - -#define UHCI_TD_SETUP(len, endp, dev) (UHCI_TD_SET_MAXLEN(len) | \ - UHCI_TD_SET_ENDPT(endp) | \ - UHCI_TD_SET_DEVADDR(dev) | \ - UHCI_TD_PID_SETUP) - -#define UHCI_TD_OUT(len, endp, dev, dt) (UHCI_TD_SET_MAXLEN(len) | \ - UHCI_TD_SET_ENDPT(endp) | \ - UHCI_TD_SET_DEVADDR(dev) | \ - UHCI_TD_PID_OUT | UHCI_TD_SET_DT(dt)) - -#define UHCI_TD_IN(len, endp, dev, dt) (UHCI_TD_SET_MAXLEN(len) | \ - UHCI_TD_SET_ENDPT(endp) | \ - UHCI_TD_SET_DEVADDR(dev) | \ - UHCI_TD_PID_IN | UHCI_TD_SET_DT(dt)) +#define UHCI_TD_ERROR \ + (UHCI_TD_BITSTUFF | UHCI_TD_CRCTO | UHCI_TD_BABBLE | \ + UHCI_TD_DBUFFER | UHCI_TD_STALLED) +#define UHCI_TD_SETUP(len, endp, dev) \ + (UHCI_TD_SET_MAXLEN(len) | UHCI_TD_SET_ENDPT(endp) | \ + UHCI_TD_SET_DEVADDR(dev) | UHCI_TD_PID_SETUP) +#define UHCI_TD_OUT(len, endp, dev, dt) \ + (UHCI_TD_SET_MAXLEN(len) | UHCI_TD_SET_ENDPT(endp) | \ + UHCI_TD_SET_DEVADDR(dev) | UHCI_TD_PID_OUT | UHCI_TD_SET_DT(dt)) +#define UHCI_TD_IN(len, endp, dev, dt) \ + (UHCI_TD_SET_MAXLEN(len) | UHCI_TD_SET_ENDPT(endp) | \ + UHCI_TD_SET_DEVADDR(dev) | UHCI_TD_PID_IN | UHCI_TD_SET_DT(dt)) struct uhci_qh { -/* - * Data used by the UHCI controller. - */ - volatile uint32_t qh_h_next; - volatile uint32_t qh_e_next; -/* - * Extra information needed: - */ - struct uhci_qh *h_next; - struct uhci_qh *h_prev; - struct uhci_qh *obj_next; - struct uhci_td *e_next; - struct usb_page_cache *page_cache; - uint32_t qh_self; - uint16_t intr_pos; + /* + * Data used by the UHCI controller. + */ + volatile uint32_t qh_h_next; + volatile uint32_t qh_e_next; + /* + * Extra information needed: + */ + struct uhci_qh *h_next; + struct uhci_qh *h_prev; + struct uhci_qh *obj_next; + struct uhci_td *e_next; + struct usb_page_cache *page_cache; + uint32_t qh_self; + uint16_t intr_pos; } __aligned(UHCI_QH_ALIGN); typedef struct uhci_qh uhci_qh_t; @@ -168,85 +163,88 @@ typedef struct uhci_qh uhci_qh_t; #endif struct uhci_config_desc { - struct usb_config_descriptor confd; - struct usb_interface_descriptor ifcd; - struct usb_endpoint_descriptor endpd; + struct usb_config_descriptor confd; + struct usb_interface_descriptor ifcd; + struct usb_endpoint_descriptor endpd; } __packed; union uhci_hub_desc { - struct usb_status stat; - struct usb_port_status ps; - uint8_t temp[128]; + struct usb_status stat; + struct usb_port_status ps; + uint8_t temp[128]; }; struct uhci_hw_softc { - struct usb_page_cache pframes_pc; - struct usb_page_cache isoc_start_pc[UHCI_VFRAMELIST_COUNT]; - struct usb_page_cache intr_start_pc[UHCI_IFRAMELIST_COUNT]; - struct usb_page_cache ls_ctl_start_pc; - struct usb_page_cache fs_ctl_start_pc; - struct usb_page_cache bulk_start_pc; - struct usb_page_cache last_qh_pc; - struct usb_page_cache last_td_pc; - - struct usb_page pframes_pg; - struct usb_page isoc_start_pg[UHCI_VFRAMELIST_COUNT]; - struct usb_page intr_start_pg[UHCI_IFRAMELIST_COUNT]; - struct usb_page ls_ctl_start_pg; - struct usb_page fs_ctl_start_pg; - struct usb_page bulk_start_pg; - struct usb_page last_qh_pg; - struct usb_page last_td_pg; + struct usb_page_cache pframes_pc; + struct usb_page_cache isoc_start_pc[UHCI_VFRAMELIST_COUNT]; + struct usb_page_cache intr_start_pc[UHCI_IFRAMELIST_COUNT]; + struct usb_page_cache ls_ctl_start_pc; + struct usb_page_cache fs_ctl_start_pc; + struct usb_page_cache bulk_start_pc; + struct usb_page_cache last_qh_pc; + struct usb_page_cache last_td_pc; + + struct usb_page pframes_pg; + struct usb_page isoc_start_pg[UHCI_VFRAMELIST_COUNT]; + struct usb_page intr_start_pg[UHCI_IFRAMELIST_COUNT]; + struct usb_page ls_ctl_start_pg; + struct usb_page fs_ctl_start_pg; + struct usb_page bulk_start_pg; + struct usb_page last_qh_pg; + struct usb_page last_td_pg; }; typedef struct uhci_softc { - struct uhci_hw_softc sc_hw; - struct usb_bus sc_bus; /* base device */ - union uhci_hub_desc sc_hub_desc; - struct usb_callout sc_root_intr; + struct uhci_hw_softc sc_hw; + struct usb_bus sc_bus; /* base device */ + union uhci_hub_desc sc_hub_desc; + struct usb_callout sc_root_intr; - struct usb_device *sc_devices[UHCI_MAX_DEVICES]; + struct usb_device *sc_devices[UHCI_MAX_DEVICES]; /* pointer to last TD for isochronous */ - struct uhci_td *sc_isoc_p_last[UHCI_VFRAMELIST_COUNT]; + struct uhci_td *sc_isoc_p_last[UHCI_VFRAMELIST_COUNT]; /* pointer to last QH for interrupt */ - struct uhci_qh *sc_intr_p_last[UHCI_IFRAMELIST_COUNT]; + struct uhci_qh *sc_intr_p_last[UHCI_IFRAMELIST_COUNT]; /* pointer to last QH for low speed control */ - struct uhci_qh *sc_ls_ctl_p_last; + struct uhci_qh *sc_ls_ctl_p_last; /* pointer to last QH for full speed control */ - struct uhci_qh *sc_fs_ctl_p_last; + struct uhci_qh *sc_fs_ctl_p_last; /* pointer to last QH for bulk */ - struct uhci_qh *sc_bulk_p_last; - struct uhci_qh *sc_reclaim_qh_p; - struct uhci_qh *sc_last_qh_p; - struct uhci_td *sc_last_td_p; - struct resource *sc_io_res; - struct resource *sc_irq_res; - void *sc_intr_hdl; - device_t sc_dev; - bus_size_t sc_io_size; - bus_space_tag_t sc_io_tag; - bus_space_handle_t sc_io_hdl; - - uint32_t sc_loops; /* number of QHs that wants looping */ - - uint16_t sc_intr_stat[UHCI_IFRAMELIST_COUNT]; - uint16_t sc_saved_frnum; - - uint8_t sc_addr; /* device address */ - uint8_t sc_conf; /* device configuration */ - uint8_t sc_isreset; /* bits set if a root hub is reset */ - uint8_t sc_isresumed; /* bits set if a port was resumed */ - uint8_t sc_saved_sof; - uint8_t sc_hub_idata[1]; + struct uhci_qh *sc_bulk_p_last; + struct uhci_qh *sc_reclaim_qh_p; + struct uhci_qh *sc_last_qh_p; + struct uhci_td *sc_last_td_p; + struct resource *sc_io_res; + struct resource *sc_irq_res; + void *sc_intr_hdl; + device_t sc_dev; + bus_size_t sc_io_size; + bus_space_tag_t sc_io_tag; + bus_space_handle_t sc_io_hdl; + + /* number of QHs that wants looping */ + uint32_t sc_loops; + + uint16_t sc_intr_stat[UHCI_IFRAMELIST_COUNT]; + uint16_t sc_saved_frnum; + + uint8_t sc_addr; /* device address */ + uint8_t sc_conf; /* device configuration */ + /* bits set if a root hub is reset */ + uint8_t sc_isreset; + /* bits set if a port was resumed */ + uint8_t sc_isresumed; + uint8_t sc_saved_sof; + uint8_t sc_hub_idata[1]; - char sc_vendor[16]; /* vendor string for root hub */ + char sc_vendor[16]; /* vendor string for root hub */ } uhci_softc_t; -usb_error_t uhci_init(uhci_softc_t *sc); -void uhci_suspend(uhci_softc_t *sc); -void uhci_resume(uhci_softc_t *sc); -void uhci_reset(uhci_softc_t *sc); -void uhci_interrupt(uhci_softc_t *sc); +usb_error_t uhci_init(uhci_softc_t *); +void uhci_suspend(uhci_softc_t *); +void uhci_resume(uhci_softc_t *); +void uhci_reset(uhci_softc_t *); +void uhci_interrupt(uhci_softc_t *); void uhci_iterate_hw_softc(struct usb_bus *, usb_bus_mem_callback_t *); -#endif /* _UHCI_H_ */ +#endif /* _UHCI_H_ */