summaryrefslogtreecommitdiffstats
path: root/drivers/net/usb/r8152_shield.c
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2014-01-01 22:22:42 -0500
committerVladislav Zhurba <vzhurba@nvidia.com>2018-02-01 16:57:59 -0500
commit12341e67ec9ac68bd8b42b86fe5645cd9f1e04a9 (patch)
tree441cad7c9696353080351d3ba8eb64843ecba76e /drivers/net/usb/r8152_shield.c
parentaa6a48599fdb3a5bc523dadc56163eec9c85530b (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.c57
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
2095static 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
2086static int rtl8152_probe(struct usb_interface *intf, 2124static 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 }