f58161ba1b
There are bug reports of a crash with USB-audio devices when PCM prepare is performed immediately after the stream is stopped via trigger callback. It turned out that the problem is that we don't wait until all URBs are killed. This patch adds a new function to synchronize the pending stop operation on an endpoint, and calls in the prepare callback for avoiding the crash above. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=49181 Reported-and-tested-by: Artem S. Tashkinov <t.artem@lycos.com> Cc: <stable@vger.kernel.org> [v3.6] Signed-off-by: Takashi Iwai <tiwai@suse.de>
34 lines
1.3 KiB
C
34 lines
1.3 KiB
C
#ifndef __USBAUDIO_ENDPOINT_H
|
|
#define __USBAUDIO_ENDPOINT_H
|
|
|
|
#define SND_USB_ENDPOINT_TYPE_DATA 0
|
|
#define SND_USB_ENDPOINT_TYPE_SYNC 1
|
|
|
|
struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
|
|
struct usb_host_interface *alts,
|
|
int ep_num, int direction, int type);
|
|
|
|
int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
|
|
snd_pcm_format_t pcm_format,
|
|
unsigned int channels,
|
|
unsigned int period_bytes,
|
|
unsigned int rate,
|
|
struct audioformat *fmt,
|
|
struct snd_usb_endpoint *sync_ep);
|
|
|
|
int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep);
|
|
void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep,
|
|
int force, int can_sleep, int wait);
|
|
void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep);
|
|
int snd_usb_endpoint_activate(struct snd_usb_endpoint *ep);
|
|
int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep);
|
|
void snd_usb_endpoint_free(struct list_head *head);
|
|
|
|
int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep);
|
|
int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep);
|
|
|
|
void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
|
|
struct snd_usb_endpoint *sender,
|
|
const struct urb *urb);
|
|
|
|
#endif /* __USBAUDIO_ENDPOINT_H */
|