Index: forte.c =================================================================== RCS file: /home/mkp/Repository/forte/forte.c,v retrieving revision 1.63 retrieving revision 1.65 diff -u -r1.63 -r1.65 --- forte.c 1 Mar 2003 05:32:42 -0000 1.63 +++ forte.c 18 Sep 2003 15:28:39 -0000 1.65 @@ -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.65 2003/09/18 15:28:39 mkp Exp $" #define PFX DRIVER_NAME ": " #undef M_DEBUG @@ -156,7 +156,6 @@ void *buf; /* Buffer */ dma_addr_t buf_handle; /* Buffer handle */ - unsigned int record; unsigned int format; unsigned int rate; unsigned int stereo; @@ -366,11 +365,11 @@ static struct file_operations forte_mixer_fops = { - owner: THIS_MODULE, - llseek: no_llseek, - ioctl: forte_mixer_ioctl, - open: forte_mixer_open, - release: forte_mixer_release, + .owner = THIS_MODULE, + .llseek = no_llseek, + .ioctl = forte_mixer_ioctl, + .open = forte_mixer_open, + .release = forte_mixer_release, }; @@ -664,14 +663,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 +688,7 @@ &channel->buf_handle); if (!channel->buf || !channel->buf_handle) - BUG(); + return -ENOMEM; page = virt_to_page (channel->buf); @@ -708,6 +707,8 @@ DPRINTK ("%s: %s buffer @ %p (%p)\n", __FUNCTION__, channel->name, channel->buf, channel->buf_handle); + + return 0; } @@ -788,7 +789,6 @@ else if (channel == &chip->rec) { channel->name = "PCM_IN"; channel->iobase = chip->iobase + FORTE_CAP_OFFSET; - channel->record = 1; DPRINTK ("%s: PCM-IN iobase @ %p\n", __FUNCTION__, (void *) channel->iobase); } @@ -799,12 +799,15 @@ /* Defaults: 48kHz, 16-bit, stereo */ channel->ctrl = inw (channel->iobase + FORTE_PLY_CTRL); + + channel->frag_sz = FORTE_DEF_FRAG_SIZE; + channel->frag_num = FORTE_DEF_FRAGMENTS; + channel->frag_msecs = 0; + forte_channel_reset (channel); forte_channel_stereo (channel, 1); forte_channel_format (channel, AFMT_S16_LE); forte_channel_rate (channel, 48000); - channel->frag_sz = FORTE_DEF_FRAG_SIZE; - channel->frag_num = FORTE_DEF_FRAGMENTS; chip->trigger = 0; spin_unlock_irq (&chip->lock); @@ -827,6 +830,9 @@ static void forte_channel_free (struct forte_chip *chip, struct forte_channel *channel) { + struct page *page; + int i; + DPRINTK ("%s: %s\n", __FUNCTION__, channel->name); if (!channel->buf_handle) @@ -834,7 +840,12 @@ pci_free_consistent (chip->pci_dev, channel->buf_pages * PAGE_SIZE, channel->buf, channel->buf_handle); - + + page = virt_to_page (channel->buf); + + for (i = 0; i < channel->buf_pages ; i++) + mem_map_unreserve (page++); + memset (channel, 0x0, sizeof (*channel)); } @@ -1070,7 +1081,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &abi, sizeof (abi)); + return copy_to_user ((void *) arg, &abi, sizeof (abi)) ? -EFAULT : 0; case SNDCTL_DSP_GETIPTR: DPRINTK ("%s: GETIPTR\n", __FUNCTION__); @@ -1091,7 +1102,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)); + return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)) ? -EFAULT : 0; case SNDCTL_DSP_GETOSPACE: if (!wr) @@ -1119,7 +1130,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &abi, sizeof (abi)); + return copy_to_user ((void *) arg, &abi, sizeof (abi)) ? -EFAULT : 0; case SNDCTL_DSP_GETOPTR: if (!wr) @@ -1138,7 +1149,7 @@ spin_unlock_irq (&chip->lock); - return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)); + return copy_to_user ((void *) arg, &cinfo, sizeof (cinfo)) ? -EFAULT : 0; case SNDCTL_DSP_GETODELAY: if (!wr) @@ -1188,7 +1199,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 +1217,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 +1417,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 +1485,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 +1596,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) @@ -1636,15 +1667,15 @@ static struct file_operations forte_dsp_fops = { - owner: THIS_MODULE, - llseek: &no_llseek, - read: &forte_dsp_read, - write: &forte_dsp_write, - poll: &forte_dsp_poll, - ioctl: &forte_dsp_ioctl, - open: &forte_dsp_open, - release: &forte_dsp_release, - mmap: &forte_dsp_mmap, + .owner = THIS_MODULE, + .llseek = &no_llseek, + .read = &forte_dsp_read, + .write = &forte_dsp_write, + .poll = &forte_dsp_poll, + .ioctl = &forte_dsp_ioctl, + .open = &forte_dsp_open, + .release = &forte_dsp_release, + .mmap = &forte_dsp_mmap, }; @@ -2105,11 +2136,10 @@ static struct pci_driver forte_pci_driver = { - name: DRIVER_NAME, - id_table: forte_pci_ids, - probe: forte_probe, - remove: forte_remove, - + .name = DRIVER_NAME, + .id_table = forte_pci_ids, + .probe = forte_probe, + .remove = forte_remove, };