diff options
-rw-r--r-- | arch/arm64/net/bpf_jit_comp.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_cle.c | 11 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_cle.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_hw.c | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_hw.h | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 75 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_main.h | 18 | ||||
-rw-r--r-- | drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.c | 63 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/marvell/Kconfig | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | 8 | ||||
-rw-r--r-- | drivers/net/xen-netback/netback.c | 1 | ||||
-rw-r--r-- | net/ipv4/fib_semantics.c | 2 | ||||
-rw-r--r-- | net/ipv6/route.c | 2 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_core.c | 4 |
16 files changed, 175 insertions, 45 deletions
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index a34420a5df9a..b405bbb54431 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c | |||
@@ -476,6 +476,7 @@ emit_cond_jmp: | |||
476 | case BPF_JGE: | 476 | case BPF_JGE: |
477 | jmp_cond = A64_COND_CS; | 477 | jmp_cond = A64_COND_CS; |
478 | break; | 478 | break; |
479 | case BPF_JSET: | ||
479 | case BPF_JNE: | 480 | case BPF_JNE: |
480 | jmp_cond = A64_COND_NE; | 481 | jmp_cond = A64_COND_NE; |
481 | break; | 482 | break; |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_cle.c b/drivers/net/ethernet/apm/xgene/xgene_enet_cle.c index b212488606da..11be8044e0d7 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_cle.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_cle.c | |||
@@ -43,6 +43,7 @@ static void xgene_cle_idt_to_hw(u32 dstqid, u32 fpsel, | |||
43 | static void xgene_cle_dbptr_to_hw(struct xgene_enet_pdata *pdata, | 43 | static void xgene_cle_dbptr_to_hw(struct xgene_enet_pdata *pdata, |
44 | struct xgene_cle_dbptr *dbptr, u32 *buf) | 44 | struct xgene_cle_dbptr *dbptr, u32 *buf) |
45 | { | 45 | { |
46 | buf[0] = SET_VAL(CLE_DROP, dbptr->drop); | ||
46 | buf[4] = SET_VAL(CLE_FPSEL, dbptr->fpsel) | | 47 | buf[4] = SET_VAL(CLE_FPSEL, dbptr->fpsel) | |
47 | SET_VAL(CLE_DSTQIDL, dbptr->dstqid); | 48 | SET_VAL(CLE_DSTQIDL, dbptr->dstqid); |
48 | 49 | ||
@@ -412,7 +413,7 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata) | |||
412 | .branch = { | 413 | .branch = { |
413 | { | 414 | { |
414 | /* IPV4 */ | 415 | /* IPV4 */ |
415 | .valid = 0, | 416 | .valid = 1, |
416 | .next_packet_pointer = 22, | 417 | .next_packet_pointer = 22, |
417 | .jump_bw = JMP_FW, | 418 | .jump_bw = JMP_FW, |
418 | .jump_rel = JMP_ABS, | 419 | .jump_rel = JMP_ABS, |
@@ -420,7 +421,7 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata) | |||
420 | .next_node = PKT_PROT_NODE, | 421 | .next_node = PKT_PROT_NODE, |
421 | .next_branch = 0, | 422 | .next_branch = 0, |
422 | .data = 0x8, | 423 | .data = 0x8, |
423 | .mask = 0xffff | 424 | .mask = 0x0 |
424 | }, | 425 | }, |
425 | { | 426 | { |
426 | .valid = 0, | 427 | .valid = 0, |
@@ -456,7 +457,7 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata) | |||
456 | .next_node = RSS_IPV4_TCP_NODE, | 457 | .next_node = RSS_IPV4_TCP_NODE, |
457 | .next_branch = 0, | 458 | .next_branch = 0, |
458 | .data = 0x0600, | 459 | .data = 0x0600, |
459 | .mask = 0xffff | 460 | .mask = 0x00ff |
460 | }, | 461 | }, |
461 | { | 462 | { |
462 | /* UDP */ | 463 | /* UDP */ |
@@ -468,7 +469,7 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata) | |||
468 | .next_node = RSS_IPV4_UDP_NODE, | 469 | .next_node = RSS_IPV4_UDP_NODE, |
469 | .next_branch = 0, | 470 | .next_branch = 0, |
470 | .data = 0x1100, | 471 | .data = 0x1100, |
471 | .mask = 0xffff | 472 | .mask = 0x00ff |
472 | }, | 473 | }, |
473 | { | 474 | { |
474 | .valid = 0, | 475 | .valid = 0, |
@@ -642,7 +643,7 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata) | |||
642 | { | 643 | { |
643 | /* TCP DST Port */ | 644 | /* TCP DST Port */ |
644 | .valid = 0, | 645 | .valid = 0, |
645 | .next_packet_pointer = 256, | 646 | .next_packet_pointer = 258, |
646 | .jump_bw = JMP_FW, | 647 | .jump_bw = JMP_FW, |
647 | .jump_rel = JMP_ABS, | 648 | .jump_rel = JMP_ABS, |
648 | .operation = EQT, | 649 | .operation = EQT, |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_cle.h b/drivers/net/ethernet/apm/xgene/xgene_enet_cle.h index 29a17abdd828..3bf90683240e 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_cle.h +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_cle.h | |||
@@ -83,6 +83,8 @@ | |||
83 | #define CLE_TYPE_POS 0 | 83 | #define CLE_TYPE_POS 0 |
84 | #define CLE_TYPE_LEN 2 | 84 | #define CLE_TYPE_LEN 2 |
85 | 85 | ||
86 | #define CLE_DROP_POS 28 | ||
87 | #define CLE_DROP_LEN 1 | ||
86 | #define CLE_DSTQIDL_POS 25 | 88 | #define CLE_DSTQIDL_POS 25 |
87 | #define CLE_DSTQIDL_LEN 7 | 89 | #define CLE_DSTQIDL_LEN 7 |
88 | #define CLE_DSTQIDH_POS 0 | 90 | #define CLE_DSTQIDH_POS 0 |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c index 39e081a70f5b..513d2a62ee6d 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c | |||
@@ -219,27 +219,30 @@ void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring, | |||
219 | struct xgene_enet_pdata *pdata, | 219 | struct xgene_enet_pdata *pdata, |
220 | enum xgene_enet_err_code status) | 220 | enum xgene_enet_err_code status) |
221 | { | 221 | { |
222 | struct rtnl_link_stats64 *stats = &pdata->stats; | ||
223 | |||
224 | switch (status) { | 222 | switch (status) { |
225 | case INGRESS_CRC: | 223 | case INGRESS_CRC: |
226 | stats->rx_crc_errors++; | 224 | ring->rx_crc_errors++; |
225 | ring->rx_dropped++; | ||
227 | break; | 226 | break; |
228 | case INGRESS_CHECKSUM: | 227 | case INGRESS_CHECKSUM: |
229 | case INGRESS_CHECKSUM_COMPUTE: | 228 | case INGRESS_CHECKSUM_COMPUTE: |
230 | stats->rx_errors++; | 229 | ring->rx_errors++; |
230 | ring->rx_dropped++; | ||
231 | break; | 231 | break; |
232 | case INGRESS_TRUNC_FRAME: | 232 | case INGRESS_TRUNC_FRAME: |
233 | stats->rx_frame_errors++; | 233 | ring->rx_frame_errors++; |
234 | ring->rx_dropped++; | ||
234 | break; | 235 | break; |
235 | case INGRESS_PKT_LEN: | 236 | case INGRESS_PKT_LEN: |
236 | stats->rx_length_errors++; | 237 | ring->rx_length_errors++; |
238 | ring->rx_dropped++; | ||
237 | break; | 239 | break; |
238 | case INGRESS_PKT_UNDER: | 240 | case INGRESS_PKT_UNDER: |
239 | stats->rx_frame_errors++; | 241 | ring->rx_frame_errors++; |
242 | ring->rx_dropped++; | ||
240 | break; | 243 | break; |
241 | case INGRESS_FIFO_OVERRUN: | 244 | case INGRESS_FIFO_OVERRUN: |
242 | stats->rx_fifo_errors++; | 245 | ring->rx_fifo_errors++; |
243 | break; | 246 | break; |
244 | default: | 247 | default: |
245 | break; | 248 | break; |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h index ba7da98af2ef..45220be3122f 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h | |||
@@ -86,7 +86,7 @@ enum xgene_enet_rm { | |||
86 | #define RINGADDRL_POS 5 | 86 | #define RINGADDRL_POS 5 |
87 | #define RINGADDRL_LEN 27 | 87 | #define RINGADDRL_LEN 27 |
88 | #define RINGADDRH_POS 0 | 88 | #define RINGADDRH_POS 0 |
89 | #define RINGADDRH_LEN 6 | 89 | #define RINGADDRH_LEN 7 |
90 | #define RINGSIZE_POS 23 | 90 | #define RINGSIZE_POS 23 |
91 | #define RINGSIZE_LEN 3 | 91 | #define RINGSIZE_LEN 3 |
92 | #define RINGTYPE_POS 19 | 92 | #define RINGTYPE_POS 19 |
@@ -94,9 +94,9 @@ enum xgene_enet_rm { | |||
94 | #define RINGMODE_POS 20 | 94 | #define RINGMODE_POS 20 |
95 | #define RINGMODE_LEN 3 | 95 | #define RINGMODE_LEN 3 |
96 | #define RECOMTIMEOUTL_POS 28 | 96 | #define RECOMTIMEOUTL_POS 28 |
97 | #define RECOMTIMEOUTL_LEN 3 | 97 | #define RECOMTIMEOUTL_LEN 4 |
98 | #define RECOMTIMEOUTH_POS 0 | 98 | #define RECOMTIMEOUTH_POS 0 |
99 | #define RECOMTIMEOUTH_LEN 2 | 99 | #define RECOMTIMEOUTH_LEN 3 |
100 | #define NUMMSGSINQ_POS 1 | 100 | #define NUMMSGSINQ_POS 1 |
101 | #define NUMMSGSINQ_LEN 16 | 101 | #define NUMMSGSINQ_LEN 16 |
102 | #define ACCEPTLERR BIT(19) | 102 | #define ACCEPTLERR BIT(19) |
@@ -201,6 +201,8 @@ enum xgene_enet_rm { | |||
201 | #define USERINFO_LEN 32 | 201 | #define USERINFO_LEN 32 |
202 | #define FPQNUM_POS 32 | 202 | #define FPQNUM_POS 32 |
203 | #define FPQNUM_LEN 12 | 203 | #define FPQNUM_LEN 12 |
204 | #define ELERR_POS 46 | ||
205 | #define ELERR_LEN 2 | ||
204 | #define NV_POS 50 | 206 | #define NV_POS 50 |
205 | #define NV_LEN 1 | 207 | #define NV_LEN 1 |
206 | #define LL_POS 51 | 208 | #define LL_POS 51 |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 99d7e580e166..fd200883d228 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c | |||
@@ -443,8 +443,8 @@ static netdev_tx_t xgene_enet_start_xmit(struct sk_buff *skb, | |||
443 | 443 | ||
444 | skb_tx_timestamp(skb); | 444 | skb_tx_timestamp(skb); |
445 | 445 | ||
446 | pdata->stats.tx_packets++; | 446 | tx_ring->tx_packets++; |
447 | pdata->stats.tx_bytes += skb->len; | 447 | tx_ring->tx_bytes += skb->len; |
448 | 448 | ||
449 | pdata->ring_ops->wr_cmd(tx_ring, count); | 449 | pdata->ring_ops->wr_cmd(tx_ring, count); |
450 | return NETDEV_TX_OK; | 450 | return NETDEV_TX_OK; |
@@ -483,12 +483,12 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring, | |||
483 | skb = buf_pool->rx_skb[skb_index]; | 483 | skb = buf_pool->rx_skb[skb_index]; |
484 | 484 | ||
485 | /* checking for error */ | 485 | /* checking for error */ |
486 | status = GET_VAL(LERR, le64_to_cpu(raw_desc->m0)); | 486 | status = (GET_VAL(ELERR, le64_to_cpu(raw_desc->m0)) << LERR_LEN) || |
487 | GET_VAL(LERR, le64_to_cpu(raw_desc->m0)); | ||
487 | if (unlikely(status > 2)) { | 488 | if (unlikely(status > 2)) { |
488 | dev_kfree_skb_any(skb); | 489 | dev_kfree_skb_any(skb); |
489 | xgene_enet_parse_error(rx_ring, netdev_priv(rx_ring->ndev), | 490 | xgene_enet_parse_error(rx_ring, netdev_priv(rx_ring->ndev), |
490 | status); | 491 | status); |
491 | pdata->stats.rx_dropped++; | ||
492 | ret = -EIO; | 492 | ret = -EIO; |
493 | goto out; | 493 | goto out; |
494 | } | 494 | } |
@@ -506,8 +506,8 @@ static int xgene_enet_rx_frame(struct xgene_enet_desc_ring *rx_ring, | |||
506 | xgene_enet_skip_csum(skb); | 506 | xgene_enet_skip_csum(skb); |
507 | } | 507 | } |
508 | 508 | ||
509 | pdata->stats.rx_packets++; | 509 | rx_ring->rx_packets++; |
510 | pdata->stats.rx_bytes += datalen; | 510 | rx_ring->rx_bytes += datalen; |
511 | napi_gro_receive(&rx_ring->napi, skb); | 511 | napi_gro_receive(&rx_ring->napi, skb); |
512 | out: | 512 | out: |
513 | if (--rx_ring->nbufpool == 0) { | 513 | if (--rx_ring->nbufpool == 0) { |
@@ -630,7 +630,7 @@ static int xgene_enet_register_irq(struct net_device *ndev) | |||
630 | ring = pdata->rx_ring[i]; | 630 | ring = pdata->rx_ring[i]; |
631 | irq_set_status_flags(ring->irq, IRQ_DISABLE_UNLAZY); | 631 | irq_set_status_flags(ring->irq, IRQ_DISABLE_UNLAZY); |
632 | ret = devm_request_irq(dev, ring->irq, xgene_enet_rx_irq, | 632 | ret = devm_request_irq(dev, ring->irq, xgene_enet_rx_irq, |
633 | IRQF_SHARED, ring->irq_name, ring); | 633 | 0, ring->irq_name, ring); |
634 | if (ret) { | 634 | if (ret) { |
635 | netdev_err(ndev, "Failed to request irq %s\n", | 635 | netdev_err(ndev, "Failed to request irq %s\n", |
636 | ring->irq_name); | 636 | ring->irq_name); |
@@ -641,7 +641,7 @@ static int xgene_enet_register_irq(struct net_device *ndev) | |||
641 | ring = pdata->tx_ring[i]->cp_ring; | 641 | ring = pdata->tx_ring[i]->cp_ring; |
642 | irq_set_status_flags(ring->irq, IRQ_DISABLE_UNLAZY); | 642 | irq_set_status_flags(ring->irq, IRQ_DISABLE_UNLAZY); |
643 | ret = devm_request_irq(dev, ring->irq, xgene_enet_rx_irq, | 643 | ret = devm_request_irq(dev, ring->irq, xgene_enet_rx_irq, |
644 | IRQF_SHARED, ring->irq_name, ring); | 644 | 0, ring->irq_name, ring); |
645 | if (ret) { | 645 | if (ret) { |
646 | netdev_err(ndev, "Failed to request irq %s\n", | 646 | netdev_err(ndev, "Failed to request irq %s\n", |
647 | ring->irq_name); | 647 | ring->irq_name); |
@@ -1114,12 +1114,31 @@ static struct rtnl_link_stats64 *xgene_enet_get_stats64( | |||
1114 | { | 1114 | { |
1115 | struct xgene_enet_pdata *pdata = netdev_priv(ndev); | 1115 | struct xgene_enet_pdata *pdata = netdev_priv(ndev); |
1116 | struct rtnl_link_stats64 *stats = &pdata->stats; | 1116 | struct rtnl_link_stats64 *stats = &pdata->stats; |
1117 | struct xgene_enet_desc_ring *ring; | ||
1118 | int i; | ||
1117 | 1119 | ||
1118 | stats->rx_errors += stats->rx_length_errors + | 1120 | memset(stats, 0, sizeof(struct rtnl_link_stats64)); |
1119 | stats->rx_crc_errors + | 1121 | for (i = 0; i < pdata->txq_cnt; i++) { |
1120 | stats->rx_frame_errors + | 1122 | ring = pdata->tx_ring[i]; |
1121 | stats->rx_fifo_errors; | 1123 | if (ring) { |
1122 | memcpy(storage, &pdata->stats, sizeof(struct rtnl_link_stats64)); | 1124 | stats->tx_packets += ring->tx_packets; |
1125 | stats->tx_bytes += ring->tx_bytes; | ||
1126 | } | ||
1127 | } | ||
1128 | |||
1129 | for (i = 0; i < pdata->rxq_cnt; i++) { | ||
1130 | ring = pdata->rx_ring[i]; | ||
1131 | if (ring) { | ||
1132 | stats->rx_packets += ring->rx_packets; | ||
1133 | stats->rx_bytes += ring->rx_bytes; | ||
1134 | stats->rx_errors += ring->rx_length_errors + | ||
1135 | ring->rx_crc_errors + | ||
1136 | ring->rx_frame_errors + | ||
1137 | ring->rx_fifo_errors; | ||
1138 | stats->rx_dropped += ring->rx_dropped; | ||
1139 | } | ||
1140 | } | ||
1141 | memcpy(storage, stats, sizeof(struct rtnl_link_stats64)); | ||
1123 | 1142 | ||
1124 | return storage; | 1143 | return storage; |
1125 | } | 1144 | } |
@@ -1234,6 +1253,13 @@ static int xgene_enet_get_irqs(struct xgene_enet_pdata *pdata) | |||
1234 | for (i = 0; i < max_irqs; i++) { | 1253 | for (i = 0; i < max_irqs; i++) { |
1235 | ret = platform_get_irq(pdev, i); | 1254 | ret = platform_get_irq(pdev, i); |
1236 | if (ret <= 0) { | 1255 | if (ret <= 0) { |
1256 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { | ||
1257 | max_irqs = i; | ||
1258 | pdata->rxq_cnt = max_irqs / 2; | ||
1259 | pdata->txq_cnt = max_irqs / 2; | ||
1260 | pdata->cq_cnt = max_irqs / 2; | ||
1261 | break; | ||
1262 | } | ||
1237 | dev_err(dev, "Unable to get ENET IRQ\n"); | 1263 | dev_err(dev, "Unable to get ENET IRQ\n"); |
1238 | ret = ret ? : -ENXIO; | 1264 | ret = ret ? : -ENXIO; |
1239 | return ret; | 1265 | return ret; |
@@ -1437,19 +1463,28 @@ static void xgene_enet_setup_ops(struct xgene_enet_pdata *pdata) | |||
1437 | pdata->port_ops = &xgene_xgport_ops; | 1463 | pdata->port_ops = &xgene_xgport_ops; |
1438 | pdata->cle_ops = &xgene_cle3in_ops; | 1464 | pdata->cle_ops = &xgene_cle3in_ops; |
1439 | pdata->rm = RM0; | 1465 | pdata->rm = RM0; |
1440 | pdata->rxq_cnt = XGENE_NUM_RX_RING; | 1466 | if (!pdata->rxq_cnt) { |
1441 | pdata->txq_cnt = XGENE_NUM_TX_RING; | 1467 | pdata->rxq_cnt = XGENE_NUM_RX_RING; |
1442 | pdata->cq_cnt = XGENE_NUM_TXC_RING; | 1468 | pdata->txq_cnt = XGENE_NUM_TX_RING; |
1469 | pdata->cq_cnt = XGENE_NUM_TXC_RING; | ||
1470 | } | ||
1443 | break; | 1471 | break; |
1444 | } | 1472 | } |
1445 | 1473 | ||
1446 | if (pdata->enet_id == XGENE_ENET1) { | 1474 | if (pdata->enet_id == XGENE_ENET1) { |
1447 | switch (pdata->port_id) { | 1475 | switch (pdata->port_id) { |
1448 | case 0: | 1476 | case 0: |
1449 | pdata->cpu_bufnum = START_CPU_BUFNUM_0; | 1477 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { |
1450 | pdata->eth_bufnum = START_ETH_BUFNUM_0; | 1478 | pdata->cpu_bufnum = X2_START_CPU_BUFNUM_0; |
1451 | pdata->bp_bufnum = START_BP_BUFNUM_0; | 1479 | pdata->eth_bufnum = X2_START_ETH_BUFNUM_0; |
1452 | pdata->ring_num = START_RING_NUM_0; | 1480 | pdata->bp_bufnum = X2_START_BP_BUFNUM_0; |
1481 | pdata->ring_num = START_RING_NUM_0; | ||
1482 | } else { | ||
1483 | pdata->cpu_bufnum = START_CPU_BUFNUM_0; | ||
1484 | pdata->eth_bufnum = START_ETH_BUFNUM_0; | ||
1485 | pdata->bp_bufnum = START_BP_BUFNUM_0; | ||
1486 | pdata->ring_num = START_RING_NUM_0; | ||
1487 | } | ||
1453 | break; | 1488 | break; |
1454 | case 1: | 1489 | case 1: |
1455 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { | 1490 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h index 175d18890c7a..9d9cf445148c 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h | |||
@@ -49,10 +49,10 @@ | |||
49 | #define XGENE_ENET_MSS 1448 | 49 | #define XGENE_ENET_MSS 1448 |
50 | #define XGENE_MIN_ENET_FRAME_SIZE 60 | 50 | #define XGENE_MIN_ENET_FRAME_SIZE 60 |
51 | 51 | ||
52 | #define XGENE_MAX_ENET_IRQ 8 | 52 | #define XGENE_MAX_ENET_IRQ 16 |
53 | #define XGENE_NUM_RX_RING 4 | 53 | #define XGENE_NUM_RX_RING 8 |
54 | #define XGENE_NUM_TX_RING 4 | 54 | #define XGENE_NUM_TX_RING 8 |
55 | #define XGENE_NUM_TXC_RING 4 | 55 | #define XGENE_NUM_TXC_RING 8 |
56 | 56 | ||
57 | #define START_CPU_BUFNUM_0 0 | 57 | #define START_CPU_BUFNUM_0 0 |
58 | #define START_ETH_BUFNUM_0 2 | 58 | #define START_ETH_BUFNUM_0 2 |
@@ -121,6 +121,16 @@ struct xgene_enet_desc_ring { | |||
121 | struct xgene_enet_raw_desc16 *raw_desc16; | 121 | struct xgene_enet_raw_desc16 *raw_desc16; |
122 | }; | 122 | }; |
123 | __le64 *exp_bufs; | 123 | __le64 *exp_bufs; |
124 | u64 tx_packets; | ||
125 | u64 tx_bytes; | ||
126 | u64 rx_packets; | ||
127 | u64 rx_bytes; | ||
128 | u64 rx_dropped; | ||
129 | u64 rx_errors; | ||
130 | u64 rx_length_errors; | ||
131 | u64 rx_crc_errors; | ||
132 | u64 rx_frame_errors; | ||
133 | u64 rx_fifo_errors; | ||
124 | }; | 134 | }; |
125 | 135 | ||
126 | struct xgene_mac_ops { | 136 | struct xgene_mac_ops { |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h index 29a71b4dcc44..002df5a6756e 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h | |||
@@ -33,7 +33,7 @@ | |||
33 | #define LINK_STATUS BIT(2) | 33 | #define LINK_STATUS BIT(2) |
34 | #define LINK_UP BIT(15) | 34 | #define LINK_UP BIT(15) |
35 | #define MPA_IDLE_WITH_QMI_EMPTY BIT(12) | 35 | #define MPA_IDLE_WITH_QMI_EMPTY BIT(12) |
36 | #define SG_RX_DV_GATE_REG_0_ADDR 0x0dfc | 36 | #define SG_RX_DV_GATE_REG_0_ADDR 0x05fc |
37 | 37 | ||
38 | extern const struct xgene_mac_ops xgene_sgmac_ops; | 38 | extern const struct xgene_mac_ops xgene_sgmac_ops; |
39 | extern const struct xgene_port_ops xgene_sgport_ops; | 39 | extern const struct xgene_port_ops xgene_sgport_ops; |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 9d4e8e113fe1..c39a7f5c6a01 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
@@ -813,6 +813,46 @@ static inline struct sk_buff *bnxt_copy_skb(struct bnxt_napi *bnapi, u8 *data, | |||
813 | return skb; | 813 | return skb; |
814 | } | 814 | } |
815 | 815 | ||
816 | static int bnxt_discard_rx(struct bnxt *bp, struct bnxt_napi *bnapi, | ||
817 | u32 *raw_cons, void *cmp) | ||
818 | { | ||
819 | struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring; | ||
820 | struct rx_cmp *rxcmp = cmp; | ||
821 | u32 tmp_raw_cons = *raw_cons; | ||
822 | u8 cmp_type, agg_bufs = 0; | ||
823 | |||
824 | cmp_type = RX_CMP_TYPE(rxcmp); | ||
825 | |||
826 | if (cmp_type == CMP_TYPE_RX_L2_CMP) { | ||
827 | agg_bufs = (le32_to_cpu(rxcmp->rx_cmp_misc_v1) & | ||
828 | RX_CMP_AGG_BUFS) >> | ||
829 | RX_CMP_AGG_BUFS_SHIFT; | ||
830 | } else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) { | ||
831 | struct rx_tpa_end_cmp *tpa_end = cmp; | ||
832 | |||
833 | agg_bufs = (le32_to_cpu(tpa_end->rx_tpa_end_cmp_misc_v1) & | ||
834 | RX_TPA_END_CMP_AGG_BUFS) >> | ||
835 | RX_TPA_END_CMP_AGG_BUFS_SHIFT; | ||
836 | } | ||
837 | |||
838 | if (agg_bufs) { | ||
839 | if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, &tmp_raw_cons)) | ||
840 | return -EBUSY; | ||
841 | } | ||
842 | *raw_cons = tmp_raw_cons; | ||
843 | return 0; | ||
844 | } | ||
845 | |||
846 | static void bnxt_sched_reset(struct bnxt *bp, struct bnxt_rx_ring_info *rxr) | ||
847 | { | ||
848 | if (!rxr->bnapi->in_reset) { | ||
849 | rxr->bnapi->in_reset = true; | ||
850 | set_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event); | ||
851 | schedule_work(&bp->sp_task); | ||
852 | } | ||
853 | rxr->rx_next_cons = 0xffff; | ||
854 | } | ||
855 | |||
816 | static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, | 856 | static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, |
817 | struct rx_tpa_start_cmp *tpa_start, | 857 | struct rx_tpa_start_cmp *tpa_start, |
818 | struct rx_tpa_start_cmp_ext *tpa_start1) | 858 | struct rx_tpa_start_cmp_ext *tpa_start1) |
@@ -830,6 +870,11 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, | |||
830 | prod_rx_buf = &rxr->rx_buf_ring[prod]; | 870 | prod_rx_buf = &rxr->rx_buf_ring[prod]; |
831 | tpa_info = &rxr->rx_tpa[agg_id]; | 871 | tpa_info = &rxr->rx_tpa[agg_id]; |
832 | 872 | ||
873 | if (unlikely(cons != rxr->rx_next_cons)) { | ||
874 | bnxt_sched_reset(bp, rxr); | ||
875 | return; | ||
876 | } | ||
877 | |||
833 | prod_rx_buf->data = tpa_info->data; | 878 | prod_rx_buf->data = tpa_info->data; |
834 | 879 | ||
835 | mapping = tpa_info->mapping; | 880 | mapping = tpa_info->mapping; |
@@ -867,6 +912,7 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, | |||
867 | 912 | ||
868 | rxr->rx_prod = NEXT_RX(prod); | 913 | rxr->rx_prod = NEXT_RX(prod); |
869 | cons = NEXT_RX(cons); | 914 | cons = NEXT_RX(cons); |
915 | rxr->rx_next_cons = NEXT_RX(cons); | ||
870 | cons_rx_buf = &rxr->rx_buf_ring[cons]; | 916 | cons_rx_buf = &rxr->rx_buf_ring[cons]; |
871 | 917 | ||
872 | bnxt_reuse_rx_data(rxr, cons, cons_rx_buf->data); | 918 | bnxt_reuse_rx_data(rxr, cons, cons_rx_buf->data); |
@@ -980,6 +1026,14 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp, | |||
980 | dma_addr_t mapping; | 1026 | dma_addr_t mapping; |
981 | struct sk_buff *skb; | 1027 | struct sk_buff *skb; |
982 | 1028 | ||
1029 | if (unlikely(bnapi->in_reset)) { | ||
1030 | int rc = bnxt_discard_rx(bp, bnapi, raw_cons, tpa_end); | ||
1031 | |||
1032 | if (rc < 0) | ||
1033 | return ERR_PTR(-EBUSY); | ||
1034 | return NULL; | ||
1035 | } | ||
1036 | |||
983 | tpa_info = &rxr->rx_tpa[agg_id]; | 1037 | tpa_info = &rxr->rx_tpa[agg_id]; |
984 | data = tpa_info->data; | 1038 | data = tpa_info->data; |
985 | prefetch(data); | 1039 | prefetch(data); |
@@ -1146,6 +1200,12 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons, | |||
1146 | cons = rxcmp->rx_cmp_opaque; | 1200 | cons = rxcmp->rx_cmp_opaque; |
1147 | rx_buf = &rxr->rx_buf_ring[cons]; | 1201 | rx_buf = &rxr->rx_buf_ring[cons]; |
1148 | data = rx_buf->data; | 1202 | data = rx_buf->data; |
1203 | if (unlikely(cons != rxr->rx_next_cons)) { | ||
1204 | int rc1 = bnxt_discard_rx(bp, bnapi, raw_cons, rxcmp); | ||
1205 | |||
1206 | bnxt_sched_reset(bp, rxr); | ||
1207 | return rc1; | ||
1208 | } | ||
1149 | prefetch(data); | 1209 | prefetch(data); |
1150 | 1210 | ||
1151 | agg_bufs = (le32_to_cpu(rxcmp->rx_cmp_misc_v1) & RX_CMP_AGG_BUFS) >> | 1211 | agg_bufs = (le32_to_cpu(rxcmp->rx_cmp_misc_v1) & RX_CMP_AGG_BUFS) >> |
@@ -1245,6 +1305,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_napi *bnapi, u32 *raw_cons, | |||
1245 | 1305 | ||
1246 | next_rx: | 1306 | next_rx: |
1247 | rxr->rx_prod = NEXT_RX(prod); | 1307 | rxr->rx_prod = NEXT_RX(prod); |
1308 | rxr->rx_next_cons = NEXT_RX(cons); | ||
1248 | 1309 | ||
1249 | next_rx_no_prod: | 1310 | next_rx_no_prod: |
1250 | *raw_cons = tmp_raw_cons; | 1311 | *raw_cons = tmp_raw_cons; |
@@ -2486,6 +2547,7 @@ static void bnxt_clear_ring_indices(struct bnxt *bp) | |||
2486 | rxr->rx_prod = 0; | 2547 | rxr->rx_prod = 0; |
2487 | rxr->rx_agg_prod = 0; | 2548 | rxr->rx_agg_prod = 0; |
2488 | rxr->rx_sw_agg_prod = 0; | 2549 | rxr->rx_sw_agg_prod = 0; |
2550 | rxr->rx_next_cons = 0; | ||
2489 | } | 2551 | } |
2490 | } | 2552 | } |
2491 | } | 2553 | } |
@@ -4462,6 +4524,7 @@ static void bnxt_enable_napi(struct bnxt *bp) | |||
4462 | int i; | 4524 | int i; |
4463 | 4525 | ||
4464 | for (i = 0; i < bp->cp_nr_rings; i++) { | 4526 | for (i = 0; i < bp->cp_nr_rings; i++) { |
4527 | bp->bnapi[i]->in_reset = false; | ||
4465 | bnxt_enable_poll(bp->bnapi[i]); | 4528 | bnxt_enable_poll(bp->bnapi[i]); |
4466 | napi_enable(&bp->bnapi[i]->napi); | 4529 | napi_enable(&bp->bnapi[i]->napi); |
4467 | } | 4530 | } |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h index 8b823ff558ff..de9d53eee3dd 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | |||
@@ -584,6 +584,7 @@ struct bnxt_rx_ring_info { | |||
584 | u16 rx_prod; | 584 | u16 rx_prod; |
585 | u16 rx_agg_prod; | 585 | u16 rx_agg_prod; |
586 | u16 rx_sw_agg_prod; | 586 | u16 rx_sw_agg_prod; |
587 | u16 rx_next_cons; | ||
587 | void __iomem *rx_doorbell; | 588 | void __iomem *rx_doorbell; |
588 | void __iomem *rx_agg_doorbell; | 589 | void __iomem *rx_agg_doorbell; |
589 | 590 | ||
@@ -636,6 +637,7 @@ struct bnxt_napi { | |||
636 | #ifdef CONFIG_NET_RX_BUSY_POLL | 637 | #ifdef CONFIG_NET_RX_BUSY_POLL |
637 | atomic_t poll_state; | 638 | atomic_t poll_state; |
638 | #endif | 639 | #endif |
640 | bool in_reset; | ||
639 | }; | 641 | }; |
640 | 642 | ||
641 | #ifdef CONFIG_NET_RX_BUSY_POLL | 643 | #ifdef CONFIG_NET_RX_BUSY_POLL |
diff --git a/drivers/net/ethernet/marvell/Kconfig b/drivers/net/ethernet/marvell/Kconfig index b5c6d42daa12..2664827ddecd 100644 --- a/drivers/net/ethernet/marvell/Kconfig +++ b/drivers/net/ethernet/marvell/Kconfig | |||
@@ -68,7 +68,7 @@ config MVNETA | |||
68 | 68 | ||
69 | config MVNETA_BM | 69 | config MVNETA_BM |
70 | tristate | 70 | tristate |
71 | default y if MVNETA=y && MVNETA_BM_ENABLE | 71 | default y if MVNETA=y && MVNETA_BM_ENABLE!=n |
72 | default MVNETA_BM_ENABLE | 72 | default MVNETA_BM_ENABLE |
73 | select HWBM | 73 | select HWBM |
74 | help | 74 | help |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c index cda9e604a95f..0844b7c75767 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c | |||
@@ -1417,6 +1417,7 @@ void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *adapter) | |||
1417 | struct qlcnic_fw_dump *fw_dump = &ahw->fw_dump; | 1417 | struct qlcnic_fw_dump *fw_dump = &ahw->fw_dump; |
1418 | struct pci_dev *pdev = adapter->pdev; | 1418 | struct pci_dev *pdev = adapter->pdev; |
1419 | bool extended = false; | 1419 | bool extended = false; |
1420 | int ret; | ||
1420 | 1421 | ||
1421 | prev_version = adapter->fw_version; | 1422 | prev_version = adapter->fw_version; |
1422 | current_version = qlcnic_83xx_get_fw_version(adapter); | 1423 | current_version = qlcnic_83xx_get_fw_version(adapter); |
@@ -1427,8 +1428,11 @@ void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *adapter) | |||
1427 | if (qlcnic_83xx_md_check_extended_dump_capability(adapter)) | 1428 | if (qlcnic_83xx_md_check_extended_dump_capability(adapter)) |
1428 | extended = !qlcnic_83xx_extend_md_capab(adapter); | 1429 | extended = !qlcnic_83xx_extend_md_capab(adapter); |
1429 | 1430 | ||
1430 | if (!qlcnic_fw_cmd_get_minidump_temp(adapter)) | 1431 | ret = qlcnic_fw_cmd_get_minidump_temp(adapter); |
1431 | dev_info(&pdev->dev, "Supports FW dump capability\n"); | 1432 | if (ret) |
1433 | return; | ||
1434 | |||
1435 | dev_info(&pdev->dev, "Supports FW dump capability\n"); | ||
1432 | 1436 | ||
1433 | /* Once we have minidump template with extended iSCSI dump | 1437 | /* Once we have minidump template with extended iSCSI dump |
1434 | * capability, update the minidump capture mask to 0x1f as | 1438 | * capability, update the minidump capture mask to 0x1f as |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index b42f26029225..4412a57ec862 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -711,6 +711,7 @@ static void xenvif_tx_err(struct xenvif_queue *queue, | |||
711 | if (cons == end) | 711 | if (cons == end) |
712 | break; | 712 | break; |
713 | RING_COPY_REQUEST(&queue->tx, cons++, txp); | 713 | RING_COPY_REQUEST(&queue->tx, cons++, txp); |
714 | extra_count = 0; /* only the first frag can have extras */ | ||
714 | } while (1); | 715 | } while (1); |
715 | queue->tx.req_cons = cons; | 716 | queue->tx.req_cons = cons; |
716 | } | 717 | } |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index d97268e8ff10..2b68418c7198 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -975,6 +975,8 @@ fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg) | |||
975 | val = 65535 - 40; | 975 | val = 65535 - 40; |
976 | if (type == RTAX_MTU && val > 65535 - 15) | 976 | if (type == RTAX_MTU && val > 65535 - 15) |
977 | val = 65535 - 15; | 977 | val = 65535 - 15; |
978 | if (type == RTAX_HOPLIMIT && val > 255) | ||
979 | val = 255; | ||
978 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) | 980 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) |
979 | return -EINVAL; | 981 | return -EINVAL; |
980 | fi->fib_metrics[type - 1] = val; | 982 | fi->fib_metrics[type - 1] = val; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index d916d6ab9ad2..6f32944e0223 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1750,6 +1750,8 @@ static int ip6_convert_metrics(struct mx6_config *mxc, | |||
1750 | } else { | 1750 | } else { |
1751 | val = nla_get_u32(nla); | 1751 | val = nla_get_u32(nla); |
1752 | } | 1752 | } |
1753 | if (type == RTAX_HOPLIMIT && val > 255) | ||
1754 | val = 255; | ||
1753 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) | 1755 | if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) |
1754 | goto err; | 1756 | goto err; |
1755 | 1757 | ||
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 895d11dced3c..e27fd17c6743 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -1778,6 +1778,7 @@ void nf_conntrack_init_end(void) | |||
1778 | 1778 | ||
1779 | int nf_conntrack_init_net(struct net *net) | 1779 | int nf_conntrack_init_net(struct net *net) |
1780 | { | 1780 | { |
1781 | static atomic64_t unique_id; | ||
1781 | int ret = -ENOMEM; | 1782 | int ret = -ENOMEM; |
1782 | int cpu; | 1783 | int cpu; |
1783 | 1784 | ||
@@ -1800,7 +1801,8 @@ int nf_conntrack_init_net(struct net *net) | |||
1800 | if (!net->ct.stat) | 1801 | if (!net->ct.stat) |
1801 | goto err_pcpu_lists; | 1802 | goto err_pcpu_lists; |
1802 | 1803 | ||
1803 | net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); | 1804 | net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%llu", |
1805 | (u64)atomic64_inc_return(&unique_id)); | ||
1804 | if (!net->ct.slabname) | 1806 | if (!net->ct.slabname) |
1805 | goto err_slabname; | 1807 | goto err_slabname; |
1806 | 1808 | ||