aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2014-01-01 22:25:10 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-01 22:54:15 -0500
commit43779f8dfb0051b2ecd5f17ea7ad089443278e82 (patch)
tree62e0e1cda157923e01d3f4d817f6e5568579deae
parent507605a83533bc828b283e36fb443901318214e9 (diff)
r8152: support RTL8153
Support new chip RTL8153 which is the USB 3.0 giga ethernet adapter. Signed-off-by: Hayes Wang <hayeswang@realtek.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/usb/cdc_ether.c10
-rw-r--r--drivers/net/usb/r8152.c615
-rw-r--r--drivers/net/usb/r815x.c2
3 files changed, 621 insertions, 6 deletions
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index 4b1c0f3f727d..640406ac4358 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -486,6 +486,7 @@ static const struct driver_info wwan_info = {
486#define ZTE_VENDOR_ID 0x19D2 486#define ZTE_VENDOR_ID 0x19D2
487#define DELL_VENDOR_ID 0x413C 487#define DELL_VENDOR_ID 0x413C
488#define REALTEK_VENDOR_ID 0x0bda 488#define REALTEK_VENDOR_ID 0x0bda
489#define SAMSUNG_VENDOR_ID 0x04e8
489 490
490static const struct usb_device_id products[] = { 491static const struct usb_device_id products[] = {
491/* BLACKLIST !! 492/* BLACKLIST !!
@@ -652,6 +653,15 @@ static const struct usb_device_id products[] = {
652 .driver_info = 0, 653 .driver_info = 0,
653}, 654},
654 655
656#if defined(CONFIG_USB_RTL8152) || defined(CONFIG_USB_RTL8152_MODULE)
657/* Samsung USB Ethernet Adapters */
658{
659 USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM,
660 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
661 .driver_info = 0,
662},
663#endif
664
655/* WHITELIST!!! 665/* WHITELIST!!!
656 * 666 *
657 * CDC Ether uses two interfaces, not necessarily consecutive. 667 * CDC Ether uses two interfaces, not necessarily consecutive.
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index bc5d5691c99c..e3d878c1cecf 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -24,7 +24,7 @@
24#include <linux/ipv6.h> 24#include <linux/ipv6.h>
25 25
26/* Version Information */ 26/* Version Information */
27#define DRIVER_VERSION "v1.02.0 (2013/10/28)" 27#define DRIVER_VERSION "v1.03.0 (2013/12/26)"
28#define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_swsd@realtek.com>" 28#define DRIVER_AUTHOR "Realtek linux nic maintainers <nic_swsd@realtek.com>"
29#define DRIVER_DESC "Realtek RTL8152 Based USB 2.0 Ethernet Adapters" 29#define DRIVER_DESC "Realtek RTL8152 Based USB 2.0 Ethernet Adapters"
30#define MODULENAME "r8152" 30#define MODULENAME "r8152"
@@ -39,15 +39,24 @@
39#define PLA_RXFIFO_CTRL2 0xc0a8 39#define PLA_RXFIFO_CTRL2 0xc0a8
40#define PLA_FMC 0xc0b4 40#define PLA_FMC 0xc0b4
41#define PLA_CFG_WOL 0xc0b6 41#define PLA_CFG_WOL 0xc0b6
42#define PLA_TEREDO_CFG 0xc0bc
42#define PLA_MAR 0xcd00 43#define PLA_MAR 0xcd00
44#define PLA_BACKUP 0xd000
43#define PAL_BDC_CR 0xd1a0 45#define PAL_BDC_CR 0xd1a0
46#define PLA_TEREDO_TIMER 0xd2cc
47#define PLA_REALWOW_TIMER 0xd2e8
44#define PLA_LEDSEL 0xdd90 48#define PLA_LEDSEL 0xdd90
45#define PLA_LED_FEATURE 0xdd92 49#define PLA_LED_FEATURE 0xdd92
46#define PLA_PHYAR 0xde00 50#define PLA_PHYAR 0xde00
51#define PLA_BOOT_CTRL 0xe004
47#define PLA_GPHY_INTR_IMR 0xe022 52#define PLA_GPHY_INTR_IMR 0xe022
48#define PLA_EEE_CR 0xe040 53#define PLA_EEE_CR 0xe040
49#define PLA_EEEP_CR 0xe080 54#define PLA_EEEP_CR 0xe080
50#define PLA_MAC_PWR_CTRL 0xe0c0 55#define PLA_MAC_PWR_CTRL 0xe0c0
56#define PLA_MAC_PWR_CTRL2 0xe0ca
57#define PLA_MAC_PWR_CTRL3 0xe0cc
58#define PLA_MAC_PWR_CTRL4 0xe0ce
59#define PLA_WDT6_CTRL 0xe428
51#define PLA_TCR0 0xe610 60#define PLA_TCR0 0xe610
52#define PLA_TCR1 0xe612 61#define PLA_TCR1 0xe612
53#define PLA_TXFIFO_CTRL 0xe618 62#define PLA_TXFIFO_CTRL 0xe618
@@ -73,16 +82,25 @@
73#define PLA_BP_5 0xfc32 82#define PLA_BP_5 0xfc32
74#define PLA_BP_6 0xfc34 83#define PLA_BP_6 0xfc34
75#define PLA_BP_7 0xfc36 84#define PLA_BP_7 0xfc36
85#define PLA_BP_EN 0xfc38
76 86
87#define USB_U2P3_CTRL 0xb460
77#define USB_DEV_STAT 0xb808 88#define USB_DEV_STAT 0xb808
78#define USB_USB_CTRL 0xd406 89#define USB_USB_CTRL 0xd406
79#define USB_PHY_CTRL 0xd408 90#define USB_PHY_CTRL 0xd408
80#define USB_TX_AGG 0xd40a 91#define USB_TX_AGG 0xd40a
81#define USB_RX_BUF_TH 0xd40c 92#define USB_RX_BUF_TH 0xd40c
82#define USB_USB_TIMER 0xd428 93#define USB_USB_TIMER 0xd428
94#define USB_RX_EARLY_AGG 0xd42c
83#define USB_PM_CTRL_STATUS 0xd432 95#define USB_PM_CTRL_STATUS 0xd432
84#define USB_TX_DMA 0xd434 96#define USB_TX_DMA 0xd434
97#define USB_TOLERANCE 0xd490
98#define USB_LPM_CTRL 0xd41a
85#define USB_UPS_CTRL 0xd800 99#define USB_UPS_CTRL 0xd800
100#define USB_MISC_0 0xd81a
101#define USB_POWER_CUT 0xd80a
102#define USB_AFE_CTRL2 0xd824
103#define USB_WDT11_CTRL 0xe43c
86#define USB_BP_BA 0xfc26 104#define USB_BP_BA 0xfc26
87#define USB_BP_0 0xfc28 105#define USB_BP_0 0xfc28
88#define USB_BP_1 0xfc2a 106#define USB_BP_1 0xfc2a
@@ -92,6 +110,7 @@
92#define USB_BP_5 0xfc32 110#define USB_BP_5 0xfc32
93#define USB_BP_6 0xfc34 111#define USB_BP_6 0xfc34
94#define USB_BP_7 0xfc36 112#define USB_BP_7 0xfc36
113#define USB_BP_EN 0xfc38
95 114
96/* OCP Registers */ 115/* OCP Registers */
97#define OCP_ALDPS_CONFIG 0x2010 116#define OCP_ALDPS_CONFIG 0x2010
@@ -101,6 +120,20 @@
101#define OCP_BASE_MII 0xa400 120#define OCP_BASE_MII 0xa400
102#define OCP_EEE_AR 0xa41a 121#define OCP_EEE_AR 0xa41a
103#define OCP_EEE_DATA 0xa41c 122#define OCP_EEE_DATA 0xa41c
123#define OCP_PHY_STATUS 0xa420
124#define OCP_POWER_CFG 0xa430
125#define OCP_EEE_CFG 0xa432
126#define OCP_SRAM_ADDR 0xa436
127#define OCP_SRAM_DATA 0xa438
128#define OCP_DOWN_SPEED 0xa442
129#define OCP_EEE_CFG2 0xa5d0
130#define OCP_ADC_CFG 0xbc06
131
132/* SRAM Register */
133#define SRAM_LPF_CFG 0x8012
134#define SRAM_10M_AMP1 0x8080
135#define SRAM_10M_AMP2 0x8082
136#define SRAM_IMPEDANCE 0x8084
104 137
105/* PLA_RCR */ 138/* PLA_RCR */
106#define RCR_AAP 0x00000001 139#define RCR_AAP 0x00000001
@@ -117,14 +150,17 @@
117#define RXFIFO_THR2_FULL 0x00000060 150#define RXFIFO_THR2_FULL 0x00000060
118#define RXFIFO_THR2_HIGH 0x00000038 151#define RXFIFO_THR2_HIGH 0x00000038
119#define RXFIFO_THR2_OOB 0x0000004a 152#define RXFIFO_THR2_OOB 0x0000004a
153#define RXFIFO_THR2_NORMAL 0x00a0
120 154
121/* PLA_RXFIFO_CTRL2 */ 155/* PLA_RXFIFO_CTRL2 */
122#define RXFIFO_THR3_FULL 0x00000078 156#define RXFIFO_THR3_FULL 0x00000078
123#define RXFIFO_THR3_HIGH 0x00000048 157#define RXFIFO_THR3_HIGH 0x00000048
124#define RXFIFO_THR3_OOB 0x0000005a 158#define RXFIFO_THR3_OOB 0x0000005a
159#define RXFIFO_THR3_NORMAL 0x0110
125 160
126/* PLA_TXFIFO_CTRL */ 161/* PLA_TXFIFO_CTRL */
127#define TXFIFO_THR_NORMAL 0x00400008 162#define TXFIFO_THR_NORMAL 0x00400008
163#define TXFIFO_THR_NORMAL2 0x01000008
128 164
129/* PLA_FMC */ 165/* PLA_FMC */
130#define FMC_FCR_MCU_EN 0x0001 166#define FMC_FCR_MCU_EN 0x0001
@@ -132,6 +168,9 @@
132/* PLA_EEEP_CR */ 168/* PLA_EEEP_CR */
133#define EEEP_CR_EEEP_TX 0x0002 169#define EEEP_CR_EEEP_TX 0x0002
134 170
171/* PLA_WDT6_CTRL */
172#define WDT6_SET_MODE 0x0010
173
135/* PLA_TCR0 */ 174/* PLA_TCR0 */
136#define TCR0_TX_EMPTY 0x0800 175#define TCR0_TX_EMPTY 0x0800
137#define TCR0_AUTO_FIFO 0x0080 176#define TCR0_AUTO_FIFO 0x0080
@@ -169,6 +208,12 @@
169/* PLA_CFG_WOL */ 208/* PLA_CFG_WOL */
170#define MAGIC_EN 0x0001 209#define MAGIC_EN 0x0001
171 210
211/* PLA_TEREDO_CFG */
212#define TEREDO_SEL 0x8000
213#define TEREDO_WAKE_MASK 0x7f00
214#define TEREDO_RS_EVENT_MASK 0x00fe
215#define OOB_TEREDO_EN 0x0001
216
172/* PAL_BDC_CR */ 217/* PAL_BDC_CR */
173#define ALDPS_PROXY_MODE 0x0001 218#define ALDPS_PROXY_MODE 0x0001
174 219
@@ -186,6 +231,25 @@
186#define D3_CLK_GATED_EN 0x00004000 231#define D3_CLK_GATED_EN 0x00004000
187#define MCU_CLK_RATIO 0x07010f07 232#define MCU_CLK_RATIO 0x07010f07
188#define MCU_CLK_RATIO_MASK 0x0f0f0f0f 233#define MCU_CLK_RATIO_MASK 0x0f0f0f0f
234#define ALDPS_SPDWN_RATIO 0x0f87
235
236/* PLA_MAC_PWR_CTRL2 */
237#define EEE_SPDWN_RATIO 0x8007
238
239/* PLA_MAC_PWR_CTRL3 */
240#define PKT_AVAIL_SPDWN_EN 0x0100
241#define SUSPEND_SPDWN_EN 0x0004
242#define U1U2_SPDWN_EN 0x0002
243#define L1_SPDWN_EN 0x0001
244
245/* PLA_MAC_PWR_CTRL4 */
246#define PWRSAVE_SPDWN_EN 0x1000
247#define RXDV_SPDWN_EN 0x0800
248#define TX10MIDLE_EN 0x0100
249#define TP100_SPDWN_EN 0x0020
250#define TP500_SPDWN_EN 0x0010
251#define TP1000_SPDWN_EN 0x0008
252#define EEE_SPDWN_EN 0x0001
189 253
190/* PLA_GPHY_INTR_IMR */ 254/* PLA_GPHY_INTR_IMR */
191#define GPHY_STS_MSK 0x0001 255#define GPHY_STS_MSK 0x0001
@@ -200,6 +264,9 @@
200#define EEE_RX_EN 0x0001 264#define EEE_RX_EN 0x0001
201#define EEE_TX_EN 0x0002 265#define EEE_TX_EN 0x0002
202 266
267/* PLA_BOOT_CTRL */
268#define AUTOLOAD_DONE 0x0002
269
203/* USB_DEV_STAT */ 270/* USB_DEV_STAT */
204#define STAT_SPEED_MASK 0x0006 271#define STAT_SPEED_MASK 0x0006
205#define STAT_SPEED_HIGH 0x0000 272#define STAT_SPEED_HIGH 0x0000
@@ -209,7 +276,9 @@
209#define TX_AGG_MAX_THRESHOLD 0x03 276#define TX_AGG_MAX_THRESHOLD 0x03
210 277
211/* USB_RX_BUF_TH */ 278/* USB_RX_BUF_TH */
279#define RX_THR_SUPPER 0x0c350180
212#define RX_THR_HIGH 0x7a120180 280#define RX_THR_HIGH 0x7a120180
281#define RX_THR_SLOW 0xffff0180
213 282
214/* USB_TX_DMA */ 283/* USB_TX_DMA */
215#define TEST_MODE_DISABLE 0x00000001 284#define TEST_MODE_DISABLE 0x00000001
@@ -224,12 +293,50 @@
224/* USB_USB_CTRL */ 293/* USB_USB_CTRL */
225#define RX_AGG_DISABLE 0x0010 294#define RX_AGG_DISABLE 0x0010
226 295
296/* USB_U2P3_CTRL */
297#define U2P3_ENABLE 0x0001
298
299/* USB_POWER_CUT */
300#define PWR_EN 0x0001
301#define PHASE2_EN 0x0008
302
303/* USB_MISC_0 */
304#define PCUT_STATUS 0x0001
305
306/* USB_RX_EARLY_AGG */
307#define EARLY_AGG_SUPPER 0x0e832981
308#define EARLY_AGG_HIGH 0x0e837a12
309#define EARLY_AGG_SLOW 0x0e83ffff
310
311/* USB_WDT11_CTRL */
312#define TIMER11_EN 0x0001
313
314/* USB_LPM_CTRL */
315#define LPM_TIMER_MASK 0x0c
316#define LPM_TIMER_500MS 0x04 /* 500 ms */
317#define LPM_TIMER_500US 0x0c /* 500 us */
318
319/* USB_AFE_CTRL2 */
320#define SEN_VAL_MASK 0xf800
321#define SEN_VAL_NORMAL 0xa000
322#define SEL_RXIDLE 0x0100
323
227/* OCP_ALDPS_CONFIG */ 324/* OCP_ALDPS_CONFIG */
228#define ENPWRSAVE 0x8000 325#define ENPWRSAVE 0x8000
229#define ENPDNPS 0x0200 326#define ENPDNPS 0x0200
230#define LINKENA 0x0100 327#define LINKENA 0x0100
231#define DIS_SDSAVE 0x0010 328#define DIS_SDSAVE 0x0010
232 329
330/* OCP_PHY_STATUS */
331#define PHY_STAT_MASK 0x0007
332#define PHY_STAT_LAN_ON 3
333#define PHY_STAT_PWRDN 5
334
335/* OCP_POWER_CFG */
336#define EEE_CLKDIV_EN 0x8000
337#define EN_ALDPS 0x0004
338#define EN_10M_PLLOFF 0x0001
339
233/* OCP_EEE_CONFIG1 */ 340/* OCP_EEE_CONFIG1 */
234#define RG_TXLPI_MSK_HFDUP 0x8000 341#define RG_TXLPI_MSK_HFDUP 0x8000
235#define RG_MATCLR_EN 0x4000 342#define RG_MATCLR_EN 0x4000
@@ -264,7 +371,36 @@
264#define EEE_ADDR 0x003C 371#define EEE_ADDR 0x003C
265#define EEE_DATA 0x0002 372#define EEE_DATA 0x0002
266 373
374/* OCP_EEE_CFG */
375#define CTAP_SHORT_EN 0x0040
376#define EEE10_EN 0x0010
377
378/* OCP_DOWN_SPEED */
379#define EN_10M_BGOFF 0x0080
380
381/* OCP_EEE_CFG2 */
382#define MY1000_EEE 0x0004
383#define MY100_EEE 0x0002
384
385/* OCP_ADC_CFG */
386#define CKADSEL_L 0x0100
387#define ADC_EN 0x0080
388#define EN_EMI_L 0x0040
389
390/* SRAM_LPF_CFG */
391#define LPF_AUTO_TUNE 0x8000
392
393/* SRAM_10M_AMP1 */
394#define GDAC_IB_UPALL 0x0008
395
396/* SRAM_10M_AMP2 */
397#define AMP_DN 0x0200
398
399/* SRAM_IMPEDANCE */
400#define RX_DRIVING_MASK 0x6000
401
267enum rtl_register_content { 402enum rtl_register_content {
403 _1000bps = 0x10,
268 _100bps = 0x08, 404 _100bps = 0x08,
269 _10bps = 0x04, 405 _10bps = 0x04,
270 LINK_STATUS = 0x02, 406 LINK_STATUS = 0x02,
@@ -306,6 +442,10 @@ enum rtl8152_flags {
306/* Define these values to match your device */ 442/* Define these values to match your device */
307#define VENDOR_ID_REALTEK 0x0bda 443#define VENDOR_ID_REALTEK 0x0bda
308#define PRODUCT_ID_RTL8152 0x8152 444#define PRODUCT_ID_RTL8152 0x8152
445#define PRODUCT_ID_RTL8153 0x8153
446
447#define VENDOR_ID_SAMSUNG 0x04e8
448#define PRODUCT_ID_SAMSUNG 0xa101
309 449
310#define MCU_TYPE_PLA 0x0100 450#define MCU_TYPE_PLA 0x0100
311#define MCU_TYPE_USB 0x0000 451#define MCU_TYPE_USB 0x0000
@@ -388,7 +528,11 @@ struct r8152 {
388enum rtl_version { 528enum rtl_version {
389 RTL_VER_UNKNOWN = 0, 529 RTL_VER_UNKNOWN = 0,
390 RTL_VER_01, 530 RTL_VER_01,
391 RTL_VER_02 531 RTL_VER_02,
532 RTL_VER_03,
533 RTL_VER_04,
534 RTL_VER_05,
535 RTL_VER_MAX
392}; 536};
393 537
394/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). 538/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
@@ -704,6 +848,18 @@ static inline int r8152_mdio_read(struct r8152 *tp, u32 reg_addr)
704 return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2); 848 return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2);
705} 849}
706 850
851static void sram_write(struct r8152 *tp, u16 addr, u16 data)
852{
853 ocp_reg_write(tp, OCP_SRAM_ADDR, addr);
854 ocp_reg_write(tp, OCP_SRAM_DATA, data);
855}
856
857static u16 sram_read(struct r8152 *tp, u16 addr)
858{
859 ocp_reg_write(tp, OCP_SRAM_ADDR, addr);
860 return ocp_reg_read(tp, OCP_SRAM_DATA);
861}
862
707static int read_mii_word(struct net_device *netdev, int phy_id, int reg) 863static int read_mii_word(struct net_device *netdev, int phy_id, int reg)
708{ 864{
709 struct r8152 *tp = netdev_priv(netdev); 865 struct r8152 *tp = netdev_priv(netdev);
@@ -1497,6 +1653,39 @@ static int rtl8152_enable(struct r8152 *tp)
1497 return rtl_enable(tp); 1653 return rtl_enable(tp);
1498} 1654}
1499 1655
1656static void r8153_set_rx_agg(struct r8152 *tp)
1657{
1658 u8 speed;
1659
1660 speed = rtl8152_get_speed(tp);
1661 if (speed & _1000bps) {
1662 if (tp->udev->speed == USB_SPEED_SUPER) {
1663 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH,
1664 RX_THR_SUPPER);
1665 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_EARLY_AGG,
1666 EARLY_AGG_SUPPER);
1667 } else {
1668 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH,
1669 RX_THR_HIGH);
1670 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_EARLY_AGG,
1671 EARLY_AGG_HIGH);
1672 }
1673 } else {
1674 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_SLOW);
1675 ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_EARLY_AGG,
1676 EARLY_AGG_SLOW);
1677 }
1678}
1679
1680static int rtl8153_enable(struct r8152 *tp)
1681{
1682 set_tx_qlen(tp);
1683 rtl_set_eee_plus(tp);
1684 r8153_set_rx_agg(tp);
1685
1686 return rtl_enable(tp);
1687}
1688
1500static void rtl8152_disable(struct r8152 *tp) 1689static void rtl8152_disable(struct r8152 *tp)
1501{ 1690{
1502 struct net_device_stats *stats = rtl8152_get_stats(tp->netdev); 1691 struct net_device_stats *stats = rtl8152_get_stats(tp->netdev);
@@ -1695,15 +1884,269 @@ static inline void r8152b_enable_aldps(struct r8152 *tp)
1695 LINKENA | DIS_SDSAVE); 1884 LINKENA | DIS_SDSAVE);
1696} 1885}
1697 1886
1887static void r8153_hw_phy_cfg(struct r8152 *tp)
1888{
1889 u32 ocp_data;
1890 u16 data;
1891
1892 ocp_reg_write(tp, OCP_ADC_CFG, CKADSEL_L | ADC_EN | EN_EMI_L);
1893 r8152_mdio_write(tp, MII_BMCR, BMCR_ANENABLE);
1894
1895 if (tp->version == RTL_VER_03) {
1896 data = ocp_reg_read(tp, OCP_EEE_CFG);
1897 data &= ~CTAP_SHORT_EN;
1898 ocp_reg_write(tp, OCP_EEE_CFG, data);
1899 }
1900
1901 data = ocp_reg_read(tp, OCP_POWER_CFG);
1902 data |= EEE_CLKDIV_EN;
1903 ocp_reg_write(tp, OCP_POWER_CFG, data);
1904
1905 data = ocp_reg_read(tp, OCP_DOWN_SPEED);
1906 data |= EN_10M_BGOFF;
1907 ocp_reg_write(tp, OCP_DOWN_SPEED, data);
1908 data = ocp_reg_read(tp, OCP_POWER_CFG);
1909 data |= EN_10M_PLLOFF;
1910 ocp_reg_write(tp, OCP_POWER_CFG, data);
1911 data = sram_read(tp, SRAM_IMPEDANCE);
1912 data &= ~RX_DRIVING_MASK;
1913 sram_write(tp, SRAM_IMPEDANCE, data);
1914
1915 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
1916 ocp_data |= PFM_PWM_SWITCH;
1917 ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
1918
1919 data = sram_read(tp, SRAM_LPF_CFG);
1920 data |= LPF_AUTO_TUNE;
1921 sram_write(tp, SRAM_LPF_CFG, data);
1922
1923 data = sram_read(tp, SRAM_10M_AMP1);
1924 data |= GDAC_IB_UPALL;
1925 sram_write(tp, SRAM_10M_AMP1, data);
1926 data = sram_read(tp, SRAM_10M_AMP2);
1927 data |= AMP_DN;
1928 sram_write(tp, SRAM_10M_AMP2, data);
1929}
1930
1931static void r8153_u1u2en(struct r8152 *tp, int enable)
1932{
1933 u8 u1u2[8];
1934
1935 if (enable)
1936 memset(u1u2, 0xff, sizeof(u1u2));
1937 else
1938 memset(u1u2, 0x00, sizeof(u1u2));
1939
1940 usb_ocp_write(tp, USB_TOLERANCE, BYTE_EN_SIX_BYTES, sizeof(u1u2), u1u2);
1941}
1942
1943static void r8153_u2p3en(struct r8152 *tp, int enable)
1944{
1945 u32 ocp_data;
1946
1947 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL);
1948 if (enable)
1949 ocp_data |= U2P3_ENABLE;
1950 else
1951 ocp_data &= ~U2P3_ENABLE;
1952 ocp_write_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL, ocp_data);
1953}
1954
1955static void r8153_power_cut_en(struct r8152 *tp, int enable)
1956{
1957 u32 ocp_data;
1958
1959 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_POWER_CUT);
1960 if (enable)
1961 ocp_data |= PWR_EN | PHASE2_EN;
1962 else
1963 ocp_data &= ~(PWR_EN | PHASE2_EN);
1964 ocp_write_word(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
1965
1966 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
1967 ocp_data &= ~PCUT_STATUS;
1968 ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
1969}
1970
1971static void r8153_teredo_off(struct r8152 *tp)
1972{
1973 u32 ocp_data;
1974
1975 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
1976 ocp_data &= ~(TEREDO_SEL | TEREDO_RS_EVENT_MASK | OOB_TEREDO_EN);
1977 ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, ocp_data);
1978
1979 ocp_write_word(tp, MCU_TYPE_PLA, PLA_WDT6_CTRL, WDT6_SET_MODE);
1980 ocp_write_word(tp, MCU_TYPE_PLA, PLA_REALWOW_TIMER, 0);
1981 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0);
1982}
1983
1984static void r8153_first_init(struct r8152 *tp)
1985{
1986 u32 ocp_data;
1987 int i;
1988
1989 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MISC_1);
1990 ocp_data |= RXDY_GATED_EN;
1991 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data);
1992
1993 r8153_teredo_off(tp);
1994
1995 ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
1996 ocp_data &= ~RCR_ACPT_ALL;
1997 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
1998
1999 r8153_hw_phy_cfg(tp);
2000
2001 rtl8152_nic_reset(tp);
2002
2003 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2004 ocp_data &= ~NOW_IS_OOB;
2005 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
2006
2007 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
2008 ocp_data &= ~MCU_BORW_EN;
2009 ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
2010
2011 for (i = 0; i < 1000; i++) {
2012 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2013 if (ocp_data & LINK_LIST_READY)
2014 break;
2015 mdelay(1);
2016 }
2017
2018 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
2019 ocp_data |= RE_INIT_LL;
2020 ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
2021
2022 for (i = 0; i < 1000; i++) {
2023 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2024 if (ocp_data & LINK_LIST_READY)
2025 break;
2026 mdelay(1);
2027 }
2028
2029 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
2030 ocp_data &= ~CPCR_RX_VLAN;
2031 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
2032
2033 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
2034
2035 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
2036 ocp_data |= TCR0_AUTO_FIFO;
2037 ocp_write_word(tp, MCU_TYPE_PLA, PLA_TCR0, ocp_data);
2038
2039 rtl8152_nic_reset(tp);
2040
2041 /* rx share fifo credit full threshold */
2042 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
2043 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_NORMAL);
2044 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_NORMAL);
2045 /* TX share fifo free credit full threshold */
2046 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL2);
2047
2048 // rx aggregation
2049 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
2050 ocp_data &= ~RX_AGG_DISABLE;
2051 ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
2052}
2053
2054static void r8153_enter_oob(struct r8152 *tp)
2055{
2056 u32 ocp_data;
2057 int i;
2058
2059 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2060 ocp_data &= ~NOW_IS_OOB;
2061 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
2062
2063 rtl8152_disable(tp);
2064
2065 for (i = 0; i < 1000; i++) {
2066 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2067 if (ocp_data & LINK_LIST_READY)
2068 break;
2069 mdelay(1);
2070 }
2071
2072 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
2073 ocp_data |= RE_INIT_LL;
2074 ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
2075
2076 for (i = 0; i < 1000; i++) {
2077 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2078 if (ocp_data & LINK_LIST_READY)
2079 break;
2080 mdelay(1);
2081 }
2082
2083 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
2084
2085 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CFG_WOL);
2086 ocp_data |= MAGIC_EN;
2087 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CFG_WOL, ocp_data);
2088
2089 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
2090 ocp_data &= ~TEREDO_WAKE_MASK;
2091 ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, ocp_data);
2092
2093 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
2094 ocp_data |= CPCR_RX_VLAN;
2095 ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
2096
2097 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
2098 ocp_data |= ALDPS_PROXY_MODE;
2099 ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
2100
2101 ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
2102 ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
2103 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
2104
2105 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG5, LAN_WAKE_EN);
2106
2107 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MISC_1);
2108 ocp_data &= ~RXDY_GATED_EN;
2109 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data);
2110
2111 ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
2112 ocp_data |= RCR_APM | RCR_AM | RCR_AB;
2113 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
2114}
2115
2116static void r8153_disable_aldps(struct r8152 *tp)
2117{
2118 u16 data;
2119
2120 data = ocp_reg_read(tp, OCP_POWER_CFG);
2121 data &= ~EN_ALDPS;
2122 ocp_reg_write(tp, OCP_POWER_CFG, data);
2123 msleep(20);
2124}
2125
2126static void r8153_enable_aldps(struct r8152 *tp)
2127{
2128 u16 data;
2129
2130 data = ocp_reg_read(tp, OCP_POWER_CFG);
2131 data |= EN_ALDPS;
2132 ocp_reg_write(tp, OCP_POWER_CFG, data);
2133}
2134
1698static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex) 2135static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex)
1699{ 2136{
1700 u16 bmcr, anar; 2137 u16 bmcr, anar, gbcr;
1701 int ret = 0; 2138 int ret = 0;
1702 2139
1703 cancel_delayed_work_sync(&tp->schedule); 2140 cancel_delayed_work_sync(&tp->schedule);
1704 anar = r8152_mdio_read(tp, MII_ADVERTISE); 2141 anar = r8152_mdio_read(tp, MII_ADVERTISE);
1705 anar &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL | 2142 anar &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
1706 ADVERTISE_100HALF | ADVERTISE_100FULL); 2143 ADVERTISE_100HALF | ADVERTISE_100FULL);
2144 if (tp->mii.supports_gmii) {
2145 gbcr = r8152_mdio_read(tp, MII_CTRL1000);
2146 gbcr &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
2147 } else {
2148 gbcr = 0;
2149 }
1707 2150
1708 if (autoneg == AUTONEG_DISABLE) { 2151 if (autoneg == AUTONEG_DISABLE) {
1709 if (speed == SPEED_10) { 2152 if (speed == SPEED_10) {
@@ -1712,6 +2155,9 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex)
1712 } else if (speed == SPEED_100) { 2155 } else if (speed == SPEED_100) {
1713 bmcr = BMCR_SPEED100; 2156 bmcr = BMCR_SPEED100;
1714 anar |= ADVERTISE_100HALF | ADVERTISE_100FULL; 2157 anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
2158 } else if (speed == SPEED_1000 && tp->mii.supports_gmii) {
2159 bmcr = BMCR_SPEED1000;
2160 gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
1715 } else { 2161 } else {
1716 ret = -EINVAL; 2162 ret = -EINVAL;
1717 goto out; 2163 goto out;
@@ -1733,6 +2179,16 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex)
1733 anar |= ADVERTISE_10HALF; 2179 anar |= ADVERTISE_10HALF;
1734 anar |= ADVERTISE_100HALF; 2180 anar |= ADVERTISE_100HALF;
1735 } 2181 }
2182 } else if (speed == SPEED_1000 && tp->mii.supports_gmii) {
2183 if (duplex == DUPLEX_FULL) {
2184 anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
2185 anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
2186 gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
2187 } else {
2188 anar |= ADVERTISE_10HALF;
2189 anar |= ADVERTISE_100HALF;
2190 gbcr |= ADVERTISE_1000HALF;
2191 }
1736 } else { 2192 } else {
1737 ret = -EINVAL; 2193 ret = -EINVAL;
1738 goto out; 2194 goto out;
@@ -1741,6 +2197,9 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex)
1741 bmcr = BMCR_ANENABLE | BMCR_ANRESTART; 2197 bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
1742 } 2198 }
1743 2199
2200 if (tp->mii.supports_gmii)
2201 r8152_mdio_write(tp, MII_CTRL1000, gbcr);
2202
1744 r8152_mdio_write(tp, MII_ADVERTISE, anar); 2203 r8152_mdio_write(tp, MII_ADVERTISE, anar);
1745 r8152_mdio_write(tp, MII_BMCR, bmcr); 2204 r8152_mdio_write(tp, MII_BMCR, bmcr);
1746 2205
@@ -1762,6 +2221,15 @@ static void rtl8152_down(struct r8152 *tp)
1762 r8152b_enable_aldps(tp); 2221 r8152b_enable_aldps(tp);
1763} 2222}
1764 2223
2224static void rtl8153_down(struct r8152 *tp)
2225{
2226 r8153_u1u2en(tp, 0);
2227 r8153_power_cut_en(tp, 0);
2228 r8153_disable_aldps(tp);
2229 r8153_enter_oob(tp);
2230 r8153_enable_aldps(tp);
2231}
2232
1765static void set_carrier(struct r8152 *tp) 2233static void set_carrier(struct r8152 *tp)
1766{ 2234{
1767 struct net_device *netdev = tp->netdev; 2235 struct net_device *netdev = tp->netdev;
@@ -1821,7 +2289,9 @@ static int rtl8152_open(struct net_device *netdev)
1821 return res; 2289 return res;
1822 } 2290 }
1823 2291
1824 rtl8152_set_speed(tp, AUTONEG_ENABLE, SPEED_100, DUPLEX_FULL); 2292 rtl8152_set_speed(tp, AUTONEG_ENABLE,
2293 tp->mii.supports_gmii ? SPEED_1000 : SPEED_100,
2294 DUPLEX_FULL);
1825 tp->speed = 0; 2295 tp->speed = 0;
1826 netif_carrier_off(netdev); 2296 netif_carrier_off(netdev);
1827 netif_start_queue(netdev); 2297 netif_start_queue(netdev);
@@ -1861,6 +2331,13 @@ static void rtl_clear_bp(struct r8152 *tp)
1861 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_BA, 0); 2331 ocp_write_word(tp, MCU_TYPE_USB, USB_BP_BA, 0);
1862} 2332}
1863 2333
2334static void r8153_clear_bp(struct r8152 *tp)
2335{
2336 ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0);
2337 ocp_write_byte(tp, MCU_TYPE_USB, USB_BP_EN, 0);
2338 rtl_clear_bp(tp);
2339}
2340
1864static void r8152b_enable_eee(struct r8152 *tp) 2341static void r8152b_enable_eee(struct r8152 *tp)
1865{ 2342{
1866 u32 ocp_data; 2343 u32 ocp_data;
@@ -1884,6 +2361,22 @@ static void r8152b_enable_eee(struct r8152 *tp)
1884 ocp_reg_write(tp, OCP_EEE_AR, 0x0000); 2361 ocp_reg_write(tp, OCP_EEE_AR, 0x0000);
1885} 2362}
1886 2363
2364static void r8153_enable_eee(struct r8152 *tp)
2365{
2366 u32 ocp_data;
2367 u16 data;
2368
2369 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EEE_CR);
2370 ocp_data |= EEE_RX_EN | EEE_TX_EN;
2371 ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_CR, ocp_data);
2372 data = ocp_reg_read(tp, OCP_EEE_CFG);
2373 data |= EEE10_EN;
2374 ocp_reg_write(tp, OCP_EEE_CFG, data);
2375 data = ocp_reg_read(tp, OCP_EEE_CFG2);
2376 data |= MY1000_EEE | MY100_EEE;
2377 ocp_reg_write(tp, OCP_EEE_CFG2, data);
2378}
2379
1887static void r8152b_enable_fc(struct r8152 *tp) 2380static void r8152b_enable_fc(struct r8152 *tp)
1888{ 2381{
1889 u16 anar; 2382 u16 anar;
@@ -1953,6 +2446,75 @@ static void r8152b_init(struct r8152 *tp)
1953 ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); 2446 ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
1954} 2447}
1955 2448
2449static void r8153_init(struct r8152 *tp)
2450{
2451 u32 ocp_data;
2452 int i;
2453
2454 r8153_u1u2en(tp, 0);
2455
2456 for (i = 0; i < 500; i++) {
2457 if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
2458 AUTOLOAD_DONE)
2459 break;
2460 msleep(20);
2461 }
2462
2463 for (i = 0; i < 500; i++) {
2464 ocp_data = ocp_reg_read(tp, OCP_PHY_STATUS) & PHY_STAT_MASK;
2465 if (ocp_data == PHY_STAT_LAN_ON || ocp_data == PHY_STAT_PWRDN)
2466 break;
2467 msleep(20);
2468 }
2469
2470 r8153_u2p3en(tp, 0);
2471
2472 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL);
2473 ocp_data &= ~TIMER11_EN;
2474 ocp_write_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL, ocp_data);
2475
2476 r8153_clear_bp(tp);
2477
2478 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
2479 ocp_data &= ~LED_MODE_MASK;
2480 ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
2481
2482 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_LPM_CTRL);
2483 ocp_data &= ~LPM_TIMER_MASK;
2484 if (tp->udev->speed == USB_SPEED_SUPER)
2485 ocp_data |= LPM_TIMER_500US;
2486 else
2487 ocp_data |= LPM_TIMER_500MS;
2488 ocp_write_byte(tp, MCU_TYPE_USB, USB_LPM_CTRL, ocp_data);
2489
2490 ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2);
2491 ocp_data &= ~SEN_VAL_MASK;
2492 ocp_data |= SEN_VAL_NORMAL | SEL_RXIDLE;
2493 ocp_write_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2, ocp_data);
2494
2495 r8153_power_cut_en(tp, 0);
2496 r8153_u1u2en(tp, 1);
2497
2498 r8153_first_init(tp);
2499
2500 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ALDPS_SPDWN_RATIO);
2501 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, EEE_SPDWN_RATIO);
2502 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3,
2503 PKT_AVAIL_SPDWN_EN | SUSPEND_SPDWN_EN |
2504 U1U2_SPDWN_EN | L1_SPDWN_EN);
2505 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4,
2506 PWRSAVE_SPDWN_EN | RXDV_SPDWN_EN | TX10MIDLE_EN |
2507 TP100_SPDWN_EN | TP500_SPDWN_EN | TP1000_SPDWN_EN |
2508 EEE_SPDWN_EN);
2509
2510 r8153_enable_eee(tp);
2511 r8153_enable_aldps(tp);
2512 r8152b_enable_fc(tp);
2513
2514 r8152_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE |
2515 BMCR_ANRESTART);
2516}
2517
1956static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message) 2518static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)
1957{ 2519{
1958 struct r8152 *tp = usb_get_intfdata(intf); 2520 struct r8152 *tp = usb_get_intfdata(intf);
@@ -1978,7 +2540,9 @@ static int rtl8152_resume(struct usb_interface *intf)
1978 tp->rtl_ops.init(tp); 2540 tp->rtl_ops.init(tp);
1979 netif_device_attach(tp->netdev); 2541 netif_device_attach(tp->netdev);
1980 if (netif_running(tp->netdev)) { 2542 if (netif_running(tp->netdev)) {
1981 rtl8152_set_speed(tp, AUTONEG_ENABLE, SPEED_100, DUPLEX_FULL); 2543 rtl8152_set_speed(tp, AUTONEG_ENABLE,
2544 tp->mii.supports_gmii ? SPEED_1000 : SPEED_100,
2545 DUPLEX_FULL);
1982 tp->speed = 0; 2546 tp->speed = 0;
1983 netif_carrier_off(tp->netdev); 2547 netif_carrier_off(tp->netdev);
1984 set_bit(WORK_ENABLE, &tp->flags); 2548 set_bit(WORK_ENABLE, &tp->flags);
@@ -2082,6 +2646,18 @@ static void r8152b_get_version(struct r8152 *tp)
2082 case 0x4c10: 2646 case 0x4c10:
2083 tp->version = RTL_VER_02; 2647 tp->version = RTL_VER_02;
2084 break; 2648 break;
2649 case 0x5c00:
2650 tp->version = RTL_VER_03;
2651 tp->mii.supports_gmii = 1;
2652 break;
2653 case 0x5c10:
2654 tp->version = RTL_VER_04;
2655 tp->mii.supports_gmii = 1;
2656 break;
2657 case 0x5c20:
2658 tp->version = RTL_VER_05;
2659 tp->mii.supports_gmii = 1;
2660 break;
2085 default: 2661 default:
2086 netif_info(tp, probe, tp->netdev, 2662 netif_info(tp, probe, tp->netdev,
2087 "Unknown version 0x%04x\n", version); 2663 "Unknown version 0x%04x\n", version);
@@ -2104,6 +2680,11 @@ static void rtl8152_unload(struct r8152 *tp)
2104 ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data); 2680 ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data);
2105} 2681}
2106 2682
2683static void rtl8153_unload(struct r8152 *tp)
2684{
2685 r8153_power_cut_en(tp, 1);
2686}
2687
2107static bool rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id) 2688static bool rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id)
2108{ 2689{
2109 struct rtl_ops *ops = &tp->rtl_ops; 2690 struct rtl_ops *ops = &tp->rtl_ops;
@@ -2119,6 +2700,28 @@ static bool rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id)
2119 ops->down = rtl8152_down; 2700 ops->down = rtl8152_down;
2120 ops->unload = rtl8152_unload; 2701 ops->unload = rtl8152_unload;
2121 break; 2702 break;
2703 case PRODUCT_ID_RTL8153:
2704 ops->init = r8153_init;
2705 ops->enable = rtl8153_enable;
2706 ops->disable = rtl8152_disable;
2707 ops->down = rtl8153_down;
2708 ops->unload = rtl8153_unload;
2709 break;
2710 default:
2711 ret = -EFAULT;
2712 break;
2713 }
2714 break;
2715
2716 case VENDOR_ID_SAMSUNG:
2717 switch (id->idProduct) {
2718 case PRODUCT_ID_SAMSUNG:
2719 ops->init = r8153_init;
2720 ops->enable = rtl8153_enable;
2721 ops->disable = rtl8152_disable;
2722 ops->down = rtl8153_down;
2723 ops->unload = rtl8153_unload;
2724 break;
2122 default: 2725 default:
2123 ret = false; 2726 ret = false;
2124 break; 2727 break;
@@ -2227,6 +2830,8 @@ static void rtl8152_disconnect(struct usb_interface *intf)
2227/* table of devices that work with this driver */ 2830/* table of devices that work with this driver */
2228static struct usb_device_id rtl8152_table[] = { 2831static struct usb_device_id rtl8152_table[] = {
2229 {USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8152)}, 2832 {USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8152)},
2833 {USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8153)},
2834 {USB_DEVICE(VENDOR_ID_SAMSUNG, PRODUCT_ID_SAMSUNG)},
2230 {} 2835 {}
2231}; 2836};
2232 2837
diff --git a/drivers/net/usb/r815x.c b/drivers/net/usb/r815x.c
index 2df2f4fb42a7..5fd2ca61d1e2 100644
--- a/drivers/net/usb/r815x.c
+++ b/drivers/net/usb/r815x.c
@@ -226,7 +226,7 @@ static const struct usb_device_id products[] = {
226{ 226{
227 USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM, 227 USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
228 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), 228 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
229#if defined(CONFIG_USB_RTL8153) || defined(CONFIG_USB_RTL8153_MODULE) 229#if defined(CONFIG_USB_RTL8152) || defined(CONFIG_USB_RTL8152_MODULE)
230 .driver_info = 0, 230 .driver_info = 0,
231#else 231#else
232 .driver_info = (unsigned long) &r8153_info, 232 .driver_info = (unsigned long) &r8153_info,