RTL8136.Mod 123 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406
  1. (**
  2. AUTHOR: Alexey Morozov;
  3. PURPOSE: driver for the 8136 family of Realtek PCI Express Fast Ethernet (FE) controllers
  4. This driver implementation is based on the source code of the linux driver from Realtek (http://www.realtek.com.tw) r8101-1.025.00
  5. List of supported devices:
  6. RTL8100E/RTL8101E/RTL8102E-GR/RTL8103E(L)
  7. RTL8102E(L)/RTL8101E/RTL8103T
  8. RTL8401/RTL8401P/RTL8105E
  9. RTL8402/RTL8106E/RTL8106EUS
  10. *)
  11. MODULE RTL8136;
  12. IMPORT
  13. S := SYSTEM, Kernel, Machine, PCI, Objects, Modules, Plugins, Network, NetworkMii, KernelLog;
  14. CONST
  15. Description = "RealTek 8136 PCI-E FE driver";
  16. MaxETHFrameSize = 1514;
  17. TxBufMaxSize = 1536; (* Max size of tx buffers *)
  18. RxRingSize = 1024; (* Rx Ring of 116 buffers *)
  19. TxRingSize = 1024; (* Tx Ring of 116 buffers *)
  20. SizeOfRxTxFDHdr = 16; (* size of Rx / Tx Descriptor Header *)
  21. Promisc = FALSE; (* enable Promiscuous mode *)
  22. DebugFind = 0;
  23. DebugInit = 1;
  24. DebugConfigs = 2;
  25. DebugHWVer = 3;
  26. DebugMAC = 4;
  27. DebugStatus = 5;
  28. DebugRxRing = 6;
  29. DebugTxRing = 7;
  30. DebugReceive = 8;
  31. DebugTransmit = 9;
  32. DebugInterrupt = 10;
  33. DebugCleanup = 31;
  34. Debug = {(*DebugTransmit,DebugReceive,*)DebugFind, DebugInit, DebugTxRing, DebugCleanup};
  35. (* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. *)
  36. SPEED_10 = 10;
  37. SPEED_100 = 100;
  38. ASPM = FALSE;
  39. (*
  40. Registers
  41. *)
  42. MAC0 = 0; (* Ethernet hardware address. *)
  43. MAC4 = 0x04;
  44. MAR0 = 8; (* Multicast filter. *)
  45. CounterAddrLow = 0x10;
  46. CounterAddrHigh = 0x14;
  47. TxDescStartAddrLow = 0x20;
  48. TxDescStartAddrHigh = 0x24;
  49. TxHDescStartAddrLow = 0x28;
  50. TxHDescStartAddrHigh = 0x2c;
  51. ERSR = 0x36;
  52. ChipCmd = 0x37;
  53. TxPoll = 0x38;
  54. IntrMask = 0x3C;
  55. IntrStatus = 0x3E;
  56. TxConfig = 0x40;
  57. RxConfig = 0x44;
  58. (* RxMissed = 0x4C; *)
  59. TCTR = 0x48;
  60. Cfg9346 = 0x50;
  61. Config0 = 0x51;
  62. Config1 = 0x52;
  63. Config2 = 0x53;
  64. Config3 = 0x54;
  65. Config4 = 0x55;
  66. Config5 = 0x56;
  67. TDFNR = 0x57;
  68. TimeIntr = 0x58;
  69. PHYAR = 0x60;
  70. CSIDR = 0x64;
  71. CSIAR = 0x68;
  72. PHYstatus = 0x6C;
  73. MACDBG = 0x6D;
  74. GPIO = 0x6E;
  75. PMCH = 0x6F;
  76. ERIDR = 0x70;
  77. ERIAR = 0x74;
  78. EPHYAR = 0x80;
  79. OCPDR = 0xB0;
  80. MACOCP = 0xB0;
  81. OCPAR = 0xB4;
  82. PHYOCP = 0xB8;
  83. DBG_reg = 0xD1;
  84. MCUCmd_reg = 0xD3;
  85. RxMaxSize = 0xDA;
  86. CPlusCmd = 0xE0;
  87. IntrMitigate = 0xE2;
  88. RxDescAddrLow = 0xE4;
  89. RxDescAddrHigh = 0xE8;
  90. MTPS = 0xEC;
  91. PHYIO = 0xF8;
  92. (*
  93. Register content
  94. *)
  95. (* InterruptStatusBits *)
  96. SYSErr = 15;
  97. PCSTimeout = 14;
  98. SWInt = 8;
  99. TxDescUnavail = 7;
  100. RxFIFOOver = 6;
  101. LinkChg = 5;
  102. RxDescUnavail = 4;
  103. TxErr = 3;
  104. TxOK = 2;
  105. RxErr = 1;
  106. RxOK = 0;
  107. (* RxStatusDesc *)
  108. RxRES = 0x00200000;
  109. RxCRC = 0x00080000;
  110. RxRUNT = 0x00100000;
  111. RxRWT = 0x00400000;
  112. (* ChipCmdBits *)
  113. StopReq = S.VAL(SET,0x80);
  114. CmdReset = S.VAL(SET,0x10);
  115. CmdRxEnb = S.VAL(SET,0x08);
  116. CmdTxEnb = S.VAL(SET,0x04);
  117. RxBufEmpty = S.VAL(SET,0x01);
  118. (* Cfg9346Bits *)
  119. Cfg9346_Lock = S.VAL(SET,0x00);
  120. Cfg9346_Unlock = S.VAL(SET,0xC0);
  121. Cfg9346_EEDO = {0};
  122. Cfg9346_EEDI = {1};
  123. Cfg9346_EESK = {2};
  124. Cfg9346_EECS = {3};
  125. Cfg9346_EEM0 = {6};
  126. Cfg9346_EEM1 = {7};
  127. (* rx_mode_bits *)
  128. AcceptErr = S.VAL(SET,0x20);
  129. AcceptRunt = S.VAL(SET,0x10);
  130. AcceptBroadcast = S.VAL(SET,0x08);
  131. AcceptMulticast = S.VAL(SET,0x04);
  132. AcceptMyPhys = S.VAL(SET,0x02);
  133. AcceptAllPhys = S.VAL(SET,0x01);
  134. (* Transmit Priority Polling*)
  135. HPQ = S.VAL(SET,0x80);
  136. NPQ = S.VAL(SET,0x40);
  137. FSWInt = S.VAL(SET,0x01);
  138. (* RxConfigBits *)
  139. Reserved2_shift = 13;
  140. RxCfgDMAShift = 8;
  141. RxCfg_9356SEL = {6};
  142. (* TxConfigBits *)
  143. TxInterFrameGapShift = 24;
  144. TxDMAShift = 8; (* DMA burst value (0-7) is shift this many bits *)
  145. TxMACLoopBack = {17}; (* MAC loopback *)
  146. (* Config1 register *)
  147. LEDS1 = {7};
  148. LEDS0 = {6};
  149. Speed_down = {4};
  150. MEMMAP = {3};
  151. IOMAP = {2};
  152. VPD = {1};
  153. PMEnable = {0}; (* Power Management Enable *)
  154. (* Config2 register *)
  155. PMSTS_En = {5};
  156. (* Config3 register *)
  157. MagicPacket = {5}; (* Wake up when receives a Magic Packet *)
  158. LinkUp = {4}; (* Wake up when the cable connection is re-established *)
  159. (* Config5 register *)
  160. BWF = {6}; (* Accept Broadcast wakeup frame *)
  161. MWF = {5}; (* Accept Multicast wakeup frame *)
  162. UWF = {4}; (* Accept Unicast wakeup frame *)
  163. LanWake = {1}; (* LanWake enable/disable *)
  164. PMEStatus = {0}; (* PME status can be reset by PCI RST# *)
  165. ECRCEN = {3};
  166. Jumbo_En = {2};
  167. RDY_TO_L23 = {1};
  168. Beacon_en = {0};
  169. (* Config4 register *)
  170. LANWake = {1};
  171. (* CPlusCmd *)
  172. EnableBist = {15};
  173. Macdbgo_oe = {14};
  174. Normal_mode = {13};
  175. Force_halfdup = {12};
  176. Force_rxflow_en = {11};
  177. Force_txflow_en = {10};
  178. Cxpl_dbg_sel = {9};
  179. ASF = {8};
  180. PktCntrDisable = {7};
  181. RxVlan = {6};
  182. RxChkSum = {5};
  183. PCIDAC = {4};
  184. Macdbgo_sel = 0x001C;
  185. INTT_0 = 0x0000;
  186. INTT_1 = 0x0001;
  187. INTT_2 = 0x0002;
  188. INTT_3 = 0x0003;
  189. (* PHYstatus *)
  190. PowerSaveStatus = S.VAL(SET,0x80);
  191. TxFlowCtrl = S.VAL(SET,0x40);
  192. RxFlowCtrl = S.VAL(SET,0x20);
  193. _100bps = S.VAL(SET,0x08);
  194. _10bps = S.VAL(SET,0x04);
  195. LinkStatus = S.VAL(SET,0x02);
  196. FullDup = S.VAL(SET,0x01);
  197. (* DumpCounterCommand *)
  198. CounterDump = 0x8;
  199. (* PHY access *)
  200. PHYAR_Flag = S.VAL(SET,0x80000000);
  201. PHYAR_Write = S.VAL(SET,0x80000000);
  202. PHYAR_Read = S.VAL(SET,0x00000000);
  203. PHYAR_Reg_Mask = S.VAL(SET,0x1f);
  204. PHYAR_Reg_shift = 16;
  205. PHYAR_Data_Mask = S.VAL(SET,0xffff);
  206. (* PHY IO access *)
  207. PHYIO_Flag = S.VAL(SET,0x80000000);
  208. PHYIO_Write = S.VAL(SET,0x80000000);
  209. PHYIO_Read = S.VAL(SET,0x00000000);
  210. PHYIO_Reg_Mask = S.VAL(SET,0x1f);
  211. PHYIO_Reg_shift = 16;
  212. PHYIO_Data_Mask = S.VAL(SET,0xffff);
  213. (* EPHY access *)
  214. EPHYAR_Flag = S.VAL(SET,0x80000000);
  215. EPHYAR_Write = S.VAL(SET,0x80000000);
  216. EPHYAR_Read = S.VAL(SET,0x00000000);
  217. EPHYAR_Reg_Mask = S.VAL(SET,0x1f);
  218. EPHYAR_Reg_shift = 16;
  219. EPHYAR_Data_Mask = S.VAL(SET,0xffff);
  220. (* CSI access *)
  221. CSIAR_Flag = 0x80000000;
  222. CSIAR_Write = 0x80000000;
  223. CSIAR_Read = 0x00000000;
  224. CSIAR_ByteEn = 0x0f;
  225. CSIAR_ByteEn_shift = 12;
  226. CSIAR_Addr_Mask = 0x0fff;
  227. (* ERI access *)
  228. ERIAR_Flag = S.VAL(SET,0x80000000);
  229. ERIAR_Write = S.VAL(SET,0x80000000);
  230. ERIAR_Read = S.VAL(SET,0x00000000);
  231. ERIAR_Addr_Align = 4; (* ERI access register address must be 4 byte alignment *)
  232. ERIAR_ExGMAC = 0;
  233. ERIAR_MSIX = 1;
  234. ERIAR_ASF = 2;
  235. ERIAR_Type_shift = 16;
  236. ERIAR_ByteEn = 0x0f;
  237. ERIAR_ByteEn_shift = 12;
  238. (* OCP GPHY access *)
  239. OCPDR_Write = 0x80000000;
  240. OCPDR_Read = 0x00000000;
  241. OCPDR_Reg_Mask = 0xFF;
  242. OCPDR_Data_Mask = 0xFFFF;
  243. OCPDR_GPHY_Reg_shift = 16;
  244. OCPAR_Flag = 0x80000000;
  245. OCPAR_GPHY_Write = 0x8000F060;
  246. OCPAR_GPHY_Read = 0x0000F060;
  247. OCPR_Write = 0x80000000;
  248. OCPR_Read = 0x00000000;
  249. OCPR_Addr_Reg_shift = 16;
  250. OCPR_Flag = 0x80000000;
  251. OCP_STD_PHY_BASE_PAGE = 0x0A40;
  252. (* MCU Command *)
  253. Now_is_oob = {7};
  254. Txfifo_empty = {5};
  255. Rxfifo_empty = {4};
  256. (* GPIO *)
  257. GPIO_en = {0};
  258. (*
  259. Device configuration method
  260. *)
  261. CFG_METHOD_1 = 0;
  262. CFG_METHOD_2 = 1;
  263. CFG_METHOD_3 = 2;
  264. CFG_METHOD_4 = 3;
  265. CFG_METHOD_5 = 4;
  266. CFG_METHOD_6 = 5;
  267. CFG_METHOD_7 = 6;
  268. CFG_METHOD_8 = 7;
  269. CFG_METHOD_9 = 8;
  270. CFG_METHOD_10 = 9;
  271. CFG_METHOD_11 = 11;
  272. CFG_METHOD_12 = 12;
  273. CFG_METHOD_13 = 13;
  274. CFG_METHOD_14 = 14;
  275. CFG_METHOD_15 = 15;
  276. CFG_METHOD_16 = 16;
  277. CFG_METHOD_17 = 17;
  278. CFG_METHOD_MAX = 18;
  279. HwCfgMethods = [CFG_METHOD_1,CFG_METHOD_2,CFG_METHOD_3,CFG_METHOD_4,CFG_METHOD_5,CFG_METHOD_6,CFG_METHOD_7,CFG_METHOD_8,CFG_METHOD_9,CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17];
  280. RxConfigMask = [0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880,0xff7e1880];
  281. Reserved2_data = 7;
  282. RX_DMA_BURST = 6; (* Maximum PCI burst, '6' is 1024 *)
  283. TX_DMA_BURST = 6; (* Maximum PCI burst, '6' is 1024 *)
  284. Reserved1_data = S.VAL(SET,0x3F);
  285. RxPacketMaxSize = 0x3FE8; (* 16K - 1 - ETH_HLEN - VLAN - CRC... *)
  286. InterFrameGap = 0x03; (* 3 means InterFrameGap = the shortest one *)
  287. DSM_MAC_INIT = 1;
  288. DSM_NIC_GOTO_D3 = 2;
  289. DSM_IF_DOWN = 3;
  290. DSM_NIC_RESUME_D3 = 4;
  291. DSM_IF_UP = 5;
  292. VAR
  293. installed: LONGINT; (* number of installed devices *)
  294. TYPE
  295. (* base Rx/Tx descriptor, as described in RTL8169 specs *)
  296. RxTxDescriptor = RECORD
  297. flags: SET;
  298. vLanTag: LONGINT;
  299. bufAdrLo, bufAdrHi: LONGINT;
  300. END;
  301. (* buffer for transmission *)
  302. TxBuffer = POINTER TO RECORD
  303. data: ARRAY TxBufMaxSize OF CHAR;
  304. next: TxBuffer;
  305. END;
  306. (* wrapper for Network.Buffer to be able to form rings *)
  307. RxBuffer = POINTER TO RECORD
  308. buf: Network.Buffer;
  309. next: RxBuffer;
  310. END;
  311. (* Statistics counters as specified by Realtek *)
  312. TallyCounters = RECORD
  313. txPackets: HUGEINT;
  314. rxPacktes: HUGEINT;
  315. txErrors: HUGEINT;
  316. rxErrors: LONGINT;
  317. rxMissed: INTEGER;
  318. alignErrors: INTEGER;
  319. txOneCollision: LONGINT;
  320. txMultiCollision: LONGINT;
  321. rxUnicast: HUGEINT;
  322. rxBroadcast: HUGEINT;
  323. rxMulticast: LONGINT;
  324. txAborted: INTEGER;
  325. txUnderrun: INTEGER;
  326. END;
  327. (* LinkDevice: interface to Bluebottle *)
  328. LinkDevice = OBJECT (Network.LinkDevice)
  329. VAR
  330. ctrl: Controller;
  331. PROCEDURE Linked*(): LONGINT;
  332. BEGIN
  333. RETURN ctrl.linkStatus;
  334. END Linked;
  335. PROCEDURE DoSend*(dst: Network.LinkAdr; type: LONGINT; CONST l3hdr, l4hdr, data: ARRAY OF CHAR; h3len, h4len, dofs, dlen: LONGINT);
  336. BEGIN
  337. ctrl.SendFrame(dst, type, l3hdr, l4hdr, data, h3len, h4len, dofs, dlen);
  338. END DoSend;
  339. PROCEDURE Finalize(connected: BOOLEAN);
  340. BEGIN
  341. ctrl.Finalize;
  342. Finalize^(connected);
  343. END Finalize;
  344. END LinkDevice;
  345. (* Controller: interface to the RTL8169 hardware *)
  346. Controller = OBJECT
  347. VAR
  348. next: Controller; (* next controller in list *)
  349. base: ADDRESS; irq: LONGINT;
  350. dev: LinkDevice;
  351. rdsBuf: ARRAY RxRingSize*SIZEOF(RxTxDescriptor)+255 OF CHAR;
  352. tdsBuf: ARRAY TxRingSize*SIZEOF(RxTxDescriptor)+255 OF CHAR;
  353. rds: ARRAY RxRingSize OF POINTER{UNSAFE, UNTRACED} TO RxTxDescriptor;
  354. tds: ARRAY TxRingSize OF POINTER{UNSAFE, UNTRACED} TO RxTxDescriptor;
  355. curRD, curTD: LONGINT;
  356. firstRD, firstTD: LONGINT;
  357. lastRD, lastTD: LONGINT;
  358. (*rxBuffer, rxLast: TxBuffer;*)
  359. rxBuffer, rxLast: RxBuffer;
  360. txBuffer, txLast: TxBuffer;
  361. nofFreeTx: LONGINT; (* number of free tx descriptors *)
  362. nRxOverflow: HUGEINT;
  363. nTxOverflow: HUGEINT;
  364. nRxFrames, nTxFrames: LONGINT;
  365. nRxErrorFrames: LONGINT;
  366. nTxErrorFrames: LONGINT;
  367. linkStatus: LONGINT;
  368. pciBus, pciDev, pciFct: LONGINT;
  369. hwCfgMethod, chipsetInd: LONGINT;
  370. hwIcVerUnknown: BOOLEAN;
  371. phy_auto_nego_reg: SET;
  372. cp_cmd: SET;
  373. bios_setting: SET;
  374. use_timer_interrrupt: BOOLEAN;
  375. eee_enable: BOOLEAN;
  376. intr_mask: SET;
  377. rx_buf_sz: LONGINT;
  378. autoneg: BOOLEAN;
  379. speed: LONGINT;
  380. duplexFull: BOOLEAN;
  381. wol_enabled: BOOLEAN;
  382. notWrRamCodeToMicroP: BOOLEAN;
  383. hwHasWrRamCodeToMicroP: BOOLEAN;
  384. notWrMcuPatchCode: BOOLEAN;
  385. txDescStartAddr, rxDescStartAddr: ADDRESS;
  386. counters(*{ALIGNED=64}*): TallyCounters;
  387. PROCEDURE &InitController(
  388. dev: LinkDevice;
  389. base: ADDRESS;
  390. irq: LONGINT;
  391. pciBus, pciDev, pciFct: LONGINT;
  392. hwCfgMethod: LONGINT;
  393. chipsetInd: LONGINT;
  394. hwIcVerUnknown: BOOLEAN);
  395. VAR
  396. res, i: LONGINT;
  397. s: SET;
  398. BEGIN
  399. (* update list of installed controllers, insert at head *)
  400. SELF.next := installedControllers;
  401. installedControllers := SELF;
  402. SELF.base := base;
  403. SELF.dev := dev;
  404. SELF.irq := irq;
  405. SELF.pciDev := pciDev;
  406. SELF.pciBus := pciBus;
  407. SELF.pciFct := pciFct;
  408. SELF.hwCfgMethod := hwCfgMethod;
  409. SELF.chipsetInd := chipsetInd;
  410. SELF.hwIcVerUnknown := hwIcVerUnknown;
  411. dev.ctrl := SELF;
  412. nRxOverflow := 0;
  413. nTxOverflow := 0;
  414. nRxFrames := 0;
  415. nTxFrames := 0;
  416. nRxErrorFrames := 0;
  417. nTxErrorFrames := 0;
  418. (* tell the system that the nic calculates the checksums for tcp, udp and ip packets *)
  419. dev.calcChecksum := {Network.ChecksumIP, Network.ChecksumTCP, Network.ChecksumUDP};
  420. (* set ethernet broadcast address: FF-FF-FF-FF-FF-FF *)
  421. FOR i := 0 TO 5 DO
  422. dev.broadcast[i] := 0FFX
  423. END;
  424. (* make sure PIO and MMIO are enabled*)
  425. s := S.VAL(SET,Read8(52H));
  426. IF ~ (2 IN s) THEN
  427. KernelLog.String("I/O Mapping is disabled!");
  428. HALT(1000);
  429. END;
  430. IF ~ (3 IN s) THEN
  431. KernelLog.String("MMIO is disabled!");
  432. HALT(1000);
  433. END;
  434. (* install interrupt handler *)
  435. IF (irq >= 1) & (irq <= 15) THEN
  436. Objects.InstallHandler(SELF.HandleInterrupt, Machine.IRQ0 + irq)
  437. END;
  438. (* *)
  439. init_one;
  440. open;
  441. (* enable transmitter and receiver *)
  442. Write8(ChipCmd, CmdTxEnb+CmdRxEnb);
  443. (* Enable all known interrupts by setting the interrupt mask. *)
  444. Write16(IntrMask, intr_mask);
  445. (* *)
  446. UpdateLinkStatus;
  447. (* register device with Network *)
  448. Network.registry.Add(dev, res);
  449. ASSERT(res = Plugins.Ok);
  450. INC(installed);
  451. IF DebugConfigs IN Debug THEN
  452. DebugConfig;
  453. END;
  454. END InitController;
  455. PROCEDURE hw_mac_mcu_config;
  456. BEGIN
  457. IF hwCfgMethod = CFG_METHOD_17 THEN
  458. HALT(100); (*! Not implemented *)
  459. END;
  460. END hw_mac_mcu_config;
  461. PROCEDURE hw_init;
  462. BEGIN
  463. CASE hwCfgMethod OF
  464. |CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  465. Write8(Cfg9346, Cfg9346_Unlock);
  466. Write8(Config5, Read8(Config5) - {0});
  467. Write8(Config2, Read8(Config2) - {7});
  468. Write8(Cfg9346, Cfg9346_Lock);
  469. Write8(0xF1, Read8(0xF1) - {7});
  470. ELSE
  471. END;
  472. IF hwCfgMethod = CFG_METHOD_17 THEN
  473. Write8(Cfg9346, Cfg9346_Unlock);
  474. Write8(Config5, Read8(Config5) - {0});
  475. Write8(Config2, Read8(Config2) - {7});
  476. Write8(Cfg9346, Cfg9346_Lock);
  477. Write8(0xF1, Read8(0xF1) - {7});
  478. END;
  479. IF hwCfgMethod = CFG_METHOD_10 THEN
  480. Write8(0xF3, Read8(0xF3) + {2});
  481. END;
  482. hw_mac_mcu_config;
  483. (*disable ocp phy power saving*)
  484. IF hwCfgMethod = CFG_METHOD_17 THEN
  485. mdio_write1(0x1F, 0x0C41);
  486. mdio_write1(0x13, 0x0000);
  487. mdio_write1(0x13, 0x0500);
  488. mdio_write1(0x1F, 0x0000);
  489. END;
  490. END hw_init;
  491. PROCEDURE irq_mask_and_ack;
  492. BEGIN
  493. Write16(IntrMask, {});
  494. Write16(IntrStatus, Read16(IntrStatus));
  495. END irq_mask_and_ack;
  496. PROCEDURE hw_reset;
  497. BEGIN
  498. (* Disable interrupts *)
  499. irq_mask_and_ack;
  500. nic_reset;
  501. END hw_reset;
  502. PROCEDURE get_mac_address;
  503. VAR
  504. i: LONGINT;
  505. s: SET;
  506. BEGIN
  507. (* MAC address is in registers 00H - 05H *)
  508. IF DebugMAC IN Debug THEN
  509. KernelLog.String("MAC address is: ");
  510. END;
  511. FOR i := 0 TO 5 DO
  512. s := Read8(i);
  513. S.PUT8(ADDRESSOF(dev.local[i]), s);
  514. IF DebugMAC IN Debug THEN
  515. IF i > 0 THEN
  516. KernelLog.String("-");
  517. END;
  518. KernelLog.Hex(ORD(dev.local[i]), -2);
  519. END;
  520. END;
  521. IF DebugMAC IN Debug THEN
  522. KernelLog.Ln;
  523. END;
  524. dev.adrSize := 6;
  525. END get_mac_address;
  526. PROCEDURE init_one;
  527. BEGIN
  528. cp_cmd := cp_cmd + Read16(CPlusCmd);
  529. init_software_variable;
  530. exit_oob;
  531. hw_init;
  532. hw_reset;
  533. get_mac_address;
  534. speed := SPEED_100;
  535. autoneg := TRUE;
  536. duplexFull := TRUE;
  537. END init_one;
  538. PROCEDURE set_rxbufsize;
  539. BEGIN
  540. CASE hwCfgMethod OF
  541. |CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  542. rx_buf_sz := 0x05F3;
  543. ELSE
  544. rx_buf_sz := 0x05EF;
  545. END;
  546. END set_rxbufsize;
  547. PROCEDURE tally_counter_clear;
  548. BEGIN
  549. IF (hwCfgMethod = CFG_METHOD_1) OR (hwCfgMethod = CFG_METHOD_2) OR (hwCfgMethod = CFG_METHOD_3) THEN
  550. RETURN;
  551. END;
  552. (*IF tally_paddr = 0 THEN
  553. RETURN;
  554. END;
  555. Write32(CounterAddrHigh, (u64)tally_paddr >> 32);
  556. Write32(CounterAddrLow, (u64)tally_paddr & (DMA_BIT_MASK(32) | BIT_0));*)
  557. END tally_counter_clear;
  558. PROCEDURE phy_power_up;
  559. VAR csi_tmp: SET;
  560. BEGIN
  561. mdio_write1(0x1f, 0x0000);
  562. CASE hwCfgMethod OF
  563. |CFG_METHOD_17:
  564. csi_tmp := eri_read(0x1AB, 1, ERIAR_ExGMAC);
  565. csi_tmp := csi_tmp + {2..7};
  566. eri_write(0x1AB, 1, csi_tmp, ERIAR_ExGMAC);
  567. ELSE
  568. END;
  569. mdio_write(NetworkMii.BMCR, NetworkMii.BMCR_AutoNegotiationEnable);
  570. END phy_power_up;
  571. PROCEDURE powerup_pll;
  572. BEGIN
  573. CASE hwCfgMethod OF
  574. |CFG_METHOD_6,CFG_METHOD_9:
  575. Write8(PMCH, Read8(PMCH) + {7});
  576. Write8(DBG_reg, Read8(DBG_reg) - {3});
  577. |CFG_METHOD_7,CFG_METHOD_8,CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  578. Write8(PMCH, Read8(PMCH) + {7});
  579. ELSE
  580. END;
  581. phy_power_up;
  582. END powerup_pll;
  583. PROCEDURE ephy_write(regAddr: LONGINT; value: SET);
  584. VAR i: LONGINT;
  585. BEGIN
  586. Write32(EPHYAR,EPHYAR_Write + S.VAL(SET,LSH(S.VAL(LONGINT,S.VAL(SET,regAddr) * EPHYAR_Reg_Mask),EPHYAR_Reg_shift)) + (value * EPHYAR_Data_Mask));
  587. (* Check if the RTL8101 has completed EPHY write *)
  588. i := 0;
  589. WHILE (i < 10) & (Read32(EPHYAR) * EPHYAR_Flag # {}) DO
  590. Delay(1);
  591. INC(i);
  592. END;
  593. ASSERT(i < 10);
  594. Delay(1);
  595. END ephy_write;
  596. PROCEDURE ephy_write1(regAddr: LONGINT; value: LONGINT);
  597. BEGIN
  598. ephy_write(regAddr,S.VAL(SET,value));
  599. END ephy_write1;
  600. PROCEDURE ephy_read(regAddr: LONGINT): SET;
  601. VAR i: LONGINT;
  602. BEGIN
  603. Write32(EPHYAR,EPHYAR_Read + S.VAL(SET,LSH(S.VAL(LONGINT,S.VAL(SET,regAddr) * EPHYAR_Reg_Mask),EPHYAR_Reg_shift)));
  604. (* Check if the RTL8101 has completed EPHY read *)
  605. i := 0;
  606. WHILE (i < 10) & (Read32(EPHYAR) * EPHYAR_Flag = {}) DO
  607. Delay(1);
  608. INC(i);
  609. END;
  610. ASSERT(i < 10);
  611. RETURN Read32(EPHYAR) * EPHYAR_Data_Mask;
  612. END ephy_read;
  613. PROCEDURE hw_ephy_config;
  614. VAR s: SET;
  615. BEGIN
  616. IF hwCfgMethod = CFG_METHOD_4 THEN
  617. ephy_write1(0x03, 0xc2f9);
  618. ELSIF hwCfgMethod = CFG_METHOD_5 THEN
  619. ephy_write1(0x01, 0x6FE5);
  620. ephy_write1(0x03, 0xD7D9);
  621. ELSIF hwCfgMethod = CFG_METHOD_6 THEN
  622. ephy_write1(0x06, 0xAF35);
  623. ELSIF hwCfgMethod = CFG_METHOD_7 THEN
  624. ephy_write1(0x19, 0xEC90);
  625. ephy_write1(0x01, 0x6FE5);
  626. ephy_write1(0x03, 0x05D9);
  627. ephy_write1(0x06, 0xAF35);
  628. ELSIF hwCfgMethod = CFG_METHOD_8 THEN
  629. ephy_write1(0x01, 0x6FE5);
  630. ephy_write1(0x03, 0x05D9);
  631. ephy_write1(0x06, 0xAF35);
  632. ephy_write1(0x19, 0xECFA);
  633. ELSIF hwCfgMethod = CFG_METHOD_9 THEN
  634. ephy_write1(0x01, 0x6FE5);
  635. ephy_write1(0x03, 0x0599);
  636. ephy_write1(0x06, 0xAF25);
  637. ephy_write1(0x07, 0x8E68);
  638. ELSIF hwCfgMethod = CFG_METHOD_10 THEN
  639. s := ephy_read(0x00) - S.VAL(SET,0x0200);
  640. s := s + S.VAL(SET,0x0100);
  641. ephy_write(0x00, s);
  642. s := ephy_read(0x00);
  643. s := s + S.VAL(SET,0x0004);
  644. ephy_write(0x00, s);
  645. s := ephy_read(0x06) - S.VAL(SET,0x0002);
  646. s := s + S.VAL(SET,0x0001);
  647. ephy_write(0x06, s);
  648. s := ephy_read(0x06);
  649. s := s + S.VAL(SET,0x0030);
  650. ephy_write(0x06, s);
  651. s := ephy_read(0x07);
  652. s := s + S.VAL(SET,0x2000);
  653. ephy_write(0x07, s);
  654. s := ephy_read(0x00);
  655. s := s + S.VAL(SET,0x0020);
  656. ephy_write(0x00, s);
  657. s := ephy_read(0x03) - S.VAL(SET,0x5800);
  658. s := s + S.VAL(SET,0x2000);
  659. ephy_write(0x03, s);
  660. s := ephy_read(0x03);
  661. s := s + S.VAL(SET,0x0001);
  662. ephy_write(0x03, s);
  663. s := ephy_read(0x01) - S.VAL(SET,0x0800);
  664. s := s + S.VAL(SET,0x1000);
  665. ephy_write(0x01, s);
  666. s := ephy_read(0x07);
  667. s := s + S.VAL(SET,0x4000);
  668. ephy_write(0x07, s);
  669. s := ephy_read(0x1E);
  670. s := s + S.VAL(SET,0x2000);
  671. ephy_write(0x1E, s);
  672. ephy_write1(0x19, 0xFE6C);
  673. s := ephy_read(0x0A);
  674. s := s + S.VAL(SET,0x0040);
  675. ephy_write(0x0A, s);
  676. ELSIF (hwCfgMethod = CFG_METHOD_11) OR (hwCfgMethod = CFG_METHOD_12) OR (hwCfgMethod = CFG_METHOD_13) THEN
  677. s := ephy_read(0x07);
  678. s := s + S.VAL(SET,0x4000);
  679. ephy_write(0x07, s);
  680. s := ephy_read(0x19);
  681. s := s +S.VAL(SET,0x0200);
  682. ephy_write(0x19, s);
  683. s := ephy_read(0x19);
  684. s := s + S.VAL(SET,0x0020);
  685. ephy_write(0x19, s);
  686. s := ephy_read(0x1E);
  687. s := s + S.VAL(SET,0x2000);
  688. ephy_write(0x1E, s);
  689. s := ephy_read(0x03);
  690. s := s + S.VAL(SET,0x0001);
  691. ephy_write(0x03, s);
  692. s := ephy_read(0x19);
  693. s := s + S.VAL(SET,0x0100);
  694. ephy_write(0x19, s);
  695. s := ephy_read(0x19);
  696. s := s + S.VAL(SET,0x0004);
  697. ephy_write(0x19, s);
  698. s := ephy_read(0x0A);
  699. s := s + S.VAL(SET,0x0020);
  700. ephy_write(0x0A, s);
  701. IF hwCfgMethod = CFG_METHOD_11 THEN
  702. Write8(Config5, Read8(Config5) - {0});
  703. ELSIF (hwCfgMethod = CFG_METHOD_12) OR (hwCfgMethod = CFG_METHOD_13) THEN
  704. s := ephy_read(0x1E);
  705. s := s + S.VAL(SET,0x8000);
  706. ephy_write(0x1E, s);
  707. END;
  708. ELSIF hwCfgMethod = CFG_METHOD_14 THEN
  709. ephy_write1(0x19, 0xff64);
  710. ELSIF hwCfgMethod = CFG_METHOD_17 THEN
  711. s := ephy_read(0x00);
  712. s := s - {3};
  713. ephy_write(0x00, s);
  714. s := ephy_read(0x0C);
  715. s := s - {4..13};
  716. s := s + {11,15};
  717. ephy_write(0x0C, s);
  718. ephy_write1(0x19, 0x7C00);
  719. ephy_write1(0x1E, 0x20EB);
  720. ephy_write1(0x0D, 0x1666);
  721. ephy_write1(0x00, 0x10A3);
  722. ephy_write1(0x06, 0xF050);
  723. END;
  724. END hw_ephy_config;
  725. PROCEDURE desc_addr_fill;
  726. BEGIN
  727. Write32(TxDescStartAddrLow, S.VAL(SET,txDescStartAddr));
  728. Write32(TxDescStartAddrHigh, {});
  729. Write32(RxDescAddrLow, S.VAL(SET,rxDescStartAddr));
  730. Write32(RxDescAddrHigh, {});
  731. END desc_addr_fill;
  732. PROCEDURE disable_rxdvgate;
  733. BEGIN
  734. IF hwCfgMethod = CFG_METHOD_17 THEN
  735. Write8(0xF2, Read8(0xF2) - {3});
  736. Delay(2);
  737. END;
  738. END disable_rxdvgate;
  739. PROCEDURE dsm(dev_state: LONGINT);
  740. BEGIN
  741. CASE dev_state OF
  742. |DSM_MAC_INIT:
  743. IF (hwCfgMethod = CFG_METHOD_4) OR (hwCfgMethod = CFG_METHOD_5) OR (hwCfgMethod = CFG_METHOD_6) THEN
  744. IF Read8(MACDBG) * S.VAL(SET,0x80) # {} THEN
  745. mdio_write1(0x1f, 0x0000);
  746. mdio_write(0x11, mdio_read(0x11) - {12});
  747. Write8(GPIO, Read8(GPIO) + GPIO_en);
  748. ELSE
  749. Write8(GPIO, Read8(GPIO) - GPIO_en);
  750. END;
  751. END;
  752. |DSM_NIC_GOTO_D3,DSM_IF_DOWN:
  753. IF Read8(MACDBG) * S.VAL(SET,0x80) # {} THEN
  754. IF (hwCfgMethod = CFG_METHOD_4) OR (hwCfgMethod = CFG_METHOD_5) THEN
  755. Write8(GPIO, Read8(GPIO) + GPIO_en);
  756. mdio_write(0x11, mdio_read(0x11) + {12});
  757. ELSIF hwCfgMethod = CFG_METHOD_6 THEN
  758. Write8(GPIO, Read8(GPIO) - GPIO_en);
  759. END;
  760. END;
  761. |DSM_NIC_RESUME_D3,DSM_IF_UP:
  762. IF Read8(MACDBG) * S.VAL(SET,0x80) # {} THEN
  763. IF (hwCfgMethod = CFG_METHOD_4) OR (hwCfgMethod = CFG_METHOD_5) THEN
  764. Write8(GPIO, Read8(GPIO) -GPIO_en);
  765. ELSIF hwCfgMethod = CFG_METHOD_6 THEN
  766. Write8(GPIO, Read8(GPIO) + GPIO_en);
  767. END;
  768. END;
  769. ELSE
  770. END;
  771. END dsm;
  772. PROCEDURE hw_set_rx_packet_filter;
  773. VAR
  774. s, rx_mode: SET;
  775. BEGIN
  776. rx_mode := AcceptBroadcast + AcceptMulticast + AcceptMyPhys;
  777. s := Read32(RxConfig) * S.VAL(SET,RxConfigMask[chipsetInd]);
  778. s := s + rx_mode + S.VAL(SET,LSH(Reserved2_data,Reserved2_shift)) + S.VAL(SET,LSH(RX_DMA_BURST,RxCfgDMAShift));
  779. Write32(RxConfig, s);
  780. Write32(MAR0 + 0, S.VAL(SET,0xFFFFFFFF));
  781. Write32(MAR0 + 4, S.VAL(SET,0xFFFFFFFF));
  782. END hw_set_rx_packet_filter;
  783. PROCEDURE hw_start;
  784. VAR
  785. options1, options2, s: SET;
  786. i: LONGINT;
  787. BEGIN
  788. Write32(RxConfig, S.VAL(SET,LSH(RX_DMA_BURST,RxCfgDMAShift)));
  789. hw_reset;
  790. Write8(Cfg9346,Cfg9346_Unlock);
  791. CASE hwCfgMethod OF
  792. |CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  793. Write8(0xF1, Read8(0xF1) - {7});
  794. Write8(Config2, Read8(Config2) - {7});
  795. Write8(Config5, Read8(Config5) - {0});
  796. ELSE
  797. END;
  798. Write8(MTPS, Reserved1_data);
  799. (* Set DMA burst size and Interframe Gap Time *)
  800. Write32(TxConfig, S.VAL(SET,LSH(TX_DMA_BURST,TxDMAShift)) + S.VAL(SET,LSH(InterFrameGap,TxInterFrameGapShift)));
  801. cp_cmd := cp_cmd * S.VAL(SET,0x2063);
  802. Write16(IntrMitigate, {});
  803. (*tally_counter_addr_fill;*)
  804. desc_addr_fill;
  805. IF hwCfgMethod = CFG_METHOD_4 THEN
  806. HALT(100); (*! Not implemented *)
  807. (*set_offset70F(0x17);
  808. set_offset79(0x50);
  809. pci_read_config_byte(pdev, 0x81, &link_control);
  810. IF link_control = {0} THEN
  811. pci_write_config_byte(pdev, 0x81, 0);
  812. Write8(DBG_reg, 0x98);
  813. Write8(Config2, Read8(Config2) | BIT_7);
  814. Write8(Config4, Read8(Config4) | BIT_2);
  815. pci_write_config_byte(pdev, 0x81, 1);
  816. END;
  817. Write8(Config1, 0x0f);
  818. Write8(Config3, Read8(Config3) & ~Beacon_en);*)
  819. ELSIF hwCfgMethod = CFG_METHOD_5 THEN
  820. HALT(100); (*! Not implemented *)
  821. (*pci_read_config_byte(pdev, 0x81, &link_control);
  822. IF link_control = {0} THEN
  823. pci_write_config_byte(pdev, 0x81, 0);
  824. Write8(DBG_reg, 0x98);
  825. Write8(Config2, Read8(Config2) | BIT_7);
  826. Write8(Config4, Read8(Config4) | BIT_2);
  827. pci_write_config_byte(pdev, 0x81, 1);
  828. END;
  829. set_offset79(0x50);
  830. Write8(Config1, 0x0f);
  831. Write8(Config3, Read8(Config3) & ~Beacon_en);*)
  832. ELSIF hwCfgMethod = CFG_METHOD_6 THEN
  833. HALT(100); (*! Not implemented *)
  834. (*pci_read_config_byte(pdev, 0x81, &link_control);
  835. IF link_control = {0} THEN
  836. pci_write_config_byte(pdev, 0x81, 0);
  837. Write8(DBG_reg, 0x98);
  838. Write8(Config2, Read8(Config2) | BIT_7);
  839. Write8(Config4, Read8(Config4) | BIT_2);
  840. pci_write_config_byte(pdev, 0x81, 1);
  841. END;
  842. set_offset79(0x50);
  843. (* Write8(Config1, 0xDF); *)
  844. Write8(0xF4, 0x01);
  845. Write8(Config3, Read8(Config3) & ~Beacon_en);*)
  846. ELSIF hwCfgMethod = CFG_METHOD_7 THEN
  847. HALT(100); (*! Not implemented *)
  848. (*pci_read_config_byte(pdev, 0x81, &link_control);
  849. IF link_control = {0} THEN
  850. pci_write_config_byte(pdev, 0x81, 0);
  851. Write8(DBG_reg, 0x98);
  852. Write8(Config2, Read8(Config2) | BIT_7);
  853. Write8(Config4, Read8(Config4) | BIT_2);
  854. pci_write_config_byte(pdev, 0x81, 1);
  855. END;
  856. set_offset79(0x50);
  857. (* Write8(Config1, (Read8(Config1)&0xC0)|0x1F);*)
  858. Write8(0xF4, 0x01);
  859. Write8(Config3, Read8(Config3) & ~Beacon_en);
  860. Write8(0xF5, Read8(0xF5) | BIT_2);*)
  861. ELSIF hwCfgMethod = CFG_METHOD_8 THEN
  862. HALT(100); (*! Not implemented *)
  863. (*pci_read_config_byte(pdev, 0x81, &link_control);
  864. IF link_control = {0} THEN
  865. pci_write_config_byte(pdev, 0x81, 0);
  866. Write8(DBG_reg, 0x98);
  867. Write8(Config2, Read8(Config2) | BIT_7);
  868. Write8(Config4, Read8(Config4) | BIT_2);
  869. Write8(0xF4, Read8(0xF4) | BIT_3);
  870. Write8(0xF5, Read8(0xF5) | BIT_2);
  871. pci_write_config_byte(pdev, 0x81, 1);
  872. IF ephy_read(0x10) = S.VAL(SET,0x0008) THEN
  873. ephy_write1(0x10, 0x000C);
  874. END;
  875. END;
  876. pci_read_config_byte(pdev, 0x80, &link_control);
  877. IF link_control * S.VAL(SET,3) # {} THEN
  878. ephy_write(0x02, 0x011F);
  879. END;
  880. set_offset79(0x50);
  881. (* Write8(Config1, (Read8(Config1)&0xC0)|0x1F); *)
  882. Write8(0xF4, Read8(0xF4) | BIT_0);
  883. Write8(Config3, Read8(Config3) & ~Beacon_en);*)
  884. ELSIF hwCfgMethod = CFG_METHOD_9 THEN
  885. HALT(100); (*! Not implemented *)
  886. (*pci_read_config_byte(pdev, 0x81, &link_control);
  887. IF link_control = {0} THEN
  888. pci_write_config_byte(pdev, 0x81, 0);
  889. Write8(DBG_reg, 0x98);
  890. Write8(Config2, Read8(Config2) | BIT_7);
  891. Write8(Config4, Read8(Config4) | BIT_2);
  892. pci_write_config_byte(pdev, 0x81, 1);
  893. END;
  894. set_offset79(0x50);
  895. (* Write8(Config1, 0xDF);*)
  896. Write8(0xF4, 0x01);
  897. Write8(Config3, Read8(Config3) & ~Beacon_en);*)
  898. ELSIF hwCfgMethod = CFG_METHOD_10 THEN
  899. HALT(100); (*! Not implemented *)
  900. (*set_offset70F(0x27);
  901. set_offset79(0x50);
  902. (* tx checksum offload enable *)
  903. dev->features |= NETIF_F_IP_CSUM;
  904. Write8(0xF3, Read8(0xF3) | BIT_5);
  905. Write8(0xF3, Read8(0xF3) & ~BIT_5);
  906. Write8(0xD0, Read8(0xD0) | BIT_7 | BIT_6);
  907. Write8(0xF1, Read8(0xF1) | BIT_6 | BIT_5 | BIT_4 | BIT_2 | BIT_1);
  908. IF ASPM THEN
  909. Write8(0xF1, Read8(0xF1) | BIT_7);
  910. END;
  911. Write8(Config5, (Read8(Config5)&~0x08) | BIT_0);
  912. Write8(Config2, Read8(Config2) | BIT_7);
  913. Write8(Config3, Read8(Config3) & ~Beacon_en);*)
  914. ELSIF (hwCfgMethod = CFG_METHOD_11) OR (hwCfgMethod = CFG_METHOD_12) OR (hwCfgMethod = CFG_METHOD_13) THEN
  915. cp_cmd := cp_cmd * S.VAL(SET,0x2063);
  916. i := PCI.ReadConfigByte(pciBus,pciDev,pciFct,0x80,S.VAL(LONGINT,s)); ASSERT(i = PCI.Done);
  917. TRACE(pciBus,pciDev,pciFct,S.VAL(ADDRESS,s));
  918. IF s * S.VAL(SET,0x03) # {} THEN
  919. Write8(Config5, Read8(Config5) + {0});
  920. Write8(0xF2, Read8(0xF2) + {7});
  921. IF ASPM THEN
  922. Write8(0xF1, Read8(0xF1) + {7});
  923. END;
  924. Write8(Config2, Read8(Config2) + {7});
  925. END;
  926. Write8(0xF1, Read8(0xF1) + {3,5});
  927. Write8(0xF2, Read8(0xF2) - {0});
  928. Write8(0xD3, Read8(0xD3) + {2,3});
  929. Write8(0xD0, Read8(0xD0) + {6});
  930. Write16(0xE0, Read16(0xE0) - S.VAL(SET,0xDF9C));
  931. IF hwCfgMethod = CFG_METHOD_11 THEN
  932. Write8(Config5, Read8(Config5) - {0});
  933. END;
  934. ELSIF hwCfgMethod = CFG_METHOD_14 THEN
  935. HALT(100); (*! Not implemented *)
  936. (*set_offset70F(0x27);
  937. set_offset79(0x50);
  938. eri_write(0xC8, 4, 0x00000002, ERIAR_ExGMAC);
  939. eri_write(0xE8, 4, 0x00000006, ERIAR_ExGMAC);
  940. Write32(TxConfig, RTL_R32(TxConfig) | BIT_7);
  941. Write8(0xD3, Read8(0xD3) & ~BIT_7);
  942. csi_tmp = rtl8101_eri_read(ioaddr, 0xDC, 1, ERIAR_ExGMAC);
  943. csi_tmp &= ~BIT_0;
  944. eri_write(0xDC, 1, csi_tmp, ERIAR_ExGMAC);
  945. csi_tmp |= BIT_0;
  946. eri_write(0xDC, 1, csi_tmp, ERIAR_ExGMAC);
  947. ephy_write(0x19, 0xff64);
  948. Write8(Config5, Read8(Config5) | BIT_0);
  949. Write8(Config2, Read8(Config2) | BIT_7);
  950. eri_write(0xC0, 2, 0x00000000, ERIAR_ExGMAC);
  951. eri_write(0xB8, 2, 0x00000000, ERIAR_ExGMAC);
  952. eri_write(0xD5, 1, 0x0000000E, ERIAR_ExGMAC);*)
  953. ELSIF (hwCfgMethod = CFG_METHOD_15) OR (hwCfgMethod = CFG_METHOD_16) THEN
  954. HALT(100); (*! Not implemented *)
  955. (*u8 pci_config;
  956. tp->cp_cmd &= 0x2063;
  957. (* tx checksum offload enable *)
  958. dev->features |= NETIF_F_IP_CSUM;
  959. pci_read_config_byte(pdev, 0x80, &pci_config);
  960. IF pci_config * S.VAL(SET,0x03) THEN
  961. Write8(Config5, Read8(Config5) | BIT_0);
  962. Write8(0xF2, Read8(0xF2) | BIT_7);
  963. IF ASPM THEN
  964. Write8(0xF1, Read8(0xF1) | BIT_7);
  965. END;
  966. Write8(Config2, Read8(Config2) | BIT_7);
  967. END;
  968. Write8(0xF1, Read8(0xF1) | BIT_5 | BIT_3);
  969. Write8(0xF2, Read8(0xF2) & ~BIT_0);
  970. Write8(0xD3, Read8(0xD3) | BIT_3 | BIT_2);
  971. Write8(0xD0, Read8(0xD0) & ~BIT_6);
  972. Write16(0xE0, RTL_R16(0xE0) & ~0xDF9C);*)
  973. ELSIF hwCfgMethod = CFG_METHOD_17 THEN
  974. HALT(100); (*! Not implemented *)
  975. (*set_offset70F(0x17);
  976. set_offset79(0x50);
  977. eri_write(0xC8, 4, 0x00080002, ERIAR_ExGMAC);
  978. eri_write(0xCC, 1, 0x38, ERIAR_ExGMAC);
  979. eri_write(0xD0, 1, 0x48, ERIAR_ExGMAC);
  980. eri_write(0xE8, 4, 0x00100006, ERIAR_ExGMAC);
  981. Write32(TxConfig, RTL_R32(TxConfig) | BIT_7);
  982. csi_tmp = rtl8101_eri_read(ioaddr, 0xDC, 1, ERIAR_ExGMAC);
  983. csi_tmp &= ~BIT_0;
  984. eri_write(ioaddr, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
  985. csi_tmp |= BIT_0;
  986. eri_write(ioaddr, 0xDC, 1, csi_tmp, ERIAR_ExGMAC);
  987. Write8(Config3, Read8(Config3) & ~Beacon_en);
  988. tp->cp_cmd = RTL_R16(CPlusCmd) &
  989. ~(EnableBist | Macdbgo_oe | Force_halfdup |
  990. Force_rxflow_en | Force_txflow_en |
  991. Cxpl_dbg_sel | ASF | PktCntrDisable |
  992. Macdbgo_sel);
  993. Write8(0x1B, Read8(0x1B) & ~0x07);
  994. Write8(TDFNR, 0x4);
  995. IF ASPM THEN
  996. Write8(0xF1, Read8(0xF1) | BIT_7);
  997. END;
  998. (* tx checksum offload enable *)
  999. dev->features |= NETIF_F_IP_CSUM;
  1000. Write8(0xD0, Read8(0xD0) | BIT_6);
  1001. Write8(0xF2, Read8(0xF2) | BIT_6);
  1002. Write8(0xD0, Read8(0xD0) | BIT_7);
  1003. eri_write(0xC0, 2, 0x0000, ERIAR_ExGMAC);
  1004. eri_write(0xB8, 4, 0x00000000, ERIAR_ExGMAC);
  1005. eri_write(0x5F0, 2, 0x4F87, ERIAR_ExGMAC);
  1006. csi_tmp = rtl8101_eri_read(ioaddr, 0xD4, 4, ERIAR_ExGMAC);
  1007. csi_tmp |= ( BIT_7 | BIT_8 | BIT_9 | BIT_10 | BIT_11 | BIT_12 );
  1008. eri_write(ioaddr, 0xD4, 4, csi_tmp, ERIAR_ExGMAC);
  1009. mac_ocp_write(0xC140, 0xFFFF);
  1010. csi_tmp = rtl8101_eri_read(ioaddr, 0x1B0, 4, ERIAR_ExGMAC);
  1011. csi_tmp &= ~BIT_12;
  1012. eri_write(ioaddr, 0x1B0, 4, csi_tmp, ERIAR_ExGMAC);
  1013. csi_tmp = rtl8101_eri_read(ioaddr, 0x2FC, 1, ERIAR_ExGMAC);
  1014. csi_tmp &= ~(BIT_0 | BIT_1 | BIT_2);
  1015. csi_tmp |= BIT_0;
  1016. eri_write(ioaddr, 0x2FC, 1, csi_tmp, ERIAR_ExGMAC);
  1017. csi_tmp = rtl8101_eri_read(ioaddr, 0x1D0, 1, ERIAR_ExGMAC);
  1018. csi_tmp |= BIT_1;
  1019. eri_write(ioaddr, 0x1D0, 1, csi_tmp, ERIAR_ExGMAC);*)
  1020. END;
  1021. (*IF (hwCfgMethod = CFG_METHOD_1) OR (hwCfgMethod = CFG_METHOD_2) OR (hwCfgMethod = CFG_METHOD_3) THEN
  1022. (* csum offload command for RTL8101E *)
  1023. tx_tcp_csum_cmd = TxIPCS | TxTCPCS;
  1024. tx_udp_csum_cmd = TxIPCS | TxUDPCS;
  1025. tx_ip_csum_cmd = TxIPCS;
  1026. ELSE
  1027. (* csum offload command for RTL8102E *)
  1028. tx_tcp_csum_cmd = TxIPCS_C | TxTCPCS_C;
  1029. tx_udp_csum_cmd = TxIPCS_C | TxUDPCS_C;
  1030. tx_ip_csum_cmd = TxIPCS_C;
  1031. END;*)
  1032. (* other hw parameters*)
  1033. IF hwCfgMethod = CFG_METHOD_17 THEN
  1034. eri_write(0x2F8, 2, S.VAL(SET,0x1D8F), ERIAR_ExGMAC);
  1035. END;
  1036. IF 28 IN bios_setting THEN
  1037. IF hwCfgMethod = CFG_METHOD_13 THEN
  1038. IF 2 IN Read8(0xEF) THEN
  1039. mdio_write1(0x1F, 0x0001);
  1040. s := mdio_read(0x1B);
  1041. s := s + {2};
  1042. mdio_write(0x1B, s);
  1043. mdio_write1(0x1F, 0x0000);
  1044. END;
  1045. END;
  1046. IF hwCfgMethod = CFG_METHOD_14 THEN
  1047. mdio_write1(0x1F, 0x0001);
  1048. s := mdio_read(0x13);
  1049. s := s + {15};
  1050. mdio_write(0x13, s);
  1051. mdio_write1(0x1F, 0x0000);
  1052. END;
  1053. END;
  1054. IF hwCfgMethod = CFG_METHOD_17 THEN
  1055. HALT(100); (*! Not implemented *)
  1056. (*IF ASPM THEN
  1057. init_pci_offset_99(tp);
  1058. init_pci_offset_180(tp);
  1059. END;*)
  1060. END;
  1061. cp_cmd := cp_cmd + RxChkSum;
  1062. TRACE(cp_cmd);
  1063. Write16(CPlusCmd, cp_cmd); (*! ??? *)
  1064. cp_cmd := Read16(CPlusCmd);
  1065. TRACE(cp_cmd);
  1066. IF hwCfgMethod = CFG_METHOD_17 THEN
  1067. i := 0;
  1068. WHILE (i < 10) & (13 IN eri_read(0x1AE, 2, ERIAR_ExGMAC)) DO
  1069. INC(i);
  1070. END;
  1071. ASSERT(i < 10);
  1072. END;
  1073. Write16(RxMaxSize, S.VAL(SET,rx_buf_sz));
  1074. disable_rxdvgate;
  1075. dsm(DSM_MAC_INIT);
  1076. options1 := Read8(Config3);
  1077. options2 := Read8(Config5);
  1078. IF (options1 * (LinkUp + MagicPacket) # {}) OR (options2 * (UWF + BWF + MWF) # {}) THEN
  1079. wol_enabled := TRUE;
  1080. ELSE
  1081. wol_enabled := FALSE;
  1082. END;
  1083. hw_set_rx_packet_filter;
  1084. CASE hwCfgMethod OF
  1085. |CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  1086. IF ASPM THEN
  1087. Write8(Config5, Read8(Config5) + {0});
  1088. Write8(Config2, Read8(Config2) + {7});
  1089. ELSE
  1090. Write8(Config2, Read8(Config2) - {7});
  1091. Write8(Config5, Read8(Config5) - {0});
  1092. END;
  1093. ELSE
  1094. END;
  1095. Write8(Cfg9346, Cfg9346_Lock);
  1096. (*IF ~in_open_fun THEN
  1097. Write8(ChipCmd, CmdTxEnb + CmdRxEnb);
  1098. (* Enable all known interrupts by setting the interrupt mask. *)
  1099. Write16(IntrMask, intr_mask);
  1100. END;*)
  1101. Delay(1);
  1102. END hw_start;
  1103. PROCEDURE open;
  1104. BEGIN
  1105. set_rxbufsize;
  1106. (* prepare TX/RX descriptor rings *)
  1107. txDescStartAddr := SetupTxRing();
  1108. rxDescStartAddr := SetupRxRing();
  1109. exit_oob;
  1110. tally_counter_clear;
  1111. hw_init;
  1112. hw_reset;
  1113. powerup_pll;
  1114. hw_ephy_config;
  1115. hw_phy_config;
  1116. hw_start;
  1117. dsm(DSM_IF_UP);
  1118. (*set_speed_xmii(autoneg, speed, duplexFull);*)
  1119. END open;
  1120. PROCEDURE get_hw_wol;
  1121. BEGIN
  1122. (*! Not implemented *)
  1123. END get_hw_wol;
  1124. PROCEDURE init_software_variable;
  1125. BEGIN
  1126. get_bios_setting;
  1127. CASE hwCfgMethod OF
  1128. |CFG_METHOD_1,CFG_METHOD_2,CFG_METHOD_3:
  1129. intr_mask := {RxDescUnavail} + {TxDescUnavail} + {TxOK} + {RxOK} + {SWInt};
  1130. ELSE
  1131. intr_mask := {RxDescUnavail} + {LinkChg} + {TxOK} + {RxOK} + {SWInt};
  1132. END;
  1133. IF ASPM THEN
  1134. HALT(100); (*! Not implemented *)
  1135. (*IF hwCfgMethod = CFG_METHOD_17 THEN
  1136. org_pci_offset_99 := csi_fun0_read_byte(0x99);
  1137. org_pci_offset_180 := csi_fun0_read_byte(0x180);
  1138. END;*)
  1139. END;
  1140. IF hwCfgMethod = CFG_METHOD_17 THEN
  1141. HALT(100); (*! Not implemented *)
  1142. (*read_config_byte(pdev, 0x80, &tp->org_pci_offset_80);
  1143. read_config_byte(pdev, 0x81, &tp->org_pci_offset_81);
  1144. IF (features * RTL_FEATURE_MSI # {}) & (1 IN org_pci_offset_80)) THEN
  1145. use_timer_interrrupt := FALSE;
  1146. ELSE
  1147. use_timer_interrrupt := TRUE;
  1148. END;*)
  1149. ELSE
  1150. use_timer_interrrupt := TRUE;
  1151. END;
  1152. IF hwIcVerUnknown THEN
  1153. notWrRamCodeToMicroP := TRUE;
  1154. notWrMcuPatchCode := TRUE;
  1155. END;
  1156. get_hw_wol;
  1157. END init_software_variable;
  1158. PROCEDURE exit_oob;
  1159. BEGIN
  1160. nic_reset;
  1161. IF hwCfgMethod = CFG_METHOD_17 THEN
  1162. HALT(100); (*! Not implemented *)
  1163. END;
  1164. END exit_oob;
  1165. PROCEDURE get_bios_setting;
  1166. BEGIN
  1167. bios_setting := {};
  1168. CASE hwCfgMethod OF
  1169. |CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  1170. bios_setting := Read32(0x8c);
  1171. ELSE
  1172. END;
  1173. END get_bios_setting;
  1174. PROCEDURE set_bios_setting;
  1175. BEGIN
  1176. CASE hwCfgMethod OF
  1177. |CFG_METHOD_10,CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13,CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16,CFG_METHOD_17:
  1178. Write32(0x8c,bios_setting);
  1179. ELSE
  1180. END;
  1181. END set_bios_setting;
  1182. PROCEDURE mdio_wait_for(
  1183. regAddr: LONGINT;
  1184. nRetries: LONGINT;
  1185. delay: LONGINT;
  1186. mask: SET;
  1187. val: SET
  1188. );
  1189. BEGIN
  1190. WHILE (nRetries > 0) & (Read32(regAddr) * mask # val) DO
  1191. Delay(delay);
  1192. DEC(nRetries);
  1193. END;
  1194. ASSERT(nRetries > 0);
  1195. END mdio_wait_for;
  1196. (* Writing to MDIO of the PHY *)
  1197. PROCEDURE mdio_write(regAddr: LONGINT; data: SET);
  1198. VAR
  1199. d: LONGINT;
  1200. BEGIN
  1201. IF hwCfgMethod # CFG_METHOD_17 THEN
  1202. d := LSH(S.VAL(LONGINT,(S.VAL(SET,regAddr)*PHYAR_Reg_Mask)),PHYAR_Reg_shift);
  1203. Write32(PHYAR,PHYAR_Write + S.VAL(SET,d) + (data*PHYAR_Data_Mask));
  1204. (* Check if the RTL8101 has completed writing to the specified MII register *)
  1205. mdio_wait_for(PHYAR,10,1,PHYAR_Flag,{});
  1206. Delay(1);
  1207. ELSE
  1208. HALT(100); (*! not implemented *)
  1209. END;
  1210. END mdio_write;
  1211. PROCEDURE mdio_write1(regAddr: LONGINT; data: LONGINT);
  1212. BEGIN
  1213. mdio_write(regAddr,S.VAL(SET,data));
  1214. END mdio_write1;
  1215. (* Reading from MDIO of the PHY *)
  1216. PROCEDURE mdio_read(regAddr: LONGINT): SET;
  1217. VAR
  1218. d, i: LONGINT;
  1219. BEGIN
  1220. IF hwCfgMethod # CFG_METHOD_17 THEN
  1221. d := LSH(S.VAL(LONGINT,S.VAL(SET,regAddr)*PHYAR_Reg_Mask),PHYAR_Reg_shift);
  1222. Write32(PHYAR,PHYAR_Read + S.VAL(SET,d));
  1223. (* Check if the RTL8101 has completed retrieving data from the specified MII register *)
  1224. i := 0;
  1225. WHILE (i < 10) & (Read32(PHYAR) * PHYAR_Flag = {}) DO
  1226. Delay(1);
  1227. INC(i);
  1228. END;
  1229. ASSERT(i < 10);
  1230. Delay(1);
  1231. RETURN Read32(PHYAR) * PHYAR_Data_Mask;
  1232. ELSE
  1233. HALT(100); (*! not implemented *)
  1234. END;
  1235. END mdio_read;
  1236. PROCEDURE phyio_write(regAddr: LONGINT; data: SET);
  1237. VAR d, i: LONGINT;
  1238. BEGIN
  1239. d := LSH(S.VAL(LONGINT,S.VAL(SET,regAddr)*PHYIO_Reg_Mask),PHYIO_Reg_shift);
  1240. Write32(PHYIO,PHYIO_Write + S.VAL(SET,d) + (data * PHYIO_Data_Mask));
  1241. (* Check if the RTL8101 has completed writing to the specified MII register *)
  1242. i := 0;
  1243. WHILE (i < 10) & (Read32(PHYIO) * PHYIO_Flag # {}) DO
  1244. Delay(1);
  1245. INC(i);
  1246. END;
  1247. ASSERT(i < 10);
  1248. Delay(1);
  1249. END phyio_write;
  1250. PROCEDURE xmii_reset_enable;
  1251. VAR i: LONGINT;
  1252. BEGIN
  1253. mdio_write(0x1f,{});
  1254. mdio_write(NetworkMii.BMCR,mdio_read(NetworkMii.BMCR)+NetworkMii.BMCR_Reset);
  1255. i := 0;
  1256. WHILE (i < 2500) & (mdio_read(NetworkMii.BMSR) * NetworkMii.BMCR_Reset # {}) DO
  1257. Delay(1);
  1258. INC(i);
  1259. END;
  1260. ASSERT(i < 2500);
  1261. END xmii_reset_enable;
  1262. PROCEDURE check_hw_phy_mcu_code_ver(): BOOLEAN;
  1263. VAR
  1264. sw_ram_code_ver, hw_ram_code_ver: SET;
  1265. BEGIN
  1266. sw_ram_code_ver := S.VAL(SET,0xFFFF);
  1267. hw_ram_code_ver := {};
  1268. IF hwCfgMethod = CFG_METHOD_17 THEN
  1269. sw_ram_code_ver := {0}; (*NIC_RAMCODE_VERSION_CFG_METHOD_17*)
  1270. mdio_write(0x1F,S.VAL(SET,0x0A43));
  1271. mdio_write(0x13,S.VAL(SET,0x801E));
  1272. hw_ram_code_ver := mdio_read(0x14);
  1273. mdio_write(0x1F,{});
  1274. END;
  1275. IF hw_ram_code_ver = sw_ram_code_ver THEN
  1276. hwHasWrRamCodeToMicroP := TRUE;
  1277. RETURN TRUE;
  1278. ELSE
  1279. RETURN FALSE;
  1280. END;
  1281. END check_hw_phy_mcu_code_ver;
  1282. PROCEDURE write_hw_phy_mcu_code_ver;
  1283. VAR ver: LONGINT;
  1284. BEGIN
  1285. IF hwCfgMethod = CFG_METHOD_17 THEN
  1286. ver := 0x0001;
  1287. mdio_write1(0x1F, 0x0A43);
  1288. mdio_write1(0x13, 0x801E);
  1289. mdio_write1(0x14, ver);
  1290. mdio_write1(0x1F, 0x0000);
  1291. END;
  1292. END write_hw_phy_mcu_code_ver;
  1293. PROCEDURE init_hw_phy_mcu;
  1294. CONST
  1295. Addr_10 = [0x1f,0x1f,0x1e,0x16,0x16,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x16,0x16,0x1f,0x17,0x1f,0x1e,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x19,0x18,0x1f,0x17,0x1f,0x05,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06];
  1296. Val_10 = [0x0000,0x0007,0x0023,0x0306,0x0307,0x000e,0x000a,0x0010,0x0008,0x0018,0x4801,0x0019,0x6801,0x001a,0x66a1,0x001f,0x0000,0x0020,0x0000,0x0021,0x0000,0x0022,0x0000,0x0023,0x0000,0x0024,0x0000,0x0025,0x64a1,0x0026,0x40ea,0x0027,0x4503,0x0028,0x9f00,0x0029,0xa631,0x002a,0x9717,0x002b,0x302c,0x002c,0x4802,0x002d,0x58da,0x002e,0x400d,0x002f,0x4488,0x0030,0x9e00,0x0031,0x63c8,0x0032,0x6481,0x0033,0x0000,0x0034,0x0000,0x0035,0x0000,0x0036,0x0000,0x0037,0x0000,0x0038,0x0000,0x0039,0x0000,0x003a,0x0000,0x003b,0x63e8,0x003c,0x7d00,0x003d,0x59d4,0x003e,0x63f8,0x0040,0x64a1,0x0041,0x30de,0x0044,0x480f,0x0045,0x6800,0x0046,0x6680,0x0047,0x7c10,0x0048,0x63c8,0x0049,0x0000,0x004a,0x0000,0x004b,0x0000,0x004c,0x0000,0x004d,0x0000,0x004e,0x0000,0x004f,0x40ea,0x0050,0x4503,0x0051,0x58ca,0x0052,0x63c8,0x0053,0x63d8,0x0054,0x66a0,0x0055,0x9f00,0x0056,0x3000,0x006e,0x9afa,0x00a1,0x3044,0x00ab,0x5820,0x00ac,0x5e04,0x00ad,0xb60c,0x00af,0x000a,0x00b2,0x30b9,0x00b9,0x4408,0x00ba,0x480b,0x00bb,0x5e00,0x00bc,0x405f,0x00bd,0x4448,0x00be,0x4020,0x00bf,0x4468,0x00c0,0x9c02,0x00c1,0x58a0,0x00c2,0xb605,0x00c3,0xc0d3,0x00c4,0x00e6,0x00c5,0xdaec,0x00c6,0x00fa,0x00c7,0x9df9,0x00c8,0x307a,0x0112,0x6421,0x0113,0x7c08,0x0114,0x63f0,0x0115,0x4003,0x0116,0x4418,0x0117,0x9b00,0x0118,0x6461,0x0119,0x64e1,0x011a,0x0000,0x0150,0x6461,0x0151,0x4003,0x0152,0x4540,0x0153,0x9f00,0x0155,0x6421,0x0156,0x64a1,0x021e,0x5410,0x0225,0x5400,0x023d,0x4050,0x0295,0x6c08,0x02bd,0xa523,0x02be,0x32ca,0x02ca,0x48b3,0x02cb,0x4020,0x02cc,0x4823,0x02cd,0x4510,0x02ce,0xb63a,0x02cf,0x7dc8,0x02d6,0x9bf8,0x02d8,0x85f6,0x02d9,0x32e0,0x02e0,0x4834,0x02e1,0x6c08,0x02e2,0x4020,0x02e3,0x4824,0x02e4,0x4520,0x02e5,0x4008,0x02e6,0x4560,0x02e7,0x9d04,0x02e8,0x48c4,0x02e9,0x0000,0x02ea,0x4844,0x02eb,0x7dc8,0x02f0,0x9cf7,0x02f1,0xdf94,0x02f2,0x0002,0x02f3,0x6810,0x02f4,0xb614,0x02f5,0xc42b,0x02f6,0x00d4,0x02f7,0xc455,0x02f8,0x0093,0x02f9,0x92ee,0x02fa,0xefed,0x02fb,0x3312,0x0312,0x49b5,0x0313,0x7d00,0x0314,0x4d00,0x0315,0x6810,0x031e,0x404f,0x031f,0x44c8,0x0320,0xd64f,0x0321,0x00e7,0x0322,0x7c08,0x0323,0x8203,0x0324,0x4d48,0x0325,0x3327,0x0326,0x4d40,0x0327,0xc8d7,0x0328,0x0003,0x0329,0x7c20,0x032a,0x4c20,0x032b,0xc8ed,0x032c,0x00f4,0x032d,0x82b3,0x032e,0xd11d,0x032f,0x00b1,0x0330,0xde18,0x0331,0x0008,0x0332,0x91ee,0x0333,0x3339,0x033a,0x4064,0x0340,0x9e06,0x0341,0x7c08,0x0342,0x8203,0x0343,0x4d48,0x0344,0x3346,0x0345,0x4d40,0x0346,0xd11d,0x0347,0x0099,0x0348,0xbb17,0x0349,0x8102,0x034a,0x334d,0x034b,0xa22c,0x034c,0x3397,0x034d,0x91f2,0x034e,0xc218,0x034f,0x00f0,0x0350,0x3397,0x0351,0x0000,0x0364,0xbc05,0x0367,0xa1fc,0x0368,0x3377,0x0369,0x328b,0x036a,0x0000,0x0377,0x4b97,0x0378,0x6818,0x0379,0x4b07,0x037a,0x40ac,0x037b,0x4445,0x037c,0x404e,0x037d,0x4461,0x037e,0x9c09,0x037f,0x63da,0x0380,0x5440,0x0381,0x4b98,0x0382,0x7c60,0x0383,0x4c00,0x0384,0x4b08,0x0385,0x63d8,0x0386,0x338d,0x0387,0xd64f,0x0388,0x0080,0x0389,0x820c,0x038a,0xa10b,0x038b,0x9df3,0x038c,0x3395,0x038d,0xd64f,0x038e,0x00f9,0x038f,0xc017,0x0390,0x0005,0x0391,0x6c0b,0x0392,0xa103,0x0393,0x6c08,0x0394,0x9df9,0x0395,0x6c08,0x0396,0x3397,0x0399,0x6810,0x03a4,0x7c08,0x03a5,0x8203,0x03a6,0x4d08,0x03a7,0x33a9,0x03a8,0x4d00,0x03a9,0x9bfa,0x03aa,0x33b6,0x03bb,0x4056,0x03bc,0x44e9,0x03bd,0x4054,0x03be,0x44f8,0x03bf,0xd64f,0x03c0,0x0037,0x03c1,0xbd37,0x03c2,0x9cfd,0x03c3,0xc639,0x03c4,0x0011,0x03c5,0x9b03,0x03c6,0x7c01,0x03c7,0x4c01,0x03c8,0x9e03,0x03c9,0x7c20,0x03ca,0x4c20,0x03cb,0x9af4,0x03cc,0x7c12,0x03cd,0x4c52,0x03ce,0x4470,0x03cf,0x7c12,0x03d0,0x4c40,0x03d1,0x33bf,0x03d6,0x4047,0x03d7,0x4469,0x03d8,0x492b,0x03d9,0x4479,0x03da,0x7c09,0x03db,0x8203,0x03dc,0x4d48,0x03dd,0x33df,0x03de,0x4d40,0x03df,0xd64f,0x03e0,0x0017,0x03e1,0xbd17,0x03e2,0x9b03,0x03e3,0x7c20,0x03e4,0x4c20,0x03e5,0x88f5,0x03e6,0xc428,0x03e7,0x0008,0x03e8,0x9af2,0x03e9,0x7c12,0x03ea,0x4c52,0x03eb,0x4470,0x03ec,0x7c12,0x03ed,0x4c40,0x03ee,0x33da,0x03ef,0x3312,0x0306,0x0300,0x0000,0x2179,0x0007,0x0040,0x0645,0xe200,0x0655,0x9000,0x0d05,0xbe00,0x0d15,0xd300,0x0d25,0xfe00,0x0d35,0x4000,0x0d45,0x7f00,0x0d55,0x1000,0x0d65,0x0000,0x0d75,0x8200,0x0d85,0x0000,0x0d95,0x7000,0x0da5,0x0f00,0x0db5,0x0100,0x0dc5,0x9b00,0x0dd5,0x7f00,0x0de5,0xe000,0x0df5,0xef00,0x16d5,0xe200,0x16e5,0xab00,0x2904,0x4000,0x2914,0x7f00,0x2924,0x0100,0x2934,0x2000,0x2944,0x0000,0x2954,0x4600,0x2964,0xfc00,0x2974,0x0000,0x2984,0x5000,0x2994,0x9d00,0x29a4,0xff00,0x29b4,0x4000,0x29c4,0x7f00,0x29d4,0x0000,0x29e4,0x2000,0x29f4,0x0000,0x2a04,0xe600,0x2a14,0xff00,0x2a24,0x0000,0x2a34,0x5000,0x2a44,0x8500,0x2a54,0x7f00,0x2a64,0xac00,0x2a74,0x0800,0x2a84,0xfc00,0x2a94,0xe000,0x2aa4,0x7400,0x2ab4,0x4000,0x2ac4,0x7f00,0x2ad4,0x0100,0x2ae4,0xff00,0x2af4,0x0000,0x2b04,0x4400,0x2b14,0xfc00,0x2b24,0x0000,0x2b34,0x4000,0x2b44,0x9d00,0x2b54,0xff00,0x2b64,0x4000,0x2b74,0x7f00,0x2b84,0x0000,0x2b94,0xff00,0x2ba4,0x0000,0x2bb4,0xfc00,0x2bc4,0xff00,0x2bd4,0x0000,0x2be4,0x4000,0x2bf4,0x8900,0x2c04,0x8300,0x2c14,0xe000,0x2c24,0x0000,0x2c34,0xac00,0x2c44,0x0800,0x2c54,0xfa00,0x2c64,0xe100,0x2c74,0x7f00,0x0001,0x0000,0x2100,0x0005,0xfff6,0x0080,0x8000,0xd480,0xc1e4,0x8b9a,0xe58b,0x9bee,0x8b83,0x41bf,0x8b88,0xec00,0x19a9,0x8b90,0xf9ee,0xfff6,0x00ee,0xfff7,0xffe0,0xe140,0xe1e1,0x41f7,0x2ff6,0x28e4,0xe140,0xe5e1,0x41f7,0x0002,0x020c,0x0202,0x1d02,0x0230,0x0202,0x4002,0x028b,0x0280,0x6c02,0x8085,0xe08b,0x88e1,0x8b89,0x1e01,0xe18b,0x8a1e,0x01e1,0x8b8b,0x1e01,0xe18b,0x8c1e,0x01e1,0x8b8d,0x1e01,0xe18b,0x8e1e,0x01a0,0x00c7,0xaec3,0xf8e0,0x8b8d,0xad20,0x10ee,0x8b8d,0x0002,0x1310,0x0280,0xc602,0x1f0c,0x0227,0x49fc,0x04f8,0xe08b,0x8ead,0x200b,0xf620,0xe48b,0x8e02,0x852d,0x021b,0x67ad,0x2211,0xf622,0xe48b,0x8e02,0x2ba5,0x022a,0x2402,0x82e5,0x022a,0xf0ad,0x2511,0xf625,0xe48b,0x8e02,0x8445,0x0204,0x0302,0x19cc,0x022b,0x5bfc,0x04ee,0x8b8d,0x0105,0xf8f9,0xfae0,0x8b81,0xac26,0x08e0,0x8b81,0xac21,0x02ae,0x6bee,0xe0ea,0x00ee,0xe0eb,0x00e2,0xe07c,0xe3e0,0x7da5,0x1111,0x15d2,0x60d6,0x6666,0x0207,0x6cd2,0xa0d6,0xaaaa,0x0207,0x6c02,0x201d,0xae44,0xa566,0x6602,0xae38,0xa5aa,0xaa02,0xae32,0xeee0,0xea04,0xeee0,0xeb06,0xe2e0,0x7ce3,0xe07d,0xe0e0,0x38e1,0xe039,0xad2e,0x21ad,0x3f13,0xe0e4,0x14e1,0xe415,0x6880,0xe4e4,0x14e5,0xe415,0x0220,0x1dae,0x0bac,0x3e02,0xae06,0x0281,0x4602,0x2057,0xfefd,0xfc04,0xf8e0,0x8b81,0xad26,0x0302,0x20a7,0xe08b,0x81ad,0x2109,0xe08b,0x2eac,0x2003,0x0281,0x61fc,0x04f8,0xe08b,0x81ac,0x2505,0x0222,0xaeae,0x0302,0x8172,0xfc04,0xf8f9,0xfaef,0x69fa,0xe086,0x20a0,0x8016,0xe086,0x21e1,0x8b33,0x1b10,0x9e06,0x0223,0x91af,0x8252,0xee86,0x2081,0xaee4,0xa081,0x1402,0x2399,0xbf25,0xcc02,0x2d21,0xee86,0x2100,0xee86,0x2082,0xaf82,0x52a0,0x8232,0xe086,0x21e1,0x8b32,0x1b10,0x9e06,0x0223,0x91af,0x8252,0xee86,0x2100,0xd000,0x0282,0x5910,0xa004,0xf9e0,0x861f,0xa000,0x07ee,0x8620,0x83af,0x8178,0x0224,0x0102,0x2399,0xae72,0xa083,0x4b1f,0x55d0,0x04bf,0x8615,0x1a90,0x0c54,0xd91e,0x31b0,0xf4e0,0xe022,0xe1e0,0x23ad,0x2e0c,0xef02,0xef12,0x0e44,0xef23,0x0e54,0xef21,0xe6e4,0x2ae7,0xe42b,0xe2e4,0x28e3,0xe429,0x6d20,0x00e6,0xe428,0xe7e4,0x29bf,0x25ca,0x022d,0x21ee,0x8620,0x84ee,0x8621,0x00af,0x8178,0xa084,0x19e0,0x8621,0xe18b,0x341b,0x109e,0x0602,0x2391,0xaf82,0x5202,0x241f,0xee86,0x2085,0xae08,0xa085,0x02ae,0x0302,0x2442,0xfeef,0x96fe,0xfdfc,0x04f8,0xf9fa,0xef69,0xfad1,0x801f,0x66e2,0xe0ea,0xe3e0,0xeb5a,0xf81e,0x20e6,0xe0ea,0xe5e0,0xebd3,0x05b3,0xfee2,0xe07c,0xe3e0,0x7dad,0x3703,0x7dff,0xff0d,0x581c,0x55f8,0xef46,0x0282,0xc7ef,0x65ef,0x54fc,0xac30,0x2b11,0xa188,0xcabf,0x860e,0xef10,0x0c11,0x1a91,0xda19,0xdbf8,0xef46,0x021e,0x17ef,0x54fc,0xad30,0x0fef,0x5689,0xde19,0xdfe2,0x861f,0xbf86,0x161a,0x90de,0xfeef,0x96fe,0xfdfc,0x04ac,0x2707,0xac37,0x071a,0x54ae,0x11ac,0x3707,0xae00,0x1a54,0xac37,0x07d0,0x01d5,0xffff,0xae02,0xd000,0x04f8,0xe08b,0x83ad,0x2444,0xe0e0,0x22e1,0xe023,0xad22,0x3be0,0x8abe,0xa000,0x0502,0x28de,0xae42,0xa001,0x0502,0x28f1,0xae3a,0xa002,0x0502,0x8344,0xae32,0xa003,0x0502,0x299a,0xae2a,0xa004,0x0502,0x29ae,0xae22,0xa005,0x0502,0x29d7,0xae1a,0xa006,0x0502,0x29fe,0xae12,0xee8a,0xc000,0xee8a,0xc100,0xee8a,0xc600,0xee8a,0xbe00,0xae00,0xfc04,0xf802,0x2a67,0xe0e0,0x22e1,0xe023,0x0d06,0x5803,0xa002,0x02ae,0x2da0,0x0102,0xae2d,0xa000,0x4de0,0xe200,0xe1e2,0x01ad,0x2444,0xe08a,0xc2e4,0x8ac4,0xe08a,0xc3e4,0x8ac5,0xee8a,0xbe03,0xe08b,0x83ad,0x253a,0xee8a,0xbe05,0xae34,0xe08a,0xceae,0x03e0,0x8acf,0xe18a,0xc249,0x05e5,0x8ac4,0xe18a,0xc349,0x05e5,0x8ac5,0xee8a,0xbe05,0x022a,0xb6ac,0x2012,0x0283,0xbaac,0x200c,0xee8a,0xc100,0xee8a,0xc600,0xee8a,0xbe02,0xfc04,0xd000,0x0283,0xcc59,0x0f39,0x02aa,0x04d0,0x01ae,0x02d0,0x0004,0xf9fa,0xe2e2,0xd2e3,0xe2d3,0xf95a,0xf7e6,0xe2d2,0xe7e2,0xd3e2,0xe02c,0xe3e0,0x2df9,0x5be0,0x1e30,0xe6e0,0x2ce7,0xe02d,0xe2e2,0xcce3,0xe2cd,0xf95a,0x0f6a,0x50e6,0xe2cc,0xe7e2,0xcde0,0xe03c,0xe1e0,0x3def,0x64fd,0xe0e2,0xcce1,0xe2cd,0x580f,0x5af0,0x1e02,0xe4e2,0xcce5,0xe2cd,0xfde0,0xe02c,0xe1e0,0x2d59,0xe05b,0x1f1e,0x13e4,0xe02c,0xe5e0,0x2dfd,0xe0e2,0xd2e1,0xe2d3,0x58f7,0x5a08,0x1e02,0xe4e2,0xd2e5,0xe2d3,0xef46,0xfefd,0x04f8,0xf9fa,0xef69,0xe0e0,0x22e1,0xe023,0x58c4,0xe18b,0x6e1f,0x109e,0x58e4,0x8b6e,0xad22,0x22ac,0x2755,0xac26,0x02ae,0x1ad1,0x06bf,0x3bba,0x022d,0xc1d1,0x07bf,0x3bbd,0x022d,0xc1d1,0x07bf,0x3bc0,0x022d,0xc1ae,0x30d1,0x03bf,0x3bc3,0x022d,0xc1d1,0x00bf,0x3bc6,0x022d,0xc1d1,0x00bf,0x84e9,0x022d,0xc1d1,0x0fbf,0x3bba,0x022d,0xc1d1,0x01bf,0x3bbd,0x022d,0xc1d1,0x01bf,0x3bc0,0x022d,0xc1ef,0x96fe,0xfdfc,0x04d1,0x00bf,0x3bc3,0x022d,0xc1d0,0x1102,0x2bfb,0x5903,0xef01,0xd100,0xa000,0x02d1,0x01bf,0x3bc6,0x022d,0xc1d1,0x11ad,0x2002,0x0c11,0xad21,0x020c,0x12bf,0x84e9,0x022d,0xc1ae,0xc870,0xe426,0x0284,0xf005,0xf8fa,0xef69,0xe0e2,0xfee1,0xe2ff,0xad2d,0x1ae0,0xe14e,0xe1e1,0x4fac,0x2d22,0xf603,0x0203,0x3bf7,0x03f7,0x06bf,0x8561,0x022d,0x21ae,0x11e0,0xe14e,0xe1e1,0x4fad,0x2d08,0xbf85,0x6c02,0x2d21,0xf606,0xef96,0xfefc,0x04f8,0xfaef,0x69e0,0xe000,0xe1e0,0x01ad,0x271f,0xd101,0xbf85,0x5e02,0x2dc1,0xe0e0,0x20e1,0xe021,0xad20,0x0ed1,0x00bf,0x855e,0x022d,0xc1bf,0x3b96,0x022d,0x21ef,0x96fe,0xfc04,0x00e2,0x34a7,0x25e5,0x0a1d,0xe50a,0x2ce5,0x0a6d,0xe50a,0x1de5,0x0a1c,0xe50a,0x2da7,0x5500,0x8b94,0x84ec];
  1297. Addr_11_12_13 = [0x1f,0x1f,0x19,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1f,0x1c,0x19,0x1f];
  1298. Val_11_12_13 = [0x0004,0x0004,0x7070,0x0600,0x9700,0x7d00,0x6900,0x7d00,0x6800,0x4899,0x7c1f,0x4c00,0x7c1f,0x4c01,0x8000,0x7fe0,0x4c00,0x4007,0x4400,0x4800,0x7c1f,0x4c00,0x5310,0x6000,0x6800,0x6736,0x0000,0x0000,0x571f,0x5ffb,0xaa03,0x5b58,0x301e,0x5b64,0xa6fc,0xdcdb,0x0014,0xd9a9,0x0013,0xd16b,0x0011,0xb40e,0xd06b,0x000c,0xb206,0x7c01,0x5800,0x7c04,0x5c00,0x301a,0x7c01,0x5801,0x7c04,0x5c04,0x301e,0x314d,0x31f0,0x7fe0,0x4c20,0x6004,0x5310,0x4833,0x7c1f,0x4c00,0x7c1f,0x4c08,0x8300,0x6800,0x6600,0x0000,0x0000,0xb90c,0x30d3,0x7fe0,0x4de0,0x7c04,0x6000,0x6800,0x6736,0x0000,0x0000,0x5310,0x300b,0x7fe0,0x4c60,0x6803,0x6520,0x0000,0x0000,0xaf03,0x6015,0x3059,0x6017,0x57e0,0x580c,0x588c,0x7ffc,0x5fa3,0x4827,0x7c1f,0x4c00,0x7c1f,0x4c10,0x8400,0x7c30,0x6020,0x48bf,0x7c1f,0x4c00,0x7c1f,0x4c01,0xad09,0x7c03,0x5c03,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0xad2c,0xd6cf,0x0002,0x80f4,0x7fe0,0x4c80,0x7c20,0x5c20,0x481e,0x7c1f,0x4c00,0x7c1f,0x4c02,0xad0a,0x7c03,0x5c03,0x0000,0x0000,0x0000,0x0000,0x0000,0x4400,0x5310,0x8d02,0x4401,0x81f4,0x3114,0x7fe0,0x4d00,0x4832,0x7c1f,0x4c00,0x7c1f,0x4c10,0x7c08,0x6000,0xa4b7,0xd9b3,0xfffe,0x7fe0,0x4d20,0x7e00,0x6200,0x3045,0x7fe0,0x4d40,0x7c40,0x6000,0x4401,0x5210,0x4833,0x7c08,0x4c00,0x7c08,0x4c08,0x8300,0x5f80,0x55e0,0xc06f,0x0005,0xd9b3,0xfffd,0x7c40,0x6040,0x7fe0,0x4d60,0x57e0,0x4814,0x7c04,0x4c00,0x7c04,0x4c04,0x8200,0x7c03,0x5c03,0x0000,0x0000,0x0000,0x0000,0x0000,0xad02,0x4400,0xc0e9,0x0003,0xadd8,0x30c6,0x3078,0x7fe0,0x4dc0,0x6730,0x0000,0x0000,0xd09d,0x0002,0xb4fe,0x7fe0,0x4d80,0x6802,0x6600,0x0000,0x0000,0x7c08,0x6000,0x486c,0x7c1f,0x4c00,0x7c1f,0x4c01,0x9503,0x7e00,0x6200,0x571f,0x5fbb,0xaa03,0x5b58,0x30e9,0x5b64,0xcdab,0xff5b,0xcd8d,0xff59,0xd96b,0xff57,0xd0a0,0xffdb,0xcba0,0x0003,0x80f0,0x30f6,0x3109,0x7fe0,0x4ce0,0x7d30,0x6530,0x0000,0x0000,0x7ce0,0x5400,0x4832,0x7c1f,0x4c00,0x7c1f,0x4c08,0x7c08,0x6008,0x8300,0xb902,0x30d3,0x308f,0x7fe0,0x4da0,0x57a0,0x590c,0x5fa2,0xcba4,0x0005,0xcd8d,0x0003,0x80fc,0x0000,0x7fe0,0x4ca0,0xb603,0x7c10,0x6010,0x7c1f,0x541f,0x7ffc,0x5fb3,0x9403,0x7c03,0x5c03,0xaa05,0x7c80,0x5800,0x5b58,0x3128,0x7c80,0x5800,0x5b64,0x4827,0x7c1f,0x4c00,0x7c1f,0x4c10,0x8400,0x7c10,0x6000,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x7fe0,0x4cc0,0x7d00,0x6400,0x7ffc,0x5fbb,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x7e00,0x6a00,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x7e00,0x6800,0x30f6,0x7fe0,0x4e00,0x4007,0x4400,0x5310,0x6800,0x6736,0x0000,0x0000,0x570f,0x5fff,0xaa03,0x585b,0x315c,0x5867,0x9402,0x6200,0xcda3,0x009d,0xcd85,0x009b,0xd96b,0x0099,0x96e9,0x6800,0x6736,0x7fe0,0x4e20,0x96e4,0x8b04,0x7c08,0x5008,0xab03,0x7c08,0x5000,0x6801,0x6776,0x0000,0x0000,0xdb7c,0xfff0,0x0000,0x7fe1,0x4e40,0x4837,0x4418,0x41c7,0x7fe0,0x4e40,0x7c40,0x5400,0x7c1f,0x4c01,0x7c1f,0x4c01,0x8fc9,0xd2a0,0x004a,0x9203,0xa041,0x3184,0x7fe1,0x4e60,0x489c,0x4628,0x7fe0,0x4e60,0x7e28,0x4628,0x7c40,0x5400,0x7c01,0x5800,0x7c04,0x5c00,0x41e8,0x7c1f,0x4c01,0x7c1f,0x4c01,0x8fb0,0xb241,0xa02a,0x319d,0x7fe0,0x4ea0,0x7c02,0x4402,0x4448,0x4894,0x7c1f,0x4c01,0x7c1f,0x4c03,0x4824,0x7c1f,0x4c07,0x41ef,0x41ff,0x4891,0x7c1f,0x4c07,0x7c1f,0x4c17,0x8400,0x8ef8,0x41c7,0x8f95,0x92d5,0xa10f,0xd480,0x0008,0xd580,0xffb9,0xa202,0x31b8,0x7c04,0x4404,0x31b8,0xd484,0xfff3,0xd484,0xfff1,0x314d,0x7fe0,0x4ee0,0x7c40,0x5400,0x4488,0x41cf,0x314d,0x7fe0,0x4ec0,0x48f3,0x7c1f,0x4c01,0x7c1f,0x4c09,0x4508,0x41c7,0x8f24,0xd218,0x0022,0xd2a4,0xff9f,0x31d9,0x7fe0,0x4e80,0x4832,0x7c1f,0x4c01,0x7c1f,0x4c11,0x4428,0x7c40,0x5440,0x7c01,0x5801,0x7c04,0x5c04,0x41e8,0xa4b3,0x31ee,0x6800,0x6736,0x0000,0x0000,0x570f,0x5fff,0xaa03,0x585b,0x31fa,0x5867,0xbcf6,0x300b,0x300b,0x314d,0x0004,0x0200,0x7030,0x0000];
  1299. Addr_14 = [0x1f,0x1f,0x19,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1f,0x1c,0x19,0x1f];
  1300. Val_14 = [0x0004,0x0004,0x7070,0x0600,0x9700,0x7d00,0x6900,0x7d00,0x6800,0x4899,0x7c1f,0x4c00,0x7c1f,0x4c01,0x8000,0x7fe0,0x4c00,0x4007,0x4400,0x4800,0x7c1f,0x4c00,0x5310,0x6000,0x6800,0x6736,0x0000,0x0000,0x571f,0x5ffb,0xaa03,0x5b58,0x301e,0x5b64,0xa6fc,0xdcdb,0x0015,0xb915,0xb511,0xd16b,0x000f,0xb40f,0xd06b,0x000d,0xb206,0x7c01,0x5800,0x7c04,0x5c00,0x301a,0x7c01,0x5801,0x7c04,0x5c04,0x301e,0x3079,0x30f1,0x3199,0x7fe0,0x4c60,0x6803,0x6420,0x0000,0x0000,0xaf03,0x6015,0x3040,0x6017,0x57e0,0x580c,0x588c,0x5fa3,0x0000,0x4827,0x7c1f,0x4c00,0x7c1f,0x4c10,0x8400,0x7c30,0x6020,0x48bf,0x7c1f,0x4c00,0x7c1f,0x4c01,0xd6cf,0x0002,0x80fe,0x7fe0,0x4c80,0x7c20,0x5c20,0x481e,0x7c1f,0x4c00,0x7c1f,0x4c02,0x5310,0x81ff,0x30ba,0x7fe0,0x4d00,0x4832,0x7c1f,0x4c00,0x7c1f,0x4c10,0x7c08,0x6000,0xa4cc,0xd9b3,0xfffe,0x7fe0,0x4d20,0x7e00,0x6200,0x300b,0x7fe0,0x4dc0,0x0000,0x0000,0xd09d,0x0002,0xb4fe,0x7fe0,0x4d80,0x7c04,0x6004,0x5310,0x6802,0x6720,0x0000,0x0000,0x7c08,0x6000,0x486c,0x7c1f,0x4c00,0x7c1f,0x4c01,0x9503,0x7e00,0x6200,0x571f,0x5fbb,0xaa03,0x5b58,0x3092,0x5b64,0xcdab,0xff78,0xcd8d,0xff76,0xd96b,0xff74,0xd0a0,0xffd9,0xcba0,0x0003,0x80f0,0x309f,0x30ac,0x7fe0,0x4ce0,0x4832,0x7c1f,0x4c00,0x7c1f,0x4c08,0x7c08,0x6008,0x8300,0xb902,0x3079,0x3061,0x7fe0,0x4da0,0x6400,0x0000,0x0000,0x57a0,0x590c,0x5fa3,0x0000,0xcba4,0x0004,0xcd8d,0x0002,0x80fc,0x7fe0,0x4ca0,0xb603,0x7c10,0x6010,0x7c1f,0x541f,0x5fb3,0xaa05,0x7c80,0x5800,0x5b58,0x30ca,0x7c80,0x5800,0x5b64,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x4827,0x7c1f,0x4c00,0x7c1f,0x4c10,0x8400,0x7c10,0x6000,0x7fe0,0x4cc0,0x5fbb,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x7ce0,0x5400,0x6720,0x0000,0x0000,0x7e00,0x6a00,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x7e00,0x6800,0x309f,0x7fe0,0x4e00,0x4007,0x4400,0x5310,0x6800,0x6736,0x0000,0x0000,0x570f,0x5fff,0xaa03,0x585b,0x3100,0x5867,0x9403,0x7e00,0x6200,0xcda3,0x002d,0xcd85,0x002b,0xd96b,0x0029,0x9629,0x6800,0x6736,0x0000,0x0000,0x9624,0x7fe0,0x4e20,0x8b04,0x7c08,0x5008,0xab03,0x7c08,0x5000,0x6801,0x6776,0x0000,0x0000,0xdb7c,0xffee,0x0000,0x7fe1,0x4e40,0x4837,0x4418,0x41c7,0x7fe0,0x4e40,0x7c40,0x5400,0x7c1f,0x4c01,0x7c1f,0x4c01,0x8f07,0xd2a0,0x004c,0x9205,0xa043,0x312b,0x300b,0x30f1,0x7fe1,0x4e60,0x489c,0x4628,0x7fe0,0x4e60,0x7e28,0x4628,0x7c40,0x5400,0x7c01,0x5800,0x7c04,0x5c00,0x41e8,0x7c1f,0x4c01,0x7c1f,0x4c01,0x8fec,0xb241,0xa02a,0x3146,0x7fe0,0x4ea0,0x7c02,0x4402,0x4448,0x4894,0x7c1f,0x4c01,0x7c1f,0x4c03,0x4824,0x7c1f,0x4c07,0x41ef,0x41ff,0x4891,0x7c1f,0x4c07,0x7c1f,0x4c17,0x8400,0x8ef8,0x41c7,0x8fd1,0x92d5,0xa10f,0xd480,0x0008,0xd580,0xffb7,0xa202,0x3161,0x7c04,0x4404,0x3161,0xd484,0xfff3,0xd484,0xfff1,0x30f1,0x7fe0,0x4ee0,0x7c40,0x5400,0x4488,0x41cf,0x30f1,0x7fe0,0x4ec0,0x48f3,0x7c1f,0x4c01,0x7c1f,0x4c09,0x4508,0x41c7,0x8fb0,0xd218,0xffae,0xd2a4,0xff9d,0x3182,0x7fe0,0x4e80,0x4832,0x7c1f,0x4c01,0x7c1f,0x4c11,0x4428,0x7c40,0x5440,0x7c01,0x5801,0x7c04,0x5c04,0x41e8,0xa4b3,0x3197,0x7fe0,0x4f20,0x6800,0x6736,0x0000,0x0000,0x570f,0x5fff,0xaa03,0x585b,0x31a5,0x5867,0xbcf4,0x300b,0x0004,0x0200,0x7030,0x0000];
  1301. Addr_16 = [0x1f,0x1f,0x19,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1f,0x1c,0x19,0x1f];
  1302. Val_16 = [0x0004,0x0004,0x7070,0x0600,0x9700,0x7fe0,0x4c00,0x4007,0x4400,0x4800,0x7c1f,0x4c00,0x5310,0x6000,0x6800,0x673e,0x0000,0x0000,0x571f,0x5ffb,0xaa04,0x5b58,0x6100,0x3016,0x5b64,0x6080,0xa6fa,0xdcdb,0x0015,0xb915,0xb511,0xd16b,0x000f,0xb40f,0xd06b,0x000d,0xb206,0x7c01,0x5800,0x7c04,0x5c00,0x3010,0x7c01,0x5801,0x7c04,0x5c04,0x3016,0x307e,0x30f4,0x319f,0x7fe0,0x4c60,0x6803,0x7d00,0x6900,0x6520,0x0000,0x0000,0xaf03,0x6115,0x303a,0x6097,0x57e0,0x580c,0x588c,0x5f80,0x4827,0x7c1f,0x4c00,0x7c1f,0x4c10,0x8400,0x7c30,0x6020,0x48bf,0x7c1f,0x4c00,0x7c1f,0x4c01,0xb802,0x3053,0x7c08,0x6808,0x0000,0x0000,0x7c10,0x6810,0xd6cf,0x0002,0x80fe,0x7fe0,0x4c80,0x7c10,0x6800,0x7c08,0x6800,0x0000,0x0000,0x7c23,0x5c23,0x481e,0x7c1f,0x4c00,0x7c1f,0x4c02,0x5310,0x81ff,0x30c1,0x7fe0,0x4d00,0x4832,0x7c1f,0x4c00,0x7c1f,0x4c10,0x7c08,0x6000,0xa4bd,0xd9b3,0x00fe,0x7fe0,0x4d20,0x7e00,0x6200,0x3001,0x7fe0,0x4dc0,0xd09d,0x0002,0xb4fe,0x7fe0,0x4d80,0x7c04,0x6004,0x6802,0x6728,0x0000,0x0000,0x7c08,0x6000,0x486c,0x7c1f,0x4c00,0x7c1f,0x4c01,0x9503,0x7e00,0x6200,0x571f,0x5fbb,0xaa05,0x5b58,0x7d80,0x6100,0x309a,0x5b64,0x7d80,0x6080,0xcdab,0x0058,0xcd8d,0x0056,0xd96b,0x0054,0xd0a0,0x00d8,0xcba0,0x0003,0x80ec,0x30a7,0x30b4,0x7fe0,0x4ce0,0x4832,0x7c1f,0x4c00,0x7c1f,0x4c08,0x7c08,0x6008,0x8300,0xb902,0x307e,0x3068,0x7fe0,0x4da0,0x6628,0x0000,0x0000,0x56a0,0x590c,0x5fa0,0xcba4,0x0004,0xcd8d,0x0002,0x80fc,0x7fe0,0x4ca0,0x7c08,0x6408,0x0000,0x0000,0x7d00,0x6800,0xb603,0x7c10,0x6010,0x7d1f,0x551f,0x5fb3,0xaa05,0x7c80,0x5800,0x5b58,0x30d7,0x7c80,0x5800,0x5b64,0x4827,0x7c1f,0x4c00,0x7c1f,0x4c10,0x8400,0x7c10,0x6000,0x7fe0,0x4cc0,0x7d00,0x6400,0x0000,0x0000,0x5fbb,0x4824,0x7c1f,0x4c00,0x7c1f,0x4c04,0x8200,0x7ce0,0x5400,0x7d00,0x6500,0x0000,0x0000,0x30a7,0x3001,0x7fe0,0x4e00,0x4007,0x4400,0x5310,0x6800,0x673e,0x0000,0x0000,0x570f,0x5fff,0xaa05,0x585b,0x7d80,0x6100,0x3107,0x5867,0x7d80,0x6080,0x9403,0x7e00,0x6200,0xcda3,0x00e8,0xcd85,0x00e6,0xd96b,0x00e4,0x96e4,0x6800,0x673e,0x0000,0x0000,0x7fe0,0x4e20,0x96dd,0x8b04,0x7c08,0x5008,0xab03,0x7c08,0x5000,0x6801,0x677e,0x0000,0x0000,0xdb7c,0x00ee,0x0000,0x7fe1,0x4e40,0x4837,0x4418,0x41c7,0x7fe0,0x4e40,0x7c40,0x5400,0x7c1f,0x4c01,0x7c1f,0x4c01,0x8fc2,0xd2a0,0x004b,0x9204,0xa042,0x3132,0x30f4,0x7fe1,0x4e60,0x489c,0x4628,0x7fe0,0x4e60,0x7e28,0x4628,0x7c40,0x5400,0x7c01,0x5800,0x7c04,0x5c00,0x41e8,0x7c1f,0x4c01,0x7c1f,0x4c01,0x8fa8,0xb241,0xa02a,0x314c,0x7fe0,0x4ea0,0x7c02,0x4402,0x4448,0x4894,0x7c1f,0x4c01,0x7c1f,0x4c03,0x4824,0x7c1f,0x4c07,0x41ef,0x41ff,0x4891,0x7c1f,0x4c07,0x7c1f,0x4c17,0x8400,0x8ef8,0x41c7,0x8f8d,0x92d5,0xa10f,0xd480,0x0008,0xd580,0x00b8,0xa202,0x3167,0x7c04,0x4404,0x3167,0xd484,0x00f3,0xd484,0x00f1,0x30f4,0x7fe0,0x4ee0,0x7c40,0x5400,0x4488,0x41cf,0x30f4,0x7fe0,0x4ec0,0x48f3,0x7c1f,0x4c01,0x7c1f,0x4c09,0x4508,0x41c7,0x8fb0,0xd218,0x00ae,0xd2a4,0x009e,0x3188,0x7fe0,0x4e80,0x4832,0x7c1f,0x4c01,0x7c1f,0x4c11,0x4428,0x7c40,0x5440,0x7c01,0x5801,0x7c04,0x5c04,0x41e8,0xa4b3,0x319d,0x7fe0,0x4f20,0x6800,0x673e,0x0000,0x0000,0x570f,0x5fff,0xaa04,0x585b,0x6100,0x31ad,0x5867,0x6080,0xbcf2,0x3001,0x0004,0x0200,0x7030,0x0000];
  1303. VAR
  1304. i: LONGINT;
  1305. s: SET;
  1306. BEGIN
  1307. IF notWrRamCodeToMicroP THEN RETURN; END;
  1308. IF check_hw_phy_mcu_code_ver() THEN RETURN; END;
  1309. IF hwCfgMethod = CFG_METHOD_10 THEN
  1310. mdio_write1(0x1f, 0x0000);
  1311. mdio_write1(0x00, 0x1800);
  1312. mdio_write1(0x1f, 0x0007);
  1313. mdio_write1(0x1e, 0x0023);
  1314. mdio_write1(0x17, 0x0117);
  1315. mdio_write1(0x1f, 0x0007);
  1316. mdio_write1(0x1E, 0x002C);
  1317. mdio_write1(0x1B, 0x5000);
  1318. mdio_write1(0x1f, 0x0000);
  1319. mdio_write1(0x16, 0x4104);
  1320. mdio_wait_for(0x1E,200,1,S.VAL(SET,0x03FF),S.VAL(SET,0x000C));
  1321. mdio_write1(0x1f, 0x0005);
  1322. mdio_wait_for(0x07,200,1,{5},{});
  1323. s := mdio_read(0x07);
  1324. IF 5 IN s THEN
  1325. mdio_write1(0x1f, 0x0007);
  1326. mdio_write1(0x1e, 0x00a1);
  1327. mdio_write1(0x17, 0x1000);
  1328. mdio_write1(0x17, 0x0000);
  1329. mdio_write1(0x17, 0x2000);
  1330. mdio_write1(0x1e, 0x002f);
  1331. mdio_write1(0x18, 0x9bfb);
  1332. mdio_write1(0x1f, 0x0005);
  1333. mdio_write1(0x07, 0x0000);
  1334. mdio_write1(0x1f, 0x0000);
  1335. END;
  1336. mdio_write1(0x1f, 0x0005);
  1337. mdio_write1(0x05, 0xfff6);
  1338. mdio_write1(0x06, 0x0080);
  1339. s := mdio_read(0x00);
  1340. s := s - {7};
  1341. mdio_write(0x00, s);
  1342. mdio_write1(0x1f, 0x0002);
  1343. s := mdio_read(0x08);
  1344. s := s - {7};
  1345. mdio_write(0x08, s);
  1346. FOR i := 0 TO LEN(Addr_10,0)-1 DO
  1347. mdio_write1(Addr_10[i],Val_10[i]);
  1348. END;
  1349. s := mdio_read(0x01);
  1350. s := s + {0};
  1351. mdio_write(0x01, s);
  1352. mdio_write1(0x00, 0x0005);
  1353. mdio_write1(0x1f, 0x0000);
  1354. mdio_write1(0x1f, 0x0005);
  1355. mdio_wait_for(0x00,200,1,{7},{7});
  1356. mdio_write1(0x1f, 0x0007);
  1357. mdio_write1(0x1e, 0x0023);
  1358. mdio_write1(0x17, 0x0116);
  1359. mdio_write1(0x1f, 0x0007);
  1360. mdio_write1(0x1e, 0x0028);
  1361. mdio_write1(0x15, 0x0010);
  1362. mdio_write1(0x1f, 0x0007);
  1363. mdio_write1(0x1e, 0x0020);
  1364. mdio_write1(0x15, 0x0100);
  1365. mdio_write1(0x1f, 0x0007);
  1366. mdio_write1(0x1e, 0x0041);
  1367. mdio_write1(0x15, 0x0802);
  1368. mdio_write1(0x16, 0x2185);
  1369. mdio_write1(0x1f, 0x0000);
  1370. ELSIF (hwCfgMethod = CFG_METHOD_11) OR (hwCfgMethod = CFG_METHOD_12) OR (hwCfgMethod = CFG_METHOD_13) THEN
  1371. mdio_write1(0x1F, 0x0000);
  1372. mdio_write1(0x18, 0x0310);
  1373. mdio_write1(0x1F, 0x0000);
  1374. Delay(20);
  1375. FOR i := 0 TO LEN(Addr_11_12_13,0)-1 DO
  1376. mdio_write1(Addr_11_12_13[i],Val_11_12_13[i]);
  1377. END;
  1378. ELSIF hwCfgMethod = CFG_METHOD_14 THEN
  1379. mdio_write1(0x1F, 0x0000);
  1380. mdio_write1(0x18, 0x0310);
  1381. mdio_write1(0x1F, 0x0000);
  1382. Delay(20);
  1383. FOR i := 0 TO LEN(Addr_14,0)-1 DO
  1384. mdio_write1(Addr_14[i],Val_14[i]);
  1385. END;
  1386. ELSIF hwCfgMethod = CFG_METHOD_16 THEN
  1387. mdio_write1(0x1F, 0x0000);
  1388. mdio_write1(0x18, 0x0310);
  1389. Delay(20);
  1390. FOR i := 0 TO LEN(Addr_16,0)-1 DO
  1391. mdio_write1(Addr_16[i],Val_16[i]);
  1392. END;
  1393. ELSIF hwCfgMethod = CFG_METHOD_17 THEN
  1394. mdio_write1(0x1f, 0x0B82);
  1395. s := mdio_read(0x10);
  1396. s := s + {4};
  1397. mdio_write(0x10, s);
  1398. mdio_write1(0x1f, 0x0B80);
  1399. mdio_wait_for(0x10,1000,1,{6},{6});
  1400. mdio_write1(0x1f, 0x0A43);
  1401. mdio_write1(0x13, 0x8146);
  1402. mdio_write1(0x14, 0x0300);
  1403. mdio_write1(0x13, 0xB82E);
  1404. mdio_write1(0x14, 0x0001);
  1405. mdio_write1(0x1F, 0x0A43);
  1406. mdio_write1(0x13, 0xb820);
  1407. mdio_write1(0x14, 0x0290);
  1408. mdio_write1(0x13, 0xa012);
  1409. mdio_write1(0x14, 0x0000);
  1410. mdio_write1(0x13, 0xa014);
  1411. mdio_write1(0x14, 0x2c04);
  1412. mdio_write1(0x14, 0x2c07);
  1413. mdio_write1(0x14, 0x2c07);
  1414. mdio_write1(0x14, 0x2c07);
  1415. mdio_write1(0x14, 0xa304);
  1416. mdio_write1(0x14, 0xa301);
  1417. mdio_write1(0x14, 0x207e);
  1418. mdio_write1(0x13, 0xa01a);
  1419. mdio_write1(0x14, 0x0000);
  1420. mdio_write1(0x13, 0xa006);
  1421. mdio_write1(0x14, 0x0fff);
  1422. mdio_write1(0x13, 0xa004);
  1423. mdio_write1(0x14, 0x0fff);
  1424. mdio_write1(0x13, 0xa002);
  1425. mdio_write1(0x14, 0x0fff);
  1426. mdio_write1(0x13, 0xa000);
  1427. mdio_write1(0x14, 0x107c);
  1428. mdio_write1(0x13, 0xb820);
  1429. mdio_write1(0x14, 0x0210);
  1430. mdio_write1(0x1F, 0x0A43);
  1431. mdio_write1(0x13, 0x0000);
  1432. mdio_write1(0x14, 0x0000);
  1433. mdio_write1(0x1f, 0x0B82);
  1434. s := mdio_read(0x17);
  1435. s := s - {0};
  1436. mdio_write(0x17, s);
  1437. mdio_write1(0x1f, 0x0A43);
  1438. mdio_write1(0x13, 0x8146);
  1439. mdio_write1(0x14, 0x0000);
  1440. mdio_write1(0x1f, 0x0B82);
  1441. s := mdio_read(0x10);
  1442. s := s - {4};
  1443. mdio_write(0x10, s);
  1444. END;
  1445. write_hw_phy_mcu_code_ver;
  1446. mdio_write1(0x1F, 0x0000);
  1447. hwHasWrRamCodeToMicroP := TRUE;
  1448. END init_hw_phy_mcu;
  1449. PROCEDURE eri_read(addr: LONGINT; len, type: LONGINT): SET;
  1450. VAR
  1451. i, shift, val_shift: LONGINT;
  1452. mask, value1, value2: SET;
  1453. BEGIN
  1454. ASSERT((len > 0) & (len <= 4));
  1455. shift := 0;
  1456. WHILE len > 0 DO
  1457. val_shift := addr MOD ERIAR_Addr_Align;
  1458. addr := S.VAL(LONGINT,S.VAL(SET,addr)-S.VAL(SET,0x3));
  1459. Write32(ERIAR,ERIAR_Read+S.VAL(SET,LSH(type,ERIAR_Type_shift))+S.VAL(SET,LSH(LONGINT(ERIAR_ByteEn),ERIAR_ByteEn_shift))+S.VAL(SET,addr));
  1460. (* Check if the RTL8101 has completed ERI read *)
  1461. i := 0;
  1462. Delay(1);
  1463. WHILE (i < 10) & (Read32(ERIAR) * ERIAR_Flag = {}) DO
  1464. Delay(1);
  1465. INC(i);
  1466. END;
  1467. ASSERT(i < 10);
  1468. IF len = 1 THEN mask := S.VAL(SET,LSH(HUGEINT(0xFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1469. ELSIF len = 2 THEN mask := S.VAL(SET,LSH(HUGEINT(0xFFFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1470. ELSIF len = 3 THEN mask := S.VAL(SET,LSH(HUGEINT(0xFFFFFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1471. ELSE mask := S.VAL(SET,LSH(HUGEINT(0xFFFFFFFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1472. END;
  1473. value1 := Read32(ERIDR) * mask;
  1474. value1 := S.VAL(SET,LSH(S.VAL(HUGEINT,value1),-val_shift*8));
  1475. value1 := S.VAL(SET,LSH(S.VAL(HUGEINT,value1),shift*8));
  1476. value2 := value2 + value1;
  1477. IF len <= 4 - val_shift THEN
  1478. len := 0;
  1479. ELSE
  1480. DEC(len,4 - val_shift);
  1481. shift := 4 - val_shift;
  1482. INC(addr,4);
  1483. END;
  1484. END;
  1485. Delay(1);
  1486. RETURN value2;
  1487. END eri_read;
  1488. PROCEDURE eri_write(addr: LONGINT; len: LONGINT; value: SET; type: LONGINT);
  1489. VAR
  1490. i, shift, val_shift: LONGINT;
  1491. mask, value1, value2: SET;
  1492. BEGIN
  1493. ASSERT((len > 0) & (len <= 4));
  1494. shift := 0;
  1495. WHILE len > 0 DO
  1496. val_shift := addr MOD ERIAR_Addr_Align;
  1497. addr := S.VAL(LONGINT,S.VAL(SET,addr)-S.VAL(SET,0x3));
  1498. IF len = 1 THEN mask := S.VAL(SET,LSH(HUGEINT(0xFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1499. ELSIF len = 2 THEN mask := S.VAL(SET,LSH(HUGEINT(0xFFFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1500. ELSIF len = 3 THEN mask := S.VAL(SET,LSH(HUGEINT(0xFFFFFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1501. ELSE mask := S.VAL(SET,LSH(HUGEINT(0xFFFFFFFF),val_shift * 8)) * S.VAL(SET,0xFFFFFFFF);
  1502. END;
  1503. value1 := S.VAL(SET,LSH(S.VAL(HUGEINT,value),val_shift*8));
  1504. value1 := S.VAL(SET,LSH(S.VAL(HUGEINT,value1),-shift*8));
  1505. value1 := value1 + eri_read(addr,4,type) - mask;
  1506. Write32(ERIDR,value1);
  1507. Write32(ERIAR,ERIAR_Write+S.VAL(SET,LSH(type,ERIAR_Type_shift))+S.VAL(SET,LSH(LONGINT(ERIAR_ByteEn),ERIAR_ByteEn_shift))+S.VAL(SET,addr));
  1508. (* Check if the RTL8101 has completed ERI write *)
  1509. i := 0;
  1510. Delay(1);
  1511. WHILE (i < 10) & (Read32(ERIAR) * ERIAR_Flag # {}) DO
  1512. Delay(1);
  1513. INC(i);
  1514. END;
  1515. ASSERT(i < 10);
  1516. IF len <= 4 - val_shift THEN
  1517. len := 0;
  1518. ELSE
  1519. DEC(len,4 - val_shift);
  1520. shift := 4 - val_shift;
  1521. INC(addr,4);
  1522. END;
  1523. END;
  1524. Delay(1);
  1525. END eri_write;
  1526. PROCEDURE enable_EEE;
  1527. VAR s: SET;
  1528. BEGIN
  1529. CASE hwCfgMethod OF
  1530. |CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13:
  1531. eri_write(0x1B0, 2, S.VAL(SET,0xED03), ERIAR_ExGMAC);
  1532. mdio_write1(0x1F, 0x0004);
  1533. IF Read8(0xEF) * S.VAL(SET,0x02) # {} THEN
  1534. mdio_write1(0x10, 0x731F);
  1535. mdio_write1(0x19, 0x7630);
  1536. ELSE
  1537. mdio_write1(0x10, 0x711F);
  1538. mdio_write1(0x19, 0x7030);
  1539. END;
  1540. mdio_write1(0x1A, 0x1506);
  1541. mdio_write1(0x1B, 0x0551);
  1542. mdio_write1(0x1F, 0x0000);
  1543. mdio_write1(0x0D, 0x0007);
  1544. mdio_write1(0x0E, 0x003C);
  1545. mdio_write1(0x0D, 0x4007);
  1546. mdio_write1(0x0E, 0x0002);
  1547. mdio_write1(0x0D, 0x0000);
  1548. mdio_write1(0x1F, 0x0000);
  1549. mdio_write1(0x0D, 0x0003);
  1550. mdio_write1(0x0E, 0x0015);
  1551. mdio_write1(0x0D, 0x4003);
  1552. mdio_write1(0x0E, 0x0002);
  1553. mdio_write1(0x0D, 0x0000);
  1554. mdio_write(NetworkMii.BMCR, NetworkMii.BMCR_AutoNegotiationEnable+NetworkMii.BMCR_RestartAutoNegotiation);
  1555. |CFG_METHOD_14,CFG_METHOD_15,CFG_METHOD_16:
  1556. eri_write(0x1B0, 2, S.VAL(SET,0xED03),ERIAR_ExGMAC);
  1557. mdio_write1(0x1F, 0x0004);
  1558. mdio_write1(0x10, 0x731F);
  1559. mdio_write1(0x19, 0x7630);
  1560. mdio_write1(0x1A, 0x1506);
  1561. mdio_write1(0x1F, 0x0000);
  1562. mdio_write1(0x0D, 0x0007);
  1563. mdio_write1(0x0E, 0x003C);
  1564. mdio_write1(0x0D, 0x4007);
  1565. mdio_write1(0x0E, 0x0002);
  1566. mdio_write1(0x0D, 0x0000);
  1567. mdio_write(NetworkMii.BMCR, NetworkMii.BMCR_AutoNegotiationEnable + NetworkMii.BMCR_RestartAutoNegotiation);
  1568. |CFG_METHOD_17:
  1569. s := eri_read(0x1B0, 4, ERIAR_ExGMAC);
  1570. s := s +{0,1};
  1571. eri_write(0x1B0, 4, s, ERIAR_ExGMAC);
  1572. mdio_write1(0x1F, 0x0A43);
  1573. s := mdio_read(0x11);
  1574. mdio_write(0x11, s + {4});
  1575. mdio_write1(0x1F, 0x0A5D);
  1576. mdio_write1(0x10, 0x0006);
  1577. mdio_write1(0x1F, 0x0000);
  1578. ELSE
  1579. TRACE("No EEE support!");
  1580. RETURN;
  1581. END;
  1582. (*Advanced EEE*)
  1583. IF hwCfgMethod = CFG_METHOD_17 THEN
  1584. eri_write(0x1EA, 1, S.VAL(SET,0xFA), ERIAR_ExGMAC);
  1585. mdio_write1(0x1F, 0x0A43);
  1586. s := mdio_read(0x10);
  1587. IF s * {10} # {} THEN
  1588. mdio_write1(0x1F, 0x0A42);
  1589. s := mdio_read(0x16);
  1590. s := s - {1};
  1591. mdio_write(0x16, s);
  1592. ELSE
  1593. mdio_write1(0x1F, 0x0A42);
  1594. s := mdio_read(0x16);
  1595. s := s + {1};
  1596. mdio_write(0x16, s);
  1597. END;
  1598. mdio_write1(0x1F, 0x0000);
  1599. END;
  1600. END enable_EEE;
  1601. PROCEDURE disable_EEE;
  1602. VAR s: SET;
  1603. BEGIN
  1604. CASE hwCfgMethod OF
  1605. |CFG_METHOD_11,CFG_METHOD_12,CFG_METHOD_13:
  1606. eri_write(0x1B0, 2, {}, ERIAR_ExGMAC);
  1607. mdio_write1(0x1F, 0x0004);
  1608. mdio_write1(0x10, 0x401F);
  1609. mdio_write1(0x19, 0x7030);
  1610. mdio_write1(0x1F, 0x0000);
  1611. mdio_write1(0x0D, 0x0007);
  1612. mdio_write1(0x0E, 0x003C);
  1613. mdio_write1(0x0D, 0x4007);
  1614. mdio_write1(0x0E, 0x0000);
  1615. mdio_write1(0x0D, 0x0000);
  1616. mdio_write1(0x1F, 0x0000);
  1617. mdio_write1(0x0D, 0x0003);
  1618. mdio_write1(0x0E, 0x0015);
  1619. mdio_write1(0x0D, 0x4003);
  1620. mdio_write1(0x0E, 0x0000);
  1621. mdio_write1(0x0D, 0x0000);
  1622. mdio_write(NetworkMii.BMCR,NetworkMii.BMCR_AutoNegotiationEnable+NetworkMii.BMCR_RestartAutoNegotiation);
  1623. |CFG_METHOD_14:
  1624. eri_write(0x1B0, 2, {}, ERIAR_ExGMAC);
  1625. mdio_write1(0x1F, 0x0004);
  1626. mdio_write1(0x10, 0x401F);
  1627. mdio_write1(0x19, 0x7030);
  1628. mdio_write1(0x1F, 0x0000);
  1629. mdio_write1(0x0D, 0x0007);
  1630. mdio_write1(0x0E, 0x003C);
  1631. mdio_write1(0x0D, 0x4007);
  1632. mdio_write1(0x0E, 0x0000);
  1633. mdio_write1(0x0D, 0x0000);
  1634. mdio_write(NetworkMii.BMCR, NetworkMii.BMCR_AutoNegotiationEnable+NetworkMii.BMCR_RestartAutoNegotiation);
  1635. |CFG_METHOD_15,CFG_METHOD_16:
  1636. eri_write(0x1B0, 2, {}, ERIAR_ExGMAC);
  1637. mdio_write1(0x1F, 0x0004);
  1638. mdio_write1(0x10, 0xC07F);
  1639. mdio_write1(0x19, 0x7030);
  1640. mdio_write1(0x1F, 0x0000);
  1641. mdio_write1(0x1F, 0x0000);
  1642. mdio_write1(0x0D, 0x0007);
  1643. mdio_write1(0x0E, 0x003C);
  1644. mdio_write1(0x0D, 0x4007);
  1645. mdio_write1(0x0E, 0x0000);
  1646. mdio_write1(0x0D, 0x0000);
  1647. mdio_write(NetworkMii.BMCR, NetworkMii.BMCR_AutoNegotiationEnable+NetworkMii.BMCR_RestartAutoNegotiation);
  1648. |CFG_METHOD_17:
  1649. s := eri_read(0x1B0, 4, ERIAR_ExGMAC);
  1650. s := s - {0,1};
  1651. eri_write(0x1B0, 4, s, ERIAR_ExGMAC);
  1652. mdio_write1(0x1F, 0x0A43);
  1653. s := mdio_read( 0x11);
  1654. mdio_write(0x11, s - {4});
  1655. mdio_write1(0x1F, 0x0A5D);
  1656. mdio_write1(0x10, 0x0000);
  1657. mdio_write1(0x1F, 0x0000);
  1658. ELSE
  1659. TRACE("No EEE support!");
  1660. RETURN;
  1661. END;
  1662. (*Advanced EEE*)
  1663. IF hwCfgMethod = CFG_METHOD_17 THEN
  1664. eri_write(0x1EA, 1, {}, ERIAR_ExGMAC);
  1665. mdio_write1(0x1F, 0x0A42);
  1666. s := mdio_read( 0x16);
  1667. s := s - {1};
  1668. mdio_write(0x16, s);
  1669. mdio_write1(0x1F, 0x0000);
  1670. END;
  1671. END disable_EEE;
  1672. PROCEDURE hw_phy_config;
  1673. VAR s: SET;
  1674. BEGIN
  1675. xmii_reset_enable;
  1676. init_hw_phy_mcu;
  1677. IF hwCfgMethod = CFG_METHOD_4 THEN
  1678. mdio_write1(0x1f, 0x0000);
  1679. mdio_write(0x11, mdio_read(0x11) + S.VAL(SET,0x1000));
  1680. mdio_write(0x19, mdio_read(0x19) + S.VAL(SET,0x2000));
  1681. mdio_write(0x10, mdio_read(0x10) + S.VAL(SET,0x8000));
  1682. mdio_write1(0x1f, 0x0003);
  1683. mdio_write1(0x08, 0x441D);
  1684. mdio_write1(0x01, 0x9100);
  1685. mdio_write1(0x1f, 0x0000);
  1686. ELSIF hwCfgMethod = CFG_METHOD_5 THEN
  1687. mdio_write1(0x1f, 0x0000);
  1688. mdio_write(0x11, mdio_read(0x11) + S.VAL(SET,0x1000));
  1689. mdio_write(0x19, mdio_read(0x19) + S.VAL(SET,0x2000));
  1690. mdio_write(0x10, mdio_read(0x10) + S.VAL(SET,0x8000));
  1691. mdio_write1(0x1f, 0x0003);
  1692. mdio_write1(0x08, 0x441D);
  1693. mdio_write1(0x01, 0x9100);
  1694. mdio_write1(0x1f, 0x0000);
  1695. ELSIF hwCfgMethod = CFG_METHOD_6 THEN
  1696. mdio_write1(0x1f, 0x0000);
  1697. mdio_write(0x11, mdio_read(0x11) + S.VAL(SET,0x1000));
  1698. mdio_write(0x19, mdio_read(0x19) + S.VAL(SET,0x2000));
  1699. mdio_write(0x10, mdio_read(0x10) + S.VAL(SET,0x8000));
  1700. mdio_write1(0x1f, 0x0003);
  1701. mdio_write1(0x08, 0x441D);
  1702. mdio_write1(0x1f, 0x0000);
  1703. ELSIF (hwCfgMethod = CFG_METHOD_7) OR (hwCfgMethod = CFG_METHOD_8) THEN
  1704. mdio_write1(0x1f, 0x0000);
  1705. mdio_write(0x11, mdio_read(0x11) + S.VAL(SET,0x1000));
  1706. mdio_write(0x19, mdio_read(0x19) + S.VAL(SET,0x2000));
  1707. mdio_write(0x10, mdio_read(0x10) + S.VAL(SET,0x8000));
  1708. ELSIF hwCfgMethod = CFG_METHOD_9 THEN
  1709. mdio_write1(0x1F, 0x0000);
  1710. mdio_write(0x11, mdio_read(0x11) + {12});
  1711. mdio_write1(0x1F, 0x0002);
  1712. mdio_write(0x0F, mdio_read(0x0F) + {0,1});
  1713. mdio_write1(0x1F, 0x0000);
  1714. mdio_write1(0x1F, 0x0000);
  1715. phyio_write(0x0E, S.VAL(SET,0x0068));
  1716. phyio_write(0x0E, S.VAL(SET,0x0069));
  1717. phyio_write(0x0E, S.VAL(SET,0x006A));
  1718. phyio_write(0x0E, S.VAL(SET,0x006B));
  1719. phyio_write(0x0E, S.VAL(SET,0x006C));
  1720. ELSIF hwCfgMethod = CFG_METHOD_10 THEN
  1721. mdio_write1(0x1F, 0x0007);
  1722. mdio_write1(0x1E, 0x0023);
  1723. mdio_write1(0x17, 0x0116);
  1724. mdio_write1(0x1F, 0x0000);
  1725. mdio_write1(0x1f, 0x0005);
  1726. mdio_write1(0x05, 0x8b80);
  1727. mdio_write1(0x06, 0xc896);
  1728. mdio_write1(0x1f, 0x0000);
  1729. mdio_write1(0x1F, 0x0001);
  1730. mdio_write1(0x0B, 0x8C60);
  1731. mdio_write1(0x07, 0x2872);
  1732. mdio_write1(0x1C, 0xEFFF);
  1733. mdio_write1(0x1F, 0x0003);
  1734. mdio_write1(0x14, 0x94B0);
  1735. mdio_write1(0x1F, 0x0000);
  1736. mdio_write1(0x1F, 0x0002);
  1737. s := mdio_read(0x08) * S.VAL(SET,0x00FF);
  1738. mdio_write(0x08, s + S.VAL(SET,0x8000));
  1739. mdio_write1(0x1F, 0x0007);
  1740. mdio_write1(0x1E, 0x002D);
  1741. s := mdio_read(0x18);
  1742. mdio_write(0x18, s + S.VAL(SET,0x0010));
  1743. mdio_write1(0x1F, 0x0000);
  1744. s := mdio_read(0x14);
  1745. mdio_write(0x14, s + S.VAL(SET,0x8000));
  1746. mdio_write1(0x1F, 0x0002);
  1747. mdio_write1(0x00, 0x080B);
  1748. mdio_write1(0x0B, 0x09D7);
  1749. mdio_write1(0x1f, 0x0000);
  1750. mdio_write1(0x15, 0x1006);
  1751. mdio_write1(0x1F, 0x0003);
  1752. mdio_write1(0x19, 0x7F46);
  1753. mdio_write1(0x1F, 0x0005);
  1754. mdio_write1(0x05, 0x8AD2);
  1755. mdio_write1(0x06, 0x6810);
  1756. mdio_write1(0x05, 0x8AD4);
  1757. mdio_write1(0x06, 0x8002);
  1758. mdio_write1(0x05, 0x8ADE);
  1759. mdio_write1(0x06, 0x8025);
  1760. mdio_write1(0x1F, 0x0000);
  1761. ELSIF (hwCfgMethod = CFG_METHOD_11) OR (hwCfgMethod = CFG_METHOD_12) OR (hwCfgMethod = CFG_METHOD_13) THEN
  1762. IF Read8(0xEF) * S.VAL(SET,0x08) # {} THEN
  1763. mdio_write1(0x1F, 0x0005);
  1764. mdio_write1(0x1A, 0x0004);
  1765. mdio_write1(0x1F, 0x0000);
  1766. ELSE
  1767. mdio_write1(0x1F, 0x0005);
  1768. mdio_write1(0x1A, 0x0000);
  1769. mdio_write1(0x1F, 0x0000);
  1770. END;
  1771. IF Read8(0xEF) * S.VAL(SET,0x010) # {} THEN
  1772. mdio_write1(0x1F, 0x0004);
  1773. mdio_write1(0x1C, 0x0000);
  1774. mdio_write1(0x1F, 0x0000);
  1775. ELSE
  1776. mdio_write1(0x1F, 0x0004);
  1777. mdio_write1(0x1C, 0x0200);
  1778. mdio_write1(0x1F, 0x0000);
  1779. END;
  1780. mdio_write1(0x1F, 0x0001);
  1781. mdio_write1(0x15, 0x7701);
  1782. mdio_write1(0x1F, 0x0000);
  1783. mdio_write1(0x1F, 0x0000);
  1784. s := mdio_read(0x1A);
  1785. mdio_write(0x08, s - {14});
  1786. IF ASPM THEN
  1787. mdio_write1(0x1F, 0x0000);
  1788. mdio_write1(0x18, 0x8310);
  1789. mdio_write1(0x1F, 0x0000);
  1790. END;
  1791. ELSIF hwCfgMethod = CFG_METHOD_14 THEN
  1792. IF ASPM THEN
  1793. mdio_write1(0x1F, 0x0000);
  1794. mdio_write1(0x18, 0x8310);
  1795. mdio_write1(0x1F, 0x0000);
  1796. END;
  1797. ELSIF (hwCfgMethod = CFG_METHOD_15) OR (hwCfgMethod = CFG_METHOD_16) THEN
  1798. mdio_write1(0x1F, 0x0001);
  1799. mdio_write1(0x11, 0x83BA);
  1800. mdio_write1(0x1F, 0x0000);
  1801. IF ASPM THEN
  1802. mdio_write1(0x1F, 0x0000);
  1803. mdio_write1(0x18, 0x8310);
  1804. mdio_write1(0x1F, 0x0000);
  1805. END;
  1806. ELSIF hwCfgMethod = CFG_METHOD_17 THEN
  1807. mdio_write1(0x1F, 0x0BCC);
  1808. mdio_write(0x14, mdio_read(0x14) - {8});
  1809. mdio_write1(0x1F, 0x0A44);
  1810. mdio_write(0x11, mdio_read(0x11) + {7});
  1811. mdio_write(0x11, mdio_read(0x11) + {6});
  1812. mdio_write1(0x1F, 0x0A43);
  1813. mdio_write1(0x13, 0x8084);
  1814. mdio_write(0x14, mdio_read(0x14) - {13,14});
  1815. mdio_write(0x10, mdio_read(0x10) + {12});
  1816. mdio_write(0x10, mdio_read(0x10) + {1});
  1817. mdio_write(0x10, mdio_read(0x10) + {0});
  1818. mdio_write1(0x1F, 0x0A43);
  1819. mdio_write1(0x13, 0x8012);
  1820. mdio_write(0x14, mdio_read(0x14) + {15});
  1821. mdio_write1(0x1F, 0x0BCE);
  1822. mdio_write1(0x12, 0x8860);
  1823. mdio_write1(0x1F, 0x0A43);
  1824. mdio_write1(0x13, 0x80F3);
  1825. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x8B00));
  1826. mdio_write1(0x13, 0x80F0);
  1827. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x3A00));
  1828. mdio_write1(0x13, 0x80EF);
  1829. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x0500));
  1830. mdio_write1(0x13, 0x80F6);
  1831. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x6E00));
  1832. mdio_write1(0x13, 0x80EC);
  1833. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x6800));
  1834. mdio_write1(0x13, 0x80ED);
  1835. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x7C00));
  1836. mdio_write1(0x13, 0x80F2);
  1837. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0xF400));
  1838. mdio_write1(0x13, 0x80F4);
  1839. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x8500));
  1840. mdio_write1(0x1F, 0x0A43);
  1841. mdio_write1(0x13, 0x8110);
  1842. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0xA800));
  1843. mdio_write1(0x13, 0x810F);
  1844. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x1D00));
  1845. mdio_write1(0x13, 0x8111);
  1846. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0xF500));
  1847. mdio_write1(0x13, 0x8113);
  1848. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x6100));
  1849. mdio_write1(0x13, 0x8115);
  1850. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x9200));
  1851. mdio_write1(0x13, 0x810E);
  1852. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x0400));
  1853. mdio_write1(0x13, 0x810C);
  1854. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x7C00));
  1855. mdio_write1(0x13, 0x810B);
  1856. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x5A00));
  1857. mdio_write1(0x1F, 0x0A43);
  1858. mdio_write1(0x13, 0x80D1);
  1859. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0xFF00));
  1860. mdio_write1(0x13, 0x80CD);
  1861. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x9E00));
  1862. mdio_write1(0x13, 0x80D3);
  1863. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x0E00));
  1864. mdio_write1(0x13, 0x80D5);
  1865. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0xCA00));
  1866. mdio_write1(0x13, 0x80D7);
  1867. mdio_write(0x14, (mdio_read(0x14) - S.VAL(SET,0xFF00)) + S.VAL(SET,0x8400));
  1868. IF ASPM THEN
  1869. IF hwHasWrRamCodeToMicroP THEN
  1870. mdio_write1(0x1F, 0x0A43);
  1871. mdio_write(0x10, mdio_read(0x10) + {2});
  1872. END;
  1873. END;
  1874. END;
  1875. (*ocp phy power saving*)
  1876. IF hwCfgMethod = CFG_METHOD_17 THEN
  1877. IF ASPM THEN
  1878. mdio_write1(0x1F, 0x0C41);
  1879. mdio_write1(0x13, 0x0000);
  1880. mdio_write1(0x13, 0x0050);
  1881. mdio_write1(0x1F, 0x0000);
  1882. END;
  1883. END;
  1884. mdio_write1(0x1F, 0x0000);
  1885. IF hwHasWrRamCodeToMicroP THEN
  1886. IF eee_enable THEN
  1887. enable_EEE()
  1888. ELSE
  1889. disable_EEE();
  1890. END;
  1891. END;
  1892. END hw_phy_config;
  1893. PROCEDURE set_speed_xmii(autoneg: BOOLEAN; speed: LONGINT; duplexFull: BOOLEAN);
  1894. VAR
  1895. auto_nego: SET;
  1896. BEGIN
  1897. IF (speed # SPEED_100) & (speed # SPEED_10) THEN
  1898. speed := SPEED_100;
  1899. duplexFull := TRUE;
  1900. END;
  1901. auto_nego := mdio_read(NetworkMii.ANAR);
  1902. auto_nego := auto_nego - (NetworkMii.ANAR_10BaseTHalfDuplex+NetworkMii.ANAR_10BaseTFullDuplex+NetworkMii.ANAR_100BaseTXHalfDuplex+NetworkMii.ANAR_100BaseTXFullDuplex+NetworkMii.ANAR_Pause+NetworkMii.ANAR_AsymmetricPause);
  1903. IF autoneg THEN
  1904. IF speed = SPEED_10 THEN
  1905. IF duplexFull THEN
  1906. auto_nego := auto_nego + NetworkMii.ANAR_10BaseTHalfDuplex+NetworkMii.ANAR_10BaseTFullDuplex;
  1907. ELSE
  1908. auto_nego := auto_nego + NetworkMii.ANAR_10BaseTHalfDuplex;
  1909. END;
  1910. ELSE (* speed = SPEED_100 *)
  1911. IF duplexFull THEN
  1912. auto_nego := auto_nego + NetworkMii.ANAR_100BaseTXHalfDuplex+NetworkMii.ANAR_100BaseTXFullDuplex+NetworkMii.ANAR_10BaseTHalfDuplex+NetworkMii.ANAR_10BaseTFullDuplex;
  1913. ELSE
  1914. auto_nego := auto_nego + NetworkMii.ANAR_100BaseTXHalfDuplex+NetworkMii.ANAR_10BaseTHalfDuplex+NetworkMii.ANAR_10BaseTFullDuplex;
  1915. END;
  1916. END;
  1917. (* flow contorol *)
  1918. auto_nego := auto_nego + NetworkMii.ANAR_Pause+NetworkMii.ANAR_AsymmetricPause;
  1919. IF (hwCfgMethod = CFG_METHOD_4) OR (hwCfgMethod = CFG_METHOD_5) OR
  1920. (hwCfgMethod = CFG_METHOD_6) OR (hwCfgMethod = CFG_METHOD_7) OR
  1921. (hwCfgMethod = CFG_METHOD_8) OR (hwCfgMethod = CFG_METHOD_9) THEN
  1922. auto_nego := auto_nego - (NetworkMii.ANAR_Pause+NetworkMii.ANAR_AsymmetricPause);
  1923. END;
  1924. IF (hwCfgMethod = CFG_METHOD_10) OR (hwCfgMethod = CFG_METHOD_11) OR
  1925. (hwCfgMethod = CFG_METHOD_12) OR (hwCfgMethod = CFG_METHOD_13) OR
  1926. (hwCfgMethod = CFG_METHOD_14) OR (hwCfgMethod = CFG_METHOD_15) OR
  1927. (hwCfgMethod = CFG_METHOD_16) THEN
  1928. IF eee_enable THEN
  1929. auto_nego := auto_nego - (NetworkMii.ANAR_Pause+NetworkMii.ANAR_AsymmetricPause);
  1930. END;
  1931. END;
  1932. phy_auto_nego_reg := auto_nego;
  1933. IF (hwCfgMethod = CFG_METHOD_4) OR (hwCfgMethod = CFG_METHOD_5) THEN
  1934. mdio_write(0x1f,{});
  1935. mdio_write(NetworkMii.BMCR,NetworkMii.BMCR_Reset);
  1936. Delay(1);
  1937. hw_phy_config;
  1938. ELSIF ((hwCfgMethod = CFG_METHOD_1) OR (hwCfgMethod = CFG_METHOD_2) OR (hwCfgMethod = CFG_METHOD_3)) & (speed = SPEED_10) THEN
  1939. mdio_write(0x1f,{});
  1940. mdio_write(NetworkMii.BMCR,NetworkMii.BMCR_Reset);
  1941. hw_phy_config;
  1942. END;
  1943. ELSE
  1944. HALT(100); (*! not implemented *)
  1945. END;
  1946. END set_speed_xmii;
  1947. PROCEDURE xmii_link_ok(): BOOLEAN;
  1948. BEGIN
  1949. RETURN Read8(PHYstatus) * LinkStatus # {};
  1950. END xmii_link_ok;
  1951. PROCEDURE enable_rxdvgate;
  1952. BEGIN
  1953. IF hwCfgMethod = CFG_METHOD_17 THEN
  1954. HALT(100); (*! Not implemented *)
  1955. END;
  1956. END enable_rxdvgate;
  1957. PROCEDURE wait_txrx_fifo_empty;
  1958. BEGIN
  1959. IF hwCfgMethod = CFG_METHOD_17 THEN
  1960. HALT(100); (*! Not implemented *)
  1961. END;
  1962. END wait_txrx_fifo_empty;
  1963. PROCEDURE nic_reset;
  1964. VAR i: LONGINT;
  1965. BEGIN
  1966. Write32(RxConfig,S.VAL(SET,LSH(RX_DMA_BURST,RxCfgDMAShift)));
  1967. enable_rxdvgate;
  1968. wait_txrx_fifo_empty;
  1969. CASE hwCfgMethod OF
  1970. |CFG_METHOD_1,CFG_METHOD_2,CFG_METHOD_3:
  1971. Write8(ChipCmd, StopReq + CmdRxEnb + CmdTxEnb);
  1972. Delay(1);
  1973. |CFG_METHOD_14:
  1974. |CFG_METHOD_17:
  1975. Delay(2);
  1976. ELSE
  1977. Delay(10);
  1978. END;
  1979. (* Soft reset the chip. *)
  1980. Write8(ChipCmd, CmdReset);
  1981. (* Check that the chip has finished the reset. *)
  1982. i := 0;
  1983. WHILE (i < 100) & (Read8(ChipCmd) * CmdReset # {}) DO
  1984. Delay(1);
  1985. INC(i);
  1986. END;
  1987. ASSERT(i < 100);
  1988. END nic_reset;
  1989. PROCEDURE AllocBuffer(VAR buf: TxBuffer);
  1990. BEGIN
  1991. NEW(buf); (* edit: no more alignment necessary, since PTR TO RECORD is already 32 byte aligned *)
  1992. END AllocBuffer;
  1993. PROCEDURE SetupRxRing(): Machine.Address32;
  1994. VAR
  1995. r: LONGINT;
  1996. adr, physAdr: ADDRESS;
  1997. buf, prev: RxBuffer;
  1998. BEGIN
  1999. (* make sure the descriptor ring is 256 byte aligned in physical memory *)
  2000. adr := ADDRESSOF(rdsBuf[0]);
  2001. physAdr := Machine.PhysicalAdr(adr, LEN(rdsBuf,0));
  2002. TRACE(adr,physAdr);
  2003. r := physAdr MOD 256;
  2004. IF r # 0 THEN r := 256-r; END;
  2005. TRACE(r);
  2006. INC(adr,r);
  2007. TRACE(adr);
  2008. FOR r := 0 TO RxRingSize - 1 DO
  2009. rds[r] := adr;
  2010. INC(adr,SizeOfRxTxFDHdr);
  2011. END;
  2012. firstRD := 0;
  2013. IF DebugRxRing IN Debug THEN
  2014. KernelLog.String("Rx descriptor start = ");
  2015. KernelLog.Hex(ADDRESSOF(rds[firstRD]^), 8);
  2016. KernelLog.Ln;
  2017. KernelLog.String("first Rx descriptor id = ");
  2018. KernelLog.Int(firstRD, 0);
  2019. KernelLog.Ln;
  2020. END;
  2021. FOR r := firstRD TO RxRingSize - 1 DO
  2022. NEW(buf);
  2023. buf.buf := Network.GetNewBuffer();
  2024. ASSERT(buf.buf # NIL);
  2025. adr := ADDRESSOF(buf.buf.data[0]);
  2026. physAdr := Machine.PhysicalAdr(adr, Network.MaxPacketSize);
  2027. ASSERT(physAdr # Machine.NilAdr);
  2028. rds[r].flags := {31} + (S.VAL(SET, Network.MaxPacketSize) * {0..13});
  2029. rds[r].vLanTag := 0;
  2030. rds[r].bufAdrLo := Machine.Ensure32BitAddress (physAdr);
  2031. rds[r].bufAdrHi := 0;
  2032. IF prev # NIL THEN
  2033. prev.next := buf;
  2034. ELSE
  2035. (* set first Rx Buffer *)
  2036. rxBuffer := buf;
  2037. END;
  2038. prev := buf;
  2039. END;
  2040. rxLast := buf;
  2041. rxLast.next := rxBuffer;
  2042. (* mark last descriptor as EOR (end of descriptor ring) *)
  2043. INCL(rds[RxRingSize - 1].flags, 30);
  2044. curRD := firstRD;
  2045. adr := ADDRESSOF(rds[firstRD]^);
  2046. (* return physical address of first rx descriptor *)
  2047. RETURN Machine.Ensure32BitAddress (Machine.PhysicalAdr(adr, SizeOfRxTxFDHdr));
  2048. END SetupRxRing;
  2049. PROCEDURE SetupTxRing(): Machine.Address32;
  2050. VAR
  2051. r: LONGINT;
  2052. adr, physAdr: ADDRESS;
  2053. buf, prev: TxBuffer;
  2054. BEGIN
  2055. (* make sure the descriptor ring is 256 byte aligned in physical memory *)
  2056. adr := ADDRESSOF(tdsBuf[0]);
  2057. physAdr := Machine.PhysicalAdr(adr, LEN(tdsBuf,0));
  2058. TRACE(adr,physAdr);
  2059. r := physAdr MOD 256;
  2060. IF r # 0 THEN r := 256-r; END;
  2061. TRACE(r);
  2062. INC(adr,r);
  2063. TRACE(adr);
  2064. FOR r := 0 TO TxRingSize - 1 DO
  2065. tds[r] := adr;
  2066. INC(adr,SizeOfRxTxFDHdr);
  2067. END;
  2068. firstTD := 0;
  2069. lastTD := firstTD;
  2070. nofFreeTx := TxRingSize - firstTD;
  2071. IF DebugTxRing IN Debug THEN
  2072. KernelLog.String("Tx descriptor start = ");
  2073. KernelLog.Hex(ADDRESSOF(tds[firstTD]^), -8);
  2074. KernelLog.Ln;
  2075. KernelLog.String("first Tx descriptor id = ");
  2076. KernelLog.Int(firstTD, 0);
  2077. KernelLog.Ln;
  2078. KernelLog.String("nofFreeTx = ");
  2079. KernelLog.Int(nofFreeTx, 0);
  2080. KernelLog.Ln;
  2081. END;
  2082. FOR r := firstTD TO TxRingSize - 1 DO
  2083. AllocBuffer(buf);
  2084. (* configure TFD *)
  2085. adr := ADDRESSOF(buf.data[0]);
  2086. physAdr := Machine.PhysicalAdr(adr, TxBufMaxSize);
  2087. ASSERT(physAdr # Machine.NilAdr);
  2088. tds[r].flags := {};
  2089. tds[r].vLanTag := 0;
  2090. tds[r].bufAdrLo := Machine.Ensure32BitAddress (physAdr);
  2091. tds[r].bufAdrHi := 0;
  2092. IF prev # NIL THEN
  2093. prev.next := buf;
  2094. ELSE
  2095. (* set first Tx Buffer *)
  2096. txBuffer := buf;
  2097. END;
  2098. prev := buf;
  2099. END;
  2100. txLast := buf;
  2101. txLast.next := txBuffer;
  2102. (* mark last descriptor as EOR (end of descriptor ring) *)
  2103. INCL(tds[TxRingSize - 1].flags, 30);
  2104. curTD := firstTD;
  2105. adr := ADDRESSOF(tds[firstTD]^);
  2106. (* return physical address of first tx descriptor *)
  2107. RETURN Machine.Ensure32BitAddress (Machine.PhysicalAdr(adr, SizeOfRxTxFDHdr));
  2108. END SetupTxRing;
  2109. PROCEDURE SendFrame(dst: Network.LinkAdr; type: LONGINT; CONST l3hdr, l4hdr, data: ARRAY OF CHAR; h3len, h4len, dofs, dlen: LONGINT);
  2110. VAR
  2111. txLen, offset, type4: LONGINT;
  2112. bufBase: ADDRESS;
  2113. chksums: SET;
  2114. BEGIN {EXCLUSIVE}
  2115. IF nofFreeTx <= 0 THEN
  2116. KernelLog.String("no tx buffers"); KernelLog.Ln;
  2117. INC(nTxOverflow);
  2118. END;
  2119. AWAIT(nofFreeTx > 0);
  2120. txLen := 14 + h3len + h4len + dlen;
  2121. bufBase := ADDRESSOF(txBuffer.data);
  2122. (* generate ethernet frame: setup eth header, move data *)
  2123. (* set destination mac address (first 6 bytes of eth frame) *)
  2124. S.MOVE(ADDRESSOF(dst[0]), bufBase, 6);
  2125. (* set source mac address (6 bytes @ offset 6 of eth frame) *)
  2126. S.MOVE(ADDRESSOF(dev.local[0]), bufBase + 6, 6);
  2127. (* set upper layer type, bring type from host to network byte order *)
  2128. S.PUT16(bufBase + 12, ROT(S.VAL(INTEGER, SHORT(type)), 8));
  2129. offset := 14; (* eth header has 14 bytes *)
  2130. (* move layer 3 and layer 4 headers, data *)
  2131. IF h3len > 0 THEN
  2132. S.MOVE(ADDRESSOF(l3hdr[0]), bufBase + offset, h3len);
  2133. INC(offset, h3len);
  2134. END;
  2135. IF h4len > 0 THEN
  2136. S.MOVE(ADDRESSOF(l4hdr[0]), bufBase + offset, h4len);
  2137. INC(offset, h4len);
  2138. END;
  2139. IF offset + dlen < MaxETHFrameSize THEN
  2140. S.MOVE(ADDRESSOF(data[0]) + dofs, bufBase + offset, dlen);
  2141. INC(offset, dlen);
  2142. END;
  2143. (* make the frame at least 64 bytes long *)
  2144. WHILE offset < 60 DO
  2145. txBuffer.data[offset] := CHR(0);
  2146. INC(offset);
  2147. INC(txLen);
  2148. END;
  2149. IF DebugTransmit IN Debug THEN
  2150. KernelLog.String("Sending frame of length ");
  2151. KernelLog.Int(txLen, 0);
  2152. KernelLog.Ln;
  2153.  (*KernelLog.Memory(bufBase, txLen);*)
  2154. END;
  2155. (* find out which protocols are used;
  2156. let the NIC calc the checksums for IP, TCP and UCP headers *)
  2157. chksums := {};
  2158. IF type = 0800H THEN
  2159. INCL(chksums, 29(*18*)); (* offload IP checksum *)
  2160. type4 := S.VAL(SHORTINT, l3hdr[9]); (* get type if IP data *)
  2161. IF type4 = 6 THEN (* TCP/IP *)
  2162. INCL(chksums, 30(*16*)); (* offload TCP checksum *)
  2163. ELSIF type4 = 17 THEN
  2164. INCL(chksums, 31(*17*)); (* offload UDP checksum *)
  2165. END;
  2166. END;
  2167. (* update Tx Descriptor:
  2168. set OWN=1, FS=1, LS=1, checksum offloads;
  2169. set size of packet to be transmitted *)
  2170. tds[curTD].flags := tds[curTD].flags * {30}; (* only keep EOR bit *)
  2171. tds[curTD].flags := tds[curTD].flags + {31, 29, 28} (*+ chksums*);
  2172. tds[curTD].flags := tds[curTD].flags + (S.VAL(SET, txLen) * {0..15});
  2173. tds[curTD].vLanTag := S.VAL(LONGINT,chksums);
  2174. (* move to next Tx Descriptor, Tx Buffer *)
  2175. INC(curTD);
  2176. IF curTD = TxRingSize THEN
  2177. curTD := firstTD;
  2178. END;
  2179. txBuffer := txBuffer.next;
  2180. DEC(nofFreeTx);
  2181. (* tell the nic that there's some eth frame waiting to be transmitted (set NPQ=1) *)
  2182. Write8(38H,{6});
  2183. END SendFrame;
  2184. PROCEDURE Read8(reg: LONGINT): SET;
  2185. BEGIN
  2186. RETURN S.VAL(SET,LONGINT(S.GET8(base+reg)));
  2187. END Read8;
  2188. PROCEDURE Write8(reg: LONGINT; val: SET);
  2189. BEGIN
  2190. S.PUT8(base+reg,SHORTINT(S.VAL(LONGINT,val)));
  2191. (*KernelLog.String("W8 0x"); KernelLog.Hex(reg,-2);
  2192. KernelLog.String(" 0x"); KernelLog.Hex(S.VAL(LONGINT,val),-2);
  2193. KernelLog.Ln;*)
  2194. END Write8;
  2195. PROCEDURE Read16(reg: LONGINT): SET;
  2196. BEGIN
  2197. RETURN S.VAL(SET,LONGINT(S.GET16(base+reg)));
  2198. END Read16;
  2199. PROCEDURE Write16(reg: LONGINT; val: SET);
  2200. BEGIN
  2201. S.PUT16(base+reg,INTEGER(S.VAL(LONGINT,val)));
  2202. (*KernelLog.String("W16 0x"); KernelLog.Hex(reg,-2);
  2203. KernelLog.String(" 0x"); KernelLog.Hex(S.VAL(LONGINT,val),-4);
  2204. KernelLog.Ln;*)
  2205. END Write16;
  2206. PROCEDURE Read32(reg: LONGINT): SET;
  2207. BEGIN
  2208. RETURN S.VAL(SET,S.GET32(base+reg));
  2209. END Read32;
  2210. PROCEDURE Write32(reg: LONGINT; val: SET);
  2211. BEGIN
  2212. S.PUT32(base+reg,val);
  2213. (*KernelLog.String("W32 0x"); KernelLog.Hex(reg,-2);
  2214. KernelLog.String(" 0x"); KernelLog.Hex(S.VAL(LONGINT,val),-8);
  2215. KernelLog.Ln;*)
  2216. END Write32;
  2217. PROCEDURE UpdateLinkStatus;
  2218. BEGIN
  2219. IF xmii_link_ok() THEN linkStatus := Network.LinkLinked;
  2220. ELSE linkStatus := Network.LinkNotLinked;
  2221. END;
  2222. END UpdateLinkStatus;
  2223. PROCEDURE CheckChecksumErrors(d: RxTxDescriptor): BOOLEAN;
  2224. VAR proto: SET;
  2225. BEGIN
  2226. proto := d.flags * {17..18};
  2227. IF proto = {} THEN
  2228. RETURN TRUE; (* no checksum errors since non-ip packet *)
  2229. ELSIF proto = {17} THEN
  2230. (* protocol is TCP/IP so check IP and TCP checksum failures *)
  2231. RETURN d.flags * {14, 16} = {};
  2232. ELSIF proto = {18} THEN
  2233. (* protocol is UDP/IP so check IP and UDP checksum failures *)
  2234. RETURN d.flags * {15, 16} = {};
  2235. ELSE
  2236. (* protocol is IP so check IP checksum failures *)
  2237. RETURN d.flags * {16} = {};
  2238. END;
  2239. END CheckChecksumErrors;
  2240. PROCEDURE ReadFrames;
  2241. VAR
  2242. adr: ADDRESS; type, size: LONGINT;
  2243. dstAdr: Network.LinkAdr;
  2244. buf: Network.Buffer;
  2245. s: SET;
  2246. BEGIN
  2247. (* read all frames that are marked with OWN = 0*)
  2248. WHILE ~(31 IN rds[curRD].flags) DO
  2249. (* skip error frames *)
  2250. IF (21 IN rds[curRD].flags) THEN
  2251. INC(nRxErrorFrames);
  2252. ELSIF CheckChecksumErrors(rds[curRD]^) THEN
  2253. (* find out how many bytes have been received, including CRC *)
  2254. size := S.VAL(LONGINT, rds[curRD].flags * {0..13});
  2255. IF DebugReceive IN Debug THEN
  2256. KernelLog.String("Received a frame of length ");
  2257. KernelLog.Int(size, 0);
  2258. KernelLog.Ln;
  2259. END;
  2260. adr := ADDRESSOF(rxBuffer.buf.data[0]);
  2261. (* copy destination and source addresses, type of packet *)
  2262. dstAdr := S.VAL(Network.LinkAdr, rxBuffer.buf.data[0]);
  2263. rxBuffer.buf.src := S.VAL(Network.LinkAdr, rxBuffer.buf.data[6]);
  2264. type := Network.GetNet2(rxBuffer.buf.data, 12);
  2265. buf := rxBuffer.buf;
  2266. buf.ofs := 14;
  2267. buf.len := size - 14;
  2268. buf.calcChecksum := { Network.ChecksumIP, Network.ChecksumUDP, Network.ChecksumTCP };
  2269. buf.next := NIL;
  2270. buf.prev := NIL;
  2271. IF type = 0DEADH THEN
  2272. (* make sure the frame doesn't bounce between the two cards by adding 1 to the type *)
  2273. SendFrame(buf.src, type + 1, buf.data, buf.data, buf.data, 0, 0, 0, buf.len);
  2274. ELSIF type = 0DEADH + 1 THEN
  2275. (* discard this frame *)
  2276. ELSE
  2277. dev.QueueBuffer(buf, type);
  2278. END;
  2279. INC(nRxFrames);
  2280. IF (type # 0DEADH) & (type # 0DEADH + 1) THEN
  2281. rxBuffer.buf := Network.GetNewBuffer();
  2282. buf := rxBuffer.buf;
  2283. ASSERT(rxBuffer.buf # NIL);
  2284. IF buf # NIL THEN
  2285. rds[curRD].bufAdrLo := Machine.Ensure32BitAddress (Machine.PhysicalAdr(ADDRESSOF(rxBuffer.buf.data[0]), Network.MaxPacketSize));
  2286. END;
  2287. END;
  2288. ELSE
  2289. IF DebugReceive IN Debug THEN
  2290. IF 16 IN rds[curRD].flags THEN
  2291. KernelLog.String("IP ");
  2292. ELSIF 15 IN rds[curRD].flags THEN
  2293. KernelLog.String("UDP ");
  2294. ELSIF 14 IN rds[curRD].flags THEN
  2295. KernelLog.String("TCP ");
  2296. END;
  2297. KernelLog.String("checksum error detected!");
  2298. KernelLog.Ln;
  2299. END;
  2300. INC(nRxErrorFrames);
  2301. END;
  2302. (* mark the buffer to be able to receive again *)
  2303. rds[curRD].flags := {31} + (rds[curRD].flags * {30}) + (S.VAL(SET, Network.MaxPacketSize) * {0..13});
  2304. rds[curRD].vLanTag := 0;
  2305. s := rds[curRD].flags;
  2306. (* advance Rx descriptor, Rx buffer *)
  2307. rxBuffer := rxBuffer.next;
  2308. INC(curRD);
  2309. IF curRD = RxRingSize THEN
  2310. curRD := firstRD;
  2311. END;
  2312. END;
  2313. END ReadFrames;
  2314. PROCEDURE UpdateTxRing;
  2315. VAR i: LONGINT;
  2316. BEGIN { EXCLUSIVE }
  2317. i := lastTD;
  2318. WHILE (i # curTD) DO
  2319. IF DebugTransmit IN Debug THEN
  2320. KernelLog.String("*** Tx OK ***"); KernelLog.Ln;
  2321. END;
  2322. INC(i);
  2323. INC(nTxFrames);
  2324. INC(nofFreeTx);
  2325. IF i = TxRingSize THEN
  2326. i := firstTD;
  2327. END;
  2328. txLast := txLast.next;
  2329. END;
  2330. lastTD := i;
  2331. END UpdateTxRing;
  2332. PROCEDURE HandleInterrupt;
  2333. VAR status: SET;
  2334. BEGIN
  2335. status := Read16(IntrStatus);
  2336. Write16(IntrMask,{});
  2337. (* System Error *)
  2338. IF (SYSErr IN intr_mask) & (SYSErr IN status) THEN
  2339. IF DebugInterrupt IN Debug THEN
  2340. KernelLog.String("System Error Interrupt"); KernelLog.Ln;
  2341. END;
  2342. END;
  2343. (* Time Out (TimeOut) *)
  2344. IF (PCSTimeout IN intr_mask) & (PCSTimeout IN status) THEN
  2345. IF DebugInterrupt IN Debug THEN
  2346. KernelLog.String("Timeout Interrupt"); KernelLog.Ln;
  2347. END;
  2348. END;
  2349. IF (SWInt IN intr_mask) & (SWInt IN status) THEN
  2350. IF DebugInterrupt IN Debug THEN
  2351. KernelLog.String("Software Interrupt"); KernelLog.Ln;
  2352. END;
  2353. END;
  2354. IF (TxDescUnavail IN intr_mask) & (TxDescUnavail IN status) THEN
  2355. IF DebugInterrupt IN Debug THEN
  2356. KernelLog.String("Tx Descriptor Unavailable Interrupt"); KernelLog.Ln;
  2357. END;
  2358. (*UpdateTxRing;*)
  2359. (*INCL(status, 2); (* let the tx ring be updated *)*)
  2360. END;
  2361. (* Rx FIFO Overflow *)
  2362. IF (RxFIFOOver IN intr_mask) & (RxFIFOOver IN status) THEN
  2363. IF DebugInterrupt IN Debug THEN
  2364. KernelLog.String("Rx FIFO Overflow Interrupt"); KernelLog.Ln;
  2365. END;
  2366. INC(nRxOverflow);
  2367. (*INCL(ack, 4);*)
  2368. (*INCL(status, 0); (* read the frames *)*)
  2369. END;
  2370. (* Link Change *)
  2371. IF (LinkChg IN intr_mask) & (LinkChg IN status) THEN
  2372. IF DebugInterrupt IN Debug THEN
  2373. KernelLog.String("Link Change Interrupt"); KernelLog.Ln;
  2374. END;
  2375. UpdateLinkStatus;
  2376. END;
  2377. (* Rx Descriptor Unavailable *)
  2378. IF (RxDescUnavail IN intr_mask) & (RxDescUnavail IN status) THEN
  2379. IF DebugInterrupt IN Debug THEN
  2380. (* CAREFUL: UN-COMMENTING THE NEXT LINE CAN CRASH THE OS *)
  2381. KernelLog.String("Rx Descriptor Unavailable Interrupt"); KernelLog.Ln;
  2382. END;
  2383. (*INCL(status, 0); (* read the frames *)*)
  2384. END;
  2385. (* Transmit Error *)
  2386. IF (TxErr IN intr_mask) & (TxErr IN status) THEN
  2387. IF DebugInterrupt IN Debug THEN
  2388. KernelLog.String("Transmit Error Interrupt"); KernelLog.Ln;
  2389. END;
  2390. INC(nTxErrorFrames);
  2391. INCL(status, TxErr); (* let the tx ring be updated *)
  2392. END;
  2393. (* Transmit OK *)
  2394. IF (TxOK IN intr_mask) & (TxOK IN status) THEN
  2395. IF DebugInterrupt IN Debug THEN
  2396. KernelLog.String("Transmit OK Interrupt"); KernelLog.Ln;
  2397. END;
  2398. UpdateTxRing;
  2399. END;
  2400. (* Receive Error *)
  2401. IF (RxErr IN intr_mask) & (RxErr IN status) THEN
  2402. IF DebugInterrupt IN Debug THEN
  2403. KernelLog.String("Receive Error Interrupt"); KernelLog.Ln;
  2404. END;
  2405. (*ReadFrames;*)
  2406. INCL(status, RxErr); (* let the rx ring be updated *)
  2407. END;
  2408. (* Receive OK *)
  2409. IF (RxOK IN intr_mask) & (RxOK IN status) THEN
  2410. IF DebugInterrupt IN Debug THEN
  2411. (* CAREFUL: UN-COMMENTING THE NEXT LINE CAN CRASH THE OS *)
  2412. KernelLog.String("Receive Ok Interrupt"); KernelLog.Ln;
  2413. END;
  2414. ReadFrames;
  2415. END;
  2416. Write16(IntrStatus,status);
  2417. Write16(IntrMask,intr_mask);
  2418. END HandleInterrupt;
  2419. PROCEDURE Finalize;
  2420. VAR
  2421. s: SET;
  2422. BEGIN
  2423. (* cleanup Network registry *)
  2424. Network.registry.Remove(dev);
  2425. (* disable Tx and Rx *)
  2426. s := S.VAL(SET, Read8(37H));
  2427. Write8(37H,s - {2, 3});
  2428. (* soft reset *)
  2429. Write8(37H,{4});
  2430. (* disable all interrupts *)
  2431. Write16(3CH, {});
  2432. WHILE (rxBuffer # NIL) & (rxBuffer.buf # NIL) DO
  2433. Network.ReturnBuffer(rxBuffer.buf);
  2434. rxBuffer.buf := NIL;
  2435. rxBuffer := rxBuffer.next;
  2436. END;
  2437. IF DebugCleanup IN Debug THEN
  2438. KernelLog.String("Removing IRQ Handler.");
  2439. KernelLog.Ln
  2440. END;
  2441. Objects.RemoveHandler(SELF.HandleInterrupt, Machine.IRQ0 + irq);
  2442. END Finalize;
  2443. PROCEDURE DebugConfig;
  2444. VAR
  2445. s: SET;
  2446. res: LONGINT;
  2447. BEGIN
  2448. KernelLog.String("*** BEGIN OF NIC CONFIGURATION ***"); KernelLog.Ln;
  2449. s := Read16(0E0H);
  2450. KernelLog.String("C+ Command:"); KernelLog.Ln;
  2451. KernelLog.String(" "); KernelLog.Set(s); KernelLog.Ln;
  2452. KernelLog.String("Rx Descriptor base address:"); KernelLog.Ln;
  2453. KernelLog.String(" ");
  2454. res := S.VAL(LONGINT,Read32(0E4H + 4H));
  2455. KernelLog.Hex(res, 8);
  2456. res := S.VAL(LONGINT,Read32(0E4H));
  2457. KernelLog.Hex(res, 8);
  2458. KernelLog.Ln;
  2459. KernelLog.String("Tx Normal Priority Descriptor base address:"); KernelLog.Ln;
  2460. KernelLog.String(" ");
  2461. res := S.VAL(LONGINT,Read32(020H + 4H));
  2462. KernelLog.Hex(res, 8);
  2463. res := S.VAL(LONGINT,Read32(020H));
  2464. KernelLog.Hex(res, 8);
  2465. KernelLog.Ln;
  2466. res := S.VAL(LONGINT,Read16(0DAH));
  2467. KernelLog.String("Receive Packet Max Size:"); KernelLog.Ln;
  2468. KernelLog.String(" "); KernelLog.Int(res, 0); KernelLog.Ln;
  2469. res := S.VAL(LONGINT,Read8(0ECH));
  2470. KernelLog.String("Max Transmit Packet Size:"); KernelLog.Ln;
  2471. KernelLog.String(" "); KernelLog.Int(res * 128, 0); KernelLog.Ln;
  2472. s := Read32(40H);
  2473. KernelLog.String("Transmit Configuration:"); KernelLog.Ln;
  2474. KernelLog.String(" "); KernelLog.Set(s); KernelLog.Ln;
  2475. s := Read32(44H);
  2476. KernelLog.String("Receive Configuration:"); KernelLog.Ln;
  2477. KernelLog.String(" "); KernelLog.Set(s); KernelLog.Ln;
  2478. s := Read16(3CH);
  2479. KernelLog.String("interrupt mask:"); KernelLog.Ln;
  2480. KernelLog.String(" "); KernelLog.Set(s); KernelLog.Ln;
  2481. s := Read8(37H);
  2482. KernelLog.String("command bits:"); KernelLog.Ln;
  2483. KernelLog.String(" "); KernelLog.Set(s); KernelLog.Ln;
  2484. KernelLog.String("*** END OF NIC CONFIGURATION ***"); KernelLog.Ln;
  2485. END DebugConfig;
  2486. PROCEDURE PrintStatus;
  2487. VAR
  2488. phyStatus: SET;
  2489. BEGIN
  2490. phyStatus := S.VAL(SET, Read8(6CH));
  2491. IF 1 IN phyStatus THEN
  2492. KernelLog.String(" Device is linked");
  2493. KernelLog.Ln;
  2494. IF 3 IN phyStatus THEN
  2495. KernelLog.String(" Linkspeed is 100Mbps");
  2496. KernelLog.Ln;
  2497. ELSE
  2498. TRACE(2 IN phyStatus);
  2499. KernelLog.String(" Linkspeed is 10MBps");
  2500. KernelLog.Ln;
  2501. END;
  2502. IF 0 IN phyStatus THEN
  2503. KernelLog.String(" Device is in Full-Duplex mode");
  2504. KernelLog.Ln;
  2505. ELSE
  2506. KernelLog.String(" Device is in Half-Duplex mode");
  2507. KernelLog.Ln;
  2508. END;
  2509. ELSE
  2510. KernelLog.String(" Device is NOT linked");
  2511. KernelLog.Ln;
  2512. END;
  2513. IF 6 IN phyStatus THEN
  2514. KernelLog.String(" Transmit Flow Control enabled");
  2515. KernelLog.Ln;
  2516. END;
  2517. IF 5 IN phyStatus THEN
  2518. KernelLog.String(" Receive Flow Control enabled");
  2519. KernelLog.Ln;
  2520. END;
  2521. KernelLog.String(" nRxOverflow = ");
  2522. KernelLog.HIntHex(nRxOverflow, 16);
  2523. KernelLog.Ln;
  2524. KernelLog.String(" nTxOverflow = ");
  2525. KernelLog.HIntHex(nTxOverflow, 16);
  2526. KernelLog.Ln;
  2527. (*KernelLog.String(" Rx Missed Packet Counter = ");
  2528. KernelLog.Int(Read32(4CH), 0);
  2529. KernelLog.Ln;*)
  2530. KernelLog.String(" nRxFrames = ");
  2531. KernelLog.Int(nRxFrames, 0);
  2532. KernelLog.Ln;
  2533. KernelLog.String(" nTxFrames = ");
  2534. KernelLog.Int(nTxFrames, 0);
  2535. KernelLog.Ln;
  2536. KernelLog.String(" nRxErrorFrames = ");
  2537. KernelLog.Int(nRxErrorFrames, 0);
  2538. KernelLog.Ln;
  2539. KernelLog.String(" nTxErrorFrames = ");
  2540. KernelLog.Int(nTxErrorFrames, 0);
  2541. KernelLog.Ln;
  2542. END PrintStatus;
  2543. END Controller;
  2544. VAR
  2545. installedControllers: Controller;
  2546. (* software reset of the device *)
  2547. PROCEDURE SoftReset(base: ADDRESS);
  2548. VAR s: SET;
  2549. BEGIN
  2550. TRACE(ChipCmd,CmdReset);
  2551. S.PUT8(base+ChipCmd,CmdReset);
  2552. (* wait until reset has finished *)
  2553. REPEAT
  2554. Delay(1);
  2555. s := S.VAL(SET,LONGINT(S.GET8(base+ChipCmd)));
  2556. UNTIL s * CmdReset = {};
  2557. END SoftReset;
  2558. PROCEDURE irq_mask_and_ack(base: ADDRESS);
  2559. BEGIN
  2560. S.PUT16(base+IntrMask,0);
  2561. TRACE(IntrMask,IntrStatus,S.GET16(base+IntrStatus));
  2562. S.PUT16(base+IntrStatus,S.GET16(base+IntrStatus));
  2563. END irq_mask_and_ack;
  2564. (* Get device name given the determined configuration method *)
  2565. PROCEDURE GetDeviceName(hwCfgMethod: LONGINT; VAR name: ARRAY OF CHAR);
  2566. BEGIN
  2567. CASE hwCfgMethod OF
  2568. |CFG_METHOD_1: name := "RTL8101E";
  2569. |CFG_METHOD_2: name := "RTL8101E";
  2570. |CFG_METHOD_3: name := "RTL8101E";
  2571. |CFG_METHOD_4: name := "RTL8102E";
  2572. |CFG_METHOD_5: name := "RTL8102E";
  2573. |CFG_METHOD_6: name := "RTL8103E";
  2574. |CFG_METHOD_7: name := "RTL8103E";
  2575. |CFG_METHOD_8: name := "RTL8103E";
  2576. |CFG_METHOD_9: name := "RTL8401";
  2577. |CFG_METHOD_10: name := "RTL8105E";
  2578. |CFG_METHOD_11: name := "RTL8105E";
  2579. |CFG_METHOD_12: name := "RTL8105E";
  2580. |CFG_METHOD_13: name := "RTL8105E";
  2581. |CFG_METHOD_14: name := "RTL8402";
  2582. |CFG_METHOD_15: name := "RTL8106E";
  2583. |CFG_METHOD_16: name := "RTL8106E";
  2584. |CFG_METHOD_17: name := "RTL8106EUS";
  2585. ELSE
  2586. name := "";
  2587. END;
  2588. END GetDeviceName;
  2589. (* Identify device and the required configuration method *)
  2590. PROCEDURE IdentifyDevice(base: ADDRESS; VAR hwCfgMethod: LONGINT; VAR hwIcVerUnknown: BOOLEAN; VAR chipsetInd: LONGINT; VAR hwName: ARRAY OF CHAR);
  2591. VAR
  2592. s: SET;
  2593. v, id, i: LONGINT;
  2594. BEGIN
  2595. (*! disable interrupts ? *)
  2596. irq_mask_and_ack(base);
  2597. (* reset the device *)
  2598. SoftReset(base);
  2599. (* identify the device *)
  2600. s := S.VAL(SET,S.GET32(base+40H));
  2601. v := S.VAL(LONGINT,s * {23,26..30});
  2602. id := S.VAL(LONGINT,s * {20..22});
  2603. hwCfgMethod := -1;
  2604. hwName := "";
  2605. hwIcVerUnknown := FALSE;
  2606. IF v = 0x34000000 THEN
  2607. IF id = 0x00000000 THEN
  2608. hwCfgMethod := CFG_METHOD_1;
  2609. ELSIF id = 0x00200000 THEN
  2610. hwCfgMethod := CFG_METHOD_2;
  2611. ELSIF id = 0x00300000 THEN
  2612. hwCfgMethod := CFG_METHOD_3;
  2613. ELSE
  2614. hwCfgMethod := CFG_METHOD_3;
  2615. hwIcVerUnknown := TRUE;
  2616. END;
  2617. ELSIF (v = 0x34800000) OR (v = 0x24800000) THEN
  2618. IF id = 0x00100000 THEN
  2619. hwCfgMethod := CFG_METHOD_4;
  2620. ELSIF id = 0x00200000 THEN
  2621. hwCfgMethod := CFG_METHOD_5;
  2622. ELSIF id = 0x00400000 THEN
  2623. hwCfgMethod := CFG_METHOD_6;
  2624. ELSIF id = 0x00500000 THEN
  2625. hwCfgMethod := CFG_METHOD_7;
  2626. ELSIF id = 0x00600000 THEN
  2627. hwCfgMethod := CFG_METHOD_8;
  2628. ELSE
  2629. hwCfgMethod := CFG_METHOD_8;
  2630. hwIcVerUnknown := TRUE;
  2631. END;
  2632. ELSIF v = 0x24000000 THEN
  2633. hwCfgMethod := CFG_METHOD_9;
  2634. ELSIF v = 0x2C000000 THEN
  2635. IF (id = 0x00000000) OR (id = 0x00100000) OR (id = 0x00200000) THEN
  2636. hwCfgMethod := CFG_METHOD_10;
  2637. ELSE
  2638. hwCfgMethod := CFG_METHOD_10;
  2639. hwIcVerUnknown := TRUE;
  2640. END;
  2641. ELSIF v = 0x40800000 THEN
  2642. IF id = 0x00100000 THEN
  2643. hwCfgMethod := CFG_METHOD_11;
  2644. ELSIF id = 0x00200000 THEN
  2645. hwCfgMethod := CFG_METHOD_12;
  2646. ELSIF id = 0x00300000 THEN
  2647. hwCfgMethod := CFG_METHOD_13;
  2648. ELSIF id = 0x00400000 THEN
  2649. hwCfgMethod := CFG_METHOD_13;
  2650. ELSE
  2651. hwCfgMethod := CFG_METHOD_13;
  2652. hwIcVerUnknown := TRUE;
  2653. END;
  2654. ELSIF v = 0x44000000 THEN
  2655. hwCfgMethod := CFG_METHOD_14;
  2656. ELSIF v = 0x44800000 THEN
  2657. IF id = 0x00000000 THEN
  2658. hwCfgMethod := CFG_METHOD_15;
  2659. ELSIF id = 0x00100000 THEN
  2660. hwCfgMethod := CFG_METHOD_16;
  2661. ELSE
  2662. hwCfgMethod := CFG_METHOD_16;
  2663. hwIcVerUnknown := TRUE;
  2664. END;
  2665. ELSIF v = 0x50800000 THEN
  2666. IF id = 0x00100000 THEN
  2667. hwCfgMethod := CFG_METHOD_17;
  2668. ELSE
  2669. hwCfgMethod := CFG_METHOD_17;
  2670. hwIcVerUnknown := TRUE;
  2671. END;
  2672. END;
  2673. chipsetInd := 0;
  2674. WHILE (chipsetInd < LEN(HwCfgMethods,0)) & (hwCfgMethod # HwCfgMethods[chipsetInd]) DO
  2675. INC(chipsetInd);
  2676. END;
  2677. ASSERT(i < LEN(HwCfgMethods,0));
  2678. GetDeviceName(hwCfgMethod,hwName);
  2679. IF DebugHWVer IN Debug THEN
  2680. KernelLog.String("Hardware Version: ");
  2681. IF hwName # "" THEN
  2682. KernelLog.String(hwName);
  2683. ELSE
  2684. KernelLog.String("Hardware Version is unknown");
  2685. END;
  2686. KernelLog.Ln;
  2687. END;
  2688. END IdentifyDevice;
  2689. (* Scan the PCI bus for the specified card. *)
  2690. PROCEDURE ScanPCI(vendor, device: LONGINT);
  2691. VAR
  2692. index, bus, dev, fct, res, irq, i: LONGINT; base: ADDRESS; d: LinkDevice; c: Controller; name: Plugins.Name;
  2693. hwCfgMethod, chipsetInd: LONGINT;
  2694. hwIcVerUnknown: BOOLEAN;
  2695. hwName: ARRAY 256 OF CHAR;
  2696. BEGIN
  2697. index := 0;
  2698. WHILE (PCI.FindPCIDevice(device, vendor, index, bus, dev, fct) = PCI.Done) & (installed < 16) DO
  2699. res := PCI.ReadConfigDword(bus, dev, fct, PCI.Adr2Reg, i); ASSERT(res = PCI.Done);
  2700. base := i; ASSERT(~ODD(base)); (* memory mapped *)
  2701. DEC(base, base MOD 16);
  2702. Machine.MapPhysical(base, 0FFH, base);
  2703. IdentifyDevice(base,hwCfgMethod,hwIcVerUnknown,chipsetInd,hwName);
  2704. IF hwCfgMethod # -1 THEN
  2705. res := PCI.ReadConfigByte(bus, dev, fct, PCI.IntlReg, irq); ASSERT(res = PCI.Done);
  2706. NEW(d, Network.TypeEthernet, MaxETHFrameSize - 14, 6);
  2707. COPY(hwName,name);
  2708. i := 0; WHILE name[i] # 0X DO INC(i) END;
  2709. name[i] := "#"; INC(i);
  2710. IF installed > 9 THEN
  2711. name[i] := CHR(ORD("A") + installed - 10);
  2712. ELSE
  2713. name[i] := CHR(ORD("0") + installed);
  2714. END;
  2715. name[i+1] := 0X;
  2716. IF DebugFind IN Debug THEN
  2717. KernelLog.String("Found device: ");
  2718. KernelLog.String(name);
  2719. KernelLog.String("; IRQ = ");
  2720. KernelLog.Int(irq, 0);
  2721. KernelLog.Ln;
  2722. END;
  2723. d.SetName(name);
  2724. d.desc := Description;
  2725. NEW(c, d, base, irq, bus,dev,fct,hwCfgMethod,chipsetInd,hwIcVerUnknown); (* increments "installed" when successful *)
  2726. IF DebugStatus IN Debug THEN
  2727. c.PrintStatus;
  2728. END;
  2729. ELSE
  2730. Machine.UnmapPhysical(base,0FFH);
  2731. END;
  2732. INC(index);
  2733. END
  2734. END ScanPCI;
  2735. PROCEDURE Install*;
  2736. BEGIN {EXCLUSIVE}
  2737. IF DebugFind IN Debug THEN
  2738. KernelLog.String("Searching devices...");
  2739. KernelLog.Ln
  2740. END;
  2741. IF installed = 0 THEN
  2742. ScanPCI(10ECH, 8136H); (* Vendor = RealTek, Device = RTL8101E *)
  2743. END;
  2744. IF DebugFind IN Debug THEN
  2745. KernelLog.String("Find finished.");
  2746. KernelLog.Ln
  2747. END;
  2748. END Install;
  2749. PROCEDURE DebugStati*;
  2750. VAR c: Controller;
  2751. BEGIN
  2752. c := installedControllers;
  2753. WHILE c # NIL DO
  2754. c.PrintStatus;
  2755. c := c.next;
  2756. END;
  2757. END DebugStati;
  2758. PROCEDURE TestDevices*;
  2759. VAR c: Controller;
  2760. BEGIN
  2761. c := installedControllers;
  2762. WHILE c # NIL DO
  2763. TestDevice(c);
  2764. c := c.next;
  2765. END;
  2766. END TestDevices;
  2767. PROCEDURE TestDevice(ctrl: Controller);
  2768. VAR
  2769. i, diff, bytes, times: LONGINT;
  2770. milliTimer : Kernel.MilliTimer;
  2771. data: ARRAY 1024 OF CHAR;
  2772. bw: REAL;
  2773. dst: Network.LinkAdr;
  2774. BEGIN
  2775. dst[0] := 000X;
  2776. dst[1] := 030X;
  2777. dst[2] := 04FX;
  2778. dst[3] := 025X;
  2779. dst[4] := 0BBX;
  2780. dst[5] := 0DBX;
  2781. IF ctrl # NIL THEN
  2782. ctrl.nRxFrames := 0;
  2783. ctrl.nTxFrames := 0;
  2784. (* fill the buffer *)
  2785. FOR i := 0 TO LEN(data)-1 DO
  2786. data[i] := CHR(i MOD 100H)
  2787. END;
  2788. Kernel.SetTimer(milliTimer, 0);
  2789. times := 1024;
  2790. FOR i := 1 TO times DO
  2791. ctrl.SendFrame(dst, 0DEADH, data, data, data, 0, 0, 0, LEN(data));
  2792. IF i MOD 1024 = 0 THEN
  2793. Delay(1);
  2794. END;
  2795. END;
  2796. diff := Kernel.Elapsed(milliTimer);
  2797. times := ctrl.nRxFrames * 2;
  2798. bytes := (LEN(data));
  2799. KernelLog.String("stats:"); KernelLog.Ln;
  2800. KernelLog.String("frame size = ");
  2801. KernelLog.Int(bytes, 0);
  2802. KernelLog.String("; num frames = ");
  2803. KernelLog.Int(times, 0);
  2804. KernelLog.String("; time = ");
  2805. KernelLog.Int(diff, 0); KernelLog.String("ms");
  2806. KernelLog.String("; bandwidth = ");
  2807. bw := bytes * 1.0 * times / (diff / 1000.0);
  2808. KernelLog.Int(ENTIER(bw / 1024), 0); KernelLog.String("KB/s, ");
  2809. KernelLog.Int(ENTIER(bw * 8 / 1000 / 1000), 0); KernelLog.String("Mbps"); KernelLog.Ln;
  2810. END
  2811. END TestDevice;
  2812. PROCEDURE Cleanup;
  2813. BEGIN
  2814. WHILE installedControllers # NIL DO
  2815. IF DebugCleanup IN Debug THEN
  2816. KernelLog.Ln;
  2817. KernelLog.String("Removing ");
  2818. KernelLog.String(installedControllers.dev.name);
  2819. KernelLog.Ln;
  2820. installedControllers.PrintStatus;
  2821. END;
  2822. installedControllers.Finalize;
  2823. installedControllers := installedControllers.next;
  2824. IF DebugCleanup IN Debug THEN
  2825. KernelLog.String("Success!");
  2826. KernelLog.Ln;
  2827. END;
  2828. END;
  2829. installedControllers := NIL;
  2830. END Cleanup;
  2831. PROCEDURE Delay(ms: LONGINT);
  2832. VAR
  2833. t: Kernel.MilliTimer;
  2834. BEGIN
  2835. Kernel.SetTimer(t, ms);
  2836. REPEAT UNTIL Kernel.Expired(t);
  2837. END Delay;
  2838. VAR
  2839. buf: ARRAY TxRingSize*SIZEOF(RxTxDescriptor)+256 OF CHAR;
  2840. PROCEDURE TestAlloc*;
  2841. VAR
  2842. addr, physAddr: ADDRESS;
  2843. dsc: ARRAY TxRingSize OF POINTER{UNSAFE,UNTRACED} TO RxTxDescriptor;
  2844. r: LONGINT;
  2845. BEGIN
  2846. addr := ADDRESSOF(buf[0]);
  2847. TRACE(addr);
  2848. physAddr := Machine.PhysicalAdr(addr,LEN(buf,0));
  2849. TRACE(physAddr);
  2850. r := physAddr MOD 256;
  2851. TRACE(r);
  2852. IF r # 0 THEN r := 256 - r; END;
  2853. INC(addr,r);
  2854. TRACE(addr);
  2855. FOR r := 0 TO TxRingSize-1 DO
  2856. dsc[r] := addr; INC(addr,SIZEOF(RxTxDescriptor));
  2857. dsc[r].flags := {31} + (S.VAL(SET, Network.MaxPacketSize) * {0..13});
  2858. dsc[r].vLanTag := 0;
  2859. dsc[r].bufAdrLo := Machine.Ensure32BitAddress (physAddr);
  2860. dsc[r].bufAdrHi := 0;
  2861. END;
  2862. TRACE(dsc[0],ADDRESSOF(dsc[0]^));
  2863. TRACE(dsc[0].flags);
  2864. END TestAlloc;
  2865. BEGIN
  2866. Modules.InstallTermHandler(Cleanup);
  2867. END RTL8136.
  2868. (*
  2869. MAC address 00-30-4F-25-BB-DB
  2870. MAC address 00-08-A1-3C-06-CB
  2871. local IP 129.132.134.209
  2872. SystemTools.Free RTL8136 ~
  2873. RTL8136.Install ~
  2874. WMPerfMon.Open ~
  2875. RTL8136.DebugStati ~
  2876. IP.IPConfig ~
  2877. RTL8136.TestDevices~
  2878. OFSTools.Mount RAM RamFS 300000 4096 ~
  2879. TestNet.SetDevice "RTL8105E#0" ~
  2880. TestNet.ShowDevices ~
  2881. TestNet.SendBroadcast ~
  2882. TestNet.SendBroadcastVar 1499 ~
  2883. TestNet.SendTest ^ 1 10 100 1000 ~
  2884. *)