diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ixgbe/ixgbe.h | 7 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 55 |
2 files changed, 35 insertions, 27 deletions
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 160ce9234546..6d9fcb4e0854 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
@@ -467,6 +467,13 @@ enum ixbge_state_t { | |||
467 | __IXGBE_SFP_MODULE_NOT_FOUND | 467 | __IXGBE_SFP_MODULE_NOT_FOUND |
468 | }; | 468 | }; |
469 | 469 | ||
470 | struct ixgbe_rsc_cb { | ||
471 | dma_addr_t dma; | ||
472 | u16 skb_cnt; | ||
473 | bool delay_unmap; | ||
474 | }; | ||
475 | #define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb) | ||
476 | |||
470 | enum ixgbe_boards { | 477 | enum ixgbe_boards { |
471 | board_82598, | 478 | board_82598, |
472 | board_82599, | 479 | board_82599, |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 402ab7b2706a..9f5331bc5985 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -1142,33 +1142,25 @@ static inline u16 ixgbe_get_hlen(union ixgbe_adv_rx_desc *rx_desc) | |||
1142 | return hlen; | 1142 | return hlen; |
1143 | } | 1143 | } |
1144 | 1144 | ||
1145 | static inline u32 ixgbe_get_rsc_count(union ixgbe_adv_rx_desc *rx_desc) | ||
1146 | { | ||
1147 | return (le32_to_cpu(rx_desc->wb.lower.lo_dword.data) & | ||
1148 | IXGBE_RXDADV_RSCCNT_MASK) >> | ||
1149 | IXGBE_RXDADV_RSCCNT_SHIFT; | ||
1150 | } | ||
1151 | |||
1152 | /** | 1145 | /** |
1153 | * ixgbe_transform_rsc_queue - change rsc queue into a full packet | 1146 | * ixgbe_transform_rsc_queue - change rsc queue into a full packet |
1154 | * @skb: pointer to the last skb in the rsc queue | 1147 | * @skb: pointer to the last skb in the rsc queue |
1155 | * @count: pointer to number of packets coalesced in this context | ||
1156 | * | 1148 | * |
1157 | * This function changes a queue full of hw rsc buffers into a completed | 1149 | * This function changes a queue full of hw rsc buffers into a completed |
1158 | * packet. It uses the ->prev pointers to find the first packet and then | 1150 | * packet. It uses the ->prev pointers to find the first packet and then |
1159 | * turns it into the frag list owner. | 1151 | * turns it into the frag list owner. |
1160 | **/ | 1152 | **/ |
1161 | static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb, | 1153 | static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb) |
1162 | u64 *count) | ||
1163 | { | 1154 | { |
1164 | unsigned int frag_list_size = 0; | 1155 | unsigned int frag_list_size = 0; |
1156 | unsigned int skb_cnt = 1; | ||
1165 | 1157 | ||
1166 | while (skb->prev) { | 1158 | while (skb->prev) { |
1167 | struct sk_buff *prev = skb->prev; | 1159 | struct sk_buff *prev = skb->prev; |
1168 | frag_list_size += skb->len; | 1160 | frag_list_size += skb->len; |
1169 | skb->prev = NULL; | 1161 | skb->prev = NULL; |
1170 | skb = prev; | 1162 | skb = prev; |
1171 | *count += 1; | 1163 | skb_cnt++; |
1172 | } | 1164 | } |
1173 | 1165 | ||
1174 | skb_shinfo(skb)->frag_list = skb->next; | 1166 | skb_shinfo(skb)->frag_list = skb->next; |
@@ -1176,15 +1168,16 @@ static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb, | |||
1176 | skb->len += frag_list_size; | 1168 | skb->len += frag_list_size; |
1177 | skb->data_len += frag_list_size; | 1169 | skb->data_len += frag_list_size; |
1178 | skb->truesize += frag_list_size; | 1170 | skb->truesize += frag_list_size; |
1171 | IXGBE_RSC_CB(skb)->skb_cnt = skb_cnt; | ||
1172 | |||
1179 | return skb; | 1173 | return skb; |
1180 | } | 1174 | } |
1181 | 1175 | ||
1182 | struct ixgbe_rsc_cb { | 1176 | static inline bool ixgbe_get_rsc_state(union ixgbe_adv_rx_desc *rx_desc) |
1183 | dma_addr_t dma; | 1177 | { |
1184 | bool delay_unmap; | 1178 | return !!(le32_to_cpu(rx_desc->wb.lower.lo_dword.data) & |
1185 | }; | 1179 | IXGBE_RXDADV_RSCCNT_MASK); |
1186 | 1180 | } | |
1187 | #define IXGBE_RSC_CB(skb) ((struct ixgbe_rsc_cb *)(skb)->cb) | ||
1188 | 1181 | ||
1189 | static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | 1182 | static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, |
1190 | struct ixgbe_ring *rx_ring, | 1183 | struct ixgbe_ring *rx_ring, |
@@ -1196,13 +1189,13 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1196 | struct sk_buff *skb; | 1189 | struct sk_buff *skb; |
1197 | unsigned int total_rx_bytes = 0, total_rx_packets = 0; | 1190 | unsigned int total_rx_bytes = 0, total_rx_packets = 0; |
1198 | const int current_node = numa_node_id(); | 1191 | const int current_node = numa_node_id(); |
1199 | unsigned int rsc_count = 0; | ||
1200 | #ifdef IXGBE_FCOE | 1192 | #ifdef IXGBE_FCOE |
1201 | int ddp_bytes = 0; | 1193 | int ddp_bytes = 0; |
1202 | #endif /* IXGBE_FCOE */ | 1194 | #endif /* IXGBE_FCOE */ |
1203 | u32 staterr; | 1195 | u32 staterr; |
1204 | u16 i; | 1196 | u16 i; |
1205 | u16 cleaned_count = 0; | 1197 | u16 cleaned_count = 0; |
1198 | bool pkt_is_rsc = false; | ||
1206 | 1199 | ||
1207 | i = rx_ring->next_to_clean; | 1200 | i = rx_ring->next_to_clean; |
1208 | rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i); | 1201 | rx_desc = IXGBE_RX_DESC_ADV(rx_ring, i); |
@@ -1220,12 +1213,12 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1220 | prefetch(skb->data); | 1213 | prefetch(skb->data); |
1221 | 1214 | ||
1222 | if (ring_is_rsc_enabled(rx_ring)) | 1215 | if (ring_is_rsc_enabled(rx_ring)) |
1223 | rsc_count = ixgbe_get_rsc_count(rx_desc); | 1216 | pkt_is_rsc = ixgbe_get_rsc_state(rx_desc); |
1224 | 1217 | ||
1225 | /* if this is a skb from previous receive DMA will be 0 */ | 1218 | /* if this is a skb from previous receive DMA will be 0 */ |
1226 | if (rx_buffer_info->dma) { | 1219 | if (rx_buffer_info->dma) { |
1227 | u16 hlen; | 1220 | u16 hlen; |
1228 | if (rsc_count && | 1221 | if (pkt_is_rsc && |
1229 | !(staterr & IXGBE_RXD_STAT_EOP) && | 1222 | !(staterr & IXGBE_RXD_STAT_EOP) && |
1230 | !skb->prev) { | 1223 | !skb->prev) { |
1231 | /* | 1224 | /* |
@@ -1288,7 +1281,7 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1288 | prefetch(next_rxd); | 1281 | prefetch(next_rxd); |
1289 | cleaned_count++; | 1282 | cleaned_count++; |
1290 | 1283 | ||
1291 | if (rsc_count) { | 1284 | if (pkt_is_rsc) { |
1292 | u32 nextp = (staterr & IXGBE_RXDADV_NEXTP_MASK) >> | 1285 | u32 nextp = (staterr & IXGBE_RXDADV_NEXTP_MASK) >> |
1293 | IXGBE_RXDADV_NEXTP_SHIFT; | 1286 | IXGBE_RXDADV_NEXTP_SHIFT; |
1294 | next_buffer = &rx_ring->rx_buffer_info[nextp]; | 1287 | next_buffer = &rx_ring->rx_buffer_info[nextp]; |
@@ -1310,9 +1303,15 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1310 | goto next_desc; | 1303 | goto next_desc; |
1311 | } | 1304 | } |
1312 | 1305 | ||
1313 | if (skb->prev) | 1306 | if (skb->prev) { |
1314 | skb = ixgbe_transform_rsc_queue(skb, | 1307 | skb = ixgbe_transform_rsc_queue(skb); |
1315 | &(rx_ring->rx_stats.rsc_count)); | 1308 | /* if we got here without RSC the packet is invalid */ |
1309 | if (!pkt_is_rsc) { | ||
1310 | __pskb_trim(skb, 0); | ||
1311 | rx_buffer_info->skb = skb; | ||
1312 | goto next_desc; | ||
1313 | } | ||
1314 | } | ||
1316 | 1315 | ||
1317 | if (ring_is_rsc_enabled(rx_ring)) { | 1316 | if (ring_is_rsc_enabled(rx_ring)) { |
1318 | if (IXGBE_RSC_CB(skb)->delay_unmap) { | 1317 | if (IXGBE_RSC_CB(skb)->delay_unmap) { |
@@ -1323,11 +1322,14 @@ static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, | |||
1323 | IXGBE_RSC_CB(skb)->dma = 0; | 1322 | IXGBE_RSC_CB(skb)->dma = 0; |
1324 | IXGBE_RSC_CB(skb)->delay_unmap = false; | 1323 | IXGBE_RSC_CB(skb)->delay_unmap = false; |
1325 | } | 1324 | } |
1325 | } | ||
1326 | if (pkt_is_rsc) { | ||
1326 | if (ring_is_ps_enabled(rx_ring)) | 1327 | if (ring_is_ps_enabled(rx_ring)) |
1327 | rx_ring->rx_stats.rsc_count += | 1328 | rx_ring->rx_stats.rsc_count += |
1328 | skb_shinfo(skb)->nr_frags; | 1329 | skb_shinfo(skb)->nr_frags; |
1329 | else | 1330 | else |
1330 | rx_ring->rx_stats.rsc_count++; | 1331 | rx_ring->rx_stats.rsc_count += |
1332 | IXGBE_RSC_CB(skb)->skb_cnt; | ||
1331 | rx_ring->rx_stats.rsc_flush++; | 1333 | rx_ring->rx_stats.rsc_flush++; |
1332 | } | 1334 | } |
1333 | 1335 | ||
@@ -3017,7 +3019,6 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter) | |||
3017 | } | 3019 | } |
3018 | #endif /* IXGBE_FCOE */ | 3020 | #endif /* IXGBE_FCOE */ |
3019 | } | 3021 | } |
3020 | |||
3021 | } | 3022 | } |
3022 | 3023 | ||
3023 | static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter) | 3024 | static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter) |