r8152.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015 Realtek Semiconductor Corp. All rights reserved.
  4. *
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <errno.h>
  9. #include <malloc.h>
  10. #include <memalign.h>
  11. #include <usb.h>
  12. #include <usb/lin_gadget_compat.h>
  13. #include <linux/mii.h>
  14. #include <linux/bitops.h>
  15. #include "usb_ether.h"
  16. #include "r8152.h"
  17. #ifndef CONFIG_DM_ETH
  18. /* local vars */
  19. static int curr_eth_dev; /* index for name of next device detected */
  20. struct r8152_dongle {
  21. unsigned short vendor;
  22. unsigned short product;
  23. };
  24. static const struct r8152_dongle r8152_dongles[] = {
  25. /* Realtek */
  26. { 0x0bda, 0x8050 },
  27. { 0x0bda, 0x8152 },
  28. { 0x0bda, 0x8153 },
  29. /* Samsung */
  30. { 0x04e8, 0xa101 },
  31. /* Lenovo */
  32. { 0x17ef, 0x304f },
  33. { 0x17ef, 0x3052 },
  34. { 0x17ef, 0x3054 },
  35. { 0x17ef, 0x3057 },
  36. { 0x17ef, 0x7205 },
  37. { 0x17ef, 0x720a },
  38. { 0x17ef, 0x720b },
  39. { 0x17ef, 0x720c },
  40. /* TP-LINK */
  41. { 0x2357, 0x0601 },
  42. /* Nvidia */
  43. { 0x0955, 0x09ff },
  44. };
  45. #endif
  46. struct r8152_version {
  47. unsigned short tcr;
  48. unsigned short version;
  49. bool gmii;
  50. };
  51. static const struct r8152_version r8152_versions[] = {
  52. { 0x4c00, RTL_VER_01, 0 },
  53. { 0x4c10, RTL_VER_02, 0 },
  54. { 0x5c00, RTL_VER_03, 1 },
  55. { 0x5c10, RTL_VER_04, 1 },
  56. { 0x5c20, RTL_VER_05, 1 },
  57. { 0x5c30, RTL_VER_06, 1 },
  58. { 0x4800, RTL_VER_07, 0 },
  59. };
  60. static
  61. int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
  62. {
  63. ALLOC_CACHE_ALIGN_BUFFER(void *, tmp, size);
  64. int ret;
  65. ret = usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0),
  66. RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
  67. value, index, tmp, size, 500);
  68. memcpy(data, tmp, size);
  69. return ret;
  70. }
  71. static
  72. int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
  73. {
  74. ALLOC_CACHE_ALIGN_BUFFER(void *, tmp, size);
  75. memcpy(tmp, data, size);
  76. return usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0),
  77. RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
  78. value, index, tmp, size, 500);
  79. }
  80. int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
  81. void *data, u16 type)
  82. {
  83. u16 burst_size = 64;
  84. int ret;
  85. int txsize;
  86. /* both size and index must be 4 bytes align */
  87. if ((size & 3) || !size || (index & 3) || !data)
  88. return -EINVAL;
  89. if (index + size > 0xffff)
  90. return -EINVAL;
  91. while (size) {
  92. txsize = min(size, burst_size);
  93. ret = get_registers(tp, index, type, txsize, data);
  94. if (ret < 0)
  95. break;
  96. index += txsize;
  97. data += txsize;
  98. size -= txsize;
  99. }
  100. return ret;
  101. }
  102. int generic_ocp_write(struct r8152 *tp, u16 index, u16 byteen,
  103. u16 size, void *data, u16 type)
  104. {
  105. int ret;
  106. u16 byteen_start, byteen_end, byte_en_to_hw;
  107. u16 burst_size = 512;
  108. int txsize;
  109. /* both size and index must be 4 bytes align */
  110. if ((size & 3) || !size || (index & 3) || !data)
  111. return -EINVAL;
  112. if (index + size > 0xffff)
  113. return -EINVAL;
  114. byteen_start = byteen & BYTE_EN_START_MASK;
  115. byteen_end = byteen & BYTE_EN_END_MASK;
  116. byte_en_to_hw = byteen_start | (byteen_start << 4);
  117. ret = set_registers(tp, index, type | byte_en_to_hw, 4, data);
  118. if (ret < 0)
  119. return ret;
  120. index += 4;
  121. data += 4;
  122. size -= 4;
  123. if (size) {
  124. size -= 4;
  125. while (size) {
  126. txsize = min(size, burst_size);
  127. ret = set_registers(tp, index,
  128. type | BYTE_EN_DWORD,
  129. txsize, data);
  130. if (ret < 0)
  131. return ret;
  132. index += txsize;
  133. data += txsize;
  134. size -= txsize;
  135. }
  136. byte_en_to_hw = byteen_end | (byteen_end >> 4);
  137. ret = set_registers(tp, index, type | byte_en_to_hw, 4, data);
  138. if (ret < 0)
  139. return ret;
  140. }
  141. return ret;
  142. }
  143. int pla_ocp_read(struct r8152 *tp, u16 index, u16 size, void *data)
  144. {
  145. return generic_ocp_read(tp, index, size, data, MCU_TYPE_PLA);
  146. }
  147. int pla_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data)
  148. {
  149. return generic_ocp_write(tp, index, byteen, size, data, MCU_TYPE_PLA);
  150. }
  151. int usb_ocp_read(struct r8152 *tp, u16 index, u16 size, void *data)
  152. {
  153. return generic_ocp_read(tp, index, size, data, MCU_TYPE_USB);
  154. }
  155. int usb_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data)
  156. {
  157. return generic_ocp_write(tp, index, byteen, size, data, MCU_TYPE_USB);
  158. }
  159. u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index)
  160. {
  161. __le32 data;
  162. generic_ocp_read(tp, index, sizeof(data), &data, type);
  163. return __le32_to_cpu(data);
  164. }
  165. void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data)
  166. {
  167. __le32 tmp = __cpu_to_le32(data);
  168. generic_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(tmp), &tmp, type);
  169. }
  170. u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index)
  171. {
  172. u32 data;
  173. __le32 tmp;
  174. u8 shift = index & 2;
  175. index &= ~3;
  176. generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
  177. data = __le32_to_cpu(tmp);
  178. data >>= (shift * 8);
  179. data &= 0xffff;
  180. return data;
  181. }
  182. void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data)
  183. {
  184. u32 mask = 0xffff;
  185. __le32 tmp;
  186. u16 byen = BYTE_EN_WORD;
  187. u8 shift = index & 2;
  188. data &= mask;
  189. if (index & 2) {
  190. byen <<= shift;
  191. mask <<= (shift * 8);
  192. data <<= (shift * 8);
  193. index &= ~3;
  194. }
  195. tmp = __cpu_to_le32(data);
  196. generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
  197. }
  198. u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index)
  199. {
  200. u32 data;
  201. __le32 tmp;
  202. u8 shift = index & 3;
  203. index &= ~3;
  204. generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
  205. data = __le32_to_cpu(tmp);
  206. data >>= (shift * 8);
  207. data &= 0xff;
  208. return data;
  209. }
  210. void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
  211. {
  212. u32 mask = 0xff;
  213. __le32 tmp;
  214. u16 byen = BYTE_EN_BYTE;
  215. u8 shift = index & 3;
  216. data &= mask;
  217. if (index & 3) {
  218. byen <<= shift;
  219. mask <<= (shift * 8);
  220. data <<= (shift * 8);
  221. index &= ~3;
  222. }
  223. tmp = __cpu_to_le32(data);
  224. generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
  225. }
  226. u16 ocp_reg_read(struct r8152 *tp, u16 addr)
  227. {
  228. u16 ocp_base, ocp_index;
  229. ocp_base = addr & 0xf000;
  230. if (ocp_base != tp->ocp_base) {
  231. ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base);
  232. tp->ocp_base = ocp_base;
  233. }
  234. ocp_index = (addr & 0x0fff) | 0xb000;
  235. return ocp_read_word(tp, MCU_TYPE_PLA, ocp_index);
  236. }
  237. void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data)
  238. {
  239. u16 ocp_base, ocp_index;
  240. ocp_base = addr & 0xf000;
  241. if (ocp_base != tp->ocp_base) {
  242. ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, ocp_base);
  243. tp->ocp_base = ocp_base;
  244. }
  245. ocp_index = (addr & 0x0fff) | 0xb000;
  246. ocp_write_word(tp, MCU_TYPE_PLA, ocp_index, data);
  247. }
  248. static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value)
  249. {
  250. ocp_reg_write(tp, OCP_BASE_MII + reg_addr * 2, value);
  251. }
  252. static int r8152_mdio_read(struct r8152 *tp, u32 reg_addr)
  253. {
  254. return ocp_reg_read(tp, OCP_BASE_MII + reg_addr * 2);
  255. }
  256. void sram_write(struct r8152 *tp, u16 addr, u16 data)
  257. {
  258. ocp_reg_write(tp, OCP_SRAM_ADDR, addr);
  259. ocp_reg_write(tp, OCP_SRAM_DATA, data);
  260. }
  261. int r8152_wait_for_bit(struct r8152 *tp, bool ocp_reg, u16 type, u16 index,
  262. const u32 mask, bool set, unsigned int timeout)
  263. {
  264. u32 val;
  265. while (--timeout) {
  266. if (ocp_reg)
  267. val = ocp_reg_read(tp, index);
  268. else
  269. val = ocp_read_dword(tp, type, index);
  270. if (!set)
  271. val = ~val;
  272. if ((val & mask) == mask)
  273. return 0;
  274. mdelay(1);
  275. }
  276. debug("%s: Timeout (index=%04x mask=%08x timeout=%d)\n",
  277. __func__, index, mask, timeout);
  278. return -ETIMEDOUT;
  279. }
  280. static void r8152b_reset_packet_filter(struct r8152 *tp)
  281. {
  282. u32 ocp_data;
  283. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_FMC);
  284. ocp_data &= ~FMC_FCR_MCU_EN;
  285. ocp_write_word(tp, MCU_TYPE_PLA, PLA_FMC, ocp_data);
  286. ocp_data |= FMC_FCR_MCU_EN;
  287. ocp_write_word(tp, MCU_TYPE_PLA, PLA_FMC, ocp_data);
  288. }
  289. static void rtl8152_wait_fifo_empty(struct r8152 *tp)
  290. {
  291. int ret;
  292. ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_PHY_PWR,
  293. PLA_PHY_PWR_TXEMP, 1, R8152_WAIT_TIMEOUT);
  294. if (ret)
  295. debug("Timeout waiting for FIFO empty\n");
  296. ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_TCR0,
  297. TCR0_TX_EMPTY, 1, R8152_WAIT_TIMEOUT);
  298. if (ret)
  299. debug("Timeout waiting for TX empty\n");
  300. }
  301. static void rtl8152_nic_reset(struct r8152 *tp)
  302. {
  303. int ret;
  304. u32 ocp_data;
  305. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, BIST_CTRL);
  306. ocp_data |= BIST_CTRL_SW_RESET;
  307. ocp_write_dword(tp, MCU_TYPE_PLA, BIST_CTRL, ocp_data);
  308. ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, BIST_CTRL,
  309. BIST_CTRL_SW_RESET, 0, R8152_WAIT_TIMEOUT);
  310. if (ret)
  311. debug("Timeout waiting for NIC reset\n");
  312. }
  313. static u8 rtl8152_get_speed(struct r8152 *tp)
  314. {
  315. return ocp_read_byte(tp, MCU_TYPE_PLA, PLA_PHYSTATUS);
  316. }
  317. static void rtl_set_eee_plus(struct r8152 *tp)
  318. {
  319. u32 ocp_data;
  320. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EEEP_CR);
  321. ocp_data &= ~EEEP_CR_EEEP_TX;
  322. ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEEP_CR, ocp_data);
  323. }
  324. static void rxdy_gated_en(struct r8152 *tp, bool enable)
  325. {
  326. u32 ocp_data;
  327. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MISC_1);
  328. if (enable)
  329. ocp_data |= RXDY_GATED_EN;
  330. else
  331. ocp_data &= ~RXDY_GATED_EN;
  332. ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data);
  333. }
  334. static void rtl8152_set_rx_mode(struct r8152 *tp)
  335. {
  336. u32 ocp_data;
  337. __le32 tmp[2];
  338. tmp[0] = 0xffffffff;
  339. tmp[1] = 0xffffffff;
  340. pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(tmp), tmp);
  341. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  342. ocp_data |= RCR_APM | RCR_AM | RCR_AB;
  343. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  344. }
  345. static int rtl_enable(struct r8152 *tp)
  346. {
  347. u32 ocp_data;
  348. r8152b_reset_packet_filter(tp);
  349. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR);
  350. ocp_data |= PLA_CR_RE | PLA_CR_TE;
  351. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data);
  352. rxdy_gated_en(tp, false);
  353. rtl8152_set_rx_mode(tp);
  354. return 0;
  355. }
  356. static int rtl8152_enable(struct r8152 *tp)
  357. {
  358. rtl_set_eee_plus(tp);
  359. return rtl_enable(tp);
  360. }
  361. static void r8153_set_rx_early_timeout(struct r8152 *tp)
  362. {
  363. u32 ocp_data = tp->coalesce / 8;
  364. ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT, ocp_data);
  365. }
  366. static void r8153_set_rx_early_size(struct r8152 *tp)
  367. {
  368. u32 ocp_data = (RTL8152_AGG_BUF_SZ - RTL8153_RMS) / 4;
  369. ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);
  370. }
  371. static int rtl8153_enable(struct r8152 *tp)
  372. {
  373. rtl_set_eee_plus(tp);
  374. r8153_set_rx_early_timeout(tp);
  375. r8153_set_rx_early_size(tp);
  376. return rtl_enable(tp);
  377. }
  378. static void rtl_disable(struct r8152 *tp)
  379. {
  380. u32 ocp_data;
  381. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  382. ocp_data &= ~RCR_ACPT_ALL;
  383. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  384. rxdy_gated_en(tp, true);
  385. rtl8152_wait_fifo_empty(tp);
  386. rtl8152_nic_reset(tp);
  387. }
  388. static void r8152_power_cut_en(struct r8152 *tp, bool enable)
  389. {
  390. u32 ocp_data;
  391. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_UPS_CTRL);
  392. if (enable)
  393. ocp_data |= POWER_CUT;
  394. else
  395. ocp_data &= ~POWER_CUT;
  396. ocp_write_word(tp, MCU_TYPE_USB, USB_UPS_CTRL, ocp_data);
  397. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS);
  398. ocp_data &= ~RESUME_INDICATE;
  399. ocp_write_word(tp, MCU_TYPE_USB, USB_PM_CTRL_STATUS, ocp_data);
  400. }
  401. static void rtl_rx_vlan_en(struct r8152 *tp, bool enable)
  402. {
  403. u32 ocp_data;
  404. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
  405. if (enable)
  406. ocp_data |= CPCR_RX_VLAN;
  407. else
  408. ocp_data &= ~CPCR_RX_VLAN;
  409. ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
  410. }
  411. static void r8153_u1u2en(struct r8152 *tp, bool enable)
  412. {
  413. u8 u1u2[8];
  414. if (enable)
  415. memset(u1u2, 0xff, sizeof(u1u2));
  416. else
  417. memset(u1u2, 0x00, sizeof(u1u2));
  418. usb_ocp_write(tp, USB_TOLERANCE, BYTE_EN_SIX_BYTES, sizeof(u1u2), u1u2);
  419. }
  420. static void r8153_u2p3en(struct r8152 *tp, bool enable)
  421. {
  422. u32 ocp_data;
  423. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL);
  424. if (enable && tp->version != RTL_VER_03 && tp->version != RTL_VER_04)
  425. ocp_data |= U2P3_ENABLE;
  426. else
  427. ocp_data &= ~U2P3_ENABLE;
  428. ocp_write_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL, ocp_data);
  429. }
  430. static void r8153_power_cut_en(struct r8152 *tp, bool enable)
  431. {
  432. u32 ocp_data;
  433. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_POWER_CUT);
  434. if (enable)
  435. ocp_data |= PWR_EN | PHASE2_EN;
  436. else
  437. ocp_data &= ~(PWR_EN | PHASE2_EN);
  438. ocp_write_word(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  439. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
  440. ocp_data &= ~PCUT_STATUS;
  441. ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
  442. }
  443. static int r8152_read_mac(struct r8152 *tp, unsigned char *macaddr)
  444. {
  445. int ret;
  446. unsigned char enetaddr[8] = {0};
  447. ret = pla_ocp_read(tp, PLA_IDR, 8, enetaddr);
  448. if (ret < 0)
  449. return ret;
  450. memcpy(macaddr, enetaddr, ETH_ALEN);
  451. return 0;
  452. }
  453. static void r8152b_disable_aldps(struct r8152 *tp)
  454. {
  455. ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPDNPS | LINKENA | DIS_SDSAVE);
  456. mdelay(20);
  457. }
  458. static void r8152b_enable_aldps(struct r8152 *tp)
  459. {
  460. ocp_reg_write(tp, OCP_ALDPS_CONFIG, ENPWRSAVE | ENPDNPS |
  461. LINKENA | DIS_SDSAVE);
  462. }
  463. static void rtl8152_disable(struct r8152 *tp)
  464. {
  465. r8152b_disable_aldps(tp);
  466. rtl_disable(tp);
  467. r8152b_enable_aldps(tp);
  468. }
  469. static void r8152b_hw_phy_cfg(struct r8152 *tp)
  470. {
  471. u16 data;
  472. data = r8152_mdio_read(tp, MII_BMCR);
  473. if (data & BMCR_PDOWN) {
  474. data &= ~BMCR_PDOWN;
  475. r8152_mdio_write(tp, MII_BMCR, data);
  476. }
  477. r8152b_firmware(tp);
  478. }
  479. static void rtl8152_reinit_ll(struct r8152 *tp)
  480. {
  481. u32 ocp_data;
  482. int ret;
  483. ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_PHY_PWR,
  484. PLA_PHY_PWR_LLR, 1, R8152_WAIT_TIMEOUT);
  485. if (ret)
  486. debug("Timeout waiting for link list ready\n");
  487. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
  488. ocp_data |= RE_INIT_LL;
  489. ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
  490. ret = r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_PHY_PWR,
  491. PLA_PHY_PWR_LLR, 1, R8152_WAIT_TIMEOUT);
  492. if (ret)
  493. debug("Timeout waiting for link list ready\n");
  494. }
  495. static void r8152b_exit_oob(struct r8152 *tp)
  496. {
  497. u32 ocp_data;
  498. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  499. ocp_data &= ~RCR_ACPT_ALL;
  500. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  501. rxdy_gated_en(tp, true);
  502. r8152b_hw_phy_cfg(tp);
  503. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
  504. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, 0x00);
  505. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  506. ocp_data &= ~NOW_IS_OOB;
  507. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  508. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
  509. ocp_data &= ~MCU_BORW_EN;
  510. ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
  511. rtl8152_reinit_ll(tp);
  512. rtl8152_nic_reset(tp);
  513. /* rx share fifo credit full threshold */
  514. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
  515. if (tp->udev->speed == USB_SPEED_FULL ||
  516. tp->udev->speed == USB_SPEED_LOW) {
  517. /* rx share fifo credit near full threshold */
  518. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1,
  519. RXFIFO_THR2_FULL);
  520. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2,
  521. RXFIFO_THR3_FULL);
  522. } else {
  523. /* rx share fifo credit near full threshold */
  524. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1,
  525. RXFIFO_THR2_HIGH);
  526. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2,
  527. RXFIFO_THR3_HIGH);
  528. }
  529. /* TX share fifo free credit full threshold */
  530. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL);
  531. ocp_write_byte(tp, MCU_TYPE_USB, USB_TX_AGG, TX_AGG_MAX_THRESHOLD);
  532. ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_HIGH);
  533. ocp_write_dword(tp, MCU_TYPE_USB, USB_TX_DMA,
  534. TEST_MODE_DISABLE | TX_SIZE_ADJUST1);
  535. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
  536. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
  537. ocp_data |= TCR0_AUTO_FIFO;
  538. ocp_write_word(tp, MCU_TYPE_PLA, PLA_TCR0, ocp_data);
  539. }
  540. static void r8152b_enter_oob(struct r8152 *tp)
  541. {
  542. u32 ocp_data;
  543. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  544. ocp_data &= ~NOW_IS_OOB;
  545. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  546. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_OOB);
  547. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_OOB);
  548. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_OOB);
  549. rtl_disable(tp);
  550. rtl8152_reinit_ll(tp);
  551. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
  552. rtl_rx_vlan_en(tp, false);
  553. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
  554. ocp_data |= ALDPS_PROXY_MODE;
  555. ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
  556. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  557. ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
  558. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  559. rxdy_gated_en(tp, false);
  560. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  561. ocp_data |= RCR_APM | RCR_AM | RCR_AB;
  562. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  563. }
  564. static void r8153_hw_phy_cfg(struct r8152 *tp)
  565. {
  566. u32 ocp_data;
  567. u16 data;
  568. if (tp->version == RTL_VER_03 || tp->version == RTL_VER_04 ||
  569. tp->version == RTL_VER_05)
  570. ocp_reg_write(tp, OCP_ADC_CFG, CKADSEL_L | ADC_EN | EN_EMI_L);
  571. data = r8152_mdio_read(tp, MII_BMCR);
  572. if (data & BMCR_PDOWN) {
  573. data &= ~BMCR_PDOWN;
  574. r8152_mdio_write(tp, MII_BMCR, data);
  575. }
  576. r8153_firmware(tp);
  577. if (tp->version == RTL_VER_03) {
  578. data = ocp_reg_read(tp, OCP_EEE_CFG);
  579. data &= ~CTAP_SHORT_EN;
  580. ocp_reg_write(tp, OCP_EEE_CFG, data);
  581. }
  582. data = ocp_reg_read(tp, OCP_POWER_CFG);
  583. data |= EEE_CLKDIV_EN;
  584. ocp_reg_write(tp, OCP_POWER_CFG, data);
  585. data = ocp_reg_read(tp, OCP_DOWN_SPEED);
  586. data |= EN_10M_BGOFF;
  587. ocp_reg_write(tp, OCP_DOWN_SPEED, data);
  588. data = ocp_reg_read(tp, OCP_POWER_CFG);
  589. data |= EN_10M_PLLOFF;
  590. ocp_reg_write(tp, OCP_POWER_CFG, data);
  591. sram_write(tp, SRAM_IMPEDANCE, 0x0b13);
  592. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
  593. ocp_data |= PFM_PWM_SWITCH;
  594. ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
  595. /* Enable LPF corner auto tune */
  596. sram_write(tp, SRAM_LPF_CFG, 0xf70f);
  597. /* Adjust 10M Amplitude */
  598. sram_write(tp, SRAM_10M_AMP1, 0x00af);
  599. sram_write(tp, SRAM_10M_AMP2, 0x0208);
  600. }
  601. static void r8153_first_init(struct r8152 *tp)
  602. {
  603. u32 ocp_data;
  604. rxdy_gated_en(tp, true);
  605. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  606. ocp_data &= ~RCR_ACPT_ALL;
  607. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  608. r8153_hw_phy_cfg(tp);
  609. rtl8152_nic_reset(tp);
  610. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  611. ocp_data &= ~NOW_IS_OOB;
  612. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  613. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
  614. ocp_data &= ~MCU_BORW_EN;
  615. ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
  616. rtl8152_reinit_ll(tp);
  617. rtl_rx_vlan_en(tp, false);
  618. ocp_data = RTL8153_RMS;
  619. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
  620. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
  621. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
  622. ocp_data |= TCR0_AUTO_FIFO;
  623. ocp_write_word(tp, MCU_TYPE_PLA, PLA_TCR0, ocp_data);
  624. rtl8152_nic_reset(tp);
  625. /* rx share fifo credit full threshold */
  626. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, RXFIFO_THR1_NORMAL);
  627. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_NORMAL);
  628. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_NORMAL);
  629. /* TX share fifo free credit full threshold */
  630. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL2);
  631. /* rx aggregation */
  632. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  633. ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
  634. ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  635. }
  636. static void r8153_enter_oob(struct r8152 *tp)
  637. {
  638. u32 ocp_data;
  639. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  640. ocp_data &= ~NOW_IS_OOB;
  641. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  642. rtl_disable(tp);
  643. rtl8152_reinit_ll(tp);
  644. ocp_data = RTL8153_RMS;
  645. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
  646. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
  647. ocp_data &= ~TEREDO_WAKE_MASK;
  648. ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, ocp_data);
  649. rtl_rx_vlan_en(tp, false);
  650. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PAL_BDC_CR);
  651. ocp_data |= ALDPS_PROXY_MODE;
  652. ocp_write_word(tp, MCU_TYPE_PLA, PAL_BDC_CR, ocp_data);
  653. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  654. ocp_data |= NOW_IS_OOB | DIS_MCU_CLROOB;
  655. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  656. rxdy_gated_en(tp, false);
  657. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  658. ocp_data |= RCR_APM | RCR_AM | RCR_AB;
  659. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  660. }
  661. static void r8153_disable_aldps(struct r8152 *tp)
  662. {
  663. u16 data;
  664. data = ocp_reg_read(tp, OCP_POWER_CFG);
  665. data &= ~EN_ALDPS;
  666. ocp_reg_write(tp, OCP_POWER_CFG, data);
  667. mdelay(20);
  668. }
  669. static void rtl8153_disable(struct r8152 *tp)
  670. {
  671. r8153_disable_aldps(tp);
  672. rtl_disable(tp);
  673. }
  674. static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u16 speed, u8 duplex)
  675. {
  676. u16 bmcr, anar, gbcr;
  677. anar = r8152_mdio_read(tp, MII_ADVERTISE);
  678. anar &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
  679. ADVERTISE_100HALF | ADVERTISE_100FULL);
  680. if (tp->supports_gmii) {
  681. gbcr = r8152_mdio_read(tp, MII_CTRL1000);
  682. gbcr &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
  683. } else {
  684. gbcr = 0;
  685. }
  686. if (autoneg == AUTONEG_DISABLE) {
  687. if (speed == SPEED_10) {
  688. bmcr = 0;
  689. anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
  690. } else if (speed == SPEED_100) {
  691. bmcr = BMCR_SPEED100;
  692. anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
  693. } else if (speed == SPEED_1000 && tp->supports_gmii) {
  694. bmcr = BMCR_SPEED1000;
  695. gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
  696. } else {
  697. return -EINVAL;
  698. }
  699. if (duplex == DUPLEX_FULL)
  700. bmcr |= BMCR_FULLDPLX;
  701. } else {
  702. if (speed == SPEED_10) {
  703. if (duplex == DUPLEX_FULL)
  704. anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
  705. else
  706. anar |= ADVERTISE_10HALF;
  707. } else if (speed == SPEED_100) {
  708. if (duplex == DUPLEX_FULL) {
  709. anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
  710. anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
  711. } else {
  712. anar |= ADVERTISE_10HALF;
  713. anar |= ADVERTISE_100HALF;
  714. }
  715. } else if (speed == SPEED_1000 && tp->supports_gmii) {
  716. if (duplex == DUPLEX_FULL) {
  717. anar |= ADVERTISE_10HALF | ADVERTISE_10FULL;
  718. anar |= ADVERTISE_100HALF | ADVERTISE_100FULL;
  719. gbcr |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
  720. } else {
  721. anar |= ADVERTISE_10HALF;
  722. anar |= ADVERTISE_100HALF;
  723. gbcr |= ADVERTISE_1000HALF;
  724. }
  725. } else {
  726. return -EINVAL;
  727. }
  728. bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
  729. }
  730. if (tp->supports_gmii)
  731. r8152_mdio_write(tp, MII_CTRL1000, gbcr);
  732. r8152_mdio_write(tp, MII_ADVERTISE, anar);
  733. r8152_mdio_write(tp, MII_BMCR, bmcr);
  734. return 0;
  735. }
  736. static void rtl8152_up(struct r8152 *tp)
  737. {
  738. r8152b_disable_aldps(tp);
  739. r8152b_exit_oob(tp);
  740. r8152b_enable_aldps(tp);
  741. }
  742. static void rtl8152_down(struct r8152 *tp)
  743. {
  744. r8152_power_cut_en(tp, false);
  745. r8152b_disable_aldps(tp);
  746. r8152b_enter_oob(tp);
  747. r8152b_enable_aldps(tp);
  748. }
  749. static void rtl8153_up(struct r8152 *tp)
  750. {
  751. r8153_u1u2en(tp, false);
  752. r8153_disable_aldps(tp);
  753. r8153_first_init(tp);
  754. r8153_u2p3en(tp, false);
  755. }
  756. static void rtl8153_down(struct r8152 *tp)
  757. {
  758. r8153_u1u2en(tp, false);
  759. r8153_u2p3en(tp, false);
  760. r8153_power_cut_en(tp, false);
  761. r8153_disable_aldps(tp);
  762. r8153_enter_oob(tp);
  763. }
  764. static void r8152b_get_version(struct r8152 *tp)
  765. {
  766. u32 ocp_data;
  767. u16 tcr;
  768. int i;
  769. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR1);
  770. tcr = (u16)(ocp_data & VERSION_MASK);
  771. for (i = 0; i < ARRAY_SIZE(r8152_versions); i++) {
  772. if (tcr == r8152_versions[i].tcr) {
  773. /* Found a supported version */
  774. tp->version = r8152_versions[i].version;
  775. tp->supports_gmii = r8152_versions[i].gmii;
  776. break;
  777. }
  778. }
  779. if (tp->version == RTL_VER_UNKNOWN)
  780. debug("r8152 Unknown tcr version 0x%04x\n", tcr);
  781. }
  782. static void r8152b_enable_fc(struct r8152 *tp)
  783. {
  784. u16 anar;
  785. anar = r8152_mdio_read(tp, MII_ADVERTISE);
  786. anar |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
  787. r8152_mdio_write(tp, MII_ADVERTISE, anar);
  788. }
  789. static void rtl_tally_reset(struct r8152 *tp)
  790. {
  791. u32 ocp_data;
  792. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY);
  793. ocp_data |= TALLY_RESET;
  794. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data);
  795. }
  796. static void r8152b_init(struct r8152 *tp)
  797. {
  798. u32 ocp_data;
  799. r8152b_disable_aldps(tp);
  800. if (tp->version == RTL_VER_01) {
  801. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
  802. ocp_data &= ~LED_MODE_MASK;
  803. ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
  804. }
  805. r8152_power_cut_en(tp, false);
  806. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
  807. ocp_data |= TX_10M_IDLE_EN | PFM_PWM_SWITCH;
  808. ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
  809. ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL);
  810. ocp_data &= ~MCU_CLK_RATIO_MASK;
  811. ocp_data |= MCU_CLK_RATIO | D3_CLK_GATED_EN;
  812. ocp_write_dword(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, ocp_data);
  813. ocp_data = GPHY_STS_MSK | SPEED_DOWN_MSK |
  814. SPDWN_RXDV_MSK | SPDWN_LINKCHG_MSK;
  815. ocp_write_word(tp, MCU_TYPE_PLA, PLA_GPHY_INTR_IMR, ocp_data);
  816. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_TIMER);
  817. ocp_data |= BIT(15);
  818. ocp_write_word(tp, MCU_TYPE_USB, USB_USB_TIMER, ocp_data);
  819. ocp_write_word(tp, MCU_TYPE_USB, 0xcbfc, 0x03e8);
  820. ocp_data &= ~BIT(15);
  821. ocp_write_word(tp, MCU_TYPE_USB, USB_USB_TIMER, ocp_data);
  822. r8152b_enable_fc(tp);
  823. rtl_tally_reset(tp);
  824. /* enable rx aggregation */
  825. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  826. ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
  827. ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  828. }
  829. static void r8153_init(struct r8152 *tp)
  830. {
  831. int i;
  832. u32 ocp_data;
  833. r8153_disable_aldps(tp);
  834. r8153_u1u2en(tp, false);
  835. r8152_wait_for_bit(tp, 0, MCU_TYPE_PLA, PLA_BOOT_CTRL,
  836. AUTOLOAD_DONE, 1, R8152_WAIT_TIMEOUT);
  837. for (i = 0; i < R8152_WAIT_TIMEOUT; i++) {
  838. ocp_data = ocp_reg_read(tp, OCP_PHY_STATUS) & PHY_STAT_MASK;
  839. if (ocp_data == PHY_STAT_LAN_ON || ocp_data == PHY_STAT_PWRDN)
  840. break;
  841. mdelay(1);
  842. }
  843. r8153_u2p3en(tp, false);
  844. if (tp->version == RTL_VER_04) {
  845. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK2);
  846. ocp_data &= ~pwd_dn_scale_mask;
  847. ocp_data |= pwd_dn_scale(96);
  848. ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK2, ocp_data);
  849. ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_USB2PHY);
  850. ocp_data |= USB2PHY_L1 | USB2PHY_SUSPEND;
  851. ocp_write_byte(tp, MCU_TYPE_USB, USB_USB2PHY, ocp_data);
  852. } else if (tp->version == RTL_VER_05) {
  853. ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_DMY_REG0);
  854. ocp_data &= ~ECM_ALDPS;
  855. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_DMY_REG0, ocp_data);
  856. ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1);
  857. if (ocp_read_word(tp, MCU_TYPE_USB, USB_BURST_SIZE) == 0)
  858. ocp_data &= ~DYNAMIC_BURST;
  859. else
  860. ocp_data |= DYNAMIC_BURST;
  861. ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
  862. } else if (tp->version == RTL_VER_06) {
  863. ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1);
  864. if (ocp_read_word(tp, MCU_TYPE_USB, USB_BURST_SIZE) == 0)
  865. ocp_data &= ~DYNAMIC_BURST;
  866. else
  867. ocp_data |= DYNAMIC_BURST;
  868. ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY1, ocp_data);
  869. }
  870. ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2);
  871. ocp_data |= EP4_FULL_FC;
  872. ocp_write_byte(tp, MCU_TYPE_USB, USB_CSR_DUMMY2, ocp_data);
  873. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL);
  874. ocp_data &= ~TIMER11_EN;
  875. ocp_write_word(tp, MCU_TYPE_USB, USB_WDT11_CTRL, ocp_data);
  876. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE);
  877. ocp_data &= ~LED_MODE_MASK;
  878. ocp_write_word(tp, MCU_TYPE_PLA, PLA_LED_FEATURE, ocp_data);
  879. ocp_data = FIFO_EMPTY_1FB | ROK_EXIT_LPM;
  880. if (tp->version == RTL_VER_04 && tp->udev->speed != USB_SPEED_SUPER)
  881. ocp_data |= LPM_TIMER_500MS;
  882. else
  883. ocp_data |= LPM_TIMER_500US;
  884. ocp_write_byte(tp, MCU_TYPE_USB, USB_LPM_CTRL, ocp_data);
  885. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2);
  886. ocp_data &= ~SEN_VAL_MASK;
  887. ocp_data |= SEN_VAL_NORMAL | SEL_RXIDLE;
  888. ocp_write_word(tp, MCU_TYPE_USB, USB_AFE_CTRL2, ocp_data);
  889. ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001);
  890. r8153_power_cut_en(tp, false);
  891. r8152b_enable_fc(tp);
  892. rtl_tally_reset(tp);
  893. }
  894. static void rtl8152_unload(struct r8152 *tp)
  895. {
  896. if (tp->version != RTL_VER_01)
  897. r8152_power_cut_en(tp, true);
  898. }
  899. static void rtl8153_unload(struct r8152 *tp)
  900. {
  901. r8153_power_cut_en(tp, false);
  902. }
  903. static int rtl_ops_init(struct r8152 *tp)
  904. {
  905. struct rtl_ops *ops = &tp->rtl_ops;
  906. int ret = 0;
  907. switch (tp->version) {
  908. case RTL_VER_01:
  909. case RTL_VER_02:
  910. case RTL_VER_07:
  911. ops->init = r8152b_init;
  912. ops->enable = rtl8152_enable;
  913. ops->disable = rtl8152_disable;
  914. ops->up = rtl8152_up;
  915. ops->down = rtl8152_down;
  916. ops->unload = rtl8152_unload;
  917. break;
  918. case RTL_VER_03:
  919. case RTL_VER_04:
  920. case RTL_VER_05:
  921. case RTL_VER_06:
  922. ops->init = r8153_init;
  923. ops->enable = rtl8153_enable;
  924. ops->disable = rtl8153_disable;
  925. ops->up = rtl8153_up;
  926. ops->down = rtl8153_down;
  927. ops->unload = rtl8153_unload;
  928. break;
  929. default:
  930. ret = -ENODEV;
  931. printf("r8152 Unknown Device\n");
  932. break;
  933. }
  934. return ret;
  935. }
  936. static int r8152_init_common(struct r8152 *tp)
  937. {
  938. u8 speed;
  939. int timeout = 0;
  940. int link_detected;
  941. debug("** %s()\n", __func__);
  942. do {
  943. speed = rtl8152_get_speed(tp);
  944. link_detected = speed & LINK_STATUS;
  945. if (!link_detected) {
  946. if (timeout == 0)
  947. printf("Waiting for Ethernet connection... ");
  948. mdelay(TIMEOUT_RESOLUTION);
  949. timeout += TIMEOUT_RESOLUTION;
  950. }
  951. } while (!link_detected && timeout < PHY_CONNECT_TIMEOUT);
  952. if (link_detected) {
  953. tp->rtl_ops.enable(tp);
  954. if (timeout != 0)
  955. printf("done.\n");
  956. } else {
  957. printf("unable to connect.\n");
  958. }
  959. return 0;
  960. }
  961. static int r8152_send_common(struct ueth_data *ueth, void *packet, int length)
  962. {
  963. struct usb_device *udev = ueth->pusb_dev;
  964. u32 opts1, opts2 = 0;
  965. int err;
  966. int actual_len;
  967. ALLOC_CACHE_ALIGN_BUFFER(uint8_t, msg,
  968. PKTSIZE + sizeof(struct tx_desc));
  969. struct tx_desc *tx_desc = (struct tx_desc *)msg;
  970. debug("** %s(), len %d\n", __func__, length);
  971. opts1 = length | TX_FS | TX_LS;
  972. tx_desc->opts2 = cpu_to_le32(opts2);
  973. tx_desc->opts1 = cpu_to_le32(opts1);
  974. memcpy(msg + sizeof(struct tx_desc), (void *)packet, length);
  975. err = usb_bulk_msg(udev, usb_sndbulkpipe(udev, ueth->ep_out),
  976. (void *)msg, length + sizeof(struct tx_desc),
  977. &actual_len, USB_BULK_SEND_TIMEOUT);
  978. debug("Tx: len = %zu, actual = %u, err = %d\n",
  979. length + sizeof(struct tx_desc), actual_len, err);
  980. return err;
  981. }
  982. #ifndef CONFIG_DM_ETH
  983. static int r8152_init(struct eth_device *eth, bd_t *bd)
  984. {
  985. struct ueth_data *dev = (struct ueth_data *)eth->priv;
  986. struct r8152 *tp = (struct r8152 *)dev->dev_priv;
  987. return r8152_init_common(tp);
  988. }
  989. static int r8152_send(struct eth_device *eth, void *packet, int length)
  990. {
  991. struct ueth_data *dev = (struct ueth_data *)eth->priv;
  992. return r8152_send_common(dev, packet, length);
  993. }
  994. static int r8152_recv(struct eth_device *eth)
  995. {
  996. struct ueth_data *dev = (struct ueth_data *)eth->priv;
  997. ALLOC_CACHE_ALIGN_BUFFER(uint8_t, recv_buf, RTL8152_AGG_BUF_SZ);
  998. unsigned char *pkt_ptr;
  999. int err;
  1000. int actual_len;
  1001. u16 packet_len;
  1002. u32 bytes_process = 0;
  1003. struct rx_desc *rx_desc;
  1004. debug("** %s()\n", __func__);
  1005. err = usb_bulk_msg(dev->pusb_dev,
  1006. usb_rcvbulkpipe(dev->pusb_dev, dev->ep_in),
  1007. (void *)recv_buf,
  1008. RTL8152_AGG_BUF_SZ,
  1009. &actual_len,
  1010. USB_BULK_RECV_TIMEOUT);
  1011. debug("Rx: len = %u, actual = %u, err = %d\n", RTL8152_AGG_BUF_SZ,
  1012. actual_len, err);
  1013. if (err != 0) {
  1014. debug("Rx: failed to receive\n");
  1015. return -1;
  1016. }
  1017. if (actual_len > RTL8152_AGG_BUF_SZ) {
  1018. debug("Rx: received too many bytes %d\n", actual_len);
  1019. return -1;
  1020. }
  1021. while (bytes_process < actual_len) {
  1022. rx_desc = (struct rx_desc *)(recv_buf + bytes_process);
  1023. pkt_ptr = recv_buf + sizeof(struct rx_desc) + bytes_process;
  1024. packet_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK;
  1025. packet_len -= CRC_SIZE;
  1026. net_process_received_packet(pkt_ptr, packet_len);
  1027. bytes_process +=
  1028. (packet_len + sizeof(struct rx_desc) + CRC_SIZE);
  1029. if (bytes_process % 8)
  1030. bytes_process = bytes_process + 8 - (bytes_process % 8);
  1031. }
  1032. return 0;
  1033. }
  1034. static void r8152_halt(struct eth_device *eth)
  1035. {
  1036. struct ueth_data *dev = (struct ueth_data *)eth->priv;
  1037. struct r8152 *tp = (struct r8152 *)dev->dev_priv;
  1038. debug("** %s()\n", __func__);
  1039. tp->rtl_ops.disable(tp);
  1040. }
  1041. static int r8152_write_hwaddr(struct eth_device *eth)
  1042. {
  1043. struct ueth_data *dev = (struct ueth_data *)eth->priv;
  1044. struct r8152 *tp = (struct r8152 *)dev->dev_priv;
  1045. unsigned char enetaddr[8] = {0};
  1046. memcpy(enetaddr, eth->enetaddr, ETH_ALEN);
  1047. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
  1048. pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, enetaddr);
  1049. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
  1050. debug("MAC %pM\n", eth->enetaddr);
  1051. return 0;
  1052. }
  1053. void r8152_eth_before_probe(void)
  1054. {
  1055. curr_eth_dev = 0;
  1056. }
  1057. /* Probe to see if a new device is actually an realtek device */
  1058. int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
  1059. struct ueth_data *ss)
  1060. {
  1061. struct usb_interface *iface;
  1062. struct usb_interface_descriptor *iface_desc;
  1063. int ep_in_found = 0, ep_out_found = 0;
  1064. int i;
  1065. struct r8152 *tp;
  1066. /* let's examine the device now */
  1067. iface = &dev->config.if_desc[ifnum];
  1068. iface_desc = &dev->config.if_desc[ifnum].desc;
  1069. for (i = 0; i < ARRAY_SIZE(r8152_dongles); i++) {
  1070. if (dev->descriptor.idVendor == r8152_dongles[i].vendor &&
  1071. dev->descriptor.idProduct == r8152_dongles[i].product)
  1072. /* Found a supported dongle */
  1073. break;
  1074. }
  1075. if (i == ARRAY_SIZE(r8152_dongles))
  1076. return 0;
  1077. memset(ss, 0, sizeof(struct ueth_data));
  1078. /* At this point, we know we've got a live one */
  1079. debug("\n\nUSB Ethernet device detected: %#04x:%#04x\n",
  1080. dev->descriptor.idVendor, dev->descriptor.idProduct);
  1081. /* Initialize the ueth_data structure with some useful info */
  1082. ss->ifnum = ifnum;
  1083. ss->pusb_dev = dev;
  1084. ss->subclass = iface_desc->bInterfaceSubClass;
  1085. ss->protocol = iface_desc->bInterfaceProtocol;
  1086. /* alloc driver private */
  1087. ss->dev_priv = calloc(1, sizeof(struct r8152));
  1088. if (!ss->dev_priv)
  1089. return 0;
  1090. /*
  1091. * We are expecting a minimum of 3 endpoints - in, out (bulk), and
  1092. * int. We will ignore any others.
  1093. */
  1094. for (i = 0; i < iface_desc->bNumEndpoints; i++) {
  1095. /* is it an BULK endpoint? */
  1096. if ((iface->ep_desc[i].bmAttributes &
  1097. USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK) {
  1098. u8 ep_addr = iface->ep_desc[i].bEndpointAddress;
  1099. if ((ep_addr & USB_DIR_IN) && !ep_in_found) {
  1100. ss->ep_in = ep_addr &
  1101. USB_ENDPOINT_NUMBER_MASK;
  1102. ep_in_found = 1;
  1103. } else {
  1104. if (!ep_out_found) {
  1105. ss->ep_out = ep_addr &
  1106. USB_ENDPOINT_NUMBER_MASK;
  1107. ep_out_found = 1;
  1108. }
  1109. }
  1110. }
  1111. /* is it an interrupt endpoint? */
  1112. if ((iface->ep_desc[i].bmAttributes &
  1113. USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
  1114. ss->ep_int = iface->ep_desc[i].bEndpointAddress &
  1115. USB_ENDPOINT_NUMBER_MASK;
  1116. ss->irqinterval = iface->ep_desc[i].bInterval;
  1117. }
  1118. }
  1119. debug("Endpoints In %d Out %d Int %d\n",
  1120. ss->ep_in, ss->ep_out, ss->ep_int);
  1121. /* Do some basic sanity checks, and bail if we find a problem */
  1122. if (usb_set_interface(dev, iface_desc->bInterfaceNumber, 0) ||
  1123. !ss->ep_in || !ss->ep_out || !ss->ep_int) {
  1124. debug("Problems with device\n");
  1125. return 0;
  1126. }
  1127. dev->privptr = (void *)ss;
  1128. tp = ss->dev_priv;
  1129. tp->udev = dev;
  1130. tp->intf = iface;
  1131. r8152b_get_version(tp);
  1132. if (rtl_ops_init(tp))
  1133. return 0;
  1134. tp->rtl_ops.init(tp);
  1135. tp->rtl_ops.up(tp);
  1136. rtl8152_set_speed(tp, AUTONEG_ENABLE,
  1137. tp->supports_gmii ? SPEED_1000 : SPEED_100,
  1138. DUPLEX_FULL);
  1139. return 1;
  1140. }
  1141. int r8152_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
  1142. struct eth_device *eth)
  1143. {
  1144. if (!eth) {
  1145. debug("%s: missing parameter.\n", __func__);
  1146. return 0;
  1147. }
  1148. sprintf(eth->name, "%s#%d", R8152_BASE_NAME, curr_eth_dev++);
  1149. eth->init = r8152_init;
  1150. eth->send = r8152_send;
  1151. eth->recv = r8152_recv;
  1152. eth->halt = r8152_halt;
  1153. eth->write_hwaddr = r8152_write_hwaddr;
  1154. eth->priv = ss;
  1155. /* Get the MAC address */
  1156. if (r8152_read_mac(ss->dev_priv, eth->enetaddr) < 0)
  1157. return 0;
  1158. debug("MAC %pM\n", eth->enetaddr);
  1159. return 1;
  1160. }
  1161. #endif /* !CONFIG_DM_ETH */
  1162. #ifdef CONFIG_DM_ETH
  1163. static int r8152_eth_start(struct udevice *dev)
  1164. {
  1165. struct r8152 *tp = dev_get_priv(dev);
  1166. debug("** %s (%d)\n", __func__, __LINE__);
  1167. return r8152_init_common(tp);
  1168. }
  1169. void r8152_eth_stop(struct udevice *dev)
  1170. {
  1171. struct r8152 *tp = dev_get_priv(dev);
  1172. debug("** %s (%d)\n", __func__, __LINE__);
  1173. tp->rtl_ops.disable(tp);
  1174. }
  1175. int r8152_eth_send(struct udevice *dev, void *packet, int length)
  1176. {
  1177. struct r8152 *tp = dev_get_priv(dev);
  1178. return r8152_send_common(&tp->ueth, packet, length);
  1179. }
  1180. int r8152_eth_recv(struct udevice *dev, int flags, uchar **packetp)
  1181. {
  1182. struct r8152 *tp = dev_get_priv(dev);
  1183. struct ueth_data *ueth = &tp->ueth;
  1184. uint8_t *ptr;
  1185. int ret, len;
  1186. struct rx_desc *rx_desc;
  1187. u16 packet_len;
  1188. len = usb_ether_get_rx_bytes(ueth, &ptr);
  1189. debug("%s: first try, len=%d\n", __func__, len);
  1190. if (!len) {
  1191. if (!(flags & ETH_RECV_CHECK_DEVICE))
  1192. return -EAGAIN;
  1193. ret = usb_ether_receive(ueth, RTL8152_AGG_BUF_SZ);
  1194. if (ret)
  1195. return ret;
  1196. len = usb_ether_get_rx_bytes(ueth, &ptr);
  1197. debug("%s: second try, len=%d\n", __func__, len);
  1198. }
  1199. rx_desc = (struct rx_desc *)ptr;
  1200. packet_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK;
  1201. packet_len -= CRC_SIZE;
  1202. if (packet_len > len - (sizeof(struct rx_desc) + CRC_SIZE)) {
  1203. debug("Rx: too large packet: %d\n", packet_len);
  1204. goto err;
  1205. }
  1206. *packetp = ptr + sizeof(struct rx_desc);
  1207. return packet_len;
  1208. err:
  1209. usb_ether_advance_rxbuf(ueth, -1);
  1210. return -ENOSPC;
  1211. }
  1212. static int r8152_free_pkt(struct udevice *dev, uchar *packet, int packet_len)
  1213. {
  1214. struct r8152 *tp = dev_get_priv(dev);
  1215. packet_len += sizeof(struct rx_desc) + CRC_SIZE;
  1216. packet_len = ALIGN(packet_len, 8);
  1217. usb_ether_advance_rxbuf(&tp->ueth, packet_len);
  1218. return 0;
  1219. }
  1220. static int r8152_write_hwaddr(struct udevice *dev)
  1221. {
  1222. struct eth_pdata *pdata = dev_get_platdata(dev);
  1223. struct r8152 *tp = dev_get_priv(dev);
  1224. unsigned char enetaddr[8] = { 0 };
  1225. debug("** %s (%d)\n", __func__, __LINE__);
  1226. memcpy(enetaddr, pdata->enetaddr, ETH_ALEN);
  1227. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
  1228. pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, enetaddr);
  1229. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
  1230. debug("MAC %pM\n", pdata->enetaddr);
  1231. return 0;
  1232. }
  1233. int r8152_read_rom_hwaddr(struct udevice *dev)
  1234. {
  1235. struct eth_pdata *pdata = dev_get_platdata(dev);
  1236. struct r8152 *tp = dev_get_priv(dev);
  1237. debug("** %s (%d)\n", __func__, __LINE__);
  1238. r8152_read_mac(tp, pdata->enetaddr);
  1239. return 0;
  1240. }
  1241. static int r8152_eth_probe(struct udevice *dev)
  1242. {
  1243. struct usb_device *udev = dev_get_parent_priv(dev);
  1244. struct eth_pdata *pdata = dev_get_platdata(dev);
  1245. struct r8152 *tp = dev_get_priv(dev);
  1246. struct ueth_data *ueth = &tp->ueth;
  1247. int ret;
  1248. tp->udev = udev;
  1249. r8152_read_mac(tp, pdata->enetaddr);
  1250. r8152b_get_version(tp);
  1251. ret = rtl_ops_init(tp);
  1252. if (ret)
  1253. return ret;
  1254. tp->rtl_ops.init(tp);
  1255. tp->rtl_ops.up(tp);
  1256. rtl8152_set_speed(tp, AUTONEG_ENABLE,
  1257. tp->supports_gmii ? SPEED_1000 : SPEED_100,
  1258. DUPLEX_FULL);
  1259. return usb_ether_register(dev, ueth, RTL8152_AGG_BUF_SZ);
  1260. }
  1261. static const struct eth_ops r8152_eth_ops = {
  1262. .start = r8152_eth_start,
  1263. .send = r8152_eth_send,
  1264. .recv = r8152_eth_recv,
  1265. .free_pkt = r8152_free_pkt,
  1266. .stop = r8152_eth_stop,
  1267. .write_hwaddr = r8152_write_hwaddr,
  1268. .read_rom_hwaddr = r8152_read_rom_hwaddr,
  1269. };
  1270. U_BOOT_DRIVER(r8152_eth) = {
  1271. .name = "r8152_eth",
  1272. .id = UCLASS_ETH,
  1273. .probe = r8152_eth_probe,
  1274. .ops = &r8152_eth_ops,
  1275. .priv_auto_alloc_size = sizeof(struct r8152),
  1276. .platdata_auto_alloc_size = sizeof(struct eth_pdata),
  1277. };
  1278. static const struct usb_device_id r8152_eth_id_table[] = {
  1279. /* Realtek */
  1280. { USB_DEVICE(0x0bda, 0x8050) },
  1281. { USB_DEVICE(0x0bda, 0x8152) },
  1282. { USB_DEVICE(0x0bda, 0x8153) },
  1283. /* Samsung */
  1284. { USB_DEVICE(0x04e8, 0xa101) },
  1285. /* Lenovo */
  1286. { USB_DEVICE(0x17ef, 0x304f) },
  1287. { USB_DEVICE(0x17ef, 0x3052) },
  1288. { USB_DEVICE(0x17ef, 0x3054) },
  1289. { USB_DEVICE(0x17ef, 0x3057) },
  1290. { USB_DEVICE(0x17ef, 0x7205) },
  1291. { USB_DEVICE(0x17ef, 0x720a) },
  1292. { USB_DEVICE(0x17ef, 0x720b) },
  1293. { USB_DEVICE(0x17ef, 0x720c) },
  1294. /* TP-LINK */
  1295. { USB_DEVICE(0x2357, 0x0601) },
  1296. /* Nvidia */
  1297. { USB_DEVICE(0x0955, 0x09ff) },
  1298. { } /* Terminating entry */
  1299. };
  1300. U_BOOT_USB_DEVICE(r8152_eth, r8152_eth_id_table);
  1301. #endif /* CONFIG_DM_ETH */