diff options
Diffstat (limited to 'drivers/net')
59 files changed, 985 insertions, 595 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 84673ebcf428..df51d6025a90 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -157,7 +157,7 @@ config IPVLAN | |||
157 | making it transparent to the connected L2 switch. | 157 | making it transparent to the connected L2 switch. |
158 | 158 | ||
159 | Ipvlan devices can be added using the "ip" command from the | 159 | Ipvlan devices can be added using the "ip" command from the |
160 | iproute2 package starting with the iproute2-X.Y.ZZ release: | 160 | iproute2 package starting with the iproute2-3.19 release: |
161 | 161 | ||
162 | "ip link add link <main-dev> [ NAME ] type ipvlan" | 162 | "ip link add link <main-dev> [ NAME ] type ipvlan" |
163 | 163 | ||
diff --git a/drivers/net/appletalk/Kconfig b/drivers/net/appletalk/Kconfig index 4ce6ca5f3d36..dc6b78e5342f 100644 --- a/drivers/net/appletalk/Kconfig +++ b/drivers/net/appletalk/Kconfig | |||
@@ -40,7 +40,7 @@ config DEV_APPLETALK | |||
40 | 40 | ||
41 | config LTPC | 41 | config LTPC |
42 | tristate "Apple/Farallon LocalTalk PC support" | 42 | tristate "Apple/Farallon LocalTalk PC support" |
43 | depends on DEV_APPLETALK && (ISA || EISA) && ISA_DMA_API | 43 | depends on DEV_APPLETALK && (ISA || EISA) && ISA_DMA_API && VIRT_TO_BUS |
44 | help | 44 | help |
45 | This allows you to use the AppleTalk PC card to connect to LocalTalk | 45 | This allows you to use the AppleTalk PC card to connect to LocalTalk |
46 | networks. The card is also known as the Farallon PhoneNet PC card. | 46 | networks. The card is also known as the Farallon PhoneNet PC card. |
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h index 0f217e99904f..22e2ebf31333 100644 --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h | |||
@@ -107,8 +107,8 @@ static inline u64 name##_readq(struct bcm_sf2_priv *priv, u32 off) \ | |||
107 | { \ | 107 | { \ |
108 | u32 indir, dir; \ | 108 | u32 indir, dir; \ |
109 | spin_lock(&priv->indir_lock); \ | 109 | spin_lock(&priv->indir_lock); \ |
110 | indir = reg_readl(priv, REG_DIR_DATA_READ); \ | ||
111 | dir = __raw_readl(priv->name + off); \ | 110 | dir = __raw_readl(priv->name + off); \ |
111 | indir = reg_readl(priv, REG_DIR_DATA_READ); \ | ||
112 | spin_unlock(&priv->indir_lock); \ | 112 | spin_unlock(&priv->indir_lock); \ |
113 | return (u64)indir << 32 | dir; \ | 113 | return (u64)indir << 32 | dir; \ |
114 | } \ | 114 | } \ |
diff --git a/drivers/net/ethernet/8390/axnet_cs.c b/drivers/net/ethernet/8390/axnet_cs.c index 7769c05543f1..ec6eac1f8c95 100644 --- a/drivers/net/ethernet/8390/axnet_cs.c +++ b/drivers/net/ethernet/8390/axnet_cs.c | |||
@@ -484,11 +484,8 @@ static int axnet_open(struct net_device *dev) | |||
484 | link->open++; | 484 | link->open++; |
485 | 485 | ||
486 | info->link_status = 0x00; | 486 | info->link_status = 0x00; |
487 | init_timer(&info->watchdog); | 487 | setup_timer(&info->watchdog, ei_watchdog, (u_long)dev); |
488 | info->watchdog.function = ei_watchdog; | 488 | mod_timer(&info->watchdog, jiffies + HZ); |
489 | info->watchdog.data = (u_long)dev; | ||
490 | info->watchdog.expires = jiffies + HZ; | ||
491 | add_timer(&info->watchdog); | ||
492 | 489 | ||
493 | return ax_open(dev); | 490 | return ax_open(dev); |
494 | } /* axnet_open */ | 491 | } /* axnet_open */ |
diff --git a/drivers/net/ethernet/8390/pcnet_cs.c b/drivers/net/ethernet/8390/pcnet_cs.c index 9fb7b9d4fd6c..2777289a26c0 100644 --- a/drivers/net/ethernet/8390/pcnet_cs.c +++ b/drivers/net/ethernet/8390/pcnet_cs.c | |||
@@ -918,11 +918,8 @@ static int pcnet_open(struct net_device *dev) | |||
918 | 918 | ||
919 | info->phy_id = info->eth_phy; | 919 | info->phy_id = info->eth_phy; |
920 | info->link_status = 0x00; | 920 | info->link_status = 0x00; |
921 | init_timer(&info->watchdog); | 921 | setup_timer(&info->watchdog, ei_watchdog, (u_long)dev); |
922 | info->watchdog.function = ei_watchdog; | 922 | mod_timer(&info->watchdog, jiffies + HZ); |
923 | info->watchdog.data = (u_long)dev; | ||
924 | info->watchdog.expires = jiffies + HZ; | ||
925 | add_timer(&info->watchdog); | ||
926 | 923 | ||
927 | return ei_open(dev); | 924 | return ei_open(dev); |
928 | } /* pcnet_open */ | 925 | } /* pcnet_open */ |
diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c index a1ee261bff5c..fd9296a5014d 100644 --- a/drivers/net/ethernet/altera/altera_tse_main.c +++ b/drivers/net/ethernet/altera/altera_tse_main.c | |||
@@ -376,7 +376,8 @@ static int tse_rx(struct altera_tse_private *priv, int limit) | |||
376 | u16 pktlength; | 376 | u16 pktlength; |
377 | u16 pktstatus; | 377 | u16 pktstatus; |
378 | 378 | ||
379 | while ((rxstatus = priv->dmaops->get_rx_status(priv)) != 0) { | 379 | while (((rxstatus = priv->dmaops->get_rx_status(priv)) != 0) && |
380 | (count < limit)) { | ||
380 | pktstatus = rxstatus >> 16; | 381 | pktstatus = rxstatus >> 16; |
381 | pktlength = rxstatus & 0xffff; | 382 | pktlength = rxstatus & 0xffff; |
382 | 383 | ||
@@ -491,28 +492,27 @@ static int tse_poll(struct napi_struct *napi, int budget) | |||
491 | struct altera_tse_private *priv = | 492 | struct altera_tse_private *priv = |
492 | container_of(napi, struct altera_tse_private, napi); | 493 | container_of(napi, struct altera_tse_private, napi); |
493 | int rxcomplete = 0; | 494 | int rxcomplete = 0; |
494 | int txcomplete = 0; | ||
495 | unsigned long int flags; | 495 | unsigned long int flags; |
496 | 496 | ||
497 | txcomplete = tse_tx_complete(priv); | 497 | tse_tx_complete(priv); |
498 | 498 | ||
499 | rxcomplete = tse_rx(priv, budget); | 499 | rxcomplete = tse_rx(priv, budget); |
500 | 500 | ||
501 | if (rxcomplete >= budget || txcomplete > 0) | 501 | if (rxcomplete < budget) { |
502 | return rxcomplete; | ||
503 | 502 | ||
504 | napi_gro_flush(napi, false); | 503 | napi_gro_flush(napi, false); |
505 | __napi_complete(napi); | 504 | __napi_complete(napi); |
506 | 505 | ||
507 | netdev_dbg(priv->dev, | 506 | netdev_dbg(priv->dev, |
508 | "NAPI Complete, did %d packets with budget %d\n", | 507 | "NAPI Complete, did %d packets with budget %d\n", |
509 | txcomplete+rxcomplete, budget); | 508 | rxcomplete, budget); |
510 | 509 | ||
511 | spin_lock_irqsave(&priv->rxdma_irq_lock, flags); | 510 | spin_lock_irqsave(&priv->rxdma_irq_lock, flags); |
512 | priv->dmaops->enable_rxirq(priv); | 511 | priv->dmaops->enable_rxirq(priv); |
513 | priv->dmaops->enable_txirq(priv); | 512 | priv->dmaops->enable_txirq(priv); |
514 | spin_unlock_irqrestore(&priv->rxdma_irq_lock, flags); | 513 | spin_unlock_irqrestore(&priv->rxdma_irq_lock, flags); |
515 | return rxcomplete + txcomplete; | 514 | } |
515 | return rxcomplete; | ||
516 | } | 516 | } |
517 | 517 | ||
518 | /* DMA TX & RX FIFO interrupt routing | 518 | /* DMA TX & RX FIFO interrupt routing |
@@ -521,7 +521,6 @@ static irqreturn_t altera_isr(int irq, void *dev_id) | |||
521 | { | 521 | { |
522 | struct net_device *dev = dev_id; | 522 | struct net_device *dev = dev_id; |
523 | struct altera_tse_private *priv; | 523 | struct altera_tse_private *priv; |
524 | unsigned long int flags; | ||
525 | 524 | ||
526 | if (unlikely(!dev)) { | 525 | if (unlikely(!dev)) { |
527 | pr_err("%s: invalid dev pointer\n", __func__); | 526 | pr_err("%s: invalid dev pointer\n", __func__); |
@@ -529,20 +528,20 @@ static irqreturn_t altera_isr(int irq, void *dev_id) | |||
529 | } | 528 | } |
530 | priv = netdev_priv(dev); | 529 | priv = netdev_priv(dev); |
531 | 530 | ||
532 | /* turn off desc irqs and enable napi rx */ | 531 | spin_lock(&priv->rxdma_irq_lock); |
533 | spin_lock_irqsave(&priv->rxdma_irq_lock, flags); | 532 | /* reset IRQs */ |
533 | priv->dmaops->clear_rxirq(priv); | ||
534 | priv->dmaops->clear_txirq(priv); | ||
535 | spin_unlock(&priv->rxdma_irq_lock); | ||
534 | 536 | ||
535 | if (likely(napi_schedule_prep(&priv->napi))) { | 537 | if (likely(napi_schedule_prep(&priv->napi))) { |
538 | spin_lock(&priv->rxdma_irq_lock); | ||
536 | priv->dmaops->disable_rxirq(priv); | 539 | priv->dmaops->disable_rxirq(priv); |
537 | priv->dmaops->disable_txirq(priv); | 540 | priv->dmaops->disable_txirq(priv); |
541 | spin_unlock(&priv->rxdma_irq_lock); | ||
538 | __napi_schedule(&priv->napi); | 542 | __napi_schedule(&priv->napi); |
539 | } | 543 | } |
540 | 544 | ||
541 | /* reset IRQs */ | ||
542 | priv->dmaops->clear_rxirq(priv); | ||
543 | priv->dmaops->clear_txirq(priv); | ||
544 | |||
545 | spin_unlock_irqrestore(&priv->rxdma_irq_lock, flags); | ||
546 | 545 | ||
547 | return IRQ_HANDLED; | 546 | return IRQ_HANDLED; |
548 | } | 547 | } |
@@ -1407,7 +1406,7 @@ static int altera_tse_probe(struct platform_device *pdev) | |||
1407 | } | 1406 | } |
1408 | 1407 | ||
1409 | if (of_property_read_u32(pdev->dev.of_node, "tx-fifo-depth", | 1408 | if (of_property_read_u32(pdev->dev.of_node, "tx-fifo-depth", |
1410 | &priv->rx_fifo_depth)) { | 1409 | &priv->tx_fifo_depth)) { |
1411 | dev_err(&pdev->dev, "cannot obtain tx-fifo-depth\n"); | 1410 | dev_err(&pdev->dev, "cannot obtain tx-fifo-depth\n"); |
1412 | ret = -ENXIO; | 1411 | ret = -ENXIO; |
1413 | goto err_free_netdev; | 1412 | goto err_free_netdev; |
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index b93d4404d975..885b02b5be07 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | |||
@@ -609,6 +609,68 @@ static void xgbe_napi_disable(struct xgbe_prv_data *pdata, unsigned int del) | |||
609 | } | 609 | } |
610 | } | 610 | } |
611 | 611 | ||
612 | static int xgbe_request_irqs(struct xgbe_prv_data *pdata) | ||
613 | { | ||
614 | struct xgbe_channel *channel; | ||
615 | struct net_device *netdev = pdata->netdev; | ||
616 | unsigned int i; | ||
617 | int ret; | ||
618 | |||
619 | ret = devm_request_irq(pdata->dev, pdata->dev_irq, xgbe_isr, 0, | ||
620 | netdev->name, pdata); | ||
621 | if (ret) { | ||
622 | netdev_alert(netdev, "error requesting irq %d\n", | ||
623 | pdata->dev_irq); | ||
624 | return ret; | ||
625 | } | ||
626 | |||
627 | if (!pdata->per_channel_irq) | ||
628 | return 0; | ||
629 | |||
630 | channel = pdata->channel; | ||
631 | for (i = 0; i < pdata->channel_count; i++, channel++) { | ||
632 | snprintf(channel->dma_irq_name, | ||
633 | sizeof(channel->dma_irq_name) - 1, | ||
634 | "%s-TxRx-%u", netdev_name(netdev), | ||
635 | channel->queue_index); | ||
636 | |||
637 | ret = devm_request_irq(pdata->dev, channel->dma_irq, | ||
638 | xgbe_dma_isr, 0, | ||
639 | channel->dma_irq_name, channel); | ||
640 | if (ret) { | ||
641 | netdev_alert(netdev, "error requesting irq %d\n", | ||
642 | channel->dma_irq); | ||
643 | goto err_irq; | ||
644 | } | ||
645 | } | ||
646 | |||
647 | return 0; | ||
648 | |||
649 | err_irq: | ||
650 | /* Using an unsigned int, 'i' will go to UINT_MAX and exit */ | ||
651 | for (i--, channel--; i < pdata->channel_count; i--, channel--) | ||
652 | devm_free_irq(pdata->dev, channel->dma_irq, channel); | ||
653 | |||
654 | devm_free_irq(pdata->dev, pdata->dev_irq, pdata); | ||
655 | |||
656 | return ret; | ||
657 | } | ||
658 | |||
659 | static void xgbe_free_irqs(struct xgbe_prv_data *pdata) | ||
660 | { | ||
661 | struct xgbe_channel *channel; | ||
662 | unsigned int i; | ||
663 | |||
664 | devm_free_irq(pdata->dev, pdata->dev_irq, pdata); | ||
665 | |||
666 | if (!pdata->per_channel_irq) | ||
667 | return; | ||
668 | |||
669 | channel = pdata->channel; | ||
670 | for (i = 0; i < pdata->channel_count; i++, channel++) | ||
671 | devm_free_irq(pdata->dev, channel->dma_irq, channel); | ||
672 | } | ||
673 | |||
612 | void xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata) | 674 | void xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata) |
613 | { | 675 | { |
614 | struct xgbe_hw_if *hw_if = &pdata->hw_if; | 676 | struct xgbe_hw_if *hw_if = &pdata->hw_if; |
@@ -810,20 +872,20 @@ int xgbe_powerdown(struct net_device *netdev, unsigned int caller) | |||
810 | return -EINVAL; | 872 | return -EINVAL; |
811 | } | 873 | } |
812 | 874 | ||
813 | phy_stop(pdata->phydev); | ||
814 | |||
815 | spin_lock_irqsave(&pdata->lock, flags); | 875 | spin_lock_irqsave(&pdata->lock, flags); |
816 | 876 | ||
817 | if (caller == XGMAC_DRIVER_CONTEXT) | 877 | if (caller == XGMAC_DRIVER_CONTEXT) |
818 | netif_device_detach(netdev); | 878 | netif_device_detach(netdev); |
819 | 879 | ||
820 | netif_tx_stop_all_queues(netdev); | 880 | netif_tx_stop_all_queues(netdev); |
821 | xgbe_napi_disable(pdata, 0); | ||
822 | 881 | ||
823 | /* Powerdown Tx/Rx */ | ||
824 | hw_if->powerdown_tx(pdata); | 882 | hw_if->powerdown_tx(pdata); |
825 | hw_if->powerdown_rx(pdata); | 883 | hw_if->powerdown_rx(pdata); |
826 | 884 | ||
885 | xgbe_napi_disable(pdata, 0); | ||
886 | |||
887 | phy_stop(pdata->phydev); | ||
888 | |||
827 | pdata->power_down = 1; | 889 | pdata->power_down = 1; |
828 | 890 | ||
829 | spin_unlock_irqrestore(&pdata->lock, flags); | 891 | spin_unlock_irqrestore(&pdata->lock, flags); |
@@ -854,14 +916,14 @@ int xgbe_powerup(struct net_device *netdev, unsigned int caller) | |||
854 | 916 | ||
855 | phy_start(pdata->phydev); | 917 | phy_start(pdata->phydev); |
856 | 918 | ||
857 | /* Enable Tx/Rx */ | 919 | xgbe_napi_enable(pdata, 0); |
920 | |||
858 | hw_if->powerup_tx(pdata); | 921 | hw_if->powerup_tx(pdata); |
859 | hw_if->powerup_rx(pdata); | 922 | hw_if->powerup_rx(pdata); |
860 | 923 | ||
861 | if (caller == XGMAC_DRIVER_CONTEXT) | 924 | if (caller == XGMAC_DRIVER_CONTEXT) |
862 | netif_device_attach(netdev); | 925 | netif_device_attach(netdev); |
863 | 926 | ||
864 | xgbe_napi_enable(pdata, 0); | ||
865 | netif_tx_start_all_queues(netdev); | 927 | netif_tx_start_all_queues(netdev); |
866 | 928 | ||
867 | spin_unlock_irqrestore(&pdata->lock, flags); | 929 | spin_unlock_irqrestore(&pdata->lock, flags); |
@@ -875,6 +937,7 @@ static int xgbe_start(struct xgbe_prv_data *pdata) | |||
875 | { | 937 | { |
876 | struct xgbe_hw_if *hw_if = &pdata->hw_if; | 938 | struct xgbe_hw_if *hw_if = &pdata->hw_if; |
877 | struct net_device *netdev = pdata->netdev; | 939 | struct net_device *netdev = pdata->netdev; |
940 | int ret; | ||
878 | 941 | ||
879 | DBGPR("-->xgbe_start\n"); | 942 | DBGPR("-->xgbe_start\n"); |
880 | 943 | ||
@@ -884,17 +947,31 @@ static int xgbe_start(struct xgbe_prv_data *pdata) | |||
884 | 947 | ||
885 | phy_start(pdata->phydev); | 948 | phy_start(pdata->phydev); |
886 | 949 | ||
950 | xgbe_napi_enable(pdata, 1); | ||
951 | |||
952 | ret = xgbe_request_irqs(pdata); | ||
953 | if (ret) | ||
954 | goto err_napi; | ||
955 | |||
887 | hw_if->enable_tx(pdata); | 956 | hw_if->enable_tx(pdata); |
888 | hw_if->enable_rx(pdata); | 957 | hw_if->enable_rx(pdata); |
889 | 958 | ||
890 | xgbe_init_tx_timers(pdata); | 959 | xgbe_init_tx_timers(pdata); |
891 | 960 | ||
892 | xgbe_napi_enable(pdata, 1); | ||
893 | netif_tx_start_all_queues(netdev); | 961 | netif_tx_start_all_queues(netdev); |
894 | 962 | ||
895 | DBGPR("<--xgbe_start\n"); | 963 | DBGPR("<--xgbe_start\n"); |
896 | 964 | ||
897 | return 0; | 965 | return 0; |
966 | |||
967 | err_napi: | ||
968 | xgbe_napi_disable(pdata, 1); | ||
969 | |||
970 | phy_stop(pdata->phydev); | ||
971 | |||
972 | hw_if->exit(pdata); | ||
973 | |||
974 | return ret; | ||
898 | } | 975 | } |
899 | 976 | ||
900 | static void xgbe_stop(struct xgbe_prv_data *pdata) | 977 | static void xgbe_stop(struct xgbe_prv_data *pdata) |
@@ -907,16 +984,21 @@ static void xgbe_stop(struct xgbe_prv_data *pdata) | |||
907 | 984 | ||
908 | DBGPR("-->xgbe_stop\n"); | 985 | DBGPR("-->xgbe_stop\n"); |
909 | 986 | ||
910 | phy_stop(pdata->phydev); | ||
911 | |||
912 | netif_tx_stop_all_queues(netdev); | 987 | netif_tx_stop_all_queues(netdev); |
913 | xgbe_napi_disable(pdata, 1); | ||
914 | 988 | ||
915 | xgbe_stop_tx_timers(pdata); | 989 | xgbe_stop_tx_timers(pdata); |
916 | 990 | ||
917 | hw_if->disable_tx(pdata); | 991 | hw_if->disable_tx(pdata); |
918 | hw_if->disable_rx(pdata); | 992 | hw_if->disable_rx(pdata); |
919 | 993 | ||
994 | xgbe_free_irqs(pdata); | ||
995 | |||
996 | xgbe_napi_disable(pdata, 1); | ||
997 | |||
998 | phy_stop(pdata->phydev); | ||
999 | |||
1000 | hw_if->exit(pdata); | ||
1001 | |||
920 | channel = pdata->channel; | 1002 | channel = pdata->channel; |
921 | for (i = 0; i < pdata->channel_count; i++, channel++) { | 1003 | for (i = 0; i < pdata->channel_count; i++, channel++) { |
922 | if (!channel->tx_ring) | 1004 | if (!channel->tx_ring) |
@@ -931,10 +1013,6 @@ static void xgbe_stop(struct xgbe_prv_data *pdata) | |||
931 | 1013 | ||
932 | static void xgbe_restart_dev(struct xgbe_prv_data *pdata) | 1014 | static void xgbe_restart_dev(struct xgbe_prv_data *pdata) |
933 | { | 1015 | { |
934 | struct xgbe_channel *channel; | ||
935 | struct xgbe_hw_if *hw_if = &pdata->hw_if; | ||
936 | unsigned int i; | ||
937 | |||
938 | DBGPR("-->xgbe_restart_dev\n"); | 1016 | DBGPR("-->xgbe_restart_dev\n"); |
939 | 1017 | ||
940 | /* If not running, "restart" will happen on open */ | 1018 | /* If not running, "restart" will happen on open */ |
@@ -942,19 +1020,10 @@ static void xgbe_restart_dev(struct xgbe_prv_data *pdata) | |||
942 | return; | 1020 | return; |
943 | 1021 | ||
944 | xgbe_stop(pdata); | 1022 | xgbe_stop(pdata); |
945 | synchronize_irq(pdata->dev_irq); | ||
946 | if (pdata->per_channel_irq) { | ||
947 | channel = pdata->channel; | ||
948 | for (i = 0; i < pdata->channel_count; i++, channel++) | ||
949 | synchronize_irq(channel->dma_irq); | ||
950 | } | ||
951 | 1023 | ||
952 | xgbe_free_tx_data(pdata); | 1024 | xgbe_free_tx_data(pdata); |
953 | xgbe_free_rx_data(pdata); | 1025 | xgbe_free_rx_data(pdata); |
954 | 1026 | ||
955 | /* Issue software reset to device */ | ||
956 | hw_if->exit(pdata); | ||
957 | |||
958 | xgbe_start(pdata); | 1027 | xgbe_start(pdata); |
959 | 1028 | ||
960 | DBGPR("<--xgbe_restart_dev\n"); | 1029 | DBGPR("<--xgbe_restart_dev\n"); |
@@ -1283,10 +1352,7 @@ static void xgbe_packet_info(struct xgbe_prv_data *pdata, | |||
1283 | static int xgbe_open(struct net_device *netdev) | 1352 | static int xgbe_open(struct net_device *netdev) |
1284 | { | 1353 | { |
1285 | struct xgbe_prv_data *pdata = netdev_priv(netdev); | 1354 | struct xgbe_prv_data *pdata = netdev_priv(netdev); |
1286 | struct xgbe_hw_if *hw_if = &pdata->hw_if; | ||
1287 | struct xgbe_desc_if *desc_if = &pdata->desc_if; | 1355 | struct xgbe_desc_if *desc_if = &pdata->desc_if; |
1288 | struct xgbe_channel *channel = NULL; | ||
1289 | unsigned int i = 0; | ||
1290 | int ret; | 1356 | int ret; |
1291 | 1357 | ||
1292 | DBGPR("-->xgbe_open\n"); | 1358 | DBGPR("-->xgbe_open\n"); |
@@ -1329,55 +1395,14 @@ static int xgbe_open(struct net_device *netdev) | |||
1329 | INIT_WORK(&pdata->restart_work, xgbe_restart); | 1395 | INIT_WORK(&pdata->restart_work, xgbe_restart); |
1330 | INIT_WORK(&pdata->tx_tstamp_work, xgbe_tx_tstamp); | 1396 | INIT_WORK(&pdata->tx_tstamp_work, xgbe_tx_tstamp); |
1331 | 1397 | ||
1332 | /* Request interrupts */ | ||
1333 | ret = devm_request_irq(pdata->dev, pdata->dev_irq, xgbe_isr, 0, | ||
1334 | netdev->name, pdata); | ||
1335 | if (ret) { | ||
1336 | netdev_alert(netdev, "error requesting irq %d\n", | ||
1337 | pdata->dev_irq); | ||
1338 | goto err_rings; | ||
1339 | } | ||
1340 | |||
1341 | if (pdata->per_channel_irq) { | ||
1342 | channel = pdata->channel; | ||
1343 | for (i = 0; i < pdata->channel_count; i++, channel++) { | ||
1344 | snprintf(channel->dma_irq_name, | ||
1345 | sizeof(channel->dma_irq_name) - 1, | ||
1346 | "%s-TxRx-%u", netdev_name(netdev), | ||
1347 | channel->queue_index); | ||
1348 | |||
1349 | ret = devm_request_irq(pdata->dev, channel->dma_irq, | ||
1350 | xgbe_dma_isr, 0, | ||
1351 | channel->dma_irq_name, channel); | ||
1352 | if (ret) { | ||
1353 | netdev_alert(netdev, | ||
1354 | "error requesting irq %d\n", | ||
1355 | channel->dma_irq); | ||
1356 | goto err_irq; | ||
1357 | } | ||
1358 | } | ||
1359 | } | ||
1360 | |||
1361 | ret = xgbe_start(pdata); | 1398 | ret = xgbe_start(pdata); |
1362 | if (ret) | 1399 | if (ret) |
1363 | goto err_start; | 1400 | goto err_rings; |
1364 | 1401 | ||
1365 | DBGPR("<--xgbe_open\n"); | 1402 | DBGPR("<--xgbe_open\n"); |
1366 | 1403 | ||
1367 | return 0; | 1404 | return 0; |
1368 | 1405 | ||
1369 | err_start: | ||
1370 | hw_if->exit(pdata); | ||
1371 | |||
1372 | err_irq: | ||
1373 | if (pdata->per_channel_irq) { | ||
1374 | /* Using an unsigned int, 'i' will go to UINT_MAX and exit */ | ||
1375 | for (i--, channel--; i < pdata->channel_count; i--, channel--) | ||
1376 | devm_free_irq(pdata->dev, channel->dma_irq, channel); | ||
1377 | } | ||
1378 | |||
1379 | devm_free_irq(pdata->dev, pdata->dev_irq, pdata); | ||
1380 | |||
1381 | err_rings: | 1406 | err_rings: |
1382 | desc_if->free_ring_resources(pdata); | 1407 | desc_if->free_ring_resources(pdata); |
1383 | 1408 | ||
@@ -1399,30 +1424,16 @@ err_phy_init: | |||
1399 | static int xgbe_close(struct net_device *netdev) | 1424 | static int xgbe_close(struct net_device *netdev) |
1400 | { | 1425 | { |
1401 | struct xgbe_prv_data *pdata = netdev_priv(netdev); | 1426 | struct xgbe_prv_data *pdata = netdev_priv(netdev); |
1402 | struct xgbe_hw_if *hw_if = &pdata->hw_if; | ||
1403 | struct xgbe_desc_if *desc_if = &pdata->desc_if; | 1427 | struct xgbe_desc_if *desc_if = &pdata->desc_if; |
1404 | struct xgbe_channel *channel; | ||
1405 | unsigned int i; | ||
1406 | 1428 | ||
1407 | DBGPR("-->xgbe_close\n"); | 1429 | DBGPR("-->xgbe_close\n"); |
1408 | 1430 | ||
1409 | /* Stop the device */ | 1431 | /* Stop the device */ |
1410 | xgbe_stop(pdata); | 1432 | xgbe_stop(pdata); |
1411 | 1433 | ||
1412 | /* Issue software reset to device */ | ||
1413 | hw_if->exit(pdata); | ||
1414 | |||
1415 | /* Free the ring descriptors and buffers */ | 1434 | /* Free the ring descriptors and buffers */ |
1416 | desc_if->free_ring_resources(pdata); | 1435 | desc_if->free_ring_resources(pdata); |
1417 | 1436 | ||
1418 | /* Release the interrupts */ | ||
1419 | devm_free_irq(pdata->dev, pdata->dev_irq, pdata); | ||
1420 | if (pdata->per_channel_irq) { | ||
1421 | channel = pdata->channel; | ||
1422 | for (i = 0; i < pdata->channel_count; i++, channel++) | ||
1423 | devm_free_irq(pdata->dev, channel->dma_irq, channel); | ||
1424 | } | ||
1425 | |||
1426 | /* Free the channel and ring structures */ | 1437 | /* Free the channel and ring structures */ |
1427 | xgbe_free_channels(pdata); | 1438 | xgbe_free_channels(pdata); |
1428 | 1439 | ||
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index 5b308a4a4d0e..783543ad1fcf 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c | |||
@@ -274,9 +274,9 @@ static const struct bcm_sysport_stats bcm_sysport_gstrings_stats[] = { | |||
274 | /* RBUF misc statistics */ | 274 | /* RBUF misc statistics */ |
275 | STAT_RBUF("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, RBUF_OVFL_DISC_CNTR), | 275 | STAT_RBUF("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt, RBUF_OVFL_DISC_CNTR), |
276 | STAT_RBUF("rbuf_err_cnt", mib.rbuf_err_cnt, RBUF_ERR_PKT_CNTR), | 276 | STAT_RBUF("rbuf_err_cnt", mib.rbuf_err_cnt, RBUF_ERR_PKT_CNTR), |
277 | STAT_MIB_RX("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), | 277 | STAT_MIB_SOFT("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), |
278 | STAT_MIB_RX("rx_dma_failed", mib.rx_dma_failed), | 278 | STAT_MIB_SOFT("rx_dma_failed", mib.rx_dma_failed), |
279 | STAT_MIB_TX("tx_dma_failed", mib.tx_dma_failed), | 279 | STAT_MIB_SOFT("tx_dma_failed", mib.tx_dma_failed), |
280 | }; | 280 | }; |
281 | 281 | ||
282 | #define BCM_SYSPORT_STATS_LEN ARRAY_SIZE(bcm_sysport_gstrings_stats) | 282 | #define BCM_SYSPORT_STATS_LEN ARRAY_SIZE(bcm_sysport_gstrings_stats) |
@@ -345,6 +345,7 @@ static void bcm_sysport_update_mib_counters(struct bcm_sysport_priv *priv) | |||
345 | s = &bcm_sysport_gstrings_stats[i]; | 345 | s = &bcm_sysport_gstrings_stats[i]; |
346 | switch (s->type) { | 346 | switch (s->type) { |
347 | case BCM_SYSPORT_STAT_NETDEV: | 347 | case BCM_SYSPORT_STAT_NETDEV: |
348 | case BCM_SYSPORT_STAT_SOFT: | ||
348 | continue; | 349 | continue; |
349 | case BCM_SYSPORT_STAT_MIB_RX: | 350 | case BCM_SYSPORT_STAT_MIB_RX: |
350 | case BCM_SYSPORT_STAT_MIB_TX: | 351 | case BCM_SYSPORT_STAT_MIB_TX: |
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h index fc19417d82a5..7e3d87a88c76 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.h +++ b/drivers/net/ethernet/broadcom/bcmsysport.h | |||
@@ -570,6 +570,7 @@ enum bcm_sysport_stat_type { | |||
570 | BCM_SYSPORT_STAT_RUNT, | 570 | BCM_SYSPORT_STAT_RUNT, |
571 | BCM_SYSPORT_STAT_RXCHK, | 571 | BCM_SYSPORT_STAT_RXCHK, |
572 | BCM_SYSPORT_STAT_RBUF, | 572 | BCM_SYSPORT_STAT_RBUF, |
573 | BCM_SYSPORT_STAT_SOFT, | ||
573 | }; | 574 | }; |
574 | 575 | ||
575 | /* Macros to help define ethtool statistics */ | 576 | /* Macros to help define ethtool statistics */ |
@@ -590,6 +591,7 @@ enum bcm_sysport_stat_type { | |||
590 | #define STAT_MIB_RX(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_MIB_RX) | 591 | #define STAT_MIB_RX(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_MIB_RX) |
591 | #define STAT_MIB_TX(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_MIB_TX) | 592 | #define STAT_MIB_TX(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_MIB_TX) |
592 | #define STAT_RUNT(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_RUNT) | 593 | #define STAT_RUNT(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_RUNT) |
594 | #define STAT_MIB_SOFT(str, m) STAT_MIB(str, m, BCM_SYSPORT_STAT_SOFT) | ||
593 | 595 | ||
594 | #define STAT_RXCHK(str, m, ofs) { \ | 596 | #define STAT_RXCHK(str, m, ofs) { \ |
595 | .stat_string = str, \ | 597 | .stat_string = str, \ |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 51300532ec26..84feb241d60b 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
@@ -487,6 +487,7 @@ enum bcmgenet_stat_type { | |||
487 | BCMGENET_STAT_MIB_TX, | 487 | BCMGENET_STAT_MIB_TX, |
488 | BCMGENET_STAT_RUNT, | 488 | BCMGENET_STAT_RUNT, |
489 | BCMGENET_STAT_MISC, | 489 | BCMGENET_STAT_MISC, |
490 | BCMGENET_STAT_SOFT, | ||
490 | }; | 491 | }; |
491 | 492 | ||
492 | struct bcmgenet_stats { | 493 | struct bcmgenet_stats { |
@@ -515,6 +516,7 @@ struct bcmgenet_stats { | |||
515 | #define STAT_GENET_MIB_RX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB_RX) | 516 | #define STAT_GENET_MIB_RX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB_RX) |
516 | #define STAT_GENET_MIB_TX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB_TX) | 517 | #define STAT_GENET_MIB_TX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB_TX) |
517 | #define STAT_GENET_RUNT(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_RUNT) | 518 | #define STAT_GENET_RUNT(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_RUNT) |
519 | #define STAT_GENET_SOFT_MIB(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_SOFT) | ||
518 | 520 | ||
519 | #define STAT_GENET_MISC(str, m, offset) { \ | 521 | #define STAT_GENET_MISC(str, m, offset) { \ |
520 | .stat_string = str, \ | 522 | .stat_string = str, \ |
@@ -614,9 +616,9 @@ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] = { | |||
614 | UMAC_RBUF_OVFL_CNT), | 616 | UMAC_RBUF_OVFL_CNT), |
615 | STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, UMAC_RBUF_ERR_CNT), | 617 | STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt, UMAC_RBUF_ERR_CNT), |
616 | STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT), | 618 | STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT), |
617 | STAT_GENET_MIB_RX("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), | 619 | STAT_GENET_SOFT_MIB("alloc_rx_buff_failed", mib.alloc_rx_buff_failed), |
618 | STAT_GENET_MIB_RX("rx_dma_failed", mib.rx_dma_failed), | 620 | STAT_GENET_SOFT_MIB("rx_dma_failed", mib.rx_dma_failed), |
619 | STAT_GENET_MIB_TX("tx_dma_failed", mib.tx_dma_failed), | 621 | STAT_GENET_SOFT_MIB("tx_dma_failed", mib.tx_dma_failed), |
620 | }; | 622 | }; |
621 | 623 | ||
622 | #define BCMGENET_STATS_LEN ARRAY_SIZE(bcmgenet_gstrings_stats) | 624 | #define BCMGENET_STATS_LEN ARRAY_SIZE(bcmgenet_gstrings_stats) |
@@ -668,6 +670,7 @@ static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv) | |||
668 | s = &bcmgenet_gstrings_stats[i]; | 670 | s = &bcmgenet_gstrings_stats[i]; |
669 | switch (s->type) { | 671 | switch (s->type) { |
670 | case BCMGENET_STAT_NETDEV: | 672 | case BCMGENET_STAT_NETDEV: |
673 | case BCMGENET_STAT_SOFT: | ||
671 | continue; | 674 | continue; |
672 | case BCMGENET_STAT_MIB_RX: | 675 | case BCMGENET_STAT_MIB_RX: |
673 | case BCMGENET_STAT_MIB_TX: | 676 | case BCMGENET_STAT_MIB_TX: |
@@ -971,13 +974,14 @@ static inline void bcmgenet_tx_ring_int_disable(struct bcmgenet_priv *priv, | |||
971 | } | 974 | } |
972 | 975 | ||
973 | /* Unlocked version of the reclaim routine */ | 976 | /* Unlocked version of the reclaim routine */ |
974 | static void __bcmgenet_tx_reclaim(struct net_device *dev, | 977 | static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev, |
975 | struct bcmgenet_tx_ring *ring) | 978 | struct bcmgenet_tx_ring *ring) |
976 | { | 979 | { |
977 | struct bcmgenet_priv *priv = netdev_priv(dev); | 980 | struct bcmgenet_priv *priv = netdev_priv(dev); |
978 | int last_tx_cn, last_c_index, num_tx_bds; | 981 | int last_tx_cn, last_c_index, num_tx_bds; |
979 | struct enet_cb *tx_cb_ptr; | 982 | struct enet_cb *tx_cb_ptr; |
980 | struct netdev_queue *txq; | 983 | struct netdev_queue *txq; |
984 | unsigned int pkts_compl = 0; | ||
981 | unsigned int bds_compl; | 985 | unsigned int bds_compl; |
982 | unsigned int c_index; | 986 | unsigned int c_index; |
983 | 987 | ||
@@ -1005,6 +1009,7 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev, | |||
1005 | tx_cb_ptr = ring->cbs + last_c_index; | 1009 | tx_cb_ptr = ring->cbs + last_c_index; |
1006 | bds_compl = 0; | 1010 | bds_compl = 0; |
1007 | if (tx_cb_ptr->skb) { | 1011 | if (tx_cb_ptr->skb) { |
1012 | pkts_compl++; | ||
1008 | bds_compl = skb_shinfo(tx_cb_ptr->skb)->nr_frags + 1; | 1013 | bds_compl = skb_shinfo(tx_cb_ptr->skb)->nr_frags + 1; |
1009 | dev->stats.tx_bytes += tx_cb_ptr->skb->len; | 1014 | dev->stats.tx_bytes += tx_cb_ptr->skb->len; |
1010 | dma_unmap_single(&dev->dev, | 1015 | dma_unmap_single(&dev->dev, |
@@ -1028,23 +1033,45 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev, | |||
1028 | last_c_index &= (num_tx_bds - 1); | 1033 | last_c_index &= (num_tx_bds - 1); |
1029 | } | 1034 | } |
1030 | 1035 | ||
1031 | if (ring->free_bds > (MAX_SKB_FRAGS + 1)) | 1036 | if (ring->free_bds > (MAX_SKB_FRAGS + 1)) { |
1032 | ring->int_disable(priv, ring); | 1037 | if (netif_tx_queue_stopped(txq)) |
1033 | 1038 | netif_tx_wake_queue(txq); | |
1034 | if (netif_tx_queue_stopped(txq)) | 1039 | } |
1035 | netif_tx_wake_queue(txq); | ||
1036 | 1040 | ||
1037 | ring->c_index = c_index; | 1041 | ring->c_index = c_index; |
1042 | |||
1043 | return pkts_compl; | ||
1038 | } | 1044 | } |
1039 | 1045 | ||
1040 | static void bcmgenet_tx_reclaim(struct net_device *dev, | 1046 | static unsigned int bcmgenet_tx_reclaim(struct net_device *dev, |
1041 | struct bcmgenet_tx_ring *ring) | 1047 | struct bcmgenet_tx_ring *ring) |
1042 | { | 1048 | { |
1049 | unsigned int released; | ||
1043 | unsigned long flags; | 1050 | unsigned long flags; |
1044 | 1051 | ||
1045 | spin_lock_irqsave(&ring->lock, flags); | 1052 | spin_lock_irqsave(&ring->lock, flags); |
1046 | __bcmgenet_tx_reclaim(dev, ring); | 1053 | released = __bcmgenet_tx_reclaim(dev, ring); |
1047 | spin_unlock_irqrestore(&ring->lock, flags); | 1054 | spin_unlock_irqrestore(&ring->lock, flags); |
1055 | |||
1056 | return released; | ||
1057 | } | ||
1058 | |||
1059 | static int bcmgenet_tx_poll(struct napi_struct *napi, int budget) | ||
1060 | { | ||
1061 | struct bcmgenet_tx_ring *ring = | ||
1062 | container_of(napi, struct bcmgenet_tx_ring, napi); | ||
1063 | unsigned int work_done = 0; | ||
1064 | |||
1065 | work_done = bcmgenet_tx_reclaim(ring->priv->dev, ring); | ||
1066 | |||
1067 | if (work_done == 0) { | ||
1068 | napi_complete(napi); | ||
1069 | ring->int_enable(ring->priv, ring); | ||
1070 | |||
1071 | return 0; | ||
1072 | } | ||
1073 | |||
1074 | return budget; | ||
1048 | } | 1075 | } |
1049 | 1076 | ||
1050 | static void bcmgenet_tx_reclaim_all(struct net_device *dev) | 1077 | static void bcmgenet_tx_reclaim_all(struct net_device *dev) |
@@ -1302,10 +1329,8 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1302 | bcmgenet_tdma_ring_writel(priv, ring->index, | 1329 | bcmgenet_tdma_ring_writel(priv, ring->index, |
1303 | ring->prod_index, TDMA_PROD_INDEX); | 1330 | ring->prod_index, TDMA_PROD_INDEX); |
1304 | 1331 | ||
1305 | if (ring->free_bds <= (MAX_SKB_FRAGS + 1)) { | 1332 | if (ring->free_bds <= (MAX_SKB_FRAGS + 1)) |
1306 | netif_tx_stop_queue(txq); | 1333 | netif_tx_stop_queue(txq); |
1307 | ring->int_enable(priv, ring); | ||
1308 | } | ||
1309 | 1334 | ||
1310 | out: | 1335 | out: |
1311 | spin_unlock_irqrestore(&ring->lock, flags); | 1336 | spin_unlock_irqrestore(&ring->lock, flags); |
@@ -1621,6 +1646,7 @@ static int init_umac(struct bcmgenet_priv *priv) | |||
1621 | struct device *kdev = &priv->pdev->dev; | 1646 | struct device *kdev = &priv->pdev->dev; |
1622 | int ret; | 1647 | int ret; |
1623 | u32 reg, cpu_mask_clear; | 1648 | u32 reg, cpu_mask_clear; |
1649 | int index; | ||
1624 | 1650 | ||
1625 | dev_dbg(&priv->pdev->dev, "bcmgenet: init_umac\n"); | 1651 | dev_dbg(&priv->pdev->dev, "bcmgenet: init_umac\n"); |
1626 | 1652 | ||
@@ -1647,7 +1673,7 @@ static int init_umac(struct bcmgenet_priv *priv) | |||
1647 | 1673 | ||
1648 | bcmgenet_intr_disable(priv); | 1674 | bcmgenet_intr_disable(priv); |
1649 | 1675 | ||
1650 | cpu_mask_clear = UMAC_IRQ_RXDMA_BDONE; | 1676 | cpu_mask_clear = UMAC_IRQ_RXDMA_BDONE | UMAC_IRQ_TXDMA_BDONE; |
1651 | 1677 | ||
1652 | dev_dbg(kdev, "%s:Enabling RXDMA_BDONE interrupt\n", __func__); | 1678 | dev_dbg(kdev, "%s:Enabling RXDMA_BDONE interrupt\n", __func__); |
1653 | 1679 | ||
@@ -1674,6 +1700,10 @@ static int init_umac(struct bcmgenet_priv *priv) | |||
1674 | 1700 | ||
1675 | bcmgenet_intrl2_0_writel(priv, cpu_mask_clear, INTRL2_CPU_MASK_CLEAR); | 1701 | bcmgenet_intrl2_0_writel(priv, cpu_mask_clear, INTRL2_CPU_MASK_CLEAR); |
1676 | 1702 | ||
1703 | for (index = 0; index < priv->hw_params->tx_queues; index++) | ||
1704 | bcmgenet_intrl2_1_writel(priv, (1 << index), | ||
1705 | INTRL2_CPU_MASK_CLEAR); | ||
1706 | |||
1677 | /* Enable rx/tx engine.*/ | 1707 | /* Enable rx/tx engine.*/ |
1678 | dev_dbg(kdev, "done init umac\n"); | 1708 | dev_dbg(kdev, "done init umac\n"); |
1679 | 1709 | ||
@@ -1690,6 +1720,8 @@ static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv, | |||
1690 | u32 flow_period_val = 0; | 1720 | u32 flow_period_val = 0; |
1691 | 1721 | ||
1692 | spin_lock_init(&ring->lock); | 1722 | spin_lock_init(&ring->lock); |
1723 | ring->priv = priv; | ||
1724 | netif_napi_add(priv->dev, &ring->napi, bcmgenet_tx_poll, 64); | ||
1693 | ring->index = index; | 1725 | ring->index = index; |
1694 | if (index == DESC_INDEX) { | 1726 | if (index == DESC_INDEX) { |
1695 | ring->queue = 0; | 1727 | ring->queue = 0; |
@@ -1732,6 +1764,17 @@ static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv, | |||
1732 | TDMA_WRITE_PTR); | 1764 | TDMA_WRITE_PTR); |
1733 | bcmgenet_tdma_ring_writel(priv, index, end_ptr * words_per_bd - 1, | 1765 | bcmgenet_tdma_ring_writel(priv, index, end_ptr * words_per_bd - 1, |
1734 | DMA_END_ADDR); | 1766 | DMA_END_ADDR); |
1767 | |||
1768 | napi_enable(&ring->napi); | ||
1769 | } | ||
1770 | |||
1771 | static void bcmgenet_fini_tx_ring(struct bcmgenet_priv *priv, | ||
1772 | unsigned int index) | ||
1773 | { | ||
1774 | struct bcmgenet_tx_ring *ring = &priv->tx_rings[index]; | ||
1775 | |||
1776 | napi_disable(&ring->napi); | ||
1777 | netif_napi_del(&ring->napi); | ||
1735 | } | 1778 | } |
1736 | 1779 | ||
1737 | /* Initialize a RDMA ring */ | 1780 | /* Initialize a RDMA ring */ |
@@ -1896,7 +1939,7 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv) | |||
1896 | return ret; | 1939 | return ret; |
1897 | } | 1940 | } |
1898 | 1941 | ||
1899 | static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) | 1942 | static void __bcmgenet_fini_dma(struct bcmgenet_priv *priv) |
1900 | { | 1943 | { |
1901 | int i; | 1944 | int i; |
1902 | 1945 | ||
@@ -1915,6 +1958,18 @@ static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) | |||
1915 | kfree(priv->tx_cbs); | 1958 | kfree(priv->tx_cbs); |
1916 | } | 1959 | } |
1917 | 1960 | ||
1961 | static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) | ||
1962 | { | ||
1963 | int i; | ||
1964 | |||
1965 | bcmgenet_fini_tx_ring(priv, DESC_INDEX); | ||
1966 | |||
1967 | for (i = 0; i < priv->hw_params->tx_queues; i++) | ||
1968 | bcmgenet_fini_tx_ring(priv, i); | ||
1969 | |||
1970 | __bcmgenet_fini_dma(priv); | ||
1971 | } | ||
1972 | |||
1918 | /* init_edma: Initialize DMA control register */ | 1973 | /* init_edma: Initialize DMA control register */ |
1919 | static int bcmgenet_init_dma(struct bcmgenet_priv *priv) | 1974 | static int bcmgenet_init_dma(struct bcmgenet_priv *priv) |
1920 | { | 1975 | { |
@@ -1943,7 +1998,7 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) | |||
1943 | priv->tx_cbs = kcalloc(priv->num_tx_bds, sizeof(struct enet_cb), | 1998 | priv->tx_cbs = kcalloc(priv->num_tx_bds, sizeof(struct enet_cb), |
1944 | GFP_KERNEL); | 1999 | GFP_KERNEL); |
1945 | if (!priv->tx_cbs) { | 2000 | if (!priv->tx_cbs) { |
1946 | bcmgenet_fini_dma(priv); | 2001 | __bcmgenet_fini_dma(priv); |
1947 | return -ENOMEM; | 2002 | return -ENOMEM; |
1948 | } | 2003 | } |
1949 | 2004 | ||
@@ -1965,9 +2020,6 @@ static int bcmgenet_poll(struct napi_struct *napi, int budget) | |||
1965 | struct bcmgenet_priv, napi); | 2020 | struct bcmgenet_priv, napi); |
1966 | unsigned int work_done; | 2021 | unsigned int work_done; |
1967 | 2022 | ||
1968 | /* tx reclaim */ | ||
1969 | bcmgenet_tx_reclaim(priv->dev, &priv->tx_rings[DESC_INDEX]); | ||
1970 | |||
1971 | work_done = bcmgenet_desc_rx(priv, budget); | 2023 | work_done = bcmgenet_desc_rx(priv, budget); |
1972 | 2024 | ||
1973 | /* Advancing our consumer index*/ | 2025 | /* Advancing our consumer index*/ |
@@ -2012,28 +2064,34 @@ static void bcmgenet_irq_task(struct work_struct *work) | |||
2012 | static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) | 2064 | static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) |
2013 | { | 2065 | { |
2014 | struct bcmgenet_priv *priv = dev_id; | 2066 | struct bcmgenet_priv *priv = dev_id; |
2067 | struct bcmgenet_tx_ring *ring; | ||
2015 | unsigned int index; | 2068 | unsigned int index; |
2016 | 2069 | ||
2017 | /* Save irq status for bottom-half processing. */ | 2070 | /* Save irq status for bottom-half processing. */ |
2018 | priv->irq1_stat = | 2071 | priv->irq1_stat = |
2019 | bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) & | 2072 | bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) & |
2020 | ~priv->int1_mask; | 2073 | ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS); |
2021 | /* clear interrupts */ | 2074 | /* clear interrupts */ |
2022 | bcmgenet_intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR); | 2075 | bcmgenet_intrl2_1_writel(priv, priv->irq1_stat, INTRL2_CPU_CLEAR); |
2023 | 2076 | ||
2024 | netif_dbg(priv, intr, priv->dev, | 2077 | netif_dbg(priv, intr, priv->dev, |
2025 | "%s: IRQ=0x%x\n", __func__, priv->irq1_stat); | 2078 | "%s: IRQ=0x%x\n", __func__, priv->irq1_stat); |
2079 | |||
2026 | /* Check the MBDONE interrupts. | 2080 | /* Check the MBDONE interrupts. |
2027 | * packet is done, reclaim descriptors | 2081 | * packet is done, reclaim descriptors |
2028 | */ | 2082 | */ |
2029 | if (priv->irq1_stat & 0x0000ffff) { | 2083 | for (index = 0; index < priv->hw_params->tx_queues; index++) { |
2030 | index = 0; | 2084 | if (!(priv->irq1_stat & BIT(index))) |
2031 | for (index = 0; index < 16; index++) { | 2085 | continue; |
2032 | if (priv->irq1_stat & (1 << index)) | 2086 | |
2033 | bcmgenet_tx_reclaim(priv->dev, | 2087 | ring = &priv->tx_rings[index]; |
2034 | &priv->tx_rings[index]); | 2088 | |
2089 | if (likely(napi_schedule_prep(&ring->napi))) { | ||
2090 | ring->int_disable(priv, ring); | ||
2091 | __napi_schedule(&ring->napi); | ||
2035 | } | 2092 | } |
2036 | } | 2093 | } |
2094 | |||
2037 | return IRQ_HANDLED; | 2095 | return IRQ_HANDLED; |
2038 | } | 2096 | } |
2039 | 2097 | ||
@@ -2065,8 +2123,12 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) | |||
2065 | } | 2123 | } |
2066 | if (priv->irq0_stat & | 2124 | if (priv->irq0_stat & |
2067 | (UMAC_IRQ_TXDMA_BDONE | UMAC_IRQ_TXDMA_PDONE)) { | 2125 | (UMAC_IRQ_TXDMA_BDONE | UMAC_IRQ_TXDMA_PDONE)) { |
2068 | /* Tx reclaim */ | 2126 | struct bcmgenet_tx_ring *ring = &priv->tx_rings[DESC_INDEX]; |
2069 | bcmgenet_tx_reclaim(priv->dev, &priv->tx_rings[DESC_INDEX]); | 2127 | |
2128 | if (likely(napi_schedule_prep(&ring->napi))) { | ||
2129 | ring->int_disable(priv, ring); | ||
2130 | __napi_schedule(&ring->napi); | ||
2131 | } | ||
2070 | } | 2132 | } |
2071 | if (priv->irq0_stat & (UMAC_IRQ_PHY_DET_R | | 2133 | if (priv->irq0_stat & (UMAC_IRQ_PHY_DET_R | |
2072 | UMAC_IRQ_PHY_DET_F | | 2134 | UMAC_IRQ_PHY_DET_F | |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index 3a8a90f95365..016bd12bf493 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h | |||
@@ -520,6 +520,7 @@ struct bcmgenet_hw_params { | |||
520 | 520 | ||
521 | struct bcmgenet_tx_ring { | 521 | struct bcmgenet_tx_ring { |
522 | spinlock_t lock; /* ring lock */ | 522 | spinlock_t lock; /* ring lock */ |
523 | struct napi_struct napi; /* NAPI per tx queue */ | ||
523 | unsigned int index; /* ring index */ | 524 | unsigned int index; /* ring index */ |
524 | unsigned int queue; /* queue index */ | 525 | unsigned int queue; /* queue index */ |
525 | struct enet_cb *cbs; /* tx ring buffer control block*/ | 526 | struct enet_cb *cbs; /* tx ring buffer control block*/ |
@@ -534,6 +535,7 @@ struct bcmgenet_tx_ring { | |||
534 | struct bcmgenet_tx_ring *); | 535 | struct bcmgenet_tx_ring *); |
535 | void (*int_disable)(struct bcmgenet_priv *priv, | 536 | void (*int_disable)(struct bcmgenet_priv *priv, |
536 | struct bcmgenet_tx_ring *); | 537 | struct bcmgenet_tx_ring *); |
538 | struct bcmgenet_priv *priv; | ||
537 | }; | 539 | }; |
538 | 540 | ||
539 | /* device context */ | 541 | /* device context */ |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c b/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c index 9062a8434246..c308429dd9c7 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c +++ b/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.c | |||
@@ -35,10 +35,10 @@ static inline unsigned int ipv6_clip_hash(struct clip_tbl *d, const u32 *key) | |||
35 | } | 35 | } |
36 | 36 | ||
37 | static unsigned int clip_addr_hash(struct clip_tbl *ctbl, const u32 *addr, | 37 | static unsigned int clip_addr_hash(struct clip_tbl *ctbl, const u32 *addr, |
38 | int addr_len) | 38 | u8 v6) |
39 | { | 39 | { |
40 | return addr_len == 4 ? ipv4_clip_hash(ctbl, addr) : | 40 | return v6 ? ipv6_clip_hash(ctbl, addr) : |
41 | ipv6_clip_hash(ctbl, addr); | 41 | ipv4_clip_hash(ctbl, addr); |
42 | } | 42 | } |
43 | 43 | ||
44 | static int clip6_get_mbox(const struct net_device *dev, | 44 | static int clip6_get_mbox(const struct net_device *dev, |
@@ -78,23 +78,22 @@ int cxgb4_clip_get(const struct net_device *dev, const u32 *lip, u8 v6) | |||
78 | struct clip_entry *ce, *cte; | 78 | struct clip_entry *ce, *cte; |
79 | u32 *addr = (u32 *)lip; | 79 | u32 *addr = (u32 *)lip; |
80 | int hash; | 80 | int hash; |
81 | int addr_len; | 81 | int ret = -1; |
82 | int ret = 0; | ||
83 | 82 | ||
84 | if (!ctbl) | 83 | if (!ctbl) |
85 | return 0; | 84 | return 0; |
86 | 85 | ||
87 | if (v6) | 86 | hash = clip_addr_hash(ctbl, addr, v6); |
88 | addr_len = 16; | ||
89 | else | ||
90 | addr_len = 4; | ||
91 | |||
92 | hash = clip_addr_hash(ctbl, addr, addr_len); | ||
93 | 87 | ||
94 | read_lock_bh(&ctbl->lock); | 88 | read_lock_bh(&ctbl->lock); |
95 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { | 89 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { |
96 | if (addr_len == cte->addr_len && | 90 | if (cte->addr6.sin6_family == AF_INET6 && v6) |
97 | memcmp(lip, cte->addr, cte->addr_len) == 0) { | 91 | ret = memcmp(lip, cte->addr6.sin6_addr.s6_addr, |
92 | sizeof(struct in6_addr)); | ||
93 | else if (cte->addr.sin_family == AF_INET && !v6) | ||
94 | ret = memcmp(lip, (char *)(&cte->addr.sin_addr), | ||
95 | sizeof(struct in_addr)); | ||
96 | if (!ret) { | ||
98 | ce = cte; | 97 | ce = cte; |
99 | read_unlock_bh(&ctbl->lock); | 98 | read_unlock_bh(&ctbl->lock); |
100 | goto found; | 99 | goto found; |
@@ -111,15 +110,20 @@ int cxgb4_clip_get(const struct net_device *dev, const u32 *lip, u8 v6) | |||
111 | spin_lock_init(&ce->lock); | 110 | spin_lock_init(&ce->lock); |
112 | atomic_set(&ce->refcnt, 0); | 111 | atomic_set(&ce->refcnt, 0); |
113 | atomic_dec(&ctbl->nfree); | 112 | atomic_dec(&ctbl->nfree); |
114 | ce->addr_len = addr_len; | ||
115 | memcpy(ce->addr, lip, addr_len); | ||
116 | list_add_tail(&ce->list, &ctbl->hash_list[hash]); | 113 | list_add_tail(&ce->list, &ctbl->hash_list[hash]); |
117 | if (v6) { | 114 | if (v6) { |
115 | ce->addr6.sin6_family = AF_INET6; | ||
116 | memcpy(ce->addr6.sin6_addr.s6_addr, | ||
117 | lip, sizeof(struct in6_addr)); | ||
118 | ret = clip6_get_mbox(dev, (const struct in6_addr *)lip); | 118 | ret = clip6_get_mbox(dev, (const struct in6_addr *)lip); |
119 | if (ret) { | 119 | if (ret) { |
120 | write_unlock_bh(&ctbl->lock); | 120 | write_unlock_bh(&ctbl->lock); |
121 | return ret; | 121 | return ret; |
122 | } | 122 | } |
123 | } else { | ||
124 | ce->addr.sin_family = AF_INET; | ||
125 | memcpy((char *)(&ce->addr.sin_addr), lip, | ||
126 | sizeof(struct in_addr)); | ||
123 | } | 127 | } |
124 | } else { | 128 | } else { |
125 | write_unlock_bh(&ctbl->lock); | 129 | write_unlock_bh(&ctbl->lock); |
@@ -140,19 +144,19 @@ void cxgb4_clip_release(const struct net_device *dev, const u32 *lip, u8 v6) | |||
140 | struct clip_entry *ce, *cte; | 144 | struct clip_entry *ce, *cte; |
141 | u32 *addr = (u32 *)lip; | 145 | u32 *addr = (u32 *)lip; |
142 | int hash; | 146 | int hash; |
143 | int addr_len; | 147 | int ret = -1; |
144 | |||
145 | if (v6) | ||
146 | addr_len = 16; | ||
147 | else | ||
148 | addr_len = 4; | ||
149 | 148 | ||
150 | hash = clip_addr_hash(ctbl, addr, addr_len); | 149 | hash = clip_addr_hash(ctbl, addr, v6); |
151 | 150 | ||
152 | read_lock_bh(&ctbl->lock); | 151 | read_lock_bh(&ctbl->lock); |
153 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { | 152 | list_for_each_entry(cte, &ctbl->hash_list[hash], list) { |
154 | if (addr_len == cte->addr_len && | 153 | if (cte->addr6.sin6_family == AF_INET6 && v6) |
155 | memcmp(lip, cte->addr, cte->addr_len) == 0) { | 154 | ret = memcmp(lip, cte->addr6.sin6_addr.s6_addr, |
155 | sizeof(struct in6_addr)); | ||
156 | else if (cte->addr.sin_family == AF_INET && !v6) | ||
157 | ret = memcmp(lip, (char *)(&cte->addr.sin_addr), | ||
158 | sizeof(struct in_addr)); | ||
159 | if (!ret) { | ||
156 | ce = cte; | 160 | ce = cte; |
157 | read_unlock_bh(&ctbl->lock); | 161 | read_unlock_bh(&ctbl->lock); |
158 | goto found; | 162 | goto found; |
@@ -249,10 +253,7 @@ int clip_tbl_show(struct seq_file *seq, void *v) | |||
249 | for (i = 0 ; i < ctbl->clipt_size; ++i) { | 253 | for (i = 0 ; i < ctbl->clipt_size; ++i) { |
250 | list_for_each_entry(ce, &ctbl->hash_list[i], list) { | 254 | list_for_each_entry(ce, &ctbl->hash_list[i], list) { |
251 | ip[0] = '\0'; | 255 | ip[0] = '\0'; |
252 | if (ce->addr_len == 16) | 256 | sprintf(ip, "%pISc", &ce->addr); |
253 | sprintf(ip, "%pI6c", ce->addr); | ||
254 | else | ||
255 | sprintf(ip, "%pI4c", ce->addr); | ||
256 | seq_printf(seq, "%-25s %u\n", ip, | 257 | seq_printf(seq, "%-25s %u\n", ip, |
257 | atomic_read(&ce->refcnt)); | 258 | atomic_read(&ce->refcnt)); |
258 | } | 259 | } |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.h b/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.h index 2eaba0161cf8..35eb43c6bcbb 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.h +++ b/drivers/net/ethernet/chelsio/cxgb4/clip_tbl.h | |||
@@ -14,8 +14,10 @@ struct clip_entry { | |||
14 | spinlock_t lock; /* Hold while modifying clip reference */ | 14 | spinlock_t lock; /* Hold while modifying clip reference */ |
15 | atomic_t refcnt; | 15 | atomic_t refcnt; |
16 | struct list_head list; | 16 | struct list_head list; |
17 | u32 addr[4]; | 17 | union { |
18 | int addr_len; | 18 | struct sockaddr_in addr; |
19 | struct sockaddr_in6 addr6; | ||
20 | }; | ||
19 | }; | 21 | }; |
20 | 22 | ||
21 | struct clip_tbl { | 23 | struct clip_tbl { |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index d6cda17efe6e..97842d03675b 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | |||
@@ -1103,7 +1103,7 @@ int t4_restart_aneg(struct adapter *adap, unsigned int mbox, unsigned int port); | |||
1103 | #define T4_MEMORY_WRITE 0 | 1103 | #define T4_MEMORY_WRITE 0 |
1104 | #define T4_MEMORY_READ 1 | 1104 | #define T4_MEMORY_READ 1 |
1105 | int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, u32 len, | 1105 | int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, u32 len, |
1106 | __be32 *buf, int dir); | 1106 | void *buf, int dir); |
1107 | static inline int t4_memory_write(struct adapter *adap, int mtype, u32 addr, | 1107 | static inline int t4_memory_write(struct adapter *adap, int mtype, u32 addr, |
1108 | u32 len, __be32 *buf) | 1108 | u32 len, __be32 *buf) |
1109 | { | 1109 | { |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 4d643b65265e..853c38997c82 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
@@ -449,7 +449,7 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc) | |||
449 | * @mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC | 449 | * @mtype: memory type: MEM_EDC0, MEM_EDC1 or MEM_MC |
450 | * @addr: address within indicated memory type | 450 | * @addr: address within indicated memory type |
451 | * @len: amount of memory to transfer | 451 | * @len: amount of memory to transfer |
452 | * @buf: host memory buffer | 452 | * @hbuf: host memory buffer |
453 | * @dir: direction of transfer T4_MEMORY_READ (1) or T4_MEMORY_WRITE (0) | 453 | * @dir: direction of transfer T4_MEMORY_READ (1) or T4_MEMORY_WRITE (0) |
454 | * | 454 | * |
455 | * Reads/writes an [almost] arbitrary memory region in the firmware: the | 455 | * Reads/writes an [almost] arbitrary memory region in the firmware: the |
@@ -460,15 +460,17 @@ int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data, u64 *ecc) | |||
460 | * caller's responsibility to perform appropriate byte order conversions. | 460 | * caller's responsibility to perform appropriate byte order conversions. |
461 | */ | 461 | */ |
462 | int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, | 462 | int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, |
463 | u32 len, __be32 *buf, int dir) | 463 | u32 len, void *hbuf, int dir) |
464 | { | 464 | { |
465 | u32 pos, offset, resid, memoffset; | 465 | u32 pos, offset, resid, memoffset; |
466 | u32 edc_size, mc_size, win_pf, mem_reg, mem_aperture, mem_base; | 466 | u32 edc_size, mc_size, win_pf, mem_reg, mem_aperture, mem_base; |
467 | u32 *buf; | ||
467 | 468 | ||
468 | /* Argument sanity checks ... | 469 | /* Argument sanity checks ... |
469 | */ | 470 | */ |
470 | if (addr & 0x3) | 471 | if (addr & 0x3 || (uintptr_t)hbuf & 0x3) |
471 | return -EINVAL; | 472 | return -EINVAL; |
473 | buf = (u32 *)hbuf; | ||
472 | 474 | ||
473 | /* It's convenient to be able to handle lengths which aren't a | 475 | /* It's convenient to be able to handle lengths which aren't a |
474 | * multiple of 32-bits because we often end up transferring files to | 476 | * multiple of 32-bits because we often end up transferring files to |
@@ -532,14 +534,45 @@ int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, | |||
532 | 534 | ||
533 | /* Transfer data to/from the adapter as long as there's an integral | 535 | /* Transfer data to/from the adapter as long as there's an integral |
534 | * number of 32-bit transfers to complete. | 536 | * number of 32-bit transfers to complete. |
537 | * | ||
538 | * A note on Endianness issues: | ||
539 | * | ||
540 | * The "register" reads and writes below from/to the PCI-E Memory | ||
541 | * Window invoke the standard adapter Big-Endian to PCI-E Link | ||
542 | * Little-Endian "swizzel." As a result, if we have the following | ||
543 | * data in adapter memory: | ||
544 | * | ||
545 | * Memory: ... | b0 | b1 | b2 | b3 | ... | ||
546 | * Address: i+0 i+1 i+2 i+3 | ||
547 | * | ||
548 | * Then a read of the adapter memory via the PCI-E Memory Window | ||
549 | * will yield: | ||
550 | * | ||
551 | * x = readl(i) | ||
552 | * 31 0 | ||
553 | * [ b3 | b2 | b1 | b0 ] | ||
554 | * | ||
555 | * If this value is stored into local memory on a Little-Endian system | ||
556 | * it will show up correctly in local memory as: | ||
557 | * | ||
558 | * ( ..., b0, b1, b2, b3, ... ) | ||
559 | * | ||
560 | * But on a Big-Endian system, the store will show up in memory | ||
561 | * incorrectly swizzled as: | ||
562 | * | ||
563 | * ( ..., b3, b2, b1, b0, ... ) | ||
564 | * | ||
565 | * So we need to account for this in the reads and writes to the | ||
566 | * PCI-E Memory Window below by undoing the register read/write | ||
567 | * swizzels. | ||
535 | */ | 568 | */ |
536 | while (len > 0) { | 569 | while (len > 0) { |
537 | if (dir == T4_MEMORY_READ) | 570 | if (dir == T4_MEMORY_READ) |
538 | *buf++ = (__force __be32) t4_read_reg(adap, | 571 | *buf++ = le32_to_cpu((__force __le32)t4_read_reg(adap, |
539 | mem_base + offset); | 572 | mem_base + offset)); |
540 | else | 573 | else |
541 | t4_write_reg(adap, mem_base + offset, | 574 | t4_write_reg(adap, mem_base + offset, |
542 | (__force u32) *buf++); | 575 | (__force u32)cpu_to_le32(*buf++)); |
543 | offset += sizeof(__be32); | 576 | offset += sizeof(__be32); |
544 | len -= sizeof(__be32); | 577 | len -= sizeof(__be32); |
545 | 578 | ||
@@ -568,15 +601,16 @@ int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, | |||
568 | */ | 601 | */ |
569 | if (resid) { | 602 | if (resid) { |
570 | union { | 603 | union { |
571 | __be32 word; | 604 | u32 word; |
572 | char byte[4]; | 605 | char byte[4]; |
573 | } last; | 606 | } last; |
574 | unsigned char *bp; | 607 | unsigned char *bp; |
575 | int i; | 608 | int i; |
576 | 609 | ||
577 | if (dir == T4_MEMORY_READ) { | 610 | if (dir == T4_MEMORY_READ) { |
578 | last.word = (__force __be32) t4_read_reg(adap, | 611 | last.word = le32_to_cpu( |
579 | mem_base + offset); | 612 | (__force __le32)t4_read_reg(adap, |
613 | mem_base + offset)); | ||
580 | for (bp = (unsigned char *)buf, i = resid; i < 4; i++) | 614 | for (bp = (unsigned char *)buf, i = resid; i < 4; i++) |
581 | bp[i] = last.byte[i]; | 615 | bp[i] = last.byte[i]; |
582 | } else { | 616 | } else { |
@@ -584,7 +618,7 @@ int t4_memory_rw(struct adapter *adap, int win, int mtype, u32 addr, | |||
584 | for (i = resid; i < 4; i++) | 618 | for (i = resid; i < 4; i++) |
585 | last.byte[i] = 0; | 619 | last.byte[i] = 0; |
586 | t4_write_reg(adap, mem_base + offset, | 620 | t4_write_reg(adap, mem_base + offset, |
587 | (__force u32) last.word); | 621 | (__force u32)cpu_to_le32(last.word)); |
588 | } | 622 | } |
589 | } | 623 | } |
590 | 624 | ||
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c index a368c0a96ec7..204bd182473b 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | |||
@@ -272,8 +272,8 @@ static irqreturn_t enic_isr_legacy(int irq, void *data) | |||
272 | } | 272 | } |
273 | 273 | ||
274 | if (ENIC_TEST_INTR(pba, notify_intr)) { | 274 | if (ENIC_TEST_INTR(pba, notify_intr)) { |
275 | vnic_intr_return_all_credits(&enic->intr[notify_intr]); | ||
276 | enic_notify_check(enic); | 275 | enic_notify_check(enic); |
276 | vnic_intr_return_all_credits(&enic->intr[notify_intr]); | ||
277 | } | 277 | } |
278 | 278 | ||
279 | if (ENIC_TEST_INTR(pba, err_intr)) { | 279 | if (ENIC_TEST_INTR(pba, err_intr)) { |
@@ -346,8 +346,8 @@ static irqreturn_t enic_isr_msix_notify(int irq, void *data) | |||
346 | struct enic *enic = data; | 346 | struct enic *enic = data; |
347 | unsigned int intr = enic_msix_notify_intr(enic); | 347 | unsigned int intr = enic_msix_notify_intr(enic); |
348 | 348 | ||
349 | vnic_intr_return_all_credits(&enic->intr[intr]); | ||
350 | enic_notify_check(enic); | 349 | enic_notify_check(enic); |
350 | vnic_intr_return_all_credits(&enic->intr[intr]); | ||
351 | 351 | ||
352 | return IRQ_HANDLED; | 352 | return IRQ_HANDLED; |
353 | } | 353 | } |
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 43df78882e48..178e54028d10 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
@@ -3162,8 +3162,8 @@ static void adjust_link(struct net_device *dev) | |||
3162 | struct phy_device *phydev = priv->phydev; | 3162 | struct phy_device *phydev = priv->phydev; |
3163 | 3163 | ||
3164 | if (unlikely(phydev->link != priv->oldlink || | 3164 | if (unlikely(phydev->link != priv->oldlink || |
3165 | phydev->duplex != priv->oldduplex || | 3165 | (phydev->link && (phydev->duplex != priv->oldduplex || |
3166 | phydev->speed != priv->oldspeed)) | 3166 | phydev->speed != priv->oldspeed)))) |
3167 | gfar_update_link_state(priv); | 3167 | gfar_update_link_state(priv); |
3168 | } | 3168 | } |
3169 | 3169 | ||
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c index e8a1adb7a962..c05e50759621 100644 --- a/drivers/net/ethernet/ibm/ehea/ehea_main.c +++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c | |||
@@ -3262,6 +3262,139 @@ static void ehea_remove_device_sysfs(struct platform_device *dev) | |||
3262 | device_remove_file(&dev->dev, &dev_attr_remove_port); | 3262 | device_remove_file(&dev->dev, &dev_attr_remove_port); |
3263 | } | 3263 | } |
3264 | 3264 | ||
3265 | static int ehea_reboot_notifier(struct notifier_block *nb, | ||
3266 | unsigned long action, void *unused) | ||
3267 | { | ||
3268 | if (action == SYS_RESTART) { | ||
3269 | pr_info("Reboot: freeing all eHEA resources\n"); | ||
3270 | ibmebus_unregister_driver(&ehea_driver); | ||
3271 | } | ||
3272 | return NOTIFY_DONE; | ||
3273 | } | ||
3274 | |||
3275 | static struct notifier_block ehea_reboot_nb = { | ||
3276 | .notifier_call = ehea_reboot_notifier, | ||
3277 | }; | ||
3278 | |||
3279 | static int ehea_mem_notifier(struct notifier_block *nb, | ||
3280 | unsigned long action, void *data) | ||
3281 | { | ||
3282 | int ret = NOTIFY_BAD; | ||
3283 | struct memory_notify *arg = data; | ||
3284 | |||
3285 | mutex_lock(&dlpar_mem_lock); | ||
3286 | |||
3287 | switch (action) { | ||
3288 | case MEM_CANCEL_OFFLINE: | ||
3289 | pr_info("memory offlining canceled"); | ||
3290 | /* Fall through: re-add canceled memory block */ | ||
3291 | |||
3292 | case MEM_ONLINE: | ||
3293 | pr_info("memory is going online"); | ||
3294 | set_bit(__EHEA_STOP_XFER, &ehea_driver_flags); | ||
3295 | if (ehea_add_sect_bmap(arg->start_pfn, arg->nr_pages)) | ||
3296 | goto out_unlock; | ||
3297 | ehea_rereg_mrs(); | ||
3298 | break; | ||
3299 | |||
3300 | case MEM_GOING_OFFLINE: | ||
3301 | pr_info("memory is going offline"); | ||
3302 | set_bit(__EHEA_STOP_XFER, &ehea_driver_flags); | ||
3303 | if (ehea_rem_sect_bmap(arg->start_pfn, arg->nr_pages)) | ||
3304 | goto out_unlock; | ||
3305 | ehea_rereg_mrs(); | ||
3306 | break; | ||
3307 | |||
3308 | default: | ||
3309 | break; | ||
3310 | } | ||
3311 | |||
3312 | ehea_update_firmware_handles(); | ||
3313 | ret = NOTIFY_OK; | ||
3314 | |||
3315 | out_unlock: | ||
3316 | mutex_unlock(&dlpar_mem_lock); | ||
3317 | return ret; | ||
3318 | } | ||
3319 | |||
3320 | static struct notifier_block ehea_mem_nb = { | ||
3321 | .notifier_call = ehea_mem_notifier, | ||
3322 | }; | ||
3323 | |||
3324 | static void ehea_crash_handler(void) | ||
3325 | { | ||
3326 | int i; | ||
3327 | |||
3328 | if (ehea_fw_handles.arr) | ||
3329 | for (i = 0; i < ehea_fw_handles.num_entries; i++) | ||
3330 | ehea_h_free_resource(ehea_fw_handles.arr[i].adh, | ||
3331 | ehea_fw_handles.arr[i].fwh, | ||
3332 | FORCE_FREE); | ||
3333 | |||
3334 | if (ehea_bcmc_regs.arr) | ||
3335 | for (i = 0; i < ehea_bcmc_regs.num_entries; i++) | ||
3336 | ehea_h_reg_dereg_bcmc(ehea_bcmc_regs.arr[i].adh, | ||
3337 | ehea_bcmc_regs.arr[i].port_id, | ||
3338 | ehea_bcmc_regs.arr[i].reg_type, | ||
3339 | ehea_bcmc_regs.arr[i].macaddr, | ||
3340 | 0, H_DEREG_BCMC); | ||
3341 | } | ||
3342 | |||
3343 | static atomic_t ehea_memory_hooks_registered; | ||
3344 | |||
3345 | /* Register memory hooks on probe of first adapter */ | ||
3346 | static int ehea_register_memory_hooks(void) | ||
3347 | { | ||
3348 | int ret = 0; | ||
3349 | |||
3350 | if (atomic_inc_and_test(&ehea_memory_hooks_registered)) | ||
3351 | return 0; | ||
3352 | |||
3353 | ret = ehea_create_busmap(); | ||
3354 | if (ret) { | ||
3355 | pr_info("ehea_create_busmap failed\n"); | ||
3356 | goto out; | ||
3357 | } | ||
3358 | |||
3359 | ret = register_reboot_notifier(&ehea_reboot_nb); | ||
3360 | if (ret) { | ||
3361 | pr_info("register_reboot_notifier failed\n"); | ||
3362 | goto out; | ||
3363 | } | ||
3364 | |||
3365 | ret = register_memory_notifier(&ehea_mem_nb); | ||
3366 | if (ret) { | ||
3367 | pr_info("register_memory_notifier failed\n"); | ||
3368 | goto out2; | ||
3369 | } | ||
3370 | |||
3371 | ret = crash_shutdown_register(ehea_crash_handler); | ||
3372 | if (ret) { | ||
3373 | pr_info("crash_shutdown_register failed\n"); | ||
3374 | goto out3; | ||
3375 | } | ||
3376 | |||
3377 | return 0; | ||
3378 | |||
3379 | out3: | ||
3380 | unregister_memory_notifier(&ehea_mem_nb); | ||
3381 | out2: | ||
3382 | unregister_reboot_notifier(&ehea_reboot_nb); | ||
3383 | out: | ||
3384 | return ret; | ||
3385 | } | ||
3386 | |||
3387 | static void ehea_unregister_memory_hooks(void) | ||
3388 | { | ||
3389 | if (atomic_read(&ehea_memory_hooks_registered)) | ||
3390 | return; | ||
3391 | |||
3392 | unregister_reboot_notifier(&ehea_reboot_nb); | ||
3393 | if (crash_shutdown_unregister(ehea_crash_handler)) | ||
3394 | pr_info("failed unregistering crash handler\n"); | ||
3395 | unregister_memory_notifier(&ehea_mem_nb); | ||
3396 | } | ||
3397 | |||
3265 | static int ehea_probe_adapter(struct platform_device *dev) | 3398 | static int ehea_probe_adapter(struct platform_device *dev) |
3266 | { | 3399 | { |
3267 | struct ehea_adapter *adapter; | 3400 | struct ehea_adapter *adapter; |
@@ -3269,6 +3402,10 @@ static int ehea_probe_adapter(struct platform_device *dev) | |||
3269 | int ret; | 3402 | int ret; |
3270 | int i; | 3403 | int i; |
3271 | 3404 | ||
3405 | ret = ehea_register_memory_hooks(); | ||
3406 | if (ret) | ||
3407 | return ret; | ||
3408 | |||
3272 | if (!dev || !dev->dev.of_node) { | 3409 | if (!dev || !dev->dev.of_node) { |
3273 | pr_err("Invalid ibmebus device probed\n"); | 3410 | pr_err("Invalid ibmebus device probed\n"); |
3274 | return -EINVAL; | 3411 | return -EINVAL; |
@@ -3392,81 +3529,6 @@ static int ehea_remove(struct platform_device *dev) | |||
3392 | return 0; | 3529 | return 0; |
3393 | } | 3530 | } |
3394 | 3531 | ||
3395 | static void ehea_crash_handler(void) | ||
3396 | { | ||
3397 | int i; | ||
3398 | |||
3399 | if (ehea_fw_handles.arr) | ||
3400 | for (i = 0; i < ehea_fw_handles.num_entries; i++) | ||
3401 | ehea_h_free_resource(ehea_fw_handles.arr[i].adh, | ||
3402 | ehea_fw_handles.arr[i].fwh, | ||
3403 | FORCE_FREE); | ||
3404 | |||
3405 | if (ehea_bcmc_regs.arr) | ||
3406 | for (i = 0; i < ehea_bcmc_regs.num_entries; i++) | ||
3407 | ehea_h_reg_dereg_bcmc(ehea_bcmc_regs.arr[i].adh, | ||
3408 | ehea_bcmc_regs.arr[i].port_id, | ||
3409 | ehea_bcmc_regs.arr[i].reg_type, | ||
3410 | ehea_bcmc_regs.arr[i].macaddr, | ||
3411 | 0, H_DEREG_BCMC); | ||
3412 | } | ||
3413 | |||
3414 | static int ehea_mem_notifier(struct notifier_block *nb, | ||
3415 | unsigned long action, void *data) | ||
3416 | { | ||
3417 | int ret = NOTIFY_BAD; | ||
3418 | struct memory_notify *arg = data; | ||
3419 | |||
3420 | mutex_lock(&dlpar_mem_lock); | ||
3421 | |||
3422 | switch (action) { | ||
3423 | case MEM_CANCEL_OFFLINE: | ||
3424 | pr_info("memory offlining canceled"); | ||
3425 | /* Readd canceled memory block */ | ||
3426 | case MEM_ONLINE: | ||
3427 | pr_info("memory is going online"); | ||
3428 | set_bit(__EHEA_STOP_XFER, &ehea_driver_flags); | ||
3429 | if (ehea_add_sect_bmap(arg->start_pfn, arg->nr_pages)) | ||
3430 | goto out_unlock; | ||
3431 | ehea_rereg_mrs(); | ||
3432 | break; | ||
3433 | case MEM_GOING_OFFLINE: | ||
3434 | pr_info("memory is going offline"); | ||
3435 | set_bit(__EHEA_STOP_XFER, &ehea_driver_flags); | ||
3436 | if (ehea_rem_sect_bmap(arg->start_pfn, arg->nr_pages)) | ||
3437 | goto out_unlock; | ||
3438 | ehea_rereg_mrs(); | ||
3439 | break; | ||
3440 | default: | ||
3441 | break; | ||
3442 | } | ||
3443 | |||
3444 | ehea_update_firmware_handles(); | ||
3445 | ret = NOTIFY_OK; | ||
3446 | |||
3447 | out_unlock: | ||
3448 | mutex_unlock(&dlpar_mem_lock); | ||
3449 | return ret; | ||
3450 | } | ||
3451 | |||
3452 | static struct notifier_block ehea_mem_nb = { | ||
3453 | .notifier_call = ehea_mem_notifier, | ||
3454 | }; | ||
3455 | |||
3456 | static int ehea_reboot_notifier(struct notifier_block *nb, | ||
3457 | unsigned long action, void *unused) | ||
3458 | { | ||
3459 | if (action == SYS_RESTART) { | ||
3460 | pr_info("Reboot: freeing all eHEA resources\n"); | ||
3461 | ibmebus_unregister_driver(&ehea_driver); | ||
3462 | } | ||
3463 | return NOTIFY_DONE; | ||
3464 | } | ||
3465 | |||
3466 | static struct notifier_block ehea_reboot_nb = { | ||
3467 | .notifier_call = ehea_reboot_notifier, | ||
3468 | }; | ||
3469 | |||
3470 | static int check_module_parm(void) | 3532 | static int check_module_parm(void) |
3471 | { | 3533 | { |
3472 | int ret = 0; | 3534 | int ret = 0; |
@@ -3520,26 +3582,10 @@ static int __init ehea_module_init(void) | |||
3520 | if (ret) | 3582 | if (ret) |
3521 | goto out; | 3583 | goto out; |
3522 | 3584 | ||
3523 | ret = ehea_create_busmap(); | ||
3524 | if (ret) | ||
3525 | goto out; | ||
3526 | |||
3527 | ret = register_reboot_notifier(&ehea_reboot_nb); | ||
3528 | if (ret) | ||
3529 | pr_info("failed registering reboot notifier\n"); | ||
3530 | |||
3531 | ret = register_memory_notifier(&ehea_mem_nb); | ||
3532 | if (ret) | ||
3533 | pr_info("failed registering memory remove notifier\n"); | ||
3534 | |||
3535 | ret = crash_shutdown_register(ehea_crash_handler); | ||
3536 | if (ret) | ||
3537 | pr_info("failed registering crash handler\n"); | ||
3538 | |||
3539 | ret = ibmebus_register_driver(&ehea_driver); | 3585 | ret = ibmebus_register_driver(&ehea_driver); |
3540 | if (ret) { | 3586 | if (ret) { |
3541 | pr_err("failed registering eHEA device driver on ebus\n"); | 3587 | pr_err("failed registering eHEA device driver on ebus\n"); |
3542 | goto out2; | 3588 | goto out; |
3543 | } | 3589 | } |
3544 | 3590 | ||
3545 | ret = driver_create_file(&ehea_driver.driver, | 3591 | ret = driver_create_file(&ehea_driver.driver, |
@@ -3547,32 +3593,22 @@ static int __init ehea_module_init(void) | |||
3547 | if (ret) { | 3593 | if (ret) { |
3548 | pr_err("failed to register capabilities attribute, ret=%d\n", | 3594 | pr_err("failed to register capabilities attribute, ret=%d\n", |
3549 | ret); | 3595 | ret); |
3550 | goto out3; | 3596 | goto out2; |
3551 | } | 3597 | } |
3552 | 3598 | ||
3553 | return ret; | 3599 | return ret; |
3554 | 3600 | ||
3555 | out3: | ||
3556 | ibmebus_unregister_driver(&ehea_driver); | ||
3557 | out2: | 3601 | out2: |
3558 | unregister_memory_notifier(&ehea_mem_nb); | 3602 | ibmebus_unregister_driver(&ehea_driver); |
3559 | unregister_reboot_notifier(&ehea_reboot_nb); | ||
3560 | crash_shutdown_unregister(ehea_crash_handler); | ||
3561 | out: | 3603 | out: |
3562 | return ret; | 3604 | return ret; |
3563 | } | 3605 | } |
3564 | 3606 | ||
3565 | static void __exit ehea_module_exit(void) | 3607 | static void __exit ehea_module_exit(void) |
3566 | { | 3608 | { |
3567 | int ret; | ||
3568 | |||
3569 | driver_remove_file(&ehea_driver.driver, &driver_attr_capabilities); | 3609 | driver_remove_file(&ehea_driver.driver, &driver_attr_capabilities); |
3570 | ibmebus_unregister_driver(&ehea_driver); | 3610 | ibmebus_unregister_driver(&ehea_driver); |
3571 | unregister_reboot_notifier(&ehea_reboot_nb); | 3611 | ehea_unregister_memory_hooks(); |
3572 | ret = crash_shutdown_unregister(ehea_crash_handler); | ||
3573 | if (ret) | ||
3574 | pr_info("failed unregistering crash handler\n"); | ||
3575 | unregister_memory_notifier(&ehea_mem_nb); | ||
3576 | kfree(ehea_fw_handles.arr); | 3612 | kfree(ehea_fw_handles.arr); |
3577 | kfree(ehea_bcmc_regs.arr); | 3613 | kfree(ehea_bcmc_regs.arr); |
3578 | ehea_destroy_busmap(); | 3614 | ehea_destroy_busmap(); |
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c index 21978cc019e7..072426a72745 100644 --- a/drivers/net/ethernet/ibm/ibmveth.c +++ b/drivers/net/ethernet/ibm/ibmveth.c | |||
@@ -1327,6 +1327,28 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) | |||
1327 | return ret; | 1327 | return ret; |
1328 | } | 1328 | } |
1329 | 1329 | ||
1330 | static int ibmveth_set_mac_addr(struct net_device *dev, void *p) | ||
1331 | { | ||
1332 | struct ibmveth_adapter *adapter = netdev_priv(dev); | ||
1333 | struct sockaddr *addr = p; | ||
1334 | u64 mac_address; | ||
1335 | int rc; | ||
1336 | |||
1337 | if (!is_valid_ether_addr(addr->sa_data)) | ||
1338 | return -EADDRNOTAVAIL; | ||
1339 | |||
1340 | mac_address = ibmveth_encode_mac_addr(addr->sa_data); | ||
1341 | rc = h_change_logical_lan_mac(adapter->vdev->unit_address, mac_address); | ||
1342 | if (rc) { | ||
1343 | netdev_err(adapter->netdev, "h_change_logical_lan_mac failed with rc=%d\n", rc); | ||
1344 | return rc; | ||
1345 | } | ||
1346 | |||
1347 | ether_addr_copy(dev->dev_addr, addr->sa_data); | ||
1348 | |||
1349 | return 0; | ||
1350 | } | ||
1351 | |||
1330 | static const struct net_device_ops ibmveth_netdev_ops = { | 1352 | static const struct net_device_ops ibmveth_netdev_ops = { |
1331 | .ndo_open = ibmveth_open, | 1353 | .ndo_open = ibmveth_open, |
1332 | .ndo_stop = ibmveth_close, | 1354 | .ndo_stop = ibmveth_close, |
@@ -1337,7 +1359,7 @@ static const struct net_device_ops ibmveth_netdev_ops = { | |||
1337 | .ndo_fix_features = ibmveth_fix_features, | 1359 | .ndo_fix_features = ibmveth_fix_features, |
1338 | .ndo_set_features = ibmveth_set_features, | 1360 | .ndo_set_features = ibmveth_set_features, |
1339 | .ndo_validate_addr = eth_validate_addr, | 1361 | .ndo_validate_addr = eth_validate_addr, |
1340 | .ndo_set_mac_address = eth_mac_addr, | 1362 | .ndo_set_mac_address = ibmveth_set_mac_addr, |
1341 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1363 | #ifdef CONFIG_NET_POLL_CONTROLLER |
1342 | .ndo_poll_controller = ibmveth_poll_controller, | 1364 | .ndo_poll_controller = ibmveth_poll_controller, |
1343 | #endif | 1365 | #endif |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c index cb19c377e0cc..1da7d05abd38 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_common.c +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c | |||
@@ -875,8 +875,9 @@ i40e_status i40e_pf_reset(struct i40e_hw *hw) | |||
875 | * The grst delay value is in 100ms units, and we'll wait a | 875 | * The grst delay value is in 100ms units, and we'll wait a |
876 | * couple counts longer to be sure we don't just miss the end. | 876 | * couple counts longer to be sure we don't just miss the end. |
877 | */ | 877 | */ |
878 | grst_del = rd32(hw, I40E_GLGEN_RSTCTL) & I40E_GLGEN_RSTCTL_GRSTDEL_MASK | 878 | grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) & |
879 | >> I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT; | 879 | I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >> |
880 | I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT; | ||
880 | for (cnt = 0; cnt < grst_del + 2; cnt++) { | 881 | for (cnt = 0; cnt < grst_del + 2; cnt++) { |
881 | reg = rd32(hw, I40E_GLGEN_RSTAT); | 882 | reg = rd32(hw, I40E_GLGEN_RSTAT); |
882 | if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK)) | 883 | if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK)) |
@@ -2828,7 +2829,7 @@ i40e_status i40e_aq_add_udp_tunnel(struct i40e_hw *hw, | |||
2828 | 2829 | ||
2829 | status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); | 2830 | status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); |
2830 | 2831 | ||
2831 | if (!status) | 2832 | if (!status && filter_index) |
2832 | *filter_index = resp->index; | 2833 | *filter_index = resp->index; |
2833 | 2834 | ||
2834 | return status; | 2835 | return status; |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c b/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c index b0665509eae6..2f583554a260 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c +++ b/drivers/net/ethernet/intel/i40e/i40e_dcb_nl.c | |||
@@ -40,7 +40,7 @@ static void i40e_get_pfc_delay(struct i40e_hw *hw, u16 *delay) | |||
40 | u32 val; | 40 | u32 val; |
41 | 41 | ||
42 | val = rd32(hw, I40E_PRTDCB_GENC); | 42 | val = rd32(hw, I40E_PRTDCB_GENC); |
43 | *delay = (u16)(val & I40E_PRTDCB_GENC_PFCLDA_MASK >> | 43 | *delay = (u16)((val & I40E_PRTDCB_GENC_PFCLDA_MASK) >> |
44 | I40E_PRTDCB_GENC_PFCLDA_SHIFT); | 44 | I40E_PRTDCB_GENC_PFCLDA_SHIFT); |
45 | } | 45 | } |
46 | 46 | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c index 30cf0be7d1b2..e802b6bc067d 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c | |||
@@ -990,8 +990,10 @@ static ssize_t i40e_dbg_command_write(struct file *filp, | |||
990 | if (!cmd_buf) | 990 | if (!cmd_buf) |
991 | return count; | 991 | return count; |
992 | bytes_not_copied = copy_from_user(cmd_buf, buffer, count); | 992 | bytes_not_copied = copy_from_user(cmd_buf, buffer, count); |
993 | if (bytes_not_copied < 0) | 993 | if (bytes_not_copied < 0) { |
994 | kfree(cmd_buf); | ||
994 | return bytes_not_copied; | 995 | return bytes_not_copied; |
996 | } | ||
995 | if (bytes_not_copied > 0) | 997 | if (bytes_not_copied > 0) |
996 | count -= bytes_not_copied; | 998 | count -= bytes_not_copied; |
997 | cmd_buf[count] = '\0'; | 999 | cmd_buf[count] = '\0'; |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index c3858e7f0e66..56bdaff9f27e 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -1507,7 +1507,12 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi, | |||
1507 | vsi->tc_config.numtc = numtc; | 1507 | vsi->tc_config.numtc = numtc; |
1508 | vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; | 1508 | vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; |
1509 | /* Number of queues per enabled TC */ | 1509 | /* Number of queues per enabled TC */ |
1510 | num_tc_qps = vsi->alloc_queue_pairs/numtc; | 1510 | /* In MFP case we can have a much lower count of MSIx |
1511 | * vectors available and so we need to lower the used | ||
1512 | * q count. | ||
1513 | */ | ||
1514 | qcount = min_t(int, vsi->alloc_queue_pairs, pf->num_lan_msix); | ||
1515 | num_tc_qps = qcount / numtc; | ||
1511 | num_tc_qps = min_t(int, num_tc_qps, I40E_MAX_QUEUES_PER_TC); | 1516 | num_tc_qps = min_t(int, num_tc_qps, I40E_MAX_QUEUES_PER_TC); |
1512 | 1517 | ||
1513 | /* Setup queue offset/count for all TCs for given VSI */ | 1518 | /* Setup queue offset/count for all TCs for given VSI */ |
@@ -2690,8 +2695,15 @@ static void i40e_vsi_config_dcb_rings(struct i40e_vsi *vsi) | |||
2690 | u16 qoffset, qcount; | 2695 | u16 qoffset, qcount; |
2691 | int i, n; | 2696 | int i, n; |
2692 | 2697 | ||
2693 | if (!(vsi->back->flags & I40E_FLAG_DCB_ENABLED)) | 2698 | if (!(vsi->back->flags & I40E_FLAG_DCB_ENABLED)) { |
2694 | return; | 2699 | /* Reset the TC information */ |
2700 | for (i = 0; i < vsi->num_queue_pairs; i++) { | ||
2701 | rx_ring = vsi->rx_rings[i]; | ||
2702 | tx_ring = vsi->tx_rings[i]; | ||
2703 | rx_ring->dcb_tc = 0; | ||
2704 | tx_ring->dcb_tc = 0; | ||
2705 | } | ||
2706 | } | ||
2695 | 2707 | ||
2696 | for (n = 0; n < I40E_MAX_TRAFFIC_CLASS; n++) { | 2708 | for (n = 0; n < I40E_MAX_TRAFFIC_CLASS; n++) { |
2697 | if (!(vsi->tc_config.enabled_tc & (1 << n))) | 2709 | if (!(vsi->tc_config.enabled_tc & (1 << n))) |
@@ -3836,6 +3848,12 @@ static void i40e_clear_interrupt_scheme(struct i40e_pf *pf) | |||
3836 | { | 3848 | { |
3837 | int i; | 3849 | int i; |
3838 | 3850 | ||
3851 | i40e_stop_misc_vector(pf); | ||
3852 | if (pf->flags & I40E_FLAG_MSIX_ENABLED) { | ||
3853 | synchronize_irq(pf->msix_entries[0].vector); | ||
3854 | free_irq(pf->msix_entries[0].vector, pf); | ||
3855 | } | ||
3856 | |||
3839 | i40e_put_lump(pf->irq_pile, 0, I40E_PILE_VALID_BIT-1); | 3857 | i40e_put_lump(pf->irq_pile, 0, I40E_PILE_VALID_BIT-1); |
3840 | for (i = 0; i < pf->num_alloc_vsi; i++) | 3858 | for (i = 0; i < pf->num_alloc_vsi; i++) |
3841 | if (pf->vsi[i]) | 3859 | if (pf->vsi[i]) |
@@ -5246,8 +5264,14 @@ static int i40e_handle_lldp_event(struct i40e_pf *pf, | |||
5246 | 5264 | ||
5247 | /* Wait for the PF's Tx queues to be disabled */ | 5265 | /* Wait for the PF's Tx queues to be disabled */ |
5248 | ret = i40e_pf_wait_txq_disabled(pf); | 5266 | ret = i40e_pf_wait_txq_disabled(pf); |
5249 | if (!ret) | 5267 | if (ret) { |
5268 | /* Schedule PF reset to recover */ | ||
5269 | set_bit(__I40E_PF_RESET_REQUESTED, &pf->state); | ||
5270 | i40e_service_event_schedule(pf); | ||
5271 | } else { | ||
5250 | i40e_pf_unquiesce_all_vsi(pf); | 5272 | i40e_pf_unquiesce_all_vsi(pf); |
5273 | } | ||
5274 | |||
5251 | exit: | 5275 | exit: |
5252 | return ret; | 5276 | return ret; |
5253 | } | 5277 | } |
@@ -5579,7 +5603,8 @@ static void i40e_check_hang_subtask(struct i40e_pf *pf) | |||
5579 | int i, v; | 5603 | int i, v; |
5580 | 5604 | ||
5581 | /* If we're down or resetting, just bail */ | 5605 | /* If we're down or resetting, just bail */ |
5582 | if (test_bit(__I40E_CONFIG_BUSY, &pf->state)) | 5606 | if (test_bit(__I40E_DOWN, &pf->state) || |
5607 | test_bit(__I40E_CONFIG_BUSY, &pf->state)) | ||
5583 | return; | 5608 | return; |
5584 | 5609 | ||
5585 | /* for each VSI/netdev | 5610 | /* for each VSI/netdev |
@@ -9849,6 +9874,7 @@ static void i40e_remove(struct pci_dev *pdev) | |||
9849 | set_bit(__I40E_DOWN, &pf->state); | 9874 | set_bit(__I40E_DOWN, &pf->state); |
9850 | del_timer_sync(&pf->service_timer); | 9875 | del_timer_sync(&pf->service_timer); |
9851 | cancel_work_sync(&pf->service_task); | 9876 | cancel_work_sync(&pf->service_task); |
9877 | i40e_fdir_teardown(pf); | ||
9852 | 9878 | ||
9853 | if (pf->flags & I40E_FLAG_SRIOV_ENABLED) { | 9879 | if (pf->flags & I40E_FLAG_SRIOV_ENABLED) { |
9854 | i40e_free_vfs(pf); | 9880 | i40e_free_vfs(pf); |
@@ -9875,12 +9901,6 @@ static void i40e_remove(struct pci_dev *pdev) | |||
9875 | if (pf->vsi[pf->lan_vsi]) | 9901 | if (pf->vsi[pf->lan_vsi]) |
9876 | i40e_vsi_release(pf->vsi[pf->lan_vsi]); | 9902 | i40e_vsi_release(pf->vsi[pf->lan_vsi]); |
9877 | 9903 | ||
9878 | i40e_stop_misc_vector(pf); | ||
9879 | if (pf->flags & I40E_FLAG_MSIX_ENABLED) { | ||
9880 | synchronize_irq(pf->msix_entries[0].vector); | ||
9881 | free_irq(pf->msix_entries[0].vector, pf); | ||
9882 | } | ||
9883 | |||
9884 | /* shutdown and destroy the HMC */ | 9904 | /* shutdown and destroy the HMC */ |
9885 | if (pf->hw.hmc.hmc_obj) { | 9905 | if (pf->hw.hmc.hmc_obj) { |
9886 | ret_code = i40e_shutdown_lan_hmc(&pf->hw); | 9906 | ret_code = i40e_shutdown_lan_hmc(&pf->hw); |
@@ -10034,6 +10054,8 @@ static void i40e_shutdown(struct pci_dev *pdev) | |||
10034 | wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); | 10054 | wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); |
10035 | wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); | 10055 | wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); |
10036 | 10056 | ||
10057 | i40e_clear_interrupt_scheme(pf); | ||
10058 | |||
10037 | if (system_state == SYSTEM_POWER_OFF) { | 10059 | if (system_state == SYSTEM_POWER_OFF) { |
10038 | pci_wake_from_d3(pdev, pf->wol_en); | 10060 | pci_wake_from_d3(pdev, pf->wol_en); |
10039 | pci_set_power_state(pdev, PCI_D3hot); | 10061 | pci_set_power_state(pdev, PCI_D3hot); |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_nvm.c b/drivers/net/ethernet/intel/i40e/i40e_nvm.c index 28429c8fbc98..039018abad4a 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_nvm.c +++ b/drivers/net/ethernet/intel/i40e/i40e_nvm.c | |||
@@ -725,9 +725,11 @@ static i40e_status i40e_nvmupd_state_writing(struct i40e_hw *hw, | |||
725 | { | 725 | { |
726 | i40e_status status; | 726 | i40e_status status; |
727 | enum i40e_nvmupd_cmd upd_cmd; | 727 | enum i40e_nvmupd_cmd upd_cmd; |
728 | bool retry_attempt = false; | ||
728 | 729 | ||
729 | upd_cmd = i40e_nvmupd_validate_command(hw, cmd, errno); | 730 | upd_cmd = i40e_nvmupd_validate_command(hw, cmd, errno); |
730 | 731 | ||
732 | retry: | ||
731 | switch (upd_cmd) { | 733 | switch (upd_cmd) { |
732 | case I40E_NVMUPD_WRITE_CON: | 734 | case I40E_NVMUPD_WRITE_CON: |
733 | status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno); | 735 | status = i40e_nvmupd_nvm_write(hw, cmd, bytes, errno); |
@@ -771,6 +773,39 @@ static i40e_status i40e_nvmupd_state_writing(struct i40e_hw *hw, | |||
771 | *errno = -ESRCH; | 773 | *errno = -ESRCH; |
772 | break; | 774 | break; |
773 | } | 775 | } |
776 | |||
777 | /* In some circumstances, a multi-write transaction takes longer | ||
778 | * than the default 3 minute timeout on the write semaphore. If | ||
779 | * the write failed with an EBUSY status, this is likely the problem, | ||
780 | * so here we try to reacquire the semaphore then retry the write. | ||
781 | * We only do one retry, then give up. | ||
782 | */ | ||
783 | if (status && (hw->aq.asq_last_status == I40E_AQ_RC_EBUSY) && | ||
784 | !retry_attempt) { | ||
785 | i40e_status old_status = status; | ||
786 | u32 old_asq_status = hw->aq.asq_last_status; | ||
787 | u32 gtime; | ||
788 | |||
789 | gtime = rd32(hw, I40E_GLVFGEN_TIMER); | ||
790 | if (gtime >= hw->nvm.hw_semaphore_timeout) { | ||
791 | i40e_debug(hw, I40E_DEBUG_ALL, | ||
792 | "NVMUPD: write semaphore expired (%d >= %lld), retrying\n", | ||
793 | gtime, hw->nvm.hw_semaphore_timeout); | ||
794 | i40e_release_nvm(hw); | ||
795 | status = i40e_acquire_nvm(hw, I40E_RESOURCE_WRITE); | ||
796 | if (status) { | ||
797 | i40e_debug(hw, I40E_DEBUG_ALL, | ||
798 | "NVMUPD: write semaphore reacquire failed aq_err = %d\n", | ||
799 | hw->aq.asq_last_status); | ||
800 | status = old_status; | ||
801 | hw->aq.asq_last_status = old_asq_status; | ||
802 | } else { | ||
803 | retry_attempt = true; | ||
804 | goto retry; | ||
805 | } | ||
806 | } | ||
807 | } | ||
808 | |||
774 | return status; | 809 | return status; |
775 | } | 810 | } |
776 | 811 | ||
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index af350626843e..d4b4aa7c204e 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
@@ -587,6 +587,20 @@ void i40e_free_tx_resources(struct i40e_ring *tx_ring) | |||
587 | } | 587 | } |
588 | 588 | ||
589 | /** | 589 | /** |
590 | * i40e_get_head - Retrieve head from head writeback | ||
591 | * @tx_ring: tx ring to fetch head of | ||
592 | * | ||
593 | * Returns value of Tx ring head based on value stored | ||
594 | * in head write-back location | ||
595 | **/ | ||
596 | static inline u32 i40e_get_head(struct i40e_ring *tx_ring) | ||
597 | { | ||
598 | void *head = (struct i40e_tx_desc *)tx_ring->desc + tx_ring->count; | ||
599 | |||
600 | return le32_to_cpu(*(volatile __le32 *)head); | ||
601 | } | ||
602 | |||
603 | /** | ||
590 | * i40e_get_tx_pending - how many tx descriptors not processed | 604 | * i40e_get_tx_pending - how many tx descriptors not processed |
591 | * @tx_ring: the ring of descriptors | 605 | * @tx_ring: the ring of descriptors |
592 | * | 606 | * |
@@ -595,10 +609,16 @@ void i40e_free_tx_resources(struct i40e_ring *tx_ring) | |||
595 | **/ | 609 | **/ |
596 | static u32 i40e_get_tx_pending(struct i40e_ring *ring) | 610 | static u32 i40e_get_tx_pending(struct i40e_ring *ring) |
597 | { | 611 | { |
598 | u32 ntu = ((ring->next_to_clean <= ring->next_to_use) | 612 | u32 head, tail; |
599 | ? ring->next_to_use | 613 | |
600 | : ring->next_to_use + ring->count); | 614 | head = i40e_get_head(ring); |
601 | return ntu - ring->next_to_clean; | 615 | tail = readl(ring->tail); |
616 | |||
617 | if (head != tail) | ||
618 | return (head < tail) ? | ||
619 | tail - head : (tail + ring->count - head); | ||
620 | |||
621 | return 0; | ||
602 | } | 622 | } |
603 | 623 | ||
604 | /** | 624 | /** |
@@ -607,6 +627,8 @@ static u32 i40e_get_tx_pending(struct i40e_ring *ring) | |||
607 | **/ | 627 | **/ |
608 | static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) | 628 | static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) |
609 | { | 629 | { |
630 | u32 tx_done = tx_ring->stats.packets; | ||
631 | u32 tx_done_old = tx_ring->tx_stats.tx_done_old; | ||
610 | u32 tx_pending = i40e_get_tx_pending(tx_ring); | 632 | u32 tx_pending = i40e_get_tx_pending(tx_ring); |
611 | struct i40e_pf *pf = tx_ring->vsi->back; | 633 | struct i40e_pf *pf = tx_ring->vsi->back; |
612 | bool ret = false; | 634 | bool ret = false; |
@@ -624,41 +646,25 @@ static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) | |||
624 | * run the check_tx_hang logic with a transmit completion | 646 | * run the check_tx_hang logic with a transmit completion |
625 | * pending but without time to complete it yet. | 647 | * pending but without time to complete it yet. |
626 | */ | 648 | */ |
627 | if ((tx_ring->tx_stats.tx_done_old == tx_ring->stats.packets) && | 649 | if ((tx_done_old == tx_done) && tx_pending) { |
628 | (tx_pending >= I40E_MIN_DESC_PENDING)) { | ||
629 | /* make sure it is true for two checks in a row */ | 650 | /* make sure it is true for two checks in a row */ |
630 | ret = test_and_set_bit(__I40E_HANG_CHECK_ARMED, | 651 | ret = test_and_set_bit(__I40E_HANG_CHECK_ARMED, |
631 | &tx_ring->state); | 652 | &tx_ring->state); |
632 | } else if ((tx_ring->tx_stats.tx_done_old == tx_ring->stats.packets) && | 653 | } else if (tx_done_old == tx_done && |
633 | (tx_pending < I40E_MIN_DESC_PENDING) && | 654 | (tx_pending < I40E_MIN_DESC_PENDING) && (tx_pending > 0)) { |
634 | (tx_pending > 0)) { | ||
635 | if (I40E_DEBUG_FLOW & pf->hw.debug_mask) | 655 | if (I40E_DEBUG_FLOW & pf->hw.debug_mask) |
636 | dev_info(tx_ring->dev, "HW needs some more descs to do a cacheline flush. tx_pending %d, queue %d", | 656 | dev_info(tx_ring->dev, "HW needs some more descs to do a cacheline flush. tx_pending %d, queue %d", |
637 | tx_pending, tx_ring->queue_index); | 657 | tx_pending, tx_ring->queue_index); |
638 | pf->tx_sluggish_count++; | 658 | pf->tx_sluggish_count++; |
639 | } else { | 659 | } else { |
640 | /* update completed stats and disarm the hang check */ | 660 | /* update completed stats and disarm the hang check */ |
641 | tx_ring->tx_stats.tx_done_old = tx_ring->stats.packets; | 661 | tx_ring->tx_stats.tx_done_old = tx_done; |
642 | clear_bit(__I40E_HANG_CHECK_ARMED, &tx_ring->state); | 662 | clear_bit(__I40E_HANG_CHECK_ARMED, &tx_ring->state); |
643 | } | 663 | } |
644 | 664 | ||
645 | return ret; | 665 | return ret; |
646 | } | 666 | } |
647 | 667 | ||
648 | /** | ||
649 | * i40e_get_head - Retrieve head from head writeback | ||
650 | * @tx_ring: tx ring to fetch head of | ||
651 | * | ||
652 | * Returns value of Tx ring head based on value stored | ||
653 | * in head write-back location | ||
654 | **/ | ||
655 | static inline u32 i40e_get_head(struct i40e_ring *tx_ring) | ||
656 | { | ||
657 | void *head = (struct i40e_tx_desc *)tx_ring->desc + tx_ring->count; | ||
658 | |||
659 | return le32_to_cpu(*(volatile __le32 *)head); | ||
660 | } | ||
661 | |||
662 | #define WB_STRIDE 0x3 | 668 | #define WB_STRIDE 0x3 |
663 | 669 | ||
664 | /** | 670 | /** |
@@ -2356,6 +2362,67 @@ static int i40e_maybe_stop_tx(struct i40e_ring *tx_ring, int size) | |||
2356 | } | 2362 | } |
2357 | 2363 | ||
2358 | /** | 2364 | /** |
2365 | * i40e_chk_linearize - Check if there are more than 8 fragments per packet | ||
2366 | * @skb: send buffer | ||
2367 | * @tx_flags: collected send information | ||
2368 | * @hdr_len: size of the packet header | ||
2369 | * | ||
2370 | * Note: Our HW can't scatter-gather more than 8 fragments to build | ||
2371 | * a packet on the wire and so we need to figure out the cases where we | ||
2372 | * need to linearize the skb. | ||
2373 | **/ | ||
2374 | static bool i40e_chk_linearize(struct sk_buff *skb, u32 tx_flags, | ||
2375 | const u8 hdr_len) | ||
2376 | { | ||
2377 | struct skb_frag_struct *frag; | ||
2378 | bool linearize = false; | ||
2379 | unsigned int size = 0; | ||
2380 | u16 num_frags; | ||
2381 | u16 gso_segs; | ||
2382 | |||
2383 | num_frags = skb_shinfo(skb)->nr_frags; | ||
2384 | gso_segs = skb_shinfo(skb)->gso_segs; | ||
2385 | |||
2386 | if (tx_flags & (I40E_TX_FLAGS_TSO | I40E_TX_FLAGS_FSO)) { | ||
2387 | u16 j = 1; | ||
2388 | |||
2389 | if (num_frags < (I40E_MAX_BUFFER_TXD)) | ||
2390 | goto linearize_chk_done; | ||
2391 | /* try the simple math, if we have too many frags per segment */ | ||
2392 | if (DIV_ROUND_UP((num_frags + gso_segs), gso_segs) > | ||
2393 | I40E_MAX_BUFFER_TXD) { | ||
2394 | linearize = true; | ||
2395 | goto linearize_chk_done; | ||
2396 | } | ||
2397 | frag = &skb_shinfo(skb)->frags[0]; | ||
2398 | size = hdr_len; | ||
2399 | /* we might still have more fragments per segment */ | ||
2400 | do { | ||
2401 | size += skb_frag_size(frag); | ||
2402 | frag++; j++; | ||
2403 | if (j == I40E_MAX_BUFFER_TXD) { | ||
2404 | if (size < skb_shinfo(skb)->gso_size) { | ||
2405 | linearize = true; | ||
2406 | break; | ||
2407 | } | ||
2408 | j = 1; | ||
2409 | size -= skb_shinfo(skb)->gso_size; | ||
2410 | if (size) | ||
2411 | j++; | ||
2412 | size += hdr_len; | ||
2413 | } | ||
2414 | num_frags--; | ||
2415 | } while (num_frags); | ||
2416 | } else { | ||
2417 | if (num_frags >= I40E_MAX_BUFFER_TXD) | ||
2418 | linearize = true; | ||
2419 | } | ||
2420 | |||
2421 | linearize_chk_done: | ||
2422 | return linearize; | ||
2423 | } | ||
2424 | |||
2425 | /** | ||
2359 | * i40e_tx_map - Build the Tx descriptor | 2426 | * i40e_tx_map - Build the Tx descriptor |
2360 | * @tx_ring: ring to send buffer on | 2427 | * @tx_ring: ring to send buffer on |
2361 | * @skb: send buffer | 2428 | * @skb: send buffer |
@@ -2612,6 +2679,10 @@ static netdev_tx_t i40e_xmit_frame_ring(struct sk_buff *skb, | |||
2612 | if (tsyn) | 2679 | if (tsyn) |
2613 | tx_flags |= I40E_TX_FLAGS_TSYN; | 2680 | tx_flags |= I40E_TX_FLAGS_TSYN; |
2614 | 2681 | ||
2682 | if (i40e_chk_linearize(skb, tx_flags, hdr_len)) | ||
2683 | if (skb_linearize(skb)) | ||
2684 | goto out_drop; | ||
2685 | |||
2615 | skb_tx_timestamp(skb); | 2686 | skb_tx_timestamp(skb); |
2616 | 2687 | ||
2617 | /* always enable CRC insertion offload */ | 2688 | /* always enable CRC insertion offload */ |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h index 38449b230d60..4b0b8102cdc3 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h | |||
@@ -120,6 +120,7 @@ enum i40e_dyn_idx_t { | |||
120 | 120 | ||
121 | #define i40e_rx_desc i40e_32byte_rx_desc | 121 | #define i40e_rx_desc i40e_32byte_rx_desc |
122 | 122 | ||
123 | #define I40E_MAX_BUFFER_TXD 8 | ||
123 | #define I40E_MIN_TX_LEN 17 | 124 | #define I40E_MIN_TX_LEN 17 |
124 | #define I40E_MAX_DATA_PER_TXD 8192 | 125 | #define I40E_MAX_DATA_PER_TXD 8192 |
125 | 126 | ||
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c index d2ff862f0726..fe13ad2def46 100644 --- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c | |||
@@ -127,6 +127,20 @@ void i40evf_free_tx_resources(struct i40e_ring *tx_ring) | |||
127 | } | 127 | } |
128 | 128 | ||
129 | /** | 129 | /** |
130 | * i40e_get_head - Retrieve head from head writeback | ||
131 | * @tx_ring: tx ring to fetch head of | ||
132 | * | ||
133 | * Returns value of Tx ring head based on value stored | ||
134 | * in head write-back location | ||
135 | **/ | ||
136 | static inline u32 i40e_get_head(struct i40e_ring *tx_ring) | ||
137 | { | ||
138 | void *head = (struct i40e_tx_desc *)tx_ring->desc + tx_ring->count; | ||
139 | |||
140 | return le32_to_cpu(*(volatile __le32 *)head); | ||
141 | } | ||
142 | |||
143 | /** | ||
130 | * i40e_get_tx_pending - how many tx descriptors not processed | 144 | * i40e_get_tx_pending - how many tx descriptors not processed |
131 | * @tx_ring: the ring of descriptors | 145 | * @tx_ring: the ring of descriptors |
132 | * | 146 | * |
@@ -135,10 +149,16 @@ void i40evf_free_tx_resources(struct i40e_ring *tx_ring) | |||
135 | **/ | 149 | **/ |
136 | static u32 i40e_get_tx_pending(struct i40e_ring *ring) | 150 | static u32 i40e_get_tx_pending(struct i40e_ring *ring) |
137 | { | 151 | { |
138 | u32 ntu = ((ring->next_to_clean <= ring->next_to_use) | 152 | u32 head, tail; |
139 | ? ring->next_to_use | 153 | |
140 | : ring->next_to_use + ring->count); | 154 | head = i40e_get_head(ring); |
141 | return ntu - ring->next_to_clean; | 155 | tail = readl(ring->tail); |
156 | |||
157 | if (head != tail) | ||
158 | return (head < tail) ? | ||
159 | tail - head : (tail + ring->count - head); | ||
160 | |||
161 | return 0; | ||
142 | } | 162 | } |
143 | 163 | ||
144 | /** | 164 | /** |
@@ -147,6 +167,8 @@ static u32 i40e_get_tx_pending(struct i40e_ring *ring) | |||
147 | **/ | 167 | **/ |
148 | static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) | 168 | static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) |
149 | { | 169 | { |
170 | u32 tx_done = tx_ring->stats.packets; | ||
171 | u32 tx_done_old = tx_ring->tx_stats.tx_done_old; | ||
150 | u32 tx_pending = i40e_get_tx_pending(tx_ring); | 172 | u32 tx_pending = i40e_get_tx_pending(tx_ring); |
151 | bool ret = false; | 173 | bool ret = false; |
152 | 174 | ||
@@ -163,36 +185,20 @@ static bool i40e_check_tx_hang(struct i40e_ring *tx_ring) | |||
163 | * run the check_tx_hang logic with a transmit completion | 185 | * run the check_tx_hang logic with a transmit completion |
164 | * pending but without time to complete it yet. | 186 | * pending but without time to complete it yet. |
165 | */ | 187 | */ |
166 | if ((tx_ring->tx_stats.tx_done_old == tx_ring->stats.packets) && | 188 | if ((tx_done_old == tx_done) && tx_pending) { |
167 | (tx_pending >= I40E_MIN_DESC_PENDING)) { | ||
168 | /* make sure it is true for two checks in a row */ | 189 | /* make sure it is true for two checks in a row */ |
169 | ret = test_and_set_bit(__I40E_HANG_CHECK_ARMED, | 190 | ret = test_and_set_bit(__I40E_HANG_CHECK_ARMED, |
170 | &tx_ring->state); | 191 | &tx_ring->state); |
171 | } else if (!(tx_ring->tx_stats.tx_done_old == tx_ring->stats.packets) || | 192 | } else if (tx_done_old == tx_done && |
172 | !(tx_pending < I40E_MIN_DESC_PENDING) || | 193 | (tx_pending < I40E_MIN_DESC_PENDING) && (tx_pending > 0)) { |
173 | !(tx_pending > 0)) { | ||
174 | /* update completed stats and disarm the hang check */ | 194 | /* update completed stats and disarm the hang check */ |
175 | tx_ring->tx_stats.tx_done_old = tx_ring->stats.packets; | 195 | tx_ring->tx_stats.tx_done_old = tx_done; |
176 | clear_bit(__I40E_HANG_CHECK_ARMED, &tx_ring->state); | 196 | clear_bit(__I40E_HANG_CHECK_ARMED, &tx_ring->state); |
177 | } | 197 | } |
178 | 198 | ||
179 | return ret; | 199 | return ret; |
180 | } | 200 | } |
181 | 201 | ||
182 | /** | ||
183 | * i40e_get_head - Retrieve head from head writeback | ||
184 | * @tx_ring: tx ring to fetch head of | ||
185 | * | ||
186 | * Returns value of Tx ring head based on value stored | ||
187 | * in head write-back location | ||
188 | **/ | ||
189 | static inline u32 i40e_get_head(struct i40e_ring *tx_ring) | ||
190 | { | ||
191 | void *head = (struct i40e_tx_desc *)tx_ring->desc + tx_ring->count; | ||
192 | |||
193 | return le32_to_cpu(*(volatile __le32 *)head); | ||
194 | } | ||
195 | |||
196 | #define WB_STRIDE 0x3 | 202 | #define WB_STRIDE 0x3 |
197 | 203 | ||
198 | /** | 204 | /** |
@@ -1405,17 +1411,16 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb, | |||
1405 | if (err < 0) | 1411 | if (err < 0) |
1406 | return err; | 1412 | return err; |
1407 | 1413 | ||
1408 | if (protocol == htons(ETH_P_IP)) { | 1414 | iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); |
1409 | iph = skb->encapsulation ? inner_ip_hdr(skb) : ip_hdr(skb); | 1415 | ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) : ipv6_hdr(skb); |
1416 | |||
1417 | if (iph->version == 4) { | ||
1410 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); | 1418 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); |
1411 | iph->tot_len = 0; | 1419 | iph->tot_len = 0; |
1412 | iph->check = 0; | 1420 | iph->check = 0; |
1413 | tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, | 1421 | tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, |
1414 | 0, IPPROTO_TCP, 0); | 1422 | 0, IPPROTO_TCP, 0); |
1415 | } else if (skb_is_gso_v6(skb)) { | 1423 | } else if (ipv6h->version == 6) { |
1416 | |||
1417 | ipv6h = skb->encapsulation ? inner_ipv6_hdr(skb) | ||
1418 | : ipv6_hdr(skb); | ||
1419 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); | 1424 | tcph = skb->encapsulation ? inner_tcp_hdr(skb) : tcp_hdr(skb); |
1420 | ipv6h->payload_len = 0; | 1425 | ipv6h->payload_len = 0; |
1421 | tcph->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, | 1426 | tcph->check = ~csum_ipv6_magic(&ipv6h->saddr, &ipv6h->daddr, |
@@ -1473,13 +1478,9 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags, | |||
1473 | I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; | 1478 | I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; |
1474 | } | 1479 | } |
1475 | } else if (tx_flags & I40E_TX_FLAGS_IPV6) { | 1480 | } else if (tx_flags & I40E_TX_FLAGS_IPV6) { |
1476 | if (tx_flags & I40E_TX_FLAGS_TSO) { | 1481 | *cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6; |
1477 | *cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6; | 1482 | if (tx_flags & I40E_TX_FLAGS_TSO) |
1478 | ip_hdr(skb)->check = 0; | 1483 | ip_hdr(skb)->check = 0; |
1479 | } else { | ||
1480 | *cd_tunneling |= | ||
1481 | I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM; | ||
1482 | } | ||
1483 | } | 1484 | } |
1484 | 1485 | ||
1485 | /* Now set the ctx descriptor fields */ | 1486 | /* Now set the ctx descriptor fields */ |
@@ -1489,6 +1490,11 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 tx_flags, | |||
1489 | ((skb_inner_network_offset(skb) - | 1490 | ((skb_inner_network_offset(skb) - |
1490 | skb_transport_offset(skb)) >> 1) << | 1491 | skb_transport_offset(skb)) >> 1) << |
1491 | I40E_TXD_CTX_QW0_NATLEN_SHIFT; | 1492 | I40E_TXD_CTX_QW0_NATLEN_SHIFT; |
1493 | if (this_ip_hdr->version == 6) { | ||
1494 | tx_flags &= ~I40E_TX_FLAGS_IPV4; | ||
1495 | tx_flags |= I40E_TX_FLAGS_IPV6; | ||
1496 | } | ||
1497 | |||
1492 | 1498 | ||
1493 | } else { | 1499 | } else { |
1494 | network_hdr_len = skb_network_header_len(skb); | 1500 | network_hdr_len = skb_network_header_len(skb); |
@@ -1579,6 +1585,67 @@ static void i40e_create_tx_ctx(struct i40e_ring *tx_ring, | |||
1579 | context_desc->type_cmd_tso_mss = cpu_to_le64(cd_type_cmd_tso_mss); | 1585 | context_desc->type_cmd_tso_mss = cpu_to_le64(cd_type_cmd_tso_mss); |
1580 | } | 1586 | } |
1581 | 1587 | ||
1588 | /** | ||
1589 | * i40e_chk_linearize - Check if there are more than 8 fragments per packet | ||
1590 | * @skb: send buffer | ||
1591 | * @tx_flags: collected send information | ||
1592 | * @hdr_len: size of the packet header | ||
1593 | * | ||
1594 | * Note: Our HW can't scatter-gather more than 8 fragments to build | ||
1595 | * a packet on the wire and so we need to figure out the cases where we | ||
1596 | * need to linearize the skb. | ||
1597 | **/ | ||
1598 | static bool i40e_chk_linearize(struct sk_buff *skb, u32 tx_flags, | ||
1599 | const u8 hdr_len) | ||
1600 | { | ||
1601 | struct skb_frag_struct *frag; | ||
1602 | bool linearize = false; | ||
1603 | unsigned int size = 0; | ||
1604 | u16 num_frags; | ||
1605 | u16 gso_segs; | ||
1606 | |||
1607 | num_frags = skb_shinfo(skb)->nr_frags; | ||
1608 | gso_segs = skb_shinfo(skb)->gso_segs; | ||
1609 | |||
1610 | if (tx_flags & (I40E_TX_FLAGS_TSO | I40E_TX_FLAGS_FSO)) { | ||
1611 | u16 j = 1; | ||
1612 | |||
1613 | if (num_frags < (I40E_MAX_BUFFER_TXD)) | ||
1614 | goto linearize_chk_done; | ||
1615 | /* try the simple math, if we have too many frags per segment */ | ||
1616 | if (DIV_ROUND_UP((num_frags + gso_segs), gso_segs) > | ||
1617 | I40E_MAX_BUFFER_TXD) { | ||
1618 | linearize = true; | ||
1619 | goto linearize_chk_done; | ||
1620 | } | ||
1621 | frag = &skb_shinfo(skb)->frags[0]; | ||
1622 | size = hdr_len; | ||
1623 | /* we might still have more fragments per segment */ | ||
1624 | do { | ||
1625 | size += skb_frag_size(frag); | ||
1626 | frag++; j++; | ||
1627 | if (j == I40E_MAX_BUFFER_TXD) { | ||
1628 | if (size < skb_shinfo(skb)->gso_size) { | ||
1629 | linearize = true; | ||
1630 | break; | ||
1631 | } | ||
1632 | j = 1; | ||
1633 | size -= skb_shinfo(skb)->gso_size; | ||
1634 | if (size) | ||
1635 | j++; | ||
1636 | size += hdr_len; | ||
1637 | } | ||
1638 | num_frags--; | ||
1639 | } while (num_frags); | ||
1640 | } else { | ||
1641 | if (num_frags >= I40E_MAX_BUFFER_TXD) | ||
1642 | linearize = true; | ||
1643 | } | ||
1644 | |||
1645 | linearize_chk_done: | ||
1646 | return linearize; | ||
1647 | } | ||
1648 | |||
1582 | /** | 1649 | /** |
1583 | * i40e_tx_map - Build the Tx descriptor | 1650 | * i40e_tx_map - Build the Tx descriptor |
1584 | * @tx_ring: ring to send buffer on | 1651 | * @tx_ring: ring to send buffer on |
@@ -1853,6 +1920,10 @@ static netdev_tx_t i40e_xmit_frame_ring(struct sk_buff *skb, | |||
1853 | else if (tso) | 1920 | else if (tso) |
1854 | tx_flags |= I40E_TX_FLAGS_TSO; | 1921 | tx_flags |= I40E_TX_FLAGS_TSO; |
1855 | 1922 | ||
1923 | if (i40e_chk_linearize(skb, tx_flags, hdr_len)) | ||
1924 | if (skb_linearize(skb)) | ||
1925 | goto out_drop; | ||
1926 | |||
1856 | skb_tx_timestamp(skb); | 1927 | skb_tx_timestamp(skb); |
1857 | 1928 | ||
1858 | /* always enable CRC insertion offload */ | 1929 | /* always enable CRC insertion offload */ |
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h index ffdda716813e..1e49bb1fbac1 100644 --- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.h +++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.h | |||
@@ -120,6 +120,7 @@ enum i40e_dyn_idx_t { | |||
120 | 120 | ||
121 | #define i40e_rx_desc i40e_32byte_rx_desc | 121 | #define i40e_rx_desc i40e_32byte_rx_desc |
122 | 122 | ||
123 | #define I40E_MAX_BUFFER_TXD 8 | ||
123 | #define I40E_MIN_TX_LEN 17 | 124 | #define I40E_MIN_TX_LEN 17 |
124 | #define I40E_MAX_DATA_PER_TXD 8192 | 125 | #define I40E_MAX_DATA_PER_TXD 8192 |
125 | 126 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_selftest.c b/drivers/net/ethernet/mellanox/mlx4/en_selftest.c index 4e789479f00f..b66e03d9711f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_selftest.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_selftest.c | |||
@@ -81,12 +81,14 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv) | |||
81 | { | 81 | { |
82 | u32 loopback_ok = 0; | 82 | u32 loopback_ok = 0; |
83 | int i; | 83 | int i; |
84 | 84 | bool gro_enabled; | |
85 | 85 | ||
86 | priv->loopback_ok = 0; | 86 | priv->loopback_ok = 0; |
87 | priv->validate_loopback = 1; | 87 | priv->validate_loopback = 1; |
88 | gro_enabled = priv->dev->features & NETIF_F_GRO; | ||
88 | 89 | ||
89 | mlx4_en_update_loopback_state(priv->dev, priv->dev->features); | 90 | mlx4_en_update_loopback_state(priv->dev, priv->dev->features); |
91 | priv->dev->features &= ~NETIF_F_GRO; | ||
90 | 92 | ||
91 | /* xmit */ | 93 | /* xmit */ |
92 | if (mlx4_en_test_loopback_xmit(priv)) { | 94 | if (mlx4_en_test_loopback_xmit(priv)) { |
@@ -108,6 +110,10 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv) | |||
108 | mlx4_en_test_loopback_exit: | 110 | mlx4_en_test_loopback_exit: |
109 | 111 | ||
110 | priv->validate_loopback = 0; | 112 | priv->validate_loopback = 0; |
113 | |||
114 | if (gro_enabled) | ||
115 | priv->dev->features |= NETIF_F_GRO; | ||
116 | |||
111 | mlx4_en_update_loopback_state(priv->dev, priv->dev->features); | 117 | mlx4_en_update_loopback_state(priv->dev, priv->dev->features); |
112 | return !loopback_ok; | 118 | return !loopback_ok; |
113 | } | 119 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c index 2bb8553bd905..eda29dbbfcd2 100644 --- a/drivers/net/ethernet/mellanox/mlx4/qp.c +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | |||
@@ -412,7 +412,6 @@ err_icm: | |||
412 | 412 | ||
413 | EXPORT_SYMBOL_GPL(mlx4_qp_alloc); | 413 | EXPORT_SYMBOL_GPL(mlx4_qp_alloc); |
414 | 414 | ||
415 | #define MLX4_UPDATE_QP_SUPPORTED_ATTRS MLX4_UPDATE_QP_SMAC | ||
416 | int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn, | 415 | int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn, |
417 | enum mlx4_update_qp_attr attr, | 416 | enum mlx4_update_qp_attr attr, |
418 | struct mlx4_update_qp_params *params) | 417 | struct mlx4_update_qp_params *params) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 486e3d26cd4a..d97ca88c55b5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -713,7 +713,7 @@ static int update_vport_qp_param(struct mlx4_dev *dev, | |||
713 | struct mlx4_vport_oper_state *vp_oper; | 713 | struct mlx4_vport_oper_state *vp_oper; |
714 | struct mlx4_priv *priv; | 714 | struct mlx4_priv *priv; |
715 | u32 qp_type; | 715 | u32 qp_type; |
716 | int port; | 716 | int port, err = 0; |
717 | 717 | ||
718 | port = (qpc->pri_path.sched_queue & 0x40) ? 2 : 1; | 718 | port = (qpc->pri_path.sched_queue & 0x40) ? 2 : 1; |
719 | priv = mlx4_priv(dev); | 719 | priv = mlx4_priv(dev); |
@@ -738,7 +738,9 @@ static int update_vport_qp_param(struct mlx4_dev *dev, | |||
738 | } else { | 738 | } else { |
739 | struct mlx4_update_qp_params params = {.flags = 0}; | 739 | struct mlx4_update_qp_params params = {.flags = 0}; |
740 | 740 | ||
741 | mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, ¶ms); | 741 | err = mlx4_update_qp(dev, qpn, MLX4_UPDATE_QP_VSD, ¶ms); |
742 | if (err) | ||
743 | goto out; | ||
742 | } | 744 | } |
743 | } | 745 | } |
744 | 746 | ||
@@ -773,7 +775,8 @@ static int update_vport_qp_param(struct mlx4_dev *dev, | |||
773 | qpc->pri_path.feup |= MLX4_FSM_FORCE_ETH_SRC_MAC; | 775 | qpc->pri_path.feup |= MLX4_FSM_FORCE_ETH_SRC_MAC; |
774 | qpc->pri_path.grh_mylmc = (0x80 & qpc->pri_path.grh_mylmc) + vp_oper->mac_idx; | 776 | qpc->pri_path.grh_mylmc = (0x80 & qpc->pri_path.grh_mylmc) + vp_oper->mac_idx; |
775 | } | 777 | } |
776 | return 0; | 778 | out: |
779 | return err; | ||
777 | } | 780 | } |
778 | 781 | ||
779 | static int mpt_mask(struct mlx4_dev *dev) | 782 | static int mpt_mask(struct mlx4_dev *dev) |
diff --git a/drivers/net/ethernet/pasemi/pasemi_mac.c b/drivers/net/ethernet/pasemi/pasemi_mac.c index 44e8d7d25547..57a6e6cd74fc 100644 --- a/drivers/net/ethernet/pasemi/pasemi_mac.c +++ b/drivers/net/ethernet/pasemi/pasemi_mac.c | |||
@@ -1239,11 +1239,9 @@ static int pasemi_mac_open(struct net_device *dev) | |||
1239 | if (mac->phydev) | 1239 | if (mac->phydev) |
1240 | phy_start(mac->phydev); | 1240 | phy_start(mac->phydev); |
1241 | 1241 | ||
1242 | init_timer(&mac->tx->clean_timer); | 1242 | setup_timer(&mac->tx->clean_timer, pasemi_mac_tx_timer, |
1243 | mac->tx->clean_timer.function = pasemi_mac_tx_timer; | 1243 | (unsigned long)mac->tx); |
1244 | mac->tx->clean_timer.data = (unsigned long)mac->tx; | 1244 | mod_timer(&mac->tx->clean_timer, jiffies + HZ); |
1245 | mac->tx->clean_timer.expires = jiffies+HZ; | ||
1246 | add_timer(&mac->tx->clean_timer); | ||
1247 | 1245 | ||
1248 | return 0; | 1246 | return 0; |
1249 | 1247 | ||
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic.h b/drivers/net/ethernet/qlogic/netxen/netxen_nic.h index 6e426ae94692..0a5e204a0179 100644 --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic.h +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic.h | |||
@@ -354,7 +354,7 @@ struct cmd_desc_type0 { | |||
354 | 354 | ||
355 | } __attribute__ ((aligned(64))); | 355 | } __attribute__ ((aligned(64))); |
356 | 356 | ||
357 | /* Note: sizeof(rcv_desc) should always be a mutliple of 2 */ | 357 | /* Note: sizeof(rcv_desc) should always be a multiple of 2 */ |
358 | struct rcv_desc { | 358 | struct rcv_desc { |
359 | __le16 reference_handle; | 359 | __le16 reference_handle; |
360 | __le16 reserved; | 360 | __le16 reserved; |
@@ -499,7 +499,7 @@ struct uni_data_desc{ | |||
499 | #define NETXEN_IMAGE_START 0x43000 /* compressed image */ | 499 | #define NETXEN_IMAGE_START 0x43000 /* compressed image */ |
500 | #define NETXEN_SECONDARY_START 0x200000 /* backup images */ | 500 | #define NETXEN_SECONDARY_START 0x200000 /* backup images */ |
501 | #define NETXEN_PXE_START 0x3E0000 /* PXE boot rom */ | 501 | #define NETXEN_PXE_START 0x3E0000 /* PXE boot rom */ |
502 | #define NETXEN_USER_START 0x3E8000 /* Firmare info */ | 502 | #define NETXEN_USER_START 0x3E8000 /* Firmware info */ |
503 | #define NETXEN_FIXED_START 0x3F0000 /* backup of crbinit */ | 503 | #define NETXEN_FIXED_START 0x3F0000 /* backup of crbinit */ |
504 | #define NETXEN_USER_START_OLD NETXEN_PXE_START /* very old flash */ | 504 | #define NETXEN_USER_START_OLD NETXEN_PXE_START /* very old flash */ |
505 | 505 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index fa4317611fd6..f221126a5c4e 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -314,7 +314,7 @@ struct qlcnic_fdt { | |||
314 | #define QLCNIC_BRDCFG_START 0x4000 /* board config */ | 314 | #define QLCNIC_BRDCFG_START 0x4000 /* board config */ |
315 | #define QLCNIC_BOOTLD_START 0x10000 /* bootld */ | 315 | #define QLCNIC_BOOTLD_START 0x10000 /* bootld */ |
316 | #define QLCNIC_IMAGE_START 0x43000 /* compressed image */ | 316 | #define QLCNIC_IMAGE_START 0x43000 /* compressed image */ |
317 | #define QLCNIC_USER_START 0x3E8000 /* Firmare info */ | 317 | #define QLCNIC_USER_START 0x3E8000 /* Firmware info */ |
318 | 318 | ||
319 | #define QLCNIC_FW_VERSION_OFFSET (QLCNIC_USER_START+0x408) | 319 | #define QLCNIC_FW_VERSION_OFFSET (QLCNIC_USER_START+0x408) |
320 | #define QLCNIC_FW_SIZE_OFFSET (QLCNIC_USER_START+0x40c) | 320 | #define QLCNIC_FW_SIZE_OFFSET (QLCNIC_USER_START+0x40c) |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index ad0020af2193..c70ab40d8698 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -2561,7 +2561,7 @@ static int rtl_check_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw) | |||
2561 | int rc = -EINVAL; | 2561 | int rc = -EINVAL; |
2562 | 2562 | ||
2563 | if (!rtl_fw_format_ok(tp, rtl_fw)) { | 2563 | if (!rtl_fw_format_ok(tp, rtl_fw)) { |
2564 | netif_err(tp, ifup, dev, "invalid firwmare\n"); | 2564 | netif_err(tp, ifup, dev, "invalid firmware\n"); |
2565 | goto out; | 2565 | goto out; |
2566 | } | 2566 | } |
2567 | 2567 | ||
@@ -5067,8 +5067,6 @@ static void rtl_hw_reset(struct rtl8169_private *tp) | |||
5067 | RTL_W8(ChipCmd, CmdReset); | 5067 | RTL_W8(ChipCmd, CmdReset); |
5068 | 5068 | ||
5069 | rtl_udelay_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100); | 5069 | rtl_udelay_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100); |
5070 | |||
5071 | netdev_reset_queue(tp->dev); | ||
5072 | } | 5070 | } |
5073 | 5071 | ||
5074 | static void rtl_request_uncached_firmware(struct rtl8169_private *tp) | 5072 | static void rtl_request_uncached_firmware(struct rtl8169_private *tp) |
@@ -7049,7 +7047,6 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
7049 | u32 status, len; | 7047 | u32 status, len; |
7050 | u32 opts[2]; | 7048 | u32 opts[2]; |
7051 | int frags; | 7049 | int frags; |
7052 | bool stop_queue; | ||
7053 | 7050 | ||
7054 | if (unlikely(!TX_FRAGS_READY_FOR(tp, skb_shinfo(skb)->nr_frags))) { | 7051 | if (unlikely(!TX_FRAGS_READY_FOR(tp, skb_shinfo(skb)->nr_frags))) { |
7055 | netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n"); | 7052 | netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n"); |
@@ -7090,8 +7087,6 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
7090 | 7087 | ||
7091 | txd->opts2 = cpu_to_le32(opts[1]); | 7088 | txd->opts2 = cpu_to_le32(opts[1]); |
7092 | 7089 | ||
7093 | netdev_sent_queue(dev, skb->len); | ||
7094 | |||
7095 | skb_tx_timestamp(skb); | 7090 | skb_tx_timestamp(skb); |
7096 | 7091 | ||
7097 | /* Force memory writes to complete before releasing descriptor */ | 7092 | /* Force memory writes to complete before releasing descriptor */ |
@@ -7106,16 +7101,11 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, | |||
7106 | 7101 | ||
7107 | tp->cur_tx += frags + 1; | 7102 | tp->cur_tx += frags + 1; |
7108 | 7103 | ||
7109 | stop_queue = !TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS); | 7104 | RTL_W8(TxPoll, NPQ); |
7110 | 7105 | ||
7111 | if (!skb->xmit_more || stop_queue || | 7106 | mmiowb(); |
7112 | netif_xmit_stopped(netdev_get_tx_queue(dev, 0))) { | ||
7113 | RTL_W8(TxPoll, NPQ); | ||
7114 | |||
7115 | mmiowb(); | ||
7116 | } | ||
7117 | 7107 | ||
7118 | if (stop_queue) { | 7108 | if (!TX_FRAGS_READY_FOR(tp, MAX_SKB_FRAGS)) { |
7119 | /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must | 7109 | /* Avoid wrongly optimistic queue wake-up: rtl_tx thread must |
7120 | * not miss a ring update when it notices a stopped queue. | 7110 | * not miss a ring update when it notices a stopped queue. |
7121 | */ | 7111 | */ |
@@ -7198,7 +7188,6 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) | |||
7198 | static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | 7188 | static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) |
7199 | { | 7189 | { |
7200 | unsigned int dirty_tx, tx_left; | 7190 | unsigned int dirty_tx, tx_left; |
7201 | unsigned int bytes_compl = 0, pkts_compl = 0; | ||
7202 | 7191 | ||
7203 | dirty_tx = tp->dirty_tx; | 7192 | dirty_tx = tp->dirty_tx; |
7204 | smp_rmb(); | 7193 | smp_rmb(); |
@@ -7222,8 +7211,10 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | |||
7222 | rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb, | 7211 | rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb, |
7223 | tp->TxDescArray + entry); | 7212 | tp->TxDescArray + entry); |
7224 | if (status & LastFrag) { | 7213 | if (status & LastFrag) { |
7225 | pkts_compl++; | 7214 | u64_stats_update_begin(&tp->tx_stats.syncp); |
7226 | bytes_compl += tx_skb->skb->len; | 7215 | tp->tx_stats.packets++; |
7216 | tp->tx_stats.bytes += tx_skb->skb->len; | ||
7217 | u64_stats_update_end(&tp->tx_stats.syncp); | ||
7227 | dev_kfree_skb_any(tx_skb->skb); | 7218 | dev_kfree_skb_any(tx_skb->skb); |
7228 | tx_skb->skb = NULL; | 7219 | tx_skb->skb = NULL; |
7229 | } | 7220 | } |
@@ -7232,13 +7223,6 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | |||
7232 | } | 7223 | } |
7233 | 7224 | ||
7234 | if (tp->dirty_tx != dirty_tx) { | 7225 | if (tp->dirty_tx != dirty_tx) { |
7235 | netdev_completed_queue(tp->dev, pkts_compl, bytes_compl); | ||
7236 | |||
7237 | u64_stats_update_begin(&tp->tx_stats.syncp); | ||
7238 | tp->tx_stats.packets += pkts_compl; | ||
7239 | tp->tx_stats.bytes += bytes_compl; | ||
7240 | u64_stats_update_end(&tp->tx_stats.syncp); | ||
7241 | |||
7242 | tp->dirty_tx = dirty_tx; | 7226 | tp->dirty_tx = dirty_tx; |
7243 | /* Sync with rtl8169_start_xmit: | 7227 | /* Sync with rtl8169_start_xmit: |
7244 | * - publish dirty_tx ring index (write barrier) | 7228 | * - publish dirty_tx ring index (write barrier) |
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index 4da8bd263997..736d5d1624a1 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
@@ -508,7 +508,6 @@ static struct sh_eth_cpu_data r8a779x_data = { | |||
508 | .tpauser = 1, | 508 | .tpauser = 1, |
509 | .hw_swap = 1, | 509 | .hw_swap = 1, |
510 | .rmiimode = 1, | 510 | .rmiimode = 1, |
511 | .shift_rd0 = 1, | ||
512 | }; | 511 | }; |
513 | 512 | ||
514 | static void sh_eth_set_rate_sh7724(struct net_device *ndev) | 513 | static void sh_eth_set_rate_sh7724(struct net_device *ndev) |
@@ -1392,6 +1391,9 @@ static void sh_eth_dev_exit(struct net_device *ndev) | |||
1392 | msleep(2); /* max frame time at 10 Mbps < 1250 us */ | 1391 | msleep(2); /* max frame time at 10 Mbps < 1250 us */ |
1393 | sh_eth_get_stats(ndev); | 1392 | sh_eth_get_stats(ndev); |
1394 | sh_eth_reset(ndev); | 1393 | sh_eth_reset(ndev); |
1394 | |||
1395 | /* Set MAC address again */ | ||
1396 | update_mac_address(ndev); | ||
1395 | } | 1397 | } |
1396 | 1398 | ||
1397 | /* free Tx skb function */ | 1399 | /* free Tx skb function */ |
@@ -1407,6 +1409,8 @@ static int sh_eth_txfree(struct net_device *ndev) | |||
1407 | txdesc = &mdp->tx_ring[entry]; | 1409 | txdesc = &mdp->tx_ring[entry]; |
1408 | if (txdesc->status & cpu_to_edmac(mdp, TD_TACT)) | 1410 | if (txdesc->status & cpu_to_edmac(mdp, TD_TACT)) |
1409 | break; | 1411 | break; |
1412 | /* TACT bit must be checked before all the following reads */ | ||
1413 | rmb(); | ||
1410 | /* Free the original skb. */ | 1414 | /* Free the original skb. */ |
1411 | if (mdp->tx_skbuff[entry]) { | 1415 | if (mdp->tx_skbuff[entry]) { |
1412 | dma_unmap_single(&ndev->dev, txdesc->addr, | 1416 | dma_unmap_single(&ndev->dev, txdesc->addr, |
@@ -1444,6 +1448,8 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1444 | limit = boguscnt; | 1448 | limit = boguscnt; |
1445 | rxdesc = &mdp->rx_ring[entry]; | 1449 | rxdesc = &mdp->rx_ring[entry]; |
1446 | while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) { | 1450 | while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) { |
1451 | /* RACT bit must be checked before all the following reads */ | ||
1452 | rmb(); | ||
1447 | desc_status = edmac_to_cpu(mdp, rxdesc->status); | 1453 | desc_status = edmac_to_cpu(mdp, rxdesc->status); |
1448 | pkt_len = rxdesc->frame_length; | 1454 | pkt_len = rxdesc->frame_length; |
1449 | 1455 | ||
@@ -1455,8 +1461,8 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1455 | 1461 | ||
1456 | /* In case of almost all GETHER/ETHERs, the Receive Frame State | 1462 | /* In case of almost all GETHER/ETHERs, the Receive Frame State |
1457 | * (RFS) bits in the Receive Descriptor 0 are from bit 9 to | 1463 | * (RFS) bits in the Receive Descriptor 0 are from bit 9 to |
1458 | * bit 0. However, in case of the R8A7740, R8A779x, and | 1464 | * bit 0. However, in case of the R8A7740 and R7S72100 |
1459 | * R7S72100 the RFS bits are from bit 25 to bit 16. So, the | 1465 | * the RFS bits are from bit 25 to bit 16. So, the |
1460 | * driver needs right shifting by 16. | 1466 | * driver needs right shifting by 16. |
1461 | */ | 1467 | */ |
1462 | if (mdp->cd->shift_rd0) | 1468 | if (mdp->cd->shift_rd0) |
@@ -1523,6 +1529,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1523 | skb_checksum_none_assert(skb); | 1529 | skb_checksum_none_assert(skb); |
1524 | rxdesc->addr = dma_addr; | 1530 | rxdesc->addr = dma_addr; |
1525 | } | 1531 | } |
1532 | wmb(); /* RACT bit must be set after all the above writes */ | ||
1526 | if (entry >= mdp->num_rx_ring - 1) | 1533 | if (entry >= mdp->num_rx_ring - 1) |
1527 | rxdesc->status |= | 1534 | rxdesc->status |= |
1528 | cpu_to_edmac(mdp, RD_RACT | RD_RFP | RD_RDEL); | 1535 | cpu_to_edmac(mdp, RD_RACT | RD_RFP | RD_RDEL); |
@@ -1535,7 +1542,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1535 | /* If we don't need to check status, don't. -KDU */ | 1542 | /* If we don't need to check status, don't. -KDU */ |
1536 | if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) { | 1543 | if (!(sh_eth_read(ndev, EDRRR) & EDRRR_R)) { |
1537 | /* fix the values for the next receiving if RDE is set */ | 1544 | /* fix the values for the next receiving if RDE is set */ |
1538 | if (intr_status & EESR_RDE) { | 1545 | if (intr_status & EESR_RDE && mdp->reg_offset[RDFAR] != 0) { |
1539 | u32 count = (sh_eth_read(ndev, RDFAR) - | 1546 | u32 count = (sh_eth_read(ndev, RDFAR) - |
1540 | sh_eth_read(ndev, RDLAR)) >> 4; | 1547 | sh_eth_read(ndev, RDLAR)) >> 4; |
1541 | 1548 | ||
@@ -2174,7 +2181,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
2174 | } | 2181 | } |
2175 | spin_unlock_irqrestore(&mdp->lock, flags); | 2182 | spin_unlock_irqrestore(&mdp->lock, flags); |
2176 | 2183 | ||
2177 | if (skb_padto(skb, ETH_ZLEN)) | 2184 | if (skb_put_padto(skb, ETH_ZLEN)) |
2178 | return NETDEV_TX_OK; | 2185 | return NETDEV_TX_OK; |
2179 | 2186 | ||
2180 | entry = mdp->cur_tx % mdp->num_tx_ring; | 2187 | entry = mdp->cur_tx % mdp->num_tx_ring; |
@@ -2192,6 +2199,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
2192 | } | 2199 | } |
2193 | txdesc->buffer_length = skb->len; | 2200 | txdesc->buffer_length = skb->len; |
2194 | 2201 | ||
2202 | wmb(); /* TACT bit must be set after all the above writes */ | ||
2195 | if (entry >= mdp->num_tx_ring - 1) | 2203 | if (entry >= mdp->num_tx_ring - 1) |
2196 | txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); | 2204 | txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); |
2197 | else | 2205 | else |
diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c index e5a15a4c4e8f..a5d1e6ea7d58 100644 --- a/drivers/net/ethernet/rocker/rocker.c +++ b/drivers/net/ethernet/rocker/rocker.c | |||
@@ -1280,9 +1280,9 @@ static void rocker_port_set_enable(struct rocker_port *rocker_port, bool enable) | |||
1280 | u64 val = rocker_read64(rocker_port->rocker, PORT_PHYS_ENABLE); | 1280 | u64 val = rocker_read64(rocker_port->rocker, PORT_PHYS_ENABLE); |
1281 | 1281 | ||
1282 | if (enable) | 1282 | if (enable) |
1283 | val |= 1 << rocker_port->pport; | 1283 | val |= 1ULL << rocker_port->pport; |
1284 | else | 1284 | else |
1285 | val &= ~(1 << rocker_port->pport); | 1285 | val &= ~(1ULL << rocker_port->pport); |
1286 | rocker_write64(rocker_port->rocker, PORT_PHYS_ENABLE, val); | 1286 | rocker_write64(rocker_port->rocker, PORT_PHYS_ENABLE, val); |
1287 | } | 1287 | } |
1288 | 1288 | ||
@@ -4241,6 +4241,8 @@ static int rocker_probe_ports(struct rocker *rocker) | |||
4241 | 4241 | ||
4242 | alloc_size = sizeof(struct rocker_port *) * rocker->port_count; | 4242 | alloc_size = sizeof(struct rocker_port *) * rocker->port_count; |
4243 | rocker->ports = kmalloc(alloc_size, GFP_KERNEL); | 4243 | rocker->ports = kmalloc(alloc_size, GFP_KERNEL); |
4244 | if (!rocker->ports) | ||
4245 | return -ENOMEM; | ||
4244 | for (i = 0; i < rocker->port_count; i++) { | 4246 | for (i = 0; i < rocker->port_count; i++) { |
4245 | err = rocker_probe_port(rocker, i); | 4247 | err = rocker_probe_port(rocker, i); |
4246 | if (err) | 4248 | if (err) |
diff --git a/drivers/net/ethernet/smsc/smc91c92_cs.c b/drivers/net/ethernet/smsc/smc91c92_cs.c index 6b33127ab352..3449893aea8d 100644 --- a/drivers/net/ethernet/smsc/smc91c92_cs.c +++ b/drivers/net/ethernet/smsc/smc91c92_cs.c | |||
@@ -1070,11 +1070,8 @@ static int smc_open(struct net_device *dev) | |||
1070 | smc->packets_waiting = 0; | 1070 | smc->packets_waiting = 0; |
1071 | 1071 | ||
1072 | smc_reset(dev); | 1072 | smc_reset(dev); |
1073 | init_timer(&smc->media); | 1073 | setup_timer(&smc->media, media_check, (u_long)dev); |
1074 | smc->media.function = media_check; | 1074 | mod_timer(&smc->media, jiffies + HZ); |
1075 | smc->media.data = (u_long) dev; | ||
1076 | smc->media.expires = jiffies + HZ; | ||
1077 | add_timer(&smc->media); | ||
1078 | 1075 | ||
1079 | return 0; | 1076 | return 0; |
1080 | } /* smc_open */ | 1077 | } /* smc_open */ |
diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c index 88a55f95fe09..209ee1b27f8d 100644 --- a/drivers/net/ethernet/smsc/smc91x.c +++ b/drivers/net/ethernet/smsc/smc91x.c | |||
@@ -91,6 +91,10 @@ static const char version[] = | |||
91 | 91 | ||
92 | #include "smc91x.h" | 92 | #include "smc91x.h" |
93 | 93 | ||
94 | #if defined(CONFIG_ASSABET_NEPONSET) | ||
95 | #include <mach/neponset.h> | ||
96 | #endif | ||
97 | |||
94 | #ifndef SMC_NOWAIT | 98 | #ifndef SMC_NOWAIT |
95 | # define SMC_NOWAIT 0 | 99 | # define SMC_NOWAIT 0 |
96 | #endif | 100 | #endif |
@@ -2355,8 +2359,9 @@ static int smc_drv_probe(struct platform_device *pdev) | |||
2355 | ret = smc_request_attrib(pdev, ndev); | 2359 | ret = smc_request_attrib(pdev, ndev); |
2356 | if (ret) | 2360 | if (ret) |
2357 | goto out_release_io; | 2361 | goto out_release_io; |
2358 | #if defined(CONFIG_SA1100_ASSABET) | 2362 | #if defined(CONFIG_ASSABET_NEPONSET) |
2359 | neponset_ncr_set(NCR_ENET_OSC_EN); | 2363 | if (machine_is_assabet() && machine_has_neponset()) |
2364 | neponset_ncr_set(NCR_ENET_OSC_EN); | ||
2360 | #endif | 2365 | #endif |
2361 | platform_set_drvdata(pdev, ndev); | 2366 | platform_set_drvdata(pdev, ndev); |
2362 | ret = smc_enable_device(pdev); | 2367 | ret = smc_enable_device(pdev); |
diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index be67baf5f677..3a18501d1068 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h | |||
@@ -39,14 +39,7 @@ | |||
39 | * Define your architecture specific bus configuration parameters here. | 39 | * Define your architecture specific bus configuration parameters here. |
40 | */ | 40 | */ |
41 | 41 | ||
42 | #if defined(CONFIG_ARCH_LUBBOCK) ||\ | 42 | #if defined(CONFIG_ARM) |
43 | defined(CONFIG_MACH_MAINSTONE) ||\ | ||
44 | defined(CONFIG_MACH_ZYLONITE) ||\ | ||
45 | defined(CONFIG_MACH_LITTLETON) ||\ | ||
46 | defined(CONFIG_MACH_ZYLONITE2) ||\ | ||
47 | defined(CONFIG_ARCH_VIPER) ||\ | ||
48 | defined(CONFIG_MACH_STARGATE2) ||\ | ||
49 | defined(CONFIG_ARCH_VERSATILE) | ||
50 | 43 | ||
51 | #include <asm/mach-types.h> | 44 | #include <asm/mach-types.h> |
52 | 45 | ||
@@ -74,95 +67,8 @@ | |||
74 | /* We actually can't write halfwords properly if not word aligned */ | 67 | /* We actually can't write halfwords properly if not word aligned */ |
75 | static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg) | 68 | static inline void SMC_outw(u16 val, void __iomem *ioaddr, int reg) |
76 | { | 69 | { |
77 | if ((machine_is_mainstone() || machine_is_stargate2()) && reg & 2) { | 70 | if ((machine_is_mainstone() || machine_is_stargate2() || |
78 | unsigned int v = val << 16; | 71 | machine_is_pxa_idp()) && reg & 2) { |
79 | v |= readl(ioaddr + (reg & ~2)) & 0xffff; | ||
80 | writel(v, ioaddr + (reg & ~2)); | ||
81 | } else { | ||
82 | writew(val, ioaddr + reg); | ||
83 | } | ||
84 | } | ||
85 | |||
86 | #elif defined(CONFIG_SA1100_PLEB) | ||
87 | /* We can only do 16-bit reads and writes in the static memory space. */ | ||
88 | #define SMC_CAN_USE_8BIT 1 | ||
89 | #define SMC_CAN_USE_16BIT 1 | ||
90 | #define SMC_CAN_USE_32BIT 0 | ||
91 | #define SMC_IO_SHIFT 0 | ||
92 | #define SMC_NOWAIT 1 | ||
93 | |||
94 | #define SMC_inb(a, r) readb((a) + (r)) | ||
95 | #define SMC_insb(a, r, p, l) readsb((a) + (r), p, (l)) | ||
96 | #define SMC_inw(a, r) readw((a) + (r)) | ||
97 | #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) | ||
98 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) | ||
99 | #define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l)) | ||
100 | #define SMC_outw(v, a, r) writew(v, (a) + (r)) | ||
101 | #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) | ||
102 | |||
103 | #define SMC_IRQ_FLAGS (-1) | ||
104 | |||
105 | #elif defined(CONFIG_SA1100_ASSABET) | ||
106 | |||
107 | #include <mach/neponset.h> | ||
108 | |||
109 | /* We can only do 8-bit reads and writes in the static memory space. */ | ||
110 | #define SMC_CAN_USE_8BIT 1 | ||
111 | #define SMC_CAN_USE_16BIT 0 | ||
112 | #define SMC_CAN_USE_32BIT 0 | ||
113 | #define SMC_NOWAIT 1 | ||
114 | |||
115 | /* The first two address lines aren't connected... */ | ||
116 | #define SMC_IO_SHIFT 2 | ||
117 | |||
118 | #define SMC_inb(a, r) readb((a) + (r)) | ||
119 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) | ||
120 | #define SMC_insb(a, r, p, l) readsb((a) + (r), p, (l)) | ||
121 | #define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l)) | ||
122 | #define SMC_IRQ_FLAGS (-1) /* from resource */ | ||
123 | |||
124 | #elif defined(CONFIG_MACH_LOGICPD_PXA270) || \ | ||
125 | defined(CONFIG_MACH_NOMADIK_8815NHK) | ||
126 | |||
127 | #define SMC_CAN_USE_8BIT 0 | ||
128 | #define SMC_CAN_USE_16BIT 1 | ||
129 | #define SMC_CAN_USE_32BIT 0 | ||
130 | #define SMC_IO_SHIFT 0 | ||
131 | #define SMC_NOWAIT 1 | ||
132 | |||
133 | #define SMC_inw(a, r) readw((a) + (r)) | ||
134 | #define SMC_outw(v, a, r) writew(v, (a) + (r)) | ||
135 | #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) | ||
136 | #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) | ||
137 | |||
138 | #elif defined(CONFIG_ARCH_INNOKOM) || \ | ||
139 | defined(CONFIG_ARCH_PXA_IDP) || \ | ||
140 | defined(CONFIG_ARCH_RAMSES) || \ | ||
141 | defined(CONFIG_ARCH_PCM027) | ||
142 | |||
143 | #define SMC_CAN_USE_8BIT 1 | ||
144 | #define SMC_CAN_USE_16BIT 1 | ||
145 | #define SMC_CAN_USE_32BIT 1 | ||
146 | #define SMC_IO_SHIFT 0 | ||
147 | #define SMC_NOWAIT 1 | ||
148 | #define SMC_USE_PXA_DMA 1 | ||
149 | |||
150 | #define SMC_inb(a, r) readb((a) + (r)) | ||
151 | #define SMC_inw(a, r) readw((a) + (r)) | ||
152 | #define SMC_inl(a, r) readl((a) + (r)) | ||
153 | #define SMC_outb(v, a, r) writeb(v, (a) + (r)) | ||
154 | #define SMC_outl(v, a, r) writel(v, (a) + (r)) | ||
155 | #define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) | ||
156 | #define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) | ||
157 | #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) | ||
158 | #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) | ||
159 | #define SMC_IRQ_FLAGS (-1) /* from resource */ | ||
160 | |||
161 | /* We actually can't write halfwords properly if not word aligned */ | ||
162 | static inline void | ||
163 | SMC_outw(u16 val, void __iomem *ioaddr, int reg) | ||
164 | { | ||
165 | if (reg & 2) { | ||
166 | unsigned int v = val << 16; | 72 | unsigned int v = val << 16; |
167 | v |= readl(ioaddr + (reg & ~2)) & 0xffff; | 73 | v |= readl(ioaddr + (reg & ~2)) & 0xffff; |
168 | writel(v, ioaddr + (reg & ~2)); | 74 | writel(v, ioaddr + (reg & ~2)); |
@@ -237,20 +143,6 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) | |||
237 | #define RPC_LSA_DEFAULT RPC_LED_100_10 | 143 | #define RPC_LSA_DEFAULT RPC_LED_100_10 |
238 | #define RPC_LSB_DEFAULT RPC_LED_TX_RX | 144 | #define RPC_LSB_DEFAULT RPC_LED_TX_RX |
239 | 145 | ||
240 | #elif defined(CONFIG_ARCH_MSM) | ||
241 | |||
242 | #define SMC_CAN_USE_8BIT 0 | ||
243 | #define SMC_CAN_USE_16BIT 1 | ||
244 | #define SMC_CAN_USE_32BIT 0 | ||
245 | #define SMC_NOWAIT 1 | ||
246 | |||
247 | #define SMC_inw(a, r) readw((a) + (r)) | ||
248 | #define SMC_outw(v, a, r) writew(v, (a) + (r)) | ||
249 | #define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) | ||
250 | #define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) | ||
251 | |||
252 | #define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH | ||
253 | |||
254 | #elif defined(CONFIG_COLDFIRE) | 146 | #elif defined(CONFIG_COLDFIRE) |
255 | 147 | ||
256 | #define SMC_CAN_USE_8BIT 0 | 148 | #define SMC_CAN_USE_8BIT 0 |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 55e89b3838f1..a0ea84fe6519 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -310,11 +310,11 @@ bool stmmac_eee_init(struct stmmac_priv *priv) | |||
310 | spin_lock_irqsave(&priv->lock, flags); | 310 | spin_lock_irqsave(&priv->lock, flags); |
311 | if (!priv->eee_active) { | 311 | if (!priv->eee_active) { |
312 | priv->eee_active = 1; | 312 | priv->eee_active = 1; |
313 | init_timer(&priv->eee_ctrl_timer); | 313 | setup_timer(&priv->eee_ctrl_timer, |
314 | priv->eee_ctrl_timer.function = stmmac_eee_ctrl_timer; | 314 | stmmac_eee_ctrl_timer, |
315 | priv->eee_ctrl_timer.data = (unsigned long)priv; | 315 | (unsigned long)priv); |
316 | priv->eee_ctrl_timer.expires = STMMAC_LPI_T(eee_timer); | 316 | mod_timer(&priv->eee_ctrl_timer, |
317 | add_timer(&priv->eee_ctrl_timer); | 317 | STMMAC_LPI_T(eee_timer)); |
318 | 318 | ||
319 | priv->hw->mac->set_eee_timer(priv->hw, | 319 | priv->hw->mac->set_eee_timer(priv->hw, |
320 | STMMAC_DEFAULT_LIT_LS, | 320 | STMMAC_DEFAULT_LIT_LS, |
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index 4b51f903fb73..0c5842aeb807 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c | |||
@@ -6989,10 +6989,10 @@ static int niu_class_to_ethflow(u64 class, int *flow_type) | |||
6989 | *flow_type = IP_USER_FLOW; | 6989 | *flow_type = IP_USER_FLOW; |
6990 | break; | 6990 | break; |
6991 | default: | 6991 | default: |
6992 | return 0; | 6992 | return -EINVAL; |
6993 | } | 6993 | } |
6994 | 6994 | ||
6995 | return 1; | 6995 | return 0; |
6996 | } | 6996 | } |
6997 | 6997 | ||
6998 | static int niu_ethflow_to_class(int flow_type, u64 *class) | 6998 | static int niu_ethflow_to_class(int flow_type, u64 *class) |
@@ -7198,11 +7198,9 @@ static int niu_get_ethtool_tcam_entry(struct niu *np, | |||
7198 | class = (tp->key[0] & TCAM_V4KEY0_CLASS_CODE) >> | 7198 | class = (tp->key[0] & TCAM_V4KEY0_CLASS_CODE) >> |
7199 | TCAM_V4KEY0_CLASS_CODE_SHIFT; | 7199 | TCAM_V4KEY0_CLASS_CODE_SHIFT; |
7200 | ret = niu_class_to_ethflow(class, &fsp->flow_type); | 7200 | ret = niu_class_to_ethflow(class, &fsp->flow_type); |
7201 | |||
7202 | if (ret < 0) { | 7201 | if (ret < 0) { |
7203 | netdev_info(np->dev, "niu%d: niu_class_to_ethflow failed\n", | 7202 | netdev_info(np->dev, "niu%d: niu_class_to_ethflow failed\n", |
7204 | parent->index); | 7203 | parent->index); |
7205 | ret = -EINVAL; | ||
7206 | goto out; | 7204 | goto out; |
7207 | } | 7205 | } |
7208 | 7206 | ||
diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kconfig index 3bc992cd70b7..f6a71092e135 100644 --- a/drivers/net/ethernet/ti/Kconfig +++ b/drivers/net/ethernet/ti/Kconfig | |||
@@ -50,7 +50,7 @@ config TI_DAVINCI_CPDMA | |||
50 | will be called davinci_cpdma. This is recommended. | 50 | will be called davinci_cpdma. This is recommended. |
51 | 51 | ||
52 | config TI_CPSW_PHY_SEL | 52 | config TI_CPSW_PHY_SEL |
53 | boolean "TI CPSW Switch Phy sel Support" | 53 | bool "TI CPSW Switch Phy sel Support" |
54 | depends on TI_CPSW | 54 | depends on TI_CPSW |
55 | ---help--- | 55 | ---help--- |
56 | This driver supports configuring of the phy mode connected to | 56 | This driver supports configuring of the phy mode connected to |
@@ -77,7 +77,7 @@ config TI_CPSW | |||
77 | will be called cpsw. | 77 | will be called cpsw. |
78 | 78 | ||
79 | config TI_CPTS | 79 | config TI_CPTS |
80 | boolean "TI Common Platform Time Sync (CPTS) Support" | 80 | bool "TI Common Platform Time Sync (CPTS) Support" |
81 | depends on TI_CPSW | 81 | depends on TI_CPSW |
82 | select PTP_1588_CLOCK | 82 | select PTP_1588_CLOCK |
83 | ---help--- | 83 | ---help--- |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 7d8dd0d2182e..a1bbaf6352ba 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -1103,7 +1103,7 @@ static inline void cpsw_add_dual_emac_def_ale_entries( | |||
1103 | cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, | 1103 | cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast, |
1104 | port_mask, ALE_VLAN, slave->port_vlan, 0); | 1104 | port_mask, ALE_VLAN, slave->port_vlan, 0); |
1105 | cpsw_ale_add_ucast(priv->ale, priv->mac_addr, | 1105 | cpsw_ale_add_ucast(priv->ale, priv->mac_addr, |
1106 | priv->host_port, ALE_VLAN, slave->port_vlan); | 1106 | priv->host_port, ALE_VLAN | ALE_SECURE, slave->port_vlan); |
1107 | } | 1107 | } |
1108 | 1108 | ||
1109 | static void soft_reset_slave(struct cpsw_slave *slave) | 1109 | static void soft_reset_slave(struct cpsw_slave *slave) |
@@ -2466,6 +2466,7 @@ static int cpsw_remove(struct platform_device *pdev) | |||
2466 | return 0; | 2466 | return 0; |
2467 | } | 2467 | } |
2468 | 2468 | ||
2469 | #ifdef CONFIG_PM_SLEEP | ||
2469 | static int cpsw_suspend(struct device *dev) | 2470 | static int cpsw_suspend(struct device *dev) |
2470 | { | 2471 | { |
2471 | struct platform_device *pdev = to_platform_device(dev); | 2472 | struct platform_device *pdev = to_platform_device(dev); |
@@ -2518,11 +2519,9 @@ static int cpsw_resume(struct device *dev) | |||
2518 | } | 2519 | } |
2519 | return 0; | 2520 | return 0; |
2520 | } | 2521 | } |
2522 | #endif | ||
2521 | 2523 | ||
2522 | static const struct dev_pm_ops cpsw_pm_ops = { | 2524 | static SIMPLE_DEV_PM_OPS(cpsw_pm_ops, cpsw_suspend, cpsw_resume); |
2523 | .suspend = cpsw_suspend, | ||
2524 | .resume = cpsw_resume, | ||
2525 | }; | ||
2526 | 2525 | ||
2527 | static const struct of_device_id cpsw_of_mtable[] = { | 2526 | static const struct of_device_id cpsw_of_mtable[] = { |
2528 | { .compatible = "ti,cpsw", }, | 2527 | { .compatible = "ti,cpsw", }, |
diff --git a/drivers/net/ethernet/ti/davinci_mdio.c b/drivers/net/ethernet/ti/davinci_mdio.c index 98655b44b97e..c00084d689f3 100644 --- a/drivers/net/ethernet/ti/davinci_mdio.c +++ b/drivers/net/ethernet/ti/davinci_mdio.c | |||
@@ -423,6 +423,7 @@ static int davinci_mdio_remove(struct platform_device *pdev) | |||
423 | return 0; | 423 | return 0; |
424 | } | 424 | } |
425 | 425 | ||
426 | #ifdef CONFIG_PM_SLEEP | ||
426 | static int davinci_mdio_suspend(struct device *dev) | 427 | static int davinci_mdio_suspend(struct device *dev) |
427 | { | 428 | { |
428 | struct davinci_mdio_data *data = dev_get_drvdata(dev); | 429 | struct davinci_mdio_data *data = dev_get_drvdata(dev); |
@@ -464,10 +465,10 @@ static int davinci_mdio_resume(struct device *dev) | |||
464 | 465 | ||
465 | return 0; | 466 | return 0; |
466 | } | 467 | } |
468 | #endif | ||
467 | 469 | ||
468 | static const struct dev_pm_ops davinci_mdio_pm_ops = { | 470 | static const struct dev_pm_ops davinci_mdio_pm_ops = { |
469 | .suspend_late = davinci_mdio_suspend, | 471 | SET_LATE_SYSTEM_SLEEP_PM_OPS(davinci_mdio_suspend, davinci_mdio_resume) |
470 | .resume_early = davinci_mdio_resume, | ||
471 | }; | 472 | }; |
472 | 473 | ||
473 | #if IS_ENABLED(CONFIG_OF) | 474 | #if IS_ENABLED(CONFIG_OF) |
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 44ff8d7c64a5..5138407941cf 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c | |||
@@ -938,7 +938,7 @@ static void eth_set_mcast_list(struct net_device *dev) | |||
938 | int i; | 938 | int i; |
939 | static const u8 allmulti[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; | 939 | static const u8 allmulti[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
940 | 940 | ||
941 | if (dev->flags & IFF_ALLMULTI) { | 941 | if ((dev->flags & IFF_ALLMULTI) && !(dev->flags & IFF_PROMISC)) { |
942 | for (i = 0; i < ETH_ALEN; i++) { | 942 | for (i = 0; i < ETH_ALEN; i++) { |
943 | __raw_writel(allmulti[i], &port->regs->mcast_addr[i]); | 943 | __raw_writel(allmulti[i], &port->regs->mcast_addr[i]); |
944 | __raw_writel(allmulti[i], &port->regs->mcast_mask[i]); | 944 | __raw_writel(allmulti[i], &port->regs->mcast_mask[i]); |
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 1e51c6bf3ae1..8362aef0c15e 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -654,11 +654,14 @@ static void macvtap_skb_to_vnet_hdr(struct macvtap_queue *q, | |||
654 | } /* else everything is zero */ | 654 | } /* else everything is zero */ |
655 | } | 655 | } |
656 | 656 | ||
657 | /* Neighbour code has some assumptions on HH_DATA_MOD alignment */ | ||
658 | #define MACVTAP_RESERVE HH_DATA_OFF(ETH_HLEN) | ||
659 | |||
657 | /* Get packet from user space buffer */ | 660 | /* Get packet from user space buffer */ |
658 | static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | 661 | static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, |
659 | struct iov_iter *from, int noblock) | 662 | struct iov_iter *from, int noblock) |
660 | { | 663 | { |
661 | int good_linear = SKB_MAX_HEAD(NET_IP_ALIGN); | 664 | int good_linear = SKB_MAX_HEAD(MACVTAP_RESERVE); |
662 | struct sk_buff *skb; | 665 | struct sk_buff *skb; |
663 | struct macvlan_dev *vlan; | 666 | struct macvlan_dev *vlan; |
664 | unsigned long total_len = iov_iter_count(from); | 667 | unsigned long total_len = iov_iter_count(from); |
@@ -722,7 +725,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | |||
722 | linear = macvtap16_to_cpu(q, vnet_hdr.hdr_len); | 725 | linear = macvtap16_to_cpu(q, vnet_hdr.hdr_len); |
723 | } | 726 | } |
724 | 727 | ||
725 | skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, copylen, | 728 | skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen, |
726 | linear, noblock, &err); | 729 | linear, noblock, &err); |
727 | if (!skb) | 730 | if (!skb) |
728 | goto err; | 731 | goto err; |
diff --git a/drivers/net/phy/amd-xgbe-phy.c b/drivers/net/phy/amd-xgbe-phy.c index 9e3af54c9010..32efbd48f326 100644 --- a/drivers/net/phy/amd-xgbe-phy.c +++ b/drivers/net/phy/amd-xgbe-phy.c | |||
@@ -92,6 +92,8 @@ MODULE_DESCRIPTION("AMD 10GbE (amd-xgbe) PHY driver"); | |||
92 | #define XGBE_PHY_CDR_RATE_PROPERTY "amd,serdes-cdr-rate" | 92 | #define XGBE_PHY_CDR_RATE_PROPERTY "amd,serdes-cdr-rate" |
93 | #define XGBE_PHY_PQ_SKEW_PROPERTY "amd,serdes-pq-skew" | 93 | #define XGBE_PHY_PQ_SKEW_PROPERTY "amd,serdes-pq-skew" |
94 | #define XGBE_PHY_TX_AMP_PROPERTY "amd,serdes-tx-amp" | 94 | #define XGBE_PHY_TX_AMP_PROPERTY "amd,serdes-tx-amp" |
95 | #define XGBE_PHY_DFE_CFG_PROPERTY "amd,serdes-dfe-tap-config" | ||
96 | #define XGBE_PHY_DFE_ENA_PROPERTY "amd,serdes-dfe-tap-enable" | ||
95 | 97 | ||
96 | #define XGBE_PHY_SPEEDS 3 | 98 | #define XGBE_PHY_SPEEDS 3 |
97 | #define XGBE_PHY_SPEED_1000 0 | 99 | #define XGBE_PHY_SPEED_1000 0 |
@@ -177,10 +179,12 @@ MODULE_DESCRIPTION("AMD 10GbE (amd-xgbe) PHY driver"); | |||
177 | #define SPEED_10000_BLWC 0 | 179 | #define SPEED_10000_BLWC 0 |
178 | #define SPEED_10000_CDR 0x7 | 180 | #define SPEED_10000_CDR 0x7 |
179 | #define SPEED_10000_PLL 0x1 | 181 | #define SPEED_10000_PLL 0x1 |
180 | #define SPEED_10000_PQ 0x1e | 182 | #define SPEED_10000_PQ 0x12 |
181 | #define SPEED_10000_RATE 0x0 | 183 | #define SPEED_10000_RATE 0x0 |
182 | #define SPEED_10000_TXAMP 0xa | 184 | #define SPEED_10000_TXAMP 0xa |
183 | #define SPEED_10000_WORD 0x7 | 185 | #define SPEED_10000_WORD 0x7 |
186 | #define SPEED_10000_DFE_TAP_CONFIG 0x1 | ||
187 | #define SPEED_10000_DFE_TAP_ENABLE 0x7f | ||
184 | 188 | ||
185 | #define SPEED_2500_BLWC 1 | 189 | #define SPEED_2500_BLWC 1 |
186 | #define SPEED_2500_CDR 0x2 | 190 | #define SPEED_2500_CDR 0x2 |
@@ -189,6 +193,8 @@ MODULE_DESCRIPTION("AMD 10GbE (amd-xgbe) PHY driver"); | |||
189 | #define SPEED_2500_RATE 0x1 | 193 | #define SPEED_2500_RATE 0x1 |
190 | #define SPEED_2500_TXAMP 0xf | 194 | #define SPEED_2500_TXAMP 0xf |
191 | #define SPEED_2500_WORD 0x1 | 195 | #define SPEED_2500_WORD 0x1 |
196 | #define SPEED_2500_DFE_TAP_CONFIG 0x3 | ||
197 | #define SPEED_2500_DFE_TAP_ENABLE 0x0 | ||
192 | 198 | ||
193 | #define SPEED_1000_BLWC 1 | 199 | #define SPEED_1000_BLWC 1 |
194 | #define SPEED_1000_CDR 0x2 | 200 | #define SPEED_1000_CDR 0x2 |
@@ -197,16 +203,25 @@ MODULE_DESCRIPTION("AMD 10GbE (amd-xgbe) PHY driver"); | |||
197 | #define SPEED_1000_RATE 0x3 | 203 | #define SPEED_1000_RATE 0x3 |
198 | #define SPEED_1000_TXAMP 0xf | 204 | #define SPEED_1000_TXAMP 0xf |
199 | #define SPEED_1000_WORD 0x1 | 205 | #define SPEED_1000_WORD 0x1 |
206 | #define SPEED_1000_DFE_TAP_CONFIG 0x3 | ||
207 | #define SPEED_1000_DFE_TAP_ENABLE 0x0 | ||
200 | 208 | ||
201 | /* SerDes RxTx register offsets */ | 209 | /* SerDes RxTx register offsets */ |
210 | #define RXTX_REG6 0x0018 | ||
202 | #define RXTX_REG20 0x0050 | 211 | #define RXTX_REG20 0x0050 |
212 | #define RXTX_REG22 0x0058 | ||
203 | #define RXTX_REG114 0x01c8 | 213 | #define RXTX_REG114 0x01c8 |
214 | #define RXTX_REG129 0x0204 | ||
204 | 215 | ||
205 | /* SerDes RxTx register entry bit positions and sizes */ | 216 | /* SerDes RxTx register entry bit positions and sizes */ |
217 | #define RXTX_REG6_RESETB_RXD_INDEX 8 | ||
218 | #define RXTX_REG6_RESETB_RXD_WIDTH 1 | ||
206 | #define RXTX_REG20_BLWC_ENA_INDEX 2 | 219 | #define RXTX_REG20_BLWC_ENA_INDEX 2 |
207 | #define RXTX_REG20_BLWC_ENA_WIDTH 1 | 220 | #define RXTX_REG20_BLWC_ENA_WIDTH 1 |
208 | #define RXTX_REG114_PQ_REG_INDEX 9 | 221 | #define RXTX_REG114_PQ_REG_INDEX 9 |
209 | #define RXTX_REG114_PQ_REG_WIDTH 7 | 222 | #define RXTX_REG114_PQ_REG_WIDTH 7 |
223 | #define RXTX_REG129_RXDFE_CONFIG_INDEX 14 | ||
224 | #define RXTX_REG129_RXDFE_CONFIG_WIDTH 2 | ||
210 | 225 | ||
211 | /* Bit setting and getting macros | 226 | /* Bit setting and getting macros |
212 | * The get macro will extract the current bit field value from within | 227 | * The get macro will extract the current bit field value from within |
@@ -333,6 +348,18 @@ static const u32 amd_xgbe_phy_serdes_tx_amp[] = { | |||
333 | SPEED_10000_TXAMP, | 348 | SPEED_10000_TXAMP, |
334 | }; | 349 | }; |
335 | 350 | ||
351 | static const u32 amd_xgbe_phy_serdes_dfe_tap_cfg[] = { | ||
352 | SPEED_1000_DFE_TAP_CONFIG, | ||
353 | SPEED_2500_DFE_TAP_CONFIG, | ||
354 | SPEED_10000_DFE_TAP_CONFIG, | ||
355 | }; | ||
356 | |||
357 | static const u32 amd_xgbe_phy_serdes_dfe_tap_ena[] = { | ||
358 | SPEED_1000_DFE_TAP_ENABLE, | ||
359 | SPEED_2500_DFE_TAP_ENABLE, | ||
360 | SPEED_10000_DFE_TAP_ENABLE, | ||
361 | }; | ||
362 | |||
336 | enum amd_xgbe_phy_an { | 363 | enum amd_xgbe_phy_an { |
337 | AMD_XGBE_AN_READY = 0, | 364 | AMD_XGBE_AN_READY = 0, |
338 | AMD_XGBE_AN_PAGE_RECEIVED, | 365 | AMD_XGBE_AN_PAGE_RECEIVED, |
@@ -393,6 +420,8 @@ struct amd_xgbe_phy_priv { | |||
393 | u32 serdes_cdr_rate[XGBE_PHY_SPEEDS]; | 420 | u32 serdes_cdr_rate[XGBE_PHY_SPEEDS]; |
394 | u32 serdes_pq_skew[XGBE_PHY_SPEEDS]; | 421 | u32 serdes_pq_skew[XGBE_PHY_SPEEDS]; |
395 | u32 serdes_tx_amp[XGBE_PHY_SPEEDS]; | 422 | u32 serdes_tx_amp[XGBE_PHY_SPEEDS]; |
423 | u32 serdes_dfe_tap_cfg[XGBE_PHY_SPEEDS]; | ||
424 | u32 serdes_dfe_tap_ena[XGBE_PHY_SPEEDS]; | ||
396 | 425 | ||
397 | /* Auto-negotiation state machine support */ | 426 | /* Auto-negotiation state machine support */ |
398 | struct mutex an_mutex; | 427 | struct mutex an_mutex; |
@@ -481,11 +510,16 @@ static void amd_xgbe_phy_serdes_complete_ratechange(struct phy_device *phydev) | |||
481 | status = XSIR0_IOREAD(priv, SIR0_STATUS); | 510 | status = XSIR0_IOREAD(priv, SIR0_STATUS); |
482 | if (XSIR_GET_BITS(status, SIR0_STATUS, RX_READY) && | 511 | if (XSIR_GET_BITS(status, SIR0_STATUS, RX_READY) && |
483 | XSIR_GET_BITS(status, SIR0_STATUS, TX_READY)) | 512 | XSIR_GET_BITS(status, SIR0_STATUS, TX_READY)) |
484 | return; | 513 | goto rx_reset; |
485 | } | 514 | } |
486 | 515 | ||
487 | netdev_dbg(phydev->attached_dev, "SerDes rx/tx not ready (%#hx)\n", | 516 | netdev_dbg(phydev->attached_dev, "SerDes rx/tx not ready (%#hx)\n", |
488 | status); | 517 | status); |
518 | |||
519 | rx_reset: | ||
520 | /* Perform Rx reset for the DFE changes */ | ||
521 | XRXTX_IOWRITE_BITS(priv, RXTX_REG6, RESETB_RXD, 0); | ||
522 | XRXTX_IOWRITE_BITS(priv, RXTX_REG6, RESETB_RXD, 1); | ||
489 | } | 523 | } |
490 | 524 | ||
491 | static int amd_xgbe_phy_xgmii_mode(struct phy_device *phydev) | 525 | static int amd_xgbe_phy_xgmii_mode(struct phy_device *phydev) |
@@ -534,6 +568,10 @@ static int amd_xgbe_phy_xgmii_mode(struct phy_device *phydev) | |||
534 | priv->serdes_blwc[XGBE_PHY_SPEED_10000]); | 568 | priv->serdes_blwc[XGBE_PHY_SPEED_10000]); |
535 | XRXTX_IOWRITE_BITS(priv, RXTX_REG114, PQ_REG, | 569 | XRXTX_IOWRITE_BITS(priv, RXTX_REG114, PQ_REG, |
536 | priv->serdes_pq_skew[XGBE_PHY_SPEED_10000]); | 570 | priv->serdes_pq_skew[XGBE_PHY_SPEED_10000]); |
571 | XRXTX_IOWRITE_BITS(priv, RXTX_REG129, RXDFE_CONFIG, | ||
572 | priv->serdes_dfe_tap_cfg[XGBE_PHY_SPEED_10000]); | ||
573 | XRXTX_IOWRITE(priv, RXTX_REG22, | ||
574 | priv->serdes_dfe_tap_ena[XGBE_PHY_SPEED_10000]); | ||
537 | 575 | ||
538 | amd_xgbe_phy_serdes_complete_ratechange(phydev); | 576 | amd_xgbe_phy_serdes_complete_ratechange(phydev); |
539 | 577 | ||
@@ -586,6 +624,10 @@ static int amd_xgbe_phy_gmii_2500_mode(struct phy_device *phydev) | |||
586 | priv->serdes_blwc[XGBE_PHY_SPEED_2500]); | 624 | priv->serdes_blwc[XGBE_PHY_SPEED_2500]); |
587 | XRXTX_IOWRITE_BITS(priv, RXTX_REG114, PQ_REG, | 625 | XRXTX_IOWRITE_BITS(priv, RXTX_REG114, PQ_REG, |
588 | priv->serdes_pq_skew[XGBE_PHY_SPEED_2500]); | 626 | priv->serdes_pq_skew[XGBE_PHY_SPEED_2500]); |
627 | XRXTX_IOWRITE_BITS(priv, RXTX_REG129, RXDFE_CONFIG, | ||
628 | priv->serdes_dfe_tap_cfg[XGBE_PHY_SPEED_2500]); | ||
629 | XRXTX_IOWRITE(priv, RXTX_REG22, | ||
630 | priv->serdes_dfe_tap_ena[XGBE_PHY_SPEED_2500]); | ||
589 | 631 | ||
590 | amd_xgbe_phy_serdes_complete_ratechange(phydev); | 632 | amd_xgbe_phy_serdes_complete_ratechange(phydev); |
591 | 633 | ||
@@ -638,6 +680,10 @@ static int amd_xgbe_phy_gmii_mode(struct phy_device *phydev) | |||
638 | priv->serdes_blwc[XGBE_PHY_SPEED_1000]); | 680 | priv->serdes_blwc[XGBE_PHY_SPEED_1000]); |
639 | XRXTX_IOWRITE_BITS(priv, RXTX_REG114, PQ_REG, | 681 | XRXTX_IOWRITE_BITS(priv, RXTX_REG114, PQ_REG, |
640 | priv->serdes_pq_skew[XGBE_PHY_SPEED_1000]); | 682 | priv->serdes_pq_skew[XGBE_PHY_SPEED_1000]); |
683 | XRXTX_IOWRITE_BITS(priv, RXTX_REG129, RXDFE_CONFIG, | ||
684 | priv->serdes_dfe_tap_cfg[XGBE_PHY_SPEED_1000]); | ||
685 | XRXTX_IOWRITE(priv, RXTX_REG22, | ||
686 | priv->serdes_dfe_tap_ena[XGBE_PHY_SPEED_1000]); | ||
641 | 687 | ||
642 | amd_xgbe_phy_serdes_complete_ratechange(phydev); | 688 | amd_xgbe_phy_serdes_complete_ratechange(phydev); |
643 | 689 | ||
@@ -1668,6 +1714,38 @@ static int amd_xgbe_phy_probe(struct phy_device *phydev) | |||
1668 | sizeof(priv->serdes_tx_amp)); | 1714 | sizeof(priv->serdes_tx_amp)); |
1669 | } | 1715 | } |
1670 | 1716 | ||
1717 | if (device_property_present(phy_dev, XGBE_PHY_DFE_CFG_PROPERTY)) { | ||
1718 | ret = device_property_read_u32_array(phy_dev, | ||
1719 | XGBE_PHY_DFE_CFG_PROPERTY, | ||
1720 | priv->serdes_dfe_tap_cfg, | ||
1721 | XGBE_PHY_SPEEDS); | ||
1722 | if (ret) { | ||
1723 | dev_err(dev, "invalid %s property\n", | ||
1724 | XGBE_PHY_DFE_CFG_PROPERTY); | ||
1725 | goto err_sir1; | ||
1726 | } | ||
1727 | } else { | ||
1728 | memcpy(priv->serdes_dfe_tap_cfg, | ||
1729 | amd_xgbe_phy_serdes_dfe_tap_cfg, | ||
1730 | sizeof(priv->serdes_dfe_tap_cfg)); | ||
1731 | } | ||
1732 | |||
1733 | if (device_property_present(phy_dev, XGBE_PHY_DFE_ENA_PROPERTY)) { | ||
1734 | ret = device_property_read_u32_array(phy_dev, | ||
1735 | XGBE_PHY_DFE_ENA_PROPERTY, | ||
1736 | priv->serdes_dfe_tap_ena, | ||
1737 | XGBE_PHY_SPEEDS); | ||
1738 | if (ret) { | ||
1739 | dev_err(dev, "invalid %s property\n", | ||
1740 | XGBE_PHY_DFE_ENA_PROPERTY); | ||
1741 | goto err_sir1; | ||
1742 | } | ||
1743 | } else { | ||
1744 | memcpy(priv->serdes_dfe_tap_ena, | ||
1745 | amd_xgbe_phy_serdes_dfe_tap_ena, | ||
1746 | sizeof(priv->serdes_dfe_tap_ena)); | ||
1747 | } | ||
1748 | |||
1671 | phydev->priv = priv; | 1749 | phydev->priv = priv; |
1672 | 1750 | ||
1673 | if (!priv->adev || acpi_disabled) | 1751 | if (!priv->adev || acpi_disabled) |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index cdcac6aa4260..52cd8db2c57d 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -236,6 +236,25 @@ static inline unsigned int phy_find_valid(unsigned int idx, u32 features) | |||
236 | } | 236 | } |
237 | 237 | ||
238 | /** | 238 | /** |
239 | * phy_check_valid - check if there is a valid PHY setting which matches | ||
240 | * speed, duplex, and feature mask | ||
241 | * @speed: speed to match | ||
242 | * @duplex: duplex to match | ||
243 | * @features: A mask of the valid settings | ||
244 | * | ||
245 | * Description: Returns true if there is a valid setting, false otherwise. | ||
246 | */ | ||
247 | static inline bool phy_check_valid(int speed, int duplex, u32 features) | ||
248 | { | ||
249 | unsigned int idx; | ||
250 | |||
251 | idx = phy_find_valid(phy_find_setting(speed, duplex), features); | ||
252 | |||
253 | return settings[idx].speed == speed && settings[idx].duplex == duplex && | ||
254 | (settings[idx].setting & features); | ||
255 | } | ||
256 | |||
257 | /** | ||
239 | * phy_sanitize_settings - make sure the PHY is set to supported speed and duplex | 258 | * phy_sanitize_settings - make sure the PHY is set to supported speed and duplex |
240 | * @phydev: the target phy_device struct | 259 | * @phydev: the target phy_device struct |
241 | * | 260 | * |
@@ -1045,7 +1064,6 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) | |||
1045 | int eee_lp, eee_cap, eee_adv; | 1064 | int eee_lp, eee_cap, eee_adv; |
1046 | u32 lp, cap, adv; | 1065 | u32 lp, cap, adv; |
1047 | int status; | 1066 | int status; |
1048 | unsigned int idx; | ||
1049 | 1067 | ||
1050 | /* Read phy status to properly get the right settings */ | 1068 | /* Read phy status to properly get the right settings */ |
1051 | status = phy_read_status(phydev); | 1069 | status = phy_read_status(phydev); |
@@ -1077,8 +1095,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) | |||
1077 | 1095 | ||
1078 | adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv); | 1096 | adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv); |
1079 | lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp); | 1097 | lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp); |
1080 | idx = phy_find_setting(phydev->speed, phydev->duplex); | 1098 | if (!phy_check_valid(phydev->speed, phydev->duplex, lp & adv)) |
1081 | if (!(lp & adv & settings[idx].setting)) | ||
1082 | goto eee_exit_err; | 1099 | goto eee_exit_err; |
1083 | 1100 | ||
1084 | if (clk_stop_enable) { | 1101 | if (clk_stop_enable) { |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index a7d163bf5bbb..9d3366f7c9ad 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -43,9 +43,7 @@ | |||
43 | 43 | ||
44 | static struct team_port *team_port_get_rcu(const struct net_device *dev) | 44 | static struct team_port *team_port_get_rcu(const struct net_device *dev) |
45 | { | 45 | { |
46 | struct team_port *port = rcu_dereference(dev->rx_handler_data); | 46 | return rcu_dereference(dev->rx_handler_data); |
47 | |||
48 | return team_port_exists(dev) ? port : NULL; | ||
49 | } | 47 | } |
50 | 48 | ||
51 | static struct team_port *team_port_get_rtnl(const struct net_device *dev) | 49 | static struct team_port *team_port_get_rtnl(const struct net_device *dev) |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 37eed4d84e9c..7ba8d0885f12 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -161,6 +161,7 @@ config USB_NET_AX8817X | |||
161 | * Linksys USB200M | 161 | * Linksys USB200M |
162 | * Netgear FA120 | 162 | * Netgear FA120 |
163 | * Sitecom LN-029 | 163 | * Sitecom LN-029 |
164 | * Sitecom LN-028 | ||
164 | * Intellinet USB 2.0 Ethernet | 165 | * Intellinet USB 2.0 Ethernet |
165 | * ST Lab USB 2.0 Ethernet | 166 | * ST Lab USB 2.0 Ethernet |
166 | * TrendNet TU2-ET100 | 167 | * TrendNet TU2-ET100 |
@@ -397,14 +398,14 @@ config USB_NET_CDC_SUBSET | |||
397 | not generally have permanently assigned Ethernet addresses. | 398 | not generally have permanently assigned Ethernet addresses. |
398 | 399 | ||
399 | config USB_ALI_M5632 | 400 | config USB_ALI_M5632 |
400 | boolean "ALi M5632 based 'USB 2.0 Data Link' cables" | 401 | bool "ALi M5632 based 'USB 2.0 Data Link' cables" |
401 | depends on USB_NET_CDC_SUBSET | 402 | depends on USB_NET_CDC_SUBSET |
402 | help | 403 | help |
403 | Choose this option if you're using a host-to-host cable | 404 | Choose this option if you're using a host-to-host cable |
404 | based on this design, which supports USB 2.0 high speed. | 405 | based on this design, which supports USB 2.0 high speed. |
405 | 406 | ||
406 | config USB_AN2720 | 407 | config USB_AN2720 |
407 | boolean "AnchorChips 2720 based cables (Xircom PGUNET, ...)" | 408 | bool "AnchorChips 2720 based cables (Xircom PGUNET, ...)" |
408 | depends on USB_NET_CDC_SUBSET | 409 | depends on USB_NET_CDC_SUBSET |
409 | help | 410 | help |
410 | Choose this option if you're using a host-to-host cable | 411 | Choose this option if you're using a host-to-host cable |
@@ -412,7 +413,7 @@ config USB_AN2720 | |||
412 | Cypress brand. | 413 | Cypress brand. |
413 | 414 | ||
414 | config USB_BELKIN | 415 | config USB_BELKIN |
415 | boolean "eTEK based host-to-host cables (Advance, Belkin, ...)" | 416 | bool "eTEK based host-to-host cables (Advance, Belkin, ...)" |
416 | depends on USB_NET_CDC_SUBSET | 417 | depends on USB_NET_CDC_SUBSET |
417 | default y | 418 | default y |
418 | help | 419 | help |
@@ -421,7 +422,7 @@ config USB_BELKIN | |||
421 | microcontroller, with LEDs that indicate traffic. | 422 | microcontroller, with LEDs that indicate traffic. |
422 | 423 | ||
423 | config USB_ARMLINUX | 424 | config USB_ARMLINUX |
424 | boolean "Embedded ARM Linux links (iPaq, ...)" | 425 | bool "Embedded ARM Linux links (iPaq, ...)" |
425 | depends on USB_NET_CDC_SUBSET | 426 | depends on USB_NET_CDC_SUBSET |
426 | default y | 427 | default y |
427 | help | 428 | help |
@@ -438,14 +439,14 @@ config USB_ARMLINUX | |||
438 | this simpler protocol by installing a different kernel. | 439 | this simpler protocol by installing a different kernel. |
439 | 440 | ||
440 | config USB_EPSON2888 | 441 | config USB_EPSON2888 |
441 | boolean "Epson 2888 based firmware (DEVELOPMENT)" | 442 | bool "Epson 2888 based firmware (DEVELOPMENT)" |
442 | depends on USB_NET_CDC_SUBSET | 443 | depends on USB_NET_CDC_SUBSET |
443 | help | 444 | help |
444 | Choose this option to support the usb networking links used | 445 | Choose this option to support the usb networking links used |
445 | by some sample firmware from Epson. | 446 | by some sample firmware from Epson. |
446 | 447 | ||
447 | config USB_KC2190 | 448 | config USB_KC2190 |
448 | boolean "KT Technology KC2190 based cables (InstaNet)" | 449 | bool "KT Technology KC2190 based cables (InstaNet)" |
449 | depends on USB_NET_CDC_SUBSET | 450 | depends on USB_NET_CDC_SUBSET |
450 | help | 451 | help |
451 | Choose this option if you're using a host-to-host cable | 452 | Choose this option if you're using a host-to-host cable |
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index bf49792062a2..1173a24feda3 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c | |||
@@ -979,6 +979,10 @@ static const struct usb_device_id products [] = { | |||
979 | USB_DEVICE (0x0df6, 0x0056), | 979 | USB_DEVICE (0x0df6, 0x0056), |
980 | .driver_info = (unsigned long) &ax88178_info, | 980 | .driver_info = (unsigned long) &ax88178_info, |
981 | }, { | 981 | }, { |
982 | // Sitecom LN-028 "USB 2.0 10/100/1000 Ethernet adapter" | ||
983 | USB_DEVICE (0x0df6, 0x061c), | ||
984 | .driver_info = (unsigned long) &ax88178_info, | ||
985 | }, { | ||
982 | // corega FEther USB2-TX | 986 | // corega FEther USB2-TX |
983 | USB_DEVICE (0x07aa, 0x0017), | 987 | USB_DEVICE (0x07aa, 0x0017), |
984 | .driver_info = (unsigned long) &ax8817x_info, | 988 | .driver_info = (unsigned long) &ax8817x_info, |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 3c8dfe5e46ed..111d907e0c11 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -1597,7 +1597,7 @@ hso_wait_modem_status(struct hso_serial *serial, unsigned long arg) | |||
1597 | } | 1597 | } |
1598 | cprev = cnow; | 1598 | cprev = cnow; |
1599 | } | 1599 | } |
1600 | current->state = TASK_RUNNING; | 1600 | __set_current_state(TASK_RUNNING); |
1601 | remove_wait_queue(&tiocmget->waitq, &wait); | 1601 | remove_wait_queue(&tiocmget->waitq, &wait); |
1602 | 1602 | ||
1603 | return ret; | 1603 | return ret; |
diff --git a/drivers/net/usb/plusb.c b/drivers/net/usb/plusb.c index 3d18bb0eee85..1bfe0fcaccf5 100644 --- a/drivers/net/usb/plusb.c +++ b/drivers/net/usb/plusb.c | |||
@@ -134,6 +134,11 @@ static const struct usb_device_id products [] = { | |||
134 | }, { | 134 | }, { |
135 | USB_DEVICE(0x050d, 0x258a), /* Belkin F5U258/F5U279 (PL-25A1) */ | 135 | USB_DEVICE(0x050d, 0x258a), /* Belkin F5U258/F5U279 (PL-25A1) */ |
136 | .driver_info = (unsigned long) &prolific_info, | 136 | .driver_info = (unsigned long) &prolific_info, |
137 | }, { | ||
138 | USB_DEVICE(0x3923, 0x7825), /* National Instruments USB | ||
139 | * Host-to-Host Cable | ||
140 | */ | ||
141 | .driver_info = (unsigned long) &prolific_info, | ||
137 | }, | 142 | }, |
138 | 143 | ||
139 | { }, // END | 144 | { }, // END |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 110a2cf67244..f1ff3666f090 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -1710,6 +1710,12 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1710 | struct virtnet_info *vi; | 1710 | struct virtnet_info *vi; |
1711 | u16 max_queue_pairs; | 1711 | u16 max_queue_pairs; |
1712 | 1712 | ||
1713 | if (!vdev->config->get) { | ||
1714 | dev_err(&vdev->dev, "%s failure: config access disabled\n", | ||
1715 | __func__); | ||
1716 | return -EINVAL; | ||
1717 | } | ||
1718 | |||
1713 | if (!virtnet_validate_features(vdev)) | 1719 | if (!virtnet_validate_features(vdev)) |
1714 | return -EINVAL; | 1720 | return -EINVAL; |
1715 | 1721 | ||
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 83c39e2858bf..88d121d43c08 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c | |||
@@ -806,21 +806,21 @@ static ssize_t cosa_read(struct file *file, | |||
806 | spin_lock_irqsave(&cosa->lock, flags); | 806 | spin_lock_irqsave(&cosa->lock, flags); |
807 | add_wait_queue(&chan->rxwaitq, &wait); | 807 | add_wait_queue(&chan->rxwaitq, &wait); |
808 | while (!chan->rx_status) { | 808 | while (!chan->rx_status) { |
809 | current->state = TASK_INTERRUPTIBLE; | 809 | set_current_state(TASK_INTERRUPTIBLE); |
810 | spin_unlock_irqrestore(&cosa->lock, flags); | 810 | spin_unlock_irqrestore(&cosa->lock, flags); |
811 | schedule(); | 811 | schedule(); |
812 | spin_lock_irqsave(&cosa->lock, flags); | 812 | spin_lock_irqsave(&cosa->lock, flags); |
813 | if (signal_pending(current) && chan->rx_status == 0) { | 813 | if (signal_pending(current) && chan->rx_status == 0) { |
814 | chan->rx_status = 1; | 814 | chan->rx_status = 1; |
815 | remove_wait_queue(&chan->rxwaitq, &wait); | 815 | remove_wait_queue(&chan->rxwaitq, &wait); |
816 | current->state = TASK_RUNNING; | 816 | __set_current_state(TASK_RUNNING); |
817 | spin_unlock_irqrestore(&cosa->lock, flags); | 817 | spin_unlock_irqrestore(&cosa->lock, flags); |
818 | mutex_unlock(&chan->rlock); | 818 | mutex_unlock(&chan->rlock); |
819 | return -ERESTARTSYS; | 819 | return -ERESTARTSYS; |
820 | } | 820 | } |
821 | } | 821 | } |
822 | remove_wait_queue(&chan->rxwaitq, &wait); | 822 | remove_wait_queue(&chan->rxwaitq, &wait); |
823 | current->state = TASK_RUNNING; | 823 | __set_current_state(TASK_RUNNING); |
824 | kbuf = chan->rxdata; | 824 | kbuf = chan->rxdata; |
825 | count = chan->rxsize; | 825 | count = chan->rxsize; |
826 | spin_unlock_irqrestore(&cosa->lock, flags); | 826 | spin_unlock_irqrestore(&cosa->lock, flags); |
@@ -890,14 +890,14 @@ static ssize_t cosa_write(struct file *file, | |||
890 | spin_lock_irqsave(&cosa->lock, flags); | 890 | spin_lock_irqsave(&cosa->lock, flags); |
891 | add_wait_queue(&chan->txwaitq, &wait); | 891 | add_wait_queue(&chan->txwaitq, &wait); |
892 | while (!chan->tx_status) { | 892 | while (!chan->tx_status) { |
893 | current->state = TASK_INTERRUPTIBLE; | 893 | set_current_state(TASK_INTERRUPTIBLE); |
894 | spin_unlock_irqrestore(&cosa->lock, flags); | 894 | spin_unlock_irqrestore(&cosa->lock, flags); |
895 | schedule(); | 895 | schedule(); |
896 | spin_lock_irqsave(&cosa->lock, flags); | 896 | spin_lock_irqsave(&cosa->lock, flags); |
897 | if (signal_pending(current) && chan->tx_status == 0) { | 897 | if (signal_pending(current) && chan->tx_status == 0) { |
898 | chan->tx_status = 1; | 898 | chan->tx_status = 1; |
899 | remove_wait_queue(&chan->txwaitq, &wait); | 899 | remove_wait_queue(&chan->txwaitq, &wait); |
900 | current->state = TASK_RUNNING; | 900 | __set_current_state(TASK_RUNNING); |
901 | chan->tx_status = 1; | 901 | chan->tx_status = 1; |
902 | spin_unlock_irqrestore(&cosa->lock, flags); | 902 | spin_unlock_irqrestore(&cosa->lock, flags); |
903 | up(&chan->wsem); | 903 | up(&chan->wsem); |
@@ -905,7 +905,7 @@ static ssize_t cosa_write(struct file *file, | |||
905 | } | 905 | } |
906 | } | 906 | } |
907 | remove_wait_queue(&chan->txwaitq, &wait); | 907 | remove_wait_queue(&chan->txwaitq, &wait); |
908 | current->state = TASK_RUNNING; | 908 | __set_current_state(TASK_RUNNING); |
909 | up(&chan->wsem); | 909 | up(&chan->wsem); |
910 | spin_unlock_irqrestore(&cosa->lock, flags); | 910 | spin_unlock_irqrestore(&cosa->lock, flags); |
911 | kfree(kbuf); | 911 | kfree(kbuf); |
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index c1947c5915eb..d56b7859a437 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
@@ -946,7 +946,8 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw, | |||
946 | goto nla_put_failure; | 946 | goto nla_put_failure; |
947 | 947 | ||
948 | genlmsg_end(skb, msg_head); | 948 | genlmsg_end(skb, msg_head); |
949 | genlmsg_unicast(&init_net, skb, dst_portid); | 949 | if (genlmsg_unicast(&init_net, skb, dst_portid)) |
950 | goto err_free_txskb; | ||
950 | 951 | ||
951 | /* Enqueue the packet */ | 952 | /* Enqueue the packet */ |
952 | skb_queue_tail(&data->pending, my_skb); | 953 | skb_queue_tail(&data->pending, my_skb); |
@@ -955,6 +956,8 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw, | |||
955 | return; | 956 | return; |
956 | 957 | ||
957 | nla_put_failure: | 958 | nla_put_failure: |
959 | nlmsg_free(skb); | ||
960 | err_free_txskb: | ||
958 | printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__); | 961 | printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__); |
959 | ieee80211_free_txskb(hw, my_skb); | 962 | ieee80211_free_txskb(hw, my_skb); |
960 | data->tx_failed++; | 963 | data->tx_failed++; |
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig index 006b8bcb2e31..2b4ef256c6b9 100644 --- a/drivers/net/wireless/rt2x00/Kconfig +++ b/drivers/net/wireless/rt2x00/Kconfig | |||
@@ -243,14 +243,14 @@ config RT2X00_LIB | |||
243 | select AVERAGE | 243 | select AVERAGE |
244 | 244 | ||
245 | config RT2X00_LIB_FIRMWARE | 245 | config RT2X00_LIB_FIRMWARE |
246 | boolean | 246 | bool |
247 | select FW_LOADER | 247 | select FW_LOADER |
248 | 248 | ||
249 | config RT2X00_LIB_CRYPTO | 249 | config RT2X00_LIB_CRYPTO |
250 | boolean | 250 | bool |
251 | 251 | ||
252 | config RT2X00_LIB_LEDS | 252 | config RT2X00_LIB_LEDS |
253 | boolean | 253 | bool |
254 | default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n) | 254 | default y if (RT2X00_LIB=y && LEDS_CLASS=y) || (RT2X00_LIB=m && LEDS_CLASS!=n) |
255 | 255 | ||
256 | config RT2X00_LIB_DEBUGFS | 256 | config RT2X00_LIB_DEBUGFS |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index f7a31d2cb3f1..c4d68d768408 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -655,9 +655,15 @@ static void xenvif_tx_err(struct xenvif_queue *queue, | |||
655 | unsigned long flags; | 655 | unsigned long flags; |
656 | 656 | ||
657 | do { | 657 | do { |
658 | int notify; | ||
659 | |||
658 | spin_lock_irqsave(&queue->response_lock, flags); | 660 | spin_lock_irqsave(&queue->response_lock, flags); |
659 | make_tx_response(queue, txp, XEN_NETIF_RSP_ERROR); | 661 | make_tx_response(queue, txp, XEN_NETIF_RSP_ERROR); |
662 | RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&queue->tx, notify); | ||
660 | spin_unlock_irqrestore(&queue->response_lock, flags); | 663 | spin_unlock_irqrestore(&queue->response_lock, flags); |
664 | if (notify) | ||
665 | notify_remote_via_irq(queue->tx_irq); | ||
666 | |||
661 | if (cons == end) | 667 | if (cons == end) |
662 | break; | 668 | break; |
663 | txp = RING_GET_REQUEST(&queue->tx, cons++); | 669 | txp = RING_GET_REQUEST(&queue->tx, cons++); |
@@ -1649,17 +1655,28 @@ static void xenvif_idx_release(struct xenvif_queue *queue, u16 pending_idx, | |||
1649 | { | 1655 | { |
1650 | struct pending_tx_info *pending_tx_info; | 1656 | struct pending_tx_info *pending_tx_info; |
1651 | pending_ring_idx_t index; | 1657 | pending_ring_idx_t index; |
1658 | int notify; | ||
1652 | unsigned long flags; | 1659 | unsigned long flags; |
1653 | 1660 | ||
1654 | pending_tx_info = &queue->pending_tx_info[pending_idx]; | 1661 | pending_tx_info = &queue->pending_tx_info[pending_idx]; |
1662 | |||
1655 | spin_lock_irqsave(&queue->response_lock, flags); | 1663 | spin_lock_irqsave(&queue->response_lock, flags); |
1664 | |||
1656 | make_tx_response(queue, &pending_tx_info->req, status); | 1665 | make_tx_response(queue, &pending_tx_info->req, status); |
1657 | index = pending_index(queue->pending_prod); | 1666 | |
1667 | /* Release the pending index before pusing the Tx response so | ||
1668 | * its available before a new Tx request is pushed by the | ||
1669 | * frontend. | ||
1670 | */ | ||
1671 | index = pending_index(queue->pending_prod++); | ||
1658 | queue->pending_ring[index] = pending_idx; | 1672 | queue->pending_ring[index] = pending_idx; |
1659 | /* TX shouldn't use the index before we give it back here */ | 1673 | |
1660 | mb(); | 1674 | RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&queue->tx, notify); |
1661 | queue->pending_prod++; | 1675 | |
1662 | spin_unlock_irqrestore(&queue->response_lock, flags); | 1676 | spin_unlock_irqrestore(&queue->response_lock, flags); |
1677 | |||
1678 | if (notify) | ||
1679 | notify_remote_via_irq(queue->tx_irq); | ||
1663 | } | 1680 | } |
1664 | 1681 | ||
1665 | 1682 | ||
@@ -1669,7 +1686,6 @@ static void make_tx_response(struct xenvif_queue *queue, | |||
1669 | { | 1686 | { |
1670 | RING_IDX i = queue->tx.rsp_prod_pvt; | 1687 | RING_IDX i = queue->tx.rsp_prod_pvt; |
1671 | struct xen_netif_tx_response *resp; | 1688 | struct xen_netif_tx_response *resp; |
1672 | int notify; | ||
1673 | 1689 | ||
1674 | resp = RING_GET_RESPONSE(&queue->tx, i); | 1690 | resp = RING_GET_RESPONSE(&queue->tx, i); |
1675 | resp->id = txp->id; | 1691 | resp->id = txp->id; |
@@ -1679,9 +1695,6 @@ static void make_tx_response(struct xenvif_queue *queue, | |||
1679 | RING_GET_RESPONSE(&queue->tx, ++i)->status = XEN_NETIF_RSP_NULL; | 1695 | RING_GET_RESPONSE(&queue->tx, ++i)->status = XEN_NETIF_RSP_NULL; |
1680 | 1696 | ||
1681 | queue->tx.rsp_prod_pvt = ++i; | 1697 | queue->tx.rsp_prod_pvt = ++i; |
1682 | RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&queue->tx, notify); | ||
1683 | if (notify) | ||
1684 | notify_remote_via_irq(queue->tx_irq); | ||
1685 | } | 1698 | } |
1686 | 1699 | ||
1687 | static struct xen_netif_rx_response *make_rx_response(struct xenvif_queue *queue, | 1700 | static struct xen_netif_rx_response *make_rx_response(struct xenvif_queue *queue, |