summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/dahdi/pciradio.c6
-rw-r--r--drivers/dahdi/wctdm24xxp/base.c29
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)