--- linux-3.11/drivers/net/usb/usbnet.c	2013-09-02 13:46:10.000000000 -0700
+++ linux-3.11.10-301.fc20.x86_64/drivers/net/usb/usbnet.c	2016-01-08 12:53:14.071337888 -0800
@@ -1073,30 +1073,73 @@
 		}
 	}
 
-	/* tasklet could resubmit itself forever if memory is tight */
-	if (test_bit (EVENT_RX_MEMORY, &dev->flags)) {
-		struct urb	*urb = NULL;
-		int resched = 1;
-
-		if (netif_running (dev->net))
-			urb = usb_alloc_urb (0, GFP_KERNEL);
-		else
-			clear_bit (EVENT_RX_MEMORY, &dev->flags);
-		if (urb != NULL) {
-			clear_bit (EVENT_RX_MEMORY, &dev->flags);
-			status = usb_autopm_get_interface(dev->intf);
-			if (status < 0) {
-				usb_free_urb(urb);
-				goto fail_lowmem;
-			}
-			if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
-				resched = 0;
-			usb_autopm_put_interface(dev->intf);
+    if(!dev->driver_info->rx_submit_fixup)
+    {
+        /* tasklet could resubmit itself forever if memory is tight */
+        if (test_bit (EVENT_RX_MEMORY, &dev->flags)) {
+            struct urb	*urb = NULL;
+            int resched = 1;
+
+            if (netif_running (dev->net))
+                urb = usb_alloc_urb (0, GFP_KERNEL);
+            else
+                clear_bit (EVENT_RX_MEMORY, &dev->flags);
+            if (urb != NULL) {
+                clear_bit (EVENT_RX_MEMORY, &dev->flags);
+                status = usb_autopm_get_interface(dev->intf);
+                if (status < 0) {
+                    usb_free_urb(urb);
+                    goto fail_lowmem;
+                }
+                if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
+                    resched = 0;
+                usb_autopm_put_interface(dev->intf);
 fail_lowmem:
-			if (resched)
-				tasklet_schedule (&dev->bh);
-		}
-	}
+                if (resched)
+                    tasklet_schedule (&dev->bh);
+            }
+        }
+    }
+    else
+    {            
+        /* tasklet could resubmit itself forever if memory is tight */
+        if (test_bit (EVENT_RX_MEMORY, &dev->flags)) {
+            struct urb	*urb = NULL;
+            int resched = 1;
+            struct urb	*avb_urb = NULL;
+	    struct urb *gptp_urb = NULL;
+	    struct urb *av_ctrl_urb = NULL;
+            if (netif_running (dev->net))
+            {   //allocate memory for legacy urb and avb_urb
+                urb = usb_alloc_urb (0, GFP_KERNEL);
+                avb_urb = usb_alloc_urb (0, GFP_KERNEL);
+		gptp_urb = usb_alloc_urb(0, GFP_KERNEL);
+		av_ctrl_urb = usb_alloc_urb(0, GFP_KERNEL);
+            }
+            else
+                clear_bit (EVENT_RX_MEMORY, &dev->flags);
+            if ( (urb != NULL) && (avb_urb != NULL) && (gptp_urb != NULL) && (av_ctrl_urb != NULL)) {
+                clear_bit (EVENT_RX_MEMORY, &dev->flags);
+                status = usb_autopm_get_interface(dev->intf);
+                if (status < 0) {
+                    usb_free_urb(urb);
+                    usb_free_urb(avb_urb);
+		    usb_free_urb(gptp_urb);
+		    usb_free_urb(av_ctrl_urb);
+                    goto fail_lowmem_1;
+                }
+                if ( (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK)
+                        || (dev->driver_info->rx_submit_fixup_avb(dev, avb_urb, GFP_KERNEL) == -ENOLINK) 
+			|| (dev->driver_info->rx_submit_fixup(dev, gptp_urb, GFP_KERNEL) ==  -ENOLINK)
+			|| (dev->driver_info->rx_submit_fixup_av_ctrl(dev, av_ctrl_urb, GFP_KERNEL) == -ENOLINK))
+                    resched = 0;
+                usb_autopm_put_interface(dev->intf);
+fail_lowmem_1:
+                if (resched)
+                    tasklet_schedule (&dev->bh);
+            }
+        }
+    }
 
 	if (test_bit (EVENT_LINK_RESET, &dev->flags)) {
 		struct driver_info	*info = dev->driver_info;
@@ -1318,6 +1361,9 @@
 	struct urb	*urb;
 	int		i;
 	int		ret = 0;
+    struct urb *avb_urb;
+    struct urb *gptp_urb;
+    struct urb *av_ctrl_urb;
 
 	/* don't refill the queue all at once */
 	for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) {
@@ -1330,6 +1376,44 @@
 			ret = -ENOMEM;
 			goto err;
 		}
+        if(dev->driver_info->rx_submit_fixup_avb)
+        {    
+            avb_urb = usb_alloc_urb(0, flags);
+            if (avb_urb != NULL) {
+                ret = dev->driver_info->rx_submit_fixup_avb(dev, avb_urb, flags);
+                if (ret)
+                    goto err;
+            } else {
+                ret = -ENOMEM;
+                goto err;
+            }
+        }
+        if(dev->driver_info->rx_submit_fixup_av_ctrl)
+        {
+            av_ctrl_urb = usb_alloc_urb(0, flags);
+            if (av_ctrl_urb != NULL) {
+                ret = dev->driver_info->rx_submit_fixup_av_ctrl(dev, av_ctrl_urb, flags);
+                if (ret)
+                    goto err;
+            } else {
+                ret = -ENOMEM;
+                goto err;
+            }
+        }
+
+        if(dev->driver_info->rx_submit_fixup)
+        {
+            gptp_urb = usb_alloc_urb(0, flags);
+            if (gptp_urb != NULL) {
+                ret = dev->driver_info->rx_submit_fixup(dev, gptp_urb, flags);
+                if (ret)
+                    goto err;
+            } else {
+                ret = -ENOMEM;
+                goto err;
+            }
+        }
+
 	}
 err:
 	return ret;

