aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-11-04 09:40:55 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-04 09:40:55 -0500
commitbe408cd3e1fef73e9408b196a79b9934697fe3b1 (patch)
tree8923594afd1e556360986cd2bc417f5fe0a72118 /drivers/net
parent5e01dc7b26d9f24f39abace5da98ccbd6a5ceb52 (diff)
parentc32b7dfbb1dfb3f0a68f250deff65103c8bb704a (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "I'm sending a pull request of these lingering bug fixes for networking before the normal merge window material because some of this stuff I'd like to get to -stable ASAP" 1) cxgb3 stopped working on 32-bit machines, fix from Ben Hutchings. 2) Structures passed via netlink for netfilter logging are not fully initialized. From Mathias Krause. 3) Properly unlink upper openvswitch device during notifications, from Alexei Starovoitov. 4) Fix race conditions involving access to the IP compression scratch buffer, from Michal Kubrecek. 5) We don't handle the expiration of MTU information contained in ipv6 routes sometimes, fix from Hannes Frederic Sowa. 6) With Fast Open we can miscompute the TCP SYN/ACK RTT, from Yuchung Cheng. 7) Don't take TCP RTT sample when an ACK doesn't acknowledge new data, also from Yuchung Cheng. 8) The decreased IPSEC garbage collection threshold causes problems for some people, bump it back up. From Steffen Klassert. 9) Fix skb->truesize calculated by tcp_tso_segment(), from Eric Dumazet. 10) flow_dissector doesn't validate packet lengths sufficiently, from Jason Wang * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (41 commits) net/mlx4_core: Fix call to __mlx4_unregister_mac net: sctp: do not trigger BUG_ON in sctp_cmd_delete_tcb net: flow_dissector: fail on evil iph->ihl xfrm: Fix null pointer dereference when decoding sessions can: kvaser_usb: fix usb endpoints detection can: c_can: Fix RX message handling, handle lost message before EOB doc:net: Fix typo in Documentation/networking bgmac: don't update slot on skb alloc/dma mapping error ibm emac: Fix locking for enable/disable eob irq ibm emac: Don't call napi_complete if napi_reschedule failed virtio-net: correctly handle cpu hotplug notifier during resuming bridge: pass correct vlan id to multicast code net: x25: Fix dead URLs in Kconfig netfilter: xt_NFQUEUE: fix --queue-bypass regression xen-netback: use jiffies_64 value to calculate credit timeout cxgb3: Fix length calculation in write_ofld_wr() on 32-bit architectures bnx2x: Disable VF access on PF removal bnx2x: prevent FW assert on low mem during unload tcp: gso: fix truesize tracking xfrm: Increase the garbage collector threshold ...
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/can/c_can/c_can.c6
-rw-r--r--drivers/net/can/usb/kvaser_usb.c20
-rw-r--r--drivers/net/ethernet/broadcom/bgmac.c20
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c10
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c16
-rw-r--r--drivers/net/ethernet/chelsio/cxgb3/sge.c3
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h9
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c6
-rw-r--r--drivers/net/ethernet/ibm/emac/mal.c16
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cmd.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c6
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c7
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c6
-rw-r--r--drivers/net/netconsole.c18
-rw-r--r--drivers/net/usb/ax88179_178a.c11
-rw-r--r--drivers/net/virtio_net.c13
-rw-r--r--drivers/net/wan/sbni.c89
-rw-r--r--drivers/net/xen-netback/common.h1
-rw-r--r--drivers/net/xen-netback/interface.c3
-rw-r--r--drivers/net/xen-netback/netback.c10
20 files changed, 114 insertions, 158 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index a668cd491cb3..e3fc07cf2f62 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -814,9 +814,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
814 msg_ctrl_save = priv->read_reg(priv, 814 msg_ctrl_save = priv->read_reg(priv,
815 C_CAN_IFACE(MSGCTRL_REG, 0)); 815 C_CAN_IFACE(MSGCTRL_REG, 0));
816 816
817 if (msg_ctrl_save & IF_MCONT_EOB)
818 return num_rx_pkts;
819
820 if (msg_ctrl_save & IF_MCONT_MSGLST) { 817 if (msg_ctrl_save & IF_MCONT_MSGLST) {
821 c_can_handle_lost_msg_obj(dev, 0, msg_obj); 818 c_can_handle_lost_msg_obj(dev, 0, msg_obj);
822 num_rx_pkts++; 819 num_rx_pkts++;
@@ -824,6 +821,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
824 continue; 821 continue;
825 } 822 }
826 823
824 if (msg_ctrl_save & IF_MCONT_EOB)
825 return num_rx_pkts;
826
827 if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) 827 if (!(msg_ctrl_save & IF_MCONT_NEWDAT))
828 continue; 828 continue;
829 829
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c
index 3b9546588240..4b2d5ed62b11 100644
--- a/drivers/net/can/usb/kvaser_usb.c
+++ b/drivers/net/can/usb/kvaser_usb.c
@@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf,
1544 return 0; 1544 return 0;
1545} 1545}
1546 1546
1547static void kvaser_usb_get_endpoints(const struct usb_interface *intf, 1547static int kvaser_usb_get_endpoints(const struct usb_interface *intf,
1548 struct usb_endpoint_descriptor **in, 1548 struct usb_endpoint_descriptor **in,
1549 struct usb_endpoint_descriptor **out) 1549 struct usb_endpoint_descriptor **out)
1550{ 1550{
1551 const struct usb_host_interface *iface_desc; 1551 const struct usb_host_interface *iface_desc;
1552 struct usb_endpoint_descriptor *endpoint; 1552 struct usb_endpoint_descriptor *endpoint;
@@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf,
1557 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { 1557 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1558 endpoint = &iface_desc->endpoint[i].desc; 1558 endpoint = &iface_desc->endpoint[i].desc;
1559 1559
1560 if (usb_endpoint_is_bulk_in(endpoint)) 1560 if (!*in && usb_endpoint_is_bulk_in(endpoint))
1561 *in = endpoint; 1561 *in = endpoint;
1562 1562
1563 if (usb_endpoint_is_bulk_out(endpoint)) 1563 if (!*out && usb_endpoint_is_bulk_out(endpoint))
1564 *out = endpoint; 1564 *out = endpoint;
1565
1566 /* use first bulk endpoint for in and out */
1567 if (*in && *out)
1568 return 0;
1565 } 1569 }
1570
1571 return -ENODEV;
1566} 1572}
1567 1573
1568static int kvaser_usb_probe(struct usb_interface *intf, 1574static int kvaser_usb_probe(struct usb_interface *intf,
@@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf,
1576 if (!dev) 1582 if (!dev)
1577 return -ENOMEM; 1583 return -ENOMEM;
1578 1584
1579 kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); 1585 err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out);
1580 if (!dev->bulk_in || !dev->bulk_out) { 1586 if (err) {
1581 dev_err(&intf->dev, "Cannot get usb endpoint(s)"); 1587 dev_err(&intf->dev, "Cannot get usb endpoint(s)");
1582 return err; 1588 return err;
1583 } 1589 }
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
index 249468f95365..9e8a3e024e01 100644
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -244,25 +244,33 @@ static int bgmac_dma_rx_skb_for_slot(struct bgmac *bgmac,
244 struct bgmac_slot_info *slot) 244 struct bgmac_slot_info *slot)
245{ 245{
246 struct device *dma_dev = bgmac->core->dma_dev; 246 struct device *dma_dev = bgmac->core->dma_dev;
247 struct sk_buff *skb;
248 dma_addr_t dma_addr;
247 struct bgmac_rx_header *rx; 249 struct bgmac_rx_header *rx;
248 250
249 /* Alloc skb */ 251 /* Alloc skb */
250 slot->skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE); 252 skb = netdev_alloc_skb(bgmac->net_dev, BGMAC_RX_BUF_SIZE);
251 if (!slot->skb) 253 if (!skb)
252 return -ENOMEM; 254 return -ENOMEM;
253 255
254 /* Poison - if everything goes fine, hardware will overwrite it */ 256 /* Poison - if everything goes fine, hardware will overwrite it */
255 rx = (struct bgmac_rx_header *)slot->skb->data; 257 rx = (struct bgmac_rx_header *)skb->data;
256 rx->len = cpu_to_le16(0xdead); 258 rx->len = cpu_to_le16(0xdead);
257 rx->flags = cpu_to_le16(0xbeef); 259 rx->flags = cpu_to_le16(0xbeef);
258 260
259 /* Map skb for the DMA */ 261 /* Map skb for the DMA */
260 slot->dma_addr = dma_map_single(dma_dev, slot->skb->data, 262 dma_addr = dma_map_single(dma_dev, skb->data,
261 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE); 263 BGMAC_RX_BUF_SIZE, DMA_FROM_DEVICE);
262 if (dma_mapping_error(dma_dev, slot->dma_addr)) { 264 if (dma_mapping_error(dma_dev, dma_addr)) {
263 bgmac_err(bgmac, "DMA mapping error\n"); 265 bgmac_err(bgmac, "DMA mapping error\n");
266 dev_kfree_skb(skb);
264 return -ENOMEM; 267 return -ENOMEM;
265 } 268 }
269
270 /* Update the slot */
271 slot->skb = skb;
272 slot->dma_addr = dma_addr;
273
266 if (slot->dma_addr & 0xC0000000) 274 if (slot->dma_addr & 0xC0000000)
267 bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); 275 bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n");
268 276
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 4ab4c89c60cd..74d6486fccfd 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -2545,10 +2545,6 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
2545 } 2545 }
2546 } 2546 }
2547 2547
2548 /* Allocated memory for FW statistics */
2549 if (bnx2x_alloc_fw_stats_mem(bp))
2550 LOAD_ERROR_EXIT(bp, load_error0);
2551
2552 /* need to be done after alloc mem, since it's self adjusting to amount 2548 /* need to be done after alloc mem, since it's self adjusting to amount
2553 * of memory available for RSS queues 2549 * of memory available for RSS queues
2554 */ 2550 */
@@ -2558,6 +2554,10 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
2558 LOAD_ERROR_EXIT(bp, load_error0); 2554 LOAD_ERROR_EXIT(bp, load_error0);
2559 } 2555 }
2560 2556
2557 /* Allocated memory for FW statistics */
2558 if (bnx2x_alloc_fw_stats_mem(bp))
2559 LOAD_ERROR_EXIT(bp, load_error0);
2560
2561 /* request pf to initialize status blocks */ 2561 /* request pf to initialize status blocks */
2562 if (IS_VF(bp)) { 2562 if (IS_VF(bp)) {
2563 rc = bnx2x_vfpf_init(bp); 2563 rc = bnx2x_vfpf_init(bp);
@@ -2812,8 +2812,8 @@ load_error1:
2812 if (IS_PF(bp)) 2812 if (IS_PF(bp))
2813 bnx2x_clear_pf_load(bp); 2813 bnx2x_clear_pf_load(bp);
2814load_error0: 2814load_error0:
2815 bnx2x_free_fp_mem(bp);
2816 bnx2x_free_fw_stats_mem(bp); 2815 bnx2x_free_fw_stats_mem(bp);
2816 bnx2x_free_fp_mem(bp);
2817 bnx2x_free_mem(bp); 2817 bnx2x_free_mem(bp);
2818 2818
2819 return rc; 2819 return rc;
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index bf08ad68b405..5e07efb6ec13 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -2018,6 +2018,8 @@ failed:
2018 2018
2019void bnx2x_iov_remove_one(struct bnx2x *bp) 2019void bnx2x_iov_remove_one(struct bnx2x *bp)
2020{ 2020{
2021 int vf_idx;
2022
2021 /* if SRIOV is not enabled there's nothing to do */ 2023 /* if SRIOV is not enabled there's nothing to do */
2022 if (!IS_SRIOV(bp)) 2024 if (!IS_SRIOV(bp))
2023 return; 2025 return;
@@ -2026,6 +2028,18 @@ void bnx2x_iov_remove_one(struct bnx2x *bp)
2026 pci_disable_sriov(bp->pdev); 2028 pci_disable_sriov(bp->pdev);
2027 DP(BNX2X_MSG_IOV, "sriov disabled\n"); 2029 DP(BNX2X_MSG_IOV, "sriov disabled\n");
2028 2030
2031 /* disable access to all VFs */
2032 for (vf_idx = 0; vf_idx < bp->vfdb->sriov.total; vf_idx++) {
2033 bnx2x_pretend_func(bp,
2034 HW_VF_HANDLE(bp,
2035 bp->vfdb->sriov.first_vf_in_pf +
2036 vf_idx));
2037 DP(BNX2X_MSG_IOV, "disabling internal access for vf %d\n",
2038 bp->vfdb->sriov.first_vf_in_pf + vf_idx);
2039 bnx2x_vf_enable_internal(bp, 0);
2040 bnx2x_pretend_func(bp, BP_ABS_FUNC(bp));
2041 }
2042
2029 /* free vf database */ 2043 /* free vf database */
2030 __bnx2x_iov_free_vfdb(bp); 2044 __bnx2x_iov_free_vfdb(bp);
2031} 2045}
@@ -3197,7 +3211,7 @@ int bnx2x_enable_sriov(struct bnx2x *bp)
3197 * the "acquire" messages to appear on the VF PF channel. 3211 * the "acquire" messages to appear on the VF PF channel.
3198 */ 3212 */
3199 DP(BNX2X_MSG_IOV, "about to call enable sriov\n"); 3213 DP(BNX2X_MSG_IOV, "about to call enable sriov\n");
3200 pci_disable_sriov(bp->pdev); 3214 bnx2x_disable_sriov(bp);
3201 rc = pci_enable_sriov(bp->pdev, req_vfs); 3215 rc = pci_enable_sriov(bp->pdev, req_vfs);
3202 if (rc) { 3216 if (rc) {
3203 BNX2X_ERR("pci_enable_sriov failed with %d\n", rc); 3217 BNX2X_ERR("pci_enable_sriov failed with %d\n", rc);
diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
index 9c89dc8fe105..632b318eb38a 100644
--- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
@@ -1599,7 +1599,8 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
1599 flits = skb_transport_offset(skb) / 8; 1599 flits = skb_transport_offset(skb) / 8;
1600 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; 1600 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1601 sgl_flits = make_sgl(skb, sgp, skb_transport_header(skb), 1601 sgl_flits = make_sgl(skb, sgp, skb_transport_header(skb),
1602 skb->tail - skb->transport_header, 1602 skb_tail_pointer(skb) -
1603 skb_transport_header(skb),
1603 adap->pdev); 1604 adap->pdev);
1604 if (need_skb_unmap()) { 1605 if (need_skb_unmap()) {
1605 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits); 1606 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index db020230bd0b..c99dac6a9ddf 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -696,6 +696,15 @@ static inline int qnq_async_evt_rcvd(struct be_adapter *adapter)
696 return adapter->flags & BE_FLAGS_QNQ_ASYNC_EVT_RCVD; 696 return adapter->flags & BE_FLAGS_QNQ_ASYNC_EVT_RCVD;
697} 697}
698 698
699static inline int fw_major_num(const char *fw_ver)
700{
701 int fw_major = 0;
702
703 sscanf(fw_ver, "%d.", &fw_major);
704
705 return fw_major;
706}
707
699extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm, 708extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
700 u16 num_popped); 709 u16 num_popped);
701extern void be_link_status_update(struct be_adapter *adapter, u8 link_status); 710extern void be_link_status_update(struct be_adapter *adapter, u8 link_status);
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 2c38cc402119..53ed58b492c8 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -3247,6 +3247,12 @@ static int be_setup(struct be_adapter *adapter)
3247 3247
3248 be_cmd_get_fw_ver(adapter, adapter->fw_ver, adapter->fw_on_flash); 3248 be_cmd_get_fw_ver(adapter, adapter->fw_ver, adapter->fw_on_flash);
3249 3249
3250 if (BE2_chip(adapter) && fw_major_num(adapter->fw_ver) < 4) {
3251 dev_err(dev, "Firmware on card is old(%s), IRQs may not work.",
3252 adapter->fw_ver);
3253 dev_err(dev, "Please upgrade firmware to version >= 4.0\n");
3254 }
3255
3250 if (adapter->vlans_added) 3256 if (adapter->vlans_added)
3251 be_vid_config(adapter); 3257 be_vid_config(adapter);
3252 3258
diff --git a/drivers/net/ethernet/ibm/emac/mal.c b/drivers/net/ethernet/ibm/emac/mal.c
index dac564c25440..e7847510eda2 100644
--- a/drivers/net/ethernet/ibm/emac/mal.c
+++ b/drivers/net/ethernet/ibm/emac/mal.c
@@ -263,7 +263,9 @@ static inline void mal_schedule_poll(struct mal_instance *mal)
263{ 263{
264 if (likely(napi_schedule_prep(&mal->napi))) { 264 if (likely(napi_schedule_prep(&mal->napi))) {
265 MAL_DBG2(mal, "schedule_poll" NL); 265 MAL_DBG2(mal, "schedule_poll" NL);
266 spin_lock(&mal->lock);
266 mal_disable_eob_irq(mal); 267 mal_disable_eob_irq(mal);
268 spin_unlock(&mal->lock);
267 __napi_schedule(&mal->napi); 269 __napi_schedule(&mal->napi);
268 } else 270 } else
269 MAL_DBG2(mal, "already in poll" NL); 271 MAL_DBG2(mal, "already in poll" NL);
@@ -442,15 +444,13 @@ static int mal_poll(struct napi_struct *napi, int budget)
442 if (unlikely(mc->ops->peek_rx(mc->dev) || 444 if (unlikely(mc->ops->peek_rx(mc->dev) ||
443 test_bit(MAL_COMMAC_RX_STOPPED, &mc->flags))) { 445 test_bit(MAL_COMMAC_RX_STOPPED, &mc->flags))) {
444 MAL_DBG2(mal, "rotting packet" NL); 446 MAL_DBG2(mal, "rotting packet" NL);
445 if (napi_reschedule(napi)) 447 if (!napi_reschedule(napi))
446 mal_disable_eob_irq(mal);
447 else
448 MAL_DBG2(mal, "already in poll list" NL);
449
450 if (budget > 0)
451 goto again;
452 else
453 goto more_work; 448 goto more_work;
449
450 spin_lock_irqsave(&mal->lock, flags);
451 mal_disable_eob_irq(mal);
452 spin_unlock_irqrestore(&mal->lock, flags);
453 goto again;
454 } 454 }
455 mc->ops->poll_tx(mc->dev); 455 mc->ops->poll_tx(mc->dev);
456 } 456 }
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c
index ea20182c6969..bb11624a1f39 100644
--- a/drivers/net/ethernet/mellanox/mlx4/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c
@@ -1691,7 +1691,7 @@ static void mlx4_master_deactivate_admin_state(struct mlx4_priv *priv, int slave
1691 vp_oper->vlan_idx = NO_INDX; 1691 vp_oper->vlan_idx = NO_INDX;
1692 } 1692 }
1693 if (NO_INDX != vp_oper->mac_idx) { 1693 if (NO_INDX != vp_oper->mac_idx) {
1694 __mlx4_unregister_mac(&priv->dev, port, vp_oper->mac_idx); 1694 __mlx4_unregister_mac(&priv->dev, port, vp_oper->state.mac);
1695 vp_oper->mac_idx = NO_INDX; 1695 vp_oper->mac_idx = NO_INDX;
1696 } 1696 }
1697 } 1697 }
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 3ca00e05f23d..ace217c447dd 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -2276,9 +2276,9 @@ int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
2276 temp = (cmd.rsp.arg[8] & 0x7FFE0000) >> 17; 2276 temp = (cmd.rsp.arg[8] & 0x7FFE0000) >> 17;
2277 npar_info->max_linkspeed_reg_offset = temp; 2277 npar_info->max_linkspeed_reg_offset = temp;
2278 } 2278 }
2279 if (npar_info->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) 2279
2280 memcpy(ahw->extra_capability, &cmd.rsp.arg[16], 2280 memcpy(ahw->extra_capability, &cmd.rsp.arg[16],
2281 sizeof(ahw->extra_capability)); 2281 sizeof(ahw->extra_capability));
2282 2282
2283out: 2283out:
2284 qlcnic_free_mbx_args(&cmd); 2284 qlcnic_free_mbx_args(&cmd);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index f8adc7b01f1f..b64e2bef9428 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -785,8 +785,6 @@ void qlcnic_82xx_config_intr_coalesce(struct qlcnic_adapter *adapter)
785 785
786#define QLCNIC_ENABLE_IPV4_LRO 1 786#define QLCNIC_ENABLE_IPV4_LRO 1
787#define QLCNIC_ENABLE_IPV6_LRO 2 787#define QLCNIC_ENABLE_IPV6_LRO 2
788#define QLCNIC_NO_DEST_IPV4_CHECK (1 << 8)
789#define QLCNIC_NO_DEST_IPV6_CHECK (2 << 8)
790 788
791int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int enable) 789int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int enable)
792{ 790{
@@ -806,11 +804,10 @@ int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int enable)
806 804
807 word = 0; 805 word = 0;
808 if (enable) { 806 if (enable) {
809 word = QLCNIC_ENABLE_IPV4_LRO | QLCNIC_NO_DEST_IPV4_CHECK; 807 word = QLCNIC_ENABLE_IPV4_LRO;
810 if (adapter->ahw->extra_capability[0] & 808 if (adapter->ahw->extra_capability[0] &
811 QLCNIC_FW_CAP2_HW_LRO_IPV6) 809 QLCNIC_FW_CAP2_HW_LRO_IPV6)
812 word |= QLCNIC_ENABLE_IPV6_LRO | 810 word |= QLCNIC_ENABLE_IPV6_LRO;
813 QLCNIC_NO_DEST_IPV6_CHECK;
814 } 811 }
815 812
816 req.words[0] = cpu_to_le64(word); 813 req.words[0] = cpu_to_le64(word);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 9e61eb867452..d8f4897e9e82 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1131,7 +1131,10 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
1131 if (err == -EIO) 1131 if (err == -EIO)
1132 return err; 1132 return err;
1133 adapter->ahw->extra_capability[0] = temp; 1133 adapter->ahw->extra_capability[0] = temp;
1134 } else {
1135 adapter->ahw->extra_capability[0] = 0;
1134 } 1136 }
1137
1135 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; 1138 adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
1136 adapter->ahw->max_mtu = nic_info.max_mtu; 1139 adapter->ahw->max_mtu = nic_info.max_mtu;
1137 1140
@@ -2159,8 +2162,7 @@ void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
2159 else if (qlcnic_83xx_check(adapter)) 2162 else if (qlcnic_83xx_check(adapter))
2160 fw_cmd = QLCNIC_CMD_83XX_SET_DRV_VER; 2163 fw_cmd = QLCNIC_CMD_83XX_SET_DRV_VER;
2161 2164
2162 if ((ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) && 2165 if (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_SET_DRV_VER)
2163 (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_SET_DRV_VER))
2164 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd); 2166 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
2165} 2167}
2166 2168
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index adeee615dd19..c9a15925a1f7 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -310,6 +310,7 @@ static ssize_t store_enabled(struct netconsole_target *nt,
310 const char *buf, 310 const char *buf,
311 size_t count) 311 size_t count)
312{ 312{
313 unsigned long flags;
313 int enabled; 314 int enabled;
314 int err; 315 int err;
315 316
@@ -324,9 +325,7 @@ static ssize_t store_enabled(struct netconsole_target *nt,
324 return -EINVAL; 325 return -EINVAL;
325 } 326 }
326 327
327 mutex_lock(&nt->mutex);
328 if (enabled) { /* 1 */ 328 if (enabled) { /* 1 */
329
330 /* 329 /*
331 * Skip netpoll_parse_options() -- all the attributes are 330 * Skip netpoll_parse_options() -- all the attributes are
332 * already configured via configfs. Just print them out. 331 * already configured via configfs. Just print them out.
@@ -334,19 +333,22 @@ static ssize_t store_enabled(struct netconsole_target *nt,
334 netpoll_print_options(&nt->np); 333 netpoll_print_options(&nt->np);
335 334
336 err = netpoll_setup(&nt->np); 335 err = netpoll_setup(&nt->np);
337 if (err) { 336 if (err)
338 mutex_unlock(&nt->mutex);
339 return err; 337 return err;
340 }
341 338
342 printk(KERN_INFO "netconsole: network logging started\n"); 339 printk(KERN_INFO "netconsole: network logging started\n");
343
344 } else { /* 0 */ 340 } else { /* 0 */
341 /* We need to disable the netconsole before cleaning it up
342 * otherwise we might end up in write_msg() with
343 * nt->np.dev == NULL and nt->enabled == 1
344 */
345 spin_lock_irqsave(&target_list_lock, flags);
346 nt->enabled = 0;
347 spin_unlock_irqrestore(&target_list_lock, flags);
345 netpoll_cleanup(&nt->np); 348 netpoll_cleanup(&nt->np);
346 } 349 }
347 350
348 nt->enabled = enabled; 351 nt->enabled = enabled;
349 mutex_unlock(&nt->mutex);
350 352
351 return strnlen(buf, count); 353 return strnlen(buf, count);
352} 354}
@@ -563,8 +565,10 @@ static ssize_t netconsole_target_attr_store(struct config_item *item,
563 struct netconsole_target_attr *na = 565 struct netconsole_target_attr *na =
564 container_of(attr, struct netconsole_target_attr, attr); 566 container_of(attr, struct netconsole_target_attr, attr);
565 567
568 mutex_lock(&nt->mutex);
566 if (na->store) 569 if (na->store)
567 ret = na->store(nt, buf, count); 570 ret = na->store(nt, buf, count);
571 mutex_unlock(&nt->mutex);
568 572
569 return ret; 573 return ret;
570} 574}
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 846cc19c04f2..8e8d0fcd4979 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -78,7 +78,6 @@
78#define AX_MEDIUM_STATUS_MODE 0x22 78#define AX_MEDIUM_STATUS_MODE 0x22
79 #define AX_MEDIUM_GIGAMODE 0x01 79 #define AX_MEDIUM_GIGAMODE 0x01
80 #define AX_MEDIUM_FULL_DUPLEX 0x02 80 #define AX_MEDIUM_FULL_DUPLEX 0x02
81 #define AX_MEDIUM_ALWAYS_ONE 0x04
82 #define AX_MEDIUM_EN_125MHZ 0x08 81 #define AX_MEDIUM_EN_125MHZ 0x08
83 #define AX_MEDIUM_RXFLOW_CTRLEN 0x10 82 #define AX_MEDIUM_RXFLOW_CTRLEN 0x10
84 #define AX_MEDIUM_TXFLOW_CTRLEN 0x20 83 #define AX_MEDIUM_TXFLOW_CTRLEN 0x20
@@ -1065,8 +1064,8 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
1065 1064
1066 /* Configure default medium type => giga */ 1065 /* Configure default medium type => giga */
1067 *tmp16 = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN | 1066 *tmp16 = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN |
1068 AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_ALWAYS_ONE | 1067 AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_FULL_DUPLEX |
1069 AX_MEDIUM_FULL_DUPLEX | AX_MEDIUM_GIGAMODE; 1068 AX_MEDIUM_GIGAMODE;
1070 ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE, 1069 ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
1071 2, 2, tmp16); 1070 2, 2, tmp16);
1072 1071
@@ -1225,7 +1224,7 @@ static int ax88179_link_reset(struct usbnet *dev)
1225 } 1224 }
1226 1225
1227 mode = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN | 1226 mode = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN |
1228 AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_ALWAYS_ONE; 1227 AX_MEDIUM_RXFLOW_CTRLEN;
1229 1228
1230 ax88179_read_cmd(dev, AX_ACCESS_MAC, PHYSICAL_LINK_STATUS, 1229 ax88179_read_cmd(dev, AX_ACCESS_MAC, PHYSICAL_LINK_STATUS,
1231 1, 1, &link_sts); 1230 1, 1, &link_sts);
@@ -1339,8 +1338,8 @@ static int ax88179_reset(struct usbnet *dev)
1339 1338
1340 /* Configure default medium type => giga */ 1339 /* Configure default medium type => giga */
1341 *tmp16 = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN | 1340 *tmp16 = AX_MEDIUM_RECEIVE_EN | AX_MEDIUM_TXFLOW_CTRLEN |
1342 AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_ALWAYS_ONE | 1341 AX_MEDIUM_RXFLOW_CTRLEN | AX_MEDIUM_FULL_DUPLEX |
1343 AX_MEDIUM_FULL_DUPLEX | AX_MEDIUM_GIGAMODE; 1342 AX_MEDIUM_GIGAMODE;
1344 ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE, 1343 ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
1345 2, 2, tmp16); 1344 2, 2, tmp16);
1346 1345
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 9fbdfcd1e1a0..bbc9cb84ec1f 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1118,11 +1118,6 @@ static int virtnet_cpu_callback(struct notifier_block *nfb,
1118{ 1118{
1119 struct virtnet_info *vi = container_of(nfb, struct virtnet_info, nb); 1119 struct virtnet_info *vi = container_of(nfb, struct virtnet_info, nb);
1120 1120
1121 mutex_lock(&vi->config_lock);
1122
1123 if (!vi->config_enable)
1124 goto done;
1125
1126 switch(action & ~CPU_TASKS_FROZEN) { 1121 switch(action & ~CPU_TASKS_FROZEN) {
1127 case CPU_ONLINE: 1122 case CPU_ONLINE:
1128 case CPU_DOWN_FAILED: 1123 case CPU_DOWN_FAILED:
@@ -1136,8 +1131,6 @@ static int virtnet_cpu_callback(struct notifier_block *nfb,
1136 break; 1131 break;
1137 } 1132 }
1138 1133
1139done:
1140 mutex_unlock(&vi->config_lock);
1141 return NOTIFY_OK; 1134 return NOTIFY_OK;
1142} 1135}
1143 1136
@@ -1699,6 +1692,8 @@ static int virtnet_freeze(struct virtio_device *vdev)
1699 struct virtnet_info *vi = vdev->priv; 1692 struct virtnet_info *vi = vdev->priv;
1700 int i; 1693 int i;
1701 1694
1695 unregister_hotcpu_notifier(&vi->nb);
1696
1702 /* Prevent config work handler from accessing the device */ 1697 /* Prevent config work handler from accessing the device */
1703 mutex_lock(&vi->config_lock); 1698 mutex_lock(&vi->config_lock);
1704 vi->config_enable = false; 1699 vi->config_enable = false;
@@ -1747,6 +1742,10 @@ static int virtnet_restore(struct virtio_device *vdev)
1747 virtnet_set_queues(vi, vi->curr_queue_pairs); 1742 virtnet_set_queues(vi, vi->curr_queue_pairs);
1748 rtnl_unlock(); 1743 rtnl_unlock();
1749 1744
1745 err = register_hotcpu_notifier(&vi->nb);
1746 if (err)
1747 return err;
1748
1750 return 0; 1749 return 0;
1751} 1750}
1752#endif 1751#endif
diff --git a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c
index 5bbcb5e3ee0c..388ddf60a66d 100644
--- a/drivers/net/wan/sbni.c
+++ b/drivers/net/wan/sbni.c
@@ -148,10 +148,6 @@ static int enslave( struct net_device *, struct net_device * );
148static int emancipate( struct net_device * ); 148static int emancipate( struct net_device * );
149#endif 149#endif
150 150
151#ifdef __i386__
152#define ASM_CRC 1
153#endif
154
155static const char version[] = 151static const char version[] =
156 "Granch SBNI12 driver ver 5.0.1 Jun 22 2001 Denis I.Timofeev.\n"; 152 "Granch SBNI12 driver ver 5.0.1 Jun 22 2001 Denis I.Timofeev.\n";
157 153
@@ -1551,88 +1547,6 @@ __setup( "sbni=", sbni_setup );
1551 1547
1552/* -------------------------------------------------------------------------- */ 1548/* -------------------------------------------------------------------------- */
1553 1549
1554#ifdef ASM_CRC
1555
1556static u32
1557calc_crc32( u32 crc, u8 *p, u32 len )
1558{
1559 register u32 _crc;
1560 _crc = crc;
1561
1562 __asm__ __volatile__ (
1563 "xorl %%ebx, %%ebx\n"
1564 "movl %2, %%esi\n"
1565 "movl %3, %%ecx\n"
1566 "movl $crc32tab, %%edi\n"
1567 "shrl $2, %%ecx\n"
1568 "jz 1f\n"
1569
1570 ".align 4\n"
1571 "0:\n"
1572 "movb %%al, %%bl\n"
1573 "movl (%%esi), %%edx\n"
1574 "shrl $8, %%eax\n"
1575 "xorb %%dl, %%bl\n"
1576 "shrl $8, %%edx\n"
1577 "xorl (%%edi,%%ebx,4), %%eax\n"
1578
1579 "movb %%al, %%bl\n"
1580 "shrl $8, %%eax\n"
1581 "xorb %%dl, %%bl\n"
1582 "shrl $8, %%edx\n"
1583 "xorl (%%edi,%%ebx,4), %%eax\n"
1584
1585 "movb %%al, %%bl\n"
1586 "shrl $8, %%eax\n"
1587 "xorb %%dl, %%bl\n"
1588 "movb %%dh, %%dl\n"
1589 "xorl (%%edi,%%ebx,4), %%eax\n"
1590
1591 "movb %%al, %%bl\n"
1592 "shrl $8, %%eax\n"
1593 "xorb %%dl, %%bl\n"
1594 "addl $4, %%esi\n"
1595 "xorl (%%edi,%%ebx,4), %%eax\n"
1596
1597 "decl %%ecx\n"
1598 "jnz 0b\n"
1599
1600 "1:\n"
1601 "movl %3, %%ecx\n"
1602 "andl $3, %%ecx\n"
1603 "jz 2f\n"
1604
1605 "movb %%al, %%bl\n"
1606 "shrl $8, %%eax\n"
1607 "xorb (%%esi), %%bl\n"
1608 "xorl (%%edi,%%ebx,4), %%eax\n"
1609
1610 "decl %%ecx\n"
1611 "jz 2f\n"
1612
1613 "movb %%al, %%bl\n"
1614 "shrl $8, %%eax\n"
1615 "xorb 1(%%esi), %%bl\n"
1616 "xorl (%%edi,%%ebx,4), %%eax\n"
1617
1618 "decl %%ecx\n"
1619 "jz 2f\n"
1620
1621 "movb %%al, %%bl\n"
1622 "shrl $8, %%eax\n"
1623 "xorb 2(%%esi), %%bl\n"
1624 "xorl (%%edi,%%ebx,4), %%eax\n"
1625 "2:\n"
1626 : "=a" (_crc)
1627 : "0" (_crc), "g" (p), "g" (len)
1628 : "bx", "cx", "dx", "si", "di"
1629 );
1630
1631 return _crc;
1632}
1633
1634#else /* ASM_CRC */
1635
1636static u32 1550static u32
1637calc_crc32( u32 crc, u8 *p, u32 len ) 1551calc_crc32( u32 crc, u8 *p, u32 len )
1638{ 1552{
@@ -1642,9 +1556,6 @@ calc_crc32( u32 crc, u8 *p, u32 len )
1642 return crc; 1556 return crc;
1643} 1557}
1644 1558
1645#endif /* ASM_CRC */
1646
1647
1648static u32 crc32tab[] __attribute__ ((aligned(8))) = { 1559static u32 crc32tab[] __attribute__ ((aligned(8))) = {
1649 0xD202EF8D, 0xA505DF1B, 0x3C0C8EA1, 0x4B0BBE37, 1560 0xD202EF8D, 0xA505DF1B, 0x3C0C8EA1, 0x4B0BBE37,
1650 0xD56F2B94, 0xA2681B02, 0x3B614AB8, 0x4C667A2E, 1561 0xD56F2B94, 0xA2681B02, 0x3B614AB8, 0x4C667A2E,
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 5715318d6bab..400fea1de080 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -163,6 +163,7 @@ struct xenvif {
163 unsigned long credit_usec; 163 unsigned long credit_usec;
164 unsigned long remaining_credit; 164 unsigned long remaining_credit;
165 struct timer_list credit_timeout; 165 struct timer_list credit_timeout;
166 u64 credit_window_start;
166 167
167 /* Statistics */ 168 /* Statistics */
168 unsigned long rx_gso_checksum_fixup; 169 unsigned long rx_gso_checksum_fixup;
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 01bb854c7f62..459935a6bfae 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -312,8 +312,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
312 vif->credit_bytes = vif->remaining_credit = ~0UL; 312 vif->credit_bytes = vif->remaining_credit = ~0UL;
313 vif->credit_usec = 0UL; 313 vif->credit_usec = 0UL;
314 init_timer(&vif->credit_timeout); 314 init_timer(&vif->credit_timeout);
315 /* Initialize 'expires' now: it's used to track the credit window. */ 315 vif->credit_window_start = get_jiffies_64();
316 vif->credit_timeout.expires = jiffies;
317 316
318 dev->netdev_ops = &xenvif_netdev_ops; 317 dev->netdev_ops = &xenvif_netdev_ops;
319 dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; 318 dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index f3e591c611de..900da4b243ad 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1185,9 +1185,8 @@ out:
1185 1185
1186static bool tx_credit_exceeded(struct xenvif *vif, unsigned size) 1186static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
1187{ 1187{
1188 unsigned long now = jiffies; 1188 u64 now = get_jiffies_64();
1189 unsigned long next_credit = 1189 u64 next_credit = vif->credit_window_start +
1190 vif->credit_timeout.expires +
1191 msecs_to_jiffies(vif->credit_usec / 1000); 1190 msecs_to_jiffies(vif->credit_usec / 1000);
1192 1191
1193 /* Timer could already be pending in rare cases. */ 1192 /* Timer could already be pending in rare cases. */
@@ -1195,8 +1194,8 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
1195 return true; 1194 return true;
1196 1195
1197 /* Passed the point where we can replenish credit? */ 1196 /* Passed the point where we can replenish credit? */
1198 if (time_after_eq(now, next_credit)) { 1197 if (time_after_eq64(now, next_credit)) {
1199 vif->credit_timeout.expires = now; 1198 vif->credit_window_start = now;
1200 tx_add_credit(vif); 1199 tx_add_credit(vif);
1201 } 1200 }
1202 1201
@@ -1208,6 +1207,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
1208 tx_credit_callback; 1207 tx_credit_callback;
1209 mod_timer(&vif->credit_timeout, 1208 mod_timer(&vif->credit_timeout,
1210 next_credit); 1209 next_credit);
1210 vif->credit_window_start = next_credit;
1211 1211
1212 return true; 1212 return true;
1213 } 1213 }