diff options
author | hayeswang <hayeswang@realtek.com> | 2014-01-01 22:22:42 -0500 |
---|---|---|
committer | Vladislav Zhurba <vzhurba@nvidia.com> | 2018-02-01 16:57:59 -0500 |
commit | 12341e67ec9ac68bd8b42b86fe5645cd9f1e04a9 (patch) | |
tree | 441cad7c9696353080351d3ba8eb64843ecba76e /drivers/net/usb/r8152_shield.c | |
parent | aa6a48599fdb3a5bc523dadc56163eec9c85530b (diff) |
r8152: add rtl_ops
The different chips may have different settings. This makes it easy
to let different chips have the same flow with differnt settings.
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Preetham Chandru R <pchandru@nvidia.com>
(cherry picked from commit c81229c9d11a3b26be6ac65604aa6111655e1728)
Change-Id: I7a8bf04c96012262312f3de975a0256d21b7bed3
Reviewed-on: http://git-master/r/370003
Tested-by: Aly Hirani <ahirani@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'drivers/net/usb/r8152_shield.c')
-rw-r--r-- | drivers/net/usb/r8152_shield.c | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/drivers/net/usb/r8152_shield.c b/drivers/net/usb/r8152_shield.c index 85862a813..8a7c876e4 100644 --- a/drivers/net/usb/r8152_shield.c +++ b/drivers/net/usb/r8152_shield.c | |||
@@ -367,6 +367,15 @@ struct r8152 { | |||
367 | spinlock_t rx_lock, tx_lock; | 367 | spinlock_t rx_lock, tx_lock; |
368 | struct delayed_work schedule; | 368 | struct delayed_work schedule; |
369 | struct mii_if_info mii; | 369 | struct mii_if_info mii; |
370 | |||
371 | struct rtl_ops { | ||
372 | void (*init)(struct r8152 *); | ||
373 | int (*enable)(struct r8152 *); | ||
374 | void (*disable)(struct r8152 *); | ||
375 | void (*down)(struct r8152 *); | ||
376 | void (*unload)(struct r8152 *); | ||
377 | } rtl_ops; | ||
378 | |||
370 | int intr_interval; | 379 | int intr_interval; |
371 | u32 msg_enable; | 380 | u32 msg_enable; |
372 | u32 tx_qlen; | 381 | u32 tx_qlen; |
@@ -1751,7 +1760,7 @@ static void set_carrier(struct r8152 *tp) | |||
1751 | 1760 | ||
1752 | if (speed & LINK_STATUS) { | 1761 | if (speed & LINK_STATUS) { |
1753 | if (!(tp->speed & LINK_STATUS)) { | 1762 | if (!(tp->speed & LINK_STATUS)) { |
1754 | rtl8152_enable(tp); | 1763 | tp->rtl_ops.enable(tp); |
1755 | set_bit(RTL8152_SET_RX_MODE, &tp->flags); | 1764 | set_bit(RTL8152_SET_RX_MODE, &tp->flags); |
1756 | netif_carrier_on(netdev); | 1765 | netif_carrier_on(netdev); |
1757 | } | 1766 | } |
@@ -1759,7 +1768,7 @@ static void set_carrier(struct r8152 *tp) | |||
1759 | if (tp->speed & LINK_STATUS) { | 1768 | if (tp->speed & LINK_STATUS) { |
1760 | netif_carrier_off(netdev); | 1769 | netif_carrier_off(netdev); |
1761 | tasklet_disable(&tp->tl); | 1770 | tasklet_disable(&tp->tl); |
1762 | rtl8152_disable(tp); | 1771 | tp->rtl_ops.disable(tp); |
1763 | tasklet_enable(&tp->tl); | 1772 | tasklet_enable(&tp->tl); |
1764 | } | 1773 | } |
1765 | } | 1774 | } |
@@ -1819,7 +1828,7 @@ static int rtl8152_close(struct net_device *netdev) | |||
1819 | cancel_delayed_work_sync(&tp->schedule); | 1828 | cancel_delayed_work_sync(&tp->schedule); |
1820 | netif_stop_queue(netdev); | 1829 | netif_stop_queue(netdev); |
1821 | tasklet_disable(&tp->tl); | 1830 | tasklet_disable(&tp->tl); |
1822 | rtl8152_disable(tp); | 1831 | tp->rtl_ops.disable(tp); |
1823 | tasklet_enable(&tp->tl); | 1832 | tasklet_enable(&tp->tl); |
1824 | 1833 | ||
1825 | return res; | 1834 | return res; |
@@ -1945,7 +1954,7 @@ static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message) | |||
1945 | tasklet_disable(&tp->tl); | 1954 | tasklet_disable(&tp->tl); |
1946 | } | 1955 | } |
1947 | 1956 | ||
1948 | rtl8152_down(tp); | 1957 | tp->rtl_ops.down(tp); |
1949 | 1958 | ||
1950 | return 0; | 1959 | return 0; |
1951 | } | 1960 | } |
@@ -1954,7 +1963,7 @@ static int rtl8152_resume(struct usb_interface *intf) | |||
1954 | { | 1963 | { |
1955 | struct r8152 *tp = usb_get_intfdata(intf); | 1964 | struct r8152 *tp = usb_get_intfdata(intf); |
1956 | 1965 | ||
1957 | r8152b_init(tp); | 1966 | tp->rtl_ops.init(tp); |
1958 | netif_device_attach(tp->netdev); | 1967 | netif_device_attach(tp->netdev); |
1959 | if (netif_running(tp->netdev)) { | 1968 | if (netif_running(tp->netdev)) { |
1960 | rtl8152_set_speed(tp, AUTONEG_ENABLE, SPEED_100, DUPLEX_FULL); | 1969 | rtl8152_set_speed(tp, AUTONEG_ENABLE, SPEED_100, DUPLEX_FULL); |
@@ -2083,6 +2092,35 @@ static void rtl8152_unload(struct r8152 *tp) | |||
2083 | ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data); | 2092 | ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data); |
2084 | } | 2093 | } |
2085 | 2094 | ||
2095 | static bool rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id) | ||
2096 | { | ||
2097 | struct rtl_ops *ops = &tp->rtl_ops; | ||
2098 | bool ret = true; | ||
2099 | |||
2100 | switch (id->idVendor) { | ||
2101 | case VENDOR_ID_REALTEK: | ||
2102 | switch (id->idProduct) { | ||
2103 | case PRODUCT_ID_RTL8152: | ||
2104 | ops->init = r8152b_init; | ||
2105 | ops->enable = rtl8152_enable; | ||
2106 | ops->disable = rtl8152_disable; | ||
2107 | ops->down = rtl8152_down; | ||
2108 | ops->unload = rtl8152_unload; | ||
2109 | break; | ||
2110 | default: | ||
2111 | ret = false; | ||
2112 | break; | ||
2113 | } | ||
2114 | break; | ||
2115 | |||
2116 | default: | ||
2117 | ret = false; | ||
2118 | break; | ||
2119 | } | ||
2120 | |||
2121 | return ret; | ||
2122 | } | ||
2123 | |||
2086 | static int rtl8152_probe(struct usb_interface *intf, | 2124 | static int rtl8152_probe(struct usb_interface *intf, |
2087 | const struct usb_device_id *id) | 2125 | const struct usb_device_id *id) |
2088 | { | 2126 | { |
@@ -2106,6 +2144,11 @@ static int rtl8152_probe(struct usb_interface *intf, | |||
2106 | tp = netdev_priv(netdev); | 2144 | tp = netdev_priv(netdev); |
2107 | tp->msg_enable = 0x7FFF; | 2145 | tp->msg_enable = 0x7FFF; |
2108 | 2146 | ||
2147 | if (!rtl_ops_init(tp, id)) { | ||
2148 | netif_err(tp, probe, netdev, "Unknown Device"); | ||
2149 | return -ENODEV; | ||
2150 | } | ||
2151 | |||
2109 | tasklet_init(&tp->tl, bottom_half, (unsigned long)tp); | 2152 | tasklet_init(&tp->tl, bottom_half, (unsigned long)tp); |
2110 | INIT_DELAYED_WORK(&tp->schedule, rtl_work_func_t); | 2153 | INIT_DELAYED_WORK(&tp->schedule, rtl_work_func_t); |
2111 | 2154 | ||
@@ -2128,7 +2171,7 @@ static int rtl8152_probe(struct usb_interface *intf, | |||
2128 | tp->mii.supports_gmii = 0; | 2171 | tp->mii.supports_gmii = 0; |
2129 | 2172 | ||
2130 | r8152b_get_version(tp); | 2173 | r8152b_get_version(tp); |
2131 | r8152b_init(tp); | 2174 | tp->rtl_ops.init(tp); |
2132 | set_ethernet_addr(tp); | 2175 | set_ethernet_addr(tp); |
2133 | 2176 | ||
2134 | ret = alloc_all_mem(tp); | 2177 | ret = alloc_all_mem(tp); |
@@ -2163,7 +2206,7 @@ static void rtl8152_disconnect(struct usb_interface *intf) | |||
2163 | set_bit(RTL8152_UNPLUG, &tp->flags); | 2206 | set_bit(RTL8152_UNPLUG, &tp->flags); |
2164 | tasklet_kill(&tp->tl); | 2207 | tasklet_kill(&tp->tl); |
2165 | unregister_netdev(tp->netdev); | 2208 | unregister_netdev(tp->netdev); |
2166 | rtl8152_unload(tp); | 2209 | tp->rtl_ops.unload(tp); |
2167 | free_all_mem(tp); | 2210 | free_all_mem(tp); |
2168 | free_netdev(tp->netdev); | 2211 | free_netdev(tp->netdev); |
2169 | } | 2212 | } |