aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm64/net/bpf_jit_comp.c1
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_cle.c11
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_cle.h2
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.c19
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.h8
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.c75
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.h18
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.h2
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c63
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.h2
-rw-r--r--drivers/net/ethernet/marvell/Kconfig2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c8
-rw-r--r--drivers/net/xen-netback/netback.c1
-rw-r--r--net/ipv4/fib_semantics.c2
-rw-r--r--net/ipv6/route.c2
-rw-r--r--net/netfilter/nf_conntrack_core.c4
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,
43static void xgene_cle_dbptr_to_hw(struct xgene_enet_pdata *pdata, 43static 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);
512out: 512out:
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
126struct xgene_mac_ops { 136struct 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
38extern const struct xgene_mac_ops xgene_sgmac_ops; 38extern const struct xgene_mac_ops xgene_sgmac_ops;
39extern const struct xgene_port_ops xgene_sgport_ops; 39extern 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
816static 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
846static 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
816static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, 856static 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
1246next_rx: 1306next_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
1249next_rx_no_prod: 1310next_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
69config MVNETA_BM 69config 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
1779int nf_conntrack_init_net(struct net *net) 1779int 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