mirror of https://gitee.com/openkylin/linux.git
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: Malcolm Priestley <tvboxspy@gmail.com> Link: https://lore.kernel.org/r/077f42f8-4f7f-adc4-5a14-955165cef9f1@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9786f8b2f7
commit
cf5ffd22e4
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue