diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-15 21:52:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-15 21:52:28 -0400 |
commit | 510c8a899caf095cb13d09d203573deef15db2fe (patch) | |
tree | 5ddaa46e8ecef7029c6dd0a4a7801597df707b78 | |
parent | 40c6d1b9e2fc4251ca19fa69398f6fa34e813e27 (diff) | |
parent | 88a5c690b66110ad255380d8f629c629cf6ca559 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Fix TCP checksum offload handling in iwlwifi driver, from Emmanuel
Grumbach.
2) In ksz DSA tagging code, free SKB if skb_put_padto() fails. From
Vivien Didelot.
3) Fix two regressions with bonding on wireless, from Andreas Born.
4) Fix build when busypoll is disabled, from Daniel Borkmann.
5) Fix copy_linear_skb() wrt. SO_PEEK_OFF, from Eric Dumazet.
6) Set SKB cached route properly in inet_rtm_getroute(), from Florian
Westphal.
7) Fix PCI-E relaxed ordering handling in cxgb4 driver, from Ding
Tianhong.
8) Fix module refcnt leak in ULP code, from Sabrina Dubroca.
9) Fix use of GFP_KERNEL in atomic contexts in AF_KEY code, from Eric
Dumazet.
10) Need to purge socket write queue in dccp_destroy_sock(), also from
Eric Dumazet.
11) Make bpf_trace_printk() work properly on 32-bit architectures, from
Daniel Borkmann.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (47 commits)
bpf: fix bpf_trace_printk on 32 bit archs
PCI: fix oops when try to find Root Port for a PCI device
sfc: don't try and read ef10 data on non-ef10 NIC
net_sched: remove warning from qdisc_hash_add
net_sched/sfq: update hierarchical backlog when drop packet
net_sched: reset pointers to tcf blocks in classful qdiscs' destructors
ipv4: fix NULL dereference in free_fib_info_rcu()
net: Fix a typo in comment about sock flags.
ipv6: fix NULL dereference in ip6_route_dev_notify()
tcp: fix possible deadlock in TCP stack vs BPF filter
dccp: purge write queue in dccp_destroy_sock()
udp: fix linear skb reception with PEEK_OFF
ipv6: release rt6->rt6i_idev properly during ifdown
af_key: do not use GFP_KERNEL in atomic contexts
tcp: ulp: avoid module refcnt leak in tcp_set_ulp
net/cxgb4vf: Use new PCI_DEV_FLAGS_NO_RELAXED_ORDERING flag
net/cxgb4: Use new PCI_DEV_FLAGS_NO_RELAXED_ORDERING flag
PCI: Disable Relaxed Ordering Attributes for AMD A1100
PCI: Disable Relaxed Ordering for some Intel processors
PCI: Disable PCIe Relaxed Ordering if unsupported
...
58 files changed, 512 insertions, 159 deletions
diff --git a/drivers/isdn/mISDN/fsm.c b/drivers/isdn/mISDN/fsm.c index 78fc5d5e9051..92e6570b1143 100644 --- a/drivers/isdn/mISDN/fsm.c +++ b/drivers/isdn/mISDN/fsm.c | |||
@@ -26,7 +26,7 @@ | |||
26 | 26 | ||
27 | #define FSM_TIMER_DEBUG 0 | 27 | #define FSM_TIMER_DEBUG 0 |
28 | 28 | ||
29 | void | 29 | int |
30 | mISDN_FsmNew(struct Fsm *fsm, | 30 | mISDN_FsmNew(struct Fsm *fsm, |
31 | struct FsmNode *fnlist, int fncount) | 31 | struct FsmNode *fnlist, int fncount) |
32 | { | 32 | { |
@@ -34,6 +34,8 @@ mISDN_FsmNew(struct Fsm *fsm, | |||
34 | 34 | ||
35 | fsm->jumpmatrix = kzalloc(sizeof(FSMFNPTR) * fsm->state_count * | 35 | fsm->jumpmatrix = kzalloc(sizeof(FSMFNPTR) * fsm->state_count * |
36 | fsm->event_count, GFP_KERNEL); | 36 | fsm->event_count, GFP_KERNEL); |
37 | if (fsm->jumpmatrix == NULL) | ||
38 | return -ENOMEM; | ||
37 | 39 | ||
38 | for (i = 0; i < fncount; i++) | 40 | for (i = 0; i < fncount; i++) |
39 | if ((fnlist[i].state >= fsm->state_count) || | 41 | if ((fnlist[i].state >= fsm->state_count) || |
@@ -45,6 +47,7 @@ mISDN_FsmNew(struct Fsm *fsm, | |||
45 | } else | 47 | } else |
46 | fsm->jumpmatrix[fsm->state_count * fnlist[i].event + | 48 | fsm->jumpmatrix[fsm->state_count * fnlist[i].event + |
47 | fnlist[i].state] = (FSMFNPTR) fnlist[i].routine; | 49 | fnlist[i].state] = (FSMFNPTR) fnlist[i].routine; |
50 | return 0; | ||
48 | } | 51 | } |
49 | EXPORT_SYMBOL(mISDN_FsmNew); | 52 | EXPORT_SYMBOL(mISDN_FsmNew); |
50 | 53 | ||
diff --git a/drivers/isdn/mISDN/fsm.h b/drivers/isdn/mISDN/fsm.h index 928f5be192c1..e1def8490221 100644 --- a/drivers/isdn/mISDN/fsm.h +++ b/drivers/isdn/mISDN/fsm.h | |||
@@ -55,7 +55,7 @@ struct FsmTimer { | |||
55 | void *arg; | 55 | void *arg; |
56 | }; | 56 | }; |
57 | 57 | ||
58 | extern void mISDN_FsmNew(struct Fsm *, struct FsmNode *, int); | 58 | extern int mISDN_FsmNew(struct Fsm *, struct FsmNode *, int); |
59 | extern void mISDN_FsmFree(struct Fsm *); | 59 | extern void mISDN_FsmFree(struct Fsm *); |
60 | extern int mISDN_FsmEvent(struct FsmInst *, int , void *); | 60 | extern int mISDN_FsmEvent(struct FsmInst *, int , void *); |
61 | extern void mISDN_FsmChangeState(struct FsmInst *, int); | 61 | extern void mISDN_FsmChangeState(struct FsmInst *, int); |
diff --git a/drivers/isdn/mISDN/layer1.c b/drivers/isdn/mISDN/layer1.c index bebc57b72138..3192b0eb3944 100644 --- a/drivers/isdn/mISDN/layer1.c +++ b/drivers/isdn/mISDN/layer1.c | |||
@@ -414,8 +414,7 @@ l1_init(u_int *deb) | |||
414 | l1fsm_s.event_count = L1_EVENT_COUNT; | 414 | l1fsm_s.event_count = L1_EVENT_COUNT; |
415 | l1fsm_s.strEvent = strL1Event; | 415 | l1fsm_s.strEvent = strL1Event; |
416 | l1fsm_s.strState = strL1SState; | 416 | l1fsm_s.strState = strL1SState; |
417 | mISDN_FsmNew(&l1fsm_s, L1SFnList, ARRAY_SIZE(L1SFnList)); | 417 | return mISDN_FsmNew(&l1fsm_s, L1SFnList, ARRAY_SIZE(L1SFnList)); |
418 | return 0; | ||
419 | } | 418 | } |
420 | 419 | ||
421 | void | 420 | void |
diff --git a/drivers/isdn/mISDN/layer2.c b/drivers/isdn/mISDN/layer2.c index 7243a6746f8b..9ff0903a0e89 100644 --- a/drivers/isdn/mISDN/layer2.c +++ b/drivers/isdn/mISDN/layer2.c | |||
@@ -2247,15 +2247,26 @@ static struct Bprotocol X75SLP = { | |||
2247 | int | 2247 | int |
2248 | Isdnl2_Init(u_int *deb) | 2248 | Isdnl2_Init(u_int *deb) |
2249 | { | 2249 | { |
2250 | int res; | ||
2250 | debug = deb; | 2251 | debug = deb; |
2251 | mISDN_register_Bprotocol(&X75SLP); | 2252 | mISDN_register_Bprotocol(&X75SLP); |
2252 | l2fsm.state_count = L2_STATE_COUNT; | 2253 | l2fsm.state_count = L2_STATE_COUNT; |
2253 | l2fsm.event_count = L2_EVENT_COUNT; | 2254 | l2fsm.event_count = L2_EVENT_COUNT; |
2254 | l2fsm.strEvent = strL2Event; | 2255 | l2fsm.strEvent = strL2Event; |
2255 | l2fsm.strState = strL2State; | 2256 | l2fsm.strState = strL2State; |
2256 | mISDN_FsmNew(&l2fsm, L2FnList, ARRAY_SIZE(L2FnList)); | 2257 | res = mISDN_FsmNew(&l2fsm, L2FnList, ARRAY_SIZE(L2FnList)); |
2257 | TEIInit(deb); | 2258 | if (res) |
2259 | goto error; | ||
2260 | res = TEIInit(deb); | ||
2261 | if (res) | ||
2262 | goto error_fsm; | ||
2258 | return 0; | 2263 | return 0; |
2264 | |||
2265 | error_fsm: | ||
2266 | mISDN_FsmFree(&l2fsm); | ||
2267 | error: | ||
2268 | mISDN_unregister_Bprotocol(&X75SLP); | ||
2269 | return res; | ||
2259 | } | 2270 | } |
2260 | 2271 | ||
2261 | void | 2272 | void |
diff --git a/drivers/isdn/mISDN/tei.c b/drivers/isdn/mISDN/tei.c index 908127efccf8..12d9e5f4beb1 100644 --- a/drivers/isdn/mISDN/tei.c +++ b/drivers/isdn/mISDN/tei.c | |||
@@ -1387,23 +1387,37 @@ create_teimanager(struct mISDNdevice *dev) | |||
1387 | 1387 | ||
1388 | int TEIInit(u_int *deb) | 1388 | int TEIInit(u_int *deb) |
1389 | { | 1389 | { |
1390 | int res; | ||
1390 | debug = deb; | 1391 | debug = deb; |
1391 | teifsmu.state_count = TEI_STATE_COUNT; | 1392 | teifsmu.state_count = TEI_STATE_COUNT; |
1392 | teifsmu.event_count = TEI_EVENT_COUNT; | 1393 | teifsmu.event_count = TEI_EVENT_COUNT; |
1393 | teifsmu.strEvent = strTeiEvent; | 1394 | teifsmu.strEvent = strTeiEvent; |
1394 | teifsmu.strState = strTeiState; | 1395 | teifsmu.strState = strTeiState; |
1395 | mISDN_FsmNew(&teifsmu, TeiFnListUser, ARRAY_SIZE(TeiFnListUser)); | 1396 | res = mISDN_FsmNew(&teifsmu, TeiFnListUser, ARRAY_SIZE(TeiFnListUser)); |
1397 | if (res) | ||
1398 | goto error; | ||
1396 | teifsmn.state_count = TEI_STATE_COUNT; | 1399 | teifsmn.state_count = TEI_STATE_COUNT; |
1397 | teifsmn.event_count = TEI_EVENT_COUNT; | 1400 | teifsmn.event_count = TEI_EVENT_COUNT; |
1398 | teifsmn.strEvent = strTeiEvent; | 1401 | teifsmn.strEvent = strTeiEvent; |
1399 | teifsmn.strState = strTeiState; | 1402 | teifsmn.strState = strTeiState; |
1400 | mISDN_FsmNew(&teifsmn, TeiFnListNet, ARRAY_SIZE(TeiFnListNet)); | 1403 | res = mISDN_FsmNew(&teifsmn, TeiFnListNet, ARRAY_SIZE(TeiFnListNet)); |
1404 | if (res) | ||
1405 | goto error_smn; | ||
1401 | deactfsm.state_count = DEACT_STATE_COUNT; | 1406 | deactfsm.state_count = DEACT_STATE_COUNT; |
1402 | deactfsm.event_count = DEACT_EVENT_COUNT; | 1407 | deactfsm.event_count = DEACT_EVENT_COUNT; |
1403 | deactfsm.strEvent = strDeactEvent; | 1408 | deactfsm.strEvent = strDeactEvent; |
1404 | deactfsm.strState = strDeactState; | 1409 | deactfsm.strState = strDeactState; |
1405 | mISDN_FsmNew(&deactfsm, DeactFnList, ARRAY_SIZE(DeactFnList)); | 1410 | res = mISDN_FsmNew(&deactfsm, DeactFnList, ARRAY_SIZE(DeactFnList)); |
1411 | if (res) | ||
1412 | goto error_deact; | ||
1406 | return 0; | 1413 | return 0; |
1414 | |||
1415 | error_deact: | ||
1416 | mISDN_FsmFree(&teifsmn); | ||
1417 | error_smn: | ||
1418 | mISDN_FsmFree(&teifsmu); | ||
1419 | error: | ||
1420 | return res; | ||
1407 | } | 1421 | } |
1408 | 1422 | ||
1409 | void TEIFree(void) | 1423 | void TEIFree(void) |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 9bee6c1c70cc..fc63992ab0e0 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1569,7 +1569,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1569 | new_slave->delay = 0; | 1569 | new_slave->delay = 0; |
1570 | new_slave->link_failure_count = 0; | 1570 | new_slave->link_failure_count = 0; |
1571 | 1571 | ||
1572 | if (bond_update_speed_duplex(new_slave)) | 1572 | if (bond_update_speed_duplex(new_slave) && |
1573 | bond_needs_speed_duplex(bond)) | ||
1573 | new_slave->link = BOND_LINK_DOWN; | 1574 | new_slave->link = BOND_LINK_DOWN; |
1574 | 1575 | ||
1575 | new_slave->last_rx = jiffies - | 1576 | new_slave->last_rx = jiffies - |
@@ -2140,11 +2141,13 @@ static void bond_miimon_commit(struct bonding *bond) | |||
2140 | continue; | 2141 | continue; |
2141 | 2142 | ||
2142 | case BOND_LINK_UP: | 2143 | case BOND_LINK_UP: |
2143 | if (bond_update_speed_duplex(slave)) { | 2144 | if (bond_update_speed_duplex(slave) && |
2145 | bond_needs_speed_duplex(bond)) { | ||
2144 | slave->link = BOND_LINK_DOWN; | 2146 | slave->link = BOND_LINK_DOWN; |
2145 | netdev_warn(bond->dev, | 2147 | if (net_ratelimit()) |
2146 | "failed to get link speed/duplex for %s\n", | 2148 | netdev_warn(bond->dev, |
2147 | slave->dev->name); | 2149 | "failed to get link speed/duplex for %s\n", |
2150 | slave->dev->name); | ||
2148 | continue; | 2151 | continue; |
2149 | } | 2152 | } |
2150 | bond_set_slave_link_state(slave, BOND_LINK_UP, | 2153 | bond_set_slave_link_state(slave, BOND_LINK_UP, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index ef4be781fd05..09ea62ee96d3 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | |||
@@ -529,6 +529,7 @@ enum { /* adapter flags */ | |||
529 | USING_SOFT_PARAMS = (1 << 6), | 529 | USING_SOFT_PARAMS = (1 << 6), |
530 | MASTER_PF = (1 << 7), | 530 | MASTER_PF = (1 << 7), |
531 | FW_OFLD_CONN = (1 << 9), | 531 | FW_OFLD_CONN = (1 << 9), |
532 | ROOT_NO_RELAXED_ORDERING = (1 << 10), | ||
532 | }; | 533 | }; |
533 | 534 | ||
534 | enum { | 535 | enum { |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index e403fa18f1b1..33bb8678833a 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -4654,11 +4654,6 @@ static void print_port_info(const struct net_device *dev) | |||
4654 | dev->name, adap->params.vpd.id, adap->name, buf); | 4654 | dev->name, adap->params.vpd.id, adap->name, buf); |
4655 | } | 4655 | } |
4656 | 4656 | ||
4657 | static void enable_pcie_relaxed_ordering(struct pci_dev *dev) | ||
4658 | { | ||
4659 | pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN); | ||
4660 | } | ||
4661 | |||
4662 | /* | 4657 | /* |
4663 | * Free the following resources: | 4658 | * Free the following resources: |
4664 | * - memory used for tables | 4659 | * - memory used for tables |
@@ -4908,7 +4903,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
4908 | } | 4903 | } |
4909 | 4904 | ||
4910 | pci_enable_pcie_error_reporting(pdev); | 4905 | pci_enable_pcie_error_reporting(pdev); |
4911 | enable_pcie_relaxed_ordering(pdev); | ||
4912 | pci_set_master(pdev); | 4906 | pci_set_master(pdev); |
4913 | pci_save_state(pdev); | 4907 | pci_save_state(pdev); |
4914 | 4908 | ||
@@ -4947,6 +4941,23 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
4947 | adapter->msg_enable = DFLT_MSG_ENABLE; | 4941 | adapter->msg_enable = DFLT_MSG_ENABLE; |
4948 | memset(adapter->chan_map, 0xff, sizeof(adapter->chan_map)); | 4942 | memset(adapter->chan_map, 0xff, sizeof(adapter->chan_map)); |
4949 | 4943 | ||
4944 | /* If possible, we use PCIe Relaxed Ordering Attribute to deliver | ||
4945 | * Ingress Packet Data to Free List Buffers in order to allow for | ||
4946 | * chipset performance optimizations between the Root Complex and | ||
4947 | * Memory Controllers. (Messages to the associated Ingress Queue | ||
4948 | * notifying new Packet Placement in the Free Lists Buffers will be | ||
4949 | * send without the Relaxed Ordering Attribute thus guaranteeing that | ||
4950 | * all preceding PCIe Transaction Layer Packets will be processed | ||
4951 | * first.) But some Root Complexes have various issues with Upstream | ||
4952 | * Transaction Layer Packets with the Relaxed Ordering Attribute set. | ||
4953 | * The PCIe devices which under the Root Complexes will be cleared the | ||
4954 | * Relaxed Ordering bit in the configuration space, So we check our | ||
4955 | * PCIe configuration space to see if it's flagged with advice against | ||
4956 | * using Relaxed Ordering. | ||
4957 | */ | ||
4958 | if (!pcie_relaxed_ordering_enabled(pdev)) | ||
4959 | adapter->flags |= ROOT_NO_RELAXED_ORDERING; | ||
4960 | |||
4950 | spin_lock_init(&adapter->stats_lock); | 4961 | spin_lock_init(&adapter->stats_lock); |
4951 | spin_lock_init(&adapter->tid_release_lock); | 4962 | spin_lock_init(&adapter->tid_release_lock); |
4952 | spin_lock_init(&adapter->win0_lock); | 4963 | spin_lock_init(&adapter->win0_lock); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c index ede12209f20b..4ef68f69b58c 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c | |||
@@ -2719,6 +2719,7 @@ int t4_sge_alloc_rxq(struct adapter *adap, struct sge_rspq *iq, bool fwevtq, | |||
2719 | struct fw_iq_cmd c; | 2719 | struct fw_iq_cmd c; |
2720 | struct sge *s = &adap->sge; | 2720 | struct sge *s = &adap->sge; |
2721 | struct port_info *pi = netdev_priv(dev); | 2721 | struct port_info *pi = netdev_priv(dev); |
2722 | int relaxed = !(adap->flags & ROOT_NO_RELAXED_ORDERING); | ||
2722 | 2723 | ||
2723 | /* Size needs to be multiple of 16, including status entry. */ | 2724 | /* Size needs to be multiple of 16, including status entry. */ |
2724 | iq->size = roundup(iq->size, 16); | 2725 | iq->size = roundup(iq->size, 16); |
@@ -2772,8 +2773,8 @@ int t4_sge_alloc_rxq(struct adapter *adap, struct sge_rspq *iq, bool fwevtq, | |||
2772 | 2773 | ||
2773 | flsz = fl->size / 8 + s->stat_len / sizeof(struct tx_desc); | 2774 | flsz = fl->size / 8 + s->stat_len / sizeof(struct tx_desc); |
2774 | c.iqns_to_fl0congen |= htonl(FW_IQ_CMD_FL0PACKEN_F | | 2775 | c.iqns_to_fl0congen |= htonl(FW_IQ_CMD_FL0PACKEN_F | |
2775 | FW_IQ_CMD_FL0FETCHRO_F | | 2776 | FW_IQ_CMD_FL0FETCHRO_V(relaxed) | |
2776 | FW_IQ_CMD_FL0DATARO_F | | 2777 | FW_IQ_CMD_FL0DATARO_V(relaxed) | |
2777 | FW_IQ_CMD_FL0PADEN_F); | 2778 | FW_IQ_CMD_FL0PADEN_F); |
2778 | if (cong >= 0) | 2779 | if (cong >= 0) |
2779 | c.iqns_to_fl0congen |= | 2780 | c.iqns_to_fl0congen |= |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/adapter.h b/drivers/net/ethernet/chelsio/cxgb4vf/adapter.h index 109bc630408b..08c6ddb84a04 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/adapter.h +++ b/drivers/net/ethernet/chelsio/cxgb4vf/adapter.h | |||
@@ -408,6 +408,7 @@ enum { /* adapter flags */ | |||
408 | USING_MSI = (1UL << 1), | 408 | USING_MSI = (1UL << 1), |
409 | USING_MSIX = (1UL << 2), | 409 | USING_MSIX = (1UL << 2), |
410 | QUEUES_BOUND = (1UL << 3), | 410 | QUEUES_BOUND = (1UL << 3), |
411 | ROOT_NO_RELAXED_ORDERING = (1UL << 4), | ||
411 | }; | 412 | }; |
412 | 413 | ||
413 | /* | 414 | /* |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c index ac7a150c54e9..2b85b874fd0d 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c | |||
@@ -2888,6 +2888,24 @@ static int cxgb4vf_pci_probe(struct pci_dev *pdev, | |||
2888 | */ | 2888 | */ |
2889 | adapter->name = pci_name(pdev); | 2889 | adapter->name = pci_name(pdev); |
2890 | adapter->msg_enable = DFLT_MSG_ENABLE; | 2890 | adapter->msg_enable = DFLT_MSG_ENABLE; |
2891 | |||
2892 | /* If possible, we use PCIe Relaxed Ordering Attribute to deliver | ||
2893 | * Ingress Packet Data to Free List Buffers in order to allow for | ||
2894 | * chipset performance optimizations between the Root Complex and | ||
2895 | * Memory Controllers. (Messages to the associated Ingress Queue | ||
2896 | * notifying new Packet Placement in the Free Lists Buffers will be | ||
2897 | * send without the Relaxed Ordering Attribute thus guaranteeing that | ||
2898 | * all preceding PCIe Transaction Layer Packets will be processed | ||
2899 | * first.) But some Root Complexes have various issues with Upstream | ||
2900 | * Transaction Layer Packets with the Relaxed Ordering Attribute set. | ||
2901 | * The PCIe devices which under the Root Complexes will be cleared the | ||
2902 | * Relaxed Ordering bit in the configuration space, So we check our | ||
2903 | * PCIe configuration space to see if it's flagged with advice against | ||
2904 | * using Relaxed Ordering. | ||
2905 | */ | ||
2906 | if (!pcie_relaxed_ordering_enabled(pdev)) | ||
2907 | adapter->flags |= ROOT_NO_RELAXED_ORDERING; | ||
2908 | |||
2891 | err = adap_init0(adapter); | 2909 | err = adap_init0(adapter); |
2892 | if (err) | 2910 | if (err) |
2893 | goto err_unmap_bar; | 2911 | goto err_unmap_bar; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/sge.c b/drivers/net/ethernet/chelsio/cxgb4vf/sge.c index e37dde2ba97f..05498e7f2840 100644 --- a/drivers/net/ethernet/chelsio/cxgb4vf/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4vf/sge.c | |||
@@ -2205,6 +2205,7 @@ int t4vf_sge_alloc_rxq(struct adapter *adapter, struct sge_rspq *rspq, | |||
2205 | struct port_info *pi = netdev_priv(dev); | 2205 | struct port_info *pi = netdev_priv(dev); |
2206 | struct fw_iq_cmd cmd, rpl; | 2206 | struct fw_iq_cmd cmd, rpl; |
2207 | int ret, iqandst, flsz = 0; | 2207 | int ret, iqandst, flsz = 0; |
2208 | int relaxed = !(adapter->flags & ROOT_NO_RELAXED_ORDERING); | ||
2208 | 2209 | ||
2209 | /* | 2210 | /* |
2210 | * If we're using MSI interrupts and we're not initializing the | 2211 | * If we're using MSI interrupts and we're not initializing the |
@@ -2300,6 +2301,8 @@ int t4vf_sge_alloc_rxq(struct adapter *adapter, struct sge_rspq *rspq, | |||
2300 | cpu_to_be32( | 2301 | cpu_to_be32( |
2301 | FW_IQ_CMD_FL0HOSTFCMODE_V(SGE_HOSTFCMODE_NONE) | | 2302 | FW_IQ_CMD_FL0HOSTFCMODE_V(SGE_HOSTFCMODE_NONE) | |
2302 | FW_IQ_CMD_FL0PACKEN_F | | 2303 | FW_IQ_CMD_FL0PACKEN_F | |
2304 | FW_IQ_CMD_FL0FETCHRO_V(relaxed) | | ||
2305 | FW_IQ_CMD_FL0DATARO_V(relaxed) | | ||
2303 | FW_IQ_CMD_FL0PADEN_F); | 2306 | FW_IQ_CMD_FL0PADEN_F); |
2304 | 2307 | ||
2305 | /* In T6, for egress queue type FL there is internal overhead | 2308 | /* In T6, for egress queue type FL there is internal overhead |
diff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.c b/drivers/net/ethernet/netronome/nfp/flower/cmsg.c index dd7fa9cf225f..b0837b58c3a1 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.c +++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.c | |||
@@ -115,14 +115,10 @@ nfp_flower_cmsg_portmod_rx(struct nfp_app *app, struct sk_buff *skb) | |||
115 | return; | 115 | return; |
116 | } | 116 | } |
117 | 117 | ||
118 | if (link) { | 118 | if (link) |
119 | netif_carrier_on(netdev); | 119 | netif_carrier_on(netdev); |
120 | rtnl_lock(); | 120 | else |
121 | dev_set_mtu(netdev, be16_to_cpu(msg->mtu)); | ||
122 | rtnl_unlock(); | ||
123 | } else { | ||
124 | netif_carrier_off(netdev); | 121 | netif_carrier_off(netdev); |
125 | } | ||
126 | rcu_read_unlock(); | 122 | rcu_read_unlock(); |
127 | } | 123 | } |
128 | 124 | ||
diff --git a/drivers/net/ethernet/sfc/mcdi_port.c b/drivers/net/ethernet/sfc/mcdi_port.c index c905971c5f3a..990a63d7fcb7 100644 --- a/drivers/net/ethernet/sfc/mcdi_port.c +++ b/drivers/net/ethernet/sfc/mcdi_port.c | |||
@@ -938,7 +938,6 @@ enum efx_stats_action { | |||
938 | static int efx_mcdi_mac_stats(struct efx_nic *efx, | 938 | static int efx_mcdi_mac_stats(struct efx_nic *efx, |
939 | enum efx_stats_action action, int clear) | 939 | enum efx_stats_action action, int clear) |
940 | { | 940 | { |
941 | struct efx_ef10_nic_data *nic_data = efx->nic_data; | ||
942 | MCDI_DECLARE_BUF(inbuf, MC_CMD_MAC_STATS_IN_LEN); | 941 | MCDI_DECLARE_BUF(inbuf, MC_CMD_MAC_STATS_IN_LEN); |
943 | int rc; | 942 | int rc; |
944 | int change = action == EFX_STATS_PULL ? 0 : 1; | 943 | int change = action == EFX_STATS_PULL ? 0 : 1; |
@@ -960,7 +959,12 @@ static int efx_mcdi_mac_stats(struct efx_nic *efx, | |||
960 | MAC_STATS_IN_PERIODIC_NOEVENT, 1, | 959 | MAC_STATS_IN_PERIODIC_NOEVENT, 1, |
961 | MAC_STATS_IN_PERIOD_MS, period); | 960 | MAC_STATS_IN_PERIOD_MS, period); |
962 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len); | 961 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_DMA_LEN, dma_len); |
963 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_PORT_ID, nic_data->vport_id); | 962 | |
963 | if (efx_nic_rev(efx) >= EFX_REV_HUNT_A0) { | ||
964 | struct efx_ef10_nic_data *nic_data = efx->nic_data; | ||
965 | |||
966 | MCDI_SET_DWORD(inbuf, MAC_STATS_IN_PORT_ID, nic_data->vport_id); | ||
967 | } | ||
964 | 968 | ||
965 | rc = efx_mcdi_rpc_quiet(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf), | 969 | rc = efx_mcdi_rpc_quiet(efx, MC_CMD_MAC_STATS, inbuf, sizeof(inbuf), |
966 | NULL, 0, NULL); | 970 | NULL, 0, NULL); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c index db157a47000c..72ec711fcba2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | |||
@@ -204,6 +204,7 @@ int stmmac_mdio_register(struct net_device *ndev) | |||
204 | struct stmmac_priv *priv = netdev_priv(ndev); | 204 | struct stmmac_priv *priv = netdev_priv(ndev); |
205 | struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data; | 205 | struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data; |
206 | struct device_node *mdio_node = priv->plat->mdio_node; | 206 | struct device_node *mdio_node = priv->plat->mdio_node; |
207 | struct device *dev = ndev->dev.parent; | ||
207 | int addr, found; | 208 | int addr, found; |
208 | 209 | ||
209 | if (!mdio_bus_data) | 210 | if (!mdio_bus_data) |
@@ -237,7 +238,7 @@ int stmmac_mdio_register(struct net_device *ndev) | |||
237 | else | 238 | else |
238 | err = mdiobus_register(new_bus); | 239 | err = mdiobus_register(new_bus); |
239 | if (err != 0) { | 240 | if (err != 0) { |
240 | netdev_err(ndev, "Cannot register the MDIO bus\n"); | 241 | dev_err(dev, "Cannot register the MDIO bus\n"); |
241 | goto bus_register_fail; | 242 | goto bus_register_fail; |
242 | } | 243 | } |
243 | 244 | ||
@@ -285,14 +286,12 @@ int stmmac_mdio_register(struct net_device *ndev) | |||
285 | irq_str = irq_num; | 286 | irq_str = irq_num; |
286 | break; | 287 | break; |
287 | } | 288 | } |
288 | netdev_info(ndev, "PHY ID %08x at %d IRQ %s (%s)%s\n", | 289 | phy_attached_info(phydev); |
289 | phydev->phy_id, addr, irq_str, phydev_name(phydev), | ||
290 | act ? " active" : ""); | ||
291 | found = 1; | 290 | found = 1; |
292 | } | 291 | } |
293 | 292 | ||
294 | if (!found && !mdio_node) { | 293 | if (!found && !mdio_node) { |
295 | netdev_warn(ndev, "No PHY found\n"); | 294 | dev_warn(dev, "No PHY found\n"); |
296 | mdiobus_unregister(new_bus); | 295 | mdiobus_unregister(new_bus); |
297 | mdiobus_free(new_bus); | 296 | mdiobus_free(new_bus); |
298 | return -ENODEV; | 297 | return -ENODEV; |
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c index d21258d277ce..f1b60740e020 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | |||
@@ -159,8 +159,10 @@ void brcmf_feat_attach(struct brcmf_pub *drvr) | |||
159 | 159 | ||
160 | brcmf_feat_firmware_capabilities(ifp); | 160 | brcmf_feat_firmware_capabilities(ifp); |
161 | memset(&gscan_cfg, 0, sizeof(gscan_cfg)); | 161 | memset(&gscan_cfg, 0, sizeof(gscan_cfg)); |
162 | brcmf_feat_iovar_data_set(ifp, BRCMF_FEAT_GSCAN, "pfn_gscan_cfg", | 162 | if (drvr->bus_if->chip != BRCM_CC_43430_CHIP_ID) |
163 | &gscan_cfg, sizeof(gscan_cfg)); | 163 | brcmf_feat_iovar_data_set(ifp, BRCMF_FEAT_GSCAN, |
164 | "pfn_gscan_cfg", | ||
165 | &gscan_cfg, sizeof(gscan_cfg)); | ||
164 | brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn"); | 166 | brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn"); |
165 | if (drvr->bus_if->wowl_supported) | 167 | if (drvr->bus_if->wowl_supported) |
166 | brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl"); | 168 | brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl"); |
diff --git a/drivers/net/wireless/intel/iwlwifi/cfg/9000.c b/drivers/net/wireless/intel/iwlwifi/cfg/9000.c index b4ecd1fe1374..97208ce19f92 100644 --- a/drivers/net/wireless/intel/iwlwifi/cfg/9000.c +++ b/drivers/net/wireless/intel/iwlwifi/cfg/9000.c | |||
@@ -154,7 +154,7 @@ static const struct iwl_tt_params iwl9000_tt_params = { | |||
154 | const struct iwl_cfg iwl9160_2ac_cfg = { | 154 | const struct iwl_cfg iwl9160_2ac_cfg = { |
155 | .name = "Intel(R) Dual Band Wireless AC 9160", | 155 | .name = "Intel(R) Dual Band Wireless AC 9160", |
156 | .fw_name_pre = IWL9260A_FW_PRE, | 156 | .fw_name_pre = IWL9260A_FW_PRE, |
157 | .fw_name_pre_next_step = IWL9260B_FW_PRE, | 157 | .fw_name_pre_b_or_c_step = IWL9260B_FW_PRE, |
158 | IWL_DEVICE_9000, | 158 | IWL_DEVICE_9000, |
159 | .ht_params = &iwl9000_ht_params, | 159 | .ht_params = &iwl9000_ht_params, |
160 | .nvm_ver = IWL9000_NVM_VERSION, | 160 | .nvm_ver = IWL9000_NVM_VERSION, |
@@ -165,7 +165,7 @@ const struct iwl_cfg iwl9160_2ac_cfg = { | |||
165 | const struct iwl_cfg iwl9260_2ac_cfg = { | 165 | const struct iwl_cfg iwl9260_2ac_cfg = { |
166 | .name = "Intel(R) Dual Band Wireless AC 9260", | 166 | .name = "Intel(R) Dual Band Wireless AC 9260", |
167 | .fw_name_pre = IWL9260A_FW_PRE, | 167 | .fw_name_pre = IWL9260A_FW_PRE, |
168 | .fw_name_pre_next_step = IWL9260B_FW_PRE, | 168 | .fw_name_pre_b_or_c_step = IWL9260B_FW_PRE, |
169 | IWL_DEVICE_9000, | 169 | IWL_DEVICE_9000, |
170 | .ht_params = &iwl9000_ht_params, | 170 | .ht_params = &iwl9000_ht_params, |
171 | .nvm_ver = IWL9000_NVM_VERSION, | 171 | .nvm_ver = IWL9000_NVM_VERSION, |
@@ -176,7 +176,7 @@ const struct iwl_cfg iwl9260_2ac_cfg = { | |||
176 | const struct iwl_cfg iwl9270_2ac_cfg = { | 176 | const struct iwl_cfg iwl9270_2ac_cfg = { |
177 | .name = "Intel(R) Dual Band Wireless AC 9270", | 177 | .name = "Intel(R) Dual Band Wireless AC 9270", |
178 | .fw_name_pre = IWL9260A_FW_PRE, | 178 | .fw_name_pre = IWL9260A_FW_PRE, |
179 | .fw_name_pre_next_step = IWL9260B_FW_PRE, | 179 | .fw_name_pre_b_or_c_step = IWL9260B_FW_PRE, |
180 | IWL_DEVICE_9000, | 180 | IWL_DEVICE_9000, |
181 | .ht_params = &iwl9000_ht_params, | 181 | .ht_params = &iwl9000_ht_params, |
182 | .nvm_ver = IWL9000_NVM_VERSION, | 182 | .nvm_ver = IWL9000_NVM_VERSION, |
@@ -186,8 +186,8 @@ const struct iwl_cfg iwl9270_2ac_cfg = { | |||
186 | 186 | ||
187 | const struct iwl_cfg iwl9460_2ac_cfg = { | 187 | const struct iwl_cfg iwl9460_2ac_cfg = { |
188 | .name = "Intel(R) Dual Band Wireless AC 9460", | 188 | .name = "Intel(R) Dual Band Wireless AC 9460", |
189 | .fw_name_pre = IWL9000_FW_PRE, | 189 | .fw_name_pre = IWL9260A_FW_PRE, |
190 | .fw_name_pre_rf_next_step = IWL9000RFB_FW_PRE, | 190 | .fw_name_pre_b_or_c_step = IWL9260B_FW_PRE, |
191 | IWL_DEVICE_9000, | 191 | IWL_DEVICE_9000, |
192 | .ht_params = &iwl9000_ht_params, | 192 | .ht_params = &iwl9000_ht_params, |
193 | .nvm_ver = IWL9000_NVM_VERSION, | 193 | .nvm_ver = IWL9000_NVM_VERSION, |
@@ -198,8 +198,8 @@ const struct iwl_cfg iwl9460_2ac_cfg = { | |||
198 | 198 | ||
199 | const struct iwl_cfg iwl9560_2ac_cfg = { | 199 | const struct iwl_cfg iwl9560_2ac_cfg = { |
200 | .name = "Intel(R) Dual Band Wireless AC 9560", | 200 | .name = "Intel(R) Dual Band Wireless AC 9560", |
201 | .fw_name_pre = IWL9000_FW_PRE, | 201 | .fw_name_pre = IWL9260A_FW_PRE, |
202 | .fw_name_pre_rf_next_step = IWL9000RFB_FW_PRE, | 202 | .fw_name_pre_b_or_c_step = IWL9260B_FW_PRE, |
203 | IWL_DEVICE_9000, | 203 | IWL_DEVICE_9000, |
204 | .ht_params = &iwl9000_ht_params, | 204 | .ht_params = &iwl9000_ht_params, |
205 | .nvm_ver = IWL9000_NVM_VERSION, | 205 | .nvm_ver = IWL9000_NVM_VERSION, |
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h index 0fa8c473f1e2..c73a6438ce8f 100644 --- a/drivers/net/wireless/intel/iwlwifi/fw/file.h +++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h | |||
@@ -328,6 +328,7 @@ typedef unsigned int __bitwise iwl_ucode_tlv_capa_t; | |||
328 | * @IWL_UCODE_TLV_CAPA_TX_POWER_ACK: reduced TX power API has larger | 328 | * @IWL_UCODE_TLV_CAPA_TX_POWER_ACK: reduced TX power API has larger |
329 | * command size (command version 4) that supports toggling ACK TX | 329 | * command size (command version 4) that supports toggling ACK TX |
330 | * power reduction. | 330 | * power reduction. |
331 | * @IWL_UCODE_TLV_CAPA_MLME_OFFLOAD: supports MLME offload | ||
331 | * | 332 | * |
332 | * @NUM_IWL_UCODE_TLV_CAPA: number of bits used | 333 | * @NUM_IWL_UCODE_TLV_CAPA: number of bits used |
333 | */ | 334 | */ |
@@ -373,6 +374,7 @@ enum iwl_ucode_tlv_capa { | |||
373 | IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG = (__force iwl_ucode_tlv_capa_t)80, | 374 | IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG = (__force iwl_ucode_tlv_capa_t)80, |
374 | IWL_UCODE_TLV_CAPA_LQM_SUPPORT = (__force iwl_ucode_tlv_capa_t)81, | 375 | IWL_UCODE_TLV_CAPA_LQM_SUPPORT = (__force iwl_ucode_tlv_capa_t)81, |
375 | IWL_UCODE_TLV_CAPA_TX_POWER_ACK = (__force iwl_ucode_tlv_capa_t)84, | 376 | IWL_UCODE_TLV_CAPA_TX_POWER_ACK = (__force iwl_ucode_tlv_capa_t)84, |
377 | IWL_UCODE_TLV_CAPA_MLME_OFFLOAD = (__force iwl_ucode_tlv_capa_t)96, | ||
376 | 378 | ||
377 | NUM_IWL_UCODE_TLV_CAPA | 379 | NUM_IWL_UCODE_TLV_CAPA |
378 | #ifdef __CHECKER__ | 380 | #ifdef __CHECKER__ |
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h index c52623cb7c2a..d19c74827fbb 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h | |||
@@ -276,10 +276,10 @@ struct iwl_pwr_tx_backoff { | |||
276 | * @fw_name_pre: Firmware filename prefix. The api version and extension | 276 | * @fw_name_pre: Firmware filename prefix. The api version and extension |
277 | * (.ucode) will be added to filename before loading from disk. The | 277 | * (.ucode) will be added to filename before loading from disk. The |
278 | * filename is constructed as fw_name_pre<api>.ucode. | 278 | * filename is constructed as fw_name_pre<api>.ucode. |
279 | * @fw_name_pre_next_step: same as @fw_name_pre, only for next step | 279 | * @fw_name_pre_b_or_c_step: same as @fw_name_pre, only for b or c steps |
280 | * (if supported) | 280 | * (if supported) |
281 | * @fw_name_pre_rf_next_step: same as @fw_name_pre_next_step, only for rf next | 281 | * @fw_name_pre_rf_next_step: same as @fw_name_pre_b_or_c_step, only for rf |
282 | * step. Supported only in integrated solutions. | 282 | * next step. Supported only in integrated solutions. |
283 | * @ucode_api_max: Highest version of uCode API supported by driver. | 283 | * @ucode_api_max: Highest version of uCode API supported by driver. |
284 | * @ucode_api_min: Lowest version of uCode API supported by driver. | 284 | * @ucode_api_min: Lowest version of uCode API supported by driver. |
285 | * @max_inst_size: The maximal length of the fw inst section | 285 | * @max_inst_size: The maximal length of the fw inst section |
@@ -330,7 +330,7 @@ struct iwl_cfg { | |||
330 | /* params specific to an individual device within a device family */ | 330 | /* params specific to an individual device within a device family */ |
331 | const char *name; | 331 | const char *name; |
332 | const char *fw_name_pre; | 332 | const char *fw_name_pre; |
333 | const char *fw_name_pre_next_step; | 333 | const char *fw_name_pre_b_or_c_step; |
334 | const char *fw_name_pre_rf_next_step; | 334 | const char *fw_name_pre_rf_next_step; |
335 | /* params not likely to change within a device family */ | 335 | /* params not likely to change within a device family */ |
336 | const struct iwl_base_params *base_params; | 336 | const struct iwl_base_params *base_params; |
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c index 6fdb5921e17f..4e0f86fe0a6f 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c | |||
@@ -216,8 +216,9 @@ static int iwl_request_firmware(struct iwl_drv *drv, bool first) | |||
216 | const char *fw_pre_name; | 216 | const char *fw_pre_name; |
217 | 217 | ||
218 | if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_9000 && | 218 | if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_9000 && |
219 | CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_B_STEP) | 219 | (CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_B_STEP || |
220 | fw_pre_name = cfg->fw_name_pre_next_step; | 220 | CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_C_STEP)) |
221 | fw_pre_name = cfg->fw_name_pre_b_or_c_step; | ||
221 | else if (drv->trans->cfg->integrated && | 222 | else if (drv->trans->cfg->integrated && |
222 | CSR_HW_RFID_STEP(drv->trans->hw_rf_id) == SILICON_B_STEP && | 223 | CSR_HW_RFID_STEP(drv->trans->hw_rf_id) == SILICON_B_STEP && |
223 | cfg->fw_name_pre_rf_next_step) | 224 | cfg->fw_name_pre_rf_next_step) |
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c index 5c08f4d40f6a..3ee6767392b6 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c | |||
@@ -785,7 +785,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
785 | int num_of_ch, __le32 *channels, u16 fw_mcc) | 785 | int num_of_ch, __le32 *channels, u16 fw_mcc) |
786 | { | 786 | { |
787 | int ch_idx; | 787 | int ch_idx; |
788 | u16 ch_flags, prev_ch_flags = 0; | 788 | u16 ch_flags; |
789 | u32 reg_rule_flags, prev_reg_rule_flags = 0; | ||
789 | const u8 *nvm_chan = cfg->ext_nvm ? | 790 | const u8 *nvm_chan = cfg->ext_nvm ? |
790 | iwl_ext_nvm_channels : iwl_nvm_channels; | 791 | iwl_ext_nvm_channels : iwl_nvm_channels; |
791 | struct ieee80211_regdomain *regd; | 792 | struct ieee80211_regdomain *regd; |
@@ -834,8 +835,11 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
834 | continue; | 835 | continue; |
835 | } | 836 | } |
836 | 837 | ||
838 | reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx, | ||
839 | ch_flags, cfg); | ||
840 | |||
837 | /* we can't continue the same rule */ | 841 | /* we can't continue the same rule */ |
838 | if (ch_idx == 0 || prev_ch_flags != ch_flags || | 842 | if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags || |
839 | center_freq - prev_center_freq > 20) { | 843 | center_freq - prev_center_freq > 20) { |
840 | valid_rules++; | 844 | valid_rules++; |
841 | new_rule = true; | 845 | new_rule = true; |
@@ -854,18 +858,17 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
854 | rule->power_rule.max_eirp = | 858 | rule->power_rule.max_eirp = |
855 | DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER); | 859 | DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER); |
856 | 860 | ||
857 | rule->flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx, | 861 | rule->flags = reg_rule_flags; |
858 | ch_flags, cfg); | ||
859 | 862 | ||
860 | /* rely on auto-calculation to merge BW of contiguous chans */ | 863 | /* rely on auto-calculation to merge BW of contiguous chans */ |
861 | rule->flags |= NL80211_RRF_AUTO_BW; | 864 | rule->flags |= NL80211_RRF_AUTO_BW; |
862 | rule->freq_range.max_bandwidth_khz = 0; | 865 | rule->freq_range.max_bandwidth_khz = 0; |
863 | 866 | ||
864 | prev_ch_flags = ch_flags; | ||
865 | prev_center_freq = center_freq; | 867 | prev_center_freq = center_freq; |
868 | prev_reg_rule_flags = reg_rule_flags; | ||
866 | 869 | ||
867 | IWL_DEBUG_DEV(dev, IWL_DL_LAR, | 870 | IWL_DEBUG_DEV(dev, IWL_DL_LAR, |
868 | "Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s(0x%02x): Ad-Hoc %ssupported\n", | 871 | "Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s(0x%02x) reg_flags 0x%x: %s\n", |
869 | center_freq, | 872 | center_freq, |
870 | band == NL80211_BAND_5GHZ ? "5.2" : "2.4", | 873 | band == NL80211_BAND_5GHZ ? "5.2" : "2.4", |
871 | CHECK_AND_PRINT_I(VALID), | 874 | CHECK_AND_PRINT_I(VALID), |
@@ -877,10 +880,10 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg, | |||
877 | CHECK_AND_PRINT_I(160MHZ), | 880 | CHECK_AND_PRINT_I(160MHZ), |
878 | CHECK_AND_PRINT_I(INDOOR_ONLY), | 881 | CHECK_AND_PRINT_I(INDOOR_ONLY), |
879 | CHECK_AND_PRINT_I(GO_CONCURRENT), | 882 | CHECK_AND_PRINT_I(GO_CONCURRENT), |
880 | ch_flags, | 883 | ch_flags, reg_rule_flags, |
881 | ((ch_flags & NVM_CHANNEL_ACTIVE) && | 884 | ((ch_flags & NVM_CHANNEL_ACTIVE) && |
882 | !(ch_flags & NVM_CHANNEL_RADAR)) | 885 | !(ch_flags & NVM_CHANNEL_RADAR)) |
883 | ? "" : "not "); | 886 | ? "Ad-Hoc" : ""); |
884 | } | 887 | } |
885 | 888 | ||
886 | regd->n_reg_rules = valid_rules; | 889 | regd->n_reg_rules = valid_rules; |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c index 79e7a7a285dc..82863e9273eb 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | |||
@@ -1275,8 +1275,10 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm) | |||
1275 | 1275 | ||
1276 | entry = &wifi_pkg->package.elements[idx++]; | 1276 | entry = &wifi_pkg->package.elements[idx++]; |
1277 | if ((entry->type != ACPI_TYPE_INTEGER) || | 1277 | if ((entry->type != ACPI_TYPE_INTEGER) || |
1278 | (entry->integer.value > U8_MAX)) | 1278 | (entry->integer.value > U8_MAX)) { |
1279 | return -EINVAL; | 1279 | ret = -EINVAL; |
1280 | goto out_free; | ||
1281 | } | ||
1280 | 1282 | ||
1281 | mvm->geo_profiles[i].values[j] = entry->integer.value; | 1283 | mvm->geo_profiles[i].values[j] = entry->integer.value; |
1282 | } | 1284 | } |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c index c7b1e58e3384..ce901be5fba8 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |||
@@ -2597,8 +2597,18 @@ static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm, | |||
2597 | spin_lock_bh(&mvm_sta->lock); | 2597 | spin_lock_bh(&mvm_sta->lock); |
2598 | for (i = 0; i <= IWL_MAX_TID_COUNT; i++) { | 2598 | for (i = 0; i <= IWL_MAX_TID_COUNT; i++) { |
2599 | tid_data = &mvm_sta->tid_data[i]; | 2599 | tid_data = &mvm_sta->tid_data[i]; |
2600 | while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames))) | 2600 | |
2601 | while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames))) { | ||
2602 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
2603 | |||
2604 | /* | ||
2605 | * The first deferred frame should've stopped the MAC | ||
2606 | * queues, so we should never get a second deferred | ||
2607 | * frame for the RA/TID. | ||
2608 | */ | ||
2609 | iwl_mvm_start_mac_queues(mvm, info->hw_queue); | ||
2601 | ieee80211_free_txskb(mvm->hw, skb); | 2610 | ieee80211_free_txskb(mvm->hw, skb); |
2611 | } | ||
2602 | } | 2612 | } |
2603 | spin_unlock_bh(&mvm_sta->lock); | 2613 | spin_unlock_bh(&mvm_sta->lock); |
2604 | } | 2614 | } |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c index 65beca3a457a..8999a1199d60 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c | |||
@@ -1291,7 +1291,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
1291 | * first index into rate scale table. | 1291 | * first index into rate scale table. |
1292 | */ | 1292 | */ |
1293 | if (info->flags & IEEE80211_TX_STAT_AMPDU) { | 1293 | if (info->flags & IEEE80211_TX_STAT_AMPDU) { |
1294 | rs_collect_tpc_data(mvm, lq_sta, curr_tbl, lq_rate.index, | 1294 | rs_collect_tpc_data(mvm, lq_sta, curr_tbl, tx_resp_rate.index, |
1295 | info->status.ampdu_len, | 1295 | info->status.ampdu_len, |
1296 | info->status.ampdu_ack_len, | 1296 | info->status.ampdu_ack_len, |
1297 | reduced_txp); | 1297 | reduced_txp); |
@@ -1312,7 +1312,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
1312 | if (info->status.ampdu_ack_len == 0) | 1312 | if (info->status.ampdu_ack_len == 0) |
1313 | info->status.ampdu_len = 1; | 1313 | info->status.ampdu_len = 1; |
1314 | 1314 | ||
1315 | rs_collect_tlc_data(mvm, lq_sta, curr_tbl, lq_rate.index, | 1315 | rs_collect_tlc_data(mvm, lq_sta, curr_tbl, tx_resp_rate.index, |
1316 | info->status.ampdu_len, | 1316 | info->status.ampdu_len, |
1317 | info->status.ampdu_ack_len); | 1317 | info->status.ampdu_ack_len); |
1318 | 1318 | ||
@@ -1348,11 +1348,11 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
1348 | continue; | 1348 | continue; |
1349 | 1349 | ||
1350 | rs_collect_tpc_data(mvm, lq_sta, tmp_tbl, | 1350 | rs_collect_tpc_data(mvm, lq_sta, tmp_tbl, |
1351 | lq_rate.index, 1, | 1351 | tx_resp_rate.index, 1, |
1352 | i < retries ? 0 : legacy_success, | 1352 | i < retries ? 0 : legacy_success, |
1353 | reduced_txp); | 1353 | reduced_txp); |
1354 | rs_collect_tlc_data(mvm, lq_sta, tmp_tbl, | 1354 | rs_collect_tlc_data(mvm, lq_sta, tmp_tbl, |
1355 | lq_rate.index, 1, | 1355 | tx_resp_rate.index, 1, |
1356 | i < retries ? 0 : legacy_success); | 1356 | i < retries ? 0 : legacy_success); |
1357 | } | 1357 | } |
1358 | 1358 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c index f3e608196369..71c8b800ffa9 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
@@ -636,9 +636,9 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |||
636 | 636 | ||
637 | baid_data = rcu_dereference(mvm->baid_map[baid]); | 637 | baid_data = rcu_dereference(mvm->baid_map[baid]); |
638 | if (!baid_data) { | 638 | if (!baid_data) { |
639 | WARN(!(reorder & IWL_RX_MPDU_REORDER_BA_OLD_SN), | 639 | IWL_DEBUG_RX(mvm, |
640 | "Received baid %d, but no data exists for this BAID\n", | 640 | "Got valid BAID but no baid allocated, bypass the re-ordering buffer. Baid %d reorder 0x%x\n", |
641 | baid); | 641 | baid, reorder); |
642 | return false; | 642 | return false; |
643 | } | 643 | } |
644 | 644 | ||
@@ -759,7 +759,9 @@ static void iwl_mvm_agg_rx_received(struct iwl_mvm *mvm, | |||
759 | 759 | ||
760 | data = rcu_dereference(mvm->baid_map[baid]); | 760 | data = rcu_dereference(mvm->baid_map[baid]); |
761 | if (!data) { | 761 | if (!data) { |
762 | WARN_ON(!(reorder_data & IWL_RX_MPDU_REORDER_BA_OLD_SN)); | 762 | IWL_DEBUG_RX(mvm, |
763 | "Got valid BAID but no baid allocated, bypass the re-ordering buffer. Baid %d reorder 0x%x\n", | ||
764 | baid, reorder_data); | ||
763 | goto out; | 765 | goto out; |
764 | } | 766 | } |
765 | 767 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c index ab66b4394dfc..027ee5e72172 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c | |||
@@ -121,7 +121,8 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta, | |||
121 | .mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color), | 121 | .mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color), |
122 | .add_modify = update ? 1 : 0, | 122 | .add_modify = update ? 1 : 0, |
123 | .station_flags_msk = cpu_to_le32(STA_FLG_FAT_EN_MSK | | 123 | .station_flags_msk = cpu_to_le32(STA_FLG_FAT_EN_MSK | |
124 | STA_FLG_MIMO_EN_MSK), | 124 | STA_FLG_MIMO_EN_MSK | |
125 | STA_FLG_RTS_MIMO_PROT), | ||
125 | .tid_disable_tx = cpu_to_le16(mvm_sta->tid_disable_agg), | 126 | .tid_disable_tx = cpu_to_le16(mvm_sta->tid_disable_agg), |
126 | }; | 127 | }; |
127 | int ret; | 128 | int ret; |
@@ -290,8 +291,8 @@ static void iwl_mvm_rx_agg_session_expired(unsigned long data) | |||
290 | goto unlock; | 291 | goto unlock; |
291 | 292 | ||
292 | mvm_sta = iwl_mvm_sta_from_mac80211(sta); | 293 | mvm_sta = iwl_mvm_sta_from_mac80211(sta); |
293 | ieee80211_stop_rx_ba_session_offl(mvm_sta->vif, | 294 | ieee80211_rx_ba_timer_expired(mvm_sta->vif, |
294 | sta->addr, ba_data->tid); | 295 | sta->addr, ba_data->tid); |
295 | unlock: | 296 | unlock: |
296 | rcu_read_unlock(); | 297 | rcu_read_unlock(); |
297 | } | 298 | } |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c index 60360ed73f26..5fcc9dd6be56 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c | |||
@@ -185,8 +185,14 @@ static u16 iwl_mvm_tx_csum(struct iwl_mvm *mvm, struct sk_buff *skb, | |||
185 | else | 185 | else |
186 | udp_hdr(skb)->check = 0; | 186 | udp_hdr(skb)->check = 0; |
187 | 187 | ||
188 | /* mac header len should include IV, size is in words */ | 188 | /* |
189 | if (info->control.hw_key) | 189 | * mac header len should include IV, size is in words unless |
190 | * the IV is added by the firmware like in WEP. | ||
191 | * In new Tx API, the IV is always added by the firmware. | ||
192 | */ | ||
193 | if (!iwl_mvm_has_new_tx_api(mvm) && info->control.hw_key && | ||
194 | info->control.hw_key->cipher != WLAN_CIPHER_SUITE_WEP40 && | ||
195 | info->control.hw_key->cipher != WLAN_CIPHER_SUITE_WEP104) | ||
190 | mh_len += info->control.hw_key->iv_len; | 196 | mh_len += info->control.hw_key->iv_len; |
191 | mh_len /= 2; | 197 | mh_len /= 2; |
192 | offload_assist |= mh_len << TX_CMD_OFFLD_MH_SIZE; | 198 | offload_assist |= mh_len << TX_CMD_OFFLD_MH_SIZE; |
@@ -1815,6 +1821,8 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb) | |||
1815 | struct iwl_mvm_tid_data *tid_data; | 1821 | struct iwl_mvm_tid_data *tid_data; |
1816 | struct iwl_mvm_sta *mvmsta; | 1822 | struct iwl_mvm_sta *mvmsta; |
1817 | 1823 | ||
1824 | ba_info.flags = IEEE80211_TX_STAT_AMPDU; | ||
1825 | |||
1818 | if (iwl_mvm_has_new_tx_api(mvm)) { | 1826 | if (iwl_mvm_has_new_tx_api(mvm)) { |
1819 | struct iwl_mvm_compressed_ba_notif *ba_res = | 1827 | struct iwl_mvm_compressed_ba_notif *ba_res = |
1820 | (void *)pkt->data; | 1828 | (void *)pkt->data; |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c index f16c1bb9bf94..84f4ba01e14f 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c | |||
@@ -510,9 +510,17 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
510 | 510 | ||
511 | /* 9000 Series */ | 511 | /* 9000 Series */ |
512 | {IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)}, | 512 | {IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)}, |
513 | {IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)}, | ||
514 | {IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)}, | ||
513 | {IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)}, | 515 | {IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)}, |
514 | {IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_cfg)}, | 516 | {IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_cfg)}, |
517 | {IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_cfg)}, | ||
518 | {IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_cfg)}, | ||
519 | {IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_cfg)}, | ||
520 | {IWL_PCI_DEVICE(0x2526, 0x0210, iwl9260_2ac_cfg)}, | ||
521 | {IWL_PCI_DEVICE(0x2526, 0x0214, iwl9260_2ac_cfg)}, | ||
515 | {IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)}, | 522 | {IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)}, |
523 | {IWL_PCI_DEVICE(0x2526, 0x1610, iwl9270_2ac_cfg)}, | ||
516 | {IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg)}, | 524 | {IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg)}, |
517 | {IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg)}, | 525 | {IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg)}, |
518 | {IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9460_2ac_cfg)}, | 526 | {IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9460_2ac_cfg)}, |
@@ -527,10 +535,22 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
527 | {IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg)}, | 535 | {IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg)}, |
528 | {IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg)}, | 536 | {IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg)}, |
529 | {IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)}, | 537 | {IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)}, |
538 | {IWL_PCI_DEVICE(0x2526, 0x0260, iwl9460_2ac_cfg)}, | ||
539 | {IWL_PCI_DEVICE(0x2526, 0x0064, iwl9460_2ac_cfg)}, | ||
540 | {IWL_PCI_DEVICE(0x2526, 0x00A4, iwl9460_2ac_cfg)}, | ||
541 | {IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)}, | ||
542 | {IWL_PCI_DEVICE(0x2526, 0x02A4, iwl9460_2ac_cfg)}, | ||
543 | {IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9460_2ac_cfg)}, | ||
544 | {IWL_PCI_DEVICE(0x2526, 0x02A0, iwl9460_2ac_cfg)}, | ||
530 | {IWL_PCI_DEVICE(0x9DF0, 0x0060, iwl9460_2ac_cfg)}, | 545 | {IWL_PCI_DEVICE(0x9DF0, 0x0060, iwl9460_2ac_cfg)}, |
531 | {IWL_PCI_DEVICE(0xA370, 0x0060, iwl9460_2ac_cfg)}, | 546 | {IWL_PCI_DEVICE(0xA370, 0x0060, iwl9460_2ac_cfg)}, |
532 | {IWL_PCI_DEVICE(0x31DC, 0x0060, iwl9460_2ac_cfg)}, | 547 | {IWL_PCI_DEVICE(0x31DC, 0x0060, iwl9460_2ac_cfg)}, |
533 | {IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)}, | 548 | {IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)}, |
549 | {IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_cfg)}, | ||
550 | {IWL_PCI_DEVICE(0x2526, 0x0230, iwl9560_2ac_cfg)}, | ||
551 | {IWL_PCI_DEVICE(0x2526, 0x0234, iwl9560_2ac_cfg)}, | ||
552 | {IWL_PCI_DEVICE(0x2526, 0x0238, iwl9560_2ac_cfg)}, | ||
553 | {IWL_PCI_DEVICE(0x2526, 0x023C, iwl9560_2ac_cfg)}, | ||
534 | {IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg)}, | 554 | {IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg)}, |
535 | {IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg)}, | 555 | {IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg)}, |
536 | {IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg)}, | 556 | {IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg)}, |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index b4b7eab29400..da5570cf5c6a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -522,10 +522,11 @@ struct pci_dev *pci_find_pcie_root_port(struct pci_dev *dev) | |||
522 | bridge = pci_upstream_bridge(bridge); | 522 | bridge = pci_upstream_bridge(bridge); |
523 | } | 523 | } |
524 | 524 | ||
525 | if (pci_pcie_type(highest_pcie_bridge) != PCI_EXP_TYPE_ROOT_PORT) | 525 | if (highest_pcie_bridge && |
526 | return NULL; | 526 | pci_pcie_type(highest_pcie_bridge) == PCI_EXP_TYPE_ROOT_PORT) |
527 | return highest_pcie_bridge; | ||
527 | 528 | ||
528 | return highest_pcie_bridge; | 529 | return NULL; |
529 | } | 530 | } |
530 | EXPORT_SYMBOL(pci_find_pcie_root_port); | 531 | EXPORT_SYMBOL(pci_find_pcie_root_port); |
531 | 532 | ||
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index c31310db0404..e6a917b4acd3 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -1762,6 +1762,48 @@ static void pci_configure_extended_tags(struct pci_dev *dev) | |||
1762 | PCI_EXP_DEVCTL_EXT_TAG); | 1762 | PCI_EXP_DEVCTL_EXT_TAG); |
1763 | } | 1763 | } |
1764 | 1764 | ||
1765 | /** | ||
1766 | * pcie_relaxed_ordering_enabled - Probe for PCIe relaxed ordering enable | ||
1767 | * @dev: PCI device to query | ||
1768 | * | ||
1769 | * Returns true if the device has enabled relaxed ordering attribute. | ||
1770 | */ | ||
1771 | bool pcie_relaxed_ordering_enabled(struct pci_dev *dev) | ||
1772 | { | ||
1773 | u16 v; | ||
1774 | |||
1775 | pcie_capability_read_word(dev, PCI_EXP_DEVCTL, &v); | ||
1776 | |||
1777 | return !!(v & PCI_EXP_DEVCTL_RELAX_EN); | ||
1778 | } | ||
1779 | EXPORT_SYMBOL(pcie_relaxed_ordering_enabled); | ||
1780 | |||
1781 | static void pci_configure_relaxed_ordering(struct pci_dev *dev) | ||
1782 | { | ||
1783 | struct pci_dev *root; | ||
1784 | |||
1785 | /* PCI_EXP_DEVICE_RELAX_EN is RsvdP in VFs */ | ||
1786 | if (dev->is_virtfn) | ||
1787 | return; | ||
1788 | |||
1789 | if (!pcie_relaxed_ordering_enabled(dev)) | ||
1790 | return; | ||
1791 | |||
1792 | /* | ||
1793 | * For now, we only deal with Relaxed Ordering issues with Root | ||
1794 | * Ports. Peer-to-Peer DMA is another can of worms. | ||
1795 | */ | ||
1796 | root = pci_find_pcie_root_port(dev); | ||
1797 | if (!root) | ||
1798 | return; | ||
1799 | |||
1800 | if (root->dev_flags & PCI_DEV_FLAGS_NO_RELAXED_ORDERING) { | ||
1801 | pcie_capability_clear_word(dev, PCI_EXP_DEVCTL, | ||
1802 | PCI_EXP_DEVCTL_RELAX_EN); | ||
1803 | dev_info(&dev->dev, "Disable Relaxed Ordering because the Root Port didn't support it\n"); | ||
1804 | } | ||
1805 | } | ||
1806 | |||
1765 | static void pci_configure_device(struct pci_dev *dev) | 1807 | static void pci_configure_device(struct pci_dev *dev) |
1766 | { | 1808 | { |
1767 | struct hotplug_params hpp; | 1809 | struct hotplug_params hpp; |
@@ -1769,6 +1811,7 @@ static void pci_configure_device(struct pci_dev *dev) | |||
1769 | 1811 | ||
1770 | pci_configure_mps(dev); | 1812 | pci_configure_mps(dev); |
1771 | pci_configure_extended_tags(dev); | 1813 | pci_configure_extended_tags(dev); |
1814 | pci_configure_relaxed_ordering(dev); | ||
1772 | 1815 | ||
1773 | memset(&hpp, 0, sizeof(hpp)); | 1816 | memset(&hpp, 0, sizeof(hpp)); |
1774 | ret = pci_get_hp_params(dev, &hpp); | 1817 | ret = pci_get_hp_params(dev, &hpp); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6967c6b4cf6b..140760403f36 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -4016,6 +4016,95 @@ DECLARE_PCI_FIXUP_CLASS_EARLY(0x1797, 0x6869, PCI_CLASS_NOT_DEFINED, 8, | |||
4016 | quirk_tw686x_class); | 4016 | quirk_tw686x_class); |
4017 | 4017 | ||
4018 | /* | 4018 | /* |
4019 | * Some devices have problems with Transaction Layer Packets with the Relaxed | ||
4020 | * Ordering Attribute set. Such devices should mark themselves and other | ||
4021 | * Device Drivers should check before sending TLPs with RO set. | ||
4022 | */ | ||
4023 | static void quirk_relaxedordering_disable(struct pci_dev *dev) | ||
4024 | { | ||
4025 | dev->dev_flags |= PCI_DEV_FLAGS_NO_RELAXED_ORDERING; | ||
4026 | dev_info(&dev->dev, "Disable Relaxed Ordering Attributes to avoid PCIe Completion erratum\n"); | ||
4027 | } | ||
4028 | |||
4029 | /* | ||
4030 | * Intel Xeon processors based on Broadwell/Haswell microarchitecture Root | ||
4031 | * Complex has a Flow Control Credit issue which can cause performance | ||
4032 | * problems with Upstream Transaction Layer Packets with Relaxed Ordering set. | ||
4033 | */ | ||
4034 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f01, PCI_CLASS_NOT_DEFINED, 8, | ||
4035 | quirk_relaxedordering_disable); | ||
4036 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f02, PCI_CLASS_NOT_DEFINED, 8, | ||
4037 | quirk_relaxedordering_disable); | ||
4038 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f03, PCI_CLASS_NOT_DEFINED, 8, | ||
4039 | quirk_relaxedordering_disable); | ||
4040 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f04, PCI_CLASS_NOT_DEFINED, 8, | ||
4041 | quirk_relaxedordering_disable); | ||
4042 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f05, PCI_CLASS_NOT_DEFINED, 8, | ||
4043 | quirk_relaxedordering_disable); | ||
4044 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f06, PCI_CLASS_NOT_DEFINED, 8, | ||
4045 | quirk_relaxedordering_disable); | ||
4046 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f07, PCI_CLASS_NOT_DEFINED, 8, | ||
4047 | quirk_relaxedordering_disable); | ||
4048 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f08, PCI_CLASS_NOT_DEFINED, 8, | ||
4049 | quirk_relaxedordering_disable); | ||
4050 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f09, PCI_CLASS_NOT_DEFINED, 8, | ||
4051 | quirk_relaxedordering_disable); | ||
4052 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0a, PCI_CLASS_NOT_DEFINED, 8, | ||
4053 | quirk_relaxedordering_disable); | ||
4054 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0b, PCI_CLASS_NOT_DEFINED, 8, | ||
4055 | quirk_relaxedordering_disable); | ||
4056 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0c, PCI_CLASS_NOT_DEFINED, 8, | ||
4057 | quirk_relaxedordering_disable); | ||
4058 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0d, PCI_CLASS_NOT_DEFINED, 8, | ||
4059 | quirk_relaxedordering_disable); | ||
4060 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x6f0e, PCI_CLASS_NOT_DEFINED, 8, | ||
4061 | quirk_relaxedordering_disable); | ||
4062 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f01, PCI_CLASS_NOT_DEFINED, 8, | ||
4063 | quirk_relaxedordering_disable); | ||
4064 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f02, PCI_CLASS_NOT_DEFINED, 8, | ||
4065 | quirk_relaxedordering_disable); | ||
4066 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f03, PCI_CLASS_NOT_DEFINED, 8, | ||
4067 | quirk_relaxedordering_disable); | ||
4068 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f04, PCI_CLASS_NOT_DEFINED, 8, | ||
4069 | quirk_relaxedordering_disable); | ||
4070 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f05, PCI_CLASS_NOT_DEFINED, 8, | ||
4071 | quirk_relaxedordering_disable); | ||
4072 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f06, PCI_CLASS_NOT_DEFINED, 8, | ||
4073 | quirk_relaxedordering_disable); | ||
4074 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f07, PCI_CLASS_NOT_DEFINED, 8, | ||
4075 | quirk_relaxedordering_disable); | ||
4076 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f08, PCI_CLASS_NOT_DEFINED, 8, | ||
4077 | quirk_relaxedordering_disable); | ||
4078 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f09, PCI_CLASS_NOT_DEFINED, 8, | ||
4079 | quirk_relaxedordering_disable); | ||
4080 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0a, PCI_CLASS_NOT_DEFINED, 8, | ||
4081 | quirk_relaxedordering_disable); | ||
4082 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0b, PCI_CLASS_NOT_DEFINED, 8, | ||
4083 | quirk_relaxedordering_disable); | ||
4084 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0c, PCI_CLASS_NOT_DEFINED, 8, | ||
4085 | quirk_relaxedordering_disable); | ||
4086 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0d, PCI_CLASS_NOT_DEFINED, 8, | ||
4087 | quirk_relaxedordering_disable); | ||
4088 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_INTEL, 0x2f0e, PCI_CLASS_NOT_DEFINED, 8, | ||
4089 | quirk_relaxedordering_disable); | ||
4090 | |||
4091 | /* | ||
4092 | * The AMD ARM A1100 (AKA "SEATTLE") SoC has a bug in its PCIe Root Complex | ||
4093 | * where Upstream Transaction Layer Packets with the Relaxed Ordering | ||
4094 | * Attribute clear are allowed to bypass earlier TLPs with Relaxed Ordering | ||
4095 | * set. This is a violation of the PCIe 3.0 Transaction Ordering Rules | ||
4096 | * outlined in Section 2.4.1 (PCI Express(r) Base Specification Revision 3.0 | ||
4097 | * November 10, 2010). As a result, on this platform we can't use Relaxed | ||
4098 | * Ordering for Upstream TLPs. | ||
4099 | */ | ||
4100 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a00, PCI_CLASS_NOT_DEFINED, 8, | ||
4101 | quirk_relaxedordering_disable); | ||
4102 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a01, PCI_CLASS_NOT_DEFINED, 8, | ||
4103 | quirk_relaxedordering_disable); | ||
4104 | DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AMD, 0x1a02, PCI_CLASS_NOT_DEFINED, 8, | ||
4105 | quirk_relaxedordering_disable); | ||
4106 | |||
4107 | /* | ||
4019 | * Per PCIe r3.0, sec 2.2.9, "Completion headers must supply the same | 4108 | * Per PCIe r3.0, sec 2.2.9, "Completion headers must supply the same |
4020 | * values for the Attribute as were supplied in the header of the | 4109 | * values for the Attribute as were supplied in the header of the |
4021 | * corresponding Request, except as explicitly allowed when IDO is used." | 4110 | * corresponding Request, except as explicitly allowed when IDO is used." |
diff --git a/include/linux/net.h b/include/linux/net.h index dda2cc939a53..ebeb48c92005 100644 --- a/include/linux/net.h +++ b/include/linux/net.h | |||
@@ -37,7 +37,7 @@ struct net; | |||
37 | 37 | ||
38 | /* Historically, SOCKWQ_ASYNC_NOSPACE & SOCKWQ_ASYNC_WAITDATA were located | 38 | /* Historically, SOCKWQ_ASYNC_NOSPACE & SOCKWQ_ASYNC_WAITDATA were located |
39 | * in sock->flags, but moved into sk->sk_wq->flags to be RCU protected. | 39 | * in sock->flags, but moved into sk->sk_wq->flags to be RCU protected. |
40 | * Eventually all flags will be in sk->sk_wq_flags. | 40 | * Eventually all flags will be in sk->sk_wq->flags. |
41 | */ | 41 | */ |
42 | #define SOCKWQ_ASYNC_NOSPACE 0 | 42 | #define SOCKWQ_ASYNC_NOSPACE 0 |
43 | #define SOCKWQ_ASYNC_WAITDATA 1 | 43 | #define SOCKWQ_ASYNC_WAITDATA 1 |
diff --git a/include/linux/pci.h b/include/linux/pci.h index a75c13673852..f958d0732af6 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -188,6 +188,8 @@ enum pci_dev_flags { | |||
188 | * the direct_complete optimization. | 188 | * the direct_complete optimization. |
189 | */ | 189 | */ |
190 | PCI_DEV_FLAGS_NEEDS_RESUME = (__force pci_dev_flags_t) (1 << 11), | 190 | PCI_DEV_FLAGS_NEEDS_RESUME = (__force pci_dev_flags_t) (1 << 11), |
191 | /* Don't use Relaxed Ordering for TLPs directed at this device */ | ||
192 | PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 12), | ||
191 | }; | 193 | }; |
192 | 194 | ||
193 | enum pci_irq_reroute_variant { | 195 | enum pci_irq_reroute_variant { |
@@ -1126,6 +1128,7 @@ bool pci_check_pme_status(struct pci_dev *dev); | |||
1126 | void pci_pme_wakeup_bus(struct pci_bus *bus); | 1128 | void pci_pme_wakeup_bus(struct pci_bus *bus); |
1127 | void pci_d3cold_enable(struct pci_dev *dev); | 1129 | void pci_d3cold_enable(struct pci_dev *dev); |
1128 | void pci_d3cold_disable(struct pci_dev *dev); | 1130 | void pci_d3cold_disable(struct pci_dev *dev); |
1131 | bool pcie_relaxed_ordering_enabled(struct pci_dev *dev); | ||
1129 | 1132 | ||
1130 | /* PCI Virtual Channel */ | 1133 | /* PCI Virtual Channel */ |
1131 | int pci_save_vc_state(struct pci_dev *dev); | 1134 | int pci_save_vc_state(struct pci_dev *dev); |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 6df79e96a780..f44ff2476758 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
@@ -336,6 +336,16 @@ static inline void in6_dev_put(struct inet6_dev *idev) | |||
336 | in6_dev_finish_destroy(idev); | 336 | in6_dev_finish_destroy(idev); |
337 | } | 337 | } |
338 | 338 | ||
339 | static inline void in6_dev_put_clear(struct inet6_dev **pidev) | ||
340 | { | ||
341 | struct inet6_dev *idev = *pidev; | ||
342 | |||
343 | if (idev) { | ||
344 | in6_dev_put(idev); | ||
345 | *pidev = NULL; | ||
346 | } | ||
347 | } | ||
348 | |||
339 | static inline void __in6_dev_put(struct inet6_dev *idev) | 349 | static inline void __in6_dev_put(struct inet6_dev *idev) |
340 | { | 350 | { |
341 | refcount_dec(&idev->refcnt); | 351 | refcount_dec(&idev->refcnt); |
diff --git a/include/net/bonding.h b/include/net/bonding.h index b00508d22e0a..b2e68657a216 100644 --- a/include/net/bonding.h +++ b/include/net/bonding.h | |||
@@ -277,6 +277,11 @@ static inline bool bond_is_lb(const struct bonding *bond) | |||
277 | BOND_MODE(bond) == BOND_MODE_ALB; | 277 | BOND_MODE(bond) == BOND_MODE_ALB; |
278 | } | 278 | } |
279 | 279 | ||
280 | static inline bool bond_needs_speed_duplex(const struct bonding *bond) | ||
281 | { | ||
282 | return BOND_MODE(bond) == BOND_MODE_8023AD || bond_is_lb(bond); | ||
283 | } | ||
284 | |||
280 | static inline bool bond_is_nondyn_tlb(const struct bonding *bond) | 285 | static inline bool bond_is_nondyn_tlb(const struct bonding *bond) |
281 | { | 286 | { |
282 | return (BOND_MODE(bond) == BOND_MODE_TLB) && | 287 | return (BOND_MODE(bond) == BOND_MODE_TLB) && |
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h index 8ffd434676b7..71c72a939bf8 100644 --- a/include/net/busy_poll.h +++ b/include/net/busy_poll.h | |||
@@ -29,18 +29,18 @@ | |||
29 | #include <linux/sched/signal.h> | 29 | #include <linux/sched/signal.h> |
30 | #include <net/ip.h> | 30 | #include <net/ip.h> |
31 | 31 | ||
32 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
33 | |||
34 | struct napi_struct; | ||
35 | extern unsigned int sysctl_net_busy_read __read_mostly; | ||
36 | extern unsigned int sysctl_net_busy_poll __read_mostly; | ||
37 | |||
38 | /* 0 - Reserved to indicate value not set | 32 | /* 0 - Reserved to indicate value not set |
39 | * 1..NR_CPUS - Reserved for sender_cpu | 33 | * 1..NR_CPUS - Reserved for sender_cpu |
40 | * NR_CPUS+1..~0 - Region available for NAPI IDs | 34 | * NR_CPUS+1..~0 - Region available for NAPI IDs |
41 | */ | 35 | */ |
42 | #define MIN_NAPI_ID ((unsigned int)(NR_CPUS + 1)) | 36 | #define MIN_NAPI_ID ((unsigned int)(NR_CPUS + 1)) |
43 | 37 | ||
38 | #ifdef CONFIG_NET_RX_BUSY_POLL | ||
39 | |||
40 | struct napi_struct; | ||
41 | extern unsigned int sysctl_net_busy_read __read_mostly; | ||
42 | extern unsigned int sysctl_net_busy_poll __read_mostly; | ||
43 | |||
44 | static inline bool net_busy_loop_on(void) | 44 | static inline bool net_busy_loop_on(void) |
45 | { | 45 | { |
46 | return sysctl_net_busy_poll; | 46 | return sysctl_net_busy_poll; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index b2b5419467cc..f8149ca192b4 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -5499,6 +5499,21 @@ static inline void ieee80211_stop_rx_ba_session_offl(struct ieee80211_vif *vif, | |||
5499 | ieee80211_manage_rx_ba_offl(vif, addr, tid + IEEE80211_NUM_TIDS); | 5499 | ieee80211_manage_rx_ba_offl(vif, addr, tid + IEEE80211_NUM_TIDS); |
5500 | } | 5500 | } |
5501 | 5501 | ||
5502 | /** | ||
5503 | * ieee80211_rx_ba_timer_expired - stop a Rx BA session due to timeout | ||
5504 | * | ||
5505 | * Some device drivers do not offload AddBa/DelBa negotiation, but handle rx | ||
5506 | * buffer reording internally, and therefore also handle the session timer. | ||
5507 | * | ||
5508 | * Trigger the timeout flow, which sends a DelBa. | ||
5509 | * | ||
5510 | * @vif: &struct ieee80211_vif pointer from the add_interface callback | ||
5511 | * @addr: station mac address | ||
5512 | * @tid: the rx tid | ||
5513 | */ | ||
5514 | void ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif, | ||
5515 | const u8 *addr, unsigned int tid); | ||
5516 | |||
5502 | /* Rate control API */ | 5517 | /* Rate control API */ |
5503 | 5518 | ||
5504 | /** | 5519 | /** |
diff --git a/include/net/udp.h b/include/net/udp.h index cc8036987dcb..586de4b811b5 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
@@ -366,12 +366,13 @@ static inline bool udp_skb_is_linear(struct sk_buff *skb) | |||
366 | static inline int copy_linear_skb(struct sk_buff *skb, int len, int off, | 366 | static inline int copy_linear_skb(struct sk_buff *skb, int len, int off, |
367 | struct iov_iter *to) | 367 | struct iov_iter *to) |
368 | { | 368 | { |
369 | int n, copy = len - off; | 369 | int n; |
370 | 370 | ||
371 | n = copy_to_iter(skb->data + off, copy, to); | 371 | n = copy_to_iter(skb->data + off, len, to); |
372 | if (n == copy) | 372 | if (n == len) |
373 | return 0; | 373 | return 0; |
374 | 374 | ||
375 | iov_iter_revert(to, n); | ||
375 | return -EFAULT; | 376 | return -EFAULT; |
376 | } | 377 | } |
377 | 378 | ||
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c index 37385193a608..dc498b605d5d 100644 --- a/kernel/trace/bpf_trace.c +++ b/kernel/trace/bpf_trace.c | |||
@@ -204,10 +204,36 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1, | |||
204 | fmt_cnt++; | 204 | fmt_cnt++; |
205 | } | 205 | } |
206 | 206 | ||
207 | return __trace_printk(1/* fake ip will not be printed */, fmt, | 207 | /* Horrid workaround for getting va_list handling working with different |
208 | mod[0] == 2 ? arg1 : mod[0] == 1 ? (long) arg1 : (u32) arg1, | 208 | * argument type combinations generically for 32 and 64 bit archs. |
209 | mod[1] == 2 ? arg2 : mod[1] == 1 ? (long) arg2 : (u32) arg2, | 209 | */ |
210 | mod[2] == 2 ? arg3 : mod[2] == 1 ? (long) arg3 : (u32) arg3); | 210 | #define __BPF_TP_EMIT() __BPF_ARG3_TP() |
211 | #define __BPF_TP(...) \ | ||
212 | __trace_printk(1 /* Fake ip will not be printed. */, \ | ||
213 | fmt, ##__VA_ARGS__) | ||
214 | |||
215 | #define __BPF_ARG1_TP(...) \ | ||
216 | ((mod[0] == 2 || (mod[0] == 1 && __BITS_PER_LONG == 64)) \ | ||
217 | ? __BPF_TP(arg1, ##__VA_ARGS__) \ | ||
218 | : ((mod[0] == 1 || (mod[0] == 0 && __BITS_PER_LONG == 32)) \ | ||
219 | ? __BPF_TP((long)arg1, ##__VA_ARGS__) \ | ||
220 | : __BPF_TP((u32)arg1, ##__VA_ARGS__))) | ||
221 | |||
222 | #define __BPF_ARG2_TP(...) \ | ||
223 | ((mod[1] == 2 || (mod[1] == 1 && __BITS_PER_LONG == 64)) \ | ||
224 | ? __BPF_ARG1_TP(arg2, ##__VA_ARGS__) \ | ||
225 | : ((mod[1] == 1 || (mod[1] == 0 && __BITS_PER_LONG == 32)) \ | ||
226 | ? __BPF_ARG1_TP((long)arg2, ##__VA_ARGS__) \ | ||
227 | : __BPF_ARG1_TP((u32)arg2, ##__VA_ARGS__))) | ||
228 | |||
229 | #define __BPF_ARG3_TP(...) \ | ||
230 | ((mod[2] == 2 || (mod[2] == 1 && __BITS_PER_LONG == 64)) \ | ||
231 | ? __BPF_ARG2_TP(arg3, ##__VA_ARGS__) \ | ||
232 | : ((mod[2] == 1 || (mod[2] == 0 && __BITS_PER_LONG == 32)) \ | ||
233 | ? __BPF_ARG2_TP((long)arg3, ##__VA_ARGS__) \ | ||
234 | : __BPF_ARG2_TP((u32)arg3, ##__VA_ARGS__))) | ||
235 | |||
236 | return __BPF_TP_EMIT(); | ||
211 | } | 237 | } |
212 | 238 | ||
213 | static const struct bpf_func_proto bpf_trace_printk_proto = { | 239 | static const struct bpf_func_proto bpf_trace_printk_proto = { |
diff --git a/net/core/filter.c b/net/core/filter.c index f44fc22fd45a..6280a602604c 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -3505,6 +3505,7 @@ static u32 bpf_convert_ctx_access(enum bpf_access_type type, | |||
3505 | bpf_target_off(struct sk_buff, tc_index, 2, | 3505 | bpf_target_off(struct sk_buff, tc_index, 2, |
3506 | target_size)); | 3506 | target_size)); |
3507 | #else | 3507 | #else |
3508 | *target_size = 2; | ||
3508 | if (type == BPF_WRITE) | 3509 | if (type == BPF_WRITE) |
3509 | *insn++ = BPF_MOV64_REG(si->dst_reg, si->dst_reg); | 3510 | *insn++ = BPF_MOV64_REG(si->dst_reg, si->dst_reg); |
3510 | else | 3511 | else |
@@ -3520,6 +3521,7 @@ static u32 bpf_convert_ctx_access(enum bpf_access_type type, | |||
3520 | *insn++ = BPF_JMP_IMM(BPF_JGE, si->dst_reg, MIN_NAPI_ID, 1); | 3521 | *insn++ = BPF_JMP_IMM(BPF_JGE, si->dst_reg, MIN_NAPI_ID, 1); |
3521 | *insn++ = BPF_MOV64_IMM(si->dst_reg, 0); | 3522 | *insn++ = BPF_MOV64_IMM(si->dst_reg, 0); |
3522 | #else | 3523 | #else |
3524 | *target_size = 4; | ||
3523 | *insn++ = BPF_MOV64_IMM(si->dst_reg, 0); | 3525 | *insn++ = BPF_MOV64_IMM(si->dst_reg, 0); |
3524 | #endif | 3526 | #endif |
3525 | break; | 3527 | break; |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index 9fe25bf63296..86bc40ba6ba5 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -201,10 +201,7 @@ void dccp_destroy_sock(struct sock *sk) | |||
201 | { | 201 | { |
202 | struct dccp_sock *dp = dccp_sk(sk); | 202 | struct dccp_sock *dp = dccp_sk(sk); |
203 | 203 | ||
204 | /* | 204 | __skb_queue_purge(&sk->sk_write_queue); |
205 | * DCCP doesn't use sk_write_queue, just sk_send_head | ||
206 | * for retransmissions | ||
207 | */ | ||
208 | if (sk->sk_send_head != NULL) { | 205 | if (sk->sk_send_head != NULL) { |
209 | kfree_skb(sk->sk_send_head); | 206 | kfree_skb(sk->sk_send_head); |
210 | sk->sk_send_head = NULL; | 207 | sk->sk_send_head = NULL; |
diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index fab41de8e983..de66ca8e6201 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c | |||
@@ -42,6 +42,9 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) | |||
42 | padlen = (skb->len >= ETH_ZLEN) ? 0 : ETH_ZLEN - skb->len; | 42 | padlen = (skb->len >= ETH_ZLEN) ? 0 : ETH_ZLEN - skb->len; |
43 | 43 | ||
44 | if (skb_tailroom(skb) >= padlen + KSZ_INGRESS_TAG_LEN) { | 44 | if (skb_tailroom(skb) >= padlen + KSZ_INGRESS_TAG_LEN) { |
45 | if (skb_put_padto(skb, skb->len + padlen)) | ||
46 | return NULL; | ||
47 | |||
45 | nskb = skb; | 48 | nskb = skb; |
46 | } else { | 49 | } else { |
47 | nskb = alloc_skb(NET_IP_ALIGN + skb->len + | 50 | nskb = alloc_skb(NET_IP_ALIGN + skb->len + |
@@ -56,13 +59,15 @@ static struct sk_buff *ksz_xmit(struct sk_buff *skb, struct net_device *dev) | |||
56 | skb_set_transport_header(nskb, | 59 | skb_set_transport_header(nskb, |
57 | skb_transport_header(skb) - skb->head); | 60 | skb_transport_header(skb) - skb->head); |
58 | skb_copy_and_csum_dev(skb, skb_put(nskb, skb->len)); | 61 | skb_copy_and_csum_dev(skb, skb_put(nskb, skb->len)); |
62 | |||
63 | if (skb_put_padto(nskb, nskb->len + padlen)) { | ||
64 | kfree_skb(nskb); | ||
65 | return NULL; | ||
66 | } | ||
67 | |||
59 | kfree_skb(skb); | 68 | kfree_skb(skb); |
60 | } | 69 | } |
61 | 70 | ||
62 | /* skb is freed when it fails */ | ||
63 | if (skb_put_padto(nskb, nskb->len + padlen)) | ||
64 | return NULL; | ||
65 | |||
66 | tag = skb_put(nskb, KSZ_INGRESS_TAG_LEN); | 71 | tag = skb_put(nskb, KSZ_INGRESS_TAG_LEN); |
67 | tag[0] = 0; | 72 | tag[0] = 0; |
68 | tag[1] = 1 << p->dp->index; /* destination port */ | 73 | tag[1] = 1 << p->dp->index; /* destination port */ |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index b8d18171cca3..ec3a9ce281a6 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -1083,15 +1083,17 @@ struct fib_info *fib_create_info(struct fib_config *cfg, | |||
1083 | fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL); | 1083 | fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL); |
1084 | if (!fi) | 1084 | if (!fi) |
1085 | goto failure; | 1085 | goto failure; |
1086 | fib_info_cnt++; | ||
1087 | if (cfg->fc_mx) { | 1086 | if (cfg->fc_mx) { |
1088 | fi->fib_metrics = kzalloc(sizeof(*fi->fib_metrics), GFP_KERNEL); | 1087 | fi->fib_metrics = kzalloc(sizeof(*fi->fib_metrics), GFP_KERNEL); |
1089 | if (!fi->fib_metrics) | 1088 | if (unlikely(!fi->fib_metrics)) { |
1090 | goto failure; | 1089 | kfree(fi); |
1090 | return ERR_PTR(err); | ||
1091 | } | ||
1091 | atomic_set(&fi->fib_metrics->refcnt, 1); | 1092 | atomic_set(&fi->fib_metrics->refcnt, 1); |
1092 | } else | 1093 | } else { |
1093 | fi->fib_metrics = (struct dst_metrics *)&dst_default_metrics; | 1094 | fi->fib_metrics = (struct dst_metrics *)&dst_default_metrics; |
1094 | 1095 | } | |
1096 | fib_info_cnt++; | ||
1095 | fi->fib_net = net; | 1097 | fi->fib_net = net; |
1096 | fi->fib_protocol = cfg->fc_protocol; | 1098 | fi->fib_protocol = cfg->fc_protocol; |
1097 | fi->fib_scope = cfg->fc_scope; | 1099 | fi->fib_scope = cfg->fc_scope; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 0383e66f59bc..7effa62beed3 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2750,12 +2750,13 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, | |||
2750 | err = 0; | 2750 | err = 0; |
2751 | if (IS_ERR(rt)) | 2751 | if (IS_ERR(rt)) |
2752 | err = PTR_ERR(rt); | 2752 | err = PTR_ERR(rt); |
2753 | else | ||
2754 | skb_dst_set(skb, &rt->dst); | ||
2753 | } | 2755 | } |
2754 | 2756 | ||
2755 | if (err) | 2757 | if (err) |
2756 | goto errout_free; | 2758 | goto errout_free; |
2757 | 2759 | ||
2758 | skb_dst_set(skb, &rt->dst); | ||
2759 | if (rtm->rtm_flags & RTM_F_NOTIFY) | 2760 | if (rtm->rtm_flags & RTM_F_NOTIFY) |
2760 | rt->rt_flags |= RTCF_NOTIFY; | 2761 | rt->rt_flags |= RTCF_NOTIFY; |
2761 | 2762 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index a20e7f03d5f7..e9252c7df809 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -1722,6 +1722,8 @@ process: | |||
1722 | */ | 1722 | */ |
1723 | sock_hold(sk); | 1723 | sock_hold(sk); |
1724 | refcounted = true; | 1724 | refcounted = true; |
1725 | if (tcp_filter(sk, skb)) | ||
1726 | goto discard_and_relse; | ||
1725 | nsk = tcp_check_req(sk, skb, req, false); | 1727 | nsk = tcp_check_req(sk, skb, req, false); |
1726 | if (!nsk) { | 1728 | if (!nsk) { |
1727 | reqsk_put(req); | 1729 | reqsk_put(req); |
@@ -1729,8 +1731,6 @@ process: | |||
1729 | } | 1731 | } |
1730 | if (nsk == sk) { | 1732 | if (nsk == sk) { |
1731 | reqsk_put(req); | 1733 | reqsk_put(req); |
1732 | } else if (tcp_filter(sk, skb)) { | ||
1733 | goto discard_and_relse; | ||
1734 | } else if (tcp_child_process(sk, nsk, skb)) { | 1734 | } else if (tcp_child_process(sk, nsk, skb)) { |
1735 | tcp_v4_send_reset(nsk, skb); | 1735 | tcp_v4_send_reset(nsk, skb); |
1736 | goto discard_and_relse; | 1736 | goto discard_and_relse; |
diff --git a/net/ipv4/tcp_ulp.c b/net/ipv4/tcp_ulp.c index 2417f55374c5..6bb9e14c710a 100644 --- a/net/ipv4/tcp_ulp.c +++ b/net/ipv4/tcp_ulp.c | |||
@@ -122,14 +122,14 @@ int tcp_set_ulp(struct sock *sk, const char *name) | |||
122 | 122 | ||
123 | ulp_ops = __tcp_ulp_find_autoload(name); | 123 | ulp_ops = __tcp_ulp_find_autoload(name); |
124 | if (!ulp_ops) | 124 | if (!ulp_ops) |
125 | err = -ENOENT; | 125 | return -ENOENT; |
126 | else | ||
127 | err = ulp_ops->init(sk); | ||
128 | 126 | ||
129 | if (err) | 127 | err = ulp_ops->init(sk); |
130 | goto out; | 128 | if (err) { |
129 | module_put(ulp_ops->owner); | ||
130 | return err; | ||
131 | } | ||
131 | 132 | ||
132 | icsk->icsk_ulp_ops = ulp_ops; | 133 | icsk->icsk_ulp_ops = ulp_ops; |
133 | out: | 134 | return 0; |
134 | return err; | ||
135 | } | 135 | } |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index a640fbcba15d..94d6a13d47f0 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -417,14 +417,11 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
417 | struct net_device *loopback_dev = | 417 | struct net_device *loopback_dev = |
418 | dev_net(dev)->loopback_dev; | 418 | dev_net(dev)->loopback_dev; |
419 | 419 | ||
420 | if (dev != loopback_dev) { | 420 | if (idev && idev->dev != loopback_dev) { |
421 | if (idev && idev->dev == dev) { | 421 | struct inet6_dev *loopback_idev = in6_dev_get(loopback_dev); |
422 | struct inet6_dev *loopback_idev = | 422 | if (loopback_idev) { |
423 | in6_dev_get(loopback_dev); | 423 | rt->rt6i_idev = loopback_idev; |
424 | if (loopback_idev) { | 424 | in6_dev_put(idev); |
425 | rt->rt6i_idev = loopback_idev; | ||
426 | in6_dev_put(idev); | ||
427 | } | ||
428 | } | 425 | } |
429 | } | 426 | } |
430 | } | 427 | } |
@@ -3724,10 +3721,10 @@ static int ip6_route_dev_notify(struct notifier_block *this, | |||
3724 | /* NETDEV_UNREGISTER could be fired for multiple times by | 3721 | /* NETDEV_UNREGISTER could be fired for multiple times by |
3725 | * netdev_wait_allrefs(). Make sure we only call this once. | 3722 | * netdev_wait_allrefs(). Make sure we only call this once. |
3726 | */ | 3723 | */ |
3727 | in6_dev_put(net->ipv6.ip6_null_entry->rt6i_idev); | 3724 | in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev); |
3728 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 3725 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
3729 | in6_dev_put(net->ipv6.ip6_prohibit_entry->rt6i_idev); | 3726 | in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev); |
3730 | in6_dev_put(net->ipv6.ip6_blk_hole_entry->rt6i_idev); | 3727 | in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev); |
3731 | #endif | 3728 | #endif |
3732 | } | 3729 | } |
3733 | 3730 | ||
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 2521690d62d6..206210125fd7 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1456,6 +1456,8 @@ process: | |||
1456 | } | 1456 | } |
1457 | sock_hold(sk); | 1457 | sock_hold(sk); |
1458 | refcounted = true; | 1458 | refcounted = true; |
1459 | if (tcp_filter(sk, skb)) | ||
1460 | goto discard_and_relse; | ||
1459 | nsk = tcp_check_req(sk, skb, req, false); | 1461 | nsk = tcp_check_req(sk, skb, req, false); |
1460 | if (!nsk) { | 1462 | if (!nsk) { |
1461 | reqsk_put(req); | 1463 | reqsk_put(req); |
@@ -1464,8 +1466,6 @@ process: | |||
1464 | if (nsk == sk) { | 1466 | if (nsk == sk) { |
1465 | reqsk_put(req); | 1467 | reqsk_put(req); |
1466 | tcp_v6_restore_cb(skb); | 1468 | tcp_v6_restore_cb(skb); |
1467 | } else if (tcp_filter(sk, skb)) { | ||
1468 | goto discard_and_relse; | ||
1469 | } else if (tcp_child_process(sk, nsk, skb)) { | 1469 | } else if (tcp_child_process(sk, nsk, skb)) { |
1470 | tcp_v6_send_reset(nsk, skb); | 1470 | tcp_v6_send_reset(nsk, skb); |
1471 | goto discard_and_relse; | 1471 | goto discard_and_relse; |
diff --git a/net/key/af_key.c b/net/key/af_key.c index ca9d3ae665e7..98f4d8211b9a 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -228,7 +228,7 @@ static int pfkey_broadcast_one(struct sk_buff *skb, struct sk_buff **skb2, | |||
228 | #define BROADCAST_ONE 1 | 228 | #define BROADCAST_ONE 1 |
229 | #define BROADCAST_REGISTERED 2 | 229 | #define BROADCAST_REGISTERED 2 |
230 | #define BROADCAST_PROMISC_ONLY 4 | 230 | #define BROADCAST_PROMISC_ONLY 4 |
231 | static int pfkey_broadcast(struct sk_buff *skb, | 231 | static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, |
232 | int broadcast_flags, struct sock *one_sk, | 232 | int broadcast_flags, struct sock *one_sk, |
233 | struct net *net) | 233 | struct net *net) |
234 | { | 234 | { |
@@ -278,7 +278,7 @@ static int pfkey_broadcast(struct sk_buff *skb, | |||
278 | rcu_read_unlock(); | 278 | rcu_read_unlock(); |
279 | 279 | ||
280 | if (one_sk != NULL) | 280 | if (one_sk != NULL) |
281 | err = pfkey_broadcast_one(skb, &skb2, GFP_KERNEL, one_sk); | 281 | err = pfkey_broadcast_one(skb, &skb2, allocation, one_sk); |
282 | 282 | ||
283 | kfree_skb(skb2); | 283 | kfree_skb(skb2); |
284 | kfree_skb(skb); | 284 | kfree_skb(skb); |
@@ -311,7 +311,7 @@ static int pfkey_do_dump(struct pfkey_sock *pfk) | |||
311 | hdr = (struct sadb_msg *) pfk->dump.skb->data; | 311 | hdr = (struct sadb_msg *) pfk->dump.skb->data; |
312 | hdr->sadb_msg_seq = 0; | 312 | hdr->sadb_msg_seq = 0; |
313 | hdr->sadb_msg_errno = rc; | 313 | hdr->sadb_msg_errno = rc; |
314 | pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, | 314 | pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE, |
315 | &pfk->sk, sock_net(&pfk->sk)); | 315 | &pfk->sk, sock_net(&pfk->sk)); |
316 | pfk->dump.skb = NULL; | 316 | pfk->dump.skb = NULL; |
317 | } | 317 | } |
@@ -355,7 +355,7 @@ static int pfkey_error(const struct sadb_msg *orig, int err, struct sock *sk) | |||
355 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / | 355 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / |
356 | sizeof(uint64_t)); | 356 | sizeof(uint64_t)); |
357 | 357 | ||
358 | pfkey_broadcast(skb, BROADCAST_ONE, sk, sock_net(sk)); | 358 | pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ONE, sk, sock_net(sk)); |
359 | 359 | ||
360 | return 0; | 360 | return 0; |
361 | } | 361 | } |
@@ -1389,7 +1389,7 @@ static int pfkey_getspi(struct sock *sk, struct sk_buff *skb, const struct sadb_ | |||
1389 | 1389 | ||
1390 | xfrm_state_put(x); | 1390 | xfrm_state_put(x); |
1391 | 1391 | ||
1392 | pfkey_broadcast(resp_skb, BROADCAST_ONE, sk, net); | 1392 | pfkey_broadcast(resp_skb, GFP_KERNEL, BROADCAST_ONE, sk, net); |
1393 | 1393 | ||
1394 | return 0; | 1394 | return 0; |
1395 | } | 1395 | } |
@@ -1476,7 +1476,7 @@ static int key_notify_sa(struct xfrm_state *x, const struct km_event *c) | |||
1476 | hdr->sadb_msg_seq = c->seq; | 1476 | hdr->sadb_msg_seq = c->seq; |
1477 | hdr->sadb_msg_pid = c->portid; | 1477 | hdr->sadb_msg_pid = c->portid; |
1478 | 1478 | ||
1479 | pfkey_broadcast(skb, BROADCAST_ALL, NULL, xs_net(x)); | 1479 | pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xs_net(x)); |
1480 | 1480 | ||
1481 | return 0; | 1481 | return 0; |
1482 | } | 1482 | } |
@@ -1589,7 +1589,7 @@ static int pfkey_get(struct sock *sk, struct sk_buff *skb, const struct sadb_msg | |||
1589 | out_hdr->sadb_msg_reserved = 0; | 1589 | out_hdr->sadb_msg_reserved = 0; |
1590 | out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; | 1590 | out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; |
1591 | out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; | 1591 | out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; |
1592 | pfkey_broadcast(out_skb, BROADCAST_ONE, sk, sock_net(sk)); | 1592 | pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk, sock_net(sk)); |
1593 | 1593 | ||
1594 | return 0; | 1594 | return 0; |
1595 | } | 1595 | } |
@@ -1694,8 +1694,8 @@ static int pfkey_register(struct sock *sk, struct sk_buff *skb, const struct sad | |||
1694 | return -ENOBUFS; | 1694 | return -ENOBUFS; |
1695 | } | 1695 | } |
1696 | 1696 | ||
1697 | pfkey_broadcast(supp_skb, BROADCAST_REGISTERED, sk, sock_net(sk)); | 1697 | pfkey_broadcast(supp_skb, GFP_KERNEL, BROADCAST_REGISTERED, sk, |
1698 | 1698 | sock_net(sk)); | |
1699 | return 0; | 1699 | return 0; |
1700 | } | 1700 | } |
1701 | 1701 | ||
@@ -1712,7 +1712,8 @@ static int unicast_flush_resp(struct sock *sk, const struct sadb_msg *ihdr) | |||
1712 | hdr->sadb_msg_errno = (uint8_t) 0; | 1712 | hdr->sadb_msg_errno = (uint8_t) 0; |
1713 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); | 1713 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); |
1714 | 1714 | ||
1715 | return pfkey_broadcast(skb, BROADCAST_ONE, sk, sock_net(sk)); | 1715 | return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ONE, sk, |
1716 | sock_net(sk)); | ||
1716 | } | 1717 | } |
1717 | 1718 | ||
1718 | static int key_notify_sa_flush(const struct km_event *c) | 1719 | static int key_notify_sa_flush(const struct km_event *c) |
@@ -1733,7 +1734,7 @@ static int key_notify_sa_flush(const struct km_event *c) | |||
1733 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); | 1734 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); |
1734 | hdr->sadb_msg_reserved = 0; | 1735 | hdr->sadb_msg_reserved = 0; |
1735 | 1736 | ||
1736 | pfkey_broadcast(skb, BROADCAST_ALL, NULL, c->net); | 1737 | pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, c->net); |
1737 | 1738 | ||
1738 | return 0; | 1739 | return 0; |
1739 | } | 1740 | } |
@@ -1790,7 +1791,7 @@ static int dump_sa(struct xfrm_state *x, int count, void *ptr) | |||
1790 | out_hdr->sadb_msg_pid = pfk->dump.msg_portid; | 1791 | out_hdr->sadb_msg_pid = pfk->dump.msg_portid; |
1791 | 1792 | ||
1792 | if (pfk->dump.skb) | 1793 | if (pfk->dump.skb) |
1793 | pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, | 1794 | pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE, |
1794 | &pfk->sk, sock_net(&pfk->sk)); | 1795 | &pfk->sk, sock_net(&pfk->sk)); |
1795 | pfk->dump.skb = out_skb; | 1796 | pfk->dump.skb = out_skb; |
1796 | 1797 | ||
@@ -1878,7 +1879,7 @@ static int pfkey_promisc(struct sock *sk, struct sk_buff *skb, const struct sadb | |||
1878 | new_hdr->sadb_msg_errno = 0; | 1879 | new_hdr->sadb_msg_errno = 0; |
1879 | } | 1880 | } |
1880 | 1881 | ||
1881 | pfkey_broadcast(skb, BROADCAST_ALL, NULL, sock_net(sk)); | 1882 | pfkey_broadcast(skb, GFP_KERNEL, BROADCAST_ALL, NULL, sock_net(sk)); |
1882 | return 0; | 1883 | return 0; |
1883 | } | 1884 | } |
1884 | 1885 | ||
@@ -2206,7 +2207,7 @@ static int key_notify_policy(struct xfrm_policy *xp, int dir, const struct km_ev | |||
2206 | out_hdr->sadb_msg_errno = 0; | 2207 | out_hdr->sadb_msg_errno = 0; |
2207 | out_hdr->sadb_msg_seq = c->seq; | 2208 | out_hdr->sadb_msg_seq = c->seq; |
2208 | out_hdr->sadb_msg_pid = c->portid; | 2209 | out_hdr->sadb_msg_pid = c->portid; |
2209 | pfkey_broadcast(out_skb, BROADCAST_ALL, NULL, xp_net(xp)); | 2210 | pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ALL, NULL, xp_net(xp)); |
2210 | return 0; | 2211 | return 0; |
2211 | 2212 | ||
2212 | } | 2213 | } |
@@ -2426,7 +2427,7 @@ static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, const struc | |||
2426 | out_hdr->sadb_msg_errno = 0; | 2427 | out_hdr->sadb_msg_errno = 0; |
2427 | out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; | 2428 | out_hdr->sadb_msg_seq = hdr->sadb_msg_seq; |
2428 | out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; | 2429 | out_hdr->sadb_msg_pid = hdr->sadb_msg_pid; |
2429 | pfkey_broadcast(out_skb, BROADCAST_ONE, sk, xp_net(xp)); | 2430 | pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_ONE, sk, xp_net(xp)); |
2430 | err = 0; | 2431 | err = 0; |
2431 | 2432 | ||
2432 | out: | 2433 | out: |
@@ -2682,7 +2683,7 @@ static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr) | |||
2682 | out_hdr->sadb_msg_pid = pfk->dump.msg_portid; | 2683 | out_hdr->sadb_msg_pid = pfk->dump.msg_portid; |
2683 | 2684 | ||
2684 | if (pfk->dump.skb) | 2685 | if (pfk->dump.skb) |
2685 | pfkey_broadcast(pfk->dump.skb, BROADCAST_ONE, | 2686 | pfkey_broadcast(pfk->dump.skb, GFP_ATOMIC, BROADCAST_ONE, |
2686 | &pfk->sk, sock_net(&pfk->sk)); | 2687 | &pfk->sk, sock_net(&pfk->sk)); |
2687 | pfk->dump.skb = out_skb; | 2688 | pfk->dump.skb = out_skb; |
2688 | 2689 | ||
@@ -2739,7 +2740,7 @@ static int key_notify_policy_flush(const struct km_event *c) | |||
2739 | hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC; | 2740 | hdr->sadb_msg_satype = SADB_SATYPE_UNSPEC; |
2740 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); | 2741 | hdr->sadb_msg_len = (sizeof(struct sadb_msg) / sizeof(uint64_t)); |
2741 | hdr->sadb_msg_reserved = 0; | 2742 | hdr->sadb_msg_reserved = 0; |
2742 | pfkey_broadcast(skb_out, BROADCAST_ALL, NULL, c->net); | 2743 | pfkey_broadcast(skb_out, GFP_ATOMIC, BROADCAST_ALL, NULL, c->net); |
2743 | return 0; | 2744 | return 0; |
2744 | 2745 | ||
2745 | } | 2746 | } |
@@ -2803,7 +2804,7 @@ static int pfkey_process(struct sock *sk, struct sk_buff *skb, const struct sadb | |||
2803 | void *ext_hdrs[SADB_EXT_MAX]; | 2804 | void *ext_hdrs[SADB_EXT_MAX]; |
2804 | int err; | 2805 | int err; |
2805 | 2806 | ||
2806 | pfkey_broadcast(skb_clone(skb, GFP_KERNEL), | 2807 | pfkey_broadcast(skb_clone(skb, GFP_KERNEL), GFP_KERNEL, |
2807 | BROADCAST_PROMISC_ONLY, NULL, sock_net(sk)); | 2808 | BROADCAST_PROMISC_ONLY, NULL, sock_net(sk)); |
2808 | 2809 | ||
2809 | memset(ext_hdrs, 0, sizeof(ext_hdrs)); | 2810 | memset(ext_hdrs, 0, sizeof(ext_hdrs)); |
@@ -3024,7 +3025,8 @@ static int key_notify_sa_expire(struct xfrm_state *x, const struct km_event *c) | |||
3024 | out_hdr->sadb_msg_seq = 0; | 3025 | out_hdr->sadb_msg_seq = 0; |
3025 | out_hdr->sadb_msg_pid = 0; | 3026 | out_hdr->sadb_msg_pid = 0; |
3026 | 3027 | ||
3027 | pfkey_broadcast(out_skb, BROADCAST_REGISTERED, NULL, xs_net(x)); | 3028 | pfkey_broadcast(out_skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL, |
3029 | xs_net(x)); | ||
3028 | return 0; | 3030 | return 0; |
3029 | } | 3031 | } |
3030 | 3032 | ||
@@ -3212,7 +3214,8 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct | |||
3212 | xfrm_ctx->ctx_len); | 3214 | xfrm_ctx->ctx_len); |
3213 | } | 3215 | } |
3214 | 3216 | ||
3215 | return pfkey_broadcast(skb, BROADCAST_REGISTERED, NULL, xs_net(x)); | 3217 | return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL, |
3218 | xs_net(x)); | ||
3216 | } | 3219 | } |
3217 | 3220 | ||
3218 | static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt, | 3221 | static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt, |
@@ -3408,7 +3411,8 @@ static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, | |||
3408 | n_port->sadb_x_nat_t_port_port = sport; | 3411 | n_port->sadb_x_nat_t_port_port = sport; |
3409 | n_port->sadb_x_nat_t_port_reserved = 0; | 3412 | n_port->sadb_x_nat_t_port_reserved = 0; |
3410 | 3413 | ||
3411 | return pfkey_broadcast(skb, BROADCAST_REGISTERED, NULL, xs_net(x)); | 3414 | return pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_REGISTERED, NULL, |
3415 | xs_net(x)); | ||
3412 | } | 3416 | } |
3413 | 3417 | ||
3414 | #ifdef CONFIG_NET_KEY_MIGRATE | 3418 | #ifdef CONFIG_NET_KEY_MIGRATE |
@@ -3599,7 +3603,7 @@ static int pfkey_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, | |||
3599 | } | 3603 | } |
3600 | 3604 | ||
3601 | /* broadcast migrate message to sockets */ | 3605 | /* broadcast migrate message to sockets */ |
3602 | pfkey_broadcast(skb, BROADCAST_ALL, NULL, &init_net); | 3606 | pfkey_broadcast(skb, GFP_ATOMIC, BROADCAST_ALL, NULL, &init_net); |
3603 | 3607 | ||
3604 | return 0; | 3608 | return 0; |
3605 | 3609 | ||
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 8708cbe8af5b..2b36eff5d97e 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 7 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
8 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | 8 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> |
9 | * Copyright 2007-2010, Intel Corporation | 9 | * Copyright 2007-2010, Intel Corporation |
10 | * Copyright(c) 2015 Intel Deutschland GmbH | 10 | * Copyright(c) 2015-2017 Intel Deutschland GmbH |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
@@ -466,3 +466,23 @@ void ieee80211_manage_rx_ba_offl(struct ieee80211_vif *vif, | |||
466 | rcu_read_unlock(); | 466 | rcu_read_unlock(); |
467 | } | 467 | } |
468 | EXPORT_SYMBOL(ieee80211_manage_rx_ba_offl); | 468 | EXPORT_SYMBOL(ieee80211_manage_rx_ba_offl); |
469 | |||
470 | void ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif, | ||
471 | const u8 *addr, unsigned int tid) | ||
472 | { | ||
473 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | ||
474 | struct ieee80211_local *local = sdata->local; | ||
475 | struct sta_info *sta; | ||
476 | |||
477 | rcu_read_lock(); | ||
478 | sta = sta_info_get_bss(sdata, addr); | ||
479 | if (!sta) | ||
480 | goto unlock; | ||
481 | |||
482 | set_bit(tid, sta->ampdu_mlme.tid_rx_timer_expired); | ||
483 | ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); | ||
484 | |||
485 | unlock: | ||
486 | rcu_read_unlock(); | ||
487 | } | ||
488 | EXPORT_SYMBOL(ieee80211_rx_ba_timer_expired); | ||
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index bd24a550e0f9..a3fa144b8648 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -286,9 +286,6 @@ static struct Qdisc *qdisc_match_from_root(struct Qdisc *root, u32 handle) | |||
286 | void qdisc_hash_add(struct Qdisc *q, bool invisible) | 286 | void qdisc_hash_add(struct Qdisc *q, bool invisible) |
287 | { | 287 | { |
288 | if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) { | 288 | if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) { |
289 | struct Qdisc *root = qdisc_dev(q)->qdisc; | ||
290 | |||
291 | WARN_ON_ONCE(root == &noop_qdisc); | ||
292 | ASSERT_RTNL(); | 289 | ASSERT_RTNL(); |
293 | hash_add_rcu(qdisc_dev(q)->qdisc_hash, &q->hash, q->handle); | 290 | hash_add_rcu(qdisc_dev(q)->qdisc_hash, &q->hash, q->handle); |
294 | if (invisible) | 291 | if (invisible) |
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 572fe2584e48..c403c87aff7a 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c | |||
@@ -572,8 +572,10 @@ static void atm_tc_destroy(struct Qdisc *sch) | |||
572 | struct atm_flow_data *flow, *tmp; | 572 | struct atm_flow_data *flow, *tmp; |
573 | 573 | ||
574 | pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); | 574 | pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p); |
575 | list_for_each_entry(flow, &p->flows, list) | 575 | list_for_each_entry(flow, &p->flows, list) { |
576 | tcf_block_put(flow->block); | 576 | tcf_block_put(flow->block); |
577 | flow->block = NULL; | ||
578 | } | ||
577 | 579 | ||
578 | list_for_each_entry_safe(flow, tmp, &p->flows, list) { | 580 | list_for_each_entry_safe(flow, tmp, &p->flows, list) { |
579 | if (flow->ref > 1) | 581 | if (flow->ref > 1) |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 481036f6b54e..780db43300b1 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
@@ -1431,8 +1431,10 @@ static void cbq_destroy(struct Qdisc *sch) | |||
1431 | * be bound to classes which have been destroyed already. --TGR '04 | 1431 | * be bound to classes which have been destroyed already. --TGR '04 |
1432 | */ | 1432 | */ |
1433 | for (h = 0; h < q->clhash.hashsize; h++) { | 1433 | for (h = 0; h < q->clhash.hashsize; h++) { |
1434 | hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) | 1434 | hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) { |
1435 | tcf_block_put(cl->block); | 1435 | tcf_block_put(cl->block); |
1436 | cl->block = NULL; | ||
1437 | } | ||
1436 | } | 1438 | } |
1437 | for (h = 0; h < q->clhash.hashsize; h++) { | 1439 | for (h = 0; h < q->clhash.hashsize; h++) { |
1438 | hlist_for_each_entry_safe(cl, next, &q->clhash.hash[h], | 1440 | hlist_for_each_entry_safe(cl, next, &q->clhash.hash[h], |
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index b52f74610dc7..fd15200f8627 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
@@ -1428,6 +1428,10 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt) | |||
1428 | return err; | 1428 | return err; |
1429 | q->eligible = RB_ROOT; | 1429 | q->eligible = RB_ROOT; |
1430 | 1430 | ||
1431 | err = tcf_block_get(&q->root.block, &q->root.filter_list); | ||
1432 | if (err) | ||
1433 | goto err_tcf; | ||
1434 | |||
1431 | q->root.cl_common.classid = sch->handle; | 1435 | q->root.cl_common.classid = sch->handle; |
1432 | q->root.refcnt = 1; | 1436 | q->root.refcnt = 1; |
1433 | q->root.sched = q; | 1437 | q->root.sched = q; |
@@ -1447,6 +1451,10 @@ hfsc_init_qdisc(struct Qdisc *sch, struct nlattr *opt) | |||
1447 | qdisc_watchdog_init(&q->watchdog, sch); | 1451 | qdisc_watchdog_init(&q->watchdog, sch); |
1448 | 1452 | ||
1449 | return 0; | 1453 | return 0; |
1454 | |||
1455 | err_tcf: | ||
1456 | qdisc_class_hash_destroy(&q->clhash); | ||
1457 | return err; | ||
1450 | } | 1458 | } |
1451 | 1459 | ||
1452 | static int | 1460 | static int |
@@ -1522,8 +1530,10 @@ hfsc_destroy_qdisc(struct Qdisc *sch) | |||
1522 | unsigned int i; | 1530 | unsigned int i; |
1523 | 1531 | ||
1524 | for (i = 0; i < q->clhash.hashsize; i++) { | 1532 | for (i = 0; i < q->clhash.hashsize; i++) { |
1525 | hlist_for_each_entry(cl, &q->clhash.hash[i], cl_common.hnode) | 1533 | hlist_for_each_entry(cl, &q->clhash.hash[i], cl_common.hnode) { |
1526 | tcf_block_put(cl->block); | 1534 | tcf_block_put(cl->block); |
1535 | cl->block = NULL; | ||
1536 | } | ||
1527 | } | 1537 | } |
1528 | for (i = 0; i < q->clhash.hashsize; i++) { | 1538 | for (i = 0; i < q->clhash.hashsize; i++) { |
1529 | hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], | 1539 | hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 203286ab4427..5d65ec5207e9 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -1258,8 +1258,10 @@ static void htb_destroy(struct Qdisc *sch) | |||
1258 | tcf_block_put(q->block); | 1258 | tcf_block_put(q->block); |
1259 | 1259 | ||
1260 | for (i = 0; i < q->clhash.hashsize; i++) { | 1260 | for (i = 0; i < q->clhash.hashsize; i++) { |
1261 | hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) | 1261 | hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) { |
1262 | tcf_block_put(cl->block); | 1262 | tcf_block_put(cl->block); |
1263 | cl->block = NULL; | ||
1264 | } | ||
1263 | } | 1265 | } |
1264 | for (i = 0; i < q->clhash.hashsize; i++) { | 1266 | for (i = 0; i < q->clhash.hashsize; i++) { |
1265 | hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], | 1267 | hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index f80ea2cc5f1f..82469ef9655e 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
@@ -437,6 +437,7 @@ congestion_drop: | |||
437 | qdisc_drop(head, sch, to_free); | 437 | qdisc_drop(head, sch, to_free); |
438 | 438 | ||
439 | slot_queue_add(slot, skb); | 439 | slot_queue_add(slot, skb); |
440 | qdisc_tree_reduce_backlog(sch, 0, delta); | ||
440 | return NET_XMIT_CN; | 441 | return NET_XMIT_CN; |
441 | } | 442 | } |
442 | 443 | ||
@@ -468,8 +469,10 @@ enqueue: | |||
468 | /* Return Congestion Notification only if we dropped a packet | 469 | /* Return Congestion Notification only if we dropped a packet |
469 | * from this flow. | 470 | * from this flow. |
470 | */ | 471 | */ |
471 | if (qlen != slot->qlen) | 472 | if (qlen != slot->qlen) { |
473 | qdisc_tree_reduce_backlog(sch, 0, dropped - qdisc_pkt_len(skb)); | ||
472 | return NET_XMIT_CN; | 474 | return NET_XMIT_CN; |
475 | } | ||
473 | 476 | ||
474 | /* As we dropped a packet, better let upper stack know this */ | 477 | /* As we dropped a packet, better let upper stack know this */ |
475 | qdisc_tree_reduce_backlog(sch, 1, dropped); | 478 | qdisc_tree_reduce_backlog(sch, 1, dropped); |
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index d174ee3254ee..767e0537dde5 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c | |||
@@ -596,7 +596,7 @@ static int tipc_l2_rcv_msg(struct sk_buff *skb, struct net_device *dev, | |||
596 | rcu_read_lock(); | 596 | rcu_read_lock(); |
597 | b = rcu_dereference_rtnl(dev->tipc_ptr); | 597 | b = rcu_dereference_rtnl(dev->tipc_ptr); |
598 | if (likely(b && test_bit(0, &b->up) && | 598 | if (likely(b && test_bit(0, &b->up) && |
599 | (skb->pkt_type <= PACKET_BROADCAST))) { | 599 | (skb->pkt_type <= PACKET_MULTICAST))) { |
600 | skb->next = NULL; | 600 | skb->next = NULL; |
601 | tipc_rcv(dev_net(dev), skb, b); | 601 | tipc_rcv(dev_net(dev), skb, b); |
602 | rcu_read_unlock(); | 602 | rcu_read_unlock(); |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index ab3087687a32..dcd90e6fa7c3 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -513,6 +513,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err) | |||
513 | 513 | ||
514 | /* Now reverse the concerned fields */ | 514 | /* Now reverse the concerned fields */ |
515 | msg_set_errcode(hdr, err); | 515 | msg_set_errcode(hdr, err); |
516 | msg_set_non_seq(hdr, 0); | ||
516 | msg_set_origport(hdr, msg_destport(&ohdr)); | 517 | msg_set_origport(hdr, msg_destport(&ohdr)); |
517 | msg_set_destport(hdr, msg_origport(&ohdr)); | 518 | msg_set_destport(hdr, msg_origport(&ohdr)); |
518 | msg_set_destnode(hdr, msg_prevnode(&ohdr)); | 519 | msg_set_destnode(hdr, msg_prevnode(&ohdr)); |