Date: Sun, 29 Mar 2009 07:10:52 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r190519 - head/sys/dev/sound/pci/hda Message-ID: <200903290710.n2T7AqVQ024725@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Sun Mar 29 07:10:52 2009 New Revision: 190519 URL: http://svn.freebsd.org/changeset/base/190519 Log: 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. Submitted by: Tor Egge <Tor.Egge@cvsup.no.freebsd.org> Modified: head/sys/dev/sound/pci/hda/hdac.c Modified: head/sys/dev/sound/pci/hda/hdac.c ============================================================================== --- head/sys/dev/sound/pci/hda/hdac.c Sun Mar 29 03:30:15 2009 (r190518) +++ head/sys/dev/sound/pci/hda/hdac.c Sun Mar 29 07:10:52 2009 (r190519) @@ -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$"); @@ -5280,7 +5280,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; } @@ -5290,17 +5290,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, */ @@ -5309,10 +5312,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++; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903290710.n2T7AqVQ024725>