Commit cf5ffd22 authored by Malcolm Priestley's avatar Malcolm Priestley Committed by Greg Kroah-Hartman
Browse files

staging: vt6656: use usb_anchor for tx queue.



Use usb_anchor to track tx submitted urbs and initialize the
urb as needed in vnt_tx_context.

Signed-off-by: default avatarMalcolm Priestley <tvboxspy@gmail.com>
Link: https://lore.kernel.org/r/077f42f8-4f7f-adc4-5a14-955165cef9f1@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9786f8b2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -238,7 +238,6 @@ struct vnt_rcb {
struct vnt_usb_send_context {
	void *priv;
	struct sk_buff *skb;
	struct urb *urb;
	struct ieee80211_hdr *hdr;
	void *tx_buffer;
	unsigned int buf_len;
@@ -292,6 +291,7 @@ struct vnt_private {

	/* Variables to track resources for the BULK Out Pipe */
	struct vnt_usb_send_context *tx_context[CB_MAX_TX_DESC];
	struct usb_anchor tx_submitted;
	u32 num_tx_context;

	/* Variables to track resources for the Interrupt In Pipe */
+4 −14
Original line number Diff line number Diff line
@@ -445,17 +445,13 @@ static void vnt_free_tx_bufs(struct vnt_private *priv)
	struct vnt_usb_send_context *tx_context;
	int ii;

	usb_kill_anchored_urbs(&priv->tx_submitted);

	for (ii = 0; ii < priv->num_tx_context; ii++) {
		tx_context = priv->tx_context[ii];
		if (!tx_context)
			continue;

		/* deallocate URBs */
		if (tx_context->urb) {
			usb_kill_urb(tx_context->urb);
			usb_free_urb(tx_context->urb);
		}

		kfree(tx_context);
	}
}
@@ -496,6 +492,8 @@ static int vnt_alloc_bufs(struct vnt_private *priv)
	struct vnt_rcb *rcb;
	int ii;

	init_usb_anchor(&priv->tx_submitted);

	for (ii = 0; ii < priv->num_tx_context; ii++) {
		tx_context = kmalloc(sizeof(*tx_context), GFP_KERNEL);
		if (!tx_context) {
@@ -506,14 +504,6 @@ static int vnt_alloc_bufs(struct vnt_private *priv)
		priv->tx_context[ii] = tx_context;
		tx_context->priv = priv;
		tx_context->pkt_no = ii;

		/* allocate URBs */
		tx_context->urb = usb_alloc_urb(0, GFP_KERNEL);
		if (!tx_context->urb) {
			ret = -ENOMEM;
			goto free_tx;
		}

		tx_context->in_use = false;
	}

+12 −2
Original line number Diff line number Diff line
@@ -456,7 +456,7 @@ int vnt_tx_context(struct vnt_private *priv,
		   struct vnt_usb_send_context *context)
{
	int status;
	struct urb *urb = context->urb;
	struct urb *urb;

	if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags)) {
		context->in_use = false;
@@ -468,6 +468,12 @@ int vnt_tx_context(struct vnt_private *priv,
		return -E2BIG;
	}

	urb = usb_alloc_urb(0, GFP_ATOMIC);
	if (!urb) {
		context->in_use = false;
		return -ENOMEM;
	}

	usb_fill_bulk_urb(urb,
			  priv->usb,
			  usb_sndbulkpipe(priv->usb, 3),
@@ -476,12 +482,16 @@ int vnt_tx_context(struct vnt_private *priv,
			  vnt_tx_context_complete,
			  context);

	usb_anchor_urb(urb, &priv->tx_submitted);

	status = usb_submit_urb(urb, GFP_ATOMIC);
	if (status) {
		dev_dbg(&priv->usb->dev, "Submit Tx URB failed %d\n", status);

		usb_unanchor_urb(urb);
		context->in_use = false;
	}

	usb_free_urb(urb);

	return status;
}