diff options
author | Kevin P. Fleming <kpfleming@digium.com> | 2008-07-02 17:21:44 +0000 |
---|---|---|
committer | Kevin P. Fleming <kpfleming@digium.com> | 2008-07-02 17:21:44 +0000 |
commit | ebdcba4b054d1f41d4352b8402454551fe072a91 (patch) | |
tree | 58b0cc9bf8336eb774781d04bf6f3a42070445f9 /drivers/dahdi | |
parent | 044555177d7e25bc8a6b1a84d7086673f9868a43 (diff) |
fix up the last few drivers for the new single-allocation channel changes
(related to issue #12657)
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@4521 a0bf4364-ded3-4de4-8d8a-66a801d63aff
Diffstat (limited to 'drivers/dahdi')
-rw-r--r-- | drivers/dahdi/pciradio.c | 6 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 29 |
2 files changed, 28 insertions, 7 deletions
diff --git a/drivers/dahdi/pciradio.c b/drivers/dahdi/pciradio.c index 30d49d1..5467147 100644 --- a/drivers/dahdi/pciradio.c +++ b/drivers/dahdi/pciradio.c @@ -200,7 +200,8 @@ struct pciradio { #define RADMODE_IGNORECT 16 #define RADMODE_NOENCODE 32 unsigned char corthresh[NUM_CHANS]; - struct dahdi_chan chans[NUM_CHANS]; + struct dahdi_chan _chans[NUM_CHANS]; + struct dahdi_chan *chans; unsigned char mx828_addr; struct encdec encdec; unsigned long lastremcmd; @@ -1479,7 +1480,7 @@ static int pciradio_initialize(struct pciradio *rad) rad->ctcssacquiretime[x] = RAD_CTCSS_ACQUIRE_TIME; rad->ctcsstalkofftime[x] = RAD_CTCSS_TALKOFF_TIME; } - rad->span.chans = rad->chans; + rad->span.chans = &rad->chans; rad->span.channels = rad->nchans; rad->span.hooksig = pciradio_hooksig; rad->span.open = pciradio_open; @@ -1718,6 +1719,7 @@ static int __devinit pciradio_init_one(struct pci_dev *pdev, const struct pci_de int i; ifaces[x] = rad; + rad->chans = rad->_chans; memset(rad, 0, sizeof(struct pciradio)); spin_lock_init(&rad->lock); rad->nchans = 4; diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index aa80acf..1fa8868 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -3745,6 +3745,18 @@ retry: static struct pci_driver wctdm_driver; +static void free_wc(struct wctdm *wc) +{ + unsigned int x; + + for (x = 0; x < wc->cards; x++) { + if (wc->chans[x]) { + kfree(wc->chans[x]); + } + } + kfree(wc); +} + static int __devinit wctdm_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { struct wctdm *wc; @@ -3754,11 +3766,10 @@ static int __devinit wctdm_init_one(struct pci_dev *pdev, const struct pci_devic int ret; retry: - wc = kmalloc(sizeof(struct wctdm), GFP_KERNEL); - if (!wc) { - /* \todo Print debug message. */ + if (!(wc = kmalloc(sizeof(*wc), GFP_KERNEL))) { return -ENOMEM; } + memset(wc, 0, sizeof(*wc)); spin_lock(&ifacelock); /* \todo this is a candidate for removal... */ @@ -3771,7 +3782,7 @@ retry: spin_unlock(&ifacelock); snprintf(wc->board_name, sizeof(wc->board_name)-1, "%s%d", - wctdm_driver.name, i); + wctdm_driver.name, i); ret = voicebus_init(pdev, SFRAME_SIZE, wc->board_name, handle_receive, handle_transmit, wc, &wc->vb); if (ret) { @@ -3832,6 +3843,14 @@ retry: /* Final initialization */ wctdm_post_initialize(wc); + for (i = 0; i < wc->cards; i++) { + if (!(wc->chans[i] = kmalloc(sizeof(*wc->chans[i]), GFP_KERNEL))) { + free_wc(wc); + return -ENOMEM; + } + memset(wc->chans[i], 0, sizeof(*wc->chans[i])); + } + /* We should be ready for DAHDI to come in now. */ if (dahdi_register(&wc->span, 0)) { printk("Unable to register span with DAHDI\n"); @@ -3864,7 +3883,7 @@ static void wctdm_release(struct wctdm *wc) ifaces[i] = NULL; spin_unlock(&ifacelock); - kfree(wc); + free_wc(wc); } static void __devexit wctdm_remove_one(struct pci_dev *pdev) |