Commit 3bfc69ab authored by Dean Jenkins's avatar Dean Jenkins Committed by David S. Miller

asix: Tidy-up 32-bit header word synchronisation

Tidy-up the Data header 32-bit word synchronisation logic in
asix_rx_fixup_internal() by removing redundant logic tests.

The code is looking at the following cases of the Data header
32-bit word that is present before each Ethernet frame:

a) all 32 bits of the Data header word are in the URB socket buffer
b) first 16 bits of the Data header word are at the end of the URB
   socket buffer
c) last 16 bits of the Data header word are at the start of the URB
   socket buffer eg. split_head = true

Note that the lifetime of rx->split_head exists outside of the
function call and is accessed per processing of each URB. Therefore,
split_head being true acts on the next URB to be processed.

To check for b) the offset will be 16 bits (2 bytes) from the end of
the buffer then indicate split_head is true.
To check for c) split_head must be true because the first 16 bits
have been found.
To check for a) else c)

Note that the || logic of the old code included the state
(skb->len - offset == sizeof(u16) && rx->split_head) which is not
possible because the split_head cannot be true whilst checking for b).
This is because the split_head indicates that the first 16 bits have
been found and that is not possible whilst checking for the first 16
bits. Therefore simplify the logic.
Signed-off-by: default avatarDean Jenkins <Dean_Jenkins@mentor.com>
Signed-off-by: default avatarMark Craske <Mark_Craske@mentor.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7b0378f5
...@@ -61,21 +61,19 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb, ...@@ -61,21 +61,19 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
unsigned char *data; unsigned char *data;
if (!rx->remaining) { if (!rx->remaining) {
if ((skb->len - offset == sizeof(u16)) || if (skb->len - offset == sizeof(u16)) {
rx->split_head) { rx->header = get_unaligned_le16(
if(!rx->split_head) { skb->data + offset);
rx->header = get_unaligned_le16( rx->split_head = true;
skb->data + offset); offset += sizeof(u16);
rx->split_head = true; break;
offset += sizeof(u16); }
break;
} else { if (rx->split_head == true) {
rx->header |= (get_unaligned_le16( rx->header |= (get_unaligned_le16(
skb->data + offset) skb->data + offset) << 16);
<< 16); rx->split_head = false;
rx->split_head = false; offset += sizeof(u16);
offset += sizeof(u16);
}
} else { } else {
rx->header = get_unaligned_le32(skb->data + rx->header = get_unaligned_le32(skb->data +
offset); offset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment