diff options
author | hayeswang <hayeswang@realtek.com> | 2014-02-18 08:49:05 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-18 16:40:01 -0500 |
commit | 7e9da48161506bb24d6072be9dfcd62ac8d95b88 (patch) | |
tree | 40bf21be28fac330c7881ff804f605334953cbdd /drivers/net | |
parent | aa66a5f1af163b6c90fca5a06c7fdab121b70cd2 (diff) |
r8152: move some functions from probe to open
Add up method for rtl_ops and asign relative functions. Move
clear_bp() and hw_phy_cfg() from init method to up method of rtl_ops.
Call rtl_ops.up() for ndo_open() and rtl_ops.down for ndo_stop().
Replace allocating the memory in probe() with in ndo_open().
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/usb/r8152.c | 45 |
1 files changed, 25 insertions, 20 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index b3155da97f09..828572a5b24a 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
@@ -515,6 +515,7 @@ struct r8152 { | |||
515 | void (*init)(struct r8152 *); | 515 | void (*init)(struct r8152 *); |
516 | int (*enable)(struct r8152 *); | 516 | int (*enable)(struct r8152 *); |
517 | void (*disable)(struct r8152 *); | 517 | void (*disable)(struct r8152 *); |
518 | void (*up)(struct r8152 *); | ||
518 | void (*down)(struct r8152 *); | 519 | void (*down)(struct r8152 *); |
519 | void (*unload)(struct r8152 *); | 520 | void (*unload)(struct r8152 *); |
520 | } rtl_ops; | 521 | } rtl_ops; |
@@ -1878,6 +1879,10 @@ static void r8152b_hw_phy_cfg(struct r8152 *tp) | |||
1878 | } | 1879 | } |
1879 | 1880 | ||
1880 | r8152b_disable_aldps(tp); | 1881 | r8152b_disable_aldps(tp); |
1882 | |||
1883 | rtl_clear_bp(tp); | ||
1884 | |||
1885 | r8152b_enable_aldps(tp); | ||
1881 | set_bit(PHY_RESET, &tp->flags); | 1886 | set_bit(PHY_RESET, &tp->flags); |
1882 | } | 1887 | } |
1883 | 1888 | ||
@@ -1891,6 +1896,7 @@ static void r8152b_exit_oob(struct r8152 *tp) | |||
1891 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); | 1896 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); |
1892 | 1897 | ||
1893 | rxdy_gated_en(tp, true); | 1898 | rxdy_gated_en(tp, true); |
1899 | r8152b_hw_phy_cfg(tp); | ||
1894 | 1900 | ||
1895 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); | 1901 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); |
1896 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00); | 1902 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00); |
@@ -2033,6 +2039,8 @@ static void r8153_hw_phy_cfg(struct r8152 *tp) | |||
2033 | r8152_mdio_write(tp, MII_BMCR, data); | 2039 | r8152_mdio_write(tp, MII_BMCR, data); |
2034 | } | 2040 | } |
2035 | 2041 | ||
2042 | r8153_clear_bp(tp); | ||
2043 | |||
2036 | if (tp->version == RTL_VER_03) { | 2044 | if (tp->version == RTL_VER_03) { |
2037 | data = ocp_reg_read(tp, OCP_EEE_CFG); | 2045 | data = ocp_reg_read(tp, OCP_EEE_CFG); |
2038 | data &= ~CTAP_SHORT_EN; | 2046 | data &= ~CTAP_SHORT_EN; |
@@ -2418,6 +2426,12 @@ static int rtl8152_open(struct net_device *netdev) | |||
2418 | struct r8152 *tp = netdev_priv(netdev); | 2426 | struct r8152 *tp = netdev_priv(netdev); |
2419 | int res = 0; | 2427 | int res = 0; |
2420 | 2428 | ||
2429 | res = alloc_all_mem(tp); | ||
2430 | if (res) | ||
2431 | goto out; | ||
2432 | |||
2433 | tp->rtl_ops.up(tp); | ||
2434 | |||
2421 | rtl8152_set_speed(tp, AUTONEG_ENABLE, | 2435 | rtl8152_set_speed(tp, AUTONEG_ENABLE, |
2422 | tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, | 2436 | tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, |
2423 | DUPLEX_FULL); | 2437 | DUPLEX_FULL); |
@@ -2431,9 +2445,11 @@ static int rtl8152_open(struct net_device *netdev) | |||
2431 | netif_device_detach(tp->netdev); | 2445 | netif_device_detach(tp->netdev); |
2432 | netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", | 2446 | netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", |
2433 | res); | 2447 | res); |
2448 | free_all_mem(tp); | ||
2434 | } | 2449 | } |
2435 | 2450 | ||
2436 | 2451 | ||
2452 | out: | ||
2437 | return res; | 2453 | return res; |
2438 | } | 2454 | } |
2439 | 2455 | ||
@@ -2447,9 +2463,11 @@ static int rtl8152_close(struct net_device *netdev) | |||
2447 | cancel_delayed_work_sync(&tp->schedule); | 2463 | cancel_delayed_work_sync(&tp->schedule); |
2448 | netif_stop_queue(netdev); | 2464 | netif_stop_queue(netdev); |
2449 | tasklet_disable(&tp->tl); | 2465 | tasklet_disable(&tp->tl); |
2450 | tp->rtl_ops.disable(tp); | 2466 | tp->rtl_ops.down(tp); |
2451 | tasklet_enable(&tp->tl); | 2467 | tasklet_enable(&tp->tl); |
2452 | 2468 | ||
2469 | free_all_mem(tp); | ||
2470 | |||
2453 | return res; | 2471 | return res; |
2454 | } | 2472 | } |
2455 | 2473 | ||
@@ -2505,21 +2523,14 @@ static void r8152b_init(struct r8152 *tp) | |||
2505 | { | 2523 | { |
2506 | u32 ocp_data; | 2524 | u32 ocp_data; |
2507 | 2525 | ||
2508 | rtl_clear_bp(tp); | ||
2509 | |||
2510 | if (tp->version == RTL_VER_01) { | 2526 | if (tp->version == RTL_VER_01) { |
2511 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE); | 2527 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE); |
2512 | ocp_data &= ~LED_MODE_MASK; | 2528 | ocp_data &= ~LED_MODE_MASK; |
2513 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data); | 2529 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data); |
2514 | } | 2530 | } |
2515 | 2531 | ||
2516 | r8152b_hw_phy_cfg(tp); | ||
2517 | |||
2518 | r8152_power_cut_en(tp, false); | 2532 | r8152_power_cut_en(tp, false); |
2519 | 2533 | ||
2520 | |||
2521 | r8152b_exit_oob(tp); | ||
2522 | |||
2523 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); | 2534 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR); |
2524 | ocp_data |= TX_10M_IDLE_EN | PFM_PWM_SWITCH; | 2535 | ocp_data |= TX_10M_IDLE_EN | PFM_PWM_SWITCH; |
2525 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); | 2536 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data); |
@@ -2568,8 +2579,6 @@ static void r8153_init(struct r8152 *tp) | |||
2568 | ocp_data &= ~TIMER11_EN; | 2579 | ocp_data &= ~TIMER11_EN; |
2569 | ocp_write_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL, ocp_data); | 2580 | ocp_write_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL, ocp_data); |
2570 | 2581 | ||
2571 | r8153_clear_bp(tp); | ||
2572 | |||
2573 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE); | 2582 | ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE); |
2574 | ocp_data &= ~LED_MODE_MASK; | 2583 | ocp_data &= ~LED_MODE_MASK; |
2575 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data); | 2584 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data); |
@@ -2590,8 +2599,6 @@ static void r8153_init(struct r8152 *tp) | |||
2590 | r8153_power_cut_en(tp, false); | 2599 | r8153_power_cut_en(tp, false); |
2591 | r8153_u1u2en(tp, true); | 2600 | r8153_u1u2en(tp, true); |
2592 | 2601 | ||
2593 | r8153_first_init(tp); | ||
2594 | |||
2595 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ALDPS_SPDWN_RATIO); | 2602 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ALDPS_SPDWN_RATIO); |
2596 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, EEE_SPDWN_RATIO); | 2603 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, EEE_SPDWN_RATIO); |
2597 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, | 2604 | ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, |
@@ -2618,10 +2625,10 @@ static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message) | |||
2618 | usb_kill_urb(tp->intr_urb); | 2625 | usb_kill_urb(tp->intr_urb); |
2619 | cancel_delayed_work_sync(&tp->schedule); | 2626 | cancel_delayed_work_sync(&tp->schedule); |
2620 | tasklet_disable(&tp->tl); | 2627 | tasklet_disable(&tp->tl); |
2628 | tp->rtl_ops.down(tp); | ||
2629 | tasklet_enable(&tp->tl); | ||
2621 | } | 2630 | } |
2622 | 2631 | ||
2623 | tp->rtl_ops.down(tp); | ||
2624 | |||
2625 | return 0; | 2632 | return 0; |
2626 | } | 2633 | } |
2627 | 2634 | ||
@@ -2632,6 +2639,7 @@ static int rtl8152_resume(struct usb_interface *intf) | |||
2632 | tp->rtl_ops.init(tp); | 2639 | tp->rtl_ops.init(tp); |
2633 | netif_device_attach(tp->netdev); | 2640 | netif_device_attach(tp->netdev); |
2634 | if (netif_running(tp->netdev)) { | 2641 | if (netif_running(tp->netdev)) { |
2642 | tp->rtl_ops.up(tp); | ||
2635 | rtl8152_set_speed(tp, AUTONEG_ENABLE, | 2643 | rtl8152_set_speed(tp, AUTONEG_ENABLE, |
2636 | tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, | 2644 | tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, |
2637 | DUPLEX_FULL); | 2645 | DUPLEX_FULL); |
@@ -2639,7 +2647,6 @@ static int rtl8152_resume(struct usb_interface *intf) | |||
2639 | netif_carrier_off(tp->netdev); | 2647 | netif_carrier_off(tp->netdev); |
2640 | set_bit(WORK_ENABLE, &tp->flags); | 2648 | set_bit(WORK_ENABLE, &tp->flags); |
2641 | usb_submit_urb(tp->intr_urb, GFP_KERNEL); | 2649 | usb_submit_urb(tp->intr_urb, GFP_KERNEL); |
2642 | tasklet_enable(&tp->tl); | ||
2643 | } | 2650 | } |
2644 | 2651 | ||
2645 | return 0; | 2652 | return 0; |
@@ -2780,6 +2787,7 @@ static int rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id) | |||
2780 | ops->init = r8152b_init; | 2787 | ops->init = r8152b_init; |
2781 | ops->enable = rtl8152_enable; | 2788 | ops->enable = rtl8152_enable; |
2782 | ops->disable = rtl8152_disable; | 2789 | ops->disable = rtl8152_disable; |
2790 | ops->up = r8152b_exit_oob; | ||
2783 | ops->down = rtl8152_down; | 2791 | ops->down = rtl8152_down; |
2784 | ops->unload = rtl8152_unload; | 2792 | ops->unload = rtl8152_unload; |
2785 | ret = 0; | 2793 | ret = 0; |
@@ -2788,6 +2796,7 @@ static int rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id) | |||
2788 | ops->init = r8153_init; | 2796 | ops->init = r8153_init; |
2789 | ops->enable = rtl8153_enable; | 2797 | ops->enable = rtl8153_enable; |
2790 | ops->disable = rtl8152_disable; | 2798 | ops->disable = rtl8152_disable; |
2799 | ops->up = r8153_first_init; | ||
2791 | ops->down = rtl8153_down; | 2800 | ops->down = rtl8153_down; |
2792 | ops->unload = rtl8153_unload; | 2801 | ops->unload = rtl8153_unload; |
2793 | ret = 0; | 2802 | ret = 0; |
@@ -2803,6 +2812,7 @@ static int rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id) | |||
2803 | ops->init = r8153_init; | 2812 | ops->init = r8153_init; |
2804 | ops->enable = rtl8153_enable; | 2813 | ops->enable = rtl8153_enable; |
2805 | ops->disable = rtl8152_disable; | 2814 | ops->disable = rtl8152_disable; |
2815 | ops->up = r8153_first_init; | ||
2806 | ops->down = rtl8153_down; | 2816 | ops->down = rtl8153_down; |
2807 | ops->unload = rtl8153_unload; | 2817 | ops->unload = rtl8153_unload; |
2808 | ret = 0; | 2818 | ret = 0; |
@@ -2870,10 +2880,6 @@ static int rtl8152_probe(struct usb_interface *intf, | |||
2870 | tp->rtl_ops.init(tp); | 2880 | tp->rtl_ops.init(tp); |
2871 | set_ethernet_addr(tp); | 2881 | set_ethernet_addr(tp); |
2872 | 2882 | ||
2873 | ret = alloc_all_mem(tp); | ||
2874 | if (ret) | ||
2875 | goto out; | ||
2876 | |||
2877 | usb_set_intfdata(intf, tp); | 2883 | usb_set_intfdata(intf, tp); |
2878 | 2884 | ||
2879 | ret = register_netdev(netdev); | 2885 | ret = register_netdev(netdev); |
@@ -2903,7 +2909,6 @@ static void rtl8152_disconnect(struct usb_interface *intf) | |||
2903 | tasklet_kill(&tp->tl); | 2909 | tasklet_kill(&tp->tl); |
2904 | unregister_netdev(tp->netdev); | 2910 | unregister_netdev(tp->netdev); |
2905 | tp->rtl_ops.unload(tp); | 2911 | tp->rtl_ops.unload(tp); |
2906 | free_all_mem(tp); | ||
2907 | free_netdev(tp->netdev); | 2912 | free_netdev(tp->netdev); |
2908 | } | 2913 | } |
2909 | } | 2914 | } |