aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb/asix_common.c
diff options
context:
space:
mode:
authorDean Jenkins <Dean_Jenkins@mentor.com>2015-10-02 09:29:04 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-05 09:58:38 -0400
commit7b0378f517fa1a32b5c8384248d2f8bf79c7c2ae (patch)
tree34863665431e106770385deb4c3d0edea7877fcd /drivers/net/usb/asix_common.c
parentbab18991871545dfbd10c931eb0fe8f7637156a9 (diff)
asix: Rename remaining and size for clarity
The Data header synchronisation is easier to understand if the variables "remaining" and "size" are renamed. Therefore, the lifetime of the "remaining" variable exists outside of asix_rx_fixup_internal() and is used to indicate any remaining pending bytes of the Ethernet frame that need to be obtained from the next socket buffer. This allows an Ethernet frame to span across multiple socket buffers. "size" is now local to asix_rx_fixup_internal() and contains the size read from the Data header 32-bit word. Add "copy_length" to hold the number of the Ethernet frame bytes (maybe a part of a full frame) that are to be copied out of the socket buffer. Signed-off-by: Dean Jenkins <Dean_Jenkins@mentor.com> Signed-off-by: Mark Craske <Mark_Craske@mentor.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/asix_common.c')
-rw-r--r--drivers/net/usb/asix_common.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c
index 75d6f26729a3..2bd5bdda8c2e 100644
--- a/drivers/net/usb/asix_common.c
+++ b/drivers/net/usb/asix_common.c
@@ -54,12 +54,13 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
54 struct asix_rx_fixup_info *rx) 54 struct asix_rx_fixup_info *rx)
55{ 55{
56 int offset = 0; 56 int offset = 0;
57 u16 size;
57 58
58 while (offset + sizeof(u16) <= skb->len) { 59 while (offset + sizeof(u16) <= skb->len) {
59 u16 remaining = 0; 60 u16 copy_length;
60 unsigned char *data; 61 unsigned char *data;
61 62
62 if (!rx->size) { 63 if (!rx->remaining) {
63 if ((skb->len - offset == sizeof(u16)) || 64 if ((skb->len - offset == sizeof(u16)) ||
64 rx->split_head) { 65 rx->split_head) {
65 if(!rx->split_head) { 66 if(!rx->split_head) {
@@ -81,42 +82,42 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
81 offset += sizeof(u32); 82 offset += sizeof(u32);
82 } 83 }
83 84
84 /* get the packet length */ 85 /* take frame length from Data header 32-bit word */
85 rx->size = (u16) (rx->header & 0x7ff); 86 size = (u16)(rx->header & 0x7ff);
86 if (rx->size != ((~rx->header >> 16) & 0x7ff)) { 87 if (size != ((~rx->header >> 16) & 0x7ff)) {
87 netdev_err(dev->net, "asix_rx_fixup() Bad Header Length 0x%x, offset %d\n", 88 netdev_err(dev->net, "asix_rx_fixup() Bad Header Length 0x%x, offset %d\n",
88 rx->header, offset); 89 rx->header, offset);
89 rx->size = 0;
90 return 0; 90 return 0;
91 } 91 }
92 rx->ax_skb = netdev_alloc_skb_ip_align(dev->net, 92 rx->ax_skb = netdev_alloc_skb_ip_align(dev->net, size);
93 rx->size);
94 if (!rx->ax_skb) 93 if (!rx->ax_skb)
95 return 0; 94 return 0;
95 rx->remaining = size;
96 } 96 }
97 97
98 if (rx->size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) { 98 if (rx->remaining > dev->net->mtu + ETH_HLEN + VLAN_HLEN) {
99 netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", 99 netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n",
100 rx->size); 100 rx->remaining);
101 kfree_skb(rx->ax_skb); 101 kfree_skb(rx->ax_skb);
102 rx->ax_skb = NULL; 102 rx->ax_skb = NULL;
103 rx->size = 0U; 103 rx->remaining = 0;
104
105 return 0; 104 return 0;
106 } 105 }
107 106
108 if (rx->size > skb->len - offset) { 107 if (rx->remaining > skb->len - offset) {
109 remaining = rx->size - (skb->len - offset); 108 copy_length = skb->len - offset;
110 rx->size = skb->len - offset; 109 rx->remaining -= copy_length;
110 } else {
111 copy_length = rx->remaining;
112 rx->remaining = 0;
111 } 113 }
112 114
113 data = skb_put(rx->ax_skb, rx->size); 115 data = skb_put(rx->ax_skb, copy_length);
114 memcpy(data, skb->data + offset, rx->size); 116 memcpy(data, skb->data + offset, copy_length);
115 if (!remaining) 117 if (!rx->remaining)
116 usbnet_skb_return(dev, rx->ax_skb); 118 usbnet_skb_return(dev, rx->ax_skb);
117 119
118 offset += (rx->size + 1) & 0xfffe; 120 offset += (copy_length + 1) & 0xfffe;
119 rx->size = remaining;
120 } 121 }
121 122
122 if (skb->len != offset) { 123 if (skb->len != offset) {