From nobody@FreeBSD.org  Thu Nov 18 20:55:35 2010
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 6BF5F106564A
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 18 Nov 2010 20:55:35 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 42E288FC21
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 18 Nov 2010 20:55:35 +0000 (UTC)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id oAIKtYd9057262
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 18 Nov 2010 20:55:34 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id oAIKtYe5057261;
	Thu, 18 Nov 2010 20:55:34 GMT
	(envelope-from nobody)
Message-Id: <201011182055.oAIKtYe5057261@www.freebsd.org>
Date: Thu, 18 Nov 2010 20:55:34 GMT
From: Jason Harmening <jason.harmening@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [sound][patch] Update snd_envy24ht to be MPSAFE and use 32-bit DMA addresses
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         152378
>Category:       kern
>Synopsis:       [sound][patch] Update snd_envy24ht to be MPSAFE and use 32-bit DMA addresses
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    mav
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu Nov 18 21:00:18 UTC 2010
>Closed-Date:    Wed Jun 05 18:51:01 UTC 2013
>Last-Modified:  Wed Jun 05 18:51:01 UTC 2013
>Originator:     Jason Harmening
>Release:        8.1-STABLE
>Organization:
>Environment:
FreeBSD riviera.austin.rr.com 8.1-STABLE FreeBSD 8.1-STABLE #0: Sun Nov 14 12:01:19 CST 2010     jason@riviera.austin.rr.com:/usr/obj/usr/src/sys/CUSTOM  amd64
>Description:
--Allow DMA addresses anywhere in the lower 4GB--Envy24HT has a 32-bit DMA engine, not 28-bit like Envy24
--Mark interrupt handler as MPSAFE, seems to be correctly synchronized
Testing done:
   daily usage of envy24ht-based sound card for ~1yr on machine w/ 6GB RAM
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

--- envy24ht.h.orig	2007-05-27 14:58:39.000000000 -0500
+++ envy24ht.h	2009-05-06 10:49:56.000000000 -0500
@@ -176,8 +176,7 @@
 #define ENVY24HT_VOL_MIN   96 /* -144db(negate) */
 #define ENVY24HT_VOL_MUTE 127 /* mute */
 
-#define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond 256MB is not
- supported */
+#define BUS_SPACE_MAXADDR_ENVY24 0xffffffff
 #define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */
 
 #define ENVY24HT_CCS_GPIO_HDATA 0x1E
--- envy24ht.c	2009-05-07 09:09:31.000000000 -0500
+++ envy24ht.c	2009-05-07 09:22:38.000000000 -0500
@@ -2421,7 +2421,7 @@
 	sc->irq = bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
 				 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
 	if (!sc->irq ||
-	    snd_setup_intr(sc->dev, sc->irq, 0, envy24ht_intr, sc, &sc->ih)) {
+	    snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24ht_intr, sc, &sc->ih)) {
 		device_printf(sc->dev, "unable to map interrupt\n");
 		return ENXIO;
 	}
@@ -2431,7 +2431,7 @@
 	    /*alignment*/4,
 	    /*boundary*/0,
 	    /*lowaddr*/BUS_SPACE_MAXADDR_ENVY24,
-	    /*highaddr*/BUS_SPACE_MAXADDR_ENVY24,
+	    /*highaddr*/BUS_SPACE_MAXADDR,
 	    /*filter*/NULL, /*filterarg*/NULL,
 	    /*maxsize*/BUS_SPACE_MAXSIZE_ENVY24,
 	    /*nsegments*/1, /*maxsegsz*/0x3ffff,


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->freebsd-multimedia 
Responsible-Changed-By: arundel 
Responsible-Changed-When: Thu Nov 18 21:20:59 UTC 2010 
Responsible-Changed-Why:  
Over to maintainer(s). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=152378 

From: Jason <jason.harmening@gmail.com>
To: bug-followup@FreeBSD.org,
 jason.harmening@gmail.com
Cc:  
Subject: Re: kern/152378: [sound][patch] Update snd_envy24ht to be MPSAFE and use 32-bit DMA addresses
Date: Mon, 22 Apr 2013 13:32:29 -0500

 --Apple-Mail=_F85251E0-9ABB-4CB6-84DB-D120516E777F
 Content-Transfer-Encoding: quoted-printable
 Content-Type: text/plain;
 	charset=us-ascii
 
 Here's an update to the patch that gets rid of lockfunc[arg] for the DMA =
 tag, and correctly uses the busdma load callbacks to program the device =
 w/ the bus address.
 
 
 --Apple-Mail=_F85251E0-9ABB-4CB6-84DB-D120516E777F
 Content-Disposition: attachment;
 	filename=patch_envy24ht.txt
 Content-Type: text/plain;
 	x-unix-mode=0644;
 	name="patch_envy24ht.txt"
 Content-Transfer-Encoding: quoted-printable
 
 --- envy24ht.h.orig	2011-10-01 12:23:36.000000000 -0500
 +++ envy24ht.h	2011-10-01 12:24:46.000000000 -0500
 @@ -176,8 +176,7 @@
  #define ENVY24HT_VOL_MIN   96 /* -144db(negate) */
  #define ENVY24HT_VOL_MUTE 127 /* mute */
 =20
 -#define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond =
 256MB is not
 - supported */
 +#define BUS_SPACE_MAXADDR_ENVY24 0xffffffff
  #define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */
 =20
  #define ENVY24HT_CCS_GPIO_HDATA 0x1E
 --- envy24ht.c.orig	2011-10-01 12:23:36.000000000 -0500
 +++ envy24ht.c	2013-03-21 07:29:25.000000000 -0500
 @@ -2080,7 +2080,9 @@
  static void
  envy24ht_dmapsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int =
 error)
  {
 -	/* struct sc_info *sc =3D (struct sc_info *)arg; */
 +	struct sc_info *sc =3D arg;
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, (uint32_t)segs->ds_addr, =
 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, (uint32_t)(segs->ds_len / 4 =
 - 1), 2);
 =20
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmapsetmap()\n");
 @@ -2088,7 +2090,6 @@
  		printf("envy24ht(play): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->pmap, (unsigned =
 long)vtophys(sc->pmap));
  	}
  #endif
  }
 @@ -2096,7 +2097,9 @@
  static void
  envy24ht_dmarsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int =
 error)
  {
 -	/* struct sc_info *sc =3D (struct sc_info *)arg; */
 +	struct sc_info *sc =3D arg;
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, (uint32_t)segs->ds_addr, =
 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, (uint32_t)(segs->ds_len / 4 =
 - 1), 2);
 =20
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmarsetmap()\n");
 @@ -2104,7 +2107,6 @@
  		printf("envy24ht(record): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->rmap, (unsigned =
 long)vtophys(sc->pmap));
  	}
  #endif
  }
 @@ -2149,8 +2151,6 @@
  static int
  envy24ht_dmainit(struct sc_info *sc)
  {
 -	u_int32_t addr;
 -
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit()\n");
  #endif
 @@ -2176,34 +2176,16 @@
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): =
 sc->pmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, =
 envy24ht_dmapsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, =
 envy24ht_dmapsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): =
 sc->rmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, =
 envy24ht_dmarsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, =
 envy24ht_dmarsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  	bzero(sc->pbuf, sc->psize);
  	bzero(sc->rbuf, sc->rsize);
 =20
 -	/* set values to register */
 -	addr =3D vtophys(sc->pbuf);
 -#if(0)
 -	device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, addr, 4);
 -#if(0)
 -	device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt(sc, =
 ENVY24HT_MT_PADDR, 4));
 -	device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1, 2);
 -#if(0)
 -	device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt(sc, =
 ENVY24HT_MT_PCNT, 2));
 -#endif
 -	addr =3D vtophys(sc->rbuf);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, addr, 4);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1, 2);
 -
  	return 0;
   bad:
  	envy24ht_dmafree(sc);
 @@ -2441,7 +2423,7 @@
  	sc->irq =3D bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
  				 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
  	if (!sc->irq ||
 -	    snd_setup_intr(sc->dev, sc->irq, 0, envy24ht_intr, sc, =
 &sc->ih)) {
 +	    snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24ht_intr, =
 sc, &sc->ih)) {
  		device_printf(sc->dev, "unable to map interrupt\n");
  		return ENXIO;
  	}
 @@ -2451,12 +2433,12 @@
  	    /*alignment*/4,
  	    /*boundary*/0,
  	    /*lowaddr*/BUS_SPACE_MAXADDR_ENVY24,
 -	    /*highaddr*/BUS_SPACE_MAXADDR_ENVY24,
 +	    /*highaddr*/BUS_SPACE_MAXADDR,
  	    /*filter*/NULL, /*filterarg*/NULL,
  	    /*maxsize*/BUS_SPACE_MAXSIZE_ENVY24,
  	    /*nsegments*/1, /*maxsegsz*/0x3ffff,
 -	    /*flags*/0, /*lockfunc*/busdma_lock_mutex,
 -	    /*lockarg*/&Giant, &sc->dmat) !=3D 0) {
 +	    /*flags*/0, /*lockfunc*/NULL,
 +	    /*lockarg*/NULL, &sc->dmat) !=3D 0) {
  		device_printf(sc->dev, "unable to create dma tag\n");
  		return ENXIO;
  	}
 
 --Apple-Mail=_F85251E0-9ABB-4CB6-84DB-D120516E777F--

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/152378: commit references a PR
Date: Sun,  5 May 2013 19:09:47 +0000 (UTC)

 Author: mav
 Date: Sun May  5 19:09:34 2013
 New Revision: 250286
 URL: http://svnweb.freebsd.org/changeset/base/250286
 
 Log:
   Some fixes to snd_envy24ht(4) driver:
    - Allow DMA addresses anywhere in the lower 4GB; Envy24HT has a 32-bit DMA
   engine, not 28-bit like Envy24.
    - Mark interrupt handler as MPSAFE, seems to be correctly synchronized.
   
   PR:		kern/152378
   Submitted by:	Jason Harmening <jason.harmening@gmail.com>
   MFC after:	1 month
 
 Modified:
   head/sys/dev/sound/pci/envy24ht.c
   head/sys/dev/sound/pci/envy24ht.h
 
 Modified: head/sys/dev/sound/pci/envy24ht.c
 ==============================================================================
 --- head/sys/dev/sound/pci/envy24ht.c	Sun May  5 18:54:25 2013	(r250285)
 +++ head/sys/dev/sound/pci/envy24ht.c	Sun May  5 19:09:34 2013	(r250286)
 @@ -2080,7 +2080,7 @@ envy24ht_pci_probe(device_t dev)
  static void
  envy24ht_dmapsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  {
 -	/* struct sc_info *sc = (struct sc_info *)arg; */
 +	struct sc_info *sc = arg;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmapsetmap()\n");
 @@ -2088,15 +2088,16 @@ envy24ht_dmapsetmap(void *arg, bus_dma_s
  		printf("envy24ht(play): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->pmap, (unsigned long)vtophys(sc->pmap));
  	}
  #endif
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, (uint32_t)segs->ds_addr, 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, (uint32_t)(segs->ds_len / 4 - 1), 2);
  }
  
  static void
  envy24ht_dmarsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  {
 -	/* struct sc_info *sc = (struct sc_info *)arg; */
 +	struct sc_info *sc = arg;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmarsetmap()\n");
 @@ -2104,9 +2105,10 @@ envy24ht_dmarsetmap(void *arg, bus_dma_s
  		printf("envy24ht(record): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->rmap, (unsigned long)vtophys(sc->pmap));
  	}
  #endif
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, (uint32_t)segs->ds_addr, 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, (uint32_t)(segs->ds_len / 4 - 1), 2);
  }
  
  static void
 @@ -2149,7 +2151,6 @@ envy24ht_dmafree(struct sc_info *sc)
  static int
  envy24ht_dmainit(struct sc_info *sc)
  {
 -	u_int32_t addr;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit()\n");
 @@ -2176,34 +2177,16 @@ envy24ht_dmainit(struct sc_info *sc)
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): sc->pmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, envy24ht_dmapsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, envy24ht_dmapsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): sc->rmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, envy24ht_dmarsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, envy24ht_dmarsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  	bzero(sc->pbuf, sc->psize);
  	bzero(sc->rbuf, sc->rsize);
  
 -	/* set values to register */
 -	addr = vtophys(sc->pbuf);
 -#if(0)
 -	device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, addr, 4);
 -#if(0)
 -	device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PADDR, 4));
 -	device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1, 2);
 -#if(0)
 -	device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PCNT, 2));
 -#endif
 -	addr = vtophys(sc->rbuf);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, addr, 4);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1, 2);
 -
  	return 0;
   bad:
  	envy24ht_dmafree(sc);
 @@ -2441,7 +2424,7 @@ envy24ht_alloc_resource(struct sc_info *
  	sc->irq = bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
  				 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
  	if (!sc->irq ||
 -	    snd_setup_intr(sc->dev, sc->irq, 0, envy24ht_intr, sc, &sc->ih)) {
 +	    snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24ht_intr, sc, &sc->ih)) {
  		device_printf(sc->dev, "unable to map interrupt\n");
  		return ENXIO;
  	}
 @@ -2450,13 +2433,13 @@ envy24ht_alloc_resource(struct sc_info *
  	if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(sc->dev),
  	    /*alignment*/4,
  	    /*boundary*/0,
 -	    /*lowaddr*/BUS_SPACE_MAXADDR_ENVY24,
 -	    /*highaddr*/BUS_SPACE_MAXADDR_ENVY24,
 +	    /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 +	    /*highaddr*/BUS_SPACE_MAXADDR,
  	    /*filter*/NULL, /*filterarg*/NULL,
  	    /*maxsize*/BUS_SPACE_MAXSIZE_ENVY24,
  	    /*nsegments*/1, /*maxsegsz*/0x3ffff,
 -	    /*flags*/0, /*lockfunc*/busdma_lock_mutex,
 -	    /*lockarg*/&Giant, &sc->dmat) != 0) {
 +	    /*flags*/0, /*lockfunc*/NULL,
 +	    /*lockarg*/NULL, &sc->dmat) != 0) {
  		device_printf(sc->dev, "unable to create dma tag\n");
  		return ENXIO;
  	}
 
 Modified: head/sys/dev/sound/pci/envy24ht.h
 ==============================================================================
 --- head/sys/dev/sound/pci/envy24ht.h	Sun May  5 18:54:25 2013	(r250285)
 +++ head/sys/dev/sound/pci/envy24ht.h	Sun May  5 19:09:34 2013	(r250286)
 @@ -176,8 +176,6 @@
  #define ENVY24HT_VOL_MIN   96 /* -144db(negate) */
  #define ENVY24HT_VOL_MUTE 127 /* mute */
  
 -#define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond 256MB is not
 - supported */
  #define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */
  
  #define ENVY24HT_CCS_GPIO_HDATA 0x1E
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->patched 
State-Changed-By: mav 
State-Changed-When: Sun May 5 19:13:41 UTC 2013 
State-Changed-Why:  
Patch committed to HEAD. 


Responsible-Changed-From-To: freebsd-multimedia->mav 
Responsible-Changed-By: mav 
Responsible-Changed-When: Sun May 5 19:13:41 UTC 2013 
Responsible-Changed-Why:  
Patch committed to HEAD. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=152378 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/152378: commit references a PR
Date: Wed,  5 Jun 2013 18:49:47 +0000 (UTC)

 Author: mav
 Date: Wed Jun  5 18:49:28 2013
 New Revision: 251428
 URL: http://svnweb.freebsd.org/changeset/base/251428
 
 Log:
   MFC r250286:
   Some fixes to snd_envy24ht(4) driver:
    - Allow DMA addresses anywhere in the lower 4GB; Envy24HT has a 32-bit DMA
   engine, not 28-bit like Envy24.
    - Mark interrupt handler as MPSAFE, seems to be correctly synchronized.
   
   PR:		kern/152378
   Submitted by:	Jason Harmening <jason.harmening@gmail.com>
 
 Modified:
   stable/8/sys/dev/sound/pci/envy24ht.c
   stable/8/sys/dev/sound/pci/envy24ht.h
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/dev/   (props changed)
   stable/8/sys/dev/sound/   (props changed)
   stable/8/sys/dev/sound/pci/   (props changed)
 
 Modified: stable/8/sys/dev/sound/pci/envy24ht.c
 ==============================================================================
 --- stable/8/sys/dev/sound/pci/envy24ht.c	Wed Jun  5 18:42:44 2013	(r251427)
 +++ stable/8/sys/dev/sound/pci/envy24ht.c	Wed Jun  5 18:49:28 2013	(r251428)
 @@ -2080,7 +2080,7 @@ envy24ht_pci_probe(device_t dev)
  static void
  envy24ht_dmapsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  {
 -	/* struct sc_info *sc = (struct sc_info *)arg; */
 +	struct sc_info *sc = arg;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmapsetmap()\n");
 @@ -2088,15 +2088,16 @@ envy24ht_dmapsetmap(void *arg, bus_dma_s
  		printf("envy24ht(play): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->pmap, (unsigned long)vtophys(sc->pmap));
  	}
  #endif
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, (uint32_t)segs->ds_addr, 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, (uint32_t)(segs->ds_len / 4 - 1), 2);
  }
  
  static void
  envy24ht_dmarsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  {
 -	/* struct sc_info *sc = (struct sc_info *)arg; */
 +	struct sc_info *sc = arg;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmarsetmap()\n");
 @@ -2104,9 +2105,10 @@ envy24ht_dmarsetmap(void *arg, bus_dma_s
  		printf("envy24ht(record): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->rmap, (unsigned long)vtophys(sc->pmap));
  	}
  #endif
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, (uint32_t)segs->ds_addr, 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, (uint32_t)(segs->ds_len / 4 - 1), 2);
  }
  
  static void
 @@ -2149,7 +2151,6 @@ envy24ht_dmafree(struct sc_info *sc)
  static int
  envy24ht_dmainit(struct sc_info *sc)
  {
 -	u_int32_t addr;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit()\n");
 @@ -2176,34 +2177,16 @@ envy24ht_dmainit(struct sc_info *sc)
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): sc->pmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, envy24ht_dmapsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, envy24ht_dmapsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): sc->rmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, envy24ht_dmarsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, envy24ht_dmarsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  	bzero(sc->pbuf, sc->psize);
  	bzero(sc->rbuf, sc->rsize);
  
 -	/* set values to register */
 -	addr = vtophys(sc->pbuf);
 -#if(0)
 -	device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, addr, 4);
 -#if(0)
 -	device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PADDR, 4));
 -	device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1, 2);
 -#if(0)
 -	device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PCNT, 2));
 -#endif
 -	addr = vtophys(sc->rbuf);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, addr, 4);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1, 2);
 -
  	return 0;
   bad:
  	envy24ht_dmafree(sc);
 @@ -2440,7 +2423,7 @@ envy24ht_alloc_resource(struct sc_info *
  	sc->irq = bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
  				 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
  	if (!sc->irq ||
 -	    snd_setup_intr(sc->dev, sc->irq, 0, envy24ht_intr, sc, &sc->ih)) {
 +	    snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24ht_intr, sc, &sc->ih)) {
  		device_printf(sc->dev, "unable to map interrupt\n");
  		return ENXIO;
  	}
 @@ -2449,13 +2432,13 @@ envy24ht_alloc_resource(struct sc_info *
  	if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(sc->dev),
  	    /*alignment*/4,
  	    /*boundary*/0,
 -	    /*lowaddr*/BUS_SPACE_MAXADDR_ENVY24,
 -	    /*highaddr*/BUS_SPACE_MAXADDR_ENVY24,
 +	    /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 +	    /*highaddr*/BUS_SPACE_MAXADDR,
  	    /*filter*/NULL, /*filterarg*/NULL,
  	    /*maxsize*/BUS_SPACE_MAXSIZE_ENVY24,
  	    /*nsegments*/1, /*maxsegsz*/0x3ffff,
 -	    /*flags*/0, /*lockfunc*/busdma_lock_mutex,
 -	    /*lockarg*/&Giant, &sc->dmat) != 0) {
 +	    /*flags*/0, /*lockfunc*/NULL,
 +	    /*lockarg*/NULL, &sc->dmat) != 0) {
  		device_printf(sc->dev, "unable to create dma tag\n");
  		return ENXIO;
  	}
 
 Modified: stable/8/sys/dev/sound/pci/envy24ht.h
 ==============================================================================
 --- stable/8/sys/dev/sound/pci/envy24ht.h	Wed Jun  5 18:42:44 2013	(r251427)
 +++ stable/8/sys/dev/sound/pci/envy24ht.h	Wed Jun  5 18:49:28 2013	(r251428)
 @@ -176,8 +176,6 @@
  #define ENVY24HT_VOL_MIN   96 /* -144db(negate) */
  #define ENVY24HT_VOL_MUTE 127 /* mute */
  
 -#define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond 256MB is not
 - supported */
  #define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */
  
  #define ENVY24HT_CCS_GPIO_HDATA 0x1E
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/152378: commit references a PR
Date: Wed,  5 Jun 2013 18:42:52 +0000 (UTC)

 Author: mav
 Date: Wed Jun  5 18:42:44 2013
 New Revision: 251427
 URL: http://svnweb.freebsd.org/changeset/base/251427
 
 Log:
   MFC r250286:
   Some fixes to snd_envy24ht(4) driver:
    - Allow DMA addresses anywhere in the lower 4GB; Envy24HT has a 32-bit DMA
   engine, not 28-bit like Envy24.
    - Mark interrupt handler as MPSAFE, seems to be correctly synchronized.
   
   PR:		kern/152378
   Submitted by:	Jason Harmening <jason.harmening@gmail.com>
 
 Modified:
   stable/9/sys/dev/sound/pci/envy24ht.c
   stable/9/sys/dev/sound/pci/envy24ht.h
 Directory Properties:
   stable/9/sys/   (props changed)
   stable/9/sys/dev/   (props changed)
 
 Modified: stable/9/sys/dev/sound/pci/envy24ht.c
 ==============================================================================
 --- stable/9/sys/dev/sound/pci/envy24ht.c	Wed Jun  5 17:37:59 2013	(r251426)
 +++ stable/9/sys/dev/sound/pci/envy24ht.c	Wed Jun  5 18:42:44 2013	(r251427)
 @@ -2080,7 +2080,7 @@ envy24ht_pci_probe(device_t dev)
  static void
  envy24ht_dmapsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  {
 -	/* struct sc_info *sc = (struct sc_info *)arg; */
 +	struct sc_info *sc = arg;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmapsetmap()\n");
 @@ -2088,15 +2088,16 @@ envy24ht_dmapsetmap(void *arg, bus_dma_s
  		printf("envy24ht(play): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->pmap, (unsigned long)vtophys(sc->pmap));
  	}
  #endif
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, (uint32_t)segs->ds_addr, 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, (uint32_t)(segs->ds_len / 4 - 1), 2);
  }
  
  static void
  envy24ht_dmarsetmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  {
 -	/* struct sc_info *sc = (struct sc_info *)arg; */
 +	struct sc_info *sc = arg;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmarsetmap()\n");
 @@ -2104,9 +2105,10 @@ envy24ht_dmarsetmap(void *arg, bus_dma_s
  		printf("envy24ht(record): setmap %lx, %lx; ",
  		    (unsigned long)segs->ds_addr,
  		    (unsigned long)segs->ds_len);
 -		printf("%p -> %lx\n", sc->rmap, (unsigned long)vtophys(sc->pmap));
  	}
  #endif
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, (uint32_t)segs->ds_addr, 4);
 +	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, (uint32_t)(segs->ds_len / 4 - 1), 2);
  }
  
  static void
 @@ -2149,7 +2151,6 @@ envy24ht_dmafree(struct sc_info *sc)
  static int
  envy24ht_dmainit(struct sc_info *sc)
  {
 -	u_int32_t addr;
  
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit()\n");
 @@ -2176,34 +2177,16 @@ envy24ht_dmainit(struct sc_info *sc)
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): sc->pmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, envy24ht_dmapsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->pmap, sc->pbuf, sc->psize, envy24ht_dmapsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  #if(0)
  	device_printf(sc->dev, "envy24ht_dmainit(): bus_dmamem_load(): sc->rmap\n");
  #endif
 -	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, envy24ht_dmarsetmap, sc, 0))
 +	if (bus_dmamap_load(sc->dmat, sc->rmap, sc->rbuf, sc->rsize, envy24ht_dmarsetmap, sc, BUS_DMA_NOWAIT))
  		goto bad;
  	bzero(sc->pbuf, sc->psize);
  	bzero(sc->rbuf, sc->rsize);
  
 -	/* set values to register */
 -	addr = vtophys(sc->pbuf);
 -#if(0)
 -	device_printf(sc->dev, "pbuf(0x%08x)\n", addr);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PADDR, addr, 4);
 -#if(0)
 -	device_printf(sc->dev, "PADDR-->(0x%08x)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PADDR, 4));
 -	device_printf(sc->dev, "psize(%ld)\n", sc->psize / 4 - 1);
 -#endif
 -	envy24ht_wrmt(sc, ENVY24HT_MT_PCNT, sc->psize / 4 - 1, 2);
 -#if(0)
 -	device_printf(sc->dev, "PCNT-->(%ld)\n", envy24ht_rdmt(sc, ENVY24HT_MT_PCNT, 2));
 -#endif
 -	addr = vtophys(sc->rbuf);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RADDR, addr, 4);
 -	envy24ht_wrmt(sc, ENVY24HT_MT_RCNT, sc->rsize / 4 - 1, 2);
 -
  	return 0;
   bad:
  	envy24ht_dmafree(sc);
 @@ -2441,7 +2424,7 @@ envy24ht_alloc_resource(struct sc_info *
  	sc->irq = bus_alloc_resource(sc->dev, SYS_RES_IRQ, &sc->irqid,
  				 0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
  	if (!sc->irq ||
 -	    snd_setup_intr(sc->dev, sc->irq, 0, envy24ht_intr, sc, &sc->ih)) {
 +	    snd_setup_intr(sc->dev, sc->irq, INTR_MPSAFE, envy24ht_intr, sc, &sc->ih)) {
  		device_printf(sc->dev, "unable to map interrupt\n");
  		return ENXIO;
  	}
 @@ -2450,13 +2433,13 @@ envy24ht_alloc_resource(struct sc_info *
  	if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(sc->dev),
  	    /*alignment*/4,
  	    /*boundary*/0,
 -	    /*lowaddr*/BUS_SPACE_MAXADDR_ENVY24,
 -	    /*highaddr*/BUS_SPACE_MAXADDR_ENVY24,
 +	    /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 +	    /*highaddr*/BUS_SPACE_MAXADDR,
  	    /*filter*/NULL, /*filterarg*/NULL,
  	    /*maxsize*/BUS_SPACE_MAXSIZE_ENVY24,
  	    /*nsegments*/1, /*maxsegsz*/0x3ffff,
 -	    /*flags*/0, /*lockfunc*/busdma_lock_mutex,
 -	    /*lockarg*/&Giant, &sc->dmat) != 0) {
 +	    /*flags*/0, /*lockfunc*/NULL,
 +	    /*lockarg*/NULL, &sc->dmat) != 0) {
  		device_printf(sc->dev, "unable to create dma tag\n");
  		return ENXIO;
  	}
 
 Modified: stable/9/sys/dev/sound/pci/envy24ht.h
 ==============================================================================
 --- stable/9/sys/dev/sound/pci/envy24ht.h	Wed Jun  5 17:37:59 2013	(r251426)
 +++ stable/9/sys/dev/sound/pci/envy24ht.h	Wed Jun  5 18:42:44 2013	(r251427)
 @@ -176,8 +176,6 @@
  #define ENVY24HT_VOL_MIN   96 /* -144db(negate) */
  #define ENVY24HT_VOL_MUTE 127 /* mute */
  
 -#define BUS_SPACE_MAXADDR_ENVY24 0x0fffffff /* Address space beyond 256MB is not
 - supported */
  #define BUS_SPACE_MAXSIZE_ENVY24 0x3fffc /* 64k x 4byte(1dword) */
  
  #define ENVY24HT_CCS_GPIO_HDATA 0x1E
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: patched->closed 
State-Changed-By: mav 
State-Changed-When: Wed Jun 5 18:50:27 UTC 2013 
State-Changed-Why:  
Patch merged to 8/9-STABLE. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=152378 
>Unformatted:
