aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ixgbe/ixgbe.h7
-rw-r--r--drivers/net/ixgbe/ixgbe_main.c55
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
470struct 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
470enum ixgbe_boards { 477enum 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
1145static 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 **/
1161static inline struct sk_buff *ixgbe_transform_rsc_queue(struct sk_buff *skb, 1153static 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
1182struct ixgbe_rsc_cb { 1176static 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
1189static void ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, 1182static 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
3023static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter) 3024static void ixgbe_setup_rdrxctl(struct ixgbe_adapter *adapter)