diff options
author | hayeswang <hayeswang@realtek.com> | 2014-01-01 22:25:10 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-01-01 22:54:15 -0500 |
commit | 43779f8dfb0051b2ecd5f17ea7ad089443278e82 (patch) | |
tree | 62e0e1cda157923e01d3f4d817f6e5568579deae | |
parent | 507605a83533bc828b283e36fb443901318214e9 (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.c | 10 | ||||
-rw-r--r-- | drivers/net/usb/r8152.c | 615 | ||||
-rw-r--r-- | drivers/net/usb/r815x.c | 2 |
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 | ||
490 | static const struct usb_device_id products[] = { | 491 | static 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 | |||
267 | enum rtl_register_content { | 402 | enum 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 { | |||
388 | enum rtl_version { | 528 | enum 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 | ||
851 | static 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 | |||
857 | static 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 | |||
707 | static int read_mii_word(struct net_device *netdev, int phy_id, int reg) | 863 | static 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 | ||
1656 | static 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 | |||
1680 | static 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 | |||
1500 | static void rtl8152_disable(struct r8152 *tp) | 1689 | static 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 | ||
1887 | static 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 | |||
1931 | static 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 | |||
1943 | static 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 | |||
1955 | static 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 | |||
1971 | static 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 | |||
1984 | static 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 | |||
2054 | static 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 | |||
2116 | static 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 | |||
2126 | static 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 | |||
1698 | static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex) | 2135 | static 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 | ||
2224 | static 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 | |||
1765 | static void set_carrier(struct r8152 *tp) | 2233 | static 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 | ||
2334 | static 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 | |||
1864 | static void r8152b_enable_eee(struct r8152 *tp) | 2341 | static 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 | ||
2364 | static 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 | |||
1887 | static void r8152b_enable_fc(struct r8152 *tp) | 2380 | static 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 | ||
2449 | static 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 | |||
1956 | static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message) | 2518 | static 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 | ||
2683 | static void rtl8153_unload(struct r8152 *tp) | ||
2684 | { | ||
2685 | r8153_power_cut_en(tp, 1); | ||
2686 | } | ||
2687 | |||
2107 | static bool rtl_ops_init(struct r8152 *tp, const struct usb_device_id *id) | 2688 | static 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 */ |
2228 | static struct usb_device_id rtl8152_table[] = { | 2831 | static 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, |