Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: 6fire: make buffers DMA-able (pcm)

Patch makes pcm buffers DMA-able by allocating each one separately.

Signed-off-by: Torsten Schenk <torsten.schenk@zoho.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Torsten Schenk and committed by
Takashi Iwai
5ece263f db8a38e5

+41 -2
+40 -1
sound/usb/6fire/pcm.c
··· 582 582 urb->instance.number_of_packets = PCM_N_PACKETS_PER_URB; 583 583 } 584 584 585 + static int usb6fire_pcm_buffers_init(struct pcm_runtime *rt) 586 + { 587 + int i; 588 + 589 + for (i = 0; i < PCM_N_URBS; i++) { 590 + rt->out_urbs[i].buffer = kzalloc(PCM_N_PACKETS_PER_URB 591 + * PCM_MAX_PACKET_SIZE, GFP_KERNEL); 592 + if (!rt->out_urbs[i].buffer) 593 + return -ENOMEM; 594 + rt->in_urbs[i].buffer = kzalloc(PCM_N_PACKETS_PER_URB 595 + * PCM_MAX_PACKET_SIZE, GFP_KERNEL); 596 + if (!rt->in_urbs[i].buffer) 597 + return -ENOMEM; 598 + } 599 + return 0; 600 + } 601 + 602 + static void usb6fire_pcm_buffers_destroy(struct pcm_runtime *rt) 603 + { 604 + int i; 605 + 606 + for (i = 0; i < PCM_N_URBS; i++) { 607 + kfree(rt->out_urbs[i].buffer); 608 + kfree(rt->in_urbs[i].buffer); 609 + } 610 + } 611 + 585 612 int usb6fire_pcm_init(struct sfire_chip *chip) 586 613 { 587 614 int i; ··· 619 592 620 593 if (!rt) 621 594 return -ENOMEM; 595 + 596 + ret = usb6fire_pcm_buffers_init(rt); 597 + if (ret) { 598 + usb6fire_pcm_buffers_destroy(rt); 599 + kfree(rt); 600 + return ret; 601 + } 622 602 623 603 rt->chip = chip; 624 604 rt->stream_state = STREAM_DISABLED; ··· 648 614 649 615 ret = snd_pcm_new(chip->card, "DMX6FireUSB", 0, 1, 1, &pcm); 650 616 if (ret < 0) { 617 + usb6fire_pcm_buffers_destroy(rt); 651 618 kfree(rt); 652 619 snd_printk(KERN_ERR PREFIX "cannot create pcm instance.\n"); 653 620 return ret; ··· 660 625 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &pcm_ops); 661 626 662 627 if (ret) { 628 + usb6fire_pcm_buffers_destroy(rt); 663 629 kfree(rt); 664 630 snd_printk(KERN_ERR PREFIX 665 631 "error preallocating pcm buffers.\n"); ··· 705 669 706 670 void usb6fire_pcm_destroy(struct sfire_chip *chip) 707 671 { 708 - kfree(chip->pcm); 672 + struct pcm_runtime *rt = chip->pcm; 673 + 674 + usb6fire_pcm_buffers_destroy(rt); 675 + kfree(rt); 709 676 chip->pcm = NULL; 710 677 }
+1 -1
sound/usb/6fire/pcm.h
··· 32 32 struct urb instance; 33 33 struct usb_iso_packet_descriptor packets[PCM_N_PACKETS_PER_URB]; 34 34 /* END DO NOT SEPARATE */ 35 - u8 buffer[PCM_N_PACKETS_PER_URB * PCM_MAX_PACKET_SIZE]; 35 + u8 *buffer; 36 36 37 37 struct pcm_urb *peer; 38 38 };