diff options
author | Francois Romieu <romieu@fr.zoreil.com> | 2012-03-08 03:48:40 -0500 |
---|---|---|
committer | Francois Romieu <romieu@fr.zoreil.com> | 2012-03-10 16:39:17 -0500 |
commit | df43ac7831a0e321b6b183b7eb48ae4577207453 (patch) | |
tree | 42db9dc6ecd514b8be4ba7e1f33c4706f76a9a79 /drivers/net/ethernet/realtek | |
parent | e6b763ea0527f1038752a591e4b45cffacc4bba2 (diff) |
r8169: move rtl8169_open after rtl_task it depends on.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Cc: Hayes Wang <hayeswang@realtek.com>
Diffstat (limited to 'drivers/net/ethernet/realtek')
-rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 168 |
1 files changed, 81 insertions, 87 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index abb6dead24d9..8d4515ed7946 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -775,10 +775,6 @@ MODULE_FIRMWARE(FIRMWARE_8168F_1); | |||
775 | MODULE_FIRMWARE(FIRMWARE_8168F_2); | 775 | MODULE_FIRMWARE(FIRMWARE_8168F_2); |
776 | 776 | ||
777 | static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance); | 777 | static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance); |
778 | static int rtl8169_init_ring(struct net_device *dev); | ||
779 | static void rtl_hw_start(struct net_device *dev); | ||
780 | static void rtl8169_rx_clear(struct rtl8169_private *tp); | ||
781 | static int rtl8169_poll(struct napi_struct *napi, int budget); | ||
782 | 778 | ||
783 | static void rtl_lock_work(struct rtl8169_private *tp) | 779 | static void rtl_lock_work(struct rtl8169_private *tp) |
784 | { | 780 | { |
@@ -4033,88 +4029,6 @@ static void rtl_request_firmware(struct rtl8169_private *tp) | |||
4033 | rtl_request_uncached_firmware(tp); | 4029 | rtl_request_uncached_firmware(tp); |
4034 | } | 4030 | } |
4035 | 4031 | ||
4036 | static void rtl_task(struct work_struct *); | ||
4037 | |||
4038 | static int rtl8169_open(struct net_device *dev) | ||
4039 | { | ||
4040 | struct rtl8169_private *tp = netdev_priv(dev); | ||
4041 | void __iomem *ioaddr = tp->mmio_addr; | ||
4042 | struct pci_dev *pdev = tp->pci_dev; | ||
4043 | int retval = -ENOMEM; | ||
4044 | |||
4045 | pm_runtime_get_sync(&pdev->dev); | ||
4046 | |||
4047 | /* | ||
4048 | * Rx and Tx desscriptors needs 256 bytes alignment. | ||
4049 | * dma_alloc_coherent provides more. | ||
4050 | */ | ||
4051 | tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES, | ||
4052 | &tp->TxPhyAddr, GFP_KERNEL); | ||
4053 | if (!tp->TxDescArray) | ||
4054 | goto err_pm_runtime_put; | ||
4055 | |||
4056 | tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES, | ||
4057 | &tp->RxPhyAddr, GFP_KERNEL); | ||
4058 | if (!tp->RxDescArray) | ||
4059 | goto err_free_tx_0; | ||
4060 | |||
4061 | retval = rtl8169_init_ring(dev); | ||
4062 | if (retval < 0) | ||
4063 | goto err_free_rx_1; | ||
4064 | |||
4065 | INIT_WORK(&tp->wk.work, rtl_task); | ||
4066 | |||
4067 | smp_mb(); | ||
4068 | |||
4069 | rtl_request_firmware(tp); | ||
4070 | |||
4071 | retval = request_irq(dev->irq, rtl8169_interrupt, | ||
4072 | (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, | ||
4073 | dev->name, dev); | ||
4074 | if (retval < 0) | ||
4075 | goto err_release_fw_2; | ||
4076 | |||
4077 | rtl_lock_work(tp); | ||
4078 | |||
4079 | set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); | ||
4080 | |||
4081 | napi_enable(&tp->napi); | ||
4082 | |||
4083 | rtl8169_init_phy(dev, tp); | ||
4084 | |||
4085 | __rtl8169_set_features(dev, dev->features); | ||
4086 | |||
4087 | rtl_pll_power_up(tp); | ||
4088 | |||
4089 | rtl_hw_start(dev); | ||
4090 | |||
4091 | netif_start_queue(dev); | ||
4092 | |||
4093 | rtl_unlock_work(tp); | ||
4094 | |||
4095 | tp->saved_wolopts = 0; | ||
4096 | pm_runtime_put_noidle(&pdev->dev); | ||
4097 | |||
4098 | rtl8169_check_link_status(dev, tp, ioaddr); | ||
4099 | out: | ||
4100 | return retval; | ||
4101 | |||
4102 | err_release_fw_2: | ||
4103 | rtl_release_firmware(tp); | ||
4104 | rtl8169_rx_clear(tp); | ||
4105 | err_free_rx_1: | ||
4106 | dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, | ||
4107 | tp->RxPhyAddr); | ||
4108 | tp->RxDescArray = NULL; | ||
4109 | err_free_tx_0: | ||
4110 | dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray, | ||
4111 | tp->TxPhyAddr); | ||
4112 | tp->TxDescArray = NULL; | ||
4113 | err_pm_runtime_put: | ||
4114 | pm_runtime_put_noidle(&pdev->dev); | ||
4115 | goto out; | ||
4116 | } | ||
4117 | |||
4118 | static void rtl_rx_close(struct rtl8169_private *tp) | 4032 | static void rtl_rx_close(struct rtl8169_private *tp) |
4119 | { | 4033 | { |
4120 | void __iomem *ioaddr = tp->mmio_addr; | 4034 | void __iomem *ioaddr = tp->mmio_addr; |
@@ -5806,6 +5720,86 @@ static int rtl8169_close(struct net_device *dev) | |||
5806 | return 0; | 5720 | return 0; |
5807 | } | 5721 | } |
5808 | 5722 | ||
5723 | static int rtl_open(struct net_device *dev) | ||
5724 | { | ||
5725 | struct rtl8169_private *tp = netdev_priv(dev); | ||
5726 | void __iomem *ioaddr = tp->mmio_addr; | ||
5727 | struct pci_dev *pdev = tp->pci_dev; | ||
5728 | int retval = -ENOMEM; | ||
5729 | |||
5730 | pm_runtime_get_sync(&pdev->dev); | ||
5731 | |||
5732 | /* | ||
5733 | * Rx and Tx desscriptors needs 256 bytes alignment. | ||
5734 | * dma_alloc_coherent provides more. | ||
5735 | */ | ||
5736 | tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES, | ||
5737 | &tp->TxPhyAddr, GFP_KERNEL); | ||
5738 | if (!tp->TxDescArray) | ||
5739 | goto err_pm_runtime_put; | ||
5740 | |||
5741 | tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES, | ||
5742 | &tp->RxPhyAddr, GFP_KERNEL); | ||
5743 | if (!tp->RxDescArray) | ||
5744 | goto err_free_tx_0; | ||
5745 | |||
5746 | retval = rtl8169_init_ring(dev); | ||
5747 | if (retval < 0) | ||
5748 | goto err_free_rx_1; | ||
5749 | |||
5750 | INIT_WORK(&tp->wk.work, rtl_task); | ||
5751 | |||
5752 | smp_mb(); | ||
5753 | |||
5754 | rtl_request_firmware(tp); | ||
5755 | |||
5756 | retval = request_irq(dev->irq, rtl8169_interrupt, | ||
5757 | (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, | ||
5758 | dev->name, dev); | ||
5759 | if (retval < 0) | ||
5760 | goto err_release_fw_2; | ||
5761 | |||
5762 | rtl_lock_work(tp); | ||
5763 | |||
5764 | set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags); | ||
5765 | |||
5766 | napi_enable(&tp->napi); | ||
5767 | |||
5768 | rtl8169_init_phy(dev, tp); | ||
5769 | |||
5770 | __rtl8169_set_features(dev, dev->features); | ||
5771 | |||
5772 | rtl_pll_power_up(tp); | ||
5773 | |||
5774 | rtl_hw_start(dev); | ||
5775 | |||
5776 | netif_start_queue(dev); | ||
5777 | |||
5778 | rtl_unlock_work(tp); | ||
5779 | |||
5780 | tp->saved_wolopts = 0; | ||
5781 | pm_runtime_put_noidle(&pdev->dev); | ||
5782 | |||
5783 | rtl8169_check_link_status(dev, tp, ioaddr); | ||
5784 | out: | ||
5785 | return retval; | ||
5786 | |||
5787 | err_release_fw_2: | ||
5788 | rtl_release_firmware(tp); | ||
5789 | rtl8169_rx_clear(tp); | ||
5790 | err_free_rx_1: | ||
5791 | dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, | ||
5792 | tp->RxPhyAddr); | ||
5793 | tp->RxDescArray = NULL; | ||
5794 | err_free_tx_0: | ||
5795 | dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray, | ||
5796 | tp->TxPhyAddr); | ||
5797 | tp->TxDescArray = NULL; | ||
5798 | err_pm_runtime_put: | ||
5799 | pm_runtime_put_noidle(&pdev->dev); | ||
5800 | goto out; | ||
5801 | } | ||
5802 | |||
5809 | static struct rtnl_link_stats64 * | 5803 | static struct rtnl_link_stats64 * |
5810 | rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) | 5804 | rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) |
5811 | { | 5805 | { |
@@ -6043,7 +6037,7 @@ static void __devexit rtl_remove_one(struct pci_dev *pdev) | |||
6043 | } | 6037 | } |
6044 | 6038 | ||
6045 | static const struct net_device_ops rtl_netdev_ops = { | 6039 | static const struct net_device_ops rtl_netdev_ops = { |
6046 | .ndo_open = rtl8169_open, | 6040 | .ndo_open = rtl_open, |
6047 | .ndo_stop = rtl8169_close, | 6041 | .ndo_stop = rtl8169_close, |
6048 | .ndo_get_stats64 = rtl8169_get_stats64, | 6042 | .ndo_get_stats64 = rtl8169_get_stats64, |
6049 | .ndo_start_xmit = rtl8169_start_xmit, | 6043 | .ndo_start_xmit = rtl8169_start_xmit, |