aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb/r8152.c
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2014-02-18 08:49:05 -0500
committerDavid S. Miller <davem@davemloft.net>2014-02-18 16:40:01 -0500
commit7e9da48161506bb24d6072be9dfcd62ac8d95b88 (patch)
tree40bf21be28fac330c7881ff804f605334953cbdd /drivers/net/usb/r8152.c
parentaa66a5f1af163b6c90fca5a06c7fdab121b70cd2 (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/usb/r8152.c')
-rw-r--r--drivers/net/usb/r8152.c45
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
2452out:
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}