Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1aa24ca3 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: gadget: Fix synchronization issue between f_audio_source"

parents 140d825b 51b2e8a3
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -365,15 +365,22 @@ static void audio_send(struct audio_dev *audio)
	s64 msecs;
	s64 frames;
	ktime_t now;
	unsigned long flags;

	spin_lock_irqsave(&audio->lock, flags);
	/* audio->substream will be null if we have been closed */
	if (!audio->substream)
	if (!audio->substream) {
		spin_unlock_irqrestore(&audio->lock, flags);
		return;
	}
	/* audio->buffer_pos will be null if we have been stopped */
	if (!audio->buffer_pos)
	if (!audio->buffer_pos) {
		spin_unlock_irqrestore(&audio->lock, flags);
		return;
	}

	runtime = audio->substream->runtime;
	spin_unlock_irqrestore(&audio->lock, flags);

	/* compute number of frames to send */
	now = ktime_get();
@@ -397,8 +404,21 @@ static void audio_send(struct audio_dev *audio)

	while (frames > 0) {
		req = audio_req_get(audio);
		if (!req)
		spin_lock_irqsave(&audio->lock, flags);
		/* audio->substream will be null if we have been closed */
		if (!audio->substream) {
			spin_unlock_irqrestore(&audio->lock, flags);
			return;
		}
		/* audio->buffer_pos will be null if we have been stopped */
		if (!audio->buffer_pos) {
			spin_unlock_irqrestore(&audio->lock, flags);
			return;
		}
		if (!req) {
			spin_unlock_irqrestore(&audio->lock, flags);
			break;
		}

		length = frames_to_bytes(runtime, frames);
		if (length > IN_EP_MAX_PACKET_SIZE)
@@ -424,6 +444,7 @@ static void audio_send(struct audio_dev *audio)
		}

		req->length = length;
		spin_unlock_irqrestore(&audio->lock, flags);
		ret = usb_ep_queue(audio->in_ep, req, GFP_ATOMIC);
		if (ret < 0) {
			pr_err("usb_ep_queue failed ret: %d\n", ret);