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;
 
        /* 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 */
 
        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);
        }
 }
        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) {
                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;
        }
 
 
                   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;
                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),
                          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;
 }