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

Commit 8b1fad2f authored by Tomas Winkler's avatar Tomas Winkler Committed by Mauro Carvalho Chehab
Browse files

[media] easycap: use usb_kill_urb wrapper functions



1. kill_video_usb can be used in all places where video urbs are killed
and reduce code repetition

2. remove unnecessary check for easycap == NULL in the function
as it is always checked by the calling function

3. rename the function to easycap_video_kill_urb to reduce
possibility of name conflict

4. implement also easycap_audio_kill_urb

5. simplify freeing urbs

Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 7dfdae8e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -472,7 +472,7 @@ struct easycap {
long easycap_unlocked_ioctl(struct file *, unsigned int, unsigned long);
int easycap_dqbuf(struct easycap *, int);
int submit_video_urbs(struct easycap *);
int kill_video_urbs(struct easycap *);
int easycap_video_kill_urbs(struct easycap *);
void easycap_testcard(struct easycap *, int);
int fillin_formats(void);
int newinput(struct easycap *, int);
@@ -489,6 +489,7 @@ int adjust_hue(struct easycap *, int);
 */
/*---------------------------------------------------------------------------*/
int easycap_alsa_probe(struct easycap *);
int easycap_audio_kill_urbs(struct easycap *);
void easycap_alsa_complete(struct urb *);
int audio_setup(struct easycap *);
/*---------------------------------------------------------------------------*/
+2 −2
Original line number Diff line number Diff line
@@ -124,7 +124,7 @@ int adjust_standard(struct easycap *peasycap, v4l2_std_id std_id)
	}
	if (peasycap->video_isoc_streaming) {
		resubmit = true;
		kill_video_urbs(peasycap);
		easycap_video_kill_urbs(peasycap);
	} else
		resubmit = false;
/*--------------------------------------------------------------------------*/
@@ -557,7 +557,7 @@ int adjust_format(struct easycap *peasycap,
		peasycap->bytesperpixel * peasycap->width * peasycap->height;
	if (peasycap->video_isoc_streaming) {
		resubmit = true;
		kill_video_urbs(peasycap);
		easycap_video_kill_urbs(peasycap);
	} else
		resubmit = false;
/*---------------------------------------------------------------------------*/
+57 −92
Original line number Diff line number Diff line
@@ -401,7 +401,7 @@ newinput(struct easycap *peasycap, int input)
	peasycap->audio_idle = 1;
	if (peasycap->video_isoc_streaming) {
		resubmit = true;
		kill_video_urbs(peasycap);
		easycap_video_kill_urbs(peasycap);
	} else {
		resubmit = false;
	}
@@ -620,43 +620,53 @@ int submit_video_urbs(struct easycap *peasycap)
			peasycap->video_eof = 1;
		}

		if (isbad) {
			JOM(4, "attempting cleanup instead of submitting\n");
			list_for_each(plist_head, (peasycap->purb_video_head)) {
				pdata_urb = list_entry(plist_head,
						struct data_urb, list_head);
				if (pdata_urb) {
					purb = pdata_urb->purb;
					if (purb)
						usb_kill_urb(purb);
				}
			}
			peasycap->video_isoc_streaming = 0;
		} else {
		if (isbad)
			easycap_video_kill_urbs(peasycap);
		else
			peasycap->video_isoc_streaming = 1;
			JOM(4, "submitted %i video urbs\n", m);
		}
	} else {
		JOM(4, "already streaming video urbs\n");
	}
	return 0;
}
/*****************************************************************************/
int kill_video_urbs(struct easycap *peasycap)
int easycap_audio_kill_urbs(struct easycap *peasycap)
{
	int m;
	struct list_head *plist_head;
	struct data_urb *pdata_urb;

	if (!peasycap) {
		SAY("ERROR: peasycap is NULL\n");
	if (!peasycap->audio_isoc_streaming)
		return 0;

	if (!peasycap->purb_audio_head) {
		SAM("ERROR: peasycap->purb_audio_head is NULL\n");
		return -EFAULT;
	}
	if (!peasycap->video_isoc_streaming) {
		JOM(8, "%i=video_isoc_streaming, no video urbs killed\n",
			peasycap->video_isoc_streaming);

	peasycap->audio_isoc_streaming = 0;
	m = 0;
	list_for_each(plist_head, peasycap->purb_audio_head) {
		pdata_urb = list_entry(plist_head, struct data_urb, list_head);
		if (pdata_urb && pdata_urb->purb) {
			usb_kill_urb(pdata_urb->purb);
			m++;
		}
	}

	JOM(4, "%i audio urbs killed\n", m);

	return 0;
}
int easycap_video_kill_urbs(struct easycap *peasycap)
{
	int m;
	struct list_head *plist_head;
	struct data_urb *pdata_urb;

	if (!peasycap->video_isoc_streaming)
		return 0;

	if (!peasycap->purb_video_head) {
		SAM("ERROR: peasycap->purb_video_head is NULL\n");
		return -EFAULT;
@@ -694,8 +704,8 @@ static int videodev_release(struct video_device *pvideo_device)
		SAY("ending unsuccessfully\n");
		return -EFAULT;
	}
	if (0 != kill_video_urbs(peasycap)) {
		SAM("ERROR: kill_video_urbs() failed\n");
	if (easycap_video_kill_urbs(peasycap)) {
		SAM("ERROR: easycap_video_kill_urbs() failed\n");
		return -EFAULT;
	}
	JOM(4, "ending successfully\n");
@@ -738,22 +748,17 @@ static void easycap_delete(struct kref *pkref)
 */
/*---------------------------------------------------------------------------*/
	if (peasycap->purb_video_head) {
		JOM(4, "freeing video urbs\n");
		m = 0;
		list_for_each(plist_head, (peasycap->purb_video_head)) {
		list_for_each(plist_head, peasycap->purb_video_head) {
			pdata_urb = list_entry(plist_head,
						struct data_urb, list_head);
			if (!pdata_urb) {
				JOM(4, "ERROR: pdata_urb is NULL\n");
			} else {
				if (pdata_urb->purb) {
			if (pdata_urb && pdata_urb->purb) {
				usb_free_urb(pdata_urb->purb);
				pdata_urb->purb = NULL;
					peasycap->allocation_video_urb -= 1;
				peasycap->allocation_video_urb--;
				m++;
			}
		}
		}

		JOM(4, "%i video urbs freed\n", m);
/*---------------------------------------------------------------------------*/
@@ -767,7 +772,6 @@ static void easycap_delete(struct kref *pkref)
				peasycap->allocation_video_struct -=
						sizeof(struct data_urb);
				kfree(pdata_urb);
				pdata_urb = NULL;
				m++;
			}
		}
@@ -832,17 +836,13 @@ static void easycap_delete(struct kref *pkref)
		list_for_each(plist_head, (peasycap->purb_audio_head)) {
			pdata_urb = list_entry(plist_head,
					struct data_urb, list_head);
			if (!pdata_urb)
				JOM(4, "ERROR: pdata_urb is NULL\n");
			else {
				if (pdata_urb->purb) {
			if (pdata_urb && pdata_urb->purb) {
				usb_free_urb(pdata_urb->purb);
				pdata_urb->purb = NULL;
					peasycap->allocation_audio_urb -= 1;
				peasycap->allocation_audio_urb--;
				m++;
			}
		}
		}
		JOM(4, "%i audio urbs freed\n", m);
/*---------------------------------------------------------------------------*/
		JOM(4, "freeing audio data_urb structures.\n");
@@ -855,7 +855,6 @@ static void easycap_delete(struct kref *pkref)
				peasycap->allocation_audio_struct -=
							sizeof(struct data_urb);
				kfree(pdata_urb);
				pdata_urb = NULL;
				m++;
			}
		}
@@ -1084,7 +1083,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
					JOM(8, " ... failed  returning -EIO\n");
					peasycap->video_eof = 1;
					peasycap->audio_eof = 1;
					kill_video_urbs(peasycap);
					easycap_video_kill_urbs(peasycap);
					return -EIO;
				}
				peasycap->status = 0;
@@ -1094,7 +1093,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
			#endif /*PERSEVERE*/
			peasycap->video_eof = 1;
			peasycap->audio_eof = 1;
			kill_video_urbs(peasycap);
			easycap_video_kill_urbs(peasycap);
			JOM(8, "returning -EIO\n");
			return -EIO;
		}
@@ -1147,7 +1146,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
					JOM(8, " ... failed returning -EIO\n");
					peasycap->video_eof = 1;
					peasycap->audio_eof = 1;
					kill_video_urbs(peasycap);
					easycap_video_kill_urbs(peasycap);
					return -EIO;
				}
				peasycap->status = 0;
@@ -1157,7 +1156,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
#endif /*PERSEVERE*/
			peasycap->video_eof = 1;
			peasycap->audio_eof = 1;
			kill_video_urbs(peasycap);
			easycap_video_kill_urbs(peasycap);
			JOM(8, "returning -EIO\n");
			return -EIO;
		}
@@ -3969,12 +3968,9 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface)
{
	struct usb_host_interface *pusb_host_interface;
	struct usb_interface_descriptor *pusb_interface_descriptor;
	u8 bInterfaceNumber;
	struct easycap *peasycap;

	struct list_head *plist_head;
	struct data_urb *pdata_urb;
	int minor, m, kd;
	int minor, kd;
	u8 bInterfaceNumber;

	JOT(4, "\n");

@@ -4009,45 +4005,14 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface)
	peasycap->audio_eof = 1;
	wake_up_interruptible(&(peasycap->wq_video));
	wake_up_interruptible(&(peasycap->wq_audio));
/*---------------------------------------------------------------------------*/

	switch (bInterfaceNumber) {
	case 0: {
		if (peasycap->purb_video_head) {
			JOM(4, "killing video urbs\n");
			m = 0;
			list_for_each(plist_head, peasycap->purb_video_head) {
				pdata_urb = list_entry(plist_head,
						struct data_urb, list_head);
				if (pdata_urb) {
					if (pdata_urb->purb) {
						usb_kill_urb(pdata_urb->purb);
						m++;
					}
				}
			}
			JOM(4, "%i video urbs killed\n", m);
		}
	case 0:
		easycap_video_kill_urbs(peasycap);
		break;
	}
/*---------------------------------------------------------------------------*/
	case 2: {
		if (peasycap->purb_audio_head) {
			JOM(4, "killing audio urbs\n");
			m = 0;
			list_for_each(plist_head, peasycap->purb_audio_head) {
				pdata_urb = list_entry(plist_head,
						struct data_urb, list_head);
				if (pdata_urb) {
					if (pdata_urb->purb) {
						usb_kill_urb(pdata_urb->purb);
						m++;
					}
				}
			}
			JOM(4, "%i audio urbs killed\n", m);
		}
	case 2:
		easycap_audio_kill_urbs(peasycap);
		break;
	}
	default:
		break;
	}
+4 −11
Original line number Diff line number Diff line
@@ -138,18 +138,11 @@ static int submit_audio_urbs(struct easycap *peasycap)
		SAM(".....  possibly inadequate USB bandwidth\n");
		peasycap->audio_eof = 1;
	}
	if (isbad) {
		JOM(4, "attempting cleanup instead of submitting\n");
		list_for_each(plist_head, (peasycap->purb_audio_head)) {
			pdata_urb = list_entry(plist_head, struct data_urb, list_head);
			if (pdata_urb && pdata_urb->purb)
				usb_kill_urb(pdata_urb->purb);
		}
		peasycap->audio_isoc_streaming = 0;
	} else {

	if (isbad)
		easycap_audio_kill_urbs(peasycap);
	else
		peasycap->audio_isoc_streaming = m;
		JOM(4, "submitted %i audio urbs\n", m);
	}

	return 0;
}