aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/can/dev.c27
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c45
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.h1
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c24
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c10
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c15
6 files changed, 73 insertions, 49 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
index e21f7cc5ae4d..8d6208c0b400 100644
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -21,6 +21,7 @@
21#include <linux/slab.h> 21#include <linux/slab.h>
22#include <linux/netdevice.h> 22#include <linux/netdevice.h>
23#include <linux/if_arp.h> 23#include <linux/if_arp.h>
24#include <linux/workqueue.h>
24#include <linux/can.h> 25#include <linux/can.h>
25#include <linux/can/dev.h> 26#include <linux/can/dev.h>
26#include <linux/can/skb.h> 27#include <linux/can/skb.h>
@@ -501,9 +502,8 @@ EXPORT_SYMBOL_GPL(can_free_echo_skb);
501/* 502/*
502 * CAN device restart for bus-off recovery 503 * CAN device restart for bus-off recovery
503 */ 504 */
504static void can_restart(unsigned long data) 505static void can_restart(struct net_device *dev)
505{ 506{
506 struct net_device *dev = (struct net_device *)data;
507 struct can_priv *priv = netdev_priv(dev); 507 struct can_priv *priv = netdev_priv(dev);
508 struct net_device_stats *stats = &dev->stats; 508 struct net_device_stats *stats = &dev->stats;
509 struct sk_buff *skb; 509 struct sk_buff *skb;
@@ -543,6 +543,14 @@ restart:
543 netdev_err(dev, "Error %d during restart", err); 543 netdev_err(dev, "Error %d during restart", err);
544} 544}
545 545
546static void can_restart_work(struct work_struct *work)
547{
548 struct delayed_work *dwork = to_delayed_work(work);
549 struct can_priv *priv = container_of(dwork, struct can_priv, restart_work);
550
551 can_restart(priv->dev);
552}
553
546int can_restart_now(struct net_device *dev) 554int can_restart_now(struct net_device *dev)
547{ 555{
548 struct can_priv *priv = netdev_priv(dev); 556 struct can_priv *priv = netdev_priv(dev);
@@ -556,8 +564,8 @@ int can_restart_now(struct net_device *dev)
556 if (priv->state != CAN_STATE_BUS_OFF) 564 if (priv->state != CAN_STATE_BUS_OFF)
557 return -EBUSY; 565 return -EBUSY;
558 566
559 /* Runs as soon as possible in the timer context */ 567 cancel_delayed_work_sync(&priv->restart_work);
560 mod_timer(&priv->restart_timer, jiffies); 568 can_restart(dev);
561 569
562 return 0; 570 return 0;
563} 571}
@@ -578,8 +586,8 @@ void can_bus_off(struct net_device *dev)
578 netif_carrier_off(dev); 586 netif_carrier_off(dev);
579 587
580 if (priv->restart_ms) 588 if (priv->restart_ms)
581 mod_timer(&priv->restart_timer, 589 schedule_delayed_work(&priv->restart_work,
582 jiffies + (priv->restart_ms * HZ) / 1000); 590 msecs_to_jiffies(priv->restart_ms));
583} 591}
584EXPORT_SYMBOL_GPL(can_bus_off); 592EXPORT_SYMBOL_GPL(can_bus_off);
585 593
@@ -688,6 +696,7 @@ struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max)
688 return NULL; 696 return NULL;
689 697
690 priv = netdev_priv(dev); 698 priv = netdev_priv(dev);
699 priv->dev = dev;
691 700
692 if (echo_skb_max) { 701 if (echo_skb_max) {
693 priv->echo_skb_max = echo_skb_max; 702 priv->echo_skb_max = echo_skb_max;
@@ -697,7 +706,7 @@ struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max)
697 706
698 priv->state = CAN_STATE_STOPPED; 707 priv->state = CAN_STATE_STOPPED;
699 708
700 init_timer(&priv->restart_timer); 709 INIT_DELAYED_WORK(&priv->restart_work, can_restart_work);
701 710
702 return dev; 711 return dev;
703} 712}
@@ -778,8 +787,6 @@ int open_candev(struct net_device *dev)
778 if (!netif_carrier_ok(dev)) 787 if (!netif_carrier_ok(dev))
779 netif_carrier_on(dev); 788 netif_carrier_on(dev);
780 789
781 setup_timer(&priv->restart_timer, can_restart, (unsigned long)dev);
782
783 return 0; 790 return 0;
784} 791}
785EXPORT_SYMBOL_GPL(open_candev); 792EXPORT_SYMBOL_GPL(open_candev);
@@ -794,7 +801,7 @@ void close_candev(struct net_device *dev)
794{ 801{
795 struct can_priv *priv = netdev_priv(dev); 802 struct can_priv *priv = netdev_priv(dev);
796 803
797 del_timer_sync(&priv->restart_timer); 804 cancel_delayed_work_sync(&priv->restart_work);
798 can_flush_echo_skb(dev); 805 can_flush_echo_skb(dev);
799} 806}
800EXPORT_SYMBOL_GPL(close_candev); 807EXPORT_SYMBOL_GPL(close_candev);
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 8d4f8495dbb3..541456398dfb 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -453,25 +453,29 @@ static inline void bcmgenet_rdma_ring_writel(struct bcmgenet_priv *priv,
453static int bcmgenet_get_settings(struct net_device *dev, 453static int bcmgenet_get_settings(struct net_device *dev,
454 struct ethtool_cmd *cmd) 454 struct ethtool_cmd *cmd)
455{ 455{
456 struct bcmgenet_priv *priv = netdev_priv(dev);
457
456 if (!netif_running(dev)) 458 if (!netif_running(dev))
457 return -EINVAL; 459 return -EINVAL;
458 460
459 if (!dev->phydev) 461 if (!priv->phydev)
460 return -ENODEV; 462 return -ENODEV;
461 463
462 return phy_ethtool_gset(dev->phydev, cmd); 464 return phy_ethtool_gset(priv->phydev, cmd);
463} 465}
464 466
465static int bcmgenet_set_settings(struct net_device *dev, 467static int bcmgenet_set_settings(struct net_device *dev,
466 struct ethtool_cmd *cmd) 468 struct ethtool_cmd *cmd)
467{ 469{
470 struct bcmgenet_priv *priv = netdev_priv(dev);
471
468 if (!netif_running(dev)) 472 if (!netif_running(dev))
469 return -EINVAL; 473 return -EINVAL;
470 474
471 if (!dev->phydev) 475 if (!priv->phydev)
472 return -ENODEV; 476 return -ENODEV;
473 477
474 return phy_ethtool_sset(dev->phydev, cmd); 478 return phy_ethtool_sset(priv->phydev, cmd);
475} 479}
476 480
477static int bcmgenet_set_rx_csum(struct net_device *dev, 481static int bcmgenet_set_rx_csum(struct net_device *dev,
@@ -937,7 +941,7 @@ static int bcmgenet_get_eee(struct net_device *dev, struct ethtool_eee *e)
937 e->eee_active = p->eee_active; 941 e->eee_active = p->eee_active;
938 e->tx_lpi_timer = bcmgenet_umac_readl(priv, UMAC_EEE_LPI_TIMER); 942 e->tx_lpi_timer = bcmgenet_umac_readl(priv, UMAC_EEE_LPI_TIMER);
939 943
940 return phy_ethtool_get_eee(dev->phydev, e); 944 return phy_ethtool_get_eee(priv->phydev, e);
941} 945}
942 946
943static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e) 947static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
@@ -954,7 +958,7 @@ static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
954 if (!p->eee_enabled) { 958 if (!p->eee_enabled) {
955 bcmgenet_eee_enable_set(dev, false); 959 bcmgenet_eee_enable_set(dev, false);
956 } else { 960 } else {
957 ret = phy_init_eee(dev->phydev, 0); 961 ret = phy_init_eee(priv->phydev, 0);
958 if (ret) { 962 if (ret) {
959 netif_err(priv, hw, dev, "EEE initialization failed\n"); 963 netif_err(priv, hw, dev, "EEE initialization failed\n");
960 return ret; 964 return ret;
@@ -964,12 +968,14 @@ static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_eee *e)
964 bcmgenet_eee_enable_set(dev, true); 968 bcmgenet_eee_enable_set(dev, true);
965 } 969 }
966 970
967 return phy_ethtool_set_eee(dev->phydev, e); 971 return phy_ethtool_set_eee(priv->phydev, e);
968} 972}
969 973
970static int bcmgenet_nway_reset(struct net_device *dev) 974static int bcmgenet_nway_reset(struct net_device *dev)
971{ 975{
972 return genphy_restart_aneg(dev->phydev); 976 struct bcmgenet_priv *priv = netdev_priv(dev);
977
978 return genphy_restart_aneg(priv->phydev);
973} 979}
974 980
975/* standard ethtool support functions. */ 981/* standard ethtool support functions. */
@@ -996,13 +1002,12 @@ static struct ethtool_ops bcmgenet_ethtool_ops = {
996static int bcmgenet_power_down(struct bcmgenet_priv *priv, 1002static int bcmgenet_power_down(struct bcmgenet_priv *priv,
997 enum bcmgenet_power_mode mode) 1003 enum bcmgenet_power_mode mode)
998{ 1004{
999 struct net_device *ndev = priv->dev;
1000 int ret = 0; 1005 int ret = 0;
1001 u32 reg; 1006 u32 reg;
1002 1007
1003 switch (mode) { 1008 switch (mode) {
1004 case GENET_POWER_CABLE_SENSE: 1009 case GENET_POWER_CABLE_SENSE:
1005 phy_detach(ndev->phydev); 1010 phy_detach(priv->phydev);
1006 break; 1011 break;
1007 1012
1008 case GENET_POWER_WOL_MAGIC: 1013 case GENET_POWER_WOL_MAGIC:
@@ -1063,6 +1068,7 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,
1063/* ioctl handle special commands that are not present in ethtool. */ 1068/* ioctl handle special commands that are not present in ethtool. */
1064static int bcmgenet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 1069static int bcmgenet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1065{ 1070{
1071 struct bcmgenet_priv *priv = netdev_priv(dev);
1066 int val = 0; 1072 int val = 0;
1067 1073
1068 if (!netif_running(dev)) 1074 if (!netif_running(dev))
@@ -1072,10 +1078,10 @@ static int bcmgenet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1072 case SIOCGMIIPHY: 1078 case SIOCGMIIPHY:
1073 case SIOCGMIIREG: 1079 case SIOCGMIIREG:
1074 case SIOCSMIIREG: 1080 case SIOCSMIIREG:
1075 if (!dev->phydev) 1081 if (!priv->phydev)
1076 val = -ENODEV; 1082 val = -ENODEV;
1077 else 1083 else
1078 val = phy_mii_ioctl(dev->phydev, rq, cmd); 1084 val = phy_mii_ioctl(priv->phydev, rq, cmd);
1079 break; 1085 break;
1080 1086
1081 default: 1087 default:
@@ -2458,7 +2464,6 @@ static void bcmgenet_irq_task(struct work_struct *work)
2458{ 2464{
2459 struct bcmgenet_priv *priv = container_of( 2465 struct bcmgenet_priv *priv = container_of(
2460 work, struct bcmgenet_priv, bcmgenet_irq_work); 2466 work, struct bcmgenet_priv, bcmgenet_irq_work);
2461 struct net_device *ndev = priv->dev;
2462 2467
2463 netif_dbg(priv, intr, priv->dev, "%s\n", __func__); 2468 netif_dbg(priv, intr, priv->dev, "%s\n", __func__);
2464 2469
@@ -2471,7 +2476,7 @@ static void bcmgenet_irq_task(struct work_struct *work)
2471 2476
2472 /* Link UP/DOWN event */ 2477 /* Link UP/DOWN event */
2473 if (priv->irq0_stat & UMAC_IRQ_LINK_EVENT) { 2478 if (priv->irq0_stat & UMAC_IRQ_LINK_EVENT) {
2474 phy_mac_interrupt(ndev->phydev, 2479 phy_mac_interrupt(priv->phydev,
2475 !!(priv->irq0_stat & UMAC_IRQ_LINK_UP)); 2480 !!(priv->irq0_stat & UMAC_IRQ_LINK_UP));
2476 priv->irq0_stat &= ~UMAC_IRQ_LINK_EVENT; 2481 priv->irq0_stat &= ~UMAC_IRQ_LINK_EVENT;
2477 } 2482 }
@@ -2833,7 +2838,7 @@ static void bcmgenet_netif_start(struct net_device *dev)
2833 /* Monitor link interrupts now */ 2838 /* Monitor link interrupts now */
2834 bcmgenet_link_intr_enable(priv); 2839 bcmgenet_link_intr_enable(priv);
2835 2840
2836 phy_start(dev->phydev); 2841 phy_start(priv->phydev);
2837} 2842}
2838 2843
2839static int bcmgenet_open(struct net_device *dev) 2844static int bcmgenet_open(struct net_device *dev)
@@ -2932,7 +2937,7 @@ static void bcmgenet_netif_stop(struct net_device *dev)
2932 struct bcmgenet_priv *priv = netdev_priv(dev); 2937 struct bcmgenet_priv *priv = netdev_priv(dev);
2933 2938
2934 netif_tx_stop_all_queues(dev); 2939 netif_tx_stop_all_queues(dev);
2935 phy_stop(dev->phydev); 2940 phy_stop(priv->phydev);
2936 bcmgenet_intr_disable(priv); 2941 bcmgenet_intr_disable(priv);
2937 bcmgenet_disable_rx_napi(priv); 2942 bcmgenet_disable_rx_napi(priv);
2938 bcmgenet_disable_tx_napi(priv); 2943 bcmgenet_disable_tx_napi(priv);
@@ -2958,7 +2963,7 @@ static int bcmgenet_close(struct net_device *dev)
2958 bcmgenet_netif_stop(dev); 2963 bcmgenet_netif_stop(dev);
2959 2964
2960 /* Really kill the PHY state machine and disconnect from it */ 2965 /* Really kill the PHY state machine and disconnect from it */
2961 phy_disconnect(dev->phydev); 2966 phy_disconnect(priv->phydev);
2962 2967
2963 /* Disable MAC receive */ 2968 /* Disable MAC receive */
2964 umac_enable_set(priv, CMD_RX_EN, false); 2969 umac_enable_set(priv, CMD_RX_EN, false);
@@ -3517,7 +3522,7 @@ static int bcmgenet_suspend(struct device *d)
3517 3522
3518 bcmgenet_netif_stop(dev); 3523 bcmgenet_netif_stop(dev);
3519 3524
3520 phy_suspend(dev->phydev); 3525 phy_suspend(priv->phydev);
3521 3526
3522 netif_device_detach(dev); 3527 netif_device_detach(dev);
3523 3528
@@ -3581,7 +3586,7 @@ static int bcmgenet_resume(struct device *d)
3581 if (priv->wolopts) 3586 if (priv->wolopts)
3582 clk_disable_unprepare(priv->clk_wol); 3587 clk_disable_unprepare(priv->clk_wol);
3583 3588
3584 phy_init_hw(dev->phydev); 3589 phy_init_hw(priv->phydev);
3585 /* Speed settings must be restored */ 3590 /* Speed settings must be restored */
3586 bcmgenet_mii_config(priv->dev); 3591 bcmgenet_mii_config(priv->dev);
3587 3592
@@ -3614,7 +3619,7 @@ static int bcmgenet_resume(struct device *d)
3614 3619
3615 netif_device_attach(dev); 3620 netif_device_attach(dev);
3616 3621
3617 phy_resume(dev->phydev); 3622 phy_resume(priv->phydev);
3618 3623
3619 if (priv->eee.eee_enabled) 3624 if (priv->eee.eee_enabled)
3620 bcmgenet_eee_enable_set(dev, true); 3625 bcmgenet_eee_enable_set(dev, true);
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
index 0f0868c56f05..1e2dc34d331a 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
@@ -597,6 +597,7 @@ struct bcmgenet_priv {
597 597
598 /* MDIO bus variables */ 598 /* MDIO bus variables */
599 wait_queue_head_t wq; 599 wait_queue_head_t wq;
600 struct phy_device *phydev;
600 bool internal_phy; 601 bool internal_phy;
601 struct device_node *phy_dn; 602 struct device_node *phy_dn;
602 struct device_node *mdio_dn; 603 struct device_node *mdio_dn;
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index e907acd81da9..457c3bc8cfff 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -86,7 +86,7 @@ static int bcmgenet_mii_write(struct mii_bus *bus, int phy_id,
86void bcmgenet_mii_setup(struct net_device *dev) 86void bcmgenet_mii_setup(struct net_device *dev)
87{ 87{
88 struct bcmgenet_priv *priv = netdev_priv(dev); 88 struct bcmgenet_priv *priv = netdev_priv(dev);
89 struct phy_device *phydev = dev->phydev; 89 struct phy_device *phydev = priv->phydev;
90 u32 reg, cmd_bits = 0; 90 u32 reg, cmd_bits = 0;
91 bool status_changed = false; 91 bool status_changed = false;
92 92
@@ -183,9 +183,9 @@ void bcmgenet_mii_reset(struct net_device *dev)
183 if (GENET_IS_V4(priv)) 183 if (GENET_IS_V4(priv))
184 return; 184 return;
185 185
186 if (dev->phydev) { 186 if (priv->phydev) {
187 phy_init_hw(dev->phydev); 187 phy_init_hw(priv->phydev);
188 phy_start_aneg(dev->phydev); 188 phy_start_aneg(priv->phydev);
189 } 189 }
190} 190}
191 191
@@ -236,7 +236,6 @@ static void bcmgenet_internal_phy_setup(struct net_device *dev)
236 236
237static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv) 237static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv)
238{ 238{
239 struct net_device *ndev = priv->dev;
240 u32 reg; 239 u32 reg;
241 240
242 /* Speed settings are set in bcmgenet_mii_setup() */ 241 /* Speed settings are set in bcmgenet_mii_setup() */
@@ -245,14 +244,14 @@ static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv)
245 bcmgenet_sys_writel(priv, reg, SYS_PORT_CTRL); 244 bcmgenet_sys_writel(priv, reg, SYS_PORT_CTRL);
246 245
247 if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET) 246 if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET)
248 fixed_phy_set_link_update(ndev->phydev, 247 fixed_phy_set_link_update(priv->phydev,
249 bcmgenet_fixed_phy_link_update); 248 bcmgenet_fixed_phy_link_update);
250} 249}
251 250
252int bcmgenet_mii_config(struct net_device *dev) 251int bcmgenet_mii_config(struct net_device *dev)
253{ 252{
254 struct bcmgenet_priv *priv = netdev_priv(dev); 253 struct bcmgenet_priv *priv = netdev_priv(dev);
255 struct phy_device *phydev = dev->phydev; 254 struct phy_device *phydev = priv->phydev;
256 struct device *kdev = &priv->pdev->dev; 255 struct device *kdev = &priv->pdev->dev;
257 const char *phy_name = NULL; 256 const char *phy_name = NULL;
258 u32 id_mode_dis = 0; 257 u32 id_mode_dis = 0;
@@ -303,7 +302,7 @@ int bcmgenet_mii_config(struct net_device *dev)
303 * capabilities, use that knowledge to also configure the 302 * capabilities, use that knowledge to also configure the
304 * Reverse MII interface correctly. 303 * Reverse MII interface correctly.
305 */ 304 */
306 if ((phydev->supported & PHY_BASIC_FEATURES) == 305 if ((priv->phydev->supported & PHY_BASIC_FEATURES) ==
307 PHY_BASIC_FEATURES) 306 PHY_BASIC_FEATURES)
308 port_ctrl = PORT_MODE_EXT_RVMII_25; 307 port_ctrl = PORT_MODE_EXT_RVMII_25;
309 else 308 else
@@ -372,7 +371,7 @@ int bcmgenet_mii_probe(struct net_device *dev)
372 return -ENODEV; 371 return -ENODEV;
373 } 372 }
374 } else { 373 } else {
375 phydev = dev->phydev; 374 phydev = priv->phydev;
376 phydev->dev_flags = phy_flags; 375 phydev->dev_flags = phy_flags;
377 376
378 ret = phy_connect_direct(dev, phydev, bcmgenet_mii_setup, 377 ret = phy_connect_direct(dev, phydev, bcmgenet_mii_setup,
@@ -383,6 +382,8 @@ int bcmgenet_mii_probe(struct net_device *dev)
383 } 382 }
384 } 383 }
385 384
385 priv->phydev = phydev;
386
386 /* Configure port multiplexer based on what the probed PHY device since 387 /* Configure port multiplexer based on what the probed PHY device since
387 * reading the 'max-speed' property determines the maximum supported 388 * reading the 'max-speed' property determines the maximum supported
388 * PHY speed which is needed for bcmgenet_mii_config() to configure 389 * PHY speed which is needed for bcmgenet_mii_config() to configure
@@ -390,7 +391,7 @@ int bcmgenet_mii_probe(struct net_device *dev)
390 */ 391 */
391 ret = bcmgenet_mii_config(dev); 392 ret = bcmgenet_mii_config(dev);
392 if (ret) { 393 if (ret) {
393 phy_disconnect(phydev); 394 phy_disconnect(priv->phydev);
394 return ret; 395 return ret;
395 } 396 }
396 397
@@ -400,7 +401,7 @@ int bcmgenet_mii_probe(struct net_device *dev)
400 * Ethernet MAC ISRs 401 * Ethernet MAC ISRs
401 */ 402 */
402 if (priv->internal_phy) 403 if (priv->internal_phy)
403 phydev->irq = PHY_IGNORE_INTERRUPT; 404 priv->phydev->irq = PHY_IGNORE_INTERRUPT;
404 405
405 return 0; 406 return 0;
406} 407}
@@ -605,6 +606,7 @@ static int bcmgenet_mii_pd_init(struct bcmgenet_priv *priv)
605 606
606 } 607 }
607 608
609 priv->phydev = phydev;
608 priv->phy_interface = pd->phy_interface; 610 priv->phy_interface = pd->phy_interface;
609 611
610 return 0; 612 return 0;
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index a2551bcd1027..ea967df4b202 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -18122,14 +18122,14 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
18122 18122
18123 rtnl_lock(); 18123 rtnl_lock();
18124 18124
18125 /* We needn't recover from permanent error */
18126 if (state == pci_channel_io_frozen)
18127 tp->pcierr_recovery = true;
18128
18129 /* We probably don't have netdev yet */ 18125 /* We probably don't have netdev yet */
18130 if (!netdev || !netif_running(netdev)) 18126 if (!netdev || !netif_running(netdev))
18131 goto done; 18127 goto done;
18132 18128
18129 /* We needn't recover from permanent error */
18130 if (state == pci_channel_io_frozen)
18131 tp->pcierr_recovery = true;
18132
18133 tg3_phy_stop(tp); 18133 tg3_phy_stop(tp);
18134 18134
18135 tg3_netif_stop(tp); 18135 tg3_netif_stop(tp);
@@ -18226,7 +18226,7 @@ static void tg3_io_resume(struct pci_dev *pdev)
18226 18226
18227 rtnl_lock(); 18227 rtnl_lock();
18228 18228
18229 if (!netif_running(netdev)) 18229 if (!netdev || !netif_running(netdev))
18230 goto done; 18230 goto done;
18231 18231
18232 tg3_full_lock(tp, 0); 18232 tg3_full_lock(tp, 0);
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 01f7e811739b..692ee248e486 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -89,10 +89,10 @@ static struct platform_device_id fec_devtype[] = {
89 .driver_data = 0, 89 .driver_data = 0,
90 }, { 90 }, {
91 .name = "imx25-fec", 91 .name = "imx25-fec",
92 .driver_data = FEC_QUIRK_USE_GASKET | FEC_QUIRK_HAS_RACC, 92 .driver_data = FEC_QUIRK_USE_GASKET,
93 }, { 93 }, {
94 .name = "imx27-fec", 94 .name = "imx27-fec",
95 .driver_data = FEC_QUIRK_HAS_RACC, 95 .driver_data = 0,
96 }, { 96 }, {
97 .name = "imx28-fec", 97 .name = "imx28-fec",
98 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME | 98 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME |
@@ -180,6 +180,7 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
180/* FEC receive acceleration */ 180/* FEC receive acceleration */
181#define FEC_RACC_IPDIS (1 << 1) 181#define FEC_RACC_IPDIS (1 << 1)
182#define FEC_RACC_PRODIS (1 << 2) 182#define FEC_RACC_PRODIS (1 << 2)
183#define FEC_RACC_SHIFT16 BIT(7)
183#define FEC_RACC_OPTIONS (FEC_RACC_IPDIS | FEC_RACC_PRODIS) 184#define FEC_RACC_OPTIONS (FEC_RACC_IPDIS | FEC_RACC_PRODIS)
184 185
185/* 186/*
@@ -945,9 +946,11 @@ fec_restart(struct net_device *ndev)
945 946
946#if !defined(CONFIG_M5272) 947#if !defined(CONFIG_M5272)
947 if (fep->quirks & FEC_QUIRK_HAS_RACC) { 948 if (fep->quirks & FEC_QUIRK_HAS_RACC) {
948 /* set RX checksum */
949 val = readl(fep->hwp + FEC_RACC); 949 val = readl(fep->hwp + FEC_RACC);
950 /* align IP header */
951 val |= FEC_RACC_SHIFT16;
950 if (fep->csum_flags & FLAG_RX_CSUM_ENABLED) 952 if (fep->csum_flags & FLAG_RX_CSUM_ENABLED)
953 /* set RX checksum */
951 val |= FEC_RACC_OPTIONS; 954 val |= FEC_RACC_OPTIONS;
952 else 955 else
953 val &= ~FEC_RACC_OPTIONS; 956 val &= ~FEC_RACC_OPTIONS;
@@ -1428,6 +1431,12 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
1428 prefetch(skb->data - NET_IP_ALIGN); 1431 prefetch(skb->data - NET_IP_ALIGN);
1429 skb_put(skb, pkt_len - 4); 1432 skb_put(skb, pkt_len - 4);
1430 data = skb->data; 1433 data = skb->data;
1434
1435#if !defined(CONFIG_M5272)
1436 if (fep->quirks & FEC_QUIRK_HAS_RACC)
1437 data = skb_pull_inline(skb, 2);
1438#endif
1439
1431 if (!is_copybreak && need_swap) 1440 if (!is_copybreak && need_swap)
1432 swap_buffer(data, pkt_len); 1441 swap_buffer(data, pkt_len);
1433 1442