diff options
author | hayeswang <hayeswang@realtek.com> | 2013-08-16 04:09:35 -0400 |
---|---|---|
committer | Vladislav Zhurba <vzhurba@nvidia.com> | 2018-02-01 16:57:58 -0500 |
commit | edef229a9fc96de75468c075fadf2642ec9ec6e0 (patch) | |
tree | 0139d4e81272bad2a2109a9a2eba62a5c2058fd0 /drivers/net/usb/r8152_shield.c | |
parent | 7b5c5a0e3b1bd2fe75c29a1ea9aaae33c0ac39e5 (diff) |
r8152: adjust some duplicated code
- Use r8152_get_tx_agg for getting tx agg list
- Replace submit rx with goto submit
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Preetham Chandru R <pchandru@nvidia.com>
(cherry picked from commit 0de98f6c6fb63395a653f58b53663ce6c565a1e6)
Change-Id: Id7fcf912da19dad2dceaf556160488c6f19bae5c
Reviewed-on: http://git-master/r/369992
Tested-by: Aly Hirani <ahirani@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'drivers/net/usb/r8152_shield.c')
-rw-r--r-- | drivers/net/usb/r8152_shield.c | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/drivers/net/usb/r8152_shield.c b/drivers/net/usb/r8152_shield.c index 41b99ce82..4dee76b46 100644 --- a/drivers/net/usb/r8152_shield.c +++ b/drivers/net/usb/r8152_shield.c | |||
@@ -1067,6 +1067,24 @@ err1: | |||
1067 | return -ENOMEM; | 1067 | return -ENOMEM; |
1068 | } | 1068 | } |
1069 | 1069 | ||
1070 | static struct tx_agg *r8152_get_tx_agg(struct r8152 *tp) | ||
1071 | { | ||
1072 | struct tx_agg *agg = NULL; | ||
1073 | unsigned long flags; | ||
1074 | |||
1075 | spin_lock_irqsave(&tp->tx_lock, flags); | ||
1076 | if (!list_empty(&tp->tx_free)) { | ||
1077 | struct list_head *cursor; | ||
1078 | |||
1079 | cursor = tp->tx_free.next; | ||
1080 | list_del_init(cursor); | ||
1081 | agg = list_entry(cursor, struct tx_agg, list); | ||
1082 | } | ||
1083 | spin_unlock_irqrestore(&tp->tx_lock, flags); | ||
1084 | |||
1085 | return agg; | ||
1086 | } | ||
1087 | |||
1070 | static void | 1088 | static void |
1071 | r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc, struct sk_buff *skb) | 1089 | r8152_tx_csum(struct r8152 *tp, struct tx_desc *desc, struct sk_buff *skb) |
1072 | { | 1090 | { |
@@ -1139,15 +1157,8 @@ static void rx_bottom(struct r8152 *tp) | |||
1139 | 1157 | ||
1140 | agg = list_entry(cursor, struct rx_agg, list); | 1158 | agg = list_entry(cursor, struct rx_agg, list); |
1141 | urb = agg->urb; | 1159 | urb = agg->urb; |
1142 | if (urb->actual_length < ETH_ZLEN) { | 1160 | if (urb->actual_length < ETH_ZLEN) |
1143 | ret = r8152_submit_rx(tp, agg, GFP_ATOMIC); | 1161 | goto submit; |
1144 | spin_lock_irqsave(&tp->rx_lock, flags); | ||
1145 | if (ret && ret != -ENODEV) { | ||
1146 | list_add_tail(&agg->list, next); | ||
1147 | tasklet_schedule(&tp->tl); | ||
1148 | } | ||
1149 | continue; | ||
1150 | } | ||
1151 | 1162 | ||
1152 | len_used = 0; | 1163 | len_used = 0; |
1153 | rx_desc = agg->head; | 1164 | rx_desc = agg->head; |
@@ -1181,6 +1192,7 @@ static void rx_bottom(struct r8152 *tp) | |||
1181 | len_used += sizeof(struct rx_desc) + pkt_len; | 1192 | len_used += sizeof(struct rx_desc) + pkt_len; |
1182 | } | 1193 | } |
1183 | 1194 | ||
1195 | submit: | ||
1184 | ret = r8152_submit_rx(tp, agg, GFP_ATOMIC); | 1196 | ret = r8152_submit_rx(tp, agg, GFP_ATOMIC); |
1185 | spin_lock_irqsave(&tp->rx_lock, flags); | 1197 | spin_lock_irqsave(&tp->rx_lock, flags); |
1186 | if (ret && ret != -ENODEV) { | 1198 | if (ret && ret != -ENODEV) { |
@@ -1205,16 +1217,10 @@ static void tx_bottom(struct r8152 *tp) | |||
1205 | 1217 | ||
1206 | next_agg: | 1218 | next_agg: |
1207 | agg = NULL; | 1219 | agg = NULL; |
1208 | spin_lock_irqsave(&tp->tx_lock, flags); | 1220 | if (skb_queue_empty(&tp->tx_queue)) |
1209 | if (!skb_queue_empty(&tp->tx_queue) && !list_empty(&tp->tx_free)) { | 1221 | return; |
1210 | struct list_head *cursor; | ||
1211 | |||
1212 | cursor = tp->tx_free.next; | ||
1213 | list_del_init(cursor); | ||
1214 | agg = list_entry(cursor, struct tx_agg, list); | ||
1215 | } | ||
1216 | spin_unlock_irqrestore(&tp->tx_lock, flags); | ||
1217 | 1222 | ||
1223 | agg = r8152_get_tx_agg(tp); | ||
1218 | if (!agg) | 1224 | if (!agg) |
1219 | return; | 1225 | return; |
1220 | 1226 | ||
@@ -1382,15 +1388,10 @@ static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, | |||
1382 | 1388 | ||
1383 | skb_tx_timestamp(skb); | 1389 | skb_tx_timestamp(skb); |
1384 | 1390 | ||
1385 | spin_lock_irqsave(&tp->tx_lock, flags); | 1391 | /* If tx_queue is not empty, it means at least one previous packt */ |
1386 | if (!list_empty(&tp->tx_free) && skb_queue_empty(&tp->tx_queue)) { | 1392 | /* is waiting for sending. Don't send current one before it. */ |
1387 | struct list_head *cursor; | 1393 | if (skb_queue_empty(&tp->tx_queue)) |
1388 | 1394 | agg = r8152_get_tx_agg(tp); | |
1389 | cursor = tp->tx_free.next; | ||
1390 | list_del_init(cursor); | ||
1391 | agg = list_entry(cursor, struct tx_agg, list); | ||
1392 | } | ||
1393 | spin_unlock_irqrestore(&tp->tx_lock, flags); | ||
1394 | 1395 | ||
1395 | if (!agg) { | 1396 | if (!agg) { |
1396 | skb_queue_tail(&tp->tx_queue, skb); | 1397 | skb_queue_tail(&tp->tx_queue, skb); |