793-v5.13-r8152-support-new-chips.patch 78 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886
  1. From e7439e7fd384f55f55837f7e4866e74d8dca3827 Mon Sep 17 00:00:00 2001
  2. From: Hayes Wang <[email protected]>
  3. Date: Fri, 16 Apr 2021 16:04:35 +0800
  4. Subject: [PATCH] r8152: support new chips
  5. commit 195aae321c829dd1945900d75561e6aa79cce208 upstream.
  6. Support RTL8153C, RTL8153D, RTL8156A, and RTL8156B. The RTL8156A
  7. and RTL8156B are the 2.5G ethernet.
  8. Signed-off-by: Hayes Wang <[email protected]>
  9. Signed-off-by: David S. Miller <[email protected]>
  10. ---
  11. drivers/net/usb/r8152.c | 2634 +++++++++++++++++++++++++++++++++++----
  12. 1 file changed, 2359 insertions(+), 275 deletions(-)
  13. --- a/drivers/net/usb/r8152.c
  14. +++ b/drivers/net/usb/r8152.c
  15. @@ -43,10 +43,14 @@
  16. #define PLA_IDR 0xc000
  17. #define PLA_RCR 0xc010
  18. +#define PLA_RCR1 0xc012
  19. #define PLA_RMS 0xc016
  20. #define PLA_RXFIFO_CTRL0 0xc0a0
  21. +#define PLA_RXFIFO_FULL 0xc0a2
  22. #define PLA_RXFIFO_CTRL1 0xc0a4
  23. +#define PLA_RX_FIFO_FULL 0xc0a6
  24. #define PLA_RXFIFO_CTRL2 0xc0a8
  25. +#define PLA_RX_FIFO_EMPTY 0xc0aa
  26. #define PLA_DMY_REG0 0xc0b0
  27. #define PLA_FMC 0xc0b4
  28. #define PLA_CFG_WOL 0xc0b6
  29. @@ -63,6 +67,8 @@
  30. #define PLA_MACDBG_PRE 0xd38c /* RTL_VER_04 only */
  31. #define PLA_MACDBG_POST 0xd38e /* RTL_VER_04 only */
  32. #define PLA_EXTRA_STATUS 0xd398
  33. +#define PLA_GPHY_CTRL 0xd3ae
  34. +#define PLA_POL_GPIO_CTRL 0xdc6a
  35. #define PLA_EFUSE_DATA 0xdd00
  36. #define PLA_EFUSE_CMD 0xdd02
  37. #define PLA_LEDSEL 0xdd90
  38. @@ -72,6 +78,8 @@
  39. #define PLA_LWAKE_CTRL_REG 0xe007
  40. #define PLA_GPHY_INTR_IMR 0xe022
  41. #define PLA_EEE_CR 0xe040
  42. +#define PLA_EEE_TXTWSYS 0xe04c
  43. +#define PLA_EEE_TXTWSYS_2P5G 0xe058
  44. #define PLA_EEEP_CR 0xe080
  45. #define PLA_MAC_PWR_CTRL 0xe0c0
  46. #define PLA_MAC_PWR_CTRL2 0xe0ca
  47. @@ -82,6 +90,7 @@
  48. #define PLA_TCR1 0xe612
  49. #define PLA_MTPS 0xe615
  50. #define PLA_TXFIFO_CTRL 0xe618
  51. +#define PLA_TXFIFO_FULL 0xe61a
  52. #define PLA_RSTTALLY 0xe800
  53. #define PLA_CR 0xe813
  54. #define PLA_CRWECR 0xe81c
  55. @@ -98,6 +107,7 @@
  56. #define PLA_SFF_STS_7 0xe8de
  57. #define PLA_PHYSTATUS 0xe908
  58. #define PLA_CONFIG6 0xe90a /* CONFIG6 */
  59. +#define PLA_USB_CFG 0xe952
  60. #define PLA_BP_BA 0xfc26
  61. #define PLA_BP_0 0xfc28
  62. #define PLA_BP_1 0xfc2a
  63. @@ -112,6 +122,7 @@
  64. #define USB_USB2PHY 0xb41e
  65. #define USB_SSPHYLINK1 0xb426
  66. #define USB_SSPHYLINK2 0xb428
  67. +#define USB_L1_CTRL 0xb45e
  68. #define USB_U2P3_CTRL 0xb460
  69. #define USB_CSR_DUMMY1 0xb464
  70. #define USB_CSR_DUMMY2 0xb466
  71. @@ -122,7 +133,12 @@
  72. #define USB_FW_FIX_EN0 0xcfca
  73. #define USB_FW_FIX_EN1 0xcfcc
  74. #define USB_LPM_CONFIG 0xcfd8
  75. +#define USB_ECM_OPTION 0xcfee
  76. #define USB_CSTMR 0xcfef /* RTL8153A */
  77. +#define USB_MISC_2 0xcfff
  78. +#define USB_ECM_OP 0xd26b
  79. +#define USB_GPHY_CTRL 0xd284
  80. +#define USB_SPEED_OPTION 0xd32a
  81. #define USB_FW_CTRL 0xd334 /* RTL8153B */
  82. #define USB_FC_TIMER 0xd340
  83. #define USB_USB_CTRL 0xd406
  84. @@ -136,16 +152,20 @@
  85. #define USB_RX_EXTRA_AGGR_TMR 0xd432 /* RTL8153B */
  86. #define USB_TX_DMA 0xd434
  87. #define USB_UPT_RXDMA_OWN 0xd437
  88. +#define USB_UPHY3_MDCMDIO 0xd480
  89. #define USB_TOLERANCE 0xd490
  90. #define USB_LPM_CTRL 0xd41a
  91. #define USB_BMU_RESET 0xd4b0
  92. +#define USB_BMU_CONFIG 0xd4b4
  93. #define USB_U1U2_TIMER 0xd4da
  94. #define USB_FW_TASK 0xd4e8 /* RTL8153B */
  95. +#define USB_RX_AGGR_NUM 0xd4ee
  96. #define USB_UPS_CTRL 0xd800
  97. #define USB_POWER_CUT 0xd80a
  98. #define USB_MISC_0 0xd81a
  99. #define USB_MISC_1 0xd81f
  100. #define USB_AFE_CTRL2 0xd824
  101. +#define USB_UPHY_XTAL 0xd826
  102. #define USB_UPS_CFG 0xd842
  103. #define USB_UPS_FLAGS 0xd848
  104. #define USB_WDT1_CTRL 0xe404
  105. @@ -188,6 +208,9 @@
  106. #define OCP_EEE_ABLE 0xa5c4
  107. #define OCP_EEE_ADV 0xa5d0
  108. #define OCP_EEE_LPABLE 0xa5d2
  109. +#define OCP_10GBT_CTRL 0xa5d4
  110. +#define OCP_10GBT_STAT 0xa5d6
  111. +#define OCP_EEE_ADV2 0xa6d4
  112. #define OCP_PHY_STATE 0xa708 /* nway state for 8153 */
  113. #define OCP_PHY_PATCH_STAT 0xb800
  114. #define OCP_PHY_PATCH_CMD 0xb820
  115. @@ -199,6 +222,7 @@
  116. /* SRAM Register */
  117. #define SRAM_GREEN_CFG 0x8011
  118. #define SRAM_LPF_CFG 0x8012
  119. +#define SRAM_GPHY_FW_VER 0x801e
  120. #define SRAM_10M_AMP1 0x8080
  121. #define SRAM_10M_AMP2 0x8082
  122. #define SRAM_IMPEDANCE 0x8084
  123. @@ -210,11 +234,19 @@
  124. #define RCR_AM 0x00000004
  125. #define RCR_AB 0x00000008
  126. #define RCR_ACPT_ALL (RCR_AAP | RCR_APM | RCR_AM | RCR_AB)
  127. +#define SLOT_EN BIT(11)
  128. +
  129. +/* PLA_RCR1 */
  130. +#define OUTER_VLAN BIT(7)
  131. +#define INNER_VLAN BIT(6)
  132. /* PLA_RXFIFO_CTRL0 */
  133. #define RXFIFO_THR1_NORMAL 0x00080002
  134. #define RXFIFO_THR1_OOB 0x01800003
  135. +/* PLA_RXFIFO_FULL */
  136. +#define RXFIFO_FULL_MASK 0xfff
  137. +
  138. /* PLA_RXFIFO_CTRL1 */
  139. #define RXFIFO_THR2_FULL 0x00000060
  140. #define RXFIFO_THR2_HIGH 0x00000038
  141. @@ -285,6 +317,7 @@
  142. #define MCU_BORW_EN 0x4000
  143. /* PLA_CPCR */
  144. +#define FLOW_CTRL_EN BIT(0)
  145. #define CPCR_RX_VLAN 0x0040
  146. /* PLA_CFG_WOL */
  147. @@ -310,6 +343,10 @@
  148. /* PLA_CONFIG6 */
  149. #define LANWAKE_CLR_EN BIT(0)
  150. +/* PLA_USB_CFG */
  151. +#define EN_XG_LIP BIT(1)
  152. +#define EN_G_LIP BIT(2)
  153. +
  154. /* PLA_CONFIG5 */
  155. #define BWF_EN 0x0040
  156. #define MWF_EN 0x0020
  157. @@ -333,6 +370,7 @@
  158. /* PLA_MAC_PWR_CTRL2 */
  159. #define EEE_SPDWN_RATIO 0x8007
  160. #define MAC_CLK_SPDWN_EN BIT(15)
  161. +#define EEE_SPDWN_RATIO_MASK 0xff
  162. /* PLA_MAC_PWR_CTRL3 */
  163. #define PLA_MCU_SPDWN_EN BIT(14)
  164. @@ -345,6 +383,7 @@
  165. #define PWRSAVE_SPDWN_EN 0x1000
  166. #define RXDV_SPDWN_EN 0x0800
  167. #define TX10MIDLE_EN 0x0100
  168. +#define IDLE_SPDWN_EN BIT(6)
  169. #define TP100_SPDWN_EN 0x0020
  170. #define TP500_SPDWN_EN 0x0010
  171. #define TP1000_SPDWN_EN 0x0008
  172. @@ -385,6 +424,13 @@
  173. #define LINK_CHANGE_FLAG BIT(8)
  174. #define POLL_LINK_CHG BIT(0)
  175. +/* PLA_GPHY_CTRL */
  176. +#define GPHY_FLASH BIT(1)
  177. +
  178. +/* PLA_POL_GPIO_CTRL */
  179. +#define DACK_DET_EN BIT(15)
  180. +#define POL_GPHY_PATCH BIT(4)
  181. +
  182. /* USB_USB2PHY */
  183. #define USB2PHY_SUSPEND 0x0001
  184. #define USB2PHY_L1 0x0002
  185. @@ -433,6 +479,9 @@
  186. #define BMU_RESET_EP_IN 0x01
  187. #define BMU_RESET_EP_OUT 0x02
  188. +/* USB_BMU_CONFIG */
  189. +#define ACT_ODMA BIT(1)
  190. +
  191. /* USB_UPT_RXDMA_OWN */
  192. #define OWN_UPDATE BIT(0)
  193. #define OWN_CLEAR BIT(1)
  194. @@ -440,27 +489,52 @@
  195. /* USB_FW_TASK */
  196. #define FC_PATCH_TASK BIT(1)
  197. +/* USB_RX_AGGR_NUM */
  198. +#define RX_AGGR_NUM_MASK 0x1ff
  199. +
  200. /* USB_UPS_CTRL */
  201. #define POWER_CUT 0x0100
  202. /* USB_PM_CTRL_STATUS */
  203. #define RESUME_INDICATE 0x0001
  204. +/* USB_ECM_OPTION */
  205. +#define BYPASS_MAC_RESET BIT(5)
  206. +
  207. /* USB_CSTMR */
  208. #define FORCE_SUPER BIT(0)
  209. +/* USB_MISC_2 */
  210. +#define UPS_FORCE_PWR_DOWN BIT(0)
  211. +
  212. +/* USB_ECM_OP */
  213. +#define EN_ALL_SPEED BIT(0)
  214. +
  215. +/* USB_GPHY_CTRL */
  216. +#define GPHY_PATCH_DONE BIT(2)
  217. +#define BYPASS_FLASH BIT(5)
  218. +#define BACKUP_RESTRORE BIT(6)
  219. +
  220. +/* USB_SPEED_OPTION */
  221. +#define RG_PWRDN_EN BIT(8)
  222. +#define ALL_SPEED_OFF BIT(9)
  223. +
  224. /* USB_FW_CTRL */
  225. #define FLOW_CTRL_PATCH_OPT BIT(1)
  226. +#define AUTO_SPEEDUP BIT(3)
  227. +#define FLOW_CTRL_PATCH_2 BIT(8)
  228. /* USB_FC_TIMER */
  229. #define CTRL_TIMER_EN BIT(15)
  230. /* USB_USB_CTRL */
  231. +#define CDC_ECM_EN BIT(3)
  232. #define RX_AGG_DISABLE 0x0010
  233. #define RX_ZERO_EN 0x0080
  234. /* USB_U2P3_CTRL */
  235. #define U2P3_ENABLE 0x0001
  236. +#define RX_DETECT8 BIT(3)
  237. /* USB_POWER_CUT */
  238. #define PWR_EN 0x0001
  239. @@ -496,8 +570,12 @@
  240. #define SEN_VAL_NORMAL 0xa000
  241. #define SEL_RXIDLE 0x0100
  242. +/* USB_UPHY_XTAL */
  243. +#define OOBS_POLLING BIT(8)
  244. +
  245. /* USB_UPS_CFG */
  246. #define SAW_CNT_1MS_MASK 0x0fff
  247. +#define MID_REVERSE BIT(5) /* RTL8156A */
  248. /* USB_UPS_FLAGS */
  249. #define UPS_FLAGS_R_TUNE BIT(0)
  250. @@ -505,6 +583,7 @@
  251. #define UPS_FLAGS_250M_CKDIV BIT(2)
  252. #define UPS_FLAGS_EN_ALDPS BIT(3)
  253. #define UPS_FLAGS_CTAP_SHORT_DIS BIT(4)
  254. +#define UPS_FLAGS_SPEED_MASK (0xf << 16)
  255. #define ups_flags_speed(x) ((x) << 16)
  256. #define UPS_FLAGS_EN_EEE BIT(20)
  257. #define UPS_FLAGS_EN_500M_EEE BIT(21)
  258. @@ -525,6 +604,8 @@ enum spd_duplex {
  259. FORCE_10M_FULL,
  260. FORCE_100M_HALF,
  261. FORCE_100M_FULL,
  262. + FORCE_1000M_FULL,
  263. + NWAY_2500M_FULL,
  264. };
  265. /* OCP_ALDPS_CONFIG */
  266. @@ -589,6 +670,9 @@ enum spd_duplex {
  267. #define EN_10M_CLKDIV BIT(11)
  268. #define EN_10M_BGOFF 0x0080
  269. +/* OCP_10GBT_CTRL */
  270. +#define RTL_ADV2_5G_F_R BIT(5) /* Advertise 2.5GBASE-T fast-retrain */
  271. +
  272. /* OCP_PHY_STATE */
  273. #define TXDIS_STATE 0x01
  274. #define ABD_STATE 0x02
  275. @@ -608,7 +692,8 @@ enum spd_duplex {
  276. #define EN_EMI_L 0x0040
  277. /* OCP_SYSCLK_CFG */
  278. -#define clk_div_expo(x) (min(x, 5) << 8)
  279. +#define sysclk_div_expo(x) (min(x, 5) << 8)
  280. +#define clk_div_expo(x) (min(x, 5) << 4)
  281. /* SRAM_GREEN_CFG */
  282. #define GREEN_ETH_EN BIT(15)
  283. @@ -639,6 +724,11 @@ enum spd_duplex {
  284. #define BP4_SUPER_ONLY 0x1578 /* RTL_VER_04 only */
  285. enum rtl_register_content {
  286. + _2500bps = BIT(10),
  287. + _1250bps = BIT(9),
  288. + _500bps = BIT(8),
  289. + _tx_flow = BIT(6),
  290. + _rx_flow = BIT(5),
  291. _1000bps = 0x10,
  292. _100bps = 0x08,
  293. _10bps = 0x04,
  294. @@ -646,6 +736,9 @@ enum rtl_register_content {
  295. FULL_DUP = 0x01,
  296. };
  297. +#define is_speed_2500(_speed) (((_speed) & (_2500bps | LINK_STATUS)) == (_2500bps | LINK_STATUS))
  298. +#define is_flow_control(_speed) (((_speed) & (_tx_flow | _rx_flow)) == (_tx_flow | _rx_flow))
  299. +
  300. #define RTL8152_MAX_TX 4
  301. #define RTL8152_MAX_RX 10
  302. #define INTBUFSIZE 2
  303. @@ -660,7 +753,6 @@ enum rtl_register_content {
  304. #define RTL8152_RMS (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
  305. #define RTL8153_RMS RTL8153_MAX_PACKET
  306. #define RTL8152_TX_TIMEOUT (5 * HZ)
  307. -#define RTL8152_NAPI_WEIGHT 64
  308. #define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN)
  309. #define size_to_mtu(s) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN)
  310. #define rx_reserved_size(x) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_ALIGN)
  311. @@ -797,6 +889,7 @@ struct r8152 {
  312. } rtl_ops;
  313. struct ups_info {
  314. + u32 r_tune:1;
  315. u32 _10m_ckdiv:1;
  316. u32 _250m_ckdiv:1;
  317. u32 aldps:1;
  318. @@ -838,7 +931,9 @@ struct r8152 {
  319. u32 rx_buf_sz;
  320. u32 rx_copybreak;
  321. u32 rx_pending;
  322. + u32 fc_pause_on, fc_pause_off;
  323. + u32 support_2500full:1;
  324. u16 ocp_base;
  325. u16 speed;
  326. u16 eee_adv;
  327. @@ -998,6 +1093,15 @@ enum rtl_version {
  328. RTL_VER_07,
  329. RTL_VER_08,
  330. RTL_VER_09,
  331. +
  332. + RTL_TEST_01,
  333. + RTL_VER_10,
  334. + RTL_VER_11,
  335. + RTL_VER_12,
  336. + RTL_VER_13,
  337. + RTL_VER_14,
  338. + RTL_VER_15,
  339. +
  340. RTL_VER_MAX
  341. };
  342. @@ -1013,6 +1117,7 @@ enum tx_csum_stat {
  343. #define RTL_ADVERTISED_100_FULL BIT(3)
  344. #define RTL_ADVERTISED_1000_HALF BIT(4)
  345. #define RTL_ADVERTISED_1000_FULL BIT(5)
  346. +#define RTL_ADVERTISED_2500_FULL BIT(6)
  347. /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
  348. * The RTL chips use a 64 element hash table based on the Ethernet CRC.
  349. @@ -2606,7 +2711,7 @@ static netdev_tx_t rtl8152_start_xmit(st
  350. static void r8152b_reset_packet_filter(struct r8152 *tp)
  351. {
  352. - u32 ocp_data;
  353. + u32 ocp_data;
  354. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_FMC);
  355. ocp_data &= ~FMC_FCR_MCU_EN;
  356. @@ -2617,14 +2722,47 @@ static void r8152b_reset_packet_filter(s
  357. static void rtl8152_nic_reset(struct r8152 *tp)
  358. {
  359. - int i;
  360. + u32 ocp_data;
  361. + int i;
  362. - ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, CR_RST);
  363. + switch (tp->version) {
  364. + case RTL_TEST_01:
  365. + case RTL_VER_10:
  366. + case RTL_VER_11:
  367. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR);
  368. + ocp_data &= ~CR_TE;
  369. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data);
  370. +
  371. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_BMU_RESET);
  372. + ocp_data &= ~BMU_RESET_EP_IN;
  373. + ocp_write_word(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data);
  374. +
  375. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  376. + ocp_data |= CDC_ECM_EN;
  377. + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  378. +
  379. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR);
  380. + ocp_data &= ~CR_RE;
  381. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, ocp_data);
  382. +
  383. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_BMU_RESET);
  384. + ocp_data |= BMU_RESET_EP_IN;
  385. + ocp_write_word(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data);
  386. +
  387. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  388. + ocp_data &= ~CDC_ECM_EN;
  389. + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  390. + break;
  391. - for (i = 0; i < 1000; i++) {
  392. - if (!(ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR) & CR_RST))
  393. - break;
  394. - usleep_range(100, 400);
  395. + default:
  396. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CR, CR_RST);
  397. +
  398. + for (i = 0; i < 1000; i++) {
  399. + if (!(ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CR) & CR_RST))
  400. + break;
  401. + usleep_range(100, 400);
  402. + }
  403. + break;
  404. }
  405. }
  406. @@ -2633,9 +2771,9 @@ static void set_tx_qlen(struct r8152 *tp
  407. tp->tx_qlen = agg_buf_sz / (mtu_to_size(tp->netdev->mtu) + sizeof(struct tx_desc));
  408. }
  409. -static inline u8 rtl8152_get_speed(struct r8152 *tp)
  410. +static inline u16 rtl8152_get_speed(struct r8152 *tp)
  411. {
  412. - return ocp_read_byte(tp, MCU_TYPE_PLA, PLA_PHYSTATUS);
  413. + return ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHYSTATUS);
  414. }
  415. static void rtl_eee_plus_en(struct r8152 *tp, bool enable)
  416. @@ -2795,6 +2933,7 @@ static int rtl_enable(struct r8152 *tp)
  417. switch (tp->version) {
  418. case RTL_VER_08:
  419. case RTL_VER_09:
  420. + case RTL_VER_14:
  421. r8153b_rx_agg_chg_indicate(tp);
  422. break;
  423. default:
  424. @@ -2832,6 +2971,7 @@ static void r8153_set_rx_early_timeout(s
  425. case RTL_VER_08:
  426. case RTL_VER_09:
  427. + case RTL_VER_14:
  428. /* The RTL8153B uses USB_RX_EXTRA_AGGR_TMR for rx timeout
  429. * primarily. For USB_RX_EARLY_TIMEOUT, we fix it to 128ns.
  430. */
  431. @@ -2841,6 +2981,18 @@ static void r8153_set_rx_early_timeout(s
  432. ocp_data);
  433. break;
  434. + case RTL_VER_10:
  435. + case RTL_VER_11:
  436. + case RTL_VER_12:
  437. + case RTL_VER_13:
  438. + case RTL_VER_15:
  439. + ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT,
  440. + 640 / 8);
  441. + ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EXTRA_AGGR_TMR,
  442. + ocp_data);
  443. + r8153b_rx_agg_chg_indicate(tp);
  444. + break;
  445. +
  446. default:
  447. break;
  448. }
  449. @@ -2860,8 +3012,19 @@ static void r8153_set_rx_early_size(stru
  450. break;
  451. case RTL_VER_08:
  452. case RTL_VER_09:
  453. + case RTL_VER_14:
  454. + ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE,
  455. + ocp_data / 8);
  456. + break;
  457. + case RTL_TEST_01:
  458. + case RTL_VER_10:
  459. + case RTL_VER_11:
  460. + case RTL_VER_12:
  461. + case RTL_VER_13:
  462. + case RTL_VER_15:
  463. ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE,
  464. ocp_data / 8);
  465. + r8153b_rx_agg_chg_indicate(tp);
  466. break;
  467. default:
  468. WARN_ON_ONCE(1);
  469. @@ -2871,6 +3034,8 @@ static void r8153_set_rx_early_size(stru
  470. static int rtl8153_enable(struct r8152 *tp)
  471. {
  472. + u32 ocp_data;
  473. +
  474. if (test_bit(RTL8152_UNPLUG, &tp->flags))
  475. return -ENODEV;
  476. @@ -2881,15 +3046,18 @@ static int rtl8153_enable(struct r8152 *
  477. rtl_set_ifg(tp, rtl8152_get_speed(tp));
  478. - if (tp->version == RTL_VER_09) {
  479. - u32 ocp_data;
  480. -
  481. + switch (tp->version) {
  482. + case RTL_VER_09:
  483. + case RTL_VER_14:
  484. ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK);
  485. ocp_data &= ~FC_PATCH_TASK;
  486. ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
  487. usleep_range(1000, 2000);
  488. ocp_data |= FC_PATCH_TASK;
  489. ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
  490. + break;
  491. + default:
  492. + break;
  493. }
  494. return rtl_enable(tp);
  495. @@ -2954,12 +3122,40 @@ static void rtl_rx_vlan_en(struct r8152
  496. {
  497. u32 ocp_data;
  498. - ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
  499. - if (enable)
  500. - ocp_data |= CPCR_RX_VLAN;
  501. - else
  502. - ocp_data &= ~CPCR_RX_VLAN;
  503. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
  504. + switch (tp->version) {
  505. + case RTL_VER_01:
  506. + case RTL_VER_02:
  507. + case RTL_VER_03:
  508. + case RTL_VER_04:
  509. + case RTL_VER_05:
  510. + case RTL_VER_06:
  511. + case RTL_VER_07:
  512. + case RTL_VER_08:
  513. + case RTL_VER_09:
  514. + case RTL_VER_14:
  515. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
  516. + if (enable)
  517. + ocp_data |= CPCR_RX_VLAN;
  518. + else
  519. + ocp_data &= ~CPCR_RX_VLAN;
  520. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
  521. + break;
  522. +
  523. + case RTL_TEST_01:
  524. + case RTL_VER_10:
  525. + case RTL_VER_11:
  526. + case RTL_VER_12:
  527. + case RTL_VER_13:
  528. + case RTL_VER_15:
  529. + default:
  530. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RCR1);
  531. + if (enable)
  532. + ocp_data |= OUTER_VLAN | INNER_VLAN;
  533. + else
  534. + ocp_data &= ~(OUTER_VLAN | INNER_VLAN);
  535. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RCR1, ocp_data);
  536. + break;
  537. + }
  538. }
  539. static int rtl8152_set_features(struct net_device *dev,
  540. @@ -3052,6 +3248,40 @@ static void __rtl_set_wol(struct r8152 *
  541. device_set_wakeup_enable(&tp->udev->dev, false);
  542. }
  543. +static void r8153_mac_clk_speed_down(struct r8152 *tp, bool enable)
  544. +{
  545. + u32 ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2);
  546. +
  547. + /* MAC clock speed down */
  548. + if (enable)
  549. + ocp_data |= MAC_CLK_SPDWN_EN;
  550. + else
  551. + ocp_data &= ~MAC_CLK_SPDWN_EN;
  552. +
  553. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data);
  554. +}
  555. +
  556. +static void r8156_mac_clk_spd(struct r8152 *tp, bool enable)
  557. +{
  558. + u32 ocp_data;
  559. +
  560. + /* MAC clock speed down */
  561. + if (enable) {
  562. + /* aldps_spdwn_ratio, tp10_spdwn_ratio */
  563. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL,
  564. + 0x0403);
  565. +
  566. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2);
  567. + ocp_data &= ~EEE_SPDWN_RATIO_MASK;
  568. + ocp_data |= MAC_CLK_SPDWN_EN | 0x03; /* eee_spdwn_ratio */
  569. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data);
  570. + } else {
  571. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2);
  572. + ocp_data &= ~MAC_CLK_SPDWN_EN;
  573. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data);
  574. + }
  575. +}
  576. +
  577. static void r8153_u1u2en(struct r8152 *tp, bool enable)
  578. {
  579. u8 u1u2[8];
  580. @@ -3111,6 +3341,9 @@ static void r8153b_ups_flags(struct r815
  581. if (tp->ups_info.eee_cmod_lv)
  582. ups_flags |= UPS_FLAGS_EEE_CMOD_LV_EN;
  583. + if (tp->ups_info.r_tune)
  584. + ups_flags |= UPS_FLAGS_R_TUNE;
  585. +
  586. if (tp->ups_info._10m_ckdiv)
  587. ups_flags |= UPS_FLAGS_EN_10M_CKDIV;
  588. @@ -3161,6 +3394,88 @@ static void r8153b_ups_flags(struct r815
  589. ocp_write_dword(tp, MCU_TYPE_USB, USB_UPS_FLAGS, ups_flags);
  590. }
  591. +static void r8156_ups_flags(struct r8152 *tp)
  592. +{
  593. + u32 ups_flags = 0;
  594. +
  595. + if (tp->ups_info.green)
  596. + ups_flags |= UPS_FLAGS_EN_GREEN;
  597. +
  598. + if (tp->ups_info.aldps)
  599. + ups_flags |= UPS_FLAGS_EN_ALDPS;
  600. +
  601. + if (tp->ups_info.eee)
  602. + ups_flags |= UPS_FLAGS_EN_EEE;
  603. +
  604. + if (tp->ups_info.flow_control)
  605. + ups_flags |= UPS_FLAGS_EN_FLOW_CTR;
  606. +
  607. + if (tp->ups_info.eee_ckdiv)
  608. + ups_flags |= UPS_FLAGS_EN_EEE_CKDIV;
  609. +
  610. + if (tp->ups_info._10m_ckdiv)
  611. + ups_flags |= UPS_FLAGS_EN_10M_CKDIV;
  612. +
  613. + if (tp->ups_info.eee_plloff_100)
  614. + ups_flags |= UPS_FLAGS_EEE_PLLOFF_100;
  615. +
  616. + if (tp->ups_info.eee_plloff_giga)
  617. + ups_flags |= UPS_FLAGS_EEE_PLLOFF_GIGA;
  618. +
  619. + if (tp->ups_info._250m_ckdiv)
  620. + ups_flags |= UPS_FLAGS_250M_CKDIV;
  621. +
  622. + switch (tp->ups_info.speed_duplex) {
  623. + case FORCE_10M_HALF:
  624. + ups_flags |= ups_flags_speed(0);
  625. + break;
  626. + case FORCE_10M_FULL:
  627. + ups_flags |= ups_flags_speed(1);
  628. + break;
  629. + case FORCE_100M_HALF:
  630. + ups_flags |= ups_flags_speed(2);
  631. + break;
  632. + case FORCE_100M_FULL:
  633. + ups_flags |= ups_flags_speed(3);
  634. + break;
  635. + case NWAY_10M_HALF:
  636. + ups_flags |= ups_flags_speed(4);
  637. + break;
  638. + case NWAY_10M_FULL:
  639. + ups_flags |= ups_flags_speed(5);
  640. + break;
  641. + case NWAY_100M_HALF:
  642. + ups_flags |= ups_flags_speed(6);
  643. + break;
  644. + case NWAY_100M_FULL:
  645. + ups_flags |= ups_flags_speed(7);
  646. + break;
  647. + case NWAY_1000M_FULL:
  648. + ups_flags |= ups_flags_speed(8);
  649. + break;
  650. + case NWAY_2500M_FULL:
  651. + ups_flags |= ups_flags_speed(9);
  652. + break;
  653. + default:
  654. + break;
  655. + }
  656. +
  657. + switch (tp->ups_info.lite_mode) {
  658. + case 1:
  659. + ups_flags |= 0 << 5;
  660. + break;
  661. + case 2:
  662. + ups_flags |= 2 << 5;
  663. + break;
  664. + case 0:
  665. + default:
  666. + ups_flags |= 1 << 5;
  667. + break;
  668. + }
  669. +
  670. + ocp_write_dword(tp, MCU_TYPE_USB, USB_UPS_FLAGS, ups_flags);
  671. +}
  672. +
  673. static void rtl_green_en(struct r8152 *tp, bool enable)
  674. {
  675. u16 data;
  676. @@ -3224,16 +3539,16 @@ static void r8153b_ups_en(struct r8152 *
  677. ocp_data |= UPS_EN | USP_PREWAKE | PHASE2_EN;
  678. ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  679. - ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, 0xcfff);
  680. - ocp_data |= BIT(0);
  681. - ocp_write_byte(tp, MCU_TYPE_USB, 0xcfff, ocp_data);
  682. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  683. + ocp_data |= UPS_FORCE_PWR_DOWN;
  684. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  685. } else {
  686. ocp_data &= ~(UPS_EN | USP_PREWAKE);
  687. ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  688. - ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, 0xcfff);
  689. - ocp_data &= ~BIT(0);
  690. - ocp_write_byte(tp, MCU_TYPE_USB, 0xcfff, ocp_data);
  691. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  692. + ocp_data &= ~UPS_FORCE_PWR_DOWN;
  693. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  694. if (ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0) & PCUT_STATUS) {
  695. int i;
  696. @@ -3253,6 +3568,95 @@ static void r8153b_ups_en(struct r8152 *
  697. }
  698. }
  699. +static void r8153c_ups_en(struct r8152 *tp, bool enable)
  700. +{
  701. + u32 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_POWER_CUT);
  702. +
  703. + if (enable) {
  704. + r8153b_ups_flags(tp);
  705. +
  706. + ocp_data |= UPS_EN | USP_PREWAKE | PHASE2_EN;
  707. + ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  708. +
  709. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  710. + ocp_data |= UPS_FORCE_PWR_DOWN;
  711. + ocp_data &= ~BIT(7);
  712. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  713. + } else {
  714. + ocp_data &= ~(UPS_EN | USP_PREWAKE);
  715. + ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  716. +
  717. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  718. + ocp_data &= ~UPS_FORCE_PWR_DOWN;
  719. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  720. +
  721. + if (ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0) & PCUT_STATUS) {
  722. + int i;
  723. +
  724. + for (i = 0; i < 500; i++) {
  725. + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
  726. + AUTOLOAD_DONE)
  727. + break;
  728. + msleep(20);
  729. + }
  730. +
  731. + tp->rtl_ops.hw_phy_cfg(tp);
  732. +
  733. + rtl8152_set_speed(tp, tp->autoneg, tp->speed,
  734. + tp->duplex, tp->advertising);
  735. + }
  736. +
  737. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
  738. +
  739. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG34);
  740. + ocp_data |= BIT(8);
  741. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG34, ocp_data);
  742. +
  743. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
  744. + }
  745. +}
  746. +
  747. +static void r8156_ups_en(struct r8152 *tp, bool enable)
  748. +{
  749. + u32 ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_POWER_CUT);
  750. +
  751. + if (enable) {
  752. + r8156_ups_flags(tp);
  753. +
  754. + ocp_data |= UPS_EN | USP_PREWAKE | PHASE2_EN;
  755. + ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  756. +
  757. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  758. + ocp_data |= UPS_FORCE_PWR_DOWN;
  759. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  760. +
  761. + switch (tp->version) {
  762. + case RTL_VER_13:
  763. + case RTL_VER_15:
  764. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_UPHY_XTAL);
  765. + ocp_data &= ~OOBS_POLLING;
  766. + ocp_write_byte(tp, MCU_TYPE_USB, USB_UPHY_XTAL, ocp_data);
  767. + break;
  768. + default:
  769. + break;
  770. + }
  771. + } else {
  772. + ocp_data &= ~(UPS_EN | USP_PREWAKE);
  773. + ocp_write_byte(tp, MCU_TYPE_USB, USB_POWER_CUT, ocp_data);
  774. +
  775. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  776. + ocp_data &= ~UPS_FORCE_PWR_DOWN;
  777. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  778. +
  779. + if (ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0) & PCUT_STATUS) {
  780. + tp->rtl_ops.hw_phy_cfg(tp);
  781. +
  782. + rtl8152_set_speed(tp, tp->autoneg, tp->speed,
  783. + tp->duplex, tp->advertising);
  784. + }
  785. + }
  786. +}
  787. +
  788. static void r8153_power_cut_en(struct r8152 *tp, bool enable)
  789. {
  790. u32 ocp_data;
  791. @@ -3382,6 +3786,38 @@ static void rtl8153b_runtime_enable(stru
  792. }
  793. }
  794. +static void rtl8153c_runtime_enable(struct r8152 *tp, bool enable)
  795. +{
  796. + if (enable) {
  797. + r8153_queue_wake(tp, true);
  798. + r8153b_u1u2en(tp, false);
  799. + r8153_u2p3en(tp, false);
  800. + rtl_runtime_suspend_enable(tp, true);
  801. + r8153c_ups_en(tp, true);
  802. + } else {
  803. + r8153c_ups_en(tp, false);
  804. + r8153_queue_wake(tp, false);
  805. + rtl_runtime_suspend_enable(tp, false);
  806. + r8153b_u1u2en(tp, true);
  807. + }
  808. +}
  809. +
  810. +static void rtl8156_runtime_enable(struct r8152 *tp, bool enable)
  811. +{
  812. + if (enable) {
  813. + r8153_queue_wake(tp, true);
  814. + r8153b_u1u2en(tp, false);
  815. + r8153_u2p3en(tp, false);
  816. + rtl_runtime_suspend_enable(tp, true);
  817. + } else {
  818. + r8153_queue_wake(tp, false);
  819. + rtl_runtime_suspend_enable(tp, false);
  820. + r8153_u2p3en(tp, true);
  821. + if (tp->udev->speed >= USB_SPEED_SUPER)
  822. + r8153b_u1u2en(tp, true);
  823. + }
  824. +}
  825. +
  826. static void r8153_teredo_off(struct r8152 *tp)
  827. {
  828. u32 ocp_data;
  829. @@ -3402,14 +3838,19 @@ static void r8153_teredo_off(struct r815
  830. case RTL_VER_08:
  831. case RTL_VER_09:
  832. + case RTL_TEST_01:
  833. + case RTL_VER_10:
  834. + case RTL_VER_11:
  835. + case RTL_VER_12:
  836. + case RTL_VER_13:
  837. + case RTL_VER_14:
  838. + case RTL_VER_15:
  839. + default:
  840. /* The bit 0 ~ 7 are relative with teredo settings. They are
  841. * W1C (write 1 to clear), so set all 1 to disable it.
  842. */
  843. ocp_write_byte(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG, 0xff);
  844. break;
  845. -
  846. - default:
  847. - break;
  848. }
  849. ocp_write_word(tp, MCU_TYPE_PLA, PLA_WDT6_CTRL, WDT6_SET_MODE);
  850. @@ -3444,6 +3885,12 @@ static void rtl_clear_bp(struct r8152 *t
  851. break;
  852. case RTL_VER_08:
  853. case RTL_VER_09:
  854. + case RTL_VER_10:
  855. + case RTL_VER_11:
  856. + case RTL_VER_12:
  857. + case RTL_VER_13:
  858. + case RTL_VER_14:
  859. + case RTL_VER_15:
  860. default:
  861. if (type == MCU_TYPE_USB) {
  862. ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
  863. @@ -3653,6 +4100,11 @@ static bool rtl8152_is_fw_mac_ok(struct
  864. case RTL_VER_06:
  865. case RTL_VER_08:
  866. case RTL_VER_09:
  867. + case RTL_VER_11:
  868. + case RTL_VER_12:
  869. + case RTL_VER_13:
  870. + case RTL_VER_14:
  871. + case RTL_VER_15:
  872. fw_reg = 0xf800;
  873. bp_ba_addr = PLA_BP_BA;
  874. bp_en_addr = PLA_BP_EN;
  875. @@ -3676,6 +4128,11 @@ static bool rtl8152_is_fw_mac_ok(struct
  876. break;
  877. case RTL_VER_08:
  878. case RTL_VER_09:
  879. + case RTL_VER_11:
  880. + case RTL_VER_12:
  881. + case RTL_VER_13:
  882. + case RTL_VER_14:
  883. + case RTL_VER_15:
  884. fw_reg = 0xe600;
  885. bp_ba_addr = USB_BP_BA;
  886. bp_en_addr = USB_BP2_EN;
  887. @@ -4215,6 +4672,22 @@ static void r8153_eee_en(struct r8152 *t
  888. tp->ups_info.eee = enable;
  889. }
  890. +static void r8156_eee_en(struct r8152 *tp, bool enable)
  891. +{
  892. + u16 config;
  893. +
  894. + r8153_eee_en(tp, enable);
  895. +
  896. + config = ocp_reg_read(tp, OCP_EEE_ADV2);
  897. +
  898. + if (enable)
  899. + config |= MDIO_EEE_2_5GT;
  900. + else
  901. + config &= ~MDIO_EEE_2_5GT;
  902. +
  903. + ocp_reg_write(tp, OCP_EEE_ADV2, config);
  904. +}
  905. +
  906. static void rtl_eee_enable(struct r8152 *tp, bool enable)
  907. {
  908. switch (tp->version) {
  909. @@ -4236,6 +4709,7 @@ static void rtl_eee_enable(struct r8152
  910. case RTL_VER_06:
  911. case RTL_VER_08:
  912. case RTL_VER_09:
  913. + case RTL_VER_14:
  914. if (enable) {
  915. r8153_eee_en(tp, true);
  916. ocp_reg_write(tp, OCP_EEE_ADV, tp->eee_adv);
  917. @@ -4244,6 +4718,19 @@ static void rtl_eee_enable(struct r8152
  918. ocp_reg_write(tp, OCP_EEE_ADV, 0);
  919. }
  920. break;
  921. + case RTL_VER_10:
  922. + case RTL_VER_11:
  923. + case RTL_VER_12:
  924. + case RTL_VER_13:
  925. + case RTL_VER_15:
  926. + if (enable) {
  927. + r8156_eee_en(tp, true);
  928. + ocp_reg_write(tp, OCP_EEE_ADV, tp->eee_adv);
  929. + } else {
  930. + r8156_eee_en(tp, false);
  931. + ocp_reg_write(tp, OCP_EEE_ADV, 0);
  932. + }
  933. + break;
  934. default:
  935. break;
  936. }
  937. @@ -4290,6 +4777,20 @@ static void wait_oob_link_list_ready(str
  938. }
  939. }
  940. +static void r8156b_wait_loading_flash(struct r8152 *tp)
  941. +{
  942. + if ((ocp_read_word(tp, MCU_TYPE_PLA, PLA_GPHY_CTRL) & GPHY_FLASH) &&
  943. + !(ocp_read_word(tp, MCU_TYPE_USB, USB_GPHY_CTRL) & BYPASS_FLASH)) {
  944. + int i;
  945. +
  946. + for (i = 0; i < 100; i++) {
  947. + if (ocp_read_word(tp, MCU_TYPE_USB, USB_GPHY_CTRL) & GPHY_PATCH_DONE)
  948. + break;
  949. + usleep_range(1000, 2000);
  950. + }
  951. + }
  952. +}
  953. +
  954. static void r8152b_exit_oob(struct r8152 *tp)
  955. {
  956. u32 ocp_data;
  957. @@ -4340,7 +4841,7 @@ static void r8152b_exit_oob(struct r8152
  958. }
  959. /* TX share fifo free credit full threshold */
  960. - ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL);
  961. + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, TXFIFO_THR_NORMAL2);
  962. ocp_write_byte(tp, MCU_TYPE_USB, USB_TX_AGG, TX_AGG_MAX_THRESHOLD);
  963. ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_HIGH);
  964. @@ -4517,6 +5018,21 @@ static int r8153b_post_firmware_1(struct
  965. return 0;
  966. }
  967. +static int r8153c_post_firmware_1(struct r8152 *tp)
  968. +{
  969. + u32 ocp_data;
  970. +
  971. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_CTRL);
  972. + ocp_data |= FLOW_CTRL_PATCH_2;
  973. + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_CTRL, ocp_data);
  974. +
  975. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK);
  976. + ocp_data |= FC_PATCH_TASK;
  977. + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
  978. +
  979. + return 0;
  980. +}
  981. +
  982. static void r8153_aldps_en(struct r8152 *tp, bool enable)
  983. {
  984. u16 data;
  985. @@ -4719,6 +5235,13 @@ static void r8153b_hw_phy_cfg(struct r81
  986. set_bit(PHY_RESET, &tp->flags);
  987. }
  988. +static void r8153c_hw_phy_cfg(struct r8152 *tp)
  989. +{
  990. + r8153b_hw_phy_cfg(tp);
  991. +
  992. + tp->ups_info.r_tune = true;
  993. +}
  994. +
  995. static void rtl8153_change_mtu(struct r8152 *tp)
  996. {
  997. ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
  998. @@ -4806,6 +5329,7 @@ static void r8153_enter_oob(struct r8152
  999. case RTL_VER_08:
  1000. case RTL_VER_09:
  1001. + case RTL_VER_14:
  1002. /* Clear teredo wake event. bit[15:8] is the teredo wakeup
  1003. * type. Set it to zero. bits[7:0] are the W1C bits about
  1004. * the events. Set them to all 1 to clear them.
  1005. @@ -4842,6 +5366,96 @@ static void rtl8153_disable(struct r8152
  1006. r8153_aldps_en(tp, true);
  1007. }
  1008. +static int rtl8156_enable(struct r8152 *tp)
  1009. +{
  1010. + u32 ocp_data;
  1011. + u16 speed;
  1012. +
  1013. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  1014. + return -ENODEV;
  1015. +
  1016. + set_tx_qlen(tp);
  1017. + rtl_set_eee_plus(tp);
  1018. + r8153_set_rx_early_timeout(tp);
  1019. + r8153_set_rx_early_size(tp);
  1020. +
  1021. + speed = rtl8152_get_speed(tp);
  1022. + rtl_set_ifg(tp, speed);
  1023. +
  1024. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4);
  1025. + if (speed & _2500bps)
  1026. + ocp_data &= ~IDLE_SPDWN_EN;
  1027. + else
  1028. + ocp_data |= IDLE_SPDWN_EN;
  1029. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, ocp_data);
  1030. +
  1031. + if (speed & _1000bps)
  1032. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS, 0x11);
  1033. + else if (speed & _500bps)
  1034. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS, 0x3d);
  1035. +
  1036. + if (tp->udev->speed == USB_SPEED_HIGH) {
  1037. + /* USB 0xb45e[3:0] l1_nyet_hird */
  1038. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_L1_CTRL);
  1039. + ocp_data &= ~0xf;
  1040. + if (is_flow_control(speed))
  1041. + ocp_data |= 0xf;
  1042. + else
  1043. + ocp_data |= 0x1;
  1044. + ocp_write_word(tp, MCU_TYPE_USB, USB_L1_CTRL, ocp_data);
  1045. + }
  1046. +
  1047. + return rtl_enable(tp);
  1048. +}
  1049. +
  1050. +static int rtl8156b_enable(struct r8152 *tp)
  1051. +{
  1052. + u32 ocp_data;
  1053. + u16 speed;
  1054. +
  1055. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  1056. + return -ENODEV;
  1057. +
  1058. + set_tx_qlen(tp);
  1059. + rtl_set_eee_plus(tp);
  1060. +
  1061. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM);
  1062. + ocp_data &= ~RX_AGGR_NUM_MASK;
  1063. + ocp_write_word(tp, MCU_TYPE_USB, USB_RX_AGGR_NUM, ocp_data);
  1064. +
  1065. + r8153_set_rx_early_timeout(tp);
  1066. + r8153_set_rx_early_size(tp);
  1067. +
  1068. + speed = rtl8152_get_speed(tp);
  1069. + rtl_set_ifg(tp, speed);
  1070. +
  1071. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4);
  1072. + if (speed & _2500bps)
  1073. + ocp_data &= ~IDLE_SPDWN_EN;
  1074. + else
  1075. + ocp_data |= IDLE_SPDWN_EN;
  1076. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, ocp_data);
  1077. +
  1078. + if (tp->udev->speed == USB_SPEED_HIGH) {
  1079. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_L1_CTRL);
  1080. + ocp_data &= ~0xf;
  1081. + if (is_flow_control(speed))
  1082. + ocp_data |= 0xf;
  1083. + else
  1084. + ocp_data |= 0x1;
  1085. + ocp_write_word(tp, MCU_TYPE_USB, USB_L1_CTRL, ocp_data);
  1086. + }
  1087. +
  1088. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK);
  1089. + ocp_data &= ~FC_PATCH_TASK;
  1090. + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
  1091. + usleep_range(1000, 2000);
  1092. + ocp_data |= FC_PATCH_TASK;
  1093. + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
  1094. +
  1095. + return rtl_enable(tp);
  1096. +}
  1097. +
  1098. static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u32 speed, u8 duplex,
  1099. u32 advertising)
  1100. {
  1101. @@ -4890,58 +5504,73 @@ static int rtl8152_set_speed(struct r815
  1102. tp->mii.force_media = 1;
  1103. } else {
  1104. - u16 anar, tmp1;
  1105. + u16 orig, new1;
  1106. u32 support;
  1107. support = RTL_ADVERTISED_10_HALF | RTL_ADVERTISED_10_FULL |
  1108. RTL_ADVERTISED_100_HALF | RTL_ADVERTISED_100_FULL;
  1109. - if (tp->mii.supports_gmii)
  1110. + if (tp->mii.supports_gmii) {
  1111. support |= RTL_ADVERTISED_1000_FULL;
  1112. + if (tp->support_2500full)
  1113. + support |= RTL_ADVERTISED_2500_FULL;
  1114. + }
  1115. +
  1116. if (!(advertising & support))
  1117. return -EINVAL;
  1118. - anar = r8152_mdio_read(tp, MII_ADVERTISE);
  1119. - tmp1 = anar & ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
  1120. + orig = r8152_mdio_read(tp, MII_ADVERTISE);
  1121. + new1 = orig & ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
  1122. ADVERTISE_100HALF | ADVERTISE_100FULL);
  1123. if (advertising & RTL_ADVERTISED_10_HALF) {
  1124. - tmp1 |= ADVERTISE_10HALF;
  1125. + new1 |= ADVERTISE_10HALF;
  1126. tp->ups_info.speed_duplex = NWAY_10M_HALF;
  1127. }
  1128. if (advertising & RTL_ADVERTISED_10_FULL) {
  1129. - tmp1 |= ADVERTISE_10FULL;
  1130. + new1 |= ADVERTISE_10FULL;
  1131. tp->ups_info.speed_duplex = NWAY_10M_FULL;
  1132. }
  1133. if (advertising & RTL_ADVERTISED_100_HALF) {
  1134. - tmp1 |= ADVERTISE_100HALF;
  1135. + new1 |= ADVERTISE_100HALF;
  1136. tp->ups_info.speed_duplex = NWAY_100M_HALF;
  1137. }
  1138. if (advertising & RTL_ADVERTISED_100_FULL) {
  1139. - tmp1 |= ADVERTISE_100FULL;
  1140. + new1 |= ADVERTISE_100FULL;
  1141. tp->ups_info.speed_duplex = NWAY_100M_FULL;
  1142. }
  1143. - if (anar != tmp1) {
  1144. - r8152_mdio_write(tp, MII_ADVERTISE, tmp1);
  1145. - tp->mii.advertising = tmp1;
  1146. + if (orig != new1) {
  1147. + r8152_mdio_write(tp, MII_ADVERTISE, new1);
  1148. + tp->mii.advertising = new1;
  1149. }
  1150. if (tp->mii.supports_gmii) {
  1151. - u16 gbcr;
  1152. -
  1153. - gbcr = r8152_mdio_read(tp, MII_CTRL1000);
  1154. - tmp1 = gbcr & ~(ADVERTISE_1000FULL |
  1155. + orig = r8152_mdio_read(tp, MII_CTRL1000);
  1156. + new1 = orig & ~(ADVERTISE_1000FULL |
  1157. ADVERTISE_1000HALF);
  1158. if (advertising & RTL_ADVERTISED_1000_FULL) {
  1159. - tmp1 |= ADVERTISE_1000FULL;
  1160. + new1 |= ADVERTISE_1000FULL;
  1161. tp->ups_info.speed_duplex = NWAY_1000M_FULL;
  1162. }
  1163. - if (gbcr != tmp1)
  1164. - r8152_mdio_write(tp, MII_CTRL1000, tmp1);
  1165. + if (orig != new1)
  1166. + r8152_mdio_write(tp, MII_CTRL1000, new1);
  1167. + }
  1168. +
  1169. + if (tp->support_2500full) {
  1170. + orig = ocp_reg_read(tp, OCP_10GBT_CTRL);
  1171. + new1 = orig & ~MDIO_AN_10GBT_CTRL_ADV2_5G;
  1172. +
  1173. + if (advertising & RTL_ADVERTISED_2500_FULL) {
  1174. + new1 |= MDIO_AN_10GBT_CTRL_ADV2_5G;
  1175. + tp->ups_info.speed_duplex = NWAY_2500M_FULL;
  1176. + }
  1177. +
  1178. + if (orig != new1)
  1179. + ocp_reg_write(tp, OCP_10GBT_CTRL, new1);
  1180. }
  1181. bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
  1182. @@ -5097,6 +5726,253 @@ static void rtl8153b_down(struct r8152 *
  1183. r8153_aldps_en(tp, true);
  1184. }
  1185. +static void rtl8153c_change_mtu(struct r8152 *tp)
  1186. +{
  1187. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
  1188. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, 10 * 1024 / 64);
  1189. +
  1190. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, 512 / 64);
  1191. +
  1192. + /* Adjust the tx fifo free credit full threshold, otherwise
  1193. + * the fifo would be too small to send a jumbo frame packet.
  1194. + */
  1195. + if (tp->netdev->mtu < 8000)
  1196. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_FULL, 2048 / 8);
  1197. + else
  1198. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_FULL, 900 / 8);
  1199. +}
  1200. +
  1201. +static void rtl8153c_up(struct r8152 *tp)
  1202. +{
  1203. + u32 ocp_data;
  1204. +
  1205. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  1206. + return;
  1207. +
  1208. + r8153b_u1u2en(tp, false);
  1209. + r8153_u2p3en(tp, false);
  1210. + r8153_aldps_en(tp, false);
  1211. +
  1212. + rxdy_gated_en(tp, true);
  1213. + r8153_teredo_off(tp);
  1214. +
  1215. + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  1216. + ocp_data &= ~RCR_ACPT_ALL;
  1217. + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  1218. +
  1219. + rtl8152_nic_reset(tp);
  1220. + rtl_reset_bmu(tp);
  1221. +
  1222. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  1223. + ocp_data &= ~NOW_IS_OOB;
  1224. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  1225. +
  1226. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
  1227. + ocp_data &= ~MCU_BORW_EN;
  1228. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
  1229. +
  1230. + wait_oob_link_list_ready(tp);
  1231. +
  1232. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
  1233. + ocp_data |= RE_INIT_LL;
  1234. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
  1235. +
  1236. + wait_oob_link_list_ready(tp);
  1237. +
  1238. + rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX);
  1239. +
  1240. + rtl8153c_change_mtu(tp);
  1241. +
  1242. + rtl8152_nic_reset(tp);
  1243. +
  1244. + /* rx share fifo credit full threshold */
  1245. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL0, 0x02);
  1246. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, 0x08);
  1247. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL1, RXFIFO_THR2_NORMAL);
  1248. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_CTRL2, RXFIFO_THR3_NORMAL);
  1249. +
  1250. + ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_B);
  1251. +
  1252. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
  1253. +
  1254. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG34);
  1255. + ocp_data |= BIT(8);
  1256. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG34, ocp_data);
  1257. +
  1258. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML);
  1259. +
  1260. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
  1261. + ocp_data &= ~PLA_MCU_SPDWN_EN;
  1262. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
  1263. +
  1264. + r8153_aldps_en(tp, true);
  1265. + r8153b_u1u2en(tp, true);
  1266. +}
  1267. +
  1268. +static inline u32 fc_pause_on_auto(struct r8152 *tp)
  1269. +{
  1270. + return (ALIGN(mtu_to_size(tp->netdev->mtu), 1024) + 6 * 1024);
  1271. +}
  1272. +
  1273. +static inline u32 fc_pause_off_auto(struct r8152 *tp)
  1274. +{
  1275. + return (ALIGN(mtu_to_size(tp->netdev->mtu), 1024) + 14 * 1024);
  1276. +}
  1277. +
  1278. +static void r8156_fc_parameter(struct r8152 *tp)
  1279. +{
  1280. + u32 pause_on = tp->fc_pause_on ? tp->fc_pause_on : fc_pause_on_auto(tp);
  1281. + u32 pause_off = tp->fc_pause_off ? tp->fc_pause_off : fc_pause_off_auto(tp);
  1282. +
  1283. + switch (tp->version) {
  1284. + case RTL_VER_10:
  1285. + case RTL_VER_11:
  1286. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_FULL, pause_on / 8);
  1287. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_EMPTY, pause_off / 8);
  1288. + break;
  1289. + case RTL_VER_12:
  1290. + case RTL_VER_13:
  1291. + case RTL_VER_15:
  1292. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_FULL, pause_on / 16);
  1293. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RX_FIFO_EMPTY, pause_off / 16);
  1294. + break;
  1295. + default:
  1296. + break;
  1297. + }
  1298. +}
  1299. +
  1300. +static void rtl8156_change_mtu(struct r8152 *tp)
  1301. +{
  1302. + u32 rx_max_size = mtu_to_size(tp->netdev->mtu);
  1303. +
  1304. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, rx_max_size);
  1305. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
  1306. + r8156_fc_parameter(tp);
  1307. +
  1308. + /* TX share fifo free credit full threshold */
  1309. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_CTRL, 512 / 64);
  1310. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TXFIFO_FULL,
  1311. + ALIGN(rx_max_size + sizeof(struct tx_desc), 1024) / 16);
  1312. +}
  1313. +
  1314. +static void rtl8156_up(struct r8152 *tp)
  1315. +{
  1316. + u32 ocp_data;
  1317. +
  1318. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  1319. + return;
  1320. +
  1321. + r8153b_u1u2en(tp, false);
  1322. + r8153_u2p3en(tp, false);
  1323. + r8153_aldps_en(tp, false);
  1324. +
  1325. + rxdy_gated_en(tp, true);
  1326. + r8153_teredo_off(tp);
  1327. +
  1328. + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  1329. + ocp_data &= ~RCR_ACPT_ALL;
  1330. + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  1331. +
  1332. + rtl8152_nic_reset(tp);
  1333. + rtl_reset_bmu(tp);
  1334. +
  1335. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  1336. + ocp_data &= ~NOW_IS_OOB;
  1337. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  1338. +
  1339. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7);
  1340. + ocp_data &= ~MCU_BORW_EN;
  1341. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_SFF_STS_7, ocp_data);
  1342. +
  1343. + rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX);
  1344. +
  1345. + rtl8156_change_mtu(tp);
  1346. +
  1347. + switch (tp->version) {
  1348. + case RTL_TEST_01:
  1349. + case RTL_VER_10:
  1350. + case RTL_VER_11:
  1351. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_BMU_CONFIG);
  1352. + ocp_data |= ACT_ODMA;
  1353. + ocp_write_word(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ocp_data);
  1354. + break;
  1355. + default:
  1356. + break;
  1357. + }
  1358. +
  1359. + /* share FIFO settings */
  1360. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL);
  1361. + ocp_data &= ~RXFIFO_FULL_MASK;
  1362. + ocp_data |= 0x08;
  1363. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL, ocp_data);
  1364. +
  1365. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
  1366. + ocp_data &= ~PLA_MCU_SPDWN_EN;
  1367. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
  1368. +
  1369. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION);
  1370. + ocp_data &= ~(RG_PWRDN_EN | ALL_SPEED_OFF);
  1371. + ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, ocp_data);
  1372. +
  1373. + ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, 0x00600400);
  1374. +
  1375. + if (tp->saved_wolopts != __rtl_get_wol(tp)) {
  1376. + netif_warn(tp, ifup, tp->netdev, "wol setting is changed\n");
  1377. + __rtl_set_wol(tp, tp->saved_wolopts);
  1378. + }
  1379. +
  1380. + r8153_aldps_en(tp, true);
  1381. + r8153_u2p3en(tp, true);
  1382. +
  1383. + if (tp->udev->speed >= USB_SPEED_SUPER)
  1384. + r8153b_u1u2en(tp, true);
  1385. +}
  1386. +
  1387. +static void rtl8156_down(struct r8152 *tp)
  1388. +{
  1389. + u32 ocp_data;
  1390. +
  1391. + if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
  1392. + rtl_drop_queued_tx(tp);
  1393. + return;
  1394. + }
  1395. +
  1396. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
  1397. + ocp_data |= PLA_MCU_SPDWN_EN;
  1398. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
  1399. +
  1400. + r8153b_u1u2en(tp, false);
  1401. + r8153_u2p3en(tp, false);
  1402. + r8153b_power_cut_en(tp, false);
  1403. + r8153_aldps_en(tp, false);
  1404. +
  1405. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  1406. + ocp_data &= ~NOW_IS_OOB;
  1407. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  1408. +
  1409. + rtl_disable(tp);
  1410. + rtl_reset_bmu(tp);
  1411. +
  1412. + /* Clear teredo wake event. bit[15:8] is the teredo wakeup
  1413. + * type. Set it to zero. bits[7:0] are the W1C bits about
  1414. + * the events. Set them to all 1 to clear them.
  1415. + */
  1416. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_TEREDO_WAKE_BASE, 0x00ff);
  1417. +
  1418. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL);
  1419. + ocp_data |= NOW_IS_OOB;
  1420. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data);
  1421. +
  1422. + rtl_rx_vlan_en(tp, true);
  1423. + rxdy_gated_en(tp, false);
  1424. +
  1425. + ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
  1426. + ocp_data |= RCR_APM | RCR_AM | RCR_AB;
  1427. + ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  1428. +
  1429. + r8153_aldps_en(tp, true);
  1430. +}
  1431. +
  1432. static bool rtl8152_in_nway(struct r8152 *tp)
  1433. {
  1434. u16 nway_state;
  1435. @@ -5127,7 +6003,7 @@ static void set_carrier(struct r8152 *tp
  1436. {
  1437. struct net_device *netdev = tp->netdev;
  1438. struct napi_struct *napi = &tp->napi;
  1439. - u8 speed;
  1440. + u16 speed;
  1441. speed = rtl8152_get_speed(tp);
  1442. @@ -5140,7 +6016,7 @@ static void set_carrier(struct r8152 *tp
  1443. rtl_start_rx(tp);
  1444. clear_bit(RTL8152_SET_RX_MODE, &tp->flags);
  1445. _rtl8152_set_rx_mode(netdev);
  1446. - napi_enable(&tp->napi);
  1447. + napi_enable(napi);
  1448. netif_wake_queue(netdev);
  1449. netif_info(tp, link, netdev, "carrier on\n");
  1450. } else if (netif_queue_stopped(netdev) &&
  1451. @@ -5502,14 +6378,9 @@ static void r8153_init(struct r8152 *tp)
  1452. ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001);
  1453. - /* MAC clock speed down */
  1454. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL, 0);
  1455. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, 0);
  1456. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, 0);
  1457. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, 0);
  1458. -
  1459. r8153_power_cut_en(tp, false);
  1460. rtl_runtime_suspend_enable(tp, false);
  1461. + r8153_mac_clk_speed_down(tp, false);
  1462. r8153_u1u2en(tp, true);
  1463. usb_enable_lpm(tp->udev);
  1464. @@ -5600,9 +6471,7 @@ static void r8153b_init(struct r8152 *tp
  1465. usb_enable_lpm(tp->udev);
  1466. /* MAC clock speed down */
  1467. - ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2);
  1468. - ocp_data |= MAC_CLK_SPDWN_EN;
  1469. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data);
  1470. + r8153_mac_clk_speed_down(tp, true);
  1471. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
  1472. ocp_data &= ~PLA_MCU_SPDWN_EN;
  1473. @@ -5629,6 +6498,1069 @@ static void r8153b_init(struct r8152 *tp
  1474. tp->coalesce = 15000; /* 15 us */
  1475. }
  1476. +static void r8153c_init(struct r8152 *tp)
  1477. +{
  1478. + u32 ocp_data;
  1479. + u16 data;
  1480. + int i;
  1481. +
  1482. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  1483. + return;
  1484. +
  1485. + r8153b_u1u2en(tp, false);
  1486. +
  1487. + /* Disable spi_en */
  1488. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG);
  1489. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CONFIG5);
  1490. + ocp_data &= ~BIT(3);
  1491. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_CONFIG5, ocp_data);
  1492. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, 0xcbf0);
  1493. + ocp_data |= BIT(1);
  1494. + ocp_write_word(tp, MCU_TYPE_USB, 0xcbf0, ocp_data);
  1495. +
  1496. + for (i = 0; i < 500; i++) {
  1497. + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
  1498. + AUTOLOAD_DONE)
  1499. + break;
  1500. +
  1501. + msleep(20);
  1502. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  1503. + return;
  1504. + }
  1505. +
  1506. + data = r8153_phy_status(tp, 0);
  1507. +
  1508. + data = r8152_mdio_read(tp, MII_BMCR);
  1509. + if (data & BMCR_PDOWN) {
  1510. + data &= ~BMCR_PDOWN;
  1511. + r8152_mdio_write(tp, MII_BMCR, data);
  1512. + }
  1513. +
  1514. + data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
  1515. +
  1516. + r8153_u2p3en(tp, false);
  1517. +
  1518. + /* MSC timer = 0xfff * 8ms = 32760 ms */
  1519. + ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff);
  1520. +
  1521. + r8153b_power_cut_en(tp, false);
  1522. + r8153c_ups_en(tp, false);
  1523. + r8153_queue_wake(tp, false);
  1524. + rtl_runtime_suspend_enable(tp, false);
  1525. +
  1526. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
  1527. + if (rtl8152_get_speed(tp) & LINK_STATUS)
  1528. + ocp_data |= CUR_LINK_OK;
  1529. + else
  1530. + ocp_data &= ~CUR_LINK_OK;
  1531. +
  1532. + ocp_data |= POLL_LINK_CHG;
  1533. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
  1534. +
  1535. + r8153b_u1u2en(tp, true);
  1536. +
  1537. + usb_enable_lpm(tp->udev);
  1538. +
  1539. + /* MAC clock speed down */
  1540. + r8153_mac_clk_speed_down(tp, true);
  1541. +
  1542. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_2);
  1543. + ocp_data &= ~BIT(7);
  1544. + ocp_write_byte(tp, MCU_TYPE_USB, USB_MISC_2, ocp_data);
  1545. +
  1546. + set_bit(GREEN_ETHERNET, &tp->flags);
  1547. +
  1548. + /* rx aggregation */
  1549. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  1550. + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
  1551. + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  1552. +
  1553. + rtl_tally_reset(tp);
  1554. +
  1555. + tp->coalesce = 15000; /* 15 us */
  1556. +}
  1557. +
  1558. +static void r8156_hw_phy_cfg(struct r8152 *tp)
  1559. +{
  1560. + u32 ocp_data;
  1561. + u16 data;
  1562. +
  1563. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
  1564. + if (ocp_data & PCUT_STATUS) {
  1565. + ocp_data &= ~PCUT_STATUS;
  1566. + ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
  1567. + }
  1568. +
  1569. + data = r8153_phy_status(tp, 0);
  1570. + switch (data) {
  1571. + case PHY_STAT_EXT_INIT:
  1572. + rtl8152_apply_firmware(tp, true);
  1573. +
  1574. + data = ocp_reg_read(tp, 0xa468);
  1575. + data &= ~(BIT(3) | BIT(1));
  1576. + ocp_reg_write(tp, 0xa468, data);
  1577. + break;
  1578. + case PHY_STAT_LAN_ON:
  1579. + case PHY_STAT_PWRDN:
  1580. + default:
  1581. + rtl8152_apply_firmware(tp, false);
  1582. + break;
  1583. + }
  1584. +
  1585. + /* disable ALDPS before updating the PHY parameters */
  1586. + r8153_aldps_en(tp, false);
  1587. +
  1588. + /* disable EEE before updating the PHY parameters */
  1589. + rtl_eee_enable(tp, false);
  1590. +
  1591. + data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
  1592. + WARN_ON_ONCE(data != PHY_STAT_LAN_ON);
  1593. +
  1594. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
  1595. + ocp_data |= PFM_PWM_SWITCH;
  1596. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
  1597. +
  1598. + switch (tp->version) {
  1599. + case RTL_VER_10:
  1600. + data = ocp_reg_read(tp, 0xad40);
  1601. + data &= ~0x3ff;
  1602. + data |= BIT(7) | BIT(2);
  1603. + ocp_reg_write(tp, 0xad40, data);
  1604. +
  1605. + data = ocp_reg_read(tp, 0xad4e);
  1606. + data |= BIT(4);
  1607. + ocp_reg_write(tp, 0xad4e, data);
  1608. + data = ocp_reg_read(tp, 0xad16);
  1609. + data &= ~0x3ff;
  1610. + data |= 0x6;
  1611. + ocp_reg_write(tp, 0xad16, data);
  1612. + data = ocp_reg_read(tp, 0xad32);
  1613. + data &= ~0x3f;
  1614. + data |= 6;
  1615. + ocp_reg_write(tp, 0xad32, data);
  1616. + data = ocp_reg_read(tp, 0xac08);
  1617. + data &= ~(BIT(12) | BIT(8));
  1618. + ocp_reg_write(tp, 0xac08, data);
  1619. + data = ocp_reg_read(tp, 0xac8a);
  1620. + data |= BIT(12) | BIT(13) | BIT(14);
  1621. + data &= ~BIT(15);
  1622. + ocp_reg_write(tp, 0xac8a, data);
  1623. + data = ocp_reg_read(tp, 0xad18);
  1624. + data |= BIT(10);
  1625. + ocp_reg_write(tp, 0xad18, data);
  1626. + data = ocp_reg_read(tp, 0xad1a);
  1627. + data |= 0x3ff;
  1628. + ocp_reg_write(tp, 0xad1a, data);
  1629. + data = ocp_reg_read(tp, 0xad1c);
  1630. + data |= 0x3ff;
  1631. + ocp_reg_write(tp, 0xad1c, data);
  1632. +
  1633. + data = sram_read(tp, 0x80ea);
  1634. + data &= ~0xff00;
  1635. + data |= 0xc400;
  1636. + sram_write(tp, 0x80ea, data);
  1637. + data = sram_read(tp, 0x80eb);
  1638. + data &= ~0x0700;
  1639. + data |= 0x0300;
  1640. + sram_write(tp, 0x80eb, data);
  1641. + data = sram_read(tp, 0x80f8);
  1642. + data &= ~0xff00;
  1643. + data |= 0x1c00;
  1644. + sram_write(tp, 0x80f8, data);
  1645. + data = sram_read(tp, 0x80f1);
  1646. + data &= ~0xff00;
  1647. + data |= 0x3000;
  1648. + sram_write(tp, 0x80f1, data);
  1649. +
  1650. + data = sram_read(tp, 0x80fe);
  1651. + data &= ~0xff00;
  1652. + data |= 0xa500;
  1653. + sram_write(tp, 0x80fe, data);
  1654. + data = sram_read(tp, 0x8102);
  1655. + data &= ~0xff00;
  1656. + data |= 0x5000;
  1657. + sram_write(tp, 0x8102, data);
  1658. + data = sram_read(tp, 0x8015);
  1659. + data &= ~0xff00;
  1660. + data |= 0x3300;
  1661. + sram_write(tp, 0x8015, data);
  1662. + data = sram_read(tp, 0x8100);
  1663. + data &= ~0xff00;
  1664. + data |= 0x7000;
  1665. + sram_write(tp, 0x8100, data);
  1666. + data = sram_read(tp, 0x8014);
  1667. + data &= ~0xff00;
  1668. + data |= 0xf000;
  1669. + sram_write(tp, 0x8014, data);
  1670. + data = sram_read(tp, 0x8016);
  1671. + data &= ~0xff00;
  1672. + data |= 0x6500;
  1673. + sram_write(tp, 0x8016, data);
  1674. + data = sram_read(tp, 0x80dc);
  1675. + data &= ~0xff00;
  1676. + data |= 0xed00;
  1677. + sram_write(tp, 0x80dc, data);
  1678. + data = sram_read(tp, 0x80df);
  1679. + data |= BIT(8);
  1680. + sram_write(tp, 0x80df, data);
  1681. + data = sram_read(tp, 0x80e1);
  1682. + data &= ~BIT(8);
  1683. + sram_write(tp, 0x80e1, data);
  1684. +
  1685. + data = ocp_reg_read(tp, 0xbf06);
  1686. + data &= ~0x003f;
  1687. + data |= 0x0038;
  1688. + ocp_reg_write(tp, 0xbf06, data);
  1689. +
  1690. + sram_write(tp, 0x819f, 0xddb6);
  1691. +
  1692. + ocp_reg_write(tp, 0xbc34, 0x5555);
  1693. + data = ocp_reg_read(tp, 0xbf0a);
  1694. + data &= ~0x0e00;
  1695. + data |= 0x0a00;
  1696. + ocp_reg_write(tp, 0xbf0a, data);
  1697. +
  1698. + data = ocp_reg_read(tp, 0xbd2c);
  1699. + data &= ~BIT(13);
  1700. + ocp_reg_write(tp, 0xbd2c, data);
  1701. + break;
  1702. + case RTL_VER_11:
  1703. + data = ocp_reg_read(tp, 0xad16);
  1704. + data |= 0x3ff;
  1705. + ocp_reg_write(tp, 0xad16, data);
  1706. + data = ocp_reg_read(tp, 0xad32);
  1707. + data &= ~0x3f;
  1708. + data |= 6;
  1709. + ocp_reg_write(tp, 0xad32, data);
  1710. + data = ocp_reg_read(tp, 0xac08);
  1711. + data &= ~(BIT(12) | BIT(8));
  1712. + ocp_reg_write(tp, 0xac08, data);
  1713. + data = ocp_reg_read(tp, 0xacc0);
  1714. + data &= ~0x3;
  1715. + data |= BIT(1);
  1716. + ocp_reg_write(tp, 0xacc0, data);
  1717. + data = ocp_reg_read(tp, 0xad40);
  1718. + data &= ~0xe7;
  1719. + data |= BIT(6) | BIT(2);
  1720. + ocp_reg_write(tp, 0xad40, data);
  1721. + data = ocp_reg_read(tp, 0xac14);
  1722. + data &= ~BIT(7);
  1723. + ocp_reg_write(tp, 0xac14, data);
  1724. + data = ocp_reg_read(tp, 0xac80);
  1725. + data &= ~(BIT(8) | BIT(9));
  1726. + ocp_reg_write(tp, 0xac80, data);
  1727. + data = ocp_reg_read(tp, 0xac5e);
  1728. + data &= ~0x7;
  1729. + data |= BIT(1);
  1730. + ocp_reg_write(tp, 0xac5e, data);
  1731. + ocp_reg_write(tp, 0xad4c, 0x00a8);
  1732. + ocp_reg_write(tp, 0xac5c, 0x01ff);
  1733. + data = ocp_reg_read(tp, 0xac8a);
  1734. + data &= ~0xf0;
  1735. + data |= BIT(4) | BIT(5);
  1736. + ocp_reg_write(tp, 0xac8a, data);
  1737. + ocp_reg_write(tp, 0xb87c, 0x8157);
  1738. + data = ocp_reg_read(tp, 0xb87e);
  1739. + data &= ~0xff00;
  1740. + data |= 0x0500;
  1741. + ocp_reg_write(tp, 0xb87e, data);
  1742. + ocp_reg_write(tp, 0xb87c, 0x8159);
  1743. + data = ocp_reg_read(tp, 0xb87e);
  1744. + data &= ~0xff00;
  1745. + data |= 0x0700;
  1746. + ocp_reg_write(tp, 0xb87e, data);
  1747. +
  1748. + /* AAGC */
  1749. + ocp_reg_write(tp, 0xb87c, 0x80a2);
  1750. + ocp_reg_write(tp, 0xb87e, 0x0153);
  1751. + ocp_reg_write(tp, 0xb87c, 0x809c);
  1752. + ocp_reg_write(tp, 0xb87e, 0x0153);
  1753. +
  1754. + /* EEE parameter */
  1755. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EEE_TXTWSYS_2P5G, 0x0056);
  1756. +
  1757. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_USB_CFG);
  1758. + ocp_data |= EN_XG_LIP | EN_G_LIP;
  1759. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_USB_CFG, ocp_data);
  1760. +
  1761. + sram_write(tp, 0x8257, 0x020f); /* XG PLL */
  1762. + sram_write(tp, 0x80ea, 0x7843); /* GIGA Master */
  1763. +
  1764. + if (rtl_phy_patch_request(tp, true, true))
  1765. + return;
  1766. +
  1767. + /* Advance EEE */
  1768. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4);
  1769. + ocp_data |= EEE_SPDWN_EN;
  1770. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, ocp_data);
  1771. +
  1772. + data = ocp_reg_read(tp, OCP_DOWN_SPEED);
  1773. + data &= ~(EN_EEE_100 | EN_EEE_1000);
  1774. + data |= EN_10M_CLKDIV;
  1775. + ocp_reg_write(tp, OCP_DOWN_SPEED, data);
  1776. + tp->ups_info._10m_ckdiv = true;
  1777. + tp->ups_info.eee_plloff_100 = false;
  1778. + tp->ups_info.eee_plloff_giga = false;
  1779. +
  1780. + data = ocp_reg_read(tp, OCP_POWER_CFG);
  1781. + data &= ~EEE_CLKDIV_EN;
  1782. + ocp_reg_write(tp, OCP_POWER_CFG, data);
  1783. + tp->ups_info.eee_ckdiv = false;
  1784. +
  1785. + ocp_reg_write(tp, OCP_SYSCLK_CFG, 0);
  1786. + ocp_reg_write(tp, OCP_SYSCLK_CFG, sysclk_div_expo(5));
  1787. + tp->ups_info._250m_ckdiv = false;
  1788. +
  1789. + rtl_phy_patch_request(tp, false, true);
  1790. +
  1791. + /* enable ADC Ibias Cal */
  1792. + data = ocp_reg_read(tp, 0xd068);
  1793. + data |= BIT(13);
  1794. + ocp_reg_write(tp, 0xd068, data);
  1795. +
  1796. + /* enable Thermal Sensor */
  1797. + data = sram_read(tp, 0x81a2);
  1798. + data &= ~BIT(8);
  1799. + sram_write(tp, 0x81a2, data);
  1800. + data = ocp_reg_read(tp, 0xb54c);
  1801. + data &= ~0xff00;
  1802. + data |= 0xdb00;
  1803. + ocp_reg_write(tp, 0xb54c, data);
  1804. +
  1805. + /* Nway 2.5G Lite */
  1806. + data = ocp_reg_read(tp, 0xa454);
  1807. + data &= ~BIT(0);
  1808. + ocp_reg_write(tp, 0xa454, data);
  1809. +
  1810. + /* CS DSP solution */
  1811. + data = ocp_reg_read(tp, OCP_10GBT_CTRL);
  1812. + data |= RTL_ADV2_5G_F_R;
  1813. + ocp_reg_write(tp, OCP_10GBT_CTRL, data);
  1814. + data = ocp_reg_read(tp, 0xad4e);
  1815. + data &= ~BIT(4);
  1816. + ocp_reg_write(tp, 0xad4e, data);
  1817. + data = ocp_reg_read(tp, 0xa86a);
  1818. + data &= ~BIT(0);
  1819. + ocp_reg_write(tp, 0xa86a, data);
  1820. +
  1821. + /* MDI SWAP */
  1822. + if ((ocp_read_word(tp, MCU_TYPE_USB, USB_UPS_CFG) & MID_REVERSE) &&
  1823. + (ocp_reg_read(tp, 0xd068) & BIT(1))) {
  1824. + u16 swap_a, swap_b;
  1825. +
  1826. + data = ocp_reg_read(tp, 0xd068);
  1827. + data &= ~0x1f;
  1828. + data |= 0x1; /* p0 */
  1829. + ocp_reg_write(tp, 0xd068, data);
  1830. + swap_a = ocp_reg_read(tp, 0xd06a);
  1831. + data &= ~0x18;
  1832. + data |= 0x18; /* p3 */
  1833. + ocp_reg_write(tp, 0xd068, data);
  1834. + swap_b = ocp_reg_read(tp, 0xd06a);
  1835. + data &= ~0x18; /* p0 */
  1836. + ocp_reg_write(tp, 0xd068, data);
  1837. + ocp_reg_write(tp, 0xd06a,
  1838. + (swap_a & ~0x7ff) | (swap_b & 0x7ff));
  1839. + data |= 0x18; /* p3 */
  1840. + ocp_reg_write(tp, 0xd068, data);
  1841. + ocp_reg_write(tp, 0xd06a,
  1842. + (swap_b & ~0x7ff) | (swap_a & 0x7ff));
  1843. + data &= ~0x18;
  1844. + data |= 0x08; /* p1 */
  1845. + ocp_reg_write(tp, 0xd068, data);
  1846. + swap_a = ocp_reg_read(tp, 0xd06a);
  1847. + data &= ~0x18;
  1848. + data |= 0x10; /* p2 */
  1849. + ocp_reg_write(tp, 0xd068, data);
  1850. + swap_b = ocp_reg_read(tp, 0xd06a);
  1851. + data &= ~0x18;
  1852. + data |= 0x08; /* p1 */
  1853. + ocp_reg_write(tp, 0xd068, data);
  1854. + ocp_reg_write(tp, 0xd06a,
  1855. + (swap_a & ~0x7ff) | (swap_b & 0x7ff));
  1856. + data &= ~0x18;
  1857. + data |= 0x10; /* p2 */
  1858. + ocp_reg_write(tp, 0xd068, data);
  1859. + ocp_reg_write(tp, 0xd06a,
  1860. + (swap_b & ~0x7ff) | (swap_a & 0x7ff));
  1861. + swap_a = ocp_reg_read(tp, 0xbd5a);
  1862. + swap_b = ocp_reg_read(tp, 0xbd5c);
  1863. + ocp_reg_write(tp, 0xbd5a, (swap_a & ~0x1f1f) |
  1864. + ((swap_b & 0x1f) << 8) |
  1865. + ((swap_b >> 8) & 0x1f));
  1866. + ocp_reg_write(tp, 0xbd5c, (swap_b & ~0x1f1f) |
  1867. + ((swap_a & 0x1f) << 8) |
  1868. + ((swap_a >> 8) & 0x1f));
  1869. + swap_a = ocp_reg_read(tp, 0xbc18);
  1870. + swap_b = ocp_reg_read(tp, 0xbc1a);
  1871. + ocp_reg_write(tp, 0xbc18, (swap_a & ~0x1f1f) |
  1872. + ((swap_b & 0x1f) << 8) |
  1873. + ((swap_b >> 8) & 0x1f));
  1874. + ocp_reg_write(tp, 0xbc1a, (swap_b & ~0x1f1f) |
  1875. + ((swap_a & 0x1f) << 8) |
  1876. + ((swap_a >> 8) & 0x1f));
  1877. + }
  1878. + break;
  1879. + default:
  1880. + break;
  1881. + }
  1882. +
  1883. + rtl_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags));
  1884. +
  1885. + data = ocp_reg_read(tp, 0xa428);
  1886. + data &= ~BIT(9);
  1887. + ocp_reg_write(tp, 0xa428, data);
  1888. + data = ocp_reg_read(tp, 0xa5ea);
  1889. + data &= ~BIT(0);
  1890. + ocp_reg_write(tp, 0xa5ea, data);
  1891. + tp->ups_info.lite_mode = 0;
  1892. +
  1893. + if (tp->eee_en)
  1894. + rtl_eee_enable(tp, true);
  1895. +
  1896. + r8153_aldps_en(tp, true);
  1897. + r8152b_enable_fc(tp);
  1898. + r8153_u2p3en(tp, true);
  1899. +
  1900. + set_bit(PHY_RESET, &tp->flags);
  1901. +}
  1902. +
  1903. +static void r8156b_hw_phy_cfg(struct r8152 *tp)
  1904. +{
  1905. + u32 ocp_data;
  1906. + u16 data;
  1907. +
  1908. + switch (tp->version) {
  1909. + case RTL_VER_12:
  1910. + ocp_reg_write(tp, 0xbf86, 0x9000);
  1911. + data = ocp_reg_read(tp, 0xc402);
  1912. + data |= BIT(10);
  1913. + ocp_reg_write(tp, 0xc402, data);
  1914. + data &= ~BIT(10);
  1915. + ocp_reg_write(tp, 0xc402, data);
  1916. + ocp_reg_write(tp, 0xbd86, 0x1010);
  1917. + ocp_reg_write(tp, 0xbd88, 0x1010);
  1918. + data = ocp_reg_read(tp, 0xbd4e);
  1919. + data &= ~(BIT(10) | BIT(11));
  1920. + data |= BIT(11);
  1921. + ocp_reg_write(tp, 0xbd4e, data);
  1922. + data = ocp_reg_read(tp, 0xbf46);
  1923. + data &= ~0xf00;
  1924. + data |= 0x700;
  1925. + ocp_reg_write(tp, 0xbf46, data);
  1926. + break;
  1927. + case RTL_VER_13:
  1928. + case RTL_VER_15:
  1929. + r8156b_wait_loading_flash(tp);
  1930. + break;
  1931. + default:
  1932. + break;
  1933. + }
  1934. +
  1935. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
  1936. + if (ocp_data & PCUT_STATUS) {
  1937. + ocp_data &= ~PCUT_STATUS;
  1938. + ocp_write_word(tp, MCU_TYPE_USB, USB_MISC_0, ocp_data);
  1939. + }
  1940. +
  1941. + data = r8153_phy_status(tp, 0);
  1942. + switch (data) {
  1943. + case PHY_STAT_EXT_INIT:
  1944. + rtl8152_apply_firmware(tp, true);
  1945. +
  1946. + data = ocp_reg_read(tp, 0xa466);
  1947. + data &= ~BIT(0);
  1948. + ocp_reg_write(tp, 0xa466, data);
  1949. +
  1950. + data = ocp_reg_read(tp, 0xa468);
  1951. + data &= ~(BIT(3) | BIT(1));
  1952. + ocp_reg_write(tp, 0xa468, data);
  1953. + break;
  1954. + case PHY_STAT_LAN_ON:
  1955. + case PHY_STAT_PWRDN:
  1956. + default:
  1957. + rtl8152_apply_firmware(tp, false);
  1958. + break;
  1959. + }
  1960. +
  1961. + data = r8152_mdio_read(tp, MII_BMCR);
  1962. + if (data & BMCR_PDOWN) {
  1963. + data &= ~BMCR_PDOWN;
  1964. + r8152_mdio_write(tp, MII_BMCR, data);
  1965. + }
  1966. +
  1967. + /* disable ALDPS before updating the PHY parameters */
  1968. + r8153_aldps_en(tp, false);
  1969. +
  1970. + /* disable EEE before updating the PHY parameters */
  1971. + rtl_eee_enable(tp, false);
  1972. +
  1973. + data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
  1974. + WARN_ON_ONCE(data != PHY_STAT_LAN_ON);
  1975. +
  1976. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
  1977. + ocp_data |= PFM_PWM_SWITCH;
  1978. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
  1979. +
  1980. + switch (tp->version) {
  1981. + case RTL_VER_12:
  1982. + data = ocp_reg_read(tp, 0xbc08);
  1983. + data |= BIT(3) | BIT(2);
  1984. + ocp_reg_write(tp, 0xbc08, data);
  1985. +
  1986. + data = sram_read(tp, 0x8fff);
  1987. + data &= ~0xff00;
  1988. + data |= 0x0400;
  1989. + sram_write(tp, 0x8fff, data);
  1990. +
  1991. + data = ocp_reg_read(tp, 0xacda);
  1992. + data |= 0xff00;
  1993. + ocp_reg_write(tp, 0xacda, data);
  1994. + data = ocp_reg_read(tp, 0xacde);
  1995. + data |= 0xf000;
  1996. + ocp_reg_write(tp, 0xacde, data);
  1997. + ocp_reg_write(tp, 0xac8c, 0x0ffc);
  1998. + ocp_reg_write(tp, 0xac46, 0xb7b4);
  1999. + ocp_reg_write(tp, 0xac50, 0x0fbc);
  2000. + ocp_reg_write(tp, 0xac3c, 0x9240);
  2001. + ocp_reg_write(tp, 0xac4e, 0x0db4);
  2002. + ocp_reg_write(tp, 0xacc6, 0x0707);
  2003. + ocp_reg_write(tp, 0xacc8, 0xa0d3);
  2004. + ocp_reg_write(tp, 0xad08, 0x0007);
  2005. +
  2006. + ocp_reg_write(tp, 0xb87c, 0x8560);
  2007. + ocp_reg_write(tp, 0xb87e, 0x19cc);
  2008. + ocp_reg_write(tp, 0xb87c, 0x8562);
  2009. + ocp_reg_write(tp, 0xb87e, 0x19cc);
  2010. + ocp_reg_write(tp, 0xb87c, 0x8564);
  2011. + ocp_reg_write(tp, 0xb87e, 0x19cc);
  2012. + ocp_reg_write(tp, 0xb87c, 0x8566);
  2013. + ocp_reg_write(tp, 0xb87e, 0x147d);
  2014. + ocp_reg_write(tp, 0xb87c, 0x8568);
  2015. + ocp_reg_write(tp, 0xb87e, 0x147d);
  2016. + ocp_reg_write(tp, 0xb87c, 0x856a);
  2017. + ocp_reg_write(tp, 0xb87e, 0x147d);
  2018. + ocp_reg_write(tp, 0xb87c, 0x8ffe);
  2019. + ocp_reg_write(tp, 0xb87e, 0x0907);
  2020. + ocp_reg_write(tp, 0xb87c, 0x80d6);
  2021. + ocp_reg_write(tp, 0xb87e, 0x2801);
  2022. + ocp_reg_write(tp, 0xb87c, 0x80f2);
  2023. + ocp_reg_write(tp, 0xb87e, 0x2801);
  2024. + ocp_reg_write(tp, 0xb87c, 0x80f4);
  2025. + ocp_reg_write(tp, 0xb87e, 0x6077);
  2026. + ocp_reg_write(tp, 0xb506, 0x01e7);
  2027. +
  2028. + ocp_reg_write(tp, 0xb87c, 0x8013);
  2029. + ocp_reg_write(tp, 0xb87e, 0x0700);
  2030. + ocp_reg_write(tp, 0xb87c, 0x8fb9);
  2031. + ocp_reg_write(tp, 0xb87e, 0x2801);
  2032. + ocp_reg_write(tp, 0xb87c, 0x8fba);
  2033. + ocp_reg_write(tp, 0xb87e, 0x0100);
  2034. + ocp_reg_write(tp, 0xb87c, 0x8fbc);
  2035. + ocp_reg_write(tp, 0xb87e, 0x1900);
  2036. + ocp_reg_write(tp, 0xb87c, 0x8fbe);
  2037. + ocp_reg_write(tp, 0xb87e, 0xe100);
  2038. + ocp_reg_write(tp, 0xb87c, 0x8fc0);
  2039. + ocp_reg_write(tp, 0xb87e, 0x0800);
  2040. + ocp_reg_write(tp, 0xb87c, 0x8fc2);
  2041. + ocp_reg_write(tp, 0xb87e, 0xe500);
  2042. + ocp_reg_write(tp, 0xb87c, 0x8fc4);
  2043. + ocp_reg_write(tp, 0xb87e, 0x0f00);
  2044. + ocp_reg_write(tp, 0xb87c, 0x8fc6);
  2045. + ocp_reg_write(tp, 0xb87e, 0xf100);
  2046. + ocp_reg_write(tp, 0xb87c, 0x8fc8);
  2047. + ocp_reg_write(tp, 0xb87e, 0x0400);
  2048. + ocp_reg_write(tp, 0xb87c, 0x8fca);
  2049. + ocp_reg_write(tp, 0xb87e, 0xf300);
  2050. + ocp_reg_write(tp, 0xb87c, 0x8fcc);
  2051. + ocp_reg_write(tp, 0xb87e, 0xfd00);
  2052. + ocp_reg_write(tp, 0xb87c, 0x8fce);
  2053. + ocp_reg_write(tp, 0xb87e, 0xff00);
  2054. + ocp_reg_write(tp, 0xb87c, 0x8fd0);
  2055. + ocp_reg_write(tp, 0xb87e, 0xfb00);
  2056. + ocp_reg_write(tp, 0xb87c, 0x8fd2);
  2057. + ocp_reg_write(tp, 0xb87e, 0x0100);
  2058. + ocp_reg_write(tp, 0xb87c, 0x8fd4);
  2059. + ocp_reg_write(tp, 0xb87e, 0xf400);
  2060. + ocp_reg_write(tp, 0xb87c, 0x8fd6);
  2061. + ocp_reg_write(tp, 0xb87e, 0xff00);
  2062. + ocp_reg_write(tp, 0xb87c, 0x8fd8);
  2063. + ocp_reg_write(tp, 0xb87e, 0xf600);
  2064. +
  2065. + ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_USB_CFG);
  2066. + ocp_data |= EN_XG_LIP | EN_G_LIP;
  2067. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_USB_CFG, ocp_data);
  2068. + ocp_reg_write(tp, 0xb87c, 0x813d);
  2069. + ocp_reg_write(tp, 0xb87e, 0x390e);
  2070. + ocp_reg_write(tp, 0xb87c, 0x814f);
  2071. + ocp_reg_write(tp, 0xb87e, 0x790e);
  2072. + ocp_reg_write(tp, 0xb87c, 0x80b0);
  2073. + ocp_reg_write(tp, 0xb87e, 0x0f31);
  2074. + data = ocp_reg_read(tp, 0xbf4c);
  2075. + data |= BIT(1);
  2076. + ocp_reg_write(tp, 0xbf4c, data);
  2077. + data = ocp_reg_read(tp, 0xbcca);
  2078. + data |= BIT(9) | BIT(8);
  2079. + ocp_reg_write(tp, 0xbcca, data);
  2080. + ocp_reg_write(tp, 0xb87c, 0x8141);
  2081. + ocp_reg_write(tp, 0xb87e, 0x320e);
  2082. + ocp_reg_write(tp, 0xb87c, 0x8153);
  2083. + ocp_reg_write(tp, 0xb87e, 0x720e);
  2084. + ocp_reg_write(tp, 0xb87c, 0x8529);
  2085. + ocp_reg_write(tp, 0xb87e, 0x050e);
  2086. + data = ocp_reg_read(tp, OCP_EEE_CFG);
  2087. + data &= ~CTAP_SHORT_EN;
  2088. + ocp_reg_write(tp, OCP_EEE_CFG, data);
  2089. +
  2090. + sram_write(tp, 0x816c, 0xc4a0);
  2091. + sram_write(tp, 0x8170, 0xc4a0);
  2092. + sram_write(tp, 0x8174, 0x04a0);
  2093. + sram_write(tp, 0x8178, 0x04a0);
  2094. + sram_write(tp, 0x817c, 0x0719);
  2095. + sram_write(tp, 0x8ff4, 0x0400);
  2096. + sram_write(tp, 0x8ff1, 0x0404);
  2097. +
  2098. + ocp_reg_write(tp, 0xbf4a, 0x001b);
  2099. + ocp_reg_write(tp, 0xb87c, 0x8033);
  2100. + ocp_reg_write(tp, 0xb87e, 0x7c13);
  2101. + ocp_reg_write(tp, 0xb87c, 0x8037);
  2102. + ocp_reg_write(tp, 0xb87e, 0x7c13);
  2103. + ocp_reg_write(tp, 0xb87c, 0x803b);
  2104. + ocp_reg_write(tp, 0xb87e, 0xfc32);
  2105. + ocp_reg_write(tp, 0xb87c, 0x803f);
  2106. + ocp_reg_write(tp, 0xb87e, 0x7c13);
  2107. + ocp_reg_write(tp, 0xb87c, 0x8043);
  2108. + ocp_reg_write(tp, 0xb87e, 0x7c13);
  2109. + ocp_reg_write(tp, 0xb87c, 0x8047);
  2110. + ocp_reg_write(tp, 0xb87e, 0x7c13);
  2111. +
  2112. + ocp_reg_write(tp, 0xb87c, 0x8145);
  2113. + ocp_reg_write(tp, 0xb87e, 0x370e);
  2114. + ocp_reg_write(tp, 0xb87c, 0x8157);
  2115. + ocp_reg_write(tp, 0xb87e, 0x770e);
  2116. + ocp_reg_write(tp, 0xb87c, 0x8169);
  2117. + ocp_reg_write(tp, 0xb87e, 0x0d0a);
  2118. + ocp_reg_write(tp, 0xb87c, 0x817b);
  2119. + ocp_reg_write(tp, 0xb87e, 0x1d0a);
  2120. +
  2121. + data = sram_read(tp, 0x8217);
  2122. + data &= ~0xff00;
  2123. + data |= 0x5000;
  2124. + sram_write(tp, 0x8217, data);
  2125. + data = sram_read(tp, 0x821a);
  2126. + data &= ~0xff00;
  2127. + data |= 0x5000;
  2128. + sram_write(tp, 0x821a, data);
  2129. + sram_write(tp, 0x80da, 0x0403);
  2130. + data = sram_read(tp, 0x80dc);
  2131. + data &= ~0xff00;
  2132. + data |= 0x1000;
  2133. + sram_write(tp, 0x80dc, data);
  2134. + sram_write(tp, 0x80b3, 0x0384);
  2135. + sram_write(tp, 0x80b7, 0x2007);
  2136. + data = sram_read(tp, 0x80ba);
  2137. + data &= ~0xff00;
  2138. + data |= 0x6c00;
  2139. + sram_write(tp, 0x80ba, data);
  2140. + sram_write(tp, 0x80b5, 0xf009);
  2141. + data = sram_read(tp, 0x80bd);
  2142. + data &= ~0xff00;
  2143. + data |= 0x9f00;
  2144. + sram_write(tp, 0x80bd, data);
  2145. + sram_write(tp, 0x80c7, 0xf083);
  2146. + sram_write(tp, 0x80dd, 0x03f0);
  2147. + data = sram_read(tp, 0x80df);
  2148. + data &= ~0xff00;
  2149. + data |= 0x1000;
  2150. + sram_write(tp, 0x80df, data);
  2151. + sram_write(tp, 0x80cb, 0x2007);
  2152. + data = sram_read(tp, 0x80ce);
  2153. + data &= ~0xff00;
  2154. + data |= 0x6c00;
  2155. + sram_write(tp, 0x80ce, data);
  2156. + sram_write(tp, 0x80c9, 0x8009);
  2157. + data = sram_read(tp, 0x80d1);
  2158. + data &= ~0xff00;
  2159. + data |= 0x8000;
  2160. + sram_write(tp, 0x80d1, data);
  2161. + sram_write(tp, 0x80a3, 0x200a);
  2162. + sram_write(tp, 0x80a5, 0xf0ad);
  2163. + sram_write(tp, 0x809f, 0x6073);
  2164. + sram_write(tp, 0x80a1, 0x000b);
  2165. + data = sram_read(tp, 0x80a9);
  2166. + data &= ~0xff00;
  2167. + data |= 0xc000;
  2168. + sram_write(tp, 0x80a9, data);
  2169. +
  2170. + if (rtl_phy_patch_request(tp, true, true))
  2171. + return;
  2172. +
  2173. + data = ocp_reg_read(tp, 0xb896);
  2174. + data &= ~BIT(0);
  2175. + ocp_reg_write(tp, 0xb896, data);
  2176. + data = ocp_reg_read(tp, 0xb892);
  2177. + data &= ~0xff00;
  2178. + ocp_reg_write(tp, 0xb892, data);
  2179. + ocp_reg_write(tp, 0xb88e, 0xc23e);
  2180. + ocp_reg_write(tp, 0xb890, 0x0000);
  2181. + ocp_reg_write(tp, 0xb88e, 0xc240);
  2182. + ocp_reg_write(tp, 0xb890, 0x0103);
  2183. + ocp_reg_write(tp, 0xb88e, 0xc242);
  2184. + ocp_reg_write(tp, 0xb890, 0x0507);
  2185. + ocp_reg_write(tp, 0xb88e, 0xc244);
  2186. + ocp_reg_write(tp, 0xb890, 0x090b);
  2187. + ocp_reg_write(tp, 0xb88e, 0xc246);
  2188. + ocp_reg_write(tp, 0xb890, 0x0c0e);
  2189. + ocp_reg_write(tp, 0xb88e, 0xc248);
  2190. + ocp_reg_write(tp, 0xb890, 0x1012);
  2191. + ocp_reg_write(tp, 0xb88e, 0xc24a);
  2192. + ocp_reg_write(tp, 0xb890, 0x1416);
  2193. + data = ocp_reg_read(tp, 0xb896);
  2194. + data |= BIT(0);
  2195. + ocp_reg_write(tp, 0xb896, data);
  2196. +
  2197. + rtl_phy_patch_request(tp, false, true);
  2198. +
  2199. + data = ocp_reg_read(tp, 0xa86a);
  2200. + data |= BIT(0);
  2201. + ocp_reg_write(tp, 0xa86a, data);
  2202. + data = ocp_reg_read(tp, 0xa6f0);
  2203. + data |= BIT(0);
  2204. + ocp_reg_write(tp, 0xa6f0, data);
  2205. +
  2206. + ocp_reg_write(tp, 0xbfa0, 0xd70d);
  2207. + ocp_reg_write(tp, 0xbfa2, 0x4100);
  2208. + ocp_reg_write(tp, 0xbfa4, 0xe868);
  2209. + ocp_reg_write(tp, 0xbfa6, 0xdc59);
  2210. + ocp_reg_write(tp, 0xb54c, 0x3c18);
  2211. + data = ocp_reg_read(tp, 0xbfa4);
  2212. + data &= ~BIT(5);
  2213. + ocp_reg_write(tp, 0xbfa4, data);
  2214. + data = sram_read(tp, 0x817d);
  2215. + data |= BIT(12);
  2216. + sram_write(tp, 0x817d, data);
  2217. + break;
  2218. + case RTL_VER_13:
  2219. + /* 2.5G INRX */
  2220. + data = ocp_reg_read(tp, 0xac46);
  2221. + data &= ~0x00f0;
  2222. + data |= 0x0090;
  2223. + ocp_reg_write(tp, 0xac46, data);
  2224. + data = ocp_reg_read(tp, 0xad30);
  2225. + data &= ~0x0003;
  2226. + data |= 0x0001;
  2227. + ocp_reg_write(tp, 0xad30, data);
  2228. + fallthrough;
  2229. + case RTL_VER_15:
  2230. + /* EEE parameter */
  2231. + ocp_reg_write(tp, 0xb87c, 0x80f5);
  2232. + ocp_reg_write(tp, 0xb87e, 0x760e);
  2233. + ocp_reg_write(tp, 0xb87c, 0x8107);
  2234. + ocp_reg_write(tp, 0xb87e, 0x360e);
  2235. + ocp_reg_write(tp, 0xb87c, 0x8551);
  2236. + data = ocp_reg_read(tp, 0xb87e);
  2237. + data &= ~0xff00;
  2238. + data |= 0x0800;
  2239. + ocp_reg_write(tp, 0xb87e, data);
  2240. +
  2241. + /* ADC_PGA parameter */
  2242. + data = ocp_reg_read(tp, 0xbf00);
  2243. + data &= ~0xe000;
  2244. + data |= 0xa000;
  2245. + ocp_reg_write(tp, 0xbf00, data);
  2246. + data = ocp_reg_read(tp, 0xbf46);
  2247. + data &= ~0x0f00;
  2248. + data |= 0x0300;
  2249. + ocp_reg_write(tp, 0xbf46, data);
  2250. +
  2251. + /* Green Table-PGA, 1G full viterbi */
  2252. + sram_write(tp, 0x8044, 0x2417);
  2253. + sram_write(tp, 0x804a, 0x2417);
  2254. + sram_write(tp, 0x8050, 0x2417);
  2255. + sram_write(tp, 0x8056, 0x2417);
  2256. + sram_write(tp, 0x805c, 0x2417);
  2257. + sram_write(tp, 0x8062, 0x2417);
  2258. + sram_write(tp, 0x8068, 0x2417);
  2259. + sram_write(tp, 0x806e, 0x2417);
  2260. + sram_write(tp, 0x8074, 0x2417);
  2261. + sram_write(tp, 0x807a, 0x2417);
  2262. +
  2263. + /* XG PLL */
  2264. + data = ocp_reg_read(tp, 0xbf84);
  2265. + data &= ~0xe000;
  2266. + data |= 0xa000;
  2267. + ocp_reg_write(tp, 0xbf84, data);
  2268. + break;
  2269. + default:
  2270. + break;
  2271. + }
  2272. +
  2273. + if (rtl_phy_patch_request(tp, true, true))
  2274. + return;
  2275. +
  2276. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4);
  2277. + ocp_data |= EEE_SPDWN_EN;
  2278. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL4, ocp_data);
  2279. +
  2280. + data = ocp_reg_read(tp, OCP_DOWN_SPEED);
  2281. + data &= ~(EN_EEE_100 | EN_EEE_1000);
  2282. + data |= EN_10M_CLKDIV;
  2283. + ocp_reg_write(tp, OCP_DOWN_SPEED, data);
  2284. + tp->ups_info._10m_ckdiv = true;
  2285. + tp->ups_info.eee_plloff_100 = false;
  2286. + tp->ups_info.eee_plloff_giga = false;
  2287. +
  2288. + data = ocp_reg_read(tp, OCP_POWER_CFG);
  2289. + data &= ~EEE_CLKDIV_EN;
  2290. + ocp_reg_write(tp, OCP_POWER_CFG, data);
  2291. + tp->ups_info.eee_ckdiv = false;
  2292. +
  2293. + rtl_phy_patch_request(tp, false, true);
  2294. +
  2295. + rtl_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags));
  2296. +
  2297. + data = ocp_reg_read(tp, 0xa428);
  2298. + data &= ~BIT(9);
  2299. + ocp_reg_write(tp, 0xa428, data);
  2300. + data = ocp_reg_read(tp, 0xa5ea);
  2301. + data &= ~BIT(0);
  2302. + ocp_reg_write(tp, 0xa5ea, data);
  2303. + tp->ups_info.lite_mode = 0;
  2304. +
  2305. + if (tp->eee_en)
  2306. + rtl_eee_enable(tp, true);
  2307. +
  2308. + r8153_aldps_en(tp, true);
  2309. + r8152b_enable_fc(tp);
  2310. + r8153_u2p3en(tp, true);
  2311. +
  2312. + set_bit(PHY_RESET, &tp->flags);
  2313. +}
  2314. +
  2315. +static void r8156_init(struct r8152 *tp)
  2316. +{
  2317. + u32 ocp_data;
  2318. + u16 data;
  2319. + int i;
  2320. +
  2321. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  2322. + return;
  2323. +
  2324. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP);
  2325. + ocp_data &= ~EN_ALL_SPEED;
  2326. + ocp_write_byte(tp, MCU_TYPE_USB, USB_ECM_OP, ocp_data);
  2327. +
  2328. + ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0);
  2329. +
  2330. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_ECM_OPTION);
  2331. + ocp_data |= BYPASS_MAC_RESET;
  2332. + ocp_write_word(tp, MCU_TYPE_USB, USB_ECM_OPTION, ocp_data);
  2333. +
  2334. + r8153b_u1u2en(tp, false);
  2335. +
  2336. + for (i = 0; i < 500; i++) {
  2337. + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
  2338. + AUTOLOAD_DONE)
  2339. + break;
  2340. +
  2341. + msleep(20);
  2342. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  2343. + return;
  2344. + }
  2345. +
  2346. + data = r8153_phy_status(tp, 0);
  2347. + if (data == PHY_STAT_EXT_INIT) {
  2348. + data = ocp_reg_read(tp, 0xa468);
  2349. + data &= ~(BIT(3) | BIT(1));
  2350. + ocp_reg_write(tp, 0xa468, data);
  2351. + }
  2352. +
  2353. + data = r8152_mdio_read(tp, MII_BMCR);
  2354. + if (data & BMCR_PDOWN) {
  2355. + data &= ~BMCR_PDOWN;
  2356. + r8152_mdio_write(tp, MII_BMCR, data);
  2357. + }
  2358. +
  2359. + data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
  2360. + WARN_ON_ONCE(data != PHY_STAT_LAN_ON);
  2361. +
  2362. + r8153_u2p3en(tp, false);
  2363. +
  2364. + /* MSC timer = 0xfff * 8ms = 32760 ms */
  2365. + ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff);
  2366. +
  2367. + /* U1/U2/L1 idle timer. 500 us */
  2368. + ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500);
  2369. +
  2370. + r8153b_power_cut_en(tp, false);
  2371. + r8156_ups_en(tp, false);
  2372. + r8153_queue_wake(tp, false);
  2373. + rtl_runtime_suspend_enable(tp, false);
  2374. +
  2375. + if (tp->udev->speed >= USB_SPEED_SUPER)
  2376. + r8153b_u1u2en(tp, true);
  2377. +
  2378. + usb_enable_lpm(tp->udev);
  2379. +
  2380. + r8156_mac_clk_spd(tp, true);
  2381. +
  2382. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
  2383. + ocp_data &= ~PLA_MCU_SPDWN_EN;
  2384. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
  2385. +
  2386. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
  2387. + if (rtl8152_get_speed(tp) & LINK_STATUS)
  2388. + ocp_data |= CUR_LINK_OK;
  2389. + else
  2390. + ocp_data &= ~CUR_LINK_OK;
  2391. + ocp_data |= POLL_LINK_CHG;
  2392. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
  2393. +
  2394. + set_bit(GREEN_ETHERNET, &tp->flags);
  2395. +
  2396. + /* rx aggregation */
  2397. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  2398. + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
  2399. + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  2400. +
  2401. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_BMU_CONFIG);
  2402. + ocp_data |= ACT_ODMA;
  2403. + ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ocp_data);
  2404. +
  2405. + rtl_tally_reset(tp);
  2406. +
  2407. + tp->coalesce = 15000; /* 15 us */
  2408. +}
  2409. +
  2410. +static void r8156b_init(struct r8152 *tp)
  2411. +{
  2412. + u32 ocp_data;
  2413. + u16 data;
  2414. + int i;
  2415. +
  2416. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  2417. + return;
  2418. +
  2419. + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP);
  2420. + ocp_data &= ~EN_ALL_SPEED;
  2421. + ocp_write_byte(tp, MCU_TYPE_USB, USB_ECM_OP, ocp_data);
  2422. +
  2423. + ocp_write_word(tp, MCU_TYPE_USB, USB_SPEED_OPTION, 0);
  2424. +
  2425. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_ECM_OPTION);
  2426. + ocp_data |= BYPASS_MAC_RESET;
  2427. + ocp_write_word(tp, MCU_TYPE_USB, USB_ECM_OPTION, ocp_data);
  2428. +
  2429. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL);
  2430. + ocp_data |= RX_DETECT8;
  2431. + ocp_write_word(tp, MCU_TYPE_USB, USB_U2P3_CTRL, ocp_data);
  2432. +
  2433. + r8153b_u1u2en(tp, false);
  2434. +
  2435. + switch (tp->version) {
  2436. + case RTL_VER_13:
  2437. + case RTL_VER_15:
  2438. + r8156b_wait_loading_flash(tp);
  2439. + break;
  2440. + default:
  2441. + break;
  2442. + }
  2443. +
  2444. + for (i = 0; i < 500; i++) {
  2445. + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
  2446. + AUTOLOAD_DONE)
  2447. + break;
  2448. +
  2449. + msleep(20);
  2450. + if (test_bit(RTL8152_UNPLUG, &tp->flags))
  2451. + return;
  2452. + }
  2453. +
  2454. + data = r8153_phy_status(tp, 0);
  2455. + if (data == PHY_STAT_EXT_INIT) {
  2456. + data = ocp_reg_read(tp, 0xa468);
  2457. + data &= ~(BIT(3) | BIT(1));
  2458. + ocp_reg_write(tp, 0xa468, data);
  2459. +
  2460. + data = ocp_reg_read(tp, 0xa466);
  2461. + data &= ~BIT(0);
  2462. + ocp_reg_write(tp, 0xa466, data);
  2463. + }
  2464. +
  2465. + data = r8152_mdio_read(tp, MII_BMCR);
  2466. + if (data & BMCR_PDOWN) {
  2467. + data &= ~BMCR_PDOWN;
  2468. + r8152_mdio_write(tp, MII_BMCR, data);
  2469. + }
  2470. +
  2471. + data = r8153_phy_status(tp, PHY_STAT_LAN_ON);
  2472. +
  2473. + r8153_u2p3en(tp, false);
  2474. +
  2475. + /* MSC timer = 0xfff * 8ms = 32760 ms */
  2476. + ocp_write_word(tp, MCU_TYPE_USB, USB_MSC_TIMER, 0x0fff);
  2477. +
  2478. + /* U1/U2/L1 idle timer. 500 us */
  2479. + ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500);
  2480. +
  2481. + r8153b_power_cut_en(tp, false);
  2482. + r8156_ups_en(tp, false);
  2483. + r8153_queue_wake(tp, false);
  2484. + rtl_runtime_suspend_enable(tp, false);
  2485. +
  2486. + if (tp->udev->speed >= USB_SPEED_SUPER)
  2487. + r8153b_u1u2en(tp, true);
  2488. +
  2489. + usb_enable_lpm(tp->udev);
  2490. +
  2491. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RCR);
  2492. + ocp_data &= ~SLOT_EN;
  2493. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
  2494. +
  2495. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_CPCR);
  2496. + ocp_data |= FLOW_CTRL_EN;
  2497. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
  2498. +
  2499. + /* enable fc timer and set timer to 600 ms. */
  2500. + ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER,
  2501. + CTRL_TIMER_EN | (600 / 8));
  2502. +
  2503. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_CTRL);
  2504. + if (!(ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL) & DACK_DET_EN))
  2505. + ocp_data |= FLOW_CTRL_PATCH_2;
  2506. + ocp_data &= ~AUTO_SPEEDUP;
  2507. + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_CTRL, ocp_data);
  2508. +
  2509. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_FW_TASK);
  2510. + ocp_data |= FC_PATCH_TASK;
  2511. + ocp_write_word(tp, MCU_TYPE_USB, USB_FW_TASK, ocp_data);
  2512. +
  2513. + r8156_mac_clk_spd(tp, true);
  2514. +
  2515. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
  2516. + ocp_data &= ~PLA_MCU_SPDWN_EN;
  2517. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
  2518. +
  2519. + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS);
  2520. + if (rtl8152_get_speed(tp) & LINK_STATUS)
  2521. + ocp_data |= CUR_LINK_OK;
  2522. + else
  2523. + ocp_data &= ~CUR_LINK_OK;
  2524. + ocp_data |= POLL_LINK_CHG;
  2525. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_EXTRA_STATUS, ocp_data);
  2526. +
  2527. + set_bit(GREEN_ETHERNET, &tp->flags);
  2528. +
  2529. + /* rx aggregation */
  2530. + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
  2531. + ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
  2532. + ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data);
  2533. +
  2534. + rtl_tally_reset(tp);
  2535. +
  2536. + tp->coalesce = 15000; /* 15 us */
  2537. +}
  2538. +
  2539. static int rtl8152_pre_reset(struct usb_interface *intf)
  2540. {
  2541. struct r8152 *tp = usb_get_intfdata(intf);
  2542. @@ -5992,6 +7924,22 @@ int rtl8152_get_link_ksettings(struct ne
  2543. mii_ethtool_get_link_ksettings(&tp->mii, cmd);
  2544. + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  2545. + cmd->link_modes.supported, tp->support_2500full);
  2546. +
  2547. + if (tp->support_2500full) {
  2548. + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  2549. + cmd->link_modes.advertising,
  2550. + ocp_reg_read(tp, OCP_10GBT_CTRL) & MDIO_AN_10GBT_CTRL_ADV2_5G);
  2551. +
  2552. + linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  2553. + cmd->link_modes.lp_advertising,
  2554. + ocp_reg_read(tp, OCP_10GBT_STAT) & MDIO_AN_10GBT_STAT_LP2_5G);
  2555. +
  2556. + if (is_speed_2500(rtl8152_get_speed(tp)))
  2557. + cmd->base.speed = SPEED_2500;
  2558. + }
  2559. +
  2560. mutex_unlock(&tp->control);
  2561. usb_autopm_put_interface(tp->intf);
  2562. @@ -6035,6 +7983,10 @@ static int rtl8152_set_link_ksettings(st
  2563. cmd->link_modes.advertising))
  2564. advertising |= RTL_ADVERTISED_1000_FULL;
  2565. + if (test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  2566. + cmd->link_modes.advertising))
  2567. + advertising |= RTL_ADVERTISED_2500_FULL;
  2568. +
  2569. mutex_lock(&tp->control);
  2570. ret = rtl8152_set_speed(tp, cmd->base.autoneg, cmd->base.speed,
  2571. @@ -6624,6 +8576,67 @@ static int rtl_ops_init(struct r8152 *tp
  2572. tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
  2573. break;
  2574. + case RTL_VER_11:
  2575. + tp->eee_en = true;
  2576. + tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
  2577. + fallthrough;
  2578. + case RTL_VER_10:
  2579. + ops->init = r8156_init;
  2580. + ops->enable = rtl8156_enable;
  2581. + ops->disable = rtl8153_disable;
  2582. + ops->up = rtl8156_up;
  2583. + ops->down = rtl8156_down;
  2584. + ops->unload = rtl8153_unload;
  2585. + ops->eee_get = r8153_get_eee;
  2586. + ops->eee_set = r8152_set_eee;
  2587. + ops->in_nway = rtl8153_in_nway;
  2588. + ops->hw_phy_cfg = r8156_hw_phy_cfg;
  2589. + ops->autosuspend_en = rtl8156_runtime_enable;
  2590. + ops->change_mtu = rtl8156_change_mtu;
  2591. + tp->rx_buf_sz = 48 * 1024;
  2592. + tp->support_2500full = 1;
  2593. + break;
  2594. +
  2595. + case RTL_VER_12:
  2596. + case RTL_VER_13:
  2597. + tp->support_2500full = 1;
  2598. + fallthrough;
  2599. + case RTL_VER_15:
  2600. + tp->eee_en = true;
  2601. + tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
  2602. + ops->init = r8156b_init;
  2603. + ops->enable = rtl8156b_enable;
  2604. + ops->disable = rtl8153_disable;
  2605. + ops->up = rtl8156_up;
  2606. + ops->down = rtl8156_down;
  2607. + ops->unload = rtl8153_unload;
  2608. + ops->eee_get = r8153_get_eee;
  2609. + ops->eee_set = r8152_set_eee;
  2610. + ops->in_nway = rtl8153_in_nway;
  2611. + ops->hw_phy_cfg = r8156b_hw_phy_cfg;
  2612. + ops->autosuspend_en = rtl8156_runtime_enable;
  2613. + ops->change_mtu = rtl8156_change_mtu;
  2614. + tp->rx_buf_sz = 48 * 1024;
  2615. + break;
  2616. +
  2617. + case RTL_VER_14:
  2618. + ops->init = r8153c_init;
  2619. + ops->enable = rtl8153_enable;
  2620. + ops->disable = rtl8153_disable;
  2621. + ops->up = rtl8153c_up;
  2622. + ops->down = rtl8153b_down;
  2623. + ops->unload = rtl8153_unload;
  2624. + ops->eee_get = r8153_get_eee;
  2625. + ops->eee_set = r8152_set_eee;
  2626. + ops->in_nway = rtl8153_in_nway;
  2627. + ops->hw_phy_cfg = r8153c_hw_phy_cfg;
  2628. + ops->autosuspend_en = rtl8153c_runtime_enable;
  2629. + ops->change_mtu = rtl8153c_change_mtu;
  2630. + tp->rx_buf_sz = 32 * 1024;
  2631. + tp->eee_en = true;
  2632. + tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
  2633. + break;
  2634. +
  2635. default:
  2636. ret = -ENODEV;
  2637. dev_err(&tp->intf->dev, "Unknown Device\n");
  2638. @@ -6637,11 +8650,13 @@ static int rtl_ops_init(struct r8152 *tp
  2639. #define FIRMWARE_8153A_3 "rtl_nic/rtl8153a-3.fw"
  2640. #define FIRMWARE_8153A_4 "rtl_nic/rtl8153a-4.fw"
  2641. #define FIRMWARE_8153B_2 "rtl_nic/rtl8153b-2.fw"
  2642. +#define FIRMWARE_8153C_1 "rtl_nic/rtl8153c-1.fw"
  2643. MODULE_FIRMWARE(FIRMWARE_8153A_2);
  2644. MODULE_FIRMWARE(FIRMWARE_8153A_3);
  2645. MODULE_FIRMWARE(FIRMWARE_8153A_4);
  2646. MODULE_FIRMWARE(FIRMWARE_8153B_2);
  2647. +MODULE_FIRMWARE(FIRMWARE_8153C_1);
  2648. static int rtl_fw_init(struct r8152 *tp)
  2649. {
  2650. @@ -6667,6 +8682,11 @@ static int rtl_fw_init(struct r8152 *tp)
  2651. rtl_fw->pre_fw = r8153b_pre_firmware_1;
  2652. rtl_fw->post_fw = r8153b_post_firmware_1;
  2653. break;
  2654. + case RTL_VER_14:
  2655. + rtl_fw->fw_name = FIRMWARE_8153C_1;
  2656. + rtl_fw->pre_fw = r8153b_pre_firmware_1;
  2657. + rtl_fw->post_fw = r8153c_post_firmware_1;
  2658. + break;
  2659. default:
  2660. break;
  2661. }
  2662. @@ -6722,6 +8742,27 @@ u8 rtl8152_get_version(struct usb_interf
  2663. case 0x6010:
  2664. version = RTL_VER_09;
  2665. break;
  2666. + case 0x7010:
  2667. + version = RTL_TEST_01;
  2668. + break;
  2669. + case 0x7020:
  2670. + version = RTL_VER_10;
  2671. + break;
  2672. + case 0x7030:
  2673. + version = RTL_VER_11;
  2674. + break;
  2675. + case 0x7400:
  2676. + version = RTL_VER_12;
  2677. + break;
  2678. + case 0x7410:
  2679. + version = RTL_VER_13;
  2680. + break;
  2681. + case 0x6400:
  2682. + version = RTL_VER_14;
  2683. + break;
  2684. + case 0x7420:
  2685. + version = RTL_VER_15;
  2686. + break;
  2687. default:
  2688. version = RTL_VER_UNKNOWN;
  2689. dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data);
  2690. @@ -6834,12 +8875,29 @@ static int rtl8152_probe(struct usb_inte
  2691. /* MTU range: 68 - 1500 or 9194 */
  2692. netdev->min_mtu = ETH_MIN_MTU;
  2693. switch (tp->version) {
  2694. + case RTL_VER_03:
  2695. + case RTL_VER_04:
  2696. + case RTL_VER_05:
  2697. + case RTL_VER_06:
  2698. + case RTL_VER_08:
  2699. + case RTL_VER_09:
  2700. + case RTL_VER_14:
  2701. + netdev->max_mtu = size_to_mtu(9 * 1024);
  2702. + break;
  2703. + case RTL_VER_10:
  2704. + case RTL_VER_11:
  2705. + netdev->max_mtu = size_to_mtu(15 * 1024);
  2706. + break;
  2707. + case RTL_VER_12:
  2708. + case RTL_VER_13:
  2709. + case RTL_VER_15:
  2710. + netdev->max_mtu = size_to_mtu(16 * 1024);
  2711. + break;
  2712. case RTL_VER_01:
  2713. case RTL_VER_02:
  2714. - netdev->max_mtu = ETH_DATA_LEN;
  2715. - break;
  2716. + case RTL_VER_07:
  2717. default:
  2718. - netdev->max_mtu = size_to_mtu(9 * 1024);
  2719. + netdev->max_mtu = ETH_DATA_LEN;
  2720. break;
  2721. }
  2722. @@ -6855,7 +8913,13 @@ static int rtl8152_probe(struct usb_inte
  2723. tp->advertising = RTL_ADVERTISED_10_HALF | RTL_ADVERTISED_10_FULL |
  2724. RTL_ADVERTISED_100_HALF | RTL_ADVERTISED_100_FULL;
  2725. if (tp->mii.supports_gmii) {
  2726. - tp->speed = SPEED_1000;
  2727. + if (tp->support_2500full &&
  2728. + tp->udev->speed >= USB_SPEED_SUPER) {
  2729. + tp->speed = SPEED_2500;
  2730. + tp->advertising |= RTL_ADVERTISED_2500_FULL;
  2731. + } else {
  2732. + tp->speed = SPEED_1000;
  2733. + }
  2734. tp->advertising |= RTL_ADVERTISED_1000_FULL;
  2735. }
  2736. tp->duplex = DUPLEX_FULL;
  2737. @@ -6879,7 +8943,11 @@ static int rtl8152_probe(struct usb_inte
  2738. set_ethernet_addr(tp);
  2739. usb_set_intfdata(intf, tp);
  2740. - netif_napi_add(netdev, &tp->napi, r8152_poll, RTL8152_NAPI_WEIGHT);
  2741. +
  2742. + if (tp->support_2500full)
  2743. + netif_napi_add(netdev, &tp->napi, r8152_poll, 256);
  2744. + else
  2745. + netif_napi_add(netdev, &tp->napi, r8152_poll, 64);
  2746. ret = register_netdev(netdev);
  2747. if (ret != 0) {
  2748. @@ -6915,7 +8983,8 @@ static void rtl8152_disconnect(struct us
  2749. unregister_netdev(tp->netdev);
  2750. tasklet_kill(&tp->tx_tl);
  2751. cancel_delayed_work_sync(&tp->hw_phy_work);
  2752. - tp->rtl_ops.unload(tp);
  2753. + if (tp->rtl_ops.unload)
  2754. + tp->rtl_ops.unload(tp);
  2755. rtl8152_release_firmware(tp);
  2756. free_netdev(tp->netdev);
  2757. }
  2758. @@ -6935,13 +9004,28 @@ static void rtl8152_disconnect(struct us
  2759. .idProduct = (prod), \
  2760. .bInterfaceClass = USB_CLASS_COMM, \
  2761. .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
  2762. + .bInterfaceProtocol = USB_CDC_PROTO_NONE \
  2763. +}, \
  2764. +{ \
  2765. + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | \
  2766. + USB_DEVICE_ID_MATCH_DEVICE, \
  2767. + .idVendor = (vend), \
  2768. + .idProduct = (prod), \
  2769. + .bInterfaceClass = USB_CLASS_COMM, \
  2770. + .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM, \
  2771. .bInterfaceProtocol = USB_CDC_PROTO_NONE
  2772. /* table of devices that work with this driver */
  2773. static const struct usb_device_id rtl8152_table[] = {
  2774. + /* Realtek */
  2775. {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050)},
  2776. + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8053)},
  2777. {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
  2778. {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
  2779. + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8155)},
  2780. + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8156)},
  2781. +
  2782. + /* Microsoft */
  2783. {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)},
  2784. {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)},
  2785. {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927)},