Author: mav
Date: Mon Mar 30 10:18:43 2009
New Revision: 190547
URL: http://svn.freebsd.org/changeset/base/190547

Log:
  MFC rev. 190519:
  
   Fixup relative pointers after channel realloc. It fixes crash on systems
   with several HDA codecs per controller.
  
   While I am there, remove some unneeded dereferences.
  
  MFCed earlier than it should be so that it can be part of 7.2-BETA1.
  
  PR:           kern/131785
  Submitted by: Tor Egge <tor.e...@cvsup.no.freebsd.org>
  Approved by:  re (kensmith)

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/dev/sound/pci/hda/hdac.c

Modified: stable/7/sys/dev/sound/pci/hda/hdac.c
==============================================================================
--- stable/7/sys/dev/sound/pci/hda/hdac.c       Mon Mar 30 10:16:49 2009        
(r190546)
+++ stable/7/sys/dev/sound/pci/hda/hdac.c       Mon Mar 30 10:18:43 2009        
(r190547)
@@ -83,7 +83,7 @@
 
 #include "mixer_if.h"
 
-#define HDA_DRV_TEST_REV       "20090316_0130"
+#define HDA_DRV_TEST_REV       "20090329_0131"
 
 SND_DECLARE_FILE("$FreeBSD$");
 
@@ -5264,7 +5264,7 @@ hdac_audio_bind_as(struct hdac_devinfo *
                    sizeof(struct hdac_chan) * cnt,
                    M_HDAC, M_ZERO | M_NOWAIT);
                if (sc->chans == NULL) {
-                       device_printf(devinfo->codec->sc->dev,
+                       device_printf(sc->dev,
                            "Channels memory allocation failed!\n");
                        return;
                }
@@ -5274,17 +5274,20 @@ hdac_audio_bind_as(struct hdac_devinfo *
                    M_HDAC, M_ZERO | M_NOWAIT);
                if (sc->chans == NULL) {
                        sc->num_chans = 0;
-                       device_printf(devinfo->codec->sc->dev,
+                       device_printf(sc->dev,
                            "Channels memory allocation failed!\n");
                        return;
                }
+               /* Fixup relative pointers after realloc */
+               for (j = 0; j < sc->num_chans; j++)
+                       sc->chans[j].caps.fmtlist = sc->chans[j].fmtlist;
        }
        free = sc->num_chans;
        sc->num_chans += cnt;
 
        for (j = free; j < free + cnt; j++) {
-               devinfo->codec->sc->chans[j].devinfo = devinfo;
-               devinfo->codec->sc->chans[j].as = -1;
+               sc->chans[j].devinfo = devinfo;
+               sc->chans[j].as = -1;
        }
 
        /* Assign associations in order of their numbers, */
@@ -5293,10 +5296,10 @@ hdac_audio_bind_as(struct hdac_devinfo *
                        continue;
                
                as[j].chan = free;
-               devinfo->codec->sc->chans[free].as = j;
-               devinfo->codec->sc->chans[free].dir =
+               sc->chans[free].as = j;
+               sc->chans[free].dir =
                    (as[j].dir == HDA_CTL_IN) ? PCMDIR_REC : PCMDIR_PLAY;
-               hdac_pcmchannel_setup(&devinfo->codec->sc->chans[free]);
+               hdac_pcmchannel_setup(&sc->chans[free]);
                free++;
        }
 }
_______________________________________________
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-unsubscr...@freebsd.org"

Reply via email to