2
0

rtl83xx-phy.c 110 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Realtek RTL838X Ethernet MDIO interface driver
  3. *
  4. * Copyright (C) 2020 B. Koblitz
  5. */
  6. #include <linux/module.h>
  7. #include <linux/delay.h>
  8. #include <linux/of.h>
  9. #include <linux/phy.h>
  10. #include <linux/netdevice.h>
  11. #include <linux/firmware.h>
  12. #include <linux/crc32.h>
  13. #include <linux/sfp.h>
  14. #include <linux/mii.h>
  15. #include <linux/mdio.h>
  16. #include <asm/mach-rtl838x/mach-rtl83xx.h>
  17. #include "rtl83xx-phy.h"
  18. extern struct rtl83xx_soc_info soc_info;
  19. extern struct mutex smi_lock;
  20. #define PHY_PAGE_2 2
  21. #define PHY_PAGE_4 4
  22. /* all Clause-22 RealTek MDIO PHYs use register 0x1f for page select */
  23. #define RTL8XXX_PAGE_SELECT 0x1f
  24. #define RTL8XXX_PAGE_MAIN 0x0000
  25. #define RTL821X_PAGE_PORT 0x0266
  26. #define RTL821X_PAGE_POWER 0x0a40
  27. #define RTL821X_PAGE_GPHY 0x0a42
  28. #define RTL821X_PAGE_MAC 0x0a43
  29. #define RTL821X_PAGE_STATE 0x0b80
  30. #define RTL821X_PAGE_PATCH 0x0b82
  31. /* Using the special page 0xfff with the MDIO controller found in
  32. * RealTek SoCs allows to access the PHY in RAW mode, ie. bypassing
  33. * the cache and paging engine of the MDIO controller.
  34. */
  35. #define RTL83XX_PAGE_RAW 0x0fff
  36. /* internal RTL821X PHY uses register 0x1d to select media page */
  37. #define RTL821XINT_MEDIA_PAGE_SELECT 0x1d
  38. /* external RTL821X PHY uses register 0x1e to select media page */
  39. #define RTL821XEXT_MEDIA_PAGE_SELECT 0x1e
  40. #define RTL821X_MEDIA_PAGE_AUTO 0
  41. #define RTL821X_MEDIA_PAGE_COPPER 1
  42. #define RTL821X_MEDIA_PAGE_FIBRE 3
  43. #define RTL821X_MEDIA_PAGE_INTERNAL 8
  44. #define RTL9300_PHY_ID_MASK 0xf0ffffff
  45. /* This lock protects the state of the SoC automatically polling the PHYs over the SMI
  46. * bus to detect e.g. link and media changes. For operations on the PHYs such as
  47. * patching or other configuration changes such as EEE, polling needs to be disabled
  48. * since otherwise these operations may fails or lead to unpredictable results.
  49. */
  50. DEFINE_MUTEX(poll_lock);
  51. static const struct firmware rtl838x_8380_fw;
  52. static const struct firmware rtl838x_8214fc_fw;
  53. static const struct firmware rtl838x_8218b_fw;
  54. static u64 disable_polling(int port)
  55. {
  56. u64 saved_state;
  57. mutex_lock(&poll_lock);
  58. switch (soc_info.family) {
  59. case RTL8380_FAMILY_ID:
  60. saved_state = sw_r32(RTL838X_SMI_POLL_CTRL);
  61. sw_w32_mask(BIT(port), 0, RTL838X_SMI_POLL_CTRL);
  62. break;
  63. case RTL8390_FAMILY_ID:
  64. saved_state = sw_r32(RTL839X_SMI_PORT_POLLING_CTRL + 4);
  65. saved_state <<= 32;
  66. saved_state |= sw_r32(RTL839X_SMI_PORT_POLLING_CTRL);
  67. sw_w32_mask(BIT(port % 32), 0,
  68. RTL839X_SMI_PORT_POLLING_CTRL + ((port >> 5) << 2));
  69. break;
  70. case RTL9300_FAMILY_ID:
  71. saved_state = sw_r32(RTL930X_SMI_POLL_CTRL);
  72. sw_w32_mask(BIT(port), 0, RTL930X_SMI_POLL_CTRL);
  73. break;
  74. case RTL9310_FAMILY_ID:
  75. pr_warn("%s not implemented for RTL931X\n", __func__);
  76. break;
  77. }
  78. mutex_unlock(&poll_lock);
  79. return saved_state;
  80. }
  81. static int resume_polling(u64 saved_state)
  82. {
  83. mutex_lock(&poll_lock);
  84. switch (soc_info.family) {
  85. case RTL8380_FAMILY_ID:
  86. sw_w32(saved_state, RTL838X_SMI_POLL_CTRL);
  87. break;
  88. case RTL8390_FAMILY_ID:
  89. sw_w32(saved_state >> 32, RTL839X_SMI_PORT_POLLING_CTRL + 4);
  90. sw_w32(saved_state, RTL839X_SMI_PORT_POLLING_CTRL);
  91. break;
  92. case RTL9300_FAMILY_ID:
  93. sw_w32(saved_state, RTL930X_SMI_POLL_CTRL);
  94. break;
  95. case RTL9310_FAMILY_ID:
  96. pr_warn("%s not implemented for RTL931X\n", __func__);
  97. break;
  98. }
  99. mutex_unlock(&poll_lock);
  100. return 0;
  101. }
  102. static void rtl8380_int_phy_on_off(struct phy_device *phydev, bool on)
  103. {
  104. phy_modify(phydev, 0, BMCR_PDOWN, on ? 0 : BMCR_PDOWN);
  105. }
  106. static void rtl8380_rtl8214fc_on_off(struct phy_device *phydev, bool on)
  107. {
  108. /* fiber ports */
  109. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_FIBRE);
  110. phy_modify(phydev, 0x10, BMCR_PDOWN, on ? 0 : BMCR_PDOWN);
  111. /* copper ports */
  112. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  113. phy_modify_paged(phydev, RTL821X_PAGE_POWER, 0x10, BMCR_PDOWN, on ? 0 : BMCR_PDOWN);
  114. }
  115. static void rtl8380_phy_reset(struct phy_device *phydev)
  116. {
  117. phy_modify(phydev, 0, BMCR_RESET, BMCR_RESET);
  118. }
  119. /* The access registers for SDS_MODE_SEL and the LSB for each SDS within */
  120. u16 rtl9300_sds_regs[] = { 0x0194, 0x0194, 0x0194, 0x0194, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
  121. 0x02A4, 0x02A4, 0x0198, 0x0198 };
  122. u8 rtl9300_sds_lsb[] = { 0, 6, 12, 18, 0, 6, 12, 18, 0, 6, 0, 6};
  123. /* Reset the SerDes by powering it off and set a new operations mode
  124. * of the SerDes. 0x1f is off. Other modes are
  125. * 0x02: SGMII 0x04: 1000BX_FIBER 0x05: FIBER100
  126. * 0x06: QSGMII 0x09: RSGMII 0x0d: USXGMII
  127. * 0x10: XSGMII 0x12: HISGMII 0x16: 2500Base_X
  128. * 0x17: RXAUI_LITE 0x19: RXAUI_PLUS 0x1a: 10G Base-R
  129. * 0x1b: 10GR1000BX_AUTO 0x1f: OFF
  130. */
  131. void rtl9300_sds_rst(int sds_num, u32 mode)
  132. {
  133. pr_info("%s %d\n", __func__, mode);
  134. if (sds_num < 0 || sds_num > 11) {
  135. pr_err("Wrong SerDes number: %d\n", sds_num);
  136. return;
  137. }
  138. sw_w32_mask(0x1f << rtl9300_sds_lsb[sds_num], 0x1f << rtl9300_sds_lsb[sds_num],
  139. rtl9300_sds_regs[sds_num]);
  140. mdelay(10);
  141. sw_w32_mask(0x1f << rtl9300_sds_lsb[sds_num], mode << rtl9300_sds_lsb[sds_num],
  142. rtl9300_sds_regs[sds_num]);
  143. mdelay(10);
  144. pr_debug("%s: 194:%08x 198:%08x 2a0:%08x 2a4:%08x\n", __func__,
  145. sw_r32(0x194), sw_r32(0x198), sw_r32(0x2a0), sw_r32(0x2a4));
  146. }
  147. void rtl9300_sds_set(int sds_num, u32 mode)
  148. {
  149. pr_info("%s %d\n", __func__, mode);
  150. if (sds_num < 0 || sds_num > 11) {
  151. pr_err("Wrong SerDes number: %d\n", sds_num);
  152. return;
  153. }
  154. sw_w32_mask(0x1f << rtl9300_sds_lsb[sds_num], mode << rtl9300_sds_lsb[sds_num],
  155. rtl9300_sds_regs[sds_num]);
  156. mdelay(10);
  157. pr_debug("%s: 194:%08x 198:%08x 2a0:%08x 2a4:%08x\n", __func__,
  158. sw_r32(0x194), sw_r32(0x198), sw_r32(0x2a0), sw_r32(0x2a4));
  159. }
  160. u32 rtl9300_sds_mode_get(int sds_num)
  161. {
  162. u32 v;
  163. if (sds_num < 0 || sds_num > 11) {
  164. pr_err("Wrong SerDes number: %d\n", sds_num);
  165. return 0;
  166. }
  167. v = sw_r32(rtl9300_sds_regs[sds_num]);
  168. v >>= rtl9300_sds_lsb[sds_num];
  169. return v & 0x1f;
  170. }
  171. /* On the RTL839x family of SoCs with inbuilt SerDes, these SerDes are accessed through
  172. * a 2048 bit register that holds the contents of the PHY being simulated by the SoC.
  173. */
  174. int rtl839x_read_sds_phy(int phy_addr, int phy_reg)
  175. {
  176. int offset = 0;
  177. int reg;
  178. u32 val;
  179. if (phy_addr == 49)
  180. offset = 0x100;
  181. /* For the RTL8393 internal SerDes, we simulate a PHY ID in registers 2/3
  182. * which would otherwise read as 0.
  183. */
  184. if (soc_info.id == 0x8393) {
  185. if (phy_reg == MII_PHYSID1)
  186. return 0x1c;
  187. if (phy_reg == MII_PHYSID2)
  188. return 0x8393;
  189. }
  190. /* Register RTL839X_SDS12_13_XSG0 is 2048 bit broad, the MSB (bit 15) of the
  191. * 0th PHY register is bit 1023 (in byte 0x80). Because PHY-registers are 16
  192. * bit broad, we offset by reg << 1. In the SoC 2 registers are stored in
  193. * one 32 bit register.
  194. */
  195. reg = (phy_reg << 1) & 0xfc;
  196. val = sw_r32(RTL839X_SDS12_13_XSG0 + offset + 0x80 + reg);
  197. if (phy_reg & 1)
  198. val = (val >> 16) & 0xffff;
  199. else
  200. val &= 0xffff;
  201. return val;
  202. }
  203. /* On the RTL930x family of SoCs, the internal SerDes are accessed through an IO
  204. * register which simulates commands to an internal MDIO bus.
  205. */
  206. int rtl930x_read_sds_phy(int phy_addr, int page, int phy_reg)
  207. {
  208. int i;
  209. u32 cmd = phy_addr << 2 | page << 7 | phy_reg << 13 | 1;
  210. sw_w32(cmd, RTL930X_SDS_INDACS_CMD);
  211. for (i = 0; i < 100; i++) {
  212. if (!(sw_r32(RTL930X_SDS_INDACS_CMD) & 0x1))
  213. break;
  214. mdelay(1);
  215. }
  216. if (i >= 100)
  217. return -EIO;
  218. return sw_r32(RTL930X_SDS_INDACS_DATA) & 0xffff;
  219. }
  220. int rtl930x_write_sds_phy(int phy_addr, int page, int phy_reg, u16 v)
  221. {
  222. int i;
  223. u32 cmd;
  224. sw_w32(v, RTL930X_SDS_INDACS_DATA);
  225. cmd = phy_addr << 2 | page << 7 | phy_reg << 13 | 0x3;
  226. sw_w32(cmd, RTL930X_SDS_INDACS_CMD);
  227. for (i = 0; i < 100; i++) {
  228. if (!(sw_r32(RTL930X_SDS_INDACS_CMD) & 0x1))
  229. break;
  230. mdelay(1);
  231. }
  232. if (i >= 100) {
  233. pr_info("%s ERROR !!!!!!!!!!!!!!!!!!!!\n", __func__);
  234. return -EIO;
  235. }
  236. return 0;
  237. }
  238. int rtl931x_read_sds_phy(int phy_addr, int page, int phy_reg)
  239. {
  240. int i;
  241. u32 cmd = phy_addr << 2 | page << 7 | phy_reg << 13 | 1;
  242. pr_debug("%s: phy_addr(SDS-ID) %d, phy_reg: %d\n", __func__, phy_addr, phy_reg);
  243. sw_w32(cmd, RTL931X_SERDES_INDRT_ACCESS_CTRL);
  244. for (i = 0; i < 100; i++) {
  245. if (!(sw_r32(RTL931X_SERDES_INDRT_ACCESS_CTRL) & 0x1))
  246. break;
  247. mdelay(1);
  248. }
  249. if (i >= 100)
  250. return -EIO;
  251. pr_debug("%s: returning %04x\n", __func__, sw_r32(RTL931X_SERDES_INDRT_DATA_CTRL) & 0xffff);
  252. return sw_r32(RTL931X_SERDES_INDRT_DATA_CTRL) & 0xffff;
  253. }
  254. int rtl931x_write_sds_phy(int phy_addr, int page, int phy_reg, u16 v)
  255. {
  256. int i;
  257. u32 cmd;
  258. cmd = phy_addr << 2 | page << 7 | phy_reg << 13;
  259. sw_w32(cmd, RTL931X_SERDES_INDRT_ACCESS_CTRL);
  260. sw_w32(v, RTL931X_SERDES_INDRT_DATA_CTRL);
  261. cmd = sw_r32(RTL931X_SERDES_INDRT_ACCESS_CTRL) | 0x3;
  262. sw_w32(cmd, RTL931X_SERDES_INDRT_ACCESS_CTRL);
  263. for (i = 0; i < 100; i++) {
  264. if (!(sw_r32(RTL931X_SERDES_INDRT_ACCESS_CTRL) & 0x1))
  265. break;
  266. mdelay(1);
  267. }
  268. if (i >= 100)
  269. return -EIO;
  270. return 0;
  271. }
  272. /* On the RTL838x SoCs, the internal SerDes is accessed through direct access to
  273. * standard PHY registers, where a 32 bit register holds a 16 bit word as found
  274. * in a standard page 0 of a PHY
  275. */
  276. int rtl838x_read_sds_phy(int phy_addr, int phy_reg)
  277. {
  278. int offset = 0;
  279. u32 val;
  280. if (phy_addr == 26)
  281. offset = 0x100;
  282. val = sw_r32(RTL838X_SDS4_FIB_REG0 + offset + (phy_reg << 2)) & 0xffff;
  283. return val;
  284. }
  285. int rtl839x_write_sds_phy(int phy_addr, int phy_reg, u16 v)
  286. {
  287. int offset = 0;
  288. int reg;
  289. u32 val;
  290. if (phy_addr == 49)
  291. offset = 0x100;
  292. reg = (phy_reg << 1) & 0xfc;
  293. val = v;
  294. if (phy_reg & 1) {
  295. val = val << 16;
  296. sw_w32_mask(0xffff0000, val,
  297. RTL839X_SDS12_13_XSG0 + offset + 0x80 + reg);
  298. } else {
  299. sw_w32_mask(0xffff, val,
  300. RTL839X_SDS12_13_XSG0 + offset + 0x80 + reg);
  301. }
  302. return 0;
  303. }
  304. /* Read the link and speed status of the 2 internal SGMII/1000Base-X
  305. * ports of the RTL838x SoCs
  306. */
  307. static int rtl8380_read_status(struct phy_device *phydev)
  308. {
  309. int err;
  310. err = genphy_read_status(phydev);
  311. if (phydev->link) {
  312. phydev->speed = SPEED_1000;
  313. phydev->duplex = DUPLEX_FULL;
  314. }
  315. return err;
  316. }
  317. /* Read the link and speed status of the 2 internal SGMII/1000Base-X
  318. * ports of the RTL8393 SoC
  319. */
  320. static int rtl8393_read_status(struct phy_device *phydev)
  321. {
  322. int offset = 0;
  323. int err;
  324. int phy_addr = phydev->mdio.addr;
  325. u32 v;
  326. err = genphy_read_status(phydev);
  327. if (phy_addr == 49)
  328. offset = 0x100;
  329. if (phydev->link) {
  330. phydev->speed = SPEED_100;
  331. /* Read SPD_RD_00 (bit 13) and SPD_RD_01 (bit 6) out of the internal
  332. * PHY registers
  333. */
  334. v = sw_r32(RTL839X_SDS12_13_XSG0 + offset + 0x80);
  335. if (!(v & (1 << 13)) && (v & (1 << 6)))
  336. phydev->speed = SPEED_1000;
  337. phydev->duplex = DUPLEX_FULL;
  338. }
  339. return err;
  340. }
  341. static int rtl8226_read_page(struct phy_device *phydev)
  342. {
  343. return __phy_read(phydev, RTL8XXX_PAGE_SELECT);
  344. }
  345. static int rtl8226_write_page(struct phy_device *phydev, int page)
  346. {
  347. return __phy_write(phydev, RTL8XXX_PAGE_SELECT, page);
  348. }
  349. static int rtl8226_read_status(struct phy_device *phydev)
  350. {
  351. int ret = 0;
  352. u32 val;
  353. /* TODO: ret = genphy_read_status(phydev);
  354. * if (ret < 0) {
  355. * pr_info("%s: genphy_read_status failed\n", __func__);
  356. * return ret;
  357. * }
  358. */
  359. /* Link status must be read twice */
  360. for (int i = 0; i < 2; i++)
  361. val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA402);
  362. phydev->link = val & BIT(2) ? 1 : 0;
  363. if (!phydev->link)
  364. goto out;
  365. /* Read duplex status */
  366. val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA434);
  367. if (val < 0)
  368. goto out;
  369. phydev->duplex = !!(val & BIT(3));
  370. /* Read speed */
  371. val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA434);
  372. switch (val & 0x0630) {
  373. case 0x0000:
  374. phydev->speed = SPEED_10;
  375. break;
  376. case 0x0010:
  377. phydev->speed = SPEED_100;
  378. break;
  379. case 0x0020:
  380. phydev->speed = SPEED_1000;
  381. break;
  382. case 0x0200:
  383. phydev->speed = SPEED_10000;
  384. break;
  385. case 0x0210:
  386. phydev->speed = SPEED_2500;
  387. break;
  388. case 0x0220:
  389. phydev->speed = SPEED_5000;
  390. break;
  391. default:
  392. break;
  393. }
  394. out:
  395. return ret;
  396. }
  397. static int rtl8226_advertise_aneg(struct phy_device *phydev)
  398. {
  399. int ret = 0;
  400. u32 v;
  401. pr_info("In %s\n", __func__);
  402. v = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
  403. if (v < 0)
  404. goto out;
  405. v |= ADVERTISE_10HALF;
  406. v |= ADVERTISE_10FULL;
  407. v |= ADVERTISE_100HALF;
  408. v |= ADVERTISE_100FULL;
  409. ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, v);
  410. /* Allow 1GBit */
  411. v = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA412);
  412. if (v < 0)
  413. goto out;
  414. v |= ADVERTISE_1000FULL;
  415. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, 0xA412, v);
  416. if (ret < 0)
  417. goto out;
  418. /* Allow 2.5G */
  419. v = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL);
  420. if (v < 0)
  421. goto out;
  422. v |= MDIO_AN_10GBT_CTRL_ADV2_5G;
  423. ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, v);
  424. out:
  425. return ret;
  426. }
  427. static int rtl8226_config_aneg(struct phy_device *phydev)
  428. {
  429. int ret = 0;
  430. u32 v;
  431. pr_debug("In %s\n", __func__);
  432. if (phydev->autoneg == AUTONEG_ENABLE) {
  433. ret = rtl8226_advertise_aneg(phydev);
  434. if (ret)
  435. goto out;
  436. /* AutoNegotiationEnable */
  437. v = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
  438. if (v < 0)
  439. goto out;
  440. v |= MDIO_AN_CTRL1_ENABLE; /* Enable AN */
  441. ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1, v);
  442. if (ret < 0)
  443. goto out;
  444. /* RestartAutoNegotiation */
  445. v = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA400);
  446. if (v < 0)
  447. goto out;
  448. v |= MDIO_AN_CTRL1_RESTART;
  449. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, 0xA400, v);
  450. }
  451. /* TODO: ret = __genphy_config_aneg(phydev, ret); */
  452. out:
  453. return ret;
  454. }
  455. static int rtl8226_get_eee(struct phy_device *phydev,
  456. struct ethtool_eee *e)
  457. {
  458. u32 val;
  459. int addr = phydev->mdio.addr;
  460. pr_debug("In %s, port %d, was enabled: %d\n", __func__, addr, e->eee_enabled);
  461. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
  462. if (e->eee_enabled) {
  463. e->eee_enabled = !!(val & MDIO_EEE_100TX);
  464. if (!e->eee_enabled) {
  465. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
  466. e->eee_enabled = !!(val & MDIO_EEE_2_5GT);
  467. }
  468. }
  469. pr_debug("%s: enabled: %d\n", __func__, e->eee_enabled);
  470. return 0;
  471. }
  472. static int rtl8226_set_eee(struct phy_device *phydev, struct ethtool_eee *e)
  473. {
  474. int port = phydev->mdio.addr;
  475. u64 poll_state;
  476. bool an_enabled;
  477. u32 val;
  478. pr_info("In %s, port %d, enabled %d\n", __func__, port, e->eee_enabled);
  479. poll_state = disable_polling(port);
  480. /* Remember aneg state */
  481. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
  482. an_enabled = !!(val & MDIO_AN_CTRL1_ENABLE);
  483. /* Setup 100/1000MBit */
  484. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
  485. if (e->eee_enabled)
  486. val |= (MDIO_EEE_100TX | MDIO_EEE_1000T);
  487. else
  488. val &= (MDIO_EEE_100TX | MDIO_EEE_1000T);
  489. phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, val);
  490. /* Setup 2.5GBit */
  491. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
  492. if (e->eee_enabled)
  493. val |= MDIO_EEE_2_5GT;
  494. else
  495. val &= MDIO_EEE_2_5GT;
  496. phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2, val);
  497. /* RestartAutoNegotiation */
  498. val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA400);
  499. val |= MDIO_AN_CTRL1_RESTART;
  500. phy_write_mmd(phydev, MDIO_MMD_VEND2, 0xA400, val);
  501. resume_polling(poll_state);
  502. return 0;
  503. }
  504. static struct fw_header *rtl838x_request_fw(struct phy_device *phydev,
  505. const struct firmware *fw,
  506. const char *name)
  507. {
  508. struct device *dev = &phydev->mdio.dev;
  509. int err;
  510. struct fw_header *h;
  511. uint32_t checksum, my_checksum;
  512. err = request_firmware(&fw, name, dev);
  513. if (err < 0)
  514. goto out;
  515. if (fw->size < sizeof(struct fw_header)) {
  516. pr_err("Firmware size too small.\n");
  517. err = -EINVAL;
  518. goto out;
  519. }
  520. h = (struct fw_header *) fw->data;
  521. pr_info("Firmware loaded. Size %d, magic: %08x\n", fw->size, h->magic);
  522. if (h->magic != 0x83808380) {
  523. pr_err("Wrong firmware file: MAGIC mismatch.\n");
  524. goto out;
  525. }
  526. checksum = h->checksum;
  527. h->checksum = 0;
  528. my_checksum = ~crc32(0xFFFFFFFFU, fw->data, fw->size);
  529. if (checksum != my_checksum) {
  530. pr_err("Firmware checksum mismatch.\n");
  531. err = -EINVAL;
  532. goto out;
  533. }
  534. h->checksum = checksum;
  535. return h;
  536. out:
  537. dev_err(dev, "Unable to load firmware %s (%d)\n", name, err);
  538. return NULL;
  539. }
  540. static void rtl821x_phy_setup_package_broadcast(struct phy_device *phydev, bool enable)
  541. {
  542. int mac = phydev->mdio.addr;
  543. /* select main page 0 */
  544. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  545. /* write to 0x8 to register 0x1d on main page 0 */
  546. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
  547. /* select page 0x266 */
  548. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL821X_PAGE_PORT);
  549. /* set phy id and target broadcast bitmap in register 0x16 on page 0x266 */
  550. phy_write_paged(phydev, RTL83XX_PAGE_RAW, 0x16, (enable?0xff00:0x00) | mac);
  551. /* return to main page 0 */
  552. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  553. /* write to 0x0 to register 0x1d on main page 0 */
  554. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  555. mdelay(1);
  556. }
  557. static int rtl8390_configure_generic(struct phy_device *phydev)
  558. {
  559. int mac = phydev->mdio.addr;
  560. u32 val, phy_id;
  561. val = phy_read(phydev, 2);
  562. phy_id = val << 16;
  563. val = phy_read(phydev, 3);
  564. phy_id |= val;
  565. pr_debug("Phy on MAC %d: %x\n", mac, phy_id);
  566. /* Read internal PHY ID */
  567. phy_write_paged(phydev, 31, 27, 0x0002);
  568. val = phy_read_paged(phydev, 31, 28);
  569. /* Internal RTL8218B, version 2 */
  570. phydev_info(phydev, "Detected unknown %x\n", val);
  571. return 0;
  572. }
  573. static int rtl8380_configure_int_rtl8218b(struct phy_device *phydev)
  574. {
  575. u32 val, phy_id;
  576. int mac = phydev->mdio.addr;
  577. struct fw_header *h;
  578. u32 *rtl838x_6275B_intPhy_perport;
  579. u32 *rtl8218b_6276B_hwEsd_perport;
  580. val = phy_read(phydev, 2);
  581. phy_id = val << 16;
  582. val = phy_read(phydev, 3);
  583. phy_id |= val;
  584. pr_debug("Phy on MAC %d: %x\n", mac, phy_id);
  585. /* Read internal PHY ID */
  586. phy_write_paged(phydev, 31, 27, 0x0002);
  587. val = phy_read_paged(phydev, 31, 28);
  588. if (val != 0x6275) {
  589. phydev_err(phydev, "Expected internal RTL8218B, found PHY-ID %x\n", val);
  590. return -1;
  591. }
  592. /* Internal RTL8218B, version 2 */
  593. phydev_info(phydev, "Detected internal RTL8218B\n");
  594. h = rtl838x_request_fw(phydev, &rtl838x_8380_fw, FIRMWARE_838X_8380_1);
  595. if (!h)
  596. return -1;
  597. if (h->phy != 0x83800000) {
  598. phydev_err(phydev, "Wrong firmware file: PHY mismatch.\n");
  599. return -1;
  600. }
  601. rtl838x_6275B_intPhy_perport = (void *)h + sizeof(struct fw_header) + h->parts[8].start;
  602. rtl8218b_6276B_hwEsd_perport = (void *)h + sizeof(struct fw_header) + h->parts[9].start;
  603. // Currently not used
  604. // if (sw_r32(RTL838X_DMY_REG31) == 0x1) {
  605. // int ipd_flag = 1;
  606. // }
  607. val = phy_read(phydev, MII_BMCR);
  608. if (val & BMCR_PDOWN)
  609. rtl8380_int_phy_on_off(phydev, true);
  610. else
  611. rtl8380_phy_reset(phydev);
  612. msleep(100);
  613. /* Ready PHY for patch */
  614. for (int p = 0; p < 8; p++) {
  615. phy_package_port_write_paged(phydev, p, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL821X_PAGE_PATCH);
  616. phy_package_port_write_paged(phydev, p, RTL83XX_PAGE_RAW, 0x10, 0x0010);
  617. }
  618. msleep(500);
  619. for (int p = 0; p < 8; p++) {
  620. int i;
  621. for (i = 0; i < 100 ; i++) {
  622. val = phy_package_port_read_paged(phydev, p, RTL821X_PAGE_STATE, 0x10);
  623. if (val & 0x40)
  624. break;
  625. }
  626. if (i >= 100) {
  627. phydev_err(phydev,
  628. "ERROR: Port %d not ready for patch.\n",
  629. mac + p);
  630. return -1;
  631. }
  632. }
  633. for (int p = 0; p < 8; p++) {
  634. int i;
  635. i = 0;
  636. while (rtl838x_6275B_intPhy_perport[i * 2]) {
  637. phy_package_port_write_paged(phydev, p, RTL83XX_PAGE_RAW,
  638. rtl838x_6275B_intPhy_perport[i * 2],
  639. rtl838x_6275B_intPhy_perport[i * 2 + 1]);
  640. i++;
  641. }
  642. i = 0;
  643. while (rtl8218b_6276B_hwEsd_perport[i * 2]) {
  644. phy_package_port_write_paged(phydev, p, RTL83XX_PAGE_RAW,
  645. rtl8218b_6276B_hwEsd_perport[i * 2],
  646. rtl8218b_6276B_hwEsd_perport[i * 2 + 1]);
  647. i++;
  648. }
  649. }
  650. return 0;
  651. }
  652. static int rtl8380_configure_ext_rtl8218b(struct phy_device *phydev)
  653. {
  654. u32 val, ipd, phy_id;
  655. int mac = phydev->mdio.addr;
  656. struct fw_header *h;
  657. u32 *rtl8380_rtl8218b_perchip;
  658. u32 *rtl8218B_6276B_rtl8380_perport;
  659. u32 *rtl8380_rtl8218b_perport;
  660. if (soc_info.family == RTL8380_FAMILY_ID && mac != 0 && mac != 16) {
  661. phydev_err(phydev, "External RTL8218B must have PHY-IDs 0 or 16!\n");
  662. return -1;
  663. }
  664. val = phy_read(phydev, 2);
  665. phy_id = val << 16;
  666. val = phy_read(phydev, 3);
  667. phy_id |= val;
  668. pr_info("Phy on MAC %d: %x\n", mac, phy_id);
  669. /* Read internal PHY ID */
  670. phy_write_paged(phydev, 31, 27, 0x0002);
  671. val = phy_read_paged(phydev, 31, 28);
  672. if (val != 0x6276) {
  673. phydev_err(phydev, "Expected external RTL8218B, found PHY-ID %x\n", val);
  674. return -1;
  675. }
  676. phydev_info(phydev, "Detected external RTL8218B\n");
  677. h = rtl838x_request_fw(phydev, &rtl838x_8218b_fw, FIRMWARE_838X_8218b_1);
  678. if (!h)
  679. return -1;
  680. if (h->phy != 0x8218b000) {
  681. phydev_err(phydev, "Wrong firmware file: PHY mismatch.\n");
  682. return -1;
  683. }
  684. rtl8380_rtl8218b_perchip = (void *)h + sizeof(struct fw_header) + h->parts[0].start;
  685. rtl8218B_6276B_rtl8380_perport = (void *)h + sizeof(struct fw_header) + h->parts[1].start;
  686. rtl8380_rtl8218b_perport = (void *)h + sizeof(struct fw_header) + h->parts[2].start;
  687. val = phy_read(phydev, MII_BMCR);
  688. if (val & BMCR_PDOWN)
  689. rtl8380_int_phy_on_off(phydev, true);
  690. else
  691. rtl8380_phy_reset(phydev);
  692. msleep(100);
  693. /* Get Chip revision */
  694. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  695. phy_write_paged(phydev, RTL83XX_PAGE_RAW, 0x1b, 0x4);
  696. val = phy_read_paged(phydev, RTL83XX_PAGE_RAW, 0x1c);
  697. phydev_info(phydev, "Detected chip revision %04x\n", val);
  698. for (int i = 0; rtl8380_rtl8218b_perchip[i * 3] &&
  699. rtl8380_rtl8218b_perchip[i * 3 + 1]; i++) {
  700. phy_package_port_write_paged(phydev, rtl8380_rtl8218b_perchip[i * 3],
  701. RTL83XX_PAGE_RAW, rtl8380_rtl8218b_perchip[i * 3 + 1],
  702. rtl8380_rtl8218b_perchip[i * 3 + 2]);
  703. }
  704. /* Enable PHY */
  705. for (int i = 0; i < 8; i++) {
  706. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  707. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, 0x00, 0x1140);
  708. }
  709. mdelay(100);
  710. /* Request patch */
  711. for (int i = 0; i < 8; i++) {
  712. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL821X_PAGE_PATCH);
  713. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, 0x10, 0x0010);
  714. }
  715. mdelay(300);
  716. /* Verify patch readiness */
  717. for (int i = 0; i < 8; i++) {
  718. int l;
  719. for (l = 0; l < 100; l++) {
  720. val = phy_package_port_read_paged(phydev, i, RTL821X_PAGE_STATE, 0x10);
  721. if (val & 0x40)
  722. break;
  723. }
  724. if (l >= 100) {
  725. phydev_err(phydev, "Could not patch PHY\n");
  726. return -1;
  727. }
  728. }
  729. /* Use Broadcast ID method for patching */
  730. rtl821x_phy_setup_package_broadcast(phydev, true);
  731. phy_write_paged(phydev, RTL83XX_PAGE_RAW, 30, 8);
  732. phy_write_paged(phydev, 0x26e, 17, 0xb);
  733. phy_write_paged(phydev, 0x26e, 16, 0x2);
  734. mdelay(1);
  735. ipd = phy_read_paged(phydev, 0x26e, 19);
  736. phy_write_paged(phydev, 0, 30, 0);
  737. ipd = (ipd >> 4) & 0xf; /* unused ? */
  738. for (int i = 0; rtl8218B_6276B_rtl8380_perport[i * 2]; i++) {
  739. phy_write_paged(phydev, RTL83XX_PAGE_RAW, rtl8218B_6276B_rtl8380_perport[i * 2],
  740. rtl8218B_6276B_rtl8380_perport[i * 2 + 1]);
  741. }
  742. /* Disable broadcast ID */
  743. rtl821x_phy_setup_package_broadcast(phydev, false);
  744. return 0;
  745. }
  746. static int rtl8218b_ext_match_phy_device(struct phy_device *phydev)
  747. {
  748. int addr = phydev->mdio.addr;
  749. /* Both the RTL8214FC and the external RTL8218B have the same
  750. * PHY ID. On the RTL838x, the RTL8218B can only be attached_dev
  751. * at PHY IDs 0-7, while the RTL8214FC must be attached via
  752. * the pair of SGMII/1000Base-X with higher PHY-IDs
  753. */
  754. if (soc_info.family == RTL8380_FAMILY_ID)
  755. return phydev->phy_id == PHY_ID_RTL8218B_E && addr < 8;
  756. else
  757. return phydev->phy_id == PHY_ID_RTL8218B_E;
  758. }
  759. static bool rtl8214fc_media_is_fibre(struct phy_device *phydev)
  760. {
  761. int mac = phydev->mdio.addr;
  762. static int reg[] = {16, 19, 20, 21};
  763. u32 val;
  764. phy_package_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
  765. val = phy_package_read_paged(phydev, RTL821X_PAGE_PORT, reg[mac % 4]);
  766. phy_package_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  767. if (val & BMCR_PDOWN)
  768. return false;
  769. return true;
  770. }
  771. static void rtl8214fc_power_set(struct phy_device *phydev, int port, bool on)
  772. {
  773. char *state = on ? "on" : "off";
  774. if (port == PORT_FIBRE) {
  775. pr_info("%s: Powering %s FIBRE (port %d)\n", __func__, state, phydev->mdio.addr);
  776. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_FIBRE);
  777. } else {
  778. pr_info("%s: Powering %s COPPER (port %d)\n", __func__, state, phydev->mdio.addr);
  779. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  780. }
  781. if (on) {
  782. phy_modify_paged(phydev, RTL821X_PAGE_POWER, 0x10, BMCR_PDOWN, 0);
  783. } else {
  784. phy_modify_paged(phydev, RTL821X_PAGE_POWER, 0x10, 0, BMCR_PDOWN);
  785. }
  786. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  787. }
  788. static int rtl8214fc_suspend(struct phy_device *phydev)
  789. {
  790. rtl8214fc_power_set(phydev, PORT_MII, false);
  791. rtl8214fc_power_set(phydev, PORT_FIBRE, false);
  792. return 0;
  793. }
  794. static int rtl8214fc_resume(struct phy_device *phydev)
  795. {
  796. if (rtl8214fc_media_is_fibre(phydev)) {
  797. rtl8214fc_power_set(phydev, PORT_MII, false);
  798. rtl8214fc_power_set(phydev, PORT_FIBRE, true);
  799. } else {
  800. rtl8214fc_power_set(phydev, PORT_FIBRE, false);
  801. rtl8214fc_power_set(phydev, PORT_MII, true);
  802. }
  803. return 0;
  804. }
  805. static void rtl8214fc_media_set(struct phy_device *phydev, bool set_fibre)
  806. {
  807. int mac = phydev->mdio.addr;
  808. static int reg[] = {16, 19, 20, 21};
  809. int val;
  810. pr_info("%s: port %d, set_fibre: %d\n", __func__, mac, set_fibre);
  811. phy_package_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
  812. val = phy_package_read_paged(phydev, RTL821X_PAGE_PORT, reg[mac % 4]);
  813. val |= BIT(10);
  814. if (set_fibre) {
  815. val &= ~BMCR_PDOWN;
  816. } else {
  817. val |= BMCR_PDOWN;
  818. }
  819. phy_package_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
  820. phy_package_write_paged(phydev, RTL821X_PAGE_PORT, reg[mac % 4], val);
  821. phy_package_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  822. if (!phydev->suspended) {
  823. if (set_fibre) {
  824. rtl8214fc_power_set(phydev, PORT_MII, false);
  825. rtl8214fc_power_set(phydev, PORT_FIBRE, true);
  826. } else {
  827. rtl8214fc_power_set(phydev, PORT_FIBRE, false);
  828. rtl8214fc_power_set(phydev, PORT_MII, true);
  829. }
  830. }
  831. }
  832. static int rtl8214fc_set_port(struct phy_device *phydev, int port)
  833. {
  834. bool is_fibre = (port == PORT_FIBRE ? true : false);
  835. int addr = phydev->mdio.addr;
  836. pr_debug("%s port %d to %d\n", __func__, addr, port);
  837. rtl8214fc_media_set(phydev, is_fibre);
  838. return 0;
  839. }
  840. static int rtl8214fc_get_port(struct phy_device *phydev)
  841. {
  842. int addr = phydev->mdio.addr;
  843. pr_debug("%s: port %d\n", __func__, addr);
  844. if (rtl8214fc_media_is_fibre(phydev))
  845. return PORT_FIBRE;
  846. return PORT_MII;
  847. }
  848. /* Enable EEE on the RTL8218B PHYs
  849. * The method used is not the preferred way (which would be based on the MAC-EEE state,
  850. * but the only way that works since the kernel first enables EEE in the MAC
  851. * and then sets up the PHY. The MAC-based approach would require the oppsite.
  852. */
  853. void rtl8218d_eee_set(struct phy_device *phydev, bool enable)
  854. {
  855. u32 val;
  856. bool an_enabled;
  857. pr_debug("In %s %d, enable %d\n", __func__, phydev->mdio.addr, enable);
  858. /* Set GPHY page to copper */
  859. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  860. val = phy_read(phydev, MII_BMCR);
  861. an_enabled = val & BMCR_ANENABLE;
  862. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
  863. val |= MDIO_EEE_1000T | MDIO_EEE_100TX;
  864. phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, enable ? (MDIO_EEE_100TX | MDIO_EEE_1000T) : 0);
  865. /* 500M EEE ability */
  866. val = phy_read_paged(phydev, RTL821X_PAGE_GPHY, 20);
  867. if (enable)
  868. val |= BIT(7);
  869. else
  870. val &= ~BIT(7);
  871. phy_write_paged(phydev, RTL821X_PAGE_GPHY, 20, val);
  872. /* Restart AN if enabled */
  873. if (an_enabled) {
  874. val = phy_read(phydev, MII_BMCR);
  875. val |= BMCR_ANRESTART;
  876. phy_write(phydev, MII_BMCR, val);
  877. }
  878. /* GPHY page back to auto */
  879. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  880. }
  881. static int rtl8218b_get_eee(struct phy_device *phydev,
  882. struct ethtool_eee *e)
  883. {
  884. u32 val;
  885. int addr = phydev->mdio.addr;
  886. pr_debug("In %s, port %d, was enabled: %d\n", __func__, addr, e->eee_enabled);
  887. /* Set GPHY page to copper */
  888. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  889. val = phy_read_paged(phydev, 7, MDIO_AN_EEE_ADV);
  890. if (e->eee_enabled) {
  891. /* Verify vs MAC-based EEE */
  892. e->eee_enabled = !!(val & BIT(7));
  893. if (!e->eee_enabled) {
  894. val = phy_read_paged(phydev, RTL821X_PAGE_MAC, 25);
  895. e->eee_enabled = !!(val & BIT(4));
  896. }
  897. }
  898. pr_debug("%s: enabled: %d\n", __func__, e->eee_enabled);
  899. /* GPHY page to auto */
  900. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  901. return 0;
  902. }
  903. static int rtl8218d_get_eee(struct phy_device *phydev,
  904. struct ethtool_eee *e)
  905. {
  906. u32 val;
  907. int addr = phydev->mdio.addr;
  908. pr_debug("In %s, port %d, was enabled: %d\n", __func__, addr, e->eee_enabled);
  909. /* Set GPHY page to copper */
  910. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  911. val = phy_read_paged(phydev, 7, MDIO_AN_EEE_ADV);
  912. if (e->eee_enabled)
  913. e->eee_enabled = !!(val & BIT(7));
  914. pr_debug("%s: enabled: %d\n", __func__, e->eee_enabled);
  915. /* GPHY page to auto */
  916. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  917. return 0;
  918. }
  919. static int rtl8214fc_set_eee(struct phy_device *phydev,
  920. struct ethtool_eee *e)
  921. {
  922. u32 poll_state;
  923. int port = phydev->mdio.addr;
  924. bool an_enabled;
  925. u32 val;
  926. pr_debug("In %s port %d, enabled %d\n", __func__, port, e->eee_enabled);
  927. if (rtl8214fc_media_is_fibre(phydev)) {
  928. netdev_err(phydev->attached_dev, "Port %d configured for FIBRE", port);
  929. return -ENOTSUPP;
  930. }
  931. poll_state = disable_polling(port);
  932. /* Set GPHY page to copper */
  933. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  934. /* Get auto-negotiation status */
  935. val = phy_read(phydev, MII_BMCR);
  936. an_enabled = val & BMCR_ANENABLE;
  937. pr_info("%s: aneg: %d\n", __func__, an_enabled);
  938. val = phy_read_paged(phydev, RTL821X_PAGE_MAC, 25);
  939. val &= ~BIT(5); /* Use MAC-based EEE */
  940. phy_write_paged(phydev, RTL821X_PAGE_MAC, 25, val);
  941. /* Enable 100M (bit 1) / 1000M (bit 2) EEE */
  942. phy_write_paged(phydev, 7, MDIO_AN_EEE_ADV, e->eee_enabled ? (MDIO_EEE_100TX | MDIO_EEE_1000T) : 0);
  943. /* 500M EEE ability */
  944. val = phy_read_paged(phydev, RTL821X_PAGE_GPHY, 20);
  945. if (e->eee_enabled)
  946. val |= BIT(7);
  947. else
  948. val &= ~BIT(7);
  949. phy_write_paged(phydev, RTL821X_PAGE_GPHY, 20, val);
  950. /* Restart AN if enabled */
  951. if (an_enabled) {
  952. pr_info("%s: doing aneg\n", __func__);
  953. val = phy_read(phydev, MII_BMCR);
  954. val |= BMCR_ANRESTART;
  955. phy_write(phydev, MII_BMCR, val);
  956. }
  957. /* GPHY page back to auto */
  958. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  959. resume_polling(poll_state);
  960. return 0;
  961. }
  962. static int rtl8214fc_get_eee(struct phy_device *phydev,
  963. struct ethtool_eee *e)
  964. {
  965. int addr = phydev->mdio.addr;
  966. pr_debug("In %s port %d, enabled %d\n", __func__, addr, e->eee_enabled);
  967. if (rtl8214fc_media_is_fibre(phydev)) {
  968. netdev_err(phydev->attached_dev, "Port %d configured for FIBRE", addr);
  969. return -ENOTSUPP;
  970. }
  971. return rtl8218b_get_eee(phydev, e);
  972. }
  973. static int rtl8218b_set_eee(struct phy_device *phydev, struct ethtool_eee *e)
  974. {
  975. int port = phydev->mdio.addr;
  976. u64 poll_state;
  977. u32 val;
  978. bool an_enabled;
  979. pr_info("In %s, port %d, enabled %d\n", __func__, port, e->eee_enabled);
  980. poll_state = disable_polling(port);
  981. /* Set GPHY page to copper */
  982. phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  983. val = phy_read(phydev, MII_BMCR);
  984. an_enabled = val & BMCR_ANENABLE;
  985. if (e->eee_enabled) {
  986. /* 100/1000M EEE Capability */
  987. phy_write(phydev, 13, 0x0007);
  988. phy_write(phydev, 14, 0x003C);
  989. phy_write(phydev, 13, 0x4007);
  990. phy_write(phydev, 14, 0x0006);
  991. val = phy_read_paged(phydev, RTL821X_PAGE_MAC, 25);
  992. val |= BIT(4);
  993. phy_write_paged(phydev, RTL821X_PAGE_MAC, 25, val);
  994. } else {
  995. /* 100/1000M EEE Capability */
  996. phy_write(phydev, 13, 0x0007);
  997. phy_write(phydev, 14, 0x003C);
  998. phy_write(phydev, 13, 0x0007);
  999. phy_write(phydev, 14, 0x0000);
  1000. val = phy_read_paged(phydev, RTL821X_PAGE_MAC, 25);
  1001. val &= ~BIT(4);
  1002. phy_write_paged(phydev, RTL821X_PAGE_MAC, 25, val);
  1003. }
  1004. /* Restart AN if enabled */
  1005. if (an_enabled) {
  1006. val = phy_read(phydev, MII_BMCR);
  1007. val |= BMCR_ANRESTART;
  1008. phy_write(phydev, MII_BMCR, val);
  1009. }
  1010. /* GPHY page back to auto */
  1011. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  1012. pr_info("%s done\n", __func__);
  1013. resume_polling(poll_state);
  1014. return 0;
  1015. }
  1016. static int rtl8218d_set_eee(struct phy_device *phydev, struct ethtool_eee *e)
  1017. {
  1018. int addr = phydev->mdio.addr;
  1019. u64 poll_state;
  1020. pr_info("In %s, port %d, enabled %d\n", __func__, addr, e->eee_enabled);
  1021. poll_state = disable_polling(addr);
  1022. rtl8218d_eee_set(phydev, (bool) e->eee_enabled);
  1023. resume_polling(poll_state);
  1024. return 0;
  1025. }
  1026. static int rtl8214c_match_phy_device(struct phy_device *phydev)
  1027. {
  1028. return phydev->phy_id == PHY_ID_RTL8214C;
  1029. }
  1030. static int rtl8380_configure_rtl8214c(struct phy_device *phydev)
  1031. {
  1032. u32 phy_id, val;
  1033. int mac = phydev->mdio.addr;
  1034. val = phy_read(phydev, 2);
  1035. phy_id = val << 16;
  1036. val = phy_read(phydev, 3);
  1037. phy_id |= val;
  1038. pr_debug("Phy on MAC %d: %x\n", mac, phy_id);
  1039. phydev_info(phydev, "Detected external RTL8214C\n");
  1040. /* GPHY auto conf */
  1041. phy_write_paged(phydev, RTL821X_PAGE_GPHY, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  1042. return 0;
  1043. }
  1044. static int rtl8380_configure_rtl8214fc(struct phy_device *phydev)
  1045. {
  1046. int mac = phydev->mdio.addr;
  1047. struct fw_header *h;
  1048. u32 *rtl8380_rtl8214fc_perchip;
  1049. u32 *rtl8380_rtl8214fc_perport;
  1050. u32 phy_id;
  1051. u32 val;
  1052. val = phy_read(phydev, 2);
  1053. phy_id = val << 16;
  1054. val = phy_read(phydev, 3);
  1055. phy_id |= val;
  1056. pr_debug("Phy on MAC %d: %x\n", mac, phy_id);
  1057. /* Read internal PHY id */
  1058. phy_write_paged(phydev, 0, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  1059. phy_write_paged(phydev, 0x1f, 0x1b, 0x0002);
  1060. val = phy_read_paged(phydev, 0x1f, 0x1c);
  1061. if (val != 0x6276) {
  1062. phydev_err(phydev, "Expected external RTL8214FC, found PHY-ID %x\n", val);
  1063. return -1;
  1064. }
  1065. phydev_info(phydev, "Detected external RTL8214FC\n");
  1066. h = rtl838x_request_fw(phydev, &rtl838x_8214fc_fw, FIRMWARE_838X_8214FC_1);
  1067. if (!h)
  1068. return -1;
  1069. if (h->phy != 0x8214fc00) {
  1070. phydev_err(phydev, "Wrong firmware file: PHY mismatch.\n");
  1071. return -1;
  1072. }
  1073. rtl8380_rtl8214fc_perchip = (void *)h + sizeof(struct fw_header) + h->parts[0].start;
  1074. rtl8380_rtl8214fc_perport = (void *)h + sizeof(struct fw_header) + h->parts[1].start;
  1075. /* detect phy version */
  1076. phy_write_paged(phydev, RTL83XX_PAGE_RAW, 27, 0x0004);
  1077. val = phy_read_paged(phydev, RTL83XX_PAGE_RAW, 28);
  1078. val = phy_read(phydev, 16);
  1079. if (val & BMCR_PDOWN)
  1080. rtl8380_rtl8214fc_on_off(phydev, true);
  1081. else
  1082. rtl8380_phy_reset(phydev);
  1083. msleep(100);
  1084. phy_write_paged(phydev, 0, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  1085. for (int i = 0; rtl8380_rtl8214fc_perchip[i * 3] &&
  1086. rtl8380_rtl8214fc_perchip[i * 3 + 1]; i++) {
  1087. u32 page = 0;
  1088. if (rtl8380_rtl8214fc_perchip[i * 3 + 1] == 0x1f)
  1089. page = rtl8380_rtl8214fc_perchip[i * 3 + 2];
  1090. if (rtl8380_rtl8214fc_perchip[i * 3 + 1] == 0x13 && page == 0x260) {
  1091. val = phy_read_paged(phydev, 0x260, 13);
  1092. val = (val & 0x1f00) | (rtl8380_rtl8214fc_perchip[i * 3 + 2] & 0xe0ff);
  1093. phy_write_paged(phydev, RTL83XX_PAGE_RAW,
  1094. rtl8380_rtl8214fc_perchip[i * 3 + 1], val);
  1095. } else {
  1096. phy_write_paged(phydev, RTL83XX_PAGE_RAW,
  1097. rtl8380_rtl8214fc_perchip[i * 3 + 1],
  1098. rtl8380_rtl8214fc_perchip[i * 3 + 2]);
  1099. }
  1100. }
  1101. /* Force copper medium */
  1102. for (int i = 0; i < 4; i++) {
  1103. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  1104. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_COPPER);
  1105. }
  1106. /* Enable PHY */
  1107. for (int i = 0; i < 4; i++) {
  1108. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  1109. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, 0x00, 0x1140);
  1110. }
  1111. mdelay(100);
  1112. /* Disable Autosensing */
  1113. for (int i = 0; i < 4; i++) {
  1114. int l;
  1115. for (l = 0; l < 100; l++) {
  1116. val = phy_package_port_read_paged(phydev, i, RTL821X_PAGE_GPHY, 0x10);
  1117. if ((val & 0x7) >= 3)
  1118. break;
  1119. }
  1120. if (l >= 100) {
  1121. phydev_err(phydev, "Could not disable autosensing\n");
  1122. return -1;
  1123. }
  1124. }
  1125. /* Request patch */
  1126. for (int i = 0; i < 4; i++) {
  1127. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL821X_PAGE_PATCH);
  1128. phy_package_port_write_paged(phydev, i, RTL83XX_PAGE_RAW, 0x10, 0x0010);
  1129. }
  1130. mdelay(300);
  1131. /* Verify patch readiness */
  1132. for (int i = 0; i < 4; i++) {
  1133. int l;
  1134. for (l = 0; l < 100; l++) {
  1135. val = phy_package_port_read_paged(phydev, i, RTL821X_PAGE_STATE, 0x10);
  1136. if (val & 0x40)
  1137. break;
  1138. }
  1139. if (l >= 100) {
  1140. phydev_err(phydev, "Could not patch PHY\n");
  1141. return -1;
  1142. }
  1143. }
  1144. /* Use Broadcast ID method for patching */
  1145. rtl821x_phy_setup_package_broadcast(phydev, true);
  1146. for (int i = 0; rtl8380_rtl8214fc_perport[i * 2]; i++) {
  1147. phy_write_paged(phydev, RTL83XX_PAGE_RAW, rtl8380_rtl8214fc_perport[i * 2],
  1148. rtl8380_rtl8214fc_perport[i * 2 + 1]);
  1149. }
  1150. /* Disable broadcast ID */
  1151. rtl821x_phy_setup_package_broadcast(phydev, false);
  1152. /* Auto medium selection */
  1153. for (int i = 0; i < 4; i++) {
  1154. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL8XXX_PAGE_SELECT, RTL8XXX_PAGE_MAIN);
  1155. phy_write_paged(phydev, RTL83XX_PAGE_RAW, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
  1156. }
  1157. return 0;
  1158. }
  1159. static int rtl8214fc_match_phy_device(struct phy_device *phydev)
  1160. {
  1161. int addr = phydev->mdio.addr;
  1162. return phydev->phy_id == PHY_ID_RTL8214FC && addr >= 24;
  1163. }
  1164. static int rtl8380_configure_serdes(struct phy_device *phydev)
  1165. {
  1166. u32 v;
  1167. u32 sds_conf_value;
  1168. int i;
  1169. struct fw_header *h;
  1170. u32 *rtl8380_sds_take_reset;
  1171. u32 *rtl8380_sds_common;
  1172. u32 *rtl8380_sds01_qsgmii_6275b;
  1173. u32 *rtl8380_sds23_qsgmii_6275b;
  1174. u32 *rtl8380_sds4_fiber_6275b;
  1175. u32 *rtl8380_sds5_fiber_6275b;
  1176. u32 *rtl8380_sds_reset;
  1177. u32 *rtl8380_sds_release_reset;
  1178. phydev_info(phydev, "Detected internal RTL8380 SERDES\n");
  1179. h = rtl838x_request_fw(phydev, &rtl838x_8218b_fw, FIRMWARE_838X_8380_1);
  1180. if (!h)
  1181. return -1;
  1182. if (h->magic != 0x83808380) {
  1183. phydev_err(phydev, "Wrong firmware file: magic number mismatch.\n");
  1184. return -1;
  1185. }
  1186. rtl8380_sds_take_reset = (void *)h + sizeof(struct fw_header) + h->parts[0].start;
  1187. rtl8380_sds_common = (void *)h + sizeof(struct fw_header) + h->parts[1].start;
  1188. rtl8380_sds01_qsgmii_6275b = (void *)h + sizeof(struct fw_header) + h->parts[2].start;
  1189. rtl8380_sds23_qsgmii_6275b = (void *)h + sizeof(struct fw_header) + h->parts[3].start;
  1190. rtl8380_sds4_fiber_6275b = (void *)h + sizeof(struct fw_header) + h->parts[4].start;
  1191. rtl8380_sds5_fiber_6275b = (void *)h + sizeof(struct fw_header) + h->parts[5].start;
  1192. rtl8380_sds_reset = (void *)h + sizeof(struct fw_header) + h->parts[6].start;
  1193. rtl8380_sds_release_reset = (void *)h + sizeof(struct fw_header) + h->parts[7].start;
  1194. /* Back up serdes power off value */
  1195. sds_conf_value = sw_r32(RTL838X_SDS_CFG_REG);
  1196. pr_info("SDS power down value: %x\n", sds_conf_value);
  1197. /* take serdes into reset */
  1198. i = 0;
  1199. while (rtl8380_sds_take_reset[2 * i]) {
  1200. sw_w32(rtl8380_sds_take_reset[2 * i + 1], rtl8380_sds_take_reset[2 * i]);
  1201. i++;
  1202. udelay(1000);
  1203. }
  1204. /* apply common serdes patch */
  1205. i = 0;
  1206. while (rtl8380_sds_common[2 * i]) {
  1207. sw_w32(rtl8380_sds_common[2 * i + 1], rtl8380_sds_common[2 * i]);
  1208. i++;
  1209. udelay(1000);
  1210. }
  1211. /* internal R/W enable */
  1212. sw_w32(3, RTL838X_INT_RW_CTRL);
  1213. /* SerDes ports 4 and 5 are FIBRE ports */
  1214. sw_w32_mask(0x7 | 0x38, 1 | (1 << 3), RTL838X_INT_MODE_CTRL);
  1215. /* SerDes module settings, SerDes 0-3 are QSGMII */
  1216. v = 0x6 << 25 | 0x6 << 20 | 0x6 << 15 | 0x6 << 10;
  1217. /* SerDes 4 and 5 are 1000BX FIBRE */
  1218. v |= 0x4 << 5 | 0x4;
  1219. sw_w32(v, RTL838X_SDS_MODE_SEL);
  1220. pr_info("PLL control register: %x\n", sw_r32(RTL838X_PLL_CML_CTRL));
  1221. sw_w32_mask(0xfffffff0, 0xaaaaaaaf & 0xf, RTL838X_PLL_CML_CTRL);
  1222. i = 0;
  1223. while (rtl8380_sds01_qsgmii_6275b[2 * i]) {
  1224. sw_w32(rtl8380_sds01_qsgmii_6275b[2 * i + 1],
  1225. rtl8380_sds01_qsgmii_6275b[2 * i]);
  1226. i++;
  1227. }
  1228. i = 0;
  1229. while (rtl8380_sds23_qsgmii_6275b[2 * i]) {
  1230. sw_w32(rtl8380_sds23_qsgmii_6275b[2 * i + 1], rtl8380_sds23_qsgmii_6275b[2 * i]);
  1231. i++;
  1232. }
  1233. i = 0;
  1234. while (rtl8380_sds4_fiber_6275b[2 * i]) {
  1235. sw_w32(rtl8380_sds4_fiber_6275b[2 * i + 1], rtl8380_sds4_fiber_6275b[2 * i]);
  1236. i++;
  1237. }
  1238. i = 0;
  1239. while (rtl8380_sds5_fiber_6275b[2 * i]) {
  1240. sw_w32(rtl8380_sds5_fiber_6275b[2 * i + 1], rtl8380_sds5_fiber_6275b[2 * i]);
  1241. i++;
  1242. }
  1243. i = 0;
  1244. while (rtl8380_sds_reset[2 * i]) {
  1245. sw_w32(rtl8380_sds_reset[2 * i + 1], rtl8380_sds_reset[2 * i]);
  1246. i++;
  1247. }
  1248. i = 0;
  1249. while (rtl8380_sds_release_reset[2 * i]) {
  1250. sw_w32(rtl8380_sds_release_reset[2 * i + 1], rtl8380_sds_release_reset[2 * i]);
  1251. i++;
  1252. }
  1253. pr_info("SDS power down value now: %x\n", sw_r32(RTL838X_SDS_CFG_REG));
  1254. sw_w32(sds_conf_value, RTL838X_SDS_CFG_REG);
  1255. pr_info("Configuration of SERDES done\n");
  1256. return 0;
  1257. }
  1258. static int rtl8390_configure_serdes(struct phy_device *phydev)
  1259. {
  1260. phydev_info(phydev, "Detected internal RTL8390 SERDES\n");
  1261. /* In autoneg state, force link, set SR4_CFG_EN_LINK_FIB1G */
  1262. sw_w32_mask(0, 1 << 18, RTL839X_SDS12_13_XSG0 + 0x0a);
  1263. /* Disable EEE: Clear FRE16_EEE_RSG_FIB1G, FRE16_EEE_STD_FIB1G,
  1264. * FRE16_C1_PWRSAV_EN_FIB1G, FRE16_C2_PWRSAV_EN_FIB1G
  1265. * and FRE16_EEE_QUIET_FIB1G
  1266. */
  1267. sw_w32_mask(0x1f << 10, 0, RTL839X_SDS12_13_XSG0 + 0xe0);
  1268. return 0;
  1269. }
  1270. void rtl9300_sds_field_w(int sds, u32 page, u32 reg, int end_bit, int start_bit, u32 v)
  1271. {
  1272. int l = end_bit - start_bit + 1;
  1273. u32 data = v;
  1274. if (l < 32) {
  1275. u32 mask = BIT(l) - 1;
  1276. data = rtl930x_read_sds_phy(sds, page, reg);
  1277. data &= ~(mask << start_bit);
  1278. data |= (v & mask) << start_bit;
  1279. }
  1280. rtl930x_write_sds_phy(sds, page, reg, data);
  1281. }
  1282. u32 rtl9300_sds_field_r(int sds, u32 page, u32 reg, int end_bit, int start_bit)
  1283. {
  1284. int l = end_bit - start_bit + 1;
  1285. u32 v = rtl930x_read_sds_phy(sds, page, reg);
  1286. if (l >= 32)
  1287. return v;
  1288. return (v >> start_bit) & (BIT(l) - 1);
  1289. }
  1290. /* Read the link and speed status of the internal SerDes of the RTL9300
  1291. */
  1292. static int rtl9300_read_status(struct phy_device *phydev)
  1293. {
  1294. struct device *dev = &phydev->mdio.dev;
  1295. int phy_addr = phydev->mdio.addr;
  1296. struct device_node *dn;
  1297. u32 sds_num = 0, status, latch_status, mode;
  1298. if (dev->of_node) {
  1299. dn = dev->of_node;
  1300. if (of_property_read_u32(dn, "sds", &sds_num))
  1301. sds_num = -1;
  1302. pr_info("%s: Port %d, SerDes is %d\n", __func__, phy_addr, sds_num);
  1303. } else {
  1304. dev_err(dev, "No DT node.\n");
  1305. return -EINVAL;
  1306. }
  1307. if (sds_num < 0)
  1308. return 0;
  1309. mode = rtl9300_sds_mode_get(sds_num);
  1310. pr_info("%s got SDS mode %02x\n", __func__, mode);
  1311. if (mode == 0x1a) { /* 10GR mode */
  1312. status = rtl9300_sds_field_r(sds_num, 0x5, 0, 12, 12);
  1313. latch_status = rtl9300_sds_field_r(sds_num, 0x4, 1, 2, 2);
  1314. status |= rtl9300_sds_field_r(sds_num, 0x5, 0, 12, 12);
  1315. latch_status |= rtl9300_sds_field_r(sds_num, 0x4, 1, 2, 2);
  1316. } else {
  1317. status = rtl9300_sds_field_r(sds_num, 0x1, 29, 8, 0);
  1318. latch_status = rtl9300_sds_field_r(sds_num, 0x1, 30, 8, 0);
  1319. status |= rtl9300_sds_field_r(sds_num, 0x1, 29, 8, 0);
  1320. latch_status |= rtl9300_sds_field_r(sds_num, 0x1, 30, 8, 0);
  1321. }
  1322. pr_info("%s link status: status: %d, latch %d\n", __func__, status, latch_status);
  1323. if (latch_status) {
  1324. phydev->link = true;
  1325. if (mode == 0x1a)
  1326. phydev->speed = SPEED_10000;
  1327. else
  1328. phydev->speed = SPEED_1000;
  1329. phydev->duplex = DUPLEX_FULL;
  1330. }
  1331. return 0;
  1332. }
  1333. void rtl930x_sds_rx_rst(int sds_num, phy_interface_t phy_if)
  1334. {
  1335. int page = 0x2e; /* 10GR and USXGMII */
  1336. if (phy_if == PHY_INTERFACE_MODE_1000BASEX)
  1337. page = 0x24;
  1338. rtl9300_sds_field_w(sds_num, page, 0x15, 4, 4, 0x1);
  1339. mdelay(5);
  1340. rtl9300_sds_field_w(sds_num, page, 0x15, 4, 4, 0x0);
  1341. }
  1342. /* Force PHY modes on 10GBit Serdes
  1343. */
  1344. void rtl9300_force_sds_mode(int sds, phy_interface_t phy_if)
  1345. {
  1346. int lc_value;
  1347. int sds_mode;
  1348. bool lc_on;
  1349. int lane_0 = (sds % 2) ? sds - 1 : sds;
  1350. u32 v;
  1351. pr_info("%s: SDS: %d, mode %d\n", __func__, sds, phy_if);
  1352. switch (phy_if) {
  1353. case PHY_INTERFACE_MODE_SGMII:
  1354. sds_mode = 0x2;
  1355. lc_on = false;
  1356. lc_value = 0x1;
  1357. break;
  1358. case PHY_INTERFACE_MODE_HSGMII:
  1359. sds_mode = 0x12;
  1360. lc_value = 0x3;
  1361. /* Configure LC */
  1362. break;
  1363. case PHY_INTERFACE_MODE_1000BASEX:
  1364. sds_mode = 0x04;
  1365. lc_on = false;
  1366. break;
  1367. case PHY_INTERFACE_MODE_2500BASEX:
  1368. sds_mode = 0x16;
  1369. lc_value = 0x3;
  1370. /* Configure LC */
  1371. break;
  1372. case PHY_INTERFACE_MODE_10GBASER:
  1373. sds_mode = 0x1a;
  1374. lc_on = true;
  1375. lc_value = 0x5;
  1376. break;
  1377. case PHY_INTERFACE_MODE_NA:
  1378. /* This will disable SerDes */
  1379. sds_mode = 0x1f;
  1380. break;
  1381. default:
  1382. pr_err("%s: unknown serdes mode: %s\n",
  1383. __func__, phy_modes(phy_if));
  1384. return;
  1385. }
  1386. pr_info("%s --------------------- serdes %d forcing to %x ...\n", __func__, sds, sds_mode);
  1387. /* Power down SerDes */
  1388. rtl9300_sds_field_w(sds, 0x20, 0, 7, 6, 0x3);
  1389. if (sds == 5) pr_info("%s after %x\n", __func__, rtl930x_read_sds_phy(sds, 0x20, 0));
  1390. if (sds == 5) pr_info("%s a %x\n", __func__, rtl930x_read_sds_phy(sds, 0x1f, 9));
  1391. /* Force mode enable */
  1392. rtl9300_sds_field_w(sds, 0x1f, 9, 6, 6, 0x1);
  1393. if (sds == 5) pr_info("%s b %x\n", __func__, rtl930x_read_sds_phy(sds, 0x1f, 9));
  1394. /* SerDes off */
  1395. rtl9300_sds_field_w(sds, 0x1f, 9, 11, 7, 0x1f);
  1396. if (phy_if == PHY_INTERFACE_MODE_NA)
  1397. return;
  1398. if (sds == 5) pr_info("%s c %x\n", __func__, rtl930x_read_sds_phy(sds, 0x20, 18));
  1399. /* Enable LC and ring */
  1400. rtl9300_sds_field_w(lane_0, 0x20, 18, 3, 0, 0xf);
  1401. if (sds == lane_0)
  1402. rtl9300_sds_field_w(lane_0, 0x20, 18, 5, 4, 0x1);
  1403. else
  1404. rtl9300_sds_field_w(lane_0, 0x20, 18, 7, 6, 0x1);
  1405. rtl9300_sds_field_w(sds, 0x20, 0, 5, 4, 0x3);
  1406. if (lc_on)
  1407. rtl9300_sds_field_w(lane_0, 0x20, 18, 11, 8, lc_value);
  1408. else
  1409. rtl9300_sds_field_w(lane_0, 0x20, 18, 15, 12, lc_value);
  1410. /* Force analog LC & ring on */
  1411. rtl9300_sds_field_w(lane_0, 0x21, 11, 3, 0, 0xf);
  1412. v = lc_on ? 0x3 : 0x1;
  1413. if (sds == lane_0)
  1414. rtl9300_sds_field_w(lane_0, 0x20, 18, 5, 4, v);
  1415. else
  1416. rtl9300_sds_field_w(lane_0, 0x20, 18, 7, 6, v);
  1417. /* Force SerDes mode */
  1418. rtl9300_sds_field_w(sds, 0x1f, 9, 6, 6, 1);
  1419. rtl9300_sds_field_w(sds, 0x1f, 9, 11, 7, sds_mode);
  1420. /* Toggle LC or Ring */
  1421. for (int i = 0; i < 20; i++) {
  1422. u32 cr_0, cr_1, cr_2;
  1423. u32 m_bit, l_bit;
  1424. mdelay(200);
  1425. rtl930x_write_sds_phy(lane_0, 0x1f, 2, 53);
  1426. m_bit = (lane_0 == sds) ? (4) : (5);
  1427. l_bit = (lane_0 == sds) ? (4) : (5);
  1428. cr_0 = rtl9300_sds_field_r(lane_0, 0x1f, 20, m_bit, l_bit);
  1429. mdelay(10);
  1430. cr_1 = rtl9300_sds_field_r(lane_0, 0x1f, 20, m_bit, l_bit);
  1431. mdelay(10);
  1432. cr_2 = rtl9300_sds_field_r(lane_0, 0x1f, 20, m_bit, l_bit);
  1433. if (cr_0 && cr_1 && cr_2) {
  1434. u32 t;
  1435. if (phy_if != PHY_INTERFACE_MODE_10GBASER)
  1436. break;
  1437. t = rtl9300_sds_field_r(sds, 0x6, 0x1, 2, 2);
  1438. rtl9300_sds_field_w(sds, 0x6, 0x1, 2, 2, 0x1);
  1439. /* Reset FSM */
  1440. rtl9300_sds_field_w(sds, 0x6, 0x2, 12, 12, 0x1);
  1441. mdelay(10);
  1442. rtl9300_sds_field_w(sds, 0x6, 0x2, 12, 12, 0x0);
  1443. mdelay(10);
  1444. /* Need to read this twice */
  1445. v = rtl9300_sds_field_r(sds, 0x5, 0, 12, 12);
  1446. v = rtl9300_sds_field_r(sds, 0x5, 0, 12, 12);
  1447. rtl9300_sds_field_w(sds, 0x6, 0x1, 2, 2, t);
  1448. /* Reset FSM again */
  1449. rtl9300_sds_field_w(sds, 0x6, 0x2, 12, 12, 0x1);
  1450. mdelay(10);
  1451. rtl9300_sds_field_w(sds, 0x6, 0x2, 12, 12, 0x0);
  1452. mdelay(10);
  1453. if (v == 1)
  1454. break;
  1455. }
  1456. m_bit = (phy_if == PHY_INTERFACE_MODE_10GBASER) ? 3 : 1;
  1457. l_bit = (phy_if == PHY_INTERFACE_MODE_10GBASER) ? 2 : 0;
  1458. rtl9300_sds_field_w(lane_0, 0x21, 11, m_bit, l_bit, 0x2);
  1459. mdelay(10);
  1460. rtl9300_sds_field_w(lane_0, 0x21, 11, m_bit, l_bit, 0x3);
  1461. }
  1462. rtl930x_sds_rx_rst(sds, phy_if);
  1463. /* Re-enable power */
  1464. rtl9300_sds_field_w(sds, 0x20, 0, 7, 6, 0);
  1465. pr_info("%s --------------------- serdes %d forced to %x DONE\n", __func__, sds, sds_mode);
  1466. }
  1467. void rtl9300_sds_tx_config(int sds, phy_interface_t phy_if)
  1468. {
  1469. /* parameters: rtl9303_80G_txParam_s2 */
  1470. int impedance = 0x8;
  1471. int pre_amp = 0x2;
  1472. int main_amp = 0x9;
  1473. int post_amp = 0x2;
  1474. int pre_en = 0x1;
  1475. int post_en = 0x1;
  1476. int page;
  1477. switch(phy_if) {
  1478. case PHY_INTERFACE_MODE_1000BASEX:
  1479. page = 0x25;
  1480. break;
  1481. case PHY_INTERFACE_MODE_HSGMII:
  1482. case PHY_INTERFACE_MODE_2500BASEX:
  1483. page = 0x29;
  1484. break;
  1485. case PHY_INTERFACE_MODE_10GBASER:
  1486. page = 0x2f;
  1487. break;
  1488. default:
  1489. pr_err("%s: unsupported PHY mode\n", __func__);
  1490. return;
  1491. }
  1492. rtl9300_sds_field_w(sds, page, 0x01, 15, 11, pre_amp);
  1493. rtl9300_sds_field_w(sds, page, 0x06, 4, 0, post_amp);
  1494. rtl9300_sds_field_w(sds, page, 0x07, 0, 0, pre_en);
  1495. rtl9300_sds_field_w(sds, page, 0x07, 3, 3, post_en);
  1496. rtl9300_sds_field_w(sds, page, 0x07, 8, 4, main_amp);
  1497. rtl9300_sds_field_w(sds, page, 0x18, 15, 12, impedance);
  1498. }
  1499. /* Wait for clock ready, this assumes the SerDes is in XGMII mode
  1500. * timeout is in ms
  1501. */
  1502. int rtl9300_sds_clock_wait(int timeout)
  1503. {
  1504. u32 v;
  1505. unsigned long start = jiffies;
  1506. do {
  1507. rtl9300_sds_field_w(2, 0x1f, 0x2, 15, 0, 53);
  1508. v = rtl9300_sds_field_r(2, 0x1f, 20, 5, 4);
  1509. if (v == 3)
  1510. return 0;
  1511. } while (jiffies < start + (HZ / 1000) * timeout);
  1512. return 1;
  1513. }
  1514. void rtl9300_serdes_mac_link_config(int sds, bool tx_normal, bool rx_normal)
  1515. {
  1516. u32 v10, v1;
  1517. v10 = rtl930x_read_sds_phy(sds, 6, 2); /* 10GBit, page 6, reg 2 */
  1518. v1 = rtl930x_read_sds_phy(sds, 0, 0); /* 1GBit, page 0, reg 0 */
  1519. pr_info("%s: registers before %08x %08x\n", __func__, v10, v1);
  1520. v10 &= ~(BIT(13) | BIT(14));
  1521. v1 &= ~(BIT(8) | BIT(9));
  1522. v10 |= rx_normal ? 0 : BIT(13);
  1523. v1 |= rx_normal ? 0 : BIT(9);
  1524. v10 |= tx_normal ? 0 : BIT(14);
  1525. v1 |= tx_normal ? 0 : BIT(8);
  1526. rtl930x_write_sds_phy(sds, 6, 2, v10);
  1527. rtl930x_write_sds_phy(sds, 0, 0, v1);
  1528. v10 = rtl930x_read_sds_phy(sds, 6, 2);
  1529. v1 = rtl930x_read_sds_phy(sds, 0, 0);
  1530. pr_info("%s: registers after %08x %08x\n", __func__, v10, v1);
  1531. }
  1532. void rtl9300_sds_rxcal_dcvs_manual(u32 sds_num, u32 dcvs_id, bool manual, u32 dvcs_list[])
  1533. {
  1534. if (manual) {
  1535. switch(dcvs_id) {
  1536. case 0:
  1537. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 14, 14, 0x1);
  1538. rtl9300_sds_field_w(sds_num, 0x2f, 0x03, 5, 5, dvcs_list[0]);
  1539. rtl9300_sds_field_w(sds_num, 0x2f, 0x03, 4, 0, dvcs_list[1]);
  1540. break;
  1541. case 1:
  1542. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 13, 13, 0x1);
  1543. rtl9300_sds_field_w(sds_num, 0x2e, 0x1d, 15, 15, dvcs_list[0]);
  1544. rtl9300_sds_field_w(sds_num, 0x2e, 0x1d, 14, 11, dvcs_list[1]);
  1545. break;
  1546. case 2:
  1547. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 12, 12, 0x1);
  1548. rtl9300_sds_field_w(sds_num, 0x2e, 0x1d, 10, 10, dvcs_list[0]);
  1549. rtl9300_sds_field_w(sds_num, 0x2e, 0x1d, 9, 6, dvcs_list[1]);
  1550. break;
  1551. case 3:
  1552. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 11, 11, 0x1);
  1553. rtl9300_sds_field_w(sds_num, 0x2e, 0x1d, 5, 5, dvcs_list[0]);
  1554. rtl9300_sds_field_w(sds_num, 0x2e, 0x1d, 4, 1, dvcs_list[1]);
  1555. break;
  1556. case 4:
  1557. rtl9300_sds_field_w(sds_num, 0x2e, 0x01, 15, 15, 0x1);
  1558. rtl9300_sds_field_w(sds_num, 0x2e, 0x11, 10, 10, dvcs_list[0]);
  1559. rtl9300_sds_field_w(sds_num, 0x2e, 0x11, 9, 6, dvcs_list[1]);
  1560. break;
  1561. case 5:
  1562. rtl9300_sds_field_w(sds_num, 0x2e, 0x02, 11, 11, 0x1);
  1563. rtl9300_sds_field_w(sds_num, 0x2e, 0x11, 4, 4, dvcs_list[0]);
  1564. rtl9300_sds_field_w(sds_num, 0x2e, 0x11, 3, 0, dvcs_list[1]);
  1565. break;
  1566. default:
  1567. break;
  1568. }
  1569. } else {
  1570. switch(dcvs_id) {
  1571. case 0:
  1572. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 14, 14, 0x0);
  1573. break;
  1574. case 1:
  1575. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 13, 13, 0x0);
  1576. break;
  1577. case 2:
  1578. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 12, 12, 0x0);
  1579. break;
  1580. case 3:
  1581. rtl9300_sds_field_w(sds_num, 0x2e, 0x1e, 11, 11, 0x0);
  1582. break;
  1583. case 4:
  1584. rtl9300_sds_field_w(sds_num, 0x2e, 0x01, 15, 15, 0x0);
  1585. break;
  1586. case 5:
  1587. rtl9300_sds_field_w(sds_num, 0x2e, 0x02, 11, 11, 0x0);
  1588. break;
  1589. default:
  1590. break;
  1591. }
  1592. mdelay(1);
  1593. }
  1594. }
  1595. void rtl9300_sds_rxcal_dcvs_get(u32 sds_num, u32 dcvs_id, u32 dcvs_list[])
  1596. {
  1597. u32 dcvs_sign_out = 0, dcvs_coef_bin = 0;
  1598. bool dcvs_manual;
  1599. if (!(sds_num % 2))
  1600. rtl930x_write_sds_phy(sds_num, 0x1f, 0x2, 0x2f);
  1601. else
  1602. rtl930x_write_sds_phy(sds_num - 1, 0x1f, 0x2, 0x31);
  1603. /* ##Page0x2E, Reg0x15[9], REG0_RX_EN_TEST=[1] */
  1604. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 9, 9, 0x1);
  1605. /* ##Page0x21, Reg0x06[11 6], REG0_RX_DEBUG_SEL=[1 0 x x x x] */
  1606. rtl9300_sds_field_w(sds_num, 0x21, 0x06, 11, 6, 0x20);
  1607. switch(dcvs_id) {
  1608. case 0:
  1609. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0x22);
  1610. mdelay(1);
  1611. /* ##DCVS0 Read Out */
  1612. dcvs_sign_out = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 4);
  1613. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 3, 0);
  1614. dcvs_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x1e, 14, 14);
  1615. break;
  1616. case 1:
  1617. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0x23);
  1618. mdelay(1);
  1619. /* ##DCVS0 Read Out */
  1620. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 4);
  1621. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 3, 0);
  1622. dcvs_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x1e, 13, 13);
  1623. break;
  1624. case 2:
  1625. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0x24);
  1626. mdelay(1);
  1627. /* ##DCVS0 Read Out */
  1628. dcvs_sign_out = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 4);
  1629. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 3, 0);
  1630. dcvs_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x1e, 12, 12);
  1631. break;
  1632. case 3:
  1633. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0x25);
  1634. mdelay(1);
  1635. /* ##DCVS0 Read Out */
  1636. dcvs_sign_out = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 4);
  1637. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 3, 0);
  1638. dcvs_manual = rtl9300_sds_field_r(sds_num, 0x2e, 0x1e, 11, 11);
  1639. break;
  1640. case 4:
  1641. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0x2c);
  1642. mdelay(1);
  1643. /* ##DCVS0 Read Out */
  1644. dcvs_sign_out = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 4);
  1645. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 3, 0);
  1646. dcvs_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x01, 15, 15);
  1647. break;
  1648. case 5:
  1649. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0x2d);
  1650. mdelay(1);
  1651. /* ##DCVS0 Read Out */
  1652. dcvs_sign_out = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 4);
  1653. dcvs_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 3, 0);
  1654. dcvs_manual = rtl9300_sds_field_r(sds_num, 0x2e, 0x02, 11, 11);
  1655. break;
  1656. default:
  1657. break;
  1658. }
  1659. if (dcvs_sign_out)
  1660. pr_info("%s DCVS %u Sign: -", __func__, dcvs_id);
  1661. else
  1662. pr_info("%s DCVS %u Sign: +", __func__, dcvs_id);
  1663. pr_info("DCVS %u even coefficient = %u", dcvs_id, dcvs_coef_bin);
  1664. pr_info("DCVS %u manual = %u", dcvs_id, dcvs_manual);
  1665. dcvs_list[0] = dcvs_sign_out;
  1666. dcvs_list[1] = dcvs_coef_bin;
  1667. }
  1668. void rtl9300_sds_rxcal_leq_manual(u32 sds_num, bool manual, u32 leq_gray)
  1669. {
  1670. if (manual) {
  1671. rtl9300_sds_field_w(sds_num, 0x2e, 0x18, 15, 15, 0x1);
  1672. rtl9300_sds_field_w(sds_num, 0x2e, 0x16, 14, 10, leq_gray);
  1673. } else {
  1674. rtl9300_sds_field_w(sds_num, 0x2e, 0x18, 15, 15, 0x0);
  1675. mdelay(100);
  1676. }
  1677. }
  1678. void rtl9300_sds_rxcal_leq_offset_manual(u32 sds_num, bool manual, u32 offset)
  1679. {
  1680. if (manual) {
  1681. rtl9300_sds_field_w(sds_num, 0x2e, 0x17, 6, 2, offset);
  1682. } else {
  1683. rtl9300_sds_field_w(sds_num, 0x2e, 0x17, 6, 2, offset);
  1684. mdelay(1);
  1685. }
  1686. }
  1687. #define GRAY_BITS 5
  1688. u32 rtl9300_sds_rxcal_gray_to_binary(u32 gray_code)
  1689. {
  1690. int i, j, m;
  1691. u32 g[GRAY_BITS];
  1692. u32 c[GRAY_BITS];
  1693. u32 leq_binary = 0;
  1694. for(i = 0; i < GRAY_BITS; i++)
  1695. g[i] = (gray_code & BIT(i)) >> i;
  1696. m = GRAY_BITS - 1;
  1697. c[m] = g[m];
  1698. for(i = 0; i < m; i++) {
  1699. c[i] = g[i];
  1700. for(j = i + 1; j < GRAY_BITS; j++)
  1701. c[i] = c[i] ^ g[j];
  1702. }
  1703. for(i = 0; i < GRAY_BITS; i++)
  1704. leq_binary += c[i] << i;
  1705. return leq_binary;
  1706. }
  1707. u32 rtl9300_sds_rxcal_leq_read(int sds_num)
  1708. {
  1709. u32 leq_gray, leq_bin;
  1710. bool leq_manual;
  1711. if (!(sds_num % 2))
  1712. rtl930x_write_sds_phy(sds_num, 0x1f, 0x2, 0x2f);
  1713. else
  1714. rtl930x_write_sds_phy(sds_num - 1, 0x1f, 0x2, 0x31);
  1715. /* ##Page0x2E, Reg0x15[9], REG0_RX_EN_TEST=[1] */
  1716. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 9, 9, 0x1);
  1717. /* ##Page0x21, Reg0x06[11 6], REG0_RX_DEBUG_SEL=[0 1 x x x x] */
  1718. rtl9300_sds_field_w(sds_num, 0x21, 0x06, 11, 6, 0x10);
  1719. mdelay(1);
  1720. /* ##LEQ Read Out */
  1721. leq_gray = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 7, 3);
  1722. leq_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x18, 15, 15);
  1723. leq_bin = rtl9300_sds_rxcal_gray_to_binary(leq_gray);
  1724. pr_info("LEQ_gray: %u, LEQ_bin: %u", leq_gray, leq_bin);
  1725. pr_info("LEQ manual: %u", leq_manual);
  1726. return leq_bin;
  1727. }
  1728. void rtl9300_sds_rxcal_vth_manual(u32 sds_num, bool manual, u32 vth_list[])
  1729. {
  1730. if (manual) {
  1731. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, 13, 13, 0x1);
  1732. rtl9300_sds_field_w(sds_num, 0x2e, 0x13, 5, 3, vth_list[0]);
  1733. rtl9300_sds_field_w(sds_num, 0x2e, 0x13, 2, 0, vth_list[1]);
  1734. } else {
  1735. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, 13, 13, 0x0);
  1736. mdelay(10);
  1737. }
  1738. }
  1739. void rtl9300_sds_rxcal_vth_get(u32 sds_num, u32 vth_list[])
  1740. {
  1741. u32 vth_manual;
  1742. /* ##Page0x1F, Reg0x02[15 0], REG_DBGO_SEL=[0x002F]; */ /* Lane0 */
  1743. /* ##Page0x1F, Reg0x02[15 0], REG_DBGO_SEL=[0x0031]; */ /* Lane1 */
  1744. if (!(sds_num % 2))
  1745. rtl930x_write_sds_phy(sds_num, 0x1f, 0x2, 0x2f);
  1746. else
  1747. rtl930x_write_sds_phy(sds_num - 1, 0x1f, 0x2, 0x31);
  1748. /* ##Page0x2E, Reg0x15[9], REG0_RX_EN_TEST=[1] */
  1749. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 9, 9, 0x1);
  1750. /* ##Page0x21, Reg0x06[11 6], REG0_RX_DEBUG_SEL=[1 0 x x x x] */
  1751. rtl9300_sds_field_w(sds_num, 0x21, 0x06, 11, 6, 0x20);
  1752. /* ##Page0x2F, Reg0x0C[5 0], REG0_COEF_SEL=[0 0 1 1 0 0] */
  1753. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0xc);
  1754. mdelay(1);
  1755. /* ##VthP & VthN Read Out */
  1756. vth_list[0] = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 2, 0); /* v_thp set bin */
  1757. vth_list[1] = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 5, 3); /* v_thn set bin */
  1758. pr_info("vth_set_bin = %d", vth_list[0]);
  1759. pr_info("vth_set_bin = %d", vth_list[1]);
  1760. vth_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x0f, 13, 13);
  1761. pr_info("Vth Maunal = %d", vth_manual);
  1762. }
  1763. void rtl9300_sds_rxcal_tap_manual(u32 sds_num, int tap_id, bool manual, u32 tap_list[])
  1764. {
  1765. if (manual) {
  1766. switch(tap_id) {
  1767. case 0:
  1768. /* ##REG0_LOAD_IN_INIT[0]=1; REG0_TAP0_INIT[5:0]=Tap0_Value */
  1769. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7, 0x1);
  1770. rtl9300_sds_field_w(sds_num, 0x2f, 0x03, 5, 5, tap_list[0]);
  1771. rtl9300_sds_field_w(sds_num, 0x2f, 0x03, 4, 0, tap_list[1]);
  1772. break;
  1773. case 1:
  1774. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7, 0x1);
  1775. rtl9300_sds_field_w(sds_num, 0x21, 0x07, 6, 6, tap_list[0]);
  1776. rtl9300_sds_field_w(sds_num, 0x2e, 0x09, 11, 6, tap_list[1]);
  1777. rtl9300_sds_field_w(sds_num, 0x21, 0x07, 5, 5, tap_list[2]);
  1778. rtl9300_sds_field_w(sds_num, 0x2f, 0x12, 5, 0, tap_list[3]);
  1779. break;
  1780. case 2:
  1781. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7, 0x1);
  1782. rtl9300_sds_field_w(sds_num, 0x2e, 0x09, 5, 5, tap_list[0]);
  1783. rtl9300_sds_field_w(sds_num, 0x2e, 0x09, 4, 0, tap_list[1]);
  1784. rtl9300_sds_field_w(sds_num, 0x2e, 0x0a, 11, 11, tap_list[2]);
  1785. rtl9300_sds_field_w(sds_num, 0x2e, 0x0a, 10, 6, tap_list[3]);
  1786. break;
  1787. case 3:
  1788. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7, 0x1);
  1789. rtl9300_sds_field_w(sds_num, 0x2e, 0x0a, 5, 5, tap_list[0]);
  1790. rtl9300_sds_field_w(sds_num, 0x2e, 0x0a, 4, 0, tap_list[1]);
  1791. rtl9300_sds_field_w(sds_num, 0x2e, 0x06, 5, 5, tap_list[2]);
  1792. rtl9300_sds_field_w(sds_num, 0x2e, 0x06, 4, 0, tap_list[3]);
  1793. break;
  1794. case 4:
  1795. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7, 0x1);
  1796. rtl9300_sds_field_w(sds_num, 0x2f, 0x01, 5, 5, tap_list[0]);
  1797. rtl9300_sds_field_w(sds_num, 0x2f, 0x01, 4, 0, tap_list[1]);
  1798. rtl9300_sds_field_w(sds_num, 0x2e, 0x06, 11, 11, tap_list[2]);
  1799. rtl9300_sds_field_w(sds_num, 0x2e, 0x06, 10, 6, tap_list[3]);
  1800. break;
  1801. default:
  1802. break;
  1803. }
  1804. } else {
  1805. rtl9300_sds_field_w(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7, 0x0);
  1806. mdelay(10);
  1807. }
  1808. }
  1809. void rtl9300_sds_rxcal_tap_get(u32 sds_num, u32 tap_id, u32 tap_list[])
  1810. {
  1811. u32 tap0_sign_out;
  1812. u32 tap0_coef_bin;
  1813. u32 tap_sign_out_even;
  1814. u32 tap_coef_bin_even;
  1815. u32 tap_sign_out_odd;
  1816. u32 tap_coef_bin_odd;
  1817. bool tap_manual;
  1818. if (!(sds_num % 2))
  1819. rtl930x_write_sds_phy(sds_num, 0x1f, 0x2, 0x2f);
  1820. else
  1821. rtl930x_write_sds_phy(sds_num - 1, 0x1f, 0x2, 0x31);
  1822. /* ##Page0x2E, Reg0x15[9], REG0_RX_EN_TEST=[1] */
  1823. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 9, 9, 0x1);
  1824. /* ##Page0x21, Reg0x06[11 6], REG0_RX_DEBUG_SEL=[1 0 x x x x] */
  1825. rtl9300_sds_field_w(sds_num, 0x21, 0x06, 11, 6, 0x20);
  1826. if (!tap_id) {
  1827. /* ##Page0x2F, Reg0x0C[5 0], REG0_COEF_SEL=[0 0 0 0 0 1] */
  1828. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0);
  1829. /* ##Tap1 Even Read Out */
  1830. mdelay(1);
  1831. tap0_sign_out = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 5, 5);
  1832. tap0_coef_bin = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 0);
  1833. if (tap0_sign_out == 1)
  1834. pr_info("Tap0 Sign : -");
  1835. else
  1836. pr_info("Tap0 Sign : +");
  1837. pr_info("tap0_coef_bin = %d", tap0_coef_bin);
  1838. tap_list[0] = tap0_sign_out;
  1839. tap_list[1] = tap0_coef_bin;
  1840. tap_manual = !!rtl9300_sds_field_r(sds_num, 0x2e, 0x0f, 7, 7);
  1841. pr_info("tap0 manual = %u",tap_manual);
  1842. } else {
  1843. /* ##Page0x2F, Reg0x0C[5 0], REG0_COEF_SEL=[0 0 0 0 0 1] */
  1844. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, tap_id);
  1845. mdelay(1);
  1846. /* ##Tap1 Even Read Out */
  1847. tap_sign_out_even = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 5, 5);
  1848. tap_coef_bin_even = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 0);
  1849. /* ##Page0x2F, Reg0x0C[5 0], REG0_COEF_SEL=[0 0 0 1 1 0] */
  1850. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, (tap_id + 5));
  1851. /* ##Tap1 Odd Read Out */
  1852. tap_sign_out_odd = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 5, 5);
  1853. tap_coef_bin_odd = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 4, 0);
  1854. if (tap_sign_out_even == 1)
  1855. pr_info("Tap %u even sign: -", tap_id);
  1856. else
  1857. pr_info("Tap %u even sign: +", tap_id);
  1858. pr_info("Tap %u even coefficient = %u", tap_id, tap_coef_bin_even);
  1859. if (tap_sign_out_odd == 1)
  1860. pr_info("Tap %u odd sign: -", tap_id);
  1861. else
  1862. pr_info("Tap %u odd sign: +", tap_id);
  1863. pr_info("Tap %u odd coefficient = %u", tap_id,tap_coef_bin_odd);
  1864. tap_list[0] = tap_sign_out_even;
  1865. tap_list[1] = tap_coef_bin_even;
  1866. tap_list[2] = tap_sign_out_odd;
  1867. tap_list[3] = tap_coef_bin_odd;
  1868. tap_manual = rtl9300_sds_field_r(sds_num, 0x2e, 0x0f, tap_id + 7, tap_id + 7);
  1869. pr_info("tap %u manual = %d",tap_id, tap_manual);
  1870. }
  1871. }
  1872. void rtl9300_do_rx_calibration_1(int sds, phy_interface_t phy_mode)
  1873. {
  1874. /* From both rtl9300_rxCaliConf_serdes_myParam and rtl9300_rxCaliConf_phy_myParam */
  1875. int tap0_init_val = 0x1f; /* Initial Decision Fed Equalizer 0 tap */
  1876. int vth_min = 0x0;
  1877. pr_info("start_1.1.1 initial value for sds %d\n", sds);
  1878. rtl930x_write_sds_phy(sds, 6, 0, 0);
  1879. /* FGCAL */
  1880. rtl9300_sds_field_w(sds, 0x2e, 0x01, 14, 14, 0x00);
  1881. rtl9300_sds_field_w(sds, 0x2e, 0x1c, 10, 5, 0x20);
  1882. rtl9300_sds_field_w(sds, 0x2f, 0x02, 0, 0, 0x01);
  1883. /* DCVS */
  1884. rtl9300_sds_field_w(sds, 0x2e, 0x1e, 14, 11, 0x00);
  1885. rtl9300_sds_field_w(sds, 0x2e, 0x01, 15, 15, 0x00);
  1886. rtl9300_sds_field_w(sds, 0x2e, 0x02, 11, 11, 0x00);
  1887. rtl9300_sds_field_w(sds, 0x2e, 0x1c, 4, 0, 0x00);
  1888. rtl9300_sds_field_w(sds, 0x2e, 0x1d, 15, 11, 0x00);
  1889. rtl9300_sds_field_w(sds, 0x2e, 0x1d, 10, 6, 0x00);
  1890. rtl9300_sds_field_w(sds, 0x2e, 0x1d, 5, 1, 0x00);
  1891. rtl9300_sds_field_w(sds, 0x2e, 0x02, 10, 6, 0x00);
  1892. rtl9300_sds_field_w(sds, 0x2e, 0x11, 4, 0, 0x00);
  1893. rtl9300_sds_field_w(sds, 0x2f, 0x00, 3, 0, 0x0f);
  1894. rtl9300_sds_field_w(sds, 0x2e, 0x04, 6, 6, 0x01);
  1895. rtl9300_sds_field_w(sds, 0x2e, 0x04, 7, 7, 0x01);
  1896. /* LEQ (Long Term Equivalent signal level) */
  1897. rtl9300_sds_field_w(sds, 0x2e, 0x16, 14, 8, 0x00);
  1898. /* DFE (Decision Fed Equalizer) */
  1899. rtl9300_sds_field_w(sds, 0x2f, 0x03, 5, 0, tap0_init_val);
  1900. rtl9300_sds_field_w(sds, 0x2e, 0x09, 11, 6, 0x00);
  1901. rtl9300_sds_field_w(sds, 0x2e, 0x09, 5, 0, 0x00);
  1902. rtl9300_sds_field_w(sds, 0x2e, 0x0a, 5, 0, 0x00);
  1903. rtl9300_sds_field_w(sds, 0x2f, 0x01, 5, 0, 0x00);
  1904. rtl9300_sds_field_w(sds, 0x2f, 0x12, 5, 0, 0x00);
  1905. rtl9300_sds_field_w(sds, 0x2e, 0x0a, 11, 6, 0x00);
  1906. rtl9300_sds_field_w(sds, 0x2e, 0x06, 5, 0, 0x00);
  1907. rtl9300_sds_field_w(sds, 0x2f, 0x01, 5, 0, 0x00);
  1908. /* Vth */
  1909. rtl9300_sds_field_w(sds, 0x2e, 0x13, 5, 3, 0x07);
  1910. rtl9300_sds_field_w(sds, 0x2e, 0x13, 2, 0, 0x07);
  1911. rtl9300_sds_field_w(sds, 0x2f, 0x0b, 5, 3, vth_min);
  1912. pr_info("end_1.1.1 --\n");
  1913. pr_info("start_1.1.2 Load DFE init. value\n");
  1914. rtl9300_sds_field_w(sds, 0x2e, 0x0f, 13, 7, 0x7f);
  1915. pr_info("end_1.1.2\n");
  1916. pr_info("start_1.1.3 disable LEQ training,enable DFE clock\n");
  1917. rtl9300_sds_field_w(sds, 0x2e, 0x17, 7, 7, 0x00);
  1918. rtl9300_sds_field_w(sds, 0x2e, 0x17, 6, 2, 0x00);
  1919. rtl9300_sds_field_w(sds, 0x2e, 0x0c, 8, 8, 0x00);
  1920. rtl9300_sds_field_w(sds, 0x2e, 0x0b, 4, 4, 0x01);
  1921. rtl9300_sds_field_w(sds, 0x2e, 0x12, 14, 14, 0x00);
  1922. rtl9300_sds_field_w(sds, 0x2f, 0x02, 15, 15, 0x00);
  1923. pr_info("end_1.1.3 --\n");
  1924. pr_info("start_1.1.4 offset cali setting\n");
  1925. rtl9300_sds_field_w(sds, 0x2e, 0x0f, 15, 14, 0x03);
  1926. pr_info("end_1.1.4\n");
  1927. pr_info("start_1.1.5 LEQ and DFE setting\n");
  1928. /* TODO: make this work for DAC cables of different lengths */
  1929. /* For a 10GBit serdes wit Fibre, SDS 8 or 9 */
  1930. if (phy_mode == PHY_INTERFACE_MODE_10GBASER || PHY_INTERFACE_MODE_1000BASEX)
  1931. rtl9300_sds_field_w(sds, 0x2e, 0x16, 3, 2, 0x02);
  1932. else
  1933. pr_err("%s not PHY-based or SerDes, implement DAC!\n", __func__);
  1934. /* No serdes, check for Aquantia PHYs */
  1935. rtl9300_sds_field_w(sds, 0x2e, 0x16, 3, 2, 0x02);
  1936. rtl9300_sds_field_w(sds, 0x2e, 0x0f, 6, 0, 0x5f);
  1937. rtl9300_sds_field_w(sds, 0x2f, 0x05, 7, 2, 0x1f);
  1938. rtl9300_sds_field_w(sds, 0x2e, 0x19, 9, 5, 0x1f);
  1939. rtl9300_sds_field_w(sds, 0x2f, 0x0b, 15, 9, 0x3c);
  1940. rtl9300_sds_field_w(sds, 0x2e, 0x0b, 1, 0, 0x03);
  1941. pr_info("end_1.1.5\n");
  1942. }
  1943. void rtl9300_do_rx_calibration_2_1(u32 sds_num)
  1944. {
  1945. pr_info("start_1.2.1 ForegroundOffsetCal_Manual\n");
  1946. /* Gray config endis to 1 */
  1947. rtl9300_sds_field_w(sds_num, 0x2f, 0x02, 2, 2, 0x01);
  1948. /* ForegroundOffsetCal_Manual(auto mode) */
  1949. rtl9300_sds_field_w(sds_num, 0x2e, 0x01, 14, 14, 0x00);
  1950. pr_info("end_1.2.1");
  1951. }
  1952. void rtl9300_do_rx_calibration_2_2(int sds_num)
  1953. {
  1954. /* Force Rx-Run = 0 */
  1955. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 8, 8, 0x0);
  1956. rtl930x_sds_rx_rst(sds_num, PHY_INTERFACE_MODE_10GBASER);
  1957. }
  1958. void rtl9300_do_rx_calibration_2_3(int sds_num)
  1959. {
  1960. u32 fgcal_binary, fgcal_gray;
  1961. u32 offset_range;
  1962. pr_info("start_1.2.3 Foreground Calibration\n");
  1963. while(1) {
  1964. if (!(sds_num % 2))
  1965. rtl930x_write_sds_phy(sds_num, 0x1f, 0x2, 0x2f);
  1966. else
  1967. rtl930x_write_sds_phy(sds_num -1 , 0x1f, 0x2, 0x31);
  1968. /* ##Page0x2E, Reg0x15[9], REG0_RX_EN_TEST=[1] */
  1969. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 9, 9, 0x1);
  1970. /* ##Page0x21, Reg0x06[11 6], REG0_RX_DEBUG_SEL=[1 0 x x x x] */
  1971. rtl9300_sds_field_w(sds_num, 0x21, 0x06, 11, 6, 0x20);
  1972. /* ##Page0x2F, Reg0x0C[5 0], REG0_COEF_SEL=[0 0 1 1 1 1] */
  1973. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0xf);
  1974. /* ##FGCAL read gray */
  1975. fgcal_gray = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 5, 0);
  1976. /* ##Page0x2F, Reg0x0C[5 0], REG0_COEF_SEL=[0 0 1 1 1 0] */
  1977. rtl9300_sds_field_w(sds_num, 0x2f, 0x0c, 5, 0, 0xe);
  1978. /* ##FGCAL read binary */
  1979. fgcal_binary = rtl9300_sds_field_r(sds_num, 0x1f, 0x14, 5, 0);
  1980. pr_info("%s: fgcal_gray: %d, fgcal_binary %d\n",
  1981. __func__, fgcal_gray, fgcal_binary);
  1982. offset_range = rtl9300_sds_field_r(sds_num, 0x2e, 0x15, 15, 14);
  1983. if (fgcal_binary > 60 || fgcal_binary < 3) {
  1984. if (offset_range == 3) {
  1985. pr_info("%s: Foreground Calibration result marginal!", __func__);
  1986. break;
  1987. } else {
  1988. offset_range++;
  1989. rtl9300_sds_field_w(sds_num, 0x2e, 0x15, 15, 14, offset_range);
  1990. rtl9300_do_rx_calibration_2_2(sds_num);
  1991. }
  1992. } else {
  1993. break;
  1994. }
  1995. }
  1996. pr_info("%s: end_1.2.3\n", __func__);
  1997. }
  1998. void rtl9300_do_rx_calibration_2(int sds)
  1999. {
  2000. rtl930x_sds_rx_rst(sds, PHY_INTERFACE_MODE_10GBASER);
  2001. rtl9300_do_rx_calibration_2_1(sds);
  2002. rtl9300_do_rx_calibration_2_2(sds);
  2003. rtl9300_do_rx_calibration_2_3(sds);
  2004. }
  2005. void rtl9300_sds_rxcal_3_1(int sds_num, phy_interface_t phy_mode)
  2006. {
  2007. pr_info("start_1.3.1");
  2008. /* ##1.3.1 */
  2009. if (phy_mode != PHY_INTERFACE_MODE_10GBASER && phy_mode != PHY_INTERFACE_MODE_1000BASEX)
  2010. rtl9300_sds_field_w(sds_num, 0x2e, 0xc, 8, 8, 0);
  2011. rtl9300_sds_field_w(sds_num, 0x2e, 0x17, 7, 7, 0x0);
  2012. rtl9300_sds_rxcal_leq_manual(sds_num, false, 0);
  2013. pr_info("end_1.3.1");
  2014. }
  2015. void rtl9300_sds_rxcal_3_2(int sds_num, phy_interface_t phy_mode)
  2016. {
  2017. u32 sum10 = 0, avg10, int10;
  2018. int dac_long_cable_offset;
  2019. bool eq_hold_enabled;
  2020. int i;
  2021. if (phy_mode == PHY_INTERFACE_MODE_10GBASER || phy_mode == PHY_INTERFACE_MODE_1000BASEX) {
  2022. /* rtl9300_rxCaliConf_serdes_myParam */
  2023. dac_long_cable_offset = 3;
  2024. eq_hold_enabled = true;
  2025. } else {
  2026. /* rtl9300_rxCaliConf_phy_myParam */
  2027. dac_long_cable_offset = 0;
  2028. eq_hold_enabled = false;
  2029. }
  2030. if (phy_mode == PHY_INTERFACE_MODE_1000BASEX)
  2031. pr_warn("%s: LEQ only valid for 10GR!\n", __func__);
  2032. pr_info("start_1.3.2");
  2033. for(i = 0; i < 10; i++) {
  2034. sum10 += rtl9300_sds_rxcal_leq_read(sds_num);
  2035. mdelay(10);
  2036. }
  2037. avg10 = (sum10 / 10) + (((sum10 % 10) >= 5) ? 1 : 0);
  2038. int10 = sum10 / 10;
  2039. pr_info("sum10:%u, avg10:%u, int10:%u", sum10, avg10, int10);
  2040. if (phy_mode == PHY_INTERFACE_MODE_10GBASER || phy_mode == PHY_INTERFACE_MODE_1000BASEX) {
  2041. if (dac_long_cable_offset) {
  2042. rtl9300_sds_rxcal_leq_offset_manual(sds_num, 1, dac_long_cable_offset);
  2043. rtl9300_sds_field_w(sds_num, 0x2e, 0x17, 7, 7, eq_hold_enabled);
  2044. if (phy_mode == PHY_INTERFACE_MODE_10GBASER)
  2045. rtl9300_sds_rxcal_leq_manual(sds_num, true, avg10);
  2046. } else {
  2047. if (sum10 >= 5) {
  2048. rtl9300_sds_rxcal_leq_offset_manual(sds_num, 1, 3);
  2049. rtl9300_sds_field_w(sds_num, 0x2e, 0x17, 7, 7, 0x1);
  2050. if (phy_mode == PHY_INTERFACE_MODE_10GBASER)
  2051. rtl9300_sds_rxcal_leq_manual(sds_num, true, avg10);
  2052. } else {
  2053. rtl9300_sds_rxcal_leq_offset_manual(sds_num, 1, 0);
  2054. rtl9300_sds_field_w(sds_num, 0x2e, 0x17, 7, 7, 0x1);
  2055. if (phy_mode == PHY_INTERFACE_MODE_10GBASER)
  2056. rtl9300_sds_rxcal_leq_manual(sds_num, true, avg10);
  2057. }
  2058. }
  2059. }
  2060. pr_info("Sds:%u LEQ = %u",sds_num, rtl9300_sds_rxcal_leq_read(sds_num));
  2061. pr_info("end_1.3.2");
  2062. }
  2063. void rtl9300_do_rx_calibration_3(int sds_num, phy_interface_t phy_mode)
  2064. {
  2065. rtl9300_sds_rxcal_3_1(sds_num, phy_mode);
  2066. if (phy_mode == PHY_INTERFACE_MODE_10GBASER || phy_mode == PHY_INTERFACE_MODE_1000BASEX)
  2067. rtl9300_sds_rxcal_3_2(sds_num, phy_mode);
  2068. }
  2069. void rtl9300_do_rx_calibration_4_1(int sds_num)
  2070. {
  2071. u32 vth_list[2] = {0, 0};
  2072. u32 tap0_list[4] = {0, 0, 0, 0};
  2073. pr_info("start_1.4.1");
  2074. /* ##1.4.1 */
  2075. rtl9300_sds_rxcal_vth_manual(sds_num, false, vth_list);
  2076. rtl9300_sds_rxcal_tap_manual(sds_num, 0, false, tap0_list);
  2077. mdelay(200);
  2078. pr_info("end_1.4.1");
  2079. }
  2080. void rtl9300_do_rx_calibration_4_2(u32 sds_num)
  2081. {
  2082. u32 vth_list[2];
  2083. u32 tap_list[4];
  2084. pr_info("start_1.4.2");
  2085. rtl9300_sds_rxcal_vth_get(sds_num, vth_list);
  2086. rtl9300_sds_rxcal_vth_manual(sds_num, true, vth_list);
  2087. mdelay(100);
  2088. rtl9300_sds_rxcal_tap_get(sds_num, 0, tap_list);
  2089. rtl9300_sds_rxcal_tap_manual(sds_num, 0, true, tap_list);
  2090. pr_info("end_1.4.2");
  2091. }
  2092. void rtl9300_do_rx_calibration_4(u32 sds_num)
  2093. {
  2094. rtl9300_do_rx_calibration_4_1(sds_num);
  2095. rtl9300_do_rx_calibration_4_2(sds_num);
  2096. }
  2097. void rtl9300_do_rx_calibration_5_2(u32 sds_num)
  2098. {
  2099. u32 tap1_list[4] = {0};
  2100. u32 tap2_list[4] = {0};
  2101. u32 tap3_list[4] = {0};
  2102. u32 tap4_list[4] = {0};
  2103. pr_info("start_1.5.2");
  2104. rtl9300_sds_rxcal_tap_manual(sds_num, 1, false, tap1_list);
  2105. rtl9300_sds_rxcal_tap_manual(sds_num, 2, false, tap2_list);
  2106. rtl9300_sds_rxcal_tap_manual(sds_num, 3, false, tap3_list);
  2107. rtl9300_sds_rxcal_tap_manual(sds_num, 4, false, tap4_list);
  2108. mdelay(30);
  2109. pr_info("end_1.5.2");
  2110. }
  2111. void rtl9300_do_rx_calibration_5(u32 sds_num, phy_interface_t phy_mode)
  2112. {
  2113. if (phy_mode == PHY_INTERFACE_MODE_10GBASER) /* dfeTap1_4Enable true */
  2114. rtl9300_do_rx_calibration_5_2(sds_num);
  2115. }
  2116. void rtl9300_do_rx_calibration_dfe_disable(u32 sds_num)
  2117. {
  2118. u32 tap1_list[4] = {0};
  2119. u32 tap2_list[4] = {0};
  2120. u32 tap3_list[4] = {0};
  2121. u32 tap4_list[4] = {0};
  2122. rtl9300_sds_rxcal_tap_manual(sds_num, 1, true, tap1_list);
  2123. rtl9300_sds_rxcal_tap_manual(sds_num, 2, true, tap2_list);
  2124. rtl9300_sds_rxcal_tap_manual(sds_num, 3, true, tap3_list);
  2125. rtl9300_sds_rxcal_tap_manual(sds_num, 4, true, tap4_list);
  2126. mdelay(10);
  2127. }
  2128. void rtl9300_do_rx_calibration(int sds, phy_interface_t phy_mode)
  2129. {
  2130. u32 latch_sts;
  2131. rtl9300_do_rx_calibration_1(sds, phy_mode);
  2132. rtl9300_do_rx_calibration_2(sds);
  2133. rtl9300_do_rx_calibration_4(sds);
  2134. rtl9300_do_rx_calibration_5(sds, phy_mode);
  2135. mdelay(20);
  2136. /* Do this only for 10GR mode, SDS active in mode 0x1a */
  2137. if (rtl9300_sds_field_r(sds, 0x1f, 9, 11, 7) == 0x1a) {
  2138. pr_info("%s: SDS enabled\n", __func__);
  2139. latch_sts = rtl9300_sds_field_r(sds, 0x4, 1, 2, 2);
  2140. mdelay(1);
  2141. latch_sts = rtl9300_sds_field_r(sds, 0x4, 1, 2, 2);
  2142. if (latch_sts) {
  2143. rtl9300_do_rx_calibration_dfe_disable(sds);
  2144. rtl9300_do_rx_calibration_4(sds);
  2145. rtl9300_do_rx_calibration_5(sds, phy_mode);
  2146. }
  2147. }
  2148. }
  2149. int rtl9300_sds_sym_err_reset(int sds_num, phy_interface_t phy_mode)
  2150. {
  2151. switch (phy_mode) {
  2152. case PHY_INTERFACE_MODE_XGMII:
  2153. break;
  2154. case PHY_INTERFACE_MODE_10GBASER:
  2155. /* Read twice to clear */
  2156. rtl930x_read_sds_phy(sds_num, 5, 1);
  2157. rtl930x_read_sds_phy(sds_num, 5, 1);
  2158. break;
  2159. case PHY_INTERFACE_MODE_1000BASEX:
  2160. rtl9300_sds_field_w(sds_num, 0x1, 24, 2, 0, 0);
  2161. rtl9300_sds_field_w(sds_num, 0x1, 3, 15, 8, 0);
  2162. rtl9300_sds_field_w(sds_num, 0x1, 2, 15, 0, 0);
  2163. break;
  2164. default:
  2165. pr_info("%s unsupported phy mode\n", __func__);
  2166. return -1;
  2167. }
  2168. return 0;
  2169. }
  2170. u32 rtl9300_sds_sym_err_get(int sds_num, phy_interface_t phy_mode)
  2171. {
  2172. u32 v = 0;
  2173. switch (phy_mode) {
  2174. case PHY_INTERFACE_MODE_XGMII:
  2175. break;
  2176. case PHY_INTERFACE_MODE_10GBASER:
  2177. v = rtl930x_read_sds_phy(sds_num, 5, 1);
  2178. return v & 0xff;
  2179. default:
  2180. pr_info("%s unsupported PHY-mode\n", __func__);
  2181. }
  2182. return v;
  2183. }
  2184. int rtl9300_sds_check_calibration(int sds_num, phy_interface_t phy_mode)
  2185. {
  2186. u32 errors1, errors2;
  2187. rtl9300_sds_sym_err_reset(sds_num, phy_mode);
  2188. rtl9300_sds_sym_err_reset(sds_num, phy_mode);
  2189. /* Count errors during 1ms */
  2190. errors1 = rtl9300_sds_sym_err_get(sds_num, phy_mode);
  2191. mdelay(1);
  2192. errors2 = rtl9300_sds_sym_err_get(sds_num, phy_mode);
  2193. switch (phy_mode) {
  2194. case PHY_INTERFACE_MODE_XGMII:
  2195. if ((errors2 - errors1 > 100) ||
  2196. (errors1 >= 0xffff00) || (errors2 >= 0xffff00)) {
  2197. pr_info("%s XSGMII error rate too high\n", __func__);
  2198. return 1;
  2199. }
  2200. break;
  2201. case PHY_INTERFACE_MODE_10GBASER:
  2202. if (errors2 > 0) {
  2203. pr_info("%s 10GBASER error rate too high\n", __func__);
  2204. return 1;
  2205. }
  2206. break;
  2207. default:
  2208. return 1;
  2209. }
  2210. return 0;
  2211. }
  2212. void rtl9300_phy_enable_10g_1g(int sds_num)
  2213. {
  2214. u32 v;
  2215. /* Enable 1GBit PHY */
  2216. v = rtl930x_read_sds_phy(sds_num, PHY_PAGE_2, MII_BMCR);
  2217. pr_info("%s 1gbit phy: %08x\n", __func__, v);
  2218. v &= ~BMCR_PDOWN;
  2219. rtl930x_write_sds_phy(sds_num, PHY_PAGE_2, MII_BMCR, v);
  2220. pr_info("%s 1gbit phy enabled: %08x\n", __func__, v);
  2221. /* Enable 10GBit PHY */
  2222. v = rtl930x_read_sds_phy(sds_num, PHY_PAGE_4, MII_BMCR);
  2223. pr_info("%s 10gbit phy: %08x\n", __func__, v);
  2224. v &= ~BMCR_PDOWN;
  2225. rtl930x_write_sds_phy(sds_num, PHY_PAGE_4, MII_BMCR, v);
  2226. pr_info("%s 10gbit phy after: %08x\n", __func__, v);
  2227. /* dal_longan_construct_mac_default_10gmedia_fiber */
  2228. v = rtl930x_read_sds_phy(sds_num, 0x1f, 11);
  2229. pr_info("%s set medium: %08x\n", __func__, v);
  2230. v |= BIT(1);
  2231. rtl930x_write_sds_phy(sds_num, 0x1f, 11, v);
  2232. pr_info("%s set medium after: %08x\n", __func__, v);
  2233. }
  2234. #define RTL930X_MAC_FORCE_MODE_CTRL (0xCA1C)
  2235. /* phy_mode = PHY_INTERFACE_MODE_10GBASER, sds_mode = 0x1a */
  2236. int rtl9300_serdes_setup(int sds_num, phy_interface_t phy_mode)
  2237. {
  2238. int sds_mode;
  2239. int calib_tries = 0;
  2240. switch (phy_mode) {
  2241. case PHY_INTERFACE_MODE_HSGMII:
  2242. sds_mode = 0x12;
  2243. break;
  2244. case PHY_INTERFACE_MODE_1000BASEX:
  2245. sds_mode = 0x04;
  2246. break;
  2247. case PHY_INTERFACE_MODE_XGMII:
  2248. sds_mode = 0x10;
  2249. break;
  2250. case PHY_INTERFACE_MODE_10GBASER:
  2251. sds_mode = 0x1a;
  2252. break;
  2253. case PHY_INTERFACE_MODE_USXGMII:
  2254. sds_mode = 0x0d;
  2255. break;
  2256. default:
  2257. pr_err("%s: unknown serdes mode: %s\n", __func__, phy_modes(phy_mode));
  2258. return -EINVAL;
  2259. }
  2260. /* Maybe use dal_longan_sds_init */
  2261. /* dal_longan_construct_serdesConfig_init */ /* Serdes Construct */
  2262. rtl9300_phy_enable_10g_1g(sds_num);
  2263. /* Set Serdes Mode */
  2264. rtl9300_sds_set(sds_num, 0x1a); /* 0x1b: RTK_MII_10GR1000BX_AUTO */
  2265. /* Do RX calibration */
  2266. do {
  2267. rtl9300_do_rx_calibration(sds_num, phy_mode);
  2268. calib_tries++;
  2269. mdelay(50);
  2270. } while (rtl9300_sds_check_calibration(sds_num, phy_mode) && calib_tries < 3);
  2271. return 0;
  2272. }
  2273. typedef struct {
  2274. u8 page;
  2275. u8 reg;
  2276. u16 data;
  2277. } sds_config;
  2278. sds_config rtl9300_a_sds_10gr_lane0[] =
  2279. {
  2280. /* 1G */
  2281. {0x00, 0x0E, 0x3053}, {0x01, 0x14, 0x0100}, {0x21, 0x03, 0x8206},
  2282. {0x21, 0x05, 0x40B0}, {0x21, 0x06, 0x0010}, {0x21, 0x07, 0xF09F},
  2283. {0x21, 0x0C, 0x0007}, {0x21, 0x0D, 0x6009}, {0x21, 0x0E, 0x0000},
  2284. {0x21, 0x0F, 0x0008}, {0x24, 0x00, 0x0668}, {0x24, 0x02, 0xD020},
  2285. {0x24, 0x06, 0xC000}, {0x24, 0x0B, 0x1892}, {0x24, 0x0F, 0xFFDF},
  2286. {0x24, 0x12, 0x03C4}, {0x24, 0x13, 0x027F}, {0x24, 0x14, 0x1311},
  2287. {0x24, 0x16, 0x00C9}, {0x24, 0x17, 0xA100}, {0x24, 0x1A, 0x0001},
  2288. {0x24, 0x1C, 0x0400}, {0x25, 0x01, 0x0300}, {0x25, 0x02, 0x1017},
  2289. {0x25, 0x03, 0xFFDF}, {0x25, 0x05, 0x7F7C}, {0x25, 0x07, 0x8100},
  2290. {0x25, 0x08, 0x0001}, {0x25, 0x09, 0xFFD4}, {0x25, 0x0A, 0x7C2F},
  2291. {0x25, 0x0E, 0x003F}, {0x25, 0x0F, 0x0121}, {0x25, 0x10, 0x0020},
  2292. {0x25, 0x11, 0x8840}, {0x2B, 0x13, 0x0050}, {0x2B, 0x18, 0x8E88},
  2293. {0x2B, 0x19, 0x4902}, {0x2B, 0x1D, 0x2501}, {0x2D, 0x13, 0x0050},
  2294. {0x2D, 0x18, 0x8E88}, {0x2D, 0x19, 0x4902}, {0x2D, 0x1D, 0x2641},
  2295. {0x2F, 0x13, 0x0050}, {0x2F, 0x18, 0x8E88}, {0x2F, 0x19, 0x4902},
  2296. {0x2F, 0x1D, 0x66E1},
  2297. /* 3.125G */
  2298. {0x28, 0x00, 0x0668}, {0x28, 0x02, 0xD020}, {0x28, 0x06, 0xC000},
  2299. {0x28, 0x0B, 0x1892}, {0x28, 0x0F, 0xFFDF}, {0x28, 0x12, 0x01C4},
  2300. {0x28, 0x13, 0x027F}, {0x28, 0x14, 0x1311}, {0x28, 0x16, 0x00C9},
  2301. {0x28, 0x17, 0xA100}, {0x28, 0x1A, 0x0001}, {0x28, 0x1C, 0x0400},
  2302. {0x29, 0x01, 0x0300}, {0x29, 0x02, 0x1017}, {0x29, 0x03, 0xFFDF},
  2303. {0x29, 0x05, 0x7F7C}, {0x29, 0x07, 0x8100}, {0x29, 0x08, 0x0001},
  2304. {0x29, 0x09, 0xFFD4}, {0x29, 0x0A, 0x7C2F}, {0x29, 0x0E, 0x003F},
  2305. {0x29, 0x0F, 0x0121}, {0x29, 0x10, 0x0020}, {0x29, 0x11, 0x8840},
  2306. /* 10G */
  2307. {0x06, 0x0D, 0x0F00}, {0x06, 0x00, 0x0000}, {0x06, 0x01, 0xC800},
  2308. {0x21, 0x03, 0x8206}, {0x21, 0x05, 0x40B0}, {0x21, 0x06, 0x0010},
  2309. {0x21, 0x07, 0xF09F}, {0x21, 0x0C, 0x0007}, {0x21, 0x0D, 0x6009},
  2310. {0x21, 0x0E, 0x0000}, {0x21, 0x0F, 0x0008}, {0x2E, 0x00, 0xA668},
  2311. {0x2E, 0x02, 0xD020}, {0x2E, 0x06, 0xC000}, {0x2E, 0x0B, 0x1892},
  2312. {0x2E, 0x0F, 0xFFDF}, {0x2E, 0x11, 0x8280}, {0x2E, 0x12, 0x0044},
  2313. {0x2E, 0x13, 0x027F}, {0x2E, 0x14, 0x1311}, {0x2E, 0x17, 0xA100},
  2314. {0x2E, 0x1A, 0x0001}, {0x2E, 0x1C, 0x0400}, {0x2F, 0x01, 0x0300},
  2315. {0x2F, 0x02, 0x1217}, {0x2F, 0x03, 0xFFDF}, {0x2F, 0x05, 0x7F7C},
  2316. {0x2F, 0x07, 0x80C4}, {0x2F, 0x08, 0x0001}, {0x2F, 0x09, 0xFFD4},
  2317. {0x2F, 0x0A, 0x7C2F}, {0x2F, 0x0E, 0x003F}, {0x2F, 0x0F, 0x0121},
  2318. {0x2F, 0x10, 0x0020}, {0x2F, 0x11, 0x8840}, {0x2F, 0x14, 0xE008},
  2319. {0x2B, 0x13, 0x0050}, {0x2B, 0x18, 0x8E88}, {0x2B, 0x19, 0x4902},
  2320. {0x2B, 0x1D, 0x2501}, {0x2D, 0x13, 0x0050}, {0x2D, 0x17, 0x4109},
  2321. {0x2D, 0x18, 0x8E88}, {0x2D, 0x19, 0x4902}, {0x2D, 0x1C, 0x1109},
  2322. {0x2D, 0x1D, 0x2641}, {0x2F, 0x13, 0x0050}, {0x2F, 0x18, 0x8E88},
  2323. {0x2F, 0x19, 0x4902}, {0x2F, 0x1D, 0x76E1},
  2324. };
  2325. sds_config rtl9300_a_sds_10gr_lane1[] =
  2326. {
  2327. /* 1G */
  2328. {0x00, 0x0E, 0x3053}, {0x01, 0x14, 0x0100}, {0x21, 0x03, 0x8206},
  2329. {0x21, 0x06, 0x0010}, {0x21, 0x07, 0xF09F}, {0x21, 0x0A, 0x0003},
  2330. {0x21, 0x0B, 0x0005}, {0x21, 0x0C, 0x0007}, {0x21, 0x0D, 0x6009},
  2331. {0x21, 0x0E, 0x0000}, {0x21, 0x0F, 0x0008}, {0x24, 0x00, 0x0668},
  2332. {0x24, 0x02, 0xD020}, {0x24, 0x06, 0xC000}, {0x24, 0x0B, 0x1892},
  2333. {0x24, 0x0F, 0xFFDF}, {0x24, 0x12, 0x03C4}, {0x24, 0x13, 0x027F},
  2334. {0x24, 0x14, 0x1311}, {0x24, 0x16, 0x00C9}, {0x24, 0x17, 0xA100},
  2335. {0x24, 0x1A, 0x0001}, {0x24, 0x1C, 0x0400}, {0x25, 0x00, 0x820F},
  2336. {0x25, 0x01, 0x0300}, {0x25, 0x02, 0x1017}, {0x25, 0x03, 0xFFDF},
  2337. {0x25, 0x05, 0x7F7C}, {0x25, 0x07, 0x8100}, {0x25, 0x08, 0x0001},
  2338. {0x25, 0x09, 0xFFD4}, {0x25, 0x0A, 0x7C2F}, {0x25, 0x0E, 0x003F},
  2339. {0x25, 0x0F, 0x0121}, {0x25, 0x10, 0x0020}, {0x25, 0x11, 0x8840},
  2340. {0x2B, 0x13, 0x3D87}, {0x2B, 0x14, 0x3108}, {0x2D, 0x13, 0x3C87},
  2341. {0x2D, 0x14, 0x1808},
  2342. /* 3.125G */
  2343. {0x28, 0x00, 0x0668}, {0x28, 0x02, 0xD020}, {0x28, 0x06, 0xC000},
  2344. {0x28, 0x0B, 0x1892}, {0x28, 0x0F, 0xFFDF}, {0x28, 0x12, 0x01C4},
  2345. {0x28, 0x13, 0x027F}, {0x28, 0x14, 0x1311}, {0x28, 0x16, 0x00C9},
  2346. {0x28, 0x17, 0xA100}, {0x28, 0x1A, 0x0001}, {0x28, 0x1C, 0x0400},
  2347. {0x29, 0x00, 0x820F}, {0x29, 0x01, 0x0300}, {0x29, 0x02, 0x1017},
  2348. {0x29, 0x03, 0xFFDF}, {0x29, 0x05, 0x7F7C}, {0x29, 0x07, 0x8100},
  2349. {0x29, 0x08, 0x0001}, {0x29, 0x0A, 0x7C2F}, {0x29, 0x0E, 0x003F},
  2350. {0x29, 0x0F, 0x0121}, {0x29, 0x10, 0x0020}, {0x29, 0x11, 0x8840},
  2351. /* 10G */
  2352. {0x06, 0x0D, 0x0F00}, {0x06, 0x00, 0x0000}, {0x06, 0x01, 0xC800},
  2353. {0x21, 0x03, 0x8206}, {0x21, 0x05, 0x40B0}, {0x21, 0x06, 0x0010},
  2354. {0x21, 0x07, 0xF09F}, {0x21, 0x0A, 0x0003}, {0x21, 0x0B, 0x0005},
  2355. {0x21, 0x0C, 0x0007}, {0x21, 0x0D, 0x6009}, {0x21, 0x0E, 0x0000},
  2356. {0x21, 0x0F, 0x0008}, {0x2E, 0x00, 0xA668}, {0x2E, 0x02, 0xD020},
  2357. {0x2E, 0x06, 0xC000}, {0x2E, 0x0B, 0x1892}, {0x2E, 0x0F, 0xFFDF},
  2358. {0x2E, 0x11, 0x8280}, {0x2E, 0x12, 0x0044}, {0x2E, 0x13, 0x027F},
  2359. {0x2E, 0x14, 0x1311}, {0x2E, 0x17, 0xA100}, {0x2E, 0x1A, 0x0001},
  2360. {0x2E, 0x1C, 0x0400}, {0x2F, 0x00, 0x820F}, {0x2F, 0x01, 0x0300},
  2361. {0x2F, 0x02, 0x1217}, {0x2F, 0x03, 0xFFDF}, {0x2F, 0x05, 0x7F7C},
  2362. {0x2F, 0x07, 0x80C4}, {0x2F, 0x08, 0x0001}, {0x2F, 0x09, 0xFFD4},
  2363. {0x2F, 0x0A, 0x7C2F}, {0x2F, 0x0E, 0x003F}, {0x2F, 0x0F, 0x0121},
  2364. {0x2F, 0x10, 0x0020}, {0x2F, 0x11, 0x8840}, {0x2B, 0x13, 0x3D87},
  2365. {0x2B, 0x14, 0x3108}, {0x2D, 0x13, 0x3C87}, {0x2D, 0x14, 0x1808},
  2366. };
  2367. int rtl9300_sds_cmu_band_get(int sds)
  2368. {
  2369. u32 page;
  2370. u32 en;
  2371. u32 cmu_band;
  2372. /* page = rtl9300_sds_cmu_page_get(sds); */
  2373. page = 0x25; /* 10GR and 1000BX */
  2374. sds = (sds % 2) ? (sds - 1) : (sds);
  2375. rtl9300_sds_field_w(sds, page, 0x1c, 15, 15, 1);
  2376. rtl9300_sds_field_w(sds + 1, page, 0x1c, 15, 15, 1);
  2377. en = rtl9300_sds_field_r(sds, page, 27, 1, 1);
  2378. if(!en) { /* Auto mode */
  2379. rtl930x_write_sds_phy(sds, 0x1f, 0x02, 31);
  2380. cmu_band = rtl9300_sds_field_r(sds, 0x1f, 0x15, 5, 1);
  2381. } else {
  2382. cmu_band = rtl9300_sds_field_r(sds, page, 30, 4, 0);
  2383. }
  2384. return cmu_band;
  2385. }
  2386. int rtl9300_configure_serdes(struct phy_device *phydev)
  2387. {
  2388. int phy_mode = PHY_INTERFACE_MODE_10GBASER;
  2389. struct device *dev = &phydev->mdio.dev;
  2390. int calib_tries = 0;
  2391. u32 sds_num = 0;
  2392. int sds_mode;
  2393. if (dev->of_node) {
  2394. struct device_node *dn = dev->of_node;
  2395. int phy_addr = phydev->mdio.addr;
  2396. if (of_property_read_u32(dn, "sds", &sds_num))
  2397. sds_num = -1;
  2398. pr_info("%s: Port %d, SerDes is %d\n", __func__, phy_addr, sds_num);
  2399. } else {
  2400. dev_err(dev, "No DT node.\n");
  2401. return -EINVAL;
  2402. }
  2403. if (sds_num < 0)
  2404. return 0;
  2405. if (phy_mode != PHY_INTERFACE_MODE_10GBASER) /* TODO: for now we only patch 10GR SerDes */
  2406. return 0;
  2407. switch (phy_mode) {
  2408. case PHY_INTERFACE_MODE_HSGMII:
  2409. sds_mode = 0x12;
  2410. break;
  2411. case PHY_INTERFACE_MODE_1000BASEX:
  2412. sds_mode = 0x04;
  2413. break;
  2414. case PHY_INTERFACE_MODE_XGMII:
  2415. sds_mode = 0x10;
  2416. break;
  2417. case PHY_INTERFACE_MODE_10GBASER:
  2418. sds_mode = 0x1a;
  2419. break;
  2420. case PHY_INTERFACE_MODE_USXGMII:
  2421. sds_mode = 0x0d;
  2422. break;
  2423. default:
  2424. pr_err("%s: unknown serdes mode: %s\n", __func__, phy_modes(phy_mode));
  2425. return -EINVAL;
  2426. }
  2427. pr_info("%s CMU BAND is %d\n", __func__, rtl9300_sds_cmu_band_get(sds_num));
  2428. /* Turn Off Serdes */
  2429. rtl9300_sds_rst(sds_num, 0x1f);
  2430. pr_info("%s PATCHING SerDes %d\n", __func__, sds_num);
  2431. if (sds_num % 2) {
  2432. for (int i = 0; i < sizeof(rtl9300_a_sds_10gr_lane1) / sizeof(sds_config); ++i) {
  2433. rtl930x_write_sds_phy(sds_num, rtl9300_a_sds_10gr_lane1[i].page,
  2434. rtl9300_a_sds_10gr_lane1[i].reg,
  2435. rtl9300_a_sds_10gr_lane1[i].data);
  2436. }
  2437. } else {
  2438. for (int i = 0; i < sizeof(rtl9300_a_sds_10gr_lane0) / sizeof(sds_config); ++i) {
  2439. rtl930x_write_sds_phy(sds_num, rtl9300_a_sds_10gr_lane0[i].page,
  2440. rtl9300_a_sds_10gr_lane0[i].reg,
  2441. rtl9300_a_sds_10gr_lane0[i].data);
  2442. }
  2443. }
  2444. rtl9300_phy_enable_10g_1g(sds_num);
  2445. /* Disable MAC */
  2446. sw_w32_mask(0, 1, RTL930X_MAC_FORCE_MODE_CTRL);
  2447. mdelay(20);
  2448. /* ----> dal_longan_sds_mode_set */
  2449. pr_info("%s: Configuring RTL9300 SERDES %d, mode %02x\n", __func__, sds_num, sds_mode);
  2450. /* Configure link to MAC */
  2451. rtl9300_serdes_mac_link_config(sds_num, true, true); /* MAC Construct */
  2452. /* Disable MAC */
  2453. sw_w32_mask(0, 1, RTL930X_MAC_FORCE_MODE_CTRL);
  2454. mdelay(20);
  2455. rtl9300_force_sds_mode(sds_num, PHY_INTERFACE_MODE_NA);
  2456. /* Re-Enable MAC */
  2457. sw_w32_mask(1, 0, RTL930X_MAC_FORCE_MODE_CTRL);
  2458. rtl9300_force_sds_mode(sds_num, phy_mode);
  2459. /* Do RX calibration */
  2460. do {
  2461. rtl9300_do_rx_calibration(sds_num, phy_mode);
  2462. calib_tries++;
  2463. mdelay(50);
  2464. } while (rtl9300_sds_check_calibration(sds_num, phy_mode) && calib_tries < 3);
  2465. if (calib_tries >= 3)
  2466. pr_err("%s CALIBTRATION FAILED\n", __func__);
  2467. rtl9300_sds_tx_config(sds_num, phy_mode);
  2468. /* The clock needs only to be configured on the FPGA implementation */
  2469. return 0;
  2470. }
  2471. void rtl9310_sds_field_w(int sds, u32 page, u32 reg, int end_bit, int start_bit, u32 v)
  2472. {
  2473. int l = end_bit - start_bit + 1;
  2474. u32 data = v;
  2475. if (l < 32) {
  2476. u32 mask = BIT(l) - 1;
  2477. data = rtl930x_read_sds_phy(sds, page, reg);
  2478. data &= ~(mask << start_bit);
  2479. data |= (v & mask) << start_bit;
  2480. }
  2481. rtl931x_write_sds_phy(sds, page, reg, data);
  2482. }
  2483. u32 rtl9310_sds_field_r(int sds, u32 page, u32 reg, int end_bit, int start_bit)
  2484. {
  2485. int l = end_bit - start_bit + 1;
  2486. u32 v = rtl931x_read_sds_phy(sds, page, reg);
  2487. if (l >= 32)
  2488. return v;
  2489. return (v >> start_bit) & (BIT(l) - 1);
  2490. }
  2491. static void rtl931x_sds_rst(u32 sds)
  2492. {
  2493. u32 o, v, o_mode;
  2494. int shift = ((sds & 0x3) << 3);
  2495. /* TODO: We need to lock this! */
  2496. o = sw_r32(RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR);
  2497. v = o | BIT(sds);
  2498. sw_w32(v, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR);
  2499. o_mode = sw_r32(RTL931X_SERDES_MODE_CTRL + 4 * (sds >> 2));
  2500. v = BIT(7) | 0x1F;
  2501. sw_w32_mask(0xff << shift, v << shift, RTL931X_SERDES_MODE_CTRL + 4 * (sds >> 2));
  2502. sw_w32(o_mode, RTL931X_SERDES_MODE_CTRL + 4 * (sds >> 2));
  2503. sw_w32(o, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR);
  2504. }
  2505. static void rtl931x_symerr_clear(u32 sds, phy_interface_t mode)
  2506. {
  2507. switch (mode) {
  2508. case PHY_INTERFACE_MODE_NA:
  2509. break;
  2510. case PHY_INTERFACE_MODE_XGMII:
  2511. u32 xsg_sdsid_0, xsg_sdsid_1;
  2512. if (sds < 2)
  2513. xsg_sdsid_0 = sds;
  2514. else
  2515. xsg_sdsid_0 = (sds - 1) * 2;
  2516. xsg_sdsid_1 = xsg_sdsid_0 + 1;
  2517. for (int i = 0; i < 4; ++i) {
  2518. rtl9310_sds_field_w(xsg_sdsid_0, 0x1, 24, 2, 0, i);
  2519. rtl9310_sds_field_w(xsg_sdsid_0, 0x1, 3, 15, 8, 0x0);
  2520. rtl9310_sds_field_w(xsg_sdsid_0, 0x1, 2, 15, 0, 0x0);
  2521. }
  2522. for (int i = 0; i < 4; ++i) {
  2523. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 24, 2, 0, i);
  2524. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 3, 15, 8, 0x0);
  2525. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 2, 15, 0, 0x0);
  2526. }
  2527. rtl9310_sds_field_w(xsg_sdsid_0, 0x1, 0, 15, 0, 0x0);
  2528. rtl9310_sds_field_w(xsg_sdsid_0, 0x1, 1, 15, 8, 0x0);
  2529. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 0, 15, 0, 0x0);
  2530. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 1, 15, 8, 0x0);
  2531. break;
  2532. default:
  2533. break;
  2534. }
  2535. return;
  2536. }
  2537. static u32 rtl931x_get_analog_sds(u32 sds)
  2538. {
  2539. u32 sds_map[] = { 0, 1, 2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23 };
  2540. if (sds < 14)
  2541. return sds_map[sds];
  2542. return sds;
  2543. }
  2544. void rtl931x_sds_fiber_disable(u32 sds)
  2545. {
  2546. u32 v = 0x3F;
  2547. u32 asds = rtl931x_get_analog_sds(sds);
  2548. rtl9310_sds_field_w(asds, 0x1F, 0x9, 11, 6, v);
  2549. }
  2550. static void rtl931x_sds_fiber_mode_set(u32 sds, phy_interface_t mode)
  2551. {
  2552. u32 val, asds = rtl931x_get_analog_sds(sds);
  2553. /* clear symbol error count before changing mode */
  2554. rtl931x_symerr_clear(sds, mode);
  2555. val = 0x9F;
  2556. sw_w32(val, RTL931X_SERDES_MODE_CTRL + 4 * (sds >> 2));
  2557. switch (mode) {
  2558. case PHY_INTERFACE_MODE_SGMII:
  2559. val = 0x5;
  2560. break;
  2561. case PHY_INTERFACE_MODE_1000BASEX:
  2562. /* serdes mode FIBER1G */
  2563. val = 0x9;
  2564. break;
  2565. case PHY_INTERFACE_MODE_10GBASER:
  2566. case PHY_INTERFACE_MODE_10GKR:
  2567. val = 0x35;
  2568. break;
  2569. /* case MII_10GR1000BX_AUTO:
  2570. val = 0x39;
  2571. break; */
  2572. case PHY_INTERFACE_MODE_USXGMII:
  2573. val = 0x1B;
  2574. break;
  2575. default:
  2576. val = 0x25;
  2577. }
  2578. pr_info("%s writing analog SerDes Mode value %02x\n", __func__, val);
  2579. rtl9310_sds_field_w(asds, 0x1F, 0x9, 11, 6, val);
  2580. return;
  2581. }
  2582. static int rtl931x_sds_cmu_page_get(phy_interface_t mode)
  2583. {
  2584. switch (mode) {
  2585. case PHY_INTERFACE_MODE_SGMII:
  2586. case PHY_INTERFACE_MODE_1000BASEX: /* MII_1000BX_FIBER / 100BX_FIBER / 1000BX100BX_AUTO */
  2587. return 0x24;
  2588. case PHY_INTERFACE_MODE_HSGMII:
  2589. case PHY_INTERFACE_MODE_2500BASEX: /* MII_2500Base_X: */
  2590. return 0x28;
  2591. /* case MII_HISGMII_5G: */
  2592. /* return 0x2a; */
  2593. case PHY_INTERFACE_MODE_QSGMII:
  2594. return 0x2a; /* Code also has 0x34 */
  2595. case PHY_INTERFACE_MODE_XAUI: /* MII_RXAUI_LITE: */
  2596. return 0x2c;
  2597. case PHY_INTERFACE_MODE_XGMII: /* MII_XSGMII */
  2598. case PHY_INTERFACE_MODE_10GKR:
  2599. case PHY_INTERFACE_MODE_10GBASER: /* MII_10GR */
  2600. return 0x2e;
  2601. default:
  2602. return -1;
  2603. }
  2604. return -1;
  2605. }
  2606. static void rtl931x_cmu_type_set(u32 asds, phy_interface_t mode, int chiptype)
  2607. {
  2608. int cmu_type = 0; /* Clock Management Unit */
  2609. u32 cmu_page = 0;
  2610. u32 frc_cmu_spd;
  2611. u32 evenSds;
  2612. u32 lane, frc_lc_mode_bitnum, frc_lc_mode_val_bitnum;
  2613. switch (mode) {
  2614. case PHY_INTERFACE_MODE_NA:
  2615. case PHY_INTERFACE_MODE_10GKR:
  2616. case PHY_INTERFACE_MODE_XGMII:
  2617. case PHY_INTERFACE_MODE_10GBASER:
  2618. case PHY_INTERFACE_MODE_USXGMII:
  2619. return;
  2620. /* case MII_10GR1000BX_AUTO:
  2621. if (chiptype)
  2622. rtl9310_sds_field_w(asds, 0x24, 0xd, 14, 14, 0);
  2623. return; */
  2624. case PHY_INTERFACE_MODE_QSGMII:
  2625. cmu_type = 1;
  2626. frc_cmu_spd = 0;
  2627. break;
  2628. case PHY_INTERFACE_MODE_HSGMII:
  2629. cmu_type = 1;
  2630. frc_cmu_spd = 1;
  2631. break;
  2632. case PHY_INTERFACE_MODE_1000BASEX:
  2633. cmu_type = 1;
  2634. frc_cmu_spd = 0;
  2635. break;
  2636. /* case MII_1000BX100BX_AUTO:
  2637. cmu_type = 1;
  2638. frc_cmu_spd = 0;
  2639. break; */
  2640. case PHY_INTERFACE_MODE_SGMII:
  2641. cmu_type = 1;
  2642. frc_cmu_spd = 0;
  2643. break;
  2644. case PHY_INTERFACE_MODE_2500BASEX:
  2645. cmu_type = 1;
  2646. frc_cmu_spd = 1;
  2647. break;
  2648. default:
  2649. pr_info("SerDes %d mode is invalid\n", asds);
  2650. return;
  2651. }
  2652. if (cmu_type == 1)
  2653. cmu_page = rtl931x_sds_cmu_page_get(mode);
  2654. lane = asds % 2;
  2655. if (!lane) {
  2656. frc_lc_mode_bitnum = 4;
  2657. frc_lc_mode_val_bitnum = 5;
  2658. } else {
  2659. frc_lc_mode_bitnum = 6;
  2660. frc_lc_mode_val_bitnum = 7;
  2661. }
  2662. evenSds = asds - lane;
  2663. pr_info("%s: cmu_type %0d cmu_page %x frc_cmu_spd %d lane %d asds %d\n",
  2664. __func__, cmu_type, cmu_page, frc_cmu_spd, lane, asds);
  2665. if (cmu_type == 1) {
  2666. pr_info("%s A CMU page 0x28 0x7 %08x\n", __func__, rtl931x_read_sds_phy(asds, 0x28, 0x7));
  2667. rtl9310_sds_field_w(asds, cmu_page, 0x7, 15, 15, 0);
  2668. pr_info("%s B CMU page 0x28 0x7 %08x\n", __func__, rtl931x_read_sds_phy(asds, 0x28, 0x7));
  2669. if (chiptype) {
  2670. rtl9310_sds_field_w(asds, cmu_page, 0xd, 14, 14, 0);
  2671. }
  2672. rtl9310_sds_field_w(evenSds, 0x20, 0x12, 3, 2, 0x3);
  2673. rtl9310_sds_field_w(evenSds, 0x20, 0x12, frc_lc_mode_bitnum, frc_lc_mode_bitnum, 1);
  2674. rtl9310_sds_field_w(evenSds, 0x20, 0x12, frc_lc_mode_val_bitnum, frc_lc_mode_val_bitnum, 0);
  2675. rtl9310_sds_field_w(evenSds, 0x20, 0x12, 12, 12, 1);
  2676. rtl9310_sds_field_w(evenSds, 0x20, 0x12, 15, 13, frc_cmu_spd);
  2677. }
  2678. pr_info("%s CMU page 0x28 0x7 %08x\n", __func__, rtl931x_read_sds_phy(asds, 0x28, 0x7));
  2679. return;
  2680. }
  2681. static void rtl931x_sds_rx_rst(u32 sds)
  2682. {
  2683. u32 asds = rtl931x_get_analog_sds(sds);
  2684. if (sds < 2)
  2685. return;
  2686. rtl931x_write_sds_phy(asds, 0x2e, 0x12, 0x2740);
  2687. rtl931x_write_sds_phy(asds, 0x2f, 0x0, 0x0);
  2688. rtl931x_write_sds_phy(asds, 0x2f, 0x2, 0x2010);
  2689. rtl931x_write_sds_phy(asds, 0x20, 0x0, 0xc10);
  2690. rtl931x_write_sds_phy(asds, 0x2e, 0x12, 0x27c0);
  2691. rtl931x_write_sds_phy(asds, 0x2f, 0x0, 0xc000);
  2692. rtl931x_write_sds_phy(asds, 0x2f, 0x2, 0x6010);
  2693. rtl931x_write_sds_phy(asds, 0x20, 0x0, 0xc30);
  2694. mdelay(50);
  2695. }
  2696. // Currently not used
  2697. // static void rtl931x_sds_disable(u32 sds)
  2698. // {
  2699. // u32 v = 0x1f;
  2700. // v |= BIT(7);
  2701. // sw_w32(v, RTL931X_SERDES_MODE_CTRL + (sds >> 2) * 4);
  2702. // }
  2703. static void rtl931x_sds_mii_mode_set(u32 sds, phy_interface_t mode)
  2704. {
  2705. u32 val;
  2706. switch (mode) {
  2707. case PHY_INTERFACE_MODE_QSGMII:
  2708. val = 0x6;
  2709. break;
  2710. case PHY_INTERFACE_MODE_XGMII:
  2711. val = 0x10; /* serdes mode XSGMII */
  2712. break;
  2713. case PHY_INTERFACE_MODE_USXGMII:
  2714. case PHY_INTERFACE_MODE_2500BASEX:
  2715. val = 0xD;
  2716. break;
  2717. case PHY_INTERFACE_MODE_HSGMII:
  2718. val = 0x12;
  2719. break;
  2720. case PHY_INTERFACE_MODE_SGMII:
  2721. val = 0x2;
  2722. break;
  2723. default:
  2724. return;
  2725. }
  2726. val |= (1 << 7);
  2727. sw_w32(val, RTL931X_SERDES_MODE_CTRL + 4 * (sds >> 2));
  2728. }
  2729. static sds_config sds_config_10p3125g_type1[] = {
  2730. { 0x2E, 0x00, 0x0107 }, { 0x2E, 0x01, 0x01A3 }, { 0x2E, 0x02, 0x6A24 },
  2731. { 0x2E, 0x03, 0xD10D }, { 0x2E, 0x04, 0x8000 }, { 0x2E, 0x05, 0xA17E },
  2732. { 0x2E, 0x06, 0xE31D }, { 0x2E, 0x07, 0x800E }, { 0x2E, 0x08, 0x0294 },
  2733. { 0x2E, 0x09, 0x0CE4 }, { 0x2E, 0x0A, 0x7FC8 }, { 0x2E, 0x0B, 0xE0E7 },
  2734. { 0x2E, 0x0C, 0x0200 }, { 0x2E, 0x0D, 0xDF80 }, { 0x2E, 0x0E, 0x0000 },
  2735. { 0x2E, 0x0F, 0x1FC2 }, { 0x2E, 0x10, 0x0C3F }, { 0x2E, 0x11, 0x0000 },
  2736. { 0x2E, 0x12, 0x27C0 }, { 0x2E, 0x13, 0x7E1D }, { 0x2E, 0x14, 0x1300 },
  2737. { 0x2E, 0x15, 0x003F }, { 0x2E, 0x16, 0xBE7F }, { 0x2E, 0x17, 0x0090 },
  2738. { 0x2E, 0x18, 0x0000 }, { 0x2E, 0x19, 0x4000 }, { 0x2E, 0x1A, 0x0000 },
  2739. { 0x2E, 0x1B, 0x8000 }, { 0x2E, 0x1C, 0x011F }, { 0x2E, 0x1D, 0x0000 },
  2740. { 0x2E, 0x1E, 0xC8FF }, { 0x2E, 0x1F, 0x0000 }, { 0x2F, 0x00, 0xC000 },
  2741. { 0x2F, 0x01, 0xF000 }, { 0x2F, 0x02, 0x6010 }, { 0x2F, 0x12, 0x0EE7 },
  2742. { 0x2F, 0x13, 0x0000 }
  2743. };
  2744. static sds_config sds_config_10p3125g_cmu_type1[] = {
  2745. { 0x2F, 0x03, 0x4210 }, { 0x2F, 0x04, 0x0000 }, { 0x2F, 0x05, 0x0019 },
  2746. { 0x2F, 0x06, 0x18A6 }, { 0x2F, 0x07, 0x2990 }, { 0x2F, 0x08, 0xFFF4 },
  2747. { 0x2F, 0x09, 0x1F08 }, { 0x2F, 0x0A, 0x0000 }, { 0x2F, 0x0B, 0x8000 },
  2748. { 0x2F, 0x0C, 0x4224 }, { 0x2F, 0x0D, 0x0000 }, { 0x2F, 0x0E, 0x0000 },
  2749. { 0x2F, 0x0F, 0xA470 }, { 0x2F, 0x10, 0x8000 }, { 0x2F, 0x11, 0x037B }
  2750. };
  2751. void rtl931x_sds_init(u32 sds, phy_interface_t mode)
  2752. {
  2753. u32 board_sds_tx_type1[] = {
  2754. 0x01c3, 0x01c3, 0x01c3, 0x01a3, 0x01a3, 0x01a3,
  2755. 0x0143, 0x0143, 0x0143, 0x0143, 0x0163, 0x0163,
  2756. };
  2757. u32 board_sds_tx[] = {
  2758. 0x1a00, 0x1a00, 0x0200, 0x0200, 0x0200, 0x0200,
  2759. 0x01a3, 0x01a3, 0x01a3, 0x01a3, 0x01e3, 0x01e3
  2760. };
  2761. u32 board_sds_tx2[] = {
  2762. 0x0dc0, 0x01c0, 0x0200, 0x0180, 0x0160, 0x0123,
  2763. 0x0123, 0x0163, 0x01a3, 0x01a0, 0x01c3, 0x09c3,
  2764. };
  2765. u32 asds, dSds, ori, model_info, val;
  2766. int chiptype = 0;
  2767. asds = rtl931x_get_analog_sds(sds);
  2768. if (sds > 13)
  2769. return;
  2770. pr_info("%s: set sds %d to mode %d\n", __func__, sds, mode);
  2771. val = rtl9310_sds_field_r(asds, 0x1F, 0x9, 11, 6);
  2772. pr_info("%s: fibermode %08X stored mode 0x%x analog SDS %d", __func__,
  2773. rtl931x_read_sds_phy(asds, 0x1f, 0x9), val, asds);
  2774. pr_info("%s: SGMII mode %08X in 0x24 0x9 analog SDS %d", __func__,
  2775. rtl931x_read_sds_phy(asds, 0x24, 0x9), asds);
  2776. pr_info("%s: CMU mode %08X stored even SDS %d", __func__,
  2777. rtl931x_read_sds_phy(asds & ~1, 0x20, 0x12), asds & ~1);
  2778. pr_info("%s: serdes_mode_ctrl %08X", __func__, RTL931X_SERDES_MODE_CTRL + 4 * (sds >> 2));
  2779. pr_info("%s CMU page 0x24 0x7 %08x\n", __func__, rtl931x_read_sds_phy(asds, 0x24, 0x7));
  2780. pr_info("%s CMU page 0x26 0x7 %08x\n", __func__, rtl931x_read_sds_phy(asds, 0x26, 0x7));
  2781. pr_info("%s CMU page 0x28 0x7 %08x\n", __func__, rtl931x_read_sds_phy(asds, 0x28, 0x7));
  2782. pr_info("%s XSG page 0x0 0xe %08x\n", __func__, rtl931x_read_sds_phy(dSds, 0x0, 0xe));
  2783. pr_info("%s XSG2 page 0x0 0xe %08x\n", __func__, rtl931x_read_sds_phy(dSds + 1, 0x0, 0xe));
  2784. model_info = sw_r32(RTL93XX_MODEL_NAME_INFO);
  2785. if ((model_info >> 4) & 0x1) {
  2786. pr_info("detected chiptype 1\n");
  2787. chiptype = 1;
  2788. } else {
  2789. pr_info("detected chiptype 0\n");
  2790. }
  2791. if (sds < 2)
  2792. dSds = sds;
  2793. else
  2794. dSds = (sds - 1) * 2;
  2795. pr_info("%s: 2.5gbit %08X dsds %d", __func__,
  2796. rtl931x_read_sds_phy(dSds, 0x1, 0x14), dSds);
  2797. pr_info("%s: RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR 0x%08X\n", __func__, sw_r32(RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR));
  2798. ori = sw_r32(RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR);
  2799. val = ori | (1 << sds);
  2800. sw_w32(val, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR);
  2801. switch (mode) {
  2802. case PHY_INTERFACE_MODE_NA:
  2803. break;
  2804. case PHY_INTERFACE_MODE_XGMII: /* MII_XSGMII */
  2805. if (chiptype) {
  2806. u32 xsg_sdsid_1;
  2807. xsg_sdsid_1 = dSds + 1;
  2808. /* fifo inv clk */
  2809. rtl9310_sds_field_w(dSds, 0x1, 0x1, 7, 4, 0xf);
  2810. rtl9310_sds_field_w(dSds, 0x1, 0x1, 3, 0, 0xf);
  2811. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 0x1, 7, 4, 0xf);
  2812. rtl9310_sds_field_w(xsg_sdsid_1, 0x1, 0x1, 3, 0, 0xf);
  2813. }
  2814. rtl9310_sds_field_w(dSds, 0x0, 0xE, 12, 12, 1);
  2815. rtl9310_sds_field_w(dSds + 1, 0x0, 0xE, 12, 12, 1);
  2816. break;
  2817. case PHY_INTERFACE_MODE_USXGMII: /* MII_USXGMII_10GSXGMII/10GDXGMII/10GQXGMII: */
  2818. u32 op_code = 0x6003;
  2819. u32 evenSds;
  2820. if (chiptype) {
  2821. rtl9310_sds_field_w(asds, 0x6, 0x2, 12, 12, 1);
  2822. for (int i = 0; i < sizeof(sds_config_10p3125g_type1) / sizeof(sds_config); ++i) {
  2823. rtl931x_write_sds_phy(asds, sds_config_10p3125g_type1[i].page - 0x4, sds_config_10p3125g_type1[i].reg, sds_config_10p3125g_type1[i].data);
  2824. }
  2825. evenSds = asds - (asds % 2);
  2826. for (int i = 0; i < sizeof(sds_config_10p3125g_cmu_type1) / sizeof(sds_config); ++i) {
  2827. rtl931x_write_sds_phy(evenSds,
  2828. sds_config_10p3125g_cmu_type1[i].page - 0x4, sds_config_10p3125g_cmu_type1[i].reg, sds_config_10p3125g_cmu_type1[i].data);
  2829. }
  2830. rtl9310_sds_field_w(asds, 0x6, 0x2, 12, 12, 0);
  2831. } else {
  2832. rtl9310_sds_field_w(asds, 0x2e, 0xd, 6, 0, 0x0);
  2833. rtl9310_sds_field_w(asds, 0x2e, 0xd, 7, 7, 0x1);
  2834. rtl9310_sds_field_w(asds, 0x2e, 0x1c, 5, 0, 0x1E);
  2835. rtl9310_sds_field_w(asds, 0x2e, 0x1d, 11, 0, 0x00);
  2836. rtl9310_sds_field_w(asds, 0x2e, 0x1f, 11, 0, 0x00);
  2837. rtl9310_sds_field_w(asds, 0x2f, 0x0, 11, 0, 0x00);
  2838. rtl9310_sds_field_w(asds, 0x2f, 0x1, 11, 0, 0x00);
  2839. rtl9310_sds_field_w(asds, 0x2e, 0xf, 12, 6, 0x7F);
  2840. rtl931x_write_sds_phy(asds, 0x2f, 0x12, 0xaaa);
  2841. rtl931x_sds_rx_rst(sds);
  2842. rtl931x_write_sds_phy(asds, 0x7, 0x10, op_code);
  2843. rtl931x_write_sds_phy(asds, 0x6, 0x1d, 0x0480);
  2844. rtl931x_write_sds_phy(asds, 0x6, 0xe, 0x0400);
  2845. }
  2846. break;
  2847. case PHY_INTERFACE_MODE_10GBASER: /* MII_10GR / MII_10GR1000BX_AUTO: */
  2848. /* configure 10GR fiber mode=1 */
  2849. rtl9310_sds_field_w(asds, 0x1f, 0xb, 1, 1, 1);
  2850. /* init fiber_1g */
  2851. rtl9310_sds_field_w(dSds, 0x3, 0x13, 15, 14, 0);
  2852. rtl9310_sds_field_w(dSds, 0x2, 0x0, 12, 12, 1);
  2853. rtl9310_sds_field_w(dSds, 0x2, 0x0, 6, 6, 1);
  2854. rtl9310_sds_field_w(dSds, 0x2, 0x0, 13, 13, 0);
  2855. /* init auto */
  2856. rtl9310_sds_field_w(asds, 0x1f, 13, 15, 0, 0x109e);
  2857. rtl9310_sds_field_w(asds, 0x1f, 0x6, 14, 10, 0x8);
  2858. rtl9310_sds_field_w(asds, 0x1f, 0x7, 10, 4, 0x7f);
  2859. break;
  2860. case PHY_INTERFACE_MODE_HSGMII:
  2861. rtl9310_sds_field_w(dSds, 0x1, 0x14, 8, 8, 1);
  2862. break;
  2863. case PHY_INTERFACE_MODE_1000BASEX: /* MII_1000BX_FIBER */
  2864. rtl9310_sds_field_w(dSds, 0x3, 0x13, 15, 14, 0);
  2865. rtl9310_sds_field_w(dSds, 0x2, 0x0, 12, 12, 1);
  2866. rtl9310_sds_field_w(dSds, 0x2, 0x0, 6, 6, 1);
  2867. rtl9310_sds_field_w(dSds, 0x2, 0x0, 13, 13, 0);
  2868. break;
  2869. case PHY_INTERFACE_MODE_SGMII:
  2870. rtl9310_sds_field_w(asds, 0x24, 0x9, 15, 15, 0);
  2871. break;
  2872. case PHY_INTERFACE_MODE_2500BASEX:
  2873. rtl9310_sds_field_w(dSds, 0x1, 0x14, 8, 8, 1);
  2874. break;
  2875. case PHY_INTERFACE_MODE_QSGMII:
  2876. default:
  2877. pr_info("%s: PHY mode %s not supported by SerDes %d\n",
  2878. __func__, phy_modes(mode), sds);
  2879. return;
  2880. }
  2881. rtl931x_cmu_type_set(asds, mode, chiptype);
  2882. if (sds >= 2 && sds <= 13) {
  2883. if (chiptype)
  2884. rtl931x_write_sds_phy(asds, 0x2E, 0x1, board_sds_tx_type1[sds - 2]);
  2885. else {
  2886. val = 0xa0000;
  2887. sw_w32(val, RTL931X_CHIP_INFO_ADDR);
  2888. val = sw_r32(RTL931X_CHIP_INFO_ADDR);
  2889. if (val & BIT(28)) /* consider 9311 etc. RTL9313_CHIP_ID == HWP_CHIP_ID(unit)) */
  2890. {
  2891. rtl931x_write_sds_phy(asds, 0x2E, 0x1, board_sds_tx2[sds - 2]);
  2892. } else {
  2893. rtl931x_write_sds_phy(asds, 0x2E, 0x1, board_sds_tx[sds - 2]);
  2894. }
  2895. val = 0;
  2896. sw_w32(val, RTL931X_CHIP_INFO_ADDR);
  2897. }
  2898. }
  2899. val = ori & ~BIT(sds);
  2900. sw_w32(val, RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR);
  2901. pr_debug("%s: RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR 0x%08X\n", __func__, sw_r32(RTL931X_PS_SERDES_OFF_MODE_CTRL_ADDR));
  2902. if (mode == PHY_INTERFACE_MODE_XGMII ||
  2903. mode == PHY_INTERFACE_MODE_QSGMII ||
  2904. mode == PHY_INTERFACE_MODE_HSGMII ||
  2905. mode == PHY_INTERFACE_MODE_SGMII ||
  2906. mode == PHY_INTERFACE_MODE_USXGMII) {
  2907. if (mode == PHY_INTERFACE_MODE_XGMII)
  2908. rtl931x_sds_mii_mode_set(sds, mode);
  2909. else
  2910. rtl931x_sds_fiber_mode_set(sds, mode);
  2911. }
  2912. }
  2913. int rtl931x_sds_cmu_band_set(int sds, bool enable, u32 band, phy_interface_t mode)
  2914. {
  2915. u32 asds;
  2916. int page = rtl931x_sds_cmu_page_get(mode);
  2917. sds -= (sds % 2);
  2918. sds = sds & ~1;
  2919. asds = rtl931x_get_analog_sds(sds);
  2920. page += 1;
  2921. if (enable) {
  2922. rtl9310_sds_field_w(asds, page, 0x7, 13, 13, 0);
  2923. rtl9310_sds_field_w(asds, page, 0x7, 11, 11, 0);
  2924. } else {
  2925. rtl9310_sds_field_w(asds, page, 0x7, 13, 13, 0);
  2926. rtl9310_sds_field_w(asds, page, 0x7, 11, 11, 0);
  2927. }
  2928. rtl9310_sds_field_w(asds, page, 0x7, 4, 0, band);
  2929. rtl931x_sds_rst(sds);
  2930. return 0;
  2931. }
  2932. int rtl931x_sds_cmu_band_get(int sds, phy_interface_t mode)
  2933. {
  2934. int page = rtl931x_sds_cmu_page_get(mode);
  2935. u32 asds, band;
  2936. sds -= (sds % 2);
  2937. asds = rtl931x_get_analog_sds(sds);
  2938. page += 1;
  2939. rtl931x_write_sds_phy(asds, 0x1f, 0x02, 73);
  2940. rtl9310_sds_field_w(asds, page, 0x5, 15, 15, 1);
  2941. band = rtl9310_sds_field_r(asds, 0x1f, 0x15, 8, 3);
  2942. pr_info("%s band is: %d\n", __func__, band);
  2943. return band;
  2944. }
  2945. int rtl931x_link_sts_get(u32 sds)
  2946. {
  2947. u32 sts, sts1, latch_sts, latch_sts1;
  2948. if (0){
  2949. u32 xsg_sdsid_0, xsg_sdsid_1;
  2950. xsg_sdsid_0 = sds < 2 ? sds : (sds - 1) * 2;
  2951. xsg_sdsid_1 = xsg_sdsid_0 + 1;
  2952. sts = rtl9310_sds_field_r(xsg_sdsid_0, 0x1, 29, 8, 0);
  2953. sts1 = rtl9310_sds_field_r(xsg_sdsid_1, 0x1, 29, 8, 0);
  2954. latch_sts = rtl9310_sds_field_r(xsg_sdsid_0, 0x1, 30, 8, 0);
  2955. latch_sts1 = rtl9310_sds_field_r(xsg_sdsid_1, 0x1, 30, 8, 0);
  2956. } else {
  2957. u32 asds, dsds;
  2958. asds = rtl931x_get_analog_sds(sds);
  2959. sts = rtl9310_sds_field_r(asds, 0x5, 0, 12, 12);
  2960. latch_sts = rtl9310_sds_field_r(asds, 0x4, 1, 2, 2);
  2961. dsds = sds < 2 ? sds : (sds - 1) * 2;
  2962. latch_sts1 = rtl9310_sds_field_r(dsds, 0x2, 1, 2, 2);
  2963. sts1 = rtl9310_sds_field_r(dsds, 0x2, 1, 2, 2);
  2964. }
  2965. pr_info("%s: serdes %d sts %d, sts1 %d, latch_sts %d, latch_sts1 %d\n", __func__,
  2966. sds, sts, sts1, latch_sts, latch_sts1);
  2967. return sts1;
  2968. }
  2969. static int rtl8214fc_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
  2970. {
  2971. struct phy_device *phydev = upstream;
  2972. rtl8214fc_media_set(phydev, true);
  2973. return 0;
  2974. }
  2975. static void rtl8214fc_sfp_remove(void *upstream)
  2976. {
  2977. struct phy_device *phydev = upstream;
  2978. rtl8214fc_media_set(phydev, false);
  2979. }
  2980. static const struct sfp_upstream_ops rtl8214fc_sfp_ops = {
  2981. .attach = phy_sfp_attach,
  2982. .detach = phy_sfp_detach,
  2983. .module_insert = rtl8214fc_sfp_insert,
  2984. .module_remove = rtl8214fc_sfp_remove,
  2985. };
  2986. static int rtl8214fc_phy_probe(struct phy_device *phydev)
  2987. {
  2988. struct device *dev = &phydev->mdio.dev;
  2989. int addr = phydev->mdio.addr;
  2990. int ret = 0;
  2991. /* 839x has internal SerDes */
  2992. if (soc_info.id == 0x8393)
  2993. return -ENODEV;
  2994. /* All base addresses of the PHYs start at multiples of 8 */
  2995. devm_phy_package_join(dev, phydev, addr & (~7),
  2996. sizeof(struct rtl83xx_shared_private));
  2997. if (!(addr % 8)) {
  2998. struct rtl83xx_shared_private *shared = phydev->shared->priv;
  2999. shared->name = "RTL8214FC";
  3000. /* Configuration must be done while patching still possible */
  3001. ret = rtl8380_configure_rtl8214fc(phydev);
  3002. if (ret)
  3003. return ret;
  3004. }
  3005. return phy_sfp_probe(phydev, &rtl8214fc_sfp_ops);
  3006. }
  3007. static int rtl8214c_phy_probe(struct phy_device *phydev)
  3008. {
  3009. struct device *dev = &phydev->mdio.dev;
  3010. int addr = phydev->mdio.addr;
  3011. /* All base addresses of the PHYs start at multiples of 8 */
  3012. devm_phy_package_join(dev, phydev, addr & (~7),
  3013. sizeof(struct rtl83xx_shared_private));
  3014. if (!(addr % 8)) {
  3015. struct rtl83xx_shared_private *shared = phydev->shared->priv;
  3016. shared->name = "RTL8214C";
  3017. /* Configuration must be done whil patching still possible */
  3018. return rtl8380_configure_rtl8214c(phydev);
  3019. }
  3020. return 0;
  3021. }
  3022. static int rtl8218b_ext_phy_probe(struct phy_device *phydev)
  3023. {
  3024. struct device *dev = &phydev->mdio.dev;
  3025. int addr = phydev->mdio.addr;
  3026. /* All base addresses of the PHYs start at multiples of 8 */
  3027. devm_phy_package_join(dev, phydev, addr & (~7),
  3028. sizeof(struct rtl83xx_shared_private));
  3029. if (!(addr % 8)) {
  3030. struct rtl83xx_shared_private *shared = phydev->shared->priv;
  3031. shared->name = "RTL8218B (external)";
  3032. if (soc_info.family == RTL8380_FAMILY_ID) {
  3033. /* Configuration must be done while patching still possible */
  3034. return rtl8380_configure_ext_rtl8218b(phydev);
  3035. }
  3036. }
  3037. return 0;
  3038. }
  3039. static int rtl8218b_int_phy_probe(struct phy_device *phydev)
  3040. {
  3041. struct device *dev = &phydev->mdio.dev;
  3042. int addr = phydev->mdio.addr;
  3043. if (soc_info.family != RTL8380_FAMILY_ID)
  3044. return -ENODEV;
  3045. if (addr >= 24)
  3046. return -ENODEV;
  3047. pr_debug("%s: id: %d\n", __func__, addr);
  3048. /* All base addresses of the PHYs start at multiples of 8 */
  3049. devm_phy_package_join(dev, phydev, addr & (~7),
  3050. sizeof(struct rtl83xx_shared_private));
  3051. if (!(addr % 8)) {
  3052. struct rtl83xx_shared_private *shared = phydev->shared->priv;
  3053. shared->name = "RTL8218B (internal)";
  3054. /* Configuration must be done while patching still possible */
  3055. return rtl8380_configure_int_rtl8218b(phydev);
  3056. }
  3057. return 0;
  3058. }
  3059. static int rtl8218d_phy_probe(struct phy_device *phydev)
  3060. {
  3061. struct device *dev = &phydev->mdio.dev;
  3062. int addr = phydev->mdio.addr;
  3063. pr_debug("%s: id: %d\n", __func__, addr);
  3064. /* All base addresses of the PHYs start at multiples of 8 */
  3065. devm_phy_package_join(dev, phydev, addr & (~7),
  3066. sizeof(struct rtl83xx_shared_private));
  3067. /* All base addresses of the PHYs start at multiples of 8 */
  3068. if (!(addr % 8)) {
  3069. struct rtl83xx_shared_private *shared = phydev->shared->priv;
  3070. shared->name = "RTL8218D";
  3071. /* Configuration must be done while patching still possible */
  3072. /* TODO: return configure_rtl8218d(phydev); */
  3073. }
  3074. return 0;
  3075. }
  3076. static int rtl838x_serdes_probe(struct phy_device *phydev)
  3077. {
  3078. int addr = phydev->mdio.addr;
  3079. if (soc_info.family != RTL8380_FAMILY_ID)
  3080. return -ENODEV;
  3081. if (addr < 24)
  3082. return -ENODEV;
  3083. /* On the RTL8380M, PHYs 24-27 connect to the internal SerDes */
  3084. if (soc_info.id == 0x8380) {
  3085. if (addr == 24)
  3086. return rtl8380_configure_serdes(phydev);
  3087. return 0;
  3088. }
  3089. return -ENODEV;
  3090. }
  3091. static int rtl8393_serdes_probe(struct phy_device *phydev)
  3092. {
  3093. int addr = phydev->mdio.addr;
  3094. pr_info("%s: id: %d\n", __func__, addr);
  3095. if (soc_info.family != RTL8390_FAMILY_ID)
  3096. return -ENODEV;
  3097. if (addr < 24)
  3098. return -ENODEV;
  3099. return rtl8390_configure_serdes(phydev);
  3100. }
  3101. static int rtl8390_serdes_probe(struct phy_device *phydev)
  3102. {
  3103. int addr = phydev->mdio.addr;
  3104. if (soc_info.family != RTL8390_FAMILY_ID)
  3105. return -ENODEV;
  3106. if (addr < 24)
  3107. return -ENODEV;
  3108. return rtl8390_configure_generic(phydev);
  3109. }
  3110. static int rtl9300_serdes_probe(struct phy_device *phydev)
  3111. {
  3112. if (soc_info.family != RTL9300_FAMILY_ID)
  3113. return -ENODEV;
  3114. phydev_info(phydev, "Detected internal RTL9300 Serdes\n");
  3115. return rtl9300_configure_serdes(phydev);
  3116. }
  3117. static struct phy_driver rtl83xx_phy_driver[] = {
  3118. {
  3119. PHY_ID_MATCH_MODEL(PHY_ID_RTL8214C),
  3120. .name = "Realtek RTL8214C",
  3121. .features = PHY_GBIT_FEATURES,
  3122. .flags = PHY_HAS_REALTEK_PAGES,
  3123. .match_phy_device = rtl8214c_match_phy_device,
  3124. .probe = rtl8214c_phy_probe,
  3125. .suspend = genphy_suspend,
  3126. .resume = genphy_resume,
  3127. .set_loopback = genphy_loopback,
  3128. },
  3129. {
  3130. PHY_ID_MATCH_MODEL(PHY_ID_RTL8214FC),
  3131. .name = "Realtek RTL8214FC",
  3132. .features = PHY_GBIT_FIBRE_FEATURES,
  3133. .flags = PHY_HAS_REALTEK_PAGES,
  3134. .match_phy_device = rtl8214fc_match_phy_device,
  3135. .probe = rtl8214fc_phy_probe,
  3136. .suspend = rtl8214fc_suspend,
  3137. .resume = rtl8214fc_resume,
  3138. .set_loopback = genphy_loopback,
  3139. .set_port = rtl8214fc_set_port,
  3140. .get_port = rtl8214fc_get_port,
  3141. .set_eee = rtl8214fc_set_eee,
  3142. .get_eee = rtl8214fc_get_eee,
  3143. },
  3144. {
  3145. PHY_ID_MATCH_MODEL(PHY_ID_RTL8218B_E),
  3146. .name = "Realtek RTL8218B (external)",
  3147. .features = PHY_GBIT_FEATURES,
  3148. .flags = PHY_HAS_REALTEK_PAGES,
  3149. .match_phy_device = rtl8218b_ext_match_phy_device,
  3150. .probe = rtl8218b_ext_phy_probe,
  3151. .suspend = genphy_suspend,
  3152. .resume = genphy_resume,
  3153. .set_loopback = genphy_loopback,
  3154. .set_eee = rtl8218b_set_eee,
  3155. .get_eee = rtl8218b_get_eee,
  3156. },
  3157. {
  3158. PHY_ID_MATCH_MODEL(PHY_ID_RTL8218D),
  3159. .name = "REALTEK RTL8218D",
  3160. .features = PHY_GBIT_FEATURES,
  3161. .flags = PHY_HAS_REALTEK_PAGES,
  3162. .probe = rtl8218d_phy_probe,
  3163. .suspend = genphy_suspend,
  3164. .resume = genphy_resume,
  3165. .set_loopback = genphy_loopback,
  3166. .set_eee = rtl8218d_set_eee,
  3167. .get_eee = rtl8218d_get_eee,
  3168. },
  3169. {
  3170. PHY_ID_MATCH_MODEL(PHY_ID_RTL8221B),
  3171. .name = "REALTEK RTL8221B",
  3172. .features = PHY_GBIT_FEATURES,
  3173. .flags = PHY_HAS_REALTEK_PAGES,
  3174. .suspend = genphy_suspend,
  3175. .resume = genphy_resume,
  3176. .set_loopback = genphy_loopback,
  3177. .read_page = rtl8226_read_page,
  3178. .write_page = rtl8226_write_page,
  3179. .read_status = rtl8226_read_status,
  3180. .config_aneg = rtl8226_config_aneg,
  3181. .set_eee = rtl8226_set_eee,
  3182. .get_eee = rtl8226_get_eee,
  3183. },
  3184. {
  3185. PHY_ID_MATCH_MODEL(PHY_ID_RTL8226),
  3186. .name = "REALTEK RTL8226",
  3187. .features = PHY_GBIT_FEATURES,
  3188. .flags = PHY_HAS_REALTEK_PAGES,
  3189. .suspend = genphy_suspend,
  3190. .resume = genphy_resume,
  3191. .set_loopback = genphy_loopback,
  3192. .read_page = rtl8226_read_page,
  3193. .write_page = rtl8226_write_page,
  3194. .read_status = rtl8226_read_status,
  3195. .config_aneg = rtl8226_config_aneg,
  3196. .set_eee = rtl8226_set_eee,
  3197. .get_eee = rtl8226_get_eee,
  3198. },
  3199. {
  3200. PHY_ID_MATCH_MODEL(PHY_ID_RTL8218B_I),
  3201. .name = "Realtek RTL8218B (internal)",
  3202. .features = PHY_GBIT_FEATURES,
  3203. .flags = PHY_HAS_REALTEK_PAGES,
  3204. .probe = rtl8218b_int_phy_probe,
  3205. .suspend = genphy_suspend,
  3206. .resume = genphy_resume,
  3207. .set_loopback = genphy_loopback,
  3208. .set_eee = rtl8218b_set_eee,
  3209. .get_eee = rtl8218b_get_eee,
  3210. },
  3211. {
  3212. PHY_ID_MATCH_MODEL(PHY_ID_RTL8218B_I),
  3213. .name = "Realtek RTL8380 SERDES",
  3214. .features = PHY_GBIT_FIBRE_FEATURES,
  3215. .flags = PHY_HAS_REALTEK_PAGES,
  3216. .probe = rtl838x_serdes_probe,
  3217. .suspend = genphy_suspend,
  3218. .resume = genphy_resume,
  3219. .set_loopback = genphy_loopback,
  3220. .read_status = rtl8380_read_status,
  3221. },
  3222. {
  3223. PHY_ID_MATCH_MODEL(PHY_ID_RTL8393_I),
  3224. .name = "Realtek RTL8393 SERDES",
  3225. .features = PHY_GBIT_FIBRE_FEATURES,
  3226. .flags = PHY_HAS_REALTEK_PAGES,
  3227. .probe = rtl8393_serdes_probe,
  3228. .suspend = genphy_suspend,
  3229. .resume = genphy_resume,
  3230. .set_loopback = genphy_loopback,
  3231. .read_status = rtl8393_read_status,
  3232. },
  3233. {
  3234. PHY_ID_MATCH_MODEL(PHY_ID_RTL8390_GENERIC),
  3235. .name = "Realtek RTL8390 Generic",
  3236. .features = PHY_GBIT_FIBRE_FEATURES,
  3237. .flags = PHY_HAS_REALTEK_PAGES,
  3238. .probe = rtl8390_serdes_probe,
  3239. .suspend = genphy_suspend,
  3240. .resume = genphy_resume,
  3241. .set_loopback = genphy_loopback,
  3242. },
  3243. {
  3244. PHY_ID_MATCH_MODEL(PHY_ID_RTL9300_I),
  3245. .name = "REALTEK RTL9300 SERDES",
  3246. .features = PHY_GBIT_FIBRE_FEATURES,
  3247. .flags = PHY_HAS_REALTEK_PAGES,
  3248. .probe = rtl9300_serdes_probe,
  3249. .suspend = genphy_suspend,
  3250. .resume = genphy_resume,
  3251. .set_loopback = genphy_loopback,
  3252. .read_status = rtl9300_read_status,
  3253. },
  3254. };
  3255. module_phy_driver(rtl83xx_phy_driver);
  3256. static struct mdio_device_id __maybe_unused rtl83xx_tbl[] = {
  3257. { PHY_ID_MATCH_MODEL(PHY_ID_RTL8214FC) },
  3258. { }
  3259. };
  3260. MODULE_DEVICE_TABLE(mdio, rtl83xx_tbl);
  3261. MODULE_AUTHOR("B. Koblitz");
  3262. MODULE_DESCRIPTION("RTL83xx PHY driver");
  3263. MODULE_LICENSE("GPL");