Index: forte.c =================================================================== RCS file: /home/mkp/Repository/forte/forte.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -u -r1.63 -r1.64 --- forte.c 1 Mar 2003 05:32:42 -0000 1.63 +++ forte.c 28 May 2003 21:32:43 -0000 1.64 @@ -49,7 +49,7 @@ #include #define DRIVER_NAME "forte" -#define DRIVER_VERSION "$Id: forte.c,v 1.63 2003/03/01 05:32:42 mkp Exp $" +#define DRIVER_VERSION "$Id: forte.c,v 1.64 2003/05/28 21:32:43 mkp Exp $" #define PFX DRIVER_NAME ": " #undef M_DEBUG @@ -664,14 +664,14 @@ * Locking: Lock held. */ -static void +static int forte_channel_prep (struct forte_channel *channel) { struct page *page; int i; if (channel->buf) - return; + return 0; forte_channel_buffer (channel, channel->frag_sz, channel->frag_num); channel->buf_pages = channel->buf_sz >> PAGE_SHIFT; @@ -689,7 +689,7 @@ &channel->buf_handle); if (!channel->buf || !channel->buf_handle) - BUG(); + return -ENOMEM; page = virt_to_page (channel->buf); @@ -708,6 +708,8 @@ DPRINTK ("%s: %s buffer @ %p (%p)\n", __FUNCTION__, channel->name, channel->buf, channel->buf_handle); + + return 0; } @@ -1188,7 +1190,12 @@ forte_channel_start (&chip->play); else { chip->trigger = 1; - forte_channel_prep (&chip->play); + + if (forte_channel_prep (&chip->play)) { + spin_unlock_irq (&chip->lock); + return -ENOMEM; + } + forte_channel_stop (&chip->play); } @@ -1201,7 +1208,12 @@ forte_channel_start (&chip->rec); else { chip->trigger = 1; - forte_channel_prep (&chip->rec); + + if (forte_channel_prep (&chip->rec)) { + spin_unlock_irq (&chip->lock); + return -ENOMEM; + } + forte_channel_stop (&chip->rec); } @@ -1396,7 +1408,11 @@ goto out; } - forte_channel_prep (channel); + if (forte_channel_prep (channel)) { + ret = -ENOMEM; + goto out; + } + channel->mapped = 1; if (vma->vm_pgoff != 0) { @@ -1460,7 +1476,10 @@ spin_lock_irqsave (&chip->lock, flags); /* Set up buffers with the right fragment size */ - forte_channel_prep (channel); + if (forte_channel_prep (channel)) { + spin_unlock_irqrestore (&chip->lock, flags); + return -ENOMEM; + } while (i) { /* All fragment buffers in use -> wait */ @@ -1568,7 +1587,10 @@ spin_lock_irqsave (&chip->lock, flags); /* Set up buffers with the right fragment size */ - forte_channel_prep (channel); + if (forte_channel_prep (channel)) { + spin_unlock_irqrestore (&chip->lock, flags); + return -ENOMEM; + } /* Start recording */ if (!chip->trigger)