pcnet.c 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153
  1. /*
  2. * QEMU AMD PC-Net II (Am79C970A) emulation
  3. *
  4. * Copyright (c) 2004 Antony T Curtis
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. /* This software was written to be compatible with the specification:
  25. * AMD Am79C970A PCnet-PCI II Ethernet Controller Data-Sheet
  26. * AMD Publication# 19436 Rev:E Amendment/0 Issue Date: June 2000
  27. */
  28. /*
  29. * On Sparc32, this is the Lance (Am7990) part of chip STP2000 (Master I/O), also
  30. * produced as NCR89C100. See
  31. * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C100.txt
  32. * and
  33. * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR92C990.txt
  34. */
  35. #include "hw.h"
  36. #include "pci.h"
  37. #include "net.h"
  38. #include "qemu-timer.h"
  39. #include "qemu_socket.h"
  40. //#define PCNET_DEBUG
  41. //#define PCNET_DEBUG_IO
  42. //#define PCNET_DEBUG_BCR
  43. //#define PCNET_DEBUG_CSR
  44. //#define PCNET_DEBUG_RMD
  45. //#define PCNET_DEBUG_TMD
  46. //#define PCNET_DEBUG_MATCH
  47. #define PCNET_IOPORT_SIZE 0x20
  48. #define PCNET_PNPMMIO_SIZE 0x20
  49. #define PCNET_LOOPTEST_CRC 1
  50. #define PCNET_LOOPTEST_NOCRC 2
  51. typedef struct PCNetState_st PCNetState;
  52. struct PCNetState_st {
  53. PCIDevice dev;
  54. PCIDevice *pci_dev;
  55. VLANClientState *vc;
  56. NICInfo *nd;
  57. QEMUTimer *poll_timer;
  58. int mmio_index, rap, isr, lnkst;
  59. uint32_t rdra, tdra;
  60. uint8_t prom[16];
  61. uint16_t csr[128];
  62. uint16_t bcr[32];
  63. uint64_t timer;
  64. int xmit_pos, recv_pos;
  65. uint8_t buffer[4096];
  66. int tx_busy;
  67. qemu_irq irq;
  68. qemu_irq *reset_irq;
  69. void (*phys_mem_read)(void *dma_opaque, target_phys_addr_t addr,
  70. uint8_t *buf, int len, int do_bswap);
  71. void (*phys_mem_write)(void *dma_opaque, target_phys_addr_t addr,
  72. uint8_t *buf, int len, int do_bswap);
  73. void *dma_opaque;
  74. int looptest;
  75. };
  76. struct qemu_ether_header {
  77. uint8_t ether_dhost[6];
  78. uint8_t ether_shost[6];
  79. uint16_t ether_type;
  80. };
  81. /* BUS CONFIGURATION REGISTERS */
  82. #define BCR_MSRDA 0
  83. #define BCR_MSWRA 1
  84. #define BCR_MC 2
  85. #define BCR_LNKST 4
  86. #define BCR_LED1 5
  87. #define BCR_LED2 6
  88. #define BCR_LED3 7
  89. #define BCR_FDC 9
  90. #define BCR_BSBC 18
  91. #define BCR_EECAS 19
  92. #define BCR_SWS 20
  93. #define BCR_PLAT 22
  94. #define BCR_DWIO(S) !!((S)->bcr[BCR_BSBC] & 0x0080)
  95. #define BCR_SSIZE32(S) !!((S)->bcr[BCR_SWS ] & 0x0100)
  96. #define BCR_SWSTYLE(S) ((S)->bcr[BCR_SWS ] & 0x00FF)
  97. #define CSR_INIT(S) !!(((S)->csr[0])&0x0001)
  98. #define CSR_STRT(S) !!(((S)->csr[0])&0x0002)
  99. #define CSR_STOP(S) !!(((S)->csr[0])&0x0004)
  100. #define CSR_TDMD(S) !!(((S)->csr[0])&0x0008)
  101. #define CSR_TXON(S) !!(((S)->csr[0])&0x0010)
  102. #define CSR_RXON(S) !!(((S)->csr[0])&0x0020)
  103. #define CSR_INEA(S) !!(((S)->csr[0])&0x0040)
  104. #define CSR_BSWP(S) !!(((S)->csr[3])&0x0004)
  105. #define CSR_LAPPEN(S) !!(((S)->csr[3])&0x0020)
  106. #define CSR_DXSUFLO(S) !!(((S)->csr[3])&0x0040)
  107. #define CSR_ASTRP_RCV(S) !!(((S)->csr[4])&0x0800)
  108. #define CSR_DPOLL(S) !!(((S)->csr[4])&0x1000)
  109. #define CSR_SPND(S) !!(((S)->csr[5])&0x0001)
  110. #define CSR_LTINTEN(S) !!(((S)->csr[5])&0x4000)
  111. #define CSR_TOKINTD(S) !!(((S)->csr[5])&0x8000)
  112. #define CSR_DRX(S) !!(((S)->csr[15])&0x0001)
  113. #define CSR_DTX(S) !!(((S)->csr[15])&0x0002)
  114. #define CSR_LOOP(S) !!(((S)->csr[15])&0x0004)
  115. #define CSR_DXMTFCS(S) !!(((S)->csr[15])&0x0008)
  116. #define CSR_DRCVPA(S) !!(((S)->csr[15])&0x2000)
  117. #define CSR_DRCVBC(S) !!(((S)->csr[15])&0x4000)
  118. #define CSR_PROM(S) !!(((S)->csr[15])&0x8000)
  119. #define CSR_CRBC(S) ((S)->csr[40])
  120. #define CSR_CRST(S) ((S)->csr[41])
  121. #define CSR_CXBC(S) ((S)->csr[42])
  122. #define CSR_CXST(S) ((S)->csr[43])
  123. #define CSR_NRBC(S) ((S)->csr[44])
  124. #define CSR_NRST(S) ((S)->csr[45])
  125. #define CSR_POLL(S) ((S)->csr[46])
  126. #define CSR_PINT(S) ((S)->csr[47])
  127. #define CSR_RCVRC(S) ((S)->csr[72])
  128. #define CSR_XMTRC(S) ((S)->csr[74])
  129. #define CSR_RCVRL(S) ((S)->csr[76])
  130. #define CSR_XMTRL(S) ((S)->csr[78])
  131. #define CSR_MISSC(S) ((S)->csr[112])
  132. #define CSR_IADR(S) ((S)->csr[ 1] | ((S)->csr[ 2] << 16))
  133. #define CSR_CRBA(S) ((S)->csr[18] | ((S)->csr[19] << 16))
  134. #define CSR_CXBA(S) ((S)->csr[20] | ((S)->csr[21] << 16))
  135. #define CSR_NRBA(S) ((S)->csr[22] | ((S)->csr[23] << 16))
  136. #define CSR_BADR(S) ((S)->csr[24] | ((S)->csr[25] << 16))
  137. #define CSR_NRDA(S) ((S)->csr[26] | ((S)->csr[27] << 16))
  138. #define CSR_CRDA(S) ((S)->csr[28] | ((S)->csr[29] << 16))
  139. #define CSR_BADX(S) ((S)->csr[30] | ((S)->csr[31] << 16))
  140. #define CSR_NXDA(S) ((S)->csr[32] | ((S)->csr[33] << 16))
  141. #define CSR_CXDA(S) ((S)->csr[34] | ((S)->csr[35] << 16))
  142. #define CSR_NNRD(S) ((S)->csr[36] | ((S)->csr[37] << 16))
  143. #define CSR_NNXD(S) ((S)->csr[38] | ((S)->csr[39] << 16))
  144. #define CSR_PXDA(S) ((S)->csr[60] | ((S)->csr[61] << 16))
  145. #define CSR_NXBA(S) ((S)->csr[64] | ((S)->csr[65] << 16))
  146. #define PHYSADDR(S,A) \
  147. (BCR_SSIZE32(S) ? (A) : (A) | ((0xff00 & (uint32_t)(s)->csr[2])<<16))
  148. struct pcnet_initblk16 {
  149. uint16_t mode;
  150. uint16_t padr[3];
  151. uint16_t ladrf[4];
  152. uint32_t rdra;
  153. uint32_t tdra;
  154. };
  155. struct pcnet_initblk32 {
  156. uint16_t mode;
  157. uint8_t rlen;
  158. uint8_t tlen;
  159. uint16_t padr[3];
  160. uint16_t _res;
  161. uint16_t ladrf[4];
  162. uint32_t rdra;
  163. uint32_t tdra;
  164. };
  165. struct pcnet_TMD {
  166. uint32_t tbadr;
  167. int16_t length;
  168. int16_t status;
  169. uint32_t misc;
  170. uint32_t res;
  171. };
  172. #define TMDL_BCNT_MASK 0x0fff
  173. #define TMDL_BCNT_SH 0
  174. #define TMDL_ONES_MASK 0xf000
  175. #define TMDL_ONES_SH 12
  176. #define TMDS_BPE_MASK 0x0080
  177. #define TMDS_BPE_SH 7
  178. #define TMDS_ENP_MASK 0x0100
  179. #define TMDS_ENP_SH 8
  180. #define TMDS_STP_MASK 0x0200
  181. #define TMDS_STP_SH 9
  182. #define TMDS_DEF_MASK 0x0400
  183. #define TMDS_DEF_SH 10
  184. #define TMDS_ONE_MASK 0x0800
  185. #define TMDS_ONE_SH 11
  186. #define TMDS_LTINT_MASK 0x1000
  187. #define TMDS_LTINT_SH 12
  188. #define TMDS_NOFCS_MASK 0x2000
  189. #define TMDS_NOFCS_SH 13
  190. #define TMDS_ADDFCS_MASK TMDS_NOFCS_MASK
  191. #define TMDS_ADDFCS_SH TMDS_NOFCS_SH
  192. #define TMDS_ERR_MASK 0x4000
  193. #define TMDS_ERR_SH 14
  194. #define TMDS_OWN_MASK 0x8000
  195. #define TMDS_OWN_SH 15
  196. #define TMDM_TRC_MASK 0x0000000f
  197. #define TMDM_TRC_SH 0
  198. #define TMDM_TDR_MASK 0x03ff0000
  199. #define TMDM_TDR_SH 16
  200. #define TMDM_RTRY_MASK 0x04000000
  201. #define TMDM_RTRY_SH 26
  202. #define TMDM_LCAR_MASK 0x08000000
  203. #define TMDM_LCAR_SH 27
  204. #define TMDM_LCOL_MASK 0x10000000
  205. #define TMDM_LCOL_SH 28
  206. #define TMDM_EXDEF_MASK 0x20000000
  207. #define TMDM_EXDEF_SH 29
  208. #define TMDM_UFLO_MASK 0x40000000
  209. #define TMDM_UFLO_SH 30
  210. #define TMDM_BUFF_MASK 0x80000000
  211. #define TMDM_BUFF_SH 31
  212. struct pcnet_RMD {
  213. uint32_t rbadr;
  214. int16_t buf_length;
  215. int16_t status;
  216. uint32_t msg_length;
  217. uint32_t res;
  218. };
  219. #define RMDL_BCNT_MASK 0x0fff
  220. #define RMDL_BCNT_SH 0
  221. #define RMDL_ONES_MASK 0xf000
  222. #define RMDL_ONES_SH 12
  223. #define RMDS_BAM_MASK 0x0010
  224. #define RMDS_BAM_SH 4
  225. #define RMDS_LFAM_MASK 0x0020
  226. #define RMDS_LFAM_SH 5
  227. #define RMDS_PAM_MASK 0x0040
  228. #define RMDS_PAM_SH 6
  229. #define RMDS_BPE_MASK 0x0080
  230. #define RMDS_BPE_SH 7
  231. #define RMDS_ENP_MASK 0x0100
  232. #define RMDS_ENP_SH 8
  233. #define RMDS_STP_MASK 0x0200
  234. #define RMDS_STP_SH 9
  235. #define RMDS_BUFF_MASK 0x0400
  236. #define RMDS_BUFF_SH 10
  237. #define RMDS_CRC_MASK 0x0800
  238. #define RMDS_CRC_SH 11
  239. #define RMDS_OFLO_MASK 0x1000
  240. #define RMDS_OFLO_SH 12
  241. #define RMDS_FRAM_MASK 0x2000
  242. #define RMDS_FRAM_SH 13
  243. #define RMDS_ERR_MASK 0x4000
  244. #define RMDS_ERR_SH 14
  245. #define RMDS_OWN_MASK 0x8000
  246. #define RMDS_OWN_SH 15
  247. #define RMDM_MCNT_MASK 0x00000fff
  248. #define RMDM_MCNT_SH 0
  249. #define RMDM_ZEROS_MASK 0x0000f000
  250. #define RMDM_ZEROS_SH 12
  251. #define RMDM_RPC_MASK 0x00ff0000
  252. #define RMDM_RPC_SH 16
  253. #define RMDM_RCC_MASK 0xff000000
  254. #define RMDM_RCC_SH 24
  255. #define SET_FIELD(regp, name, field, value) \
  256. (*(regp) = (*(regp) & ~(name ## _ ## field ## _MASK)) \
  257. | ((value) << name ## _ ## field ## _SH))
  258. #define GET_FIELD(reg, name, field) \
  259. (((reg) & name ## _ ## field ## _MASK) >> name ## _ ## field ## _SH)
  260. #define PRINT_TMD(T) printf( \
  261. "TMD0 : TBADR=0x%08x\n" \
  262. "TMD1 : OWN=%d, ERR=%d, FCS=%d, LTI=%d, " \
  263. "ONE=%d, DEF=%d, STP=%d, ENP=%d,\n" \
  264. " BPE=%d, BCNT=%d\n" \
  265. "TMD2 : BUF=%d, UFL=%d, EXD=%d, LCO=%d, " \
  266. "LCA=%d, RTR=%d,\n" \
  267. " TDR=%d, TRC=%d\n", \
  268. (T)->tbadr, \
  269. GET_FIELD((T)->status, TMDS, OWN), \
  270. GET_FIELD((T)->status, TMDS, ERR), \
  271. GET_FIELD((T)->status, TMDS, NOFCS), \
  272. GET_FIELD((T)->status, TMDS, LTINT), \
  273. GET_FIELD((T)->status, TMDS, ONE), \
  274. GET_FIELD((T)->status, TMDS, DEF), \
  275. GET_FIELD((T)->status, TMDS, STP), \
  276. GET_FIELD((T)->status, TMDS, ENP), \
  277. GET_FIELD((T)->status, TMDS, BPE), \
  278. 4096-GET_FIELD((T)->length, TMDL, BCNT), \
  279. GET_FIELD((T)->misc, TMDM, BUFF), \
  280. GET_FIELD((T)->misc, TMDM, UFLO), \
  281. GET_FIELD((T)->misc, TMDM, EXDEF), \
  282. GET_FIELD((T)->misc, TMDM, LCOL), \
  283. GET_FIELD((T)->misc, TMDM, LCAR), \
  284. GET_FIELD((T)->misc, TMDM, RTRY), \
  285. GET_FIELD((T)->misc, TMDM, TDR), \
  286. GET_FIELD((T)->misc, TMDM, TRC))
  287. #define PRINT_RMD(R) printf( \
  288. "RMD0 : RBADR=0x%08x\n" \
  289. "RMD1 : OWN=%d, ERR=%d, FRAM=%d, OFLO=%d, " \
  290. "CRC=%d, BUFF=%d, STP=%d, ENP=%d,\n " \
  291. "BPE=%d, PAM=%d, LAFM=%d, BAM=%d, ONES=%d, BCNT=%d\n" \
  292. "RMD2 : RCC=%d, RPC=%d, MCNT=%d, ZEROS=%d\n", \
  293. (R)->rbadr, \
  294. GET_FIELD((R)->status, RMDS, OWN), \
  295. GET_FIELD((R)->status, RMDS, ERR), \
  296. GET_FIELD((R)->status, RMDS, FRAM), \
  297. GET_FIELD((R)->status, RMDS, OFLO), \
  298. GET_FIELD((R)->status, RMDS, CRC), \
  299. GET_FIELD((R)->status, RMDS, BUFF), \
  300. GET_FIELD((R)->status, RMDS, STP), \
  301. GET_FIELD((R)->status, RMDS, ENP), \
  302. GET_FIELD((R)->status, RMDS, BPE), \
  303. GET_FIELD((R)->status, RMDS, PAM), \
  304. GET_FIELD((R)->status, RMDS, LFAM), \
  305. GET_FIELD((R)->status, RMDS, BAM), \
  306. GET_FIELD((R)->buf_length, RMDL, ONES), \
  307. 4096-GET_FIELD((R)->buf_length, RMDL, BCNT), \
  308. GET_FIELD((R)->msg_length, RMDM, RCC), \
  309. GET_FIELD((R)->msg_length, RMDM, RPC), \
  310. GET_FIELD((R)->msg_length, RMDM, MCNT), \
  311. GET_FIELD((R)->msg_length, RMDM, ZEROS))
  312. static inline void pcnet_tmd_load(PCNetState *s, struct pcnet_TMD *tmd,
  313. target_phys_addr_t addr)
  314. {
  315. if (!BCR_SSIZE32(s)) {
  316. struct {
  317. uint32_t tbadr;
  318. int16_t length;
  319. int16_t status;
  320. } xda;
  321. s->phys_mem_read(s->dma_opaque, addr, (void *)&xda, sizeof(xda), 0);
  322. tmd->tbadr = le32_to_cpu(xda.tbadr) & 0xffffff;
  323. tmd->length = le16_to_cpu(xda.length);
  324. tmd->status = (le32_to_cpu(xda.tbadr) >> 16) & 0xff00;
  325. tmd->misc = le16_to_cpu(xda.status) << 16;
  326. tmd->res = 0;
  327. } else {
  328. s->phys_mem_read(s->dma_opaque, addr, (void *)tmd, sizeof(*tmd), 0);
  329. le32_to_cpus(&tmd->tbadr);
  330. le16_to_cpus((uint16_t *)&tmd->length);
  331. le16_to_cpus((uint16_t *)&tmd->status);
  332. le32_to_cpus(&tmd->misc);
  333. le32_to_cpus(&tmd->res);
  334. if (BCR_SWSTYLE(s) == 3) {
  335. uint32_t tmp = tmd->tbadr;
  336. tmd->tbadr = tmd->misc;
  337. tmd->misc = tmp;
  338. }
  339. }
  340. }
  341. static inline void pcnet_tmd_store(PCNetState *s, const struct pcnet_TMD *tmd,
  342. target_phys_addr_t addr)
  343. {
  344. if (!BCR_SSIZE32(s)) {
  345. struct {
  346. uint32_t tbadr;
  347. int16_t length;
  348. int16_t status;
  349. } xda;
  350. xda.tbadr = cpu_to_le32((tmd->tbadr & 0xffffff) |
  351. ((tmd->status & 0xff00) << 16));
  352. xda.length = cpu_to_le16(tmd->length);
  353. xda.status = cpu_to_le16(tmd->misc >> 16);
  354. s->phys_mem_write(s->dma_opaque, addr, (void *)&xda, sizeof(xda), 0);
  355. } else {
  356. struct {
  357. uint32_t tbadr;
  358. int16_t length;
  359. int16_t status;
  360. uint32_t misc;
  361. uint32_t res;
  362. } xda;
  363. xda.tbadr = cpu_to_le32(tmd->tbadr);
  364. xda.length = cpu_to_le16(tmd->length);
  365. xda.status = cpu_to_le16(tmd->status);
  366. xda.misc = cpu_to_le32(tmd->misc);
  367. xda.res = cpu_to_le32(tmd->res);
  368. if (BCR_SWSTYLE(s) == 3) {
  369. uint32_t tmp = xda.tbadr;
  370. xda.tbadr = xda.misc;
  371. xda.misc = tmp;
  372. }
  373. s->phys_mem_write(s->dma_opaque, addr, (void *)&xda, sizeof(xda), 0);
  374. }
  375. }
  376. static inline void pcnet_rmd_load(PCNetState *s, struct pcnet_RMD *rmd,
  377. target_phys_addr_t addr)
  378. {
  379. if (!BCR_SSIZE32(s)) {
  380. struct {
  381. uint32_t rbadr;
  382. int16_t buf_length;
  383. int16_t msg_length;
  384. } rda;
  385. s->phys_mem_read(s->dma_opaque, addr, (void *)&rda, sizeof(rda), 0);
  386. rmd->rbadr = le32_to_cpu(rda.rbadr) & 0xffffff;
  387. rmd->buf_length = le16_to_cpu(rda.buf_length);
  388. rmd->status = (le32_to_cpu(rda.rbadr) >> 16) & 0xff00;
  389. rmd->msg_length = le16_to_cpu(rda.msg_length);
  390. rmd->res = 0;
  391. } else {
  392. s->phys_mem_read(s->dma_opaque, addr, (void *)rmd, sizeof(*rmd), 0);
  393. le32_to_cpus(&rmd->rbadr);
  394. le16_to_cpus((uint16_t *)&rmd->buf_length);
  395. le16_to_cpus((uint16_t *)&rmd->status);
  396. le32_to_cpus(&rmd->msg_length);
  397. le32_to_cpus(&rmd->res);
  398. if (BCR_SWSTYLE(s) == 3) {
  399. uint32_t tmp = rmd->rbadr;
  400. rmd->rbadr = rmd->msg_length;
  401. rmd->msg_length = tmp;
  402. }
  403. }
  404. }
  405. static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd,
  406. target_phys_addr_t addr)
  407. {
  408. if (!BCR_SSIZE32(s)) {
  409. struct {
  410. uint32_t rbadr;
  411. int16_t buf_length;
  412. int16_t msg_length;
  413. } rda;
  414. rda.rbadr = cpu_to_le32((rmd->rbadr & 0xffffff) |
  415. ((rmd->status & 0xff00) << 16));
  416. rda.buf_length = cpu_to_le16(rmd->buf_length);
  417. rda.msg_length = cpu_to_le16(rmd->msg_length);
  418. s->phys_mem_write(s->dma_opaque, addr, (void *)&rda, sizeof(rda), 0);
  419. } else {
  420. struct {
  421. uint32_t rbadr;
  422. int16_t buf_length;
  423. int16_t status;
  424. uint32_t msg_length;
  425. uint32_t res;
  426. } rda;
  427. rda.rbadr = cpu_to_le32(rmd->rbadr);
  428. rda.buf_length = cpu_to_le16(rmd->buf_length);
  429. rda.status = cpu_to_le16(rmd->status);
  430. rda.msg_length = cpu_to_le32(rmd->msg_length);
  431. rda.res = cpu_to_le32(rmd->res);
  432. if (BCR_SWSTYLE(s) == 3) {
  433. uint32_t tmp = rda.rbadr;
  434. rda.rbadr = rda.msg_length;
  435. rda.msg_length = tmp;
  436. }
  437. s->phys_mem_write(s->dma_opaque, addr, (void *)&rda, sizeof(rda), 0);
  438. }
  439. }
  440. #define TMDLOAD(TMD,ADDR) pcnet_tmd_load(s,TMD,ADDR)
  441. #define TMDSTORE(TMD,ADDR) pcnet_tmd_store(s,TMD,ADDR)
  442. #define RMDLOAD(RMD,ADDR) pcnet_rmd_load(s,RMD,ADDR)
  443. #define RMDSTORE(RMD,ADDR) pcnet_rmd_store(s,RMD,ADDR)
  444. #if 1
  445. #define CHECK_RMD(ADDR,RES) do { \
  446. struct pcnet_RMD rmd; \
  447. RMDLOAD(&rmd,(ADDR)); \
  448. (RES) |= (GET_FIELD(rmd.buf_length, RMDL, ONES) != 15) \
  449. || (GET_FIELD(rmd.msg_length, RMDM, ZEROS) != 0); \
  450. } while (0)
  451. #define CHECK_TMD(ADDR,RES) do { \
  452. struct pcnet_TMD tmd; \
  453. TMDLOAD(&tmd,(ADDR)); \
  454. (RES) |= (GET_FIELD(tmd.length, TMDL, ONES) != 15); \
  455. } while (0)
  456. #else
  457. #define CHECK_RMD(ADDR,RES) do { \
  458. switch (BCR_SWSTYLE(s)) { \
  459. case 0x00: \
  460. do { \
  461. uint16_t rda[4]; \
  462. s->phys_mem_read(s->dma_opaque, (ADDR), \
  463. (void *)&rda[0], sizeof(rda), 0); \
  464. (RES) |= (rda[2] & 0xf000)!=0xf000; \
  465. (RES) |= (rda[3] & 0xf000)!=0x0000; \
  466. } while (0); \
  467. break; \
  468. case 0x01: \
  469. case 0x02: \
  470. do { \
  471. uint32_t rda[4]; \
  472. s->phys_mem_read(s->dma_opaque, (ADDR), \
  473. (void *)&rda[0], sizeof(rda), 0); \
  474. (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \
  475. (RES) |= (rda[2] & 0x0000f000L)!=0x00000000L; \
  476. } while (0); \
  477. break; \
  478. case 0x03: \
  479. do { \
  480. uint32_t rda[4]; \
  481. s->phys_mem_read(s->dma_opaque, (ADDR), \
  482. (void *)&rda[0], sizeof(rda), 0); \
  483. (RES) |= (rda[0] & 0x0000f000L)!=0x00000000L; \
  484. (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \
  485. } while (0); \
  486. break; \
  487. } \
  488. } while (0)
  489. #define CHECK_TMD(ADDR,RES) do { \
  490. switch (BCR_SWSTYLE(s)) { \
  491. case 0x00: \
  492. do { \
  493. uint16_t xda[4]; \
  494. s->phys_mem_read(s->dma_opaque, (ADDR), \
  495. (void *)&xda[0], sizeof(xda), 0); \
  496. (RES) |= (xda[2] & 0xf000)!=0xf000; \
  497. } while (0); \
  498. break; \
  499. case 0x01: \
  500. case 0x02: \
  501. case 0x03: \
  502. do { \
  503. uint32_t xda[4]; \
  504. s->phys_mem_read(s->dma_opaque, (ADDR), \
  505. (void *)&xda[0], sizeof(xda), 0); \
  506. (RES) |= (xda[1] & 0x0000f000L)!=0x0000f000L; \
  507. } while (0); \
  508. break; \
  509. } \
  510. } while (0)
  511. #endif
  512. #define PRINT_PKTHDR(BUF) do { \
  513. struct qemu_ether_header *hdr = (void *)(BUF); \
  514. printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, " \
  515. "shost=%02x:%02x:%02x:%02x:%02x:%02x, " \
  516. "type=0x%04x\n", \
  517. hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2], \
  518. hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5], \
  519. hdr->ether_shost[0],hdr->ether_shost[1],hdr->ether_shost[2], \
  520. hdr->ether_shost[3],hdr->ether_shost[4],hdr->ether_shost[5], \
  521. be16_to_cpu(hdr->ether_type)); \
  522. } while (0)
  523. #define MULTICAST_FILTER_LEN 8
  524. static inline uint32_t lnc_mchash(const uint8_t *ether_addr)
  525. {
  526. #define LNC_POLYNOMIAL 0xEDB88320UL
  527. uint32_t crc = 0xFFFFFFFF;
  528. int idx, bit;
  529. uint8_t data;
  530. for (idx = 0; idx < 6; idx++) {
  531. for (data = *ether_addr++, bit = 0; bit < MULTICAST_FILTER_LEN; bit++) {
  532. crc = (crc >> 1) ^ (((crc ^ data) & 1) ? LNC_POLYNOMIAL : 0);
  533. data >>= 1;
  534. }
  535. }
  536. return crc;
  537. #undef LNC_POLYNOMIAL
  538. }
  539. #define CRC(crc, ch) (crc = (crc >> 8) ^ crctab[(crc ^ (ch)) & 0xff])
  540. /* generated using the AUTODIN II polynomial
  541. * x^32 + x^26 + x^23 + x^22 + x^16 +
  542. * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1
  543. */
  544. static const uint32_t crctab[256] = {
  545. 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
  546. 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
  547. 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
  548. 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
  549. 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
  550. 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  551. 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
  552. 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
  553. 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
  554. 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  555. 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
  556. 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  557. 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
  558. 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
  559. 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
  560. 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
  561. 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
  562. 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  563. 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
  564. 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  565. 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
  566. 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
  567. 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
  568. 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  569. 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
  570. 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
  571. 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
  572. 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
  573. 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
  574. 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  575. 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
  576. 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
  577. 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
  578. 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
  579. 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
  580. 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  581. 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
  582. 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
  583. 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
  584. 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  585. 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
  586. 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  587. 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
  588. 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
  589. 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
  590. 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
  591. 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
  592. 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  593. 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
  594. 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  595. 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
  596. 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
  597. 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
  598. 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  599. 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
  600. 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
  601. 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
  602. 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
  603. 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
  604. 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  605. 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
  606. 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
  607. 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
  608. 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
  609. };
  610. static inline int padr_match(PCNetState *s, const uint8_t *buf, int size)
  611. {
  612. struct qemu_ether_header *hdr = (void *)buf;
  613. uint8_t padr[6] = {
  614. s->csr[12] & 0xff, s->csr[12] >> 8,
  615. s->csr[13] & 0xff, s->csr[13] >> 8,
  616. s->csr[14] & 0xff, s->csr[14] >> 8
  617. };
  618. int result = (!CSR_DRCVPA(s)) && !memcmp(hdr->ether_dhost, padr, 6);
  619. #ifdef PCNET_DEBUG_MATCH
  620. printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, "
  621. "padr=%02x:%02x:%02x:%02x:%02x:%02x\n",
  622. hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2],
  623. hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5],
  624. padr[0],padr[1],padr[2],padr[3],padr[4],padr[5]);
  625. printf("padr_match result=%d\n", result);
  626. #endif
  627. return result;
  628. }
  629. static inline int padr_bcast(PCNetState *s, const uint8_t *buf, int size)
  630. {
  631. static const uint8_t BCAST[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  632. struct qemu_ether_header *hdr = (void *)buf;
  633. int result = !CSR_DRCVBC(s) && !memcmp(hdr->ether_dhost, BCAST, 6);
  634. #ifdef PCNET_DEBUG_MATCH
  635. printf("padr_bcast result=%d\n", result);
  636. #endif
  637. return result;
  638. }
  639. static inline int ladr_match(PCNetState *s, const uint8_t *buf, int size)
  640. {
  641. struct qemu_ether_header *hdr = (void *)buf;
  642. if ((*(hdr->ether_dhost)&0x01) &&
  643. ((uint64_t *)&s->csr[8])[0] != 0LL) {
  644. uint8_t ladr[8] = {
  645. s->csr[8] & 0xff, s->csr[8] >> 8,
  646. s->csr[9] & 0xff, s->csr[9] >> 8,
  647. s->csr[10] & 0xff, s->csr[10] >> 8,
  648. s->csr[11] & 0xff, s->csr[11] >> 8
  649. };
  650. int index = lnc_mchash(hdr->ether_dhost) >> 26;
  651. return !!(ladr[index >> 3] & (1 << (index & 7)));
  652. }
  653. return 0;
  654. }
  655. static inline target_phys_addr_t pcnet_rdra_addr(PCNetState *s, int idx)
  656. {
  657. while (idx < 1) idx += CSR_RCVRL(s);
  658. return s->rdra + ((CSR_RCVRL(s) - idx) * (BCR_SWSTYLE(s) ? 16 : 8));
  659. }
  660. static inline int64_t pcnet_get_next_poll_time(PCNetState *s, int64_t current_time)
  661. {
  662. int64_t next_time = current_time +
  663. muldiv64(65536 - (CSR_SPND(s) ? 0 : CSR_POLL(s)),
  664. ticks_per_sec, 33000000L);
  665. if (next_time <= current_time)
  666. next_time = current_time + 1;
  667. return next_time;
  668. }
  669. static void pcnet_poll(PCNetState *s);
  670. static void pcnet_poll_timer(void *opaque);
  671. static uint32_t pcnet_csr_readw(PCNetState *s, uint32_t rap);
  672. static void pcnet_csr_writew(PCNetState *s, uint32_t rap, uint32_t new_value);
  673. static void pcnet_bcr_writew(PCNetState *s, uint32_t rap, uint32_t val);
  674. static uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap);
  675. static void pcnet_s_reset(PCNetState *s)
  676. {
  677. #ifdef PCNET_DEBUG
  678. printf("pcnet_s_reset\n");
  679. #endif
  680. s->lnkst = 0x40;
  681. s->rdra = 0;
  682. s->tdra = 0;
  683. s->rap = 0;
  684. s->bcr[BCR_BSBC] &= ~0x0080;
  685. s->csr[0] = 0x0004;
  686. s->csr[3] = 0x0000;
  687. s->csr[4] = 0x0115;
  688. s->csr[5] = 0x0000;
  689. s->csr[6] = 0x0000;
  690. s->csr[8] = 0;
  691. s->csr[9] = 0;
  692. s->csr[10] = 0;
  693. s->csr[11] = 0;
  694. s->csr[12] = le16_to_cpu(((uint16_t *)&s->prom[0])[0]);
  695. s->csr[13] = le16_to_cpu(((uint16_t *)&s->prom[0])[1]);
  696. s->csr[14] = le16_to_cpu(((uint16_t *)&s->prom[0])[2]);
  697. s->csr[15] &= 0x21c4;
  698. s->csr[72] = 1;
  699. s->csr[74] = 1;
  700. s->csr[76] = 1;
  701. s->csr[78] = 1;
  702. s->csr[80] = 0x1410;
  703. s->csr[88] = 0x1003;
  704. s->csr[89] = 0x0262;
  705. s->csr[94] = 0x0000;
  706. s->csr[100] = 0x0200;
  707. s->csr[103] = 0x0105;
  708. s->csr[103] = 0x0105;
  709. s->csr[112] = 0x0000;
  710. s->csr[114] = 0x0000;
  711. s->csr[122] = 0x0000;
  712. s->csr[124] = 0x0000;
  713. s->tx_busy = 0;
  714. }
  715. static void pcnet_update_irq(PCNetState *s)
  716. {
  717. int isr = 0;
  718. s->csr[0] &= ~0x0080;
  719. #if 1
  720. if (((s->csr[0] & ~s->csr[3]) & 0x5f00) ||
  721. (((s->csr[4]>>1) & ~s->csr[4]) & 0x0115) ||
  722. (((s->csr[5]>>1) & s->csr[5]) & 0x0048))
  723. #else
  724. if ((!(s->csr[3] & 0x4000) && !!(s->csr[0] & 0x4000)) /* BABL */ ||
  725. (!(s->csr[3] & 0x1000) && !!(s->csr[0] & 0x1000)) /* MISS */ ||
  726. (!(s->csr[3] & 0x0100) && !!(s->csr[0] & 0x0100)) /* IDON */ ||
  727. (!(s->csr[3] & 0x0200) && !!(s->csr[0] & 0x0200)) /* TINT */ ||
  728. (!(s->csr[3] & 0x0400) && !!(s->csr[0] & 0x0400)) /* RINT */ ||
  729. (!(s->csr[3] & 0x0800) && !!(s->csr[0] & 0x0800)) /* MERR */ ||
  730. (!(s->csr[4] & 0x0001) && !!(s->csr[4] & 0x0002)) /* JAB */ ||
  731. (!(s->csr[4] & 0x0004) && !!(s->csr[4] & 0x0008)) /* TXSTRT */ ||
  732. (!(s->csr[4] & 0x0010) && !!(s->csr[4] & 0x0020)) /* RCVO */ ||
  733. (!(s->csr[4] & 0x0100) && !!(s->csr[4] & 0x0200)) /* MFCO */ ||
  734. (!!(s->csr[5] & 0x0040) && !!(s->csr[5] & 0x0080)) /* EXDINT */ ||
  735. (!!(s->csr[5] & 0x0008) && !!(s->csr[5] & 0x0010)) /* MPINT */)
  736. #endif
  737. {
  738. isr = CSR_INEA(s);
  739. s->csr[0] |= 0x0080;
  740. }
  741. if (!!(s->csr[4] & 0x0080) && CSR_INEA(s)) { /* UINT */
  742. s->csr[4] &= ~0x0080;
  743. s->csr[4] |= 0x0040;
  744. s->csr[0] |= 0x0080;
  745. isr = 1;
  746. #ifdef PCNET_DEBUG
  747. printf("pcnet user int\n");
  748. #endif
  749. }
  750. #if 1
  751. if (((s->csr[5]>>1) & s->csr[5]) & 0x0500)
  752. #else
  753. if ((!!(s->csr[5] & 0x0400) && !!(s->csr[5] & 0x0800)) /* SINT */ ||
  754. (!!(s->csr[5] & 0x0100) && !!(s->csr[5] & 0x0200)) /* SLPINT */ )
  755. #endif
  756. {
  757. isr = 1;
  758. s->csr[0] |= 0x0080;
  759. }
  760. if (isr != s->isr) {
  761. #ifdef PCNET_DEBUG
  762. printf("pcnet: INTA=%d\n", isr);
  763. #endif
  764. }
  765. qemu_set_irq(s->irq, isr);
  766. s->isr = isr;
  767. }
  768. static void pcnet_init(PCNetState *s)
  769. {
  770. int rlen, tlen;
  771. uint16_t padr[3], ladrf[4], mode;
  772. uint32_t rdra, tdra;
  773. #ifdef PCNET_DEBUG
  774. printf("pcnet_init init_addr=0x%08x\n", PHYSADDR(s,CSR_IADR(s)));
  775. #endif
  776. if (BCR_SSIZE32(s)) {
  777. struct pcnet_initblk32 initblk;
  778. s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)),
  779. (uint8_t *)&initblk, sizeof(initblk), 0);
  780. mode = le16_to_cpu(initblk.mode);
  781. rlen = initblk.rlen >> 4;
  782. tlen = initblk.tlen >> 4;
  783. ladrf[0] = le16_to_cpu(initblk.ladrf[0]);
  784. ladrf[1] = le16_to_cpu(initblk.ladrf[1]);
  785. ladrf[2] = le16_to_cpu(initblk.ladrf[2]);
  786. ladrf[3] = le16_to_cpu(initblk.ladrf[3]);
  787. padr[0] = le16_to_cpu(initblk.padr[0]);
  788. padr[1] = le16_to_cpu(initblk.padr[1]);
  789. padr[2] = le16_to_cpu(initblk.padr[2]);
  790. rdra = le32_to_cpu(initblk.rdra);
  791. tdra = le32_to_cpu(initblk.tdra);
  792. } else {
  793. struct pcnet_initblk16 initblk;
  794. s->phys_mem_read(s->dma_opaque, PHYSADDR(s,CSR_IADR(s)),
  795. (uint8_t *)&initblk, sizeof(initblk), 0);
  796. mode = le16_to_cpu(initblk.mode);
  797. ladrf[0] = le16_to_cpu(initblk.ladrf[0]);
  798. ladrf[1] = le16_to_cpu(initblk.ladrf[1]);
  799. ladrf[2] = le16_to_cpu(initblk.ladrf[2]);
  800. ladrf[3] = le16_to_cpu(initblk.ladrf[3]);
  801. padr[0] = le16_to_cpu(initblk.padr[0]);
  802. padr[1] = le16_to_cpu(initblk.padr[1]);
  803. padr[2] = le16_to_cpu(initblk.padr[2]);
  804. rdra = le32_to_cpu(initblk.rdra);
  805. tdra = le32_to_cpu(initblk.tdra);
  806. rlen = rdra >> 29;
  807. tlen = tdra >> 29;
  808. rdra &= 0x00ffffff;
  809. tdra &= 0x00ffffff;
  810. }
  811. #if defined(PCNET_DEBUG)
  812. printf("rlen=%d tlen=%d\n", rlen, tlen);
  813. #endif
  814. CSR_RCVRL(s) = (rlen < 9) ? (1 << rlen) : 512;
  815. CSR_XMTRL(s) = (tlen < 9) ? (1 << tlen) : 512;
  816. s->csr[ 6] = (tlen << 12) | (rlen << 8);
  817. s->csr[15] = mode;
  818. s->csr[ 8] = ladrf[0];
  819. s->csr[ 9] = ladrf[1];
  820. s->csr[10] = ladrf[2];
  821. s->csr[11] = ladrf[3];
  822. s->csr[12] = padr[0];
  823. s->csr[13] = padr[1];
  824. s->csr[14] = padr[2];
  825. s->rdra = PHYSADDR(s, rdra);
  826. s->tdra = PHYSADDR(s, tdra);
  827. CSR_RCVRC(s) = CSR_RCVRL(s);
  828. CSR_XMTRC(s) = CSR_XMTRL(s);
  829. #ifdef PCNET_DEBUG
  830. printf("pcnet ss32=%d rdra=0x%08x[%d] tdra=0x%08x[%d]\n",
  831. BCR_SSIZE32(s),
  832. s->rdra, CSR_RCVRL(s), s->tdra, CSR_XMTRL(s));
  833. #endif
  834. s->csr[0] |= 0x0101;
  835. s->csr[0] &= ~0x0004; /* clear STOP bit */
  836. }
  837. static void pcnet_start(PCNetState *s)
  838. {
  839. #ifdef PCNET_DEBUG
  840. printf("pcnet_start\n");
  841. #endif
  842. if (!CSR_DTX(s))
  843. s->csr[0] |= 0x0010; /* set TXON */
  844. if (!CSR_DRX(s))
  845. s->csr[0] |= 0x0020; /* set RXON */
  846. s->csr[0] &= ~0x0004; /* clear STOP bit */
  847. s->csr[0] |= 0x0002;
  848. }
  849. static void pcnet_stop(PCNetState *s)
  850. {
  851. #ifdef PCNET_DEBUG
  852. printf("pcnet_stop\n");
  853. #endif
  854. s->csr[0] &= ~0x7feb;
  855. s->csr[0] |= 0x0014;
  856. s->csr[4] &= ~0x02c2;
  857. s->csr[5] &= ~0x0011;
  858. pcnet_poll_timer(s);
  859. }
  860. static void pcnet_rdte_poll(PCNetState *s)
  861. {
  862. s->csr[28] = s->csr[29] = 0;
  863. if (s->rdra) {
  864. int bad = 0;
  865. #if 1
  866. target_phys_addr_t crda = pcnet_rdra_addr(s, CSR_RCVRC(s));
  867. target_phys_addr_t nrda = pcnet_rdra_addr(s, -1 + CSR_RCVRC(s));
  868. target_phys_addr_t nnrd = pcnet_rdra_addr(s, -2 + CSR_RCVRC(s));
  869. #else
  870. target_phys_addr_t crda = s->rdra +
  871. (CSR_RCVRL(s) - CSR_RCVRC(s)) *
  872. (BCR_SWSTYLE(s) ? 16 : 8 );
  873. int nrdc = CSR_RCVRC(s)<=1 ? CSR_RCVRL(s) : CSR_RCVRC(s)-1;
  874. target_phys_addr_t nrda = s->rdra +
  875. (CSR_RCVRL(s) - nrdc) *
  876. (BCR_SWSTYLE(s) ? 16 : 8 );
  877. int nnrc = nrdc<=1 ? CSR_RCVRL(s) : nrdc-1;
  878. target_phys_addr_t nnrd = s->rdra +
  879. (CSR_RCVRL(s) - nnrc) *
  880. (BCR_SWSTYLE(s) ? 16 : 8 );
  881. #endif
  882. CHECK_RMD(PHYSADDR(s,crda), bad);
  883. if (!bad) {
  884. CHECK_RMD(PHYSADDR(s,nrda), bad);
  885. if (bad || (nrda == crda)) nrda = 0;
  886. CHECK_RMD(PHYSADDR(s,nnrd), bad);
  887. if (bad || (nnrd == crda)) nnrd = 0;
  888. s->csr[28] = crda & 0xffff;
  889. s->csr[29] = crda >> 16;
  890. s->csr[26] = nrda & 0xffff;
  891. s->csr[27] = nrda >> 16;
  892. s->csr[36] = nnrd & 0xffff;
  893. s->csr[37] = nnrd >> 16;
  894. #ifdef PCNET_DEBUG
  895. if (bad) {
  896. printf("pcnet: BAD RMD RECORDS AFTER 0x" TARGET_FMT_plx "\n",
  897. PHYSADDR(s,crda));
  898. }
  899. } else {
  900. printf("pcnet: BAD RMD RDA=0x" TARGET_FMT_plx "\n",
  901. PHYSADDR(s,crda));
  902. #endif
  903. }
  904. }
  905. if (CSR_CRDA(s)) {
  906. struct pcnet_RMD rmd;
  907. RMDLOAD(&rmd, PHYSADDR(s,CSR_CRDA(s)));
  908. CSR_CRBC(s) = GET_FIELD(rmd.buf_length, RMDL, BCNT);
  909. CSR_CRST(s) = rmd.status;
  910. #ifdef PCNET_DEBUG_RMD_X
  911. printf("CRDA=0x%08x CRST=0x%04x RCVRC=%d RMDL=0x%04x RMDS=0x%04x RMDM=0x%08x\n",
  912. PHYSADDR(s,CSR_CRDA(s)), CSR_CRST(s), CSR_RCVRC(s),
  913. rmd.buf_length, rmd.status, rmd.msg_length);
  914. PRINT_RMD(&rmd);
  915. #endif
  916. } else {
  917. CSR_CRBC(s) = CSR_CRST(s) = 0;
  918. }
  919. if (CSR_NRDA(s)) {
  920. struct pcnet_RMD rmd;
  921. RMDLOAD(&rmd, PHYSADDR(s,CSR_NRDA(s)));
  922. CSR_NRBC(s) = GET_FIELD(rmd.buf_length, RMDL, BCNT);
  923. CSR_NRST(s) = rmd.status;
  924. } else {
  925. CSR_NRBC(s) = CSR_NRST(s) = 0;
  926. }
  927. }
  928. static int pcnet_tdte_poll(PCNetState *s)
  929. {
  930. s->csr[34] = s->csr[35] = 0;
  931. if (s->tdra) {
  932. target_phys_addr_t cxda = s->tdra +
  933. (CSR_XMTRL(s) - CSR_XMTRC(s)) *
  934. (BCR_SWSTYLE(s) ? 16 : 8);
  935. int bad = 0;
  936. CHECK_TMD(PHYSADDR(s, cxda),bad);
  937. if (!bad) {
  938. if (CSR_CXDA(s) != cxda) {
  939. s->csr[60] = s->csr[34];
  940. s->csr[61] = s->csr[35];
  941. s->csr[62] = CSR_CXBC(s);
  942. s->csr[63] = CSR_CXST(s);
  943. }
  944. s->csr[34] = cxda & 0xffff;
  945. s->csr[35] = cxda >> 16;
  946. #ifdef PCNET_DEBUG_X
  947. printf("pcnet: BAD TMD XDA=0x%08x\n", PHYSADDR(s,cxda));
  948. #endif
  949. }
  950. }
  951. if (CSR_CXDA(s)) {
  952. struct pcnet_TMD tmd;
  953. TMDLOAD(&tmd, PHYSADDR(s,CSR_CXDA(s)));
  954. CSR_CXBC(s) = GET_FIELD(tmd.length, TMDL, BCNT);
  955. CSR_CXST(s) = tmd.status;
  956. } else {
  957. CSR_CXBC(s) = CSR_CXST(s) = 0;
  958. }
  959. return !!(CSR_CXST(s) & 0x8000);
  960. }
  961. static int pcnet_can_receive(void *opaque)
  962. {
  963. PCNetState *s = opaque;
  964. if (CSR_STOP(s) || CSR_SPND(s))
  965. return 0;
  966. if (s->recv_pos > 0)
  967. return 0;
  968. return sizeof(s->buffer)-16;
  969. }
  970. #define MIN_BUF_SIZE 60
  971. static void pcnet_receive(void *opaque, const uint8_t *buf, int size)
  972. {
  973. PCNetState *s = opaque;
  974. int is_padr = 0, is_bcast = 0, is_ladr = 0;
  975. uint8_t buf1[60];
  976. int remaining;
  977. int crc_err = 0;
  978. if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size)
  979. return;
  980. #ifdef PCNET_DEBUG
  981. printf("pcnet_receive size=%d\n", size);
  982. #endif
  983. /* if too small buffer, then expand it */
  984. if (size < MIN_BUF_SIZE) {
  985. memcpy(buf1, buf, size);
  986. memset(buf1 + size, 0, MIN_BUF_SIZE - size);
  987. buf = buf1;
  988. size = MIN_BUF_SIZE;
  989. }
  990. if (CSR_PROM(s)
  991. || (is_padr=padr_match(s, buf, size))
  992. || (is_bcast=padr_bcast(s, buf, size))
  993. || (is_ladr=ladr_match(s, buf, size))) {
  994. pcnet_rdte_poll(s);
  995. if (!(CSR_CRST(s) & 0x8000) && s->rdra) {
  996. struct pcnet_RMD rmd;
  997. int rcvrc = CSR_RCVRC(s)-1,i;
  998. target_phys_addr_t nrda;
  999. for (i = CSR_RCVRL(s)-1; i > 0; i--, rcvrc--) {
  1000. if (rcvrc <= 1)
  1001. rcvrc = CSR_RCVRL(s);
  1002. nrda = s->rdra +
  1003. (CSR_RCVRL(s) - rcvrc) *
  1004. (BCR_SWSTYLE(s) ? 16 : 8 );
  1005. RMDLOAD(&rmd, PHYSADDR(s,nrda));
  1006. if (GET_FIELD(rmd.status, RMDS, OWN)) {
  1007. #ifdef PCNET_DEBUG_RMD
  1008. printf("pcnet - scan buffer: RCVRC=%d PREV_RCVRC=%d\n",
  1009. rcvrc, CSR_RCVRC(s));
  1010. #endif
  1011. CSR_RCVRC(s) = rcvrc;
  1012. pcnet_rdte_poll(s);
  1013. break;
  1014. }
  1015. }
  1016. }
  1017. if (!(CSR_CRST(s) & 0x8000)) {
  1018. #ifdef PCNET_DEBUG_RMD
  1019. printf("pcnet - no buffer: RCVRC=%d\n", CSR_RCVRC(s));
  1020. #endif
  1021. s->csr[0] |= 0x1000; /* Set MISS flag */
  1022. CSR_MISSC(s)++;
  1023. } else {
  1024. uint8_t *src = s->buffer;
  1025. target_phys_addr_t crda = CSR_CRDA(s);
  1026. struct pcnet_RMD rmd;
  1027. int pktcount = 0;
  1028. if (!s->looptest) {
  1029. memcpy(src, buf, size);
  1030. /* no need to compute the CRC */
  1031. src[size] = 0;
  1032. src[size + 1] = 0;
  1033. src[size + 2] = 0;
  1034. src[size + 3] = 0;
  1035. size += 4;
  1036. } else if (s->looptest == PCNET_LOOPTEST_CRC ||
  1037. !CSR_DXMTFCS(s) || size < MIN_BUF_SIZE+4) {
  1038. uint32_t fcs = ~0;
  1039. uint8_t *p = src;
  1040. while (p != &src[size])
  1041. CRC(fcs, *p++);
  1042. *(uint32_t *)p = htonl(fcs);
  1043. size += 4;
  1044. } else {
  1045. uint32_t fcs = ~0;
  1046. uint8_t *p = src;
  1047. while (p != &src[size-4])
  1048. CRC(fcs, *p++);
  1049. crc_err = (*(uint32_t *)p != htonl(fcs));
  1050. }
  1051. #ifdef PCNET_DEBUG_MATCH
  1052. PRINT_PKTHDR(buf);
  1053. #endif
  1054. RMDLOAD(&rmd, PHYSADDR(s,crda));
  1055. /*if (!CSR_LAPPEN(s))*/
  1056. SET_FIELD(&rmd.status, RMDS, STP, 1);
  1057. #define PCNET_RECV_STORE() do { \
  1058. int count = MIN(4096 - GET_FIELD(rmd.buf_length, RMDL, BCNT),remaining); \
  1059. target_phys_addr_t rbadr = PHYSADDR(s, rmd.rbadr); \
  1060. s->phys_mem_write(s->dma_opaque, rbadr, src, count, CSR_BSWP(s)); \
  1061. src += count; remaining -= count; \
  1062. SET_FIELD(&rmd.status, RMDS, OWN, 0); \
  1063. RMDSTORE(&rmd, PHYSADDR(s,crda)); \
  1064. pktcount++; \
  1065. } while (0)
  1066. remaining = size;
  1067. PCNET_RECV_STORE();
  1068. if ((remaining > 0) && CSR_NRDA(s)) {
  1069. target_phys_addr_t nrda = CSR_NRDA(s);
  1070. #ifdef PCNET_DEBUG_RMD
  1071. PRINT_RMD(&rmd);
  1072. #endif
  1073. RMDLOAD(&rmd, PHYSADDR(s,nrda));
  1074. if (GET_FIELD(rmd.status, RMDS, OWN)) {
  1075. crda = nrda;
  1076. PCNET_RECV_STORE();
  1077. #ifdef PCNET_DEBUG_RMD
  1078. PRINT_RMD(&rmd);
  1079. #endif
  1080. if ((remaining > 0) && (nrda=CSR_NNRD(s))) {
  1081. RMDLOAD(&rmd, PHYSADDR(s,nrda));
  1082. if (GET_FIELD(rmd.status, RMDS, OWN)) {
  1083. crda = nrda;
  1084. PCNET_RECV_STORE();
  1085. }
  1086. }
  1087. }
  1088. }
  1089. #undef PCNET_RECV_STORE
  1090. RMDLOAD(&rmd, PHYSADDR(s,crda));
  1091. if (remaining == 0) {
  1092. SET_FIELD(&rmd.msg_length, RMDM, MCNT, size);
  1093. SET_FIELD(&rmd.status, RMDS, ENP, 1);
  1094. SET_FIELD(&rmd.status, RMDS, PAM, !CSR_PROM(s) && is_padr);
  1095. SET_FIELD(&rmd.status, RMDS, LFAM, !CSR_PROM(s) && is_ladr);
  1096. SET_FIELD(&rmd.status, RMDS, BAM, !CSR_PROM(s) && is_bcast);
  1097. if (crc_err) {
  1098. SET_FIELD(&rmd.status, RMDS, CRC, 1);
  1099. SET_FIELD(&rmd.status, RMDS, ERR, 1);
  1100. }
  1101. } else {
  1102. SET_FIELD(&rmd.status, RMDS, OFLO, 1);
  1103. SET_FIELD(&rmd.status, RMDS, BUFF, 1);
  1104. SET_FIELD(&rmd.status, RMDS, ERR, 1);
  1105. }
  1106. RMDSTORE(&rmd, PHYSADDR(s,crda));
  1107. s->csr[0] |= 0x0400;
  1108. #ifdef PCNET_DEBUG
  1109. printf("RCVRC=%d CRDA=0x%08x BLKS=%d\n",
  1110. CSR_RCVRC(s), PHYSADDR(s,CSR_CRDA(s)), pktcount);
  1111. #endif
  1112. #ifdef PCNET_DEBUG_RMD
  1113. PRINT_RMD(&rmd);
  1114. #endif
  1115. while (pktcount--) {
  1116. if (CSR_RCVRC(s) <= 1)
  1117. CSR_RCVRC(s) = CSR_RCVRL(s);
  1118. else
  1119. CSR_RCVRC(s)--;
  1120. }
  1121. pcnet_rdte_poll(s);
  1122. }
  1123. }
  1124. pcnet_poll(s);
  1125. pcnet_update_irq(s);
  1126. }
  1127. static void pcnet_transmit(PCNetState *s)
  1128. {
  1129. target_phys_addr_t xmit_cxda = 0;
  1130. int count = CSR_XMTRL(s)-1;
  1131. int add_crc = 0;
  1132. s->xmit_pos = -1;
  1133. if (!CSR_TXON(s)) {
  1134. s->csr[0] &= ~0x0008;
  1135. return;
  1136. }
  1137. s->tx_busy = 1;
  1138. txagain:
  1139. if (pcnet_tdte_poll(s)) {
  1140. struct pcnet_TMD tmd;
  1141. TMDLOAD(&tmd, PHYSADDR(s,CSR_CXDA(s)));
  1142. #ifdef PCNET_DEBUG_TMD
  1143. printf(" TMDLOAD 0x%08x\n", PHYSADDR(s,CSR_CXDA(s)));
  1144. PRINT_TMD(&tmd);
  1145. #endif
  1146. if (GET_FIELD(tmd.status, TMDS, STP)) {
  1147. s->xmit_pos = 0;
  1148. xmit_cxda = PHYSADDR(s,CSR_CXDA(s));
  1149. if (BCR_SWSTYLE(s) != 1)
  1150. add_crc = GET_FIELD(tmd.status, TMDS, ADDFCS);
  1151. }
  1152. if (!GET_FIELD(tmd.status, TMDS, ENP)) {
  1153. int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);
  1154. s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),
  1155. s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));
  1156. s->xmit_pos += bcnt;
  1157. } else if (s->xmit_pos >= 0) {
  1158. int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);
  1159. s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),
  1160. s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));
  1161. s->xmit_pos += bcnt;
  1162. #ifdef PCNET_DEBUG
  1163. printf("pcnet_transmit size=%d\n", s->xmit_pos);
  1164. #endif
  1165. if (CSR_LOOP(s)) {
  1166. if (BCR_SWSTYLE(s) == 1)
  1167. add_crc = !GET_FIELD(tmd.status, TMDS, NOFCS);
  1168. s->looptest = add_crc ? PCNET_LOOPTEST_CRC : PCNET_LOOPTEST_NOCRC;
  1169. pcnet_receive(s, s->buffer, s->xmit_pos);
  1170. s->looptest = 0;
  1171. } else
  1172. if (s->vc)
  1173. qemu_send_packet(s->vc, s->buffer, s->xmit_pos);
  1174. s->csr[0] &= ~0x0008; /* clear TDMD */
  1175. s->csr[4] |= 0x0004; /* set TXSTRT */
  1176. s->xmit_pos = -1;
  1177. }
  1178. SET_FIELD(&tmd.status, TMDS, OWN, 0);
  1179. TMDSTORE(&tmd, PHYSADDR(s,CSR_CXDA(s)));
  1180. if (!CSR_TOKINTD(s) || (CSR_LTINTEN(s) && GET_FIELD(tmd.status, TMDS, LTINT)))
  1181. s->csr[0] |= 0x0200; /* set TINT */
  1182. if (CSR_XMTRC(s)<=1)
  1183. CSR_XMTRC(s) = CSR_XMTRL(s);
  1184. else
  1185. CSR_XMTRC(s)--;
  1186. if (count--)
  1187. goto txagain;
  1188. } else
  1189. if (s->xmit_pos >= 0) {
  1190. struct pcnet_TMD tmd;
  1191. TMDLOAD(&tmd, PHYSADDR(s,xmit_cxda));
  1192. SET_FIELD(&tmd.misc, TMDM, BUFF, 1);
  1193. SET_FIELD(&tmd.misc, TMDM, UFLO, 1);
  1194. SET_FIELD(&tmd.status, TMDS, ERR, 1);
  1195. SET_FIELD(&tmd.status, TMDS, OWN, 0);
  1196. TMDSTORE(&tmd, PHYSADDR(s,xmit_cxda));
  1197. s->csr[0] |= 0x0200; /* set TINT */
  1198. if (!CSR_DXSUFLO(s)) {
  1199. s->csr[0] &= ~0x0010;
  1200. } else
  1201. if (count--)
  1202. goto txagain;
  1203. }
  1204. s->tx_busy = 0;
  1205. }
  1206. static void pcnet_poll(PCNetState *s)
  1207. {
  1208. if (CSR_RXON(s)) {
  1209. pcnet_rdte_poll(s);
  1210. }
  1211. if (CSR_TDMD(s) ||
  1212. (CSR_TXON(s) && !CSR_DPOLL(s) && pcnet_tdte_poll(s)))
  1213. {
  1214. /* prevent recursion */
  1215. if (s->tx_busy)
  1216. return;
  1217. pcnet_transmit(s);
  1218. }
  1219. }
  1220. static void pcnet_poll_timer(void *opaque)
  1221. {
  1222. PCNetState *s = opaque;
  1223. qemu_del_timer(s->poll_timer);
  1224. if (CSR_TDMD(s)) {
  1225. pcnet_transmit(s);
  1226. }
  1227. pcnet_update_irq(s);
  1228. if (!CSR_STOP(s) && !CSR_SPND(s) && !CSR_DPOLL(s)) {
  1229. uint64_t now = qemu_get_clock(vm_clock) * 33;
  1230. if (!s->timer || !now)
  1231. s->timer = now;
  1232. else {
  1233. uint64_t t = now - s->timer + CSR_POLL(s);
  1234. if (t > 0xffffLL) {
  1235. pcnet_poll(s);
  1236. CSR_POLL(s) = CSR_PINT(s);
  1237. } else
  1238. CSR_POLL(s) = t;
  1239. }
  1240. qemu_mod_timer(s->poll_timer,
  1241. pcnet_get_next_poll_time(s,qemu_get_clock(vm_clock)));
  1242. }
  1243. }
  1244. static void pcnet_csr_writew(PCNetState *s, uint32_t rap, uint32_t new_value)
  1245. {
  1246. uint16_t val = new_value;
  1247. #ifdef PCNET_DEBUG_CSR
  1248. printf("pcnet_csr_writew rap=%d val=0x%04x\n", rap, val);
  1249. #endif
  1250. switch (rap) {
  1251. case 0:
  1252. s->csr[0] &= ~(val & 0x7f00); /* Clear any interrupt flags */
  1253. s->csr[0] = (s->csr[0] & ~0x0040) | (val & 0x0048);
  1254. val = (val & 0x007f) | (s->csr[0] & 0x7f00);
  1255. /* IFF STOP, STRT and INIT are set, clear STRT and INIT */
  1256. if ((val&7) == 7)
  1257. val &= ~3;
  1258. if (!CSR_STOP(s) && (val & 4))
  1259. pcnet_stop(s);
  1260. if (!CSR_INIT(s) && (val & 1))
  1261. pcnet_init(s);
  1262. if (!CSR_STRT(s) && (val & 2))
  1263. pcnet_start(s);
  1264. if (CSR_TDMD(s))
  1265. pcnet_transmit(s);
  1266. return;
  1267. case 1:
  1268. case 2:
  1269. case 8:
  1270. case 9:
  1271. case 10:
  1272. case 11:
  1273. case 12:
  1274. case 13:
  1275. case 14:
  1276. case 15:
  1277. case 18: /* CRBAL */
  1278. case 19: /* CRBAU */
  1279. case 20: /* CXBAL */
  1280. case 21: /* CXBAU */
  1281. case 22: /* NRBAU */
  1282. case 23: /* NRBAU */
  1283. case 24:
  1284. case 25:
  1285. case 26:
  1286. case 27:
  1287. case 28:
  1288. case 29:
  1289. case 30:
  1290. case 31:
  1291. case 32:
  1292. case 33:
  1293. case 34:
  1294. case 35:
  1295. case 36:
  1296. case 37:
  1297. case 38:
  1298. case 39:
  1299. case 40: /* CRBC */
  1300. case 41:
  1301. case 42: /* CXBC */
  1302. case 43:
  1303. case 44:
  1304. case 45:
  1305. case 46: /* POLL */
  1306. case 47: /* POLLINT */
  1307. case 72:
  1308. case 74:
  1309. case 76: /* RCVRL */
  1310. case 78: /* XMTRL */
  1311. case 112:
  1312. if (CSR_STOP(s) || CSR_SPND(s))
  1313. break;
  1314. return;
  1315. case 3:
  1316. break;
  1317. case 4:
  1318. s->csr[4] &= ~(val & 0x026a);
  1319. val &= ~0x026a; val |= s->csr[4] & 0x026a;
  1320. break;
  1321. case 5:
  1322. s->csr[5] &= ~(val & 0x0a90);
  1323. val &= ~0x0a90; val |= s->csr[5] & 0x0a90;
  1324. break;
  1325. case 16:
  1326. pcnet_csr_writew(s,1,val);
  1327. return;
  1328. case 17:
  1329. pcnet_csr_writew(s,2,val);
  1330. return;
  1331. case 58:
  1332. pcnet_bcr_writew(s,BCR_SWS,val);
  1333. break;
  1334. default:
  1335. return;
  1336. }
  1337. s->csr[rap] = val;
  1338. }
  1339. static uint32_t pcnet_csr_readw(PCNetState *s, uint32_t rap)
  1340. {
  1341. uint32_t val;
  1342. switch (rap) {
  1343. case 0:
  1344. pcnet_update_irq(s);
  1345. val = s->csr[0];
  1346. val |= (val & 0x7800) ? 0x8000 : 0;
  1347. break;
  1348. case 16:
  1349. return pcnet_csr_readw(s,1);
  1350. case 17:
  1351. return pcnet_csr_readw(s,2);
  1352. case 58:
  1353. return pcnet_bcr_readw(s,BCR_SWS);
  1354. case 88:
  1355. val = s->csr[89];
  1356. val <<= 16;
  1357. val |= s->csr[88];
  1358. break;
  1359. default:
  1360. val = s->csr[rap];
  1361. }
  1362. #ifdef PCNET_DEBUG_CSR
  1363. printf("pcnet_csr_readw rap=%d val=0x%04x\n", rap, val);
  1364. #endif
  1365. return val;
  1366. }
  1367. static void pcnet_bcr_writew(PCNetState *s, uint32_t rap, uint32_t val)
  1368. {
  1369. rap &= 127;
  1370. #ifdef PCNET_DEBUG_BCR
  1371. printf("pcnet_bcr_writew rap=%d val=0x%04x\n", rap, val);
  1372. #endif
  1373. switch (rap) {
  1374. case BCR_SWS:
  1375. if (!(CSR_STOP(s) || CSR_SPND(s)))
  1376. return;
  1377. val &= ~0x0300;
  1378. switch (val & 0x00ff) {
  1379. case 0:
  1380. val |= 0x0200;
  1381. break;
  1382. case 1:
  1383. val |= 0x0100;
  1384. break;
  1385. case 2:
  1386. case 3:
  1387. val |= 0x0300;
  1388. break;
  1389. default:
  1390. printf("Bad SWSTYLE=0x%02x\n", val & 0xff);
  1391. val = 0x0200;
  1392. break;
  1393. }
  1394. #ifdef PCNET_DEBUG
  1395. printf("BCR_SWS=0x%04x\n", val);
  1396. #endif
  1397. case BCR_LNKST:
  1398. case BCR_LED1:
  1399. case BCR_LED2:
  1400. case BCR_LED3:
  1401. case BCR_MC:
  1402. case BCR_FDC:
  1403. case BCR_BSBC:
  1404. case BCR_EECAS:
  1405. case BCR_PLAT:
  1406. s->bcr[rap] = val;
  1407. break;
  1408. default:
  1409. break;
  1410. }
  1411. }
  1412. static uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap)
  1413. {
  1414. uint32_t val;
  1415. rap &= 127;
  1416. switch (rap) {
  1417. case BCR_LNKST:
  1418. case BCR_LED1:
  1419. case BCR_LED2:
  1420. case BCR_LED3:
  1421. val = s->bcr[rap] & ~0x8000;
  1422. val |= (val & 0x017f & s->lnkst) ? 0x8000 : 0;
  1423. break;
  1424. default:
  1425. val = rap < 32 ? s->bcr[rap] : 0;
  1426. break;
  1427. }
  1428. #ifdef PCNET_DEBUG_BCR
  1429. printf("pcnet_bcr_readw rap=%d val=0x%04x\n", rap, val);
  1430. #endif
  1431. return val;
  1432. }
  1433. static void pcnet_h_reset(void *opaque)
  1434. {
  1435. PCNetState *s = opaque;
  1436. int i;
  1437. uint16_t checksum;
  1438. /* Initialize the PROM */
  1439. if (s->nd)
  1440. memcpy(s->prom, s->nd->macaddr, 6);
  1441. s->prom[12] = s->prom[13] = 0x00;
  1442. s->prom[14] = s->prom[15] = 0x57;
  1443. for (i = 0,checksum = 0; i < 16; i++)
  1444. checksum += s->prom[i];
  1445. *(uint16_t *)&s->prom[12] = cpu_to_le16(checksum);
  1446. s->bcr[BCR_MSRDA] = 0x0005;
  1447. s->bcr[BCR_MSWRA] = 0x0005;
  1448. s->bcr[BCR_MC ] = 0x0002;
  1449. s->bcr[BCR_LNKST] = 0x00c0;
  1450. s->bcr[BCR_LED1 ] = 0x0084;
  1451. s->bcr[BCR_LED2 ] = 0x0088;
  1452. s->bcr[BCR_LED3 ] = 0x0090;
  1453. s->bcr[BCR_FDC ] = 0x0000;
  1454. s->bcr[BCR_BSBC ] = 0x9001;
  1455. s->bcr[BCR_EECAS] = 0x0002;
  1456. s->bcr[BCR_SWS ] = 0x0200;
  1457. s->bcr[BCR_PLAT ] = 0xff06;
  1458. pcnet_s_reset(s);
  1459. }
  1460. static void pcnet_aprom_writeb(void *opaque, uint32_t addr, uint32_t val)
  1461. {
  1462. PCNetState *s = opaque;
  1463. #ifdef PCNET_DEBUG
  1464. printf("pcnet_aprom_writeb addr=0x%08x val=0x%02x\n", addr, val);
  1465. #endif
  1466. /* Check APROMWE bit to enable write access */
  1467. if (pcnet_bcr_readw(s,2) & 0x80)
  1468. s->prom[addr & 15] = val;
  1469. }
  1470. static uint32_t pcnet_aprom_readb(void *opaque, uint32_t addr)
  1471. {
  1472. PCNetState *s = opaque;
  1473. uint32_t val = s->prom[addr &= 15];
  1474. #ifdef PCNET_DEBUG
  1475. printf("pcnet_aprom_readb addr=0x%08x val=0x%02x\n", addr, val);
  1476. #endif
  1477. return val;
  1478. }
  1479. static void pcnet_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
  1480. {
  1481. PCNetState *s = opaque;
  1482. pcnet_poll_timer(s);
  1483. #ifdef PCNET_DEBUG_IO
  1484. printf("pcnet_ioport_writew addr=0x%08x val=0x%04x\n", addr, val);
  1485. #endif
  1486. if (!BCR_DWIO(s)) {
  1487. switch (addr & 0x0f) {
  1488. case 0x00: /* RDP */
  1489. pcnet_csr_writew(s, s->rap, val);
  1490. break;
  1491. case 0x02:
  1492. s->rap = val & 0x7f;
  1493. break;
  1494. case 0x06:
  1495. pcnet_bcr_writew(s, s->rap, val);
  1496. break;
  1497. }
  1498. }
  1499. pcnet_update_irq(s);
  1500. }
  1501. static uint32_t pcnet_ioport_readw(void *opaque, uint32_t addr)
  1502. {
  1503. PCNetState *s = opaque;
  1504. uint32_t val = -1;
  1505. pcnet_poll_timer(s);
  1506. if (!BCR_DWIO(s)) {
  1507. switch (addr & 0x0f) {
  1508. case 0x00: /* RDP */
  1509. val = pcnet_csr_readw(s, s->rap);
  1510. break;
  1511. case 0x02:
  1512. val = s->rap;
  1513. break;
  1514. case 0x04:
  1515. pcnet_s_reset(s);
  1516. val = 0;
  1517. break;
  1518. case 0x06:
  1519. val = pcnet_bcr_readw(s, s->rap);
  1520. break;
  1521. }
  1522. }
  1523. pcnet_update_irq(s);
  1524. #ifdef PCNET_DEBUG_IO
  1525. printf("pcnet_ioport_readw addr=0x%08x val=0x%04x\n", addr, val & 0xffff);
  1526. #endif
  1527. return val;
  1528. }
  1529. static void pcnet_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
  1530. {
  1531. PCNetState *s = opaque;
  1532. pcnet_poll_timer(s);
  1533. #ifdef PCNET_DEBUG_IO
  1534. printf("pcnet_ioport_writel addr=0x%08x val=0x%08x\n", addr, val);
  1535. #endif
  1536. if (BCR_DWIO(s)) {
  1537. switch (addr & 0x0f) {
  1538. case 0x00: /* RDP */
  1539. pcnet_csr_writew(s, s->rap, val & 0xffff);
  1540. break;
  1541. case 0x04:
  1542. s->rap = val & 0x7f;
  1543. break;
  1544. case 0x0c:
  1545. pcnet_bcr_writew(s, s->rap, val & 0xffff);
  1546. break;
  1547. }
  1548. } else
  1549. if ((addr & 0x0f) == 0) {
  1550. /* switch device to dword i/o mode */
  1551. pcnet_bcr_writew(s, BCR_BSBC, pcnet_bcr_readw(s, BCR_BSBC) | 0x0080);
  1552. #ifdef PCNET_DEBUG_IO
  1553. printf("device switched into dword i/o mode\n");
  1554. #endif
  1555. }
  1556. pcnet_update_irq(s);
  1557. }
  1558. static uint32_t pcnet_ioport_readl(void *opaque, uint32_t addr)
  1559. {
  1560. PCNetState *s = opaque;
  1561. uint32_t val = -1;
  1562. pcnet_poll_timer(s);
  1563. if (BCR_DWIO(s)) {
  1564. switch (addr & 0x0f) {
  1565. case 0x00: /* RDP */
  1566. val = pcnet_csr_readw(s, s->rap);
  1567. break;
  1568. case 0x04:
  1569. val = s->rap;
  1570. break;
  1571. case 0x08:
  1572. pcnet_s_reset(s);
  1573. val = 0;
  1574. break;
  1575. case 0x0c:
  1576. val = pcnet_bcr_readw(s, s->rap);
  1577. break;
  1578. }
  1579. }
  1580. pcnet_update_irq(s);
  1581. #ifdef PCNET_DEBUG_IO
  1582. printf("pcnet_ioport_readl addr=0x%08x val=0x%08x\n", addr, val);
  1583. #endif
  1584. return val;
  1585. }
  1586. static void pcnet_ioport_map(PCIDevice *pci_dev, int region_num,
  1587. uint32_t addr, uint32_t size, int type)
  1588. {
  1589. PCNetState *d = (PCNetState *)pci_dev;
  1590. #ifdef PCNET_DEBUG_IO
  1591. printf("pcnet_ioport_map addr=0x%04x size=0x%04x\n", addr, size);
  1592. #endif
  1593. register_ioport_write(addr, 16, 1, pcnet_aprom_writeb, d);
  1594. register_ioport_read(addr, 16, 1, pcnet_aprom_readb, d);
  1595. register_ioport_write(addr + 0x10, 0x10, 2, pcnet_ioport_writew, d);
  1596. register_ioport_read(addr + 0x10, 0x10, 2, pcnet_ioport_readw, d);
  1597. register_ioport_write(addr + 0x10, 0x10, 4, pcnet_ioport_writel, d);
  1598. register_ioport_read(addr + 0x10, 0x10, 4, pcnet_ioport_readl, d);
  1599. }
  1600. static void pcnet_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
  1601. {
  1602. PCNetState *d = opaque;
  1603. #ifdef PCNET_DEBUG_IO
  1604. printf("pcnet_mmio_writeb addr=0x" TARGET_FMT_plx" val=0x%02x\n", addr,
  1605. val);
  1606. #endif
  1607. if (!(addr & 0x10))
  1608. pcnet_aprom_writeb(d, addr & 0x0f, val);
  1609. }
  1610. static uint32_t pcnet_mmio_readb(void *opaque, target_phys_addr_t addr)
  1611. {
  1612. PCNetState *d = opaque;
  1613. uint32_t val = -1;
  1614. if (!(addr & 0x10))
  1615. val = pcnet_aprom_readb(d, addr & 0x0f);
  1616. #ifdef PCNET_DEBUG_IO
  1617. printf("pcnet_mmio_readb addr=0x" TARGET_FMT_plx " val=0x%02x\n", addr,
  1618. val & 0xff);
  1619. #endif
  1620. return val;
  1621. }
  1622. static void pcnet_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
  1623. {
  1624. PCNetState *d = opaque;
  1625. #ifdef PCNET_DEBUG_IO
  1626. printf("pcnet_mmio_writew addr=0x" TARGET_FMT_plx " val=0x%04x\n", addr,
  1627. val);
  1628. #endif
  1629. if (addr & 0x10)
  1630. pcnet_ioport_writew(d, addr & 0x0f, val);
  1631. else {
  1632. addr &= 0x0f;
  1633. pcnet_aprom_writeb(d, addr, val & 0xff);
  1634. pcnet_aprom_writeb(d, addr+1, (val & 0xff00) >> 8);
  1635. }
  1636. }
  1637. static uint32_t pcnet_mmio_readw(void *opaque, target_phys_addr_t addr)
  1638. {
  1639. PCNetState *d = opaque;
  1640. uint32_t val = -1;
  1641. if (addr & 0x10)
  1642. val = pcnet_ioport_readw(d, addr & 0x0f);
  1643. else {
  1644. addr &= 0x0f;
  1645. val = pcnet_aprom_readb(d, addr+1);
  1646. val <<= 8;
  1647. val |= pcnet_aprom_readb(d, addr);
  1648. }
  1649. #ifdef PCNET_DEBUG_IO
  1650. printf("pcnet_mmio_readw addr=0x" TARGET_FMT_plx" val = 0x%04x\n", addr,
  1651. val & 0xffff);
  1652. #endif
  1653. return val;
  1654. }
  1655. static void pcnet_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
  1656. {
  1657. PCNetState *d = opaque;
  1658. #ifdef PCNET_DEBUG_IO
  1659. printf("pcnet_mmio_writel addr=0x" TARGET_FMT_plx" val=0x%08x\n", addr,
  1660. val);
  1661. #endif
  1662. if (addr & 0x10)
  1663. pcnet_ioport_writel(d, addr & 0x0f, val);
  1664. else {
  1665. addr &= 0x0f;
  1666. pcnet_aprom_writeb(d, addr, val & 0xff);
  1667. pcnet_aprom_writeb(d, addr+1, (val & 0xff00) >> 8);
  1668. pcnet_aprom_writeb(d, addr+2, (val & 0xff0000) >> 16);
  1669. pcnet_aprom_writeb(d, addr+3, (val & 0xff000000) >> 24);
  1670. }
  1671. }
  1672. static uint32_t pcnet_mmio_readl(void *opaque, target_phys_addr_t addr)
  1673. {
  1674. PCNetState *d = opaque;
  1675. uint32_t val;
  1676. if (addr & 0x10)
  1677. val = pcnet_ioport_readl(d, addr & 0x0f);
  1678. else {
  1679. addr &= 0x0f;
  1680. val = pcnet_aprom_readb(d, addr+3);
  1681. val <<= 8;
  1682. val |= pcnet_aprom_readb(d, addr+2);
  1683. val <<= 8;
  1684. val |= pcnet_aprom_readb(d, addr+1);
  1685. val <<= 8;
  1686. val |= pcnet_aprom_readb(d, addr);
  1687. }
  1688. #ifdef PCNET_DEBUG_IO
  1689. printf("pcnet_mmio_readl addr=0x" TARGET_FMT_plx " val=0x%08x\n", addr,
  1690. val);
  1691. #endif
  1692. return val;
  1693. }
  1694. static void pcnet_save(QEMUFile *f, void *opaque)
  1695. {
  1696. PCNetState *s = opaque;
  1697. unsigned int i;
  1698. if (s->pci_dev)
  1699. pci_device_save(s->pci_dev, f);
  1700. qemu_put_sbe32(f, s->rap);
  1701. qemu_put_sbe32(f, s->isr);
  1702. qemu_put_sbe32(f, s->lnkst);
  1703. qemu_put_be32s(f, &s->rdra);
  1704. qemu_put_be32s(f, &s->tdra);
  1705. qemu_put_buffer(f, s->prom, 16);
  1706. for (i = 0; i < 128; i++)
  1707. qemu_put_be16s(f, &s->csr[i]);
  1708. for (i = 0; i < 32; i++)
  1709. qemu_put_be16s(f, &s->bcr[i]);
  1710. qemu_put_be64s(f, &s->timer);
  1711. qemu_put_sbe32(f, s->xmit_pos);
  1712. qemu_put_sbe32(f, s->recv_pos);
  1713. qemu_put_buffer(f, s->buffer, 4096);
  1714. qemu_put_sbe32(f, s->tx_busy);
  1715. qemu_put_timer(f, s->poll_timer);
  1716. }
  1717. static int pcnet_load(QEMUFile *f, void *opaque, int version_id)
  1718. {
  1719. PCNetState *s = opaque;
  1720. int i, ret;
  1721. if (version_id != 2)
  1722. return -EINVAL;
  1723. if (s->pci_dev) {
  1724. ret = pci_device_load(s->pci_dev, f);
  1725. if (ret < 0)
  1726. return ret;
  1727. }
  1728. qemu_get_sbe32s(f, &s->rap);
  1729. qemu_get_sbe32s(f, &s->isr);
  1730. qemu_get_sbe32s(f, &s->lnkst);
  1731. qemu_get_be32s(f, &s->rdra);
  1732. qemu_get_be32s(f, &s->tdra);
  1733. qemu_get_buffer(f, s->prom, 16);
  1734. for (i = 0; i < 128; i++)
  1735. qemu_get_be16s(f, &s->csr[i]);
  1736. for (i = 0; i < 32; i++)
  1737. qemu_get_be16s(f, &s->bcr[i]);
  1738. qemu_get_be64s(f, &s->timer);
  1739. qemu_get_sbe32s(f, &s->xmit_pos);
  1740. qemu_get_sbe32s(f, &s->recv_pos);
  1741. qemu_get_buffer(f, s->buffer, 4096);
  1742. qemu_get_sbe32s(f, &s->tx_busy);
  1743. qemu_get_timer(f, s->poll_timer);
  1744. return 0;
  1745. }
  1746. static void pcnet_common_cleanup(PCNetState *d)
  1747. {
  1748. unregister_savevm("pcnet", d);
  1749. qemu_del_timer(d->poll_timer);
  1750. qemu_free_timer(d->poll_timer);
  1751. }
  1752. static void pcnet_common_init(PCNetState *d, NICInfo *nd, NetCleanup *cleanup)
  1753. {
  1754. d->poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, d);
  1755. d->nd = nd;
  1756. if (nd && nd->vlan) {
  1757. d->vc = qemu_new_vlan_client(nd->vlan, nd->model, nd->name,
  1758. pcnet_receive, pcnet_can_receive,
  1759. cleanup, d);
  1760. qemu_format_nic_info_str(d->vc, d->nd->macaddr);
  1761. } else {
  1762. d->vc = NULL;
  1763. }
  1764. pcnet_h_reset(d);
  1765. register_savevm("pcnet", -1, 2, pcnet_save, pcnet_load, d);
  1766. }
  1767. /* PCI interface */
  1768. static CPUWriteMemoryFunc *pcnet_mmio_write[] = {
  1769. (CPUWriteMemoryFunc *)&pcnet_mmio_writeb,
  1770. (CPUWriteMemoryFunc *)&pcnet_mmio_writew,
  1771. (CPUWriteMemoryFunc *)&pcnet_mmio_writel
  1772. };
  1773. static CPUReadMemoryFunc *pcnet_mmio_read[] = {
  1774. (CPUReadMemoryFunc *)&pcnet_mmio_readb,
  1775. (CPUReadMemoryFunc *)&pcnet_mmio_readw,
  1776. (CPUReadMemoryFunc *)&pcnet_mmio_readl
  1777. };
  1778. static void pcnet_mmio_map(PCIDevice *pci_dev, int region_num,
  1779. uint32_t addr, uint32_t size, int type)
  1780. {
  1781. PCNetState *d = (PCNetState *)pci_dev;
  1782. #ifdef PCNET_DEBUG_IO
  1783. printf("pcnet_mmio_map addr=0x%08x 0x%08x\n", addr, size);
  1784. #endif
  1785. cpu_register_physical_memory(addr, PCNET_PNPMMIO_SIZE, d->mmio_index);
  1786. }
  1787. static void pci_physical_memory_write(void *dma_opaque, target_phys_addr_t addr,
  1788. uint8_t *buf, int len, int do_bswap)
  1789. {
  1790. cpu_physical_memory_write(addr, buf, len);
  1791. }
  1792. static void pci_physical_memory_read(void *dma_opaque, target_phys_addr_t addr,
  1793. uint8_t *buf, int len, int do_bswap)
  1794. {
  1795. cpu_physical_memory_read(addr, buf, len);
  1796. }
  1797. static void pci_pcnet_cleanup(VLANClientState *vc)
  1798. {
  1799. PCNetState *d = vc->opaque;
  1800. pcnet_common_cleanup(d);
  1801. }
  1802. static int pci_pcnet_uninit(PCIDevice *dev)
  1803. {
  1804. PCNetState *d = (PCNetState *)dev;
  1805. cpu_unregister_io_memory(d->mmio_index);
  1806. return 0;
  1807. }
  1808. PCIDevice *pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn)
  1809. {
  1810. PCNetState *d;
  1811. uint8_t *pci_conf;
  1812. #if 0
  1813. printf("sizeof(RMD)=%d, sizeof(TMD)=%d\n",
  1814. sizeof(struct pcnet_RMD), sizeof(struct pcnet_TMD));
  1815. #endif
  1816. d = (PCNetState *)pci_register_device(bus, "PCNet", sizeof(PCNetState),
  1817. devfn, NULL, NULL);
  1818. if (!d)
  1819. return NULL;
  1820. d->dev.unregister = pci_pcnet_uninit;
  1821. pci_conf = d->dev.config;
  1822. pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_AMD);
  1823. pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_AMD_LANCE);
  1824. *(uint16_t *)&pci_conf[0x04] = cpu_to_le16(0x0007);
  1825. *(uint16_t *)&pci_conf[0x06] = cpu_to_le16(0x0280);
  1826. pci_conf[0x08] = 0x10;
  1827. pci_conf[0x09] = 0x00;
  1828. pci_config_set_class(pci_conf, PCI_CLASS_NETWORK_ETHERNET);
  1829. pci_conf[0x0e] = 0x00; // header_type
  1830. *(uint32_t *)&pci_conf[0x10] = cpu_to_le32(0x00000001);
  1831. *(uint32_t *)&pci_conf[0x14] = cpu_to_le32(0x00000000);
  1832. pci_conf[0x3d] = 1; // interrupt pin 0
  1833. pci_conf[0x3e] = 0x06;
  1834. pci_conf[0x3f] = 0xff;
  1835. /* Handler for memory-mapped I/O */
  1836. d->mmio_index =
  1837. cpu_register_io_memory(0, pcnet_mmio_read, pcnet_mmio_write, d);
  1838. pci_register_io_region((PCIDevice *)d, 0, PCNET_IOPORT_SIZE,
  1839. PCI_ADDRESS_SPACE_IO, pcnet_ioport_map);
  1840. pci_register_io_region((PCIDevice *)d, 1, PCNET_PNPMMIO_SIZE,
  1841. PCI_ADDRESS_SPACE_MEM, pcnet_mmio_map);
  1842. d->irq = d->dev.irq[0];
  1843. d->phys_mem_read = pci_physical_memory_read;
  1844. d->phys_mem_write = pci_physical_memory_write;
  1845. d->pci_dev = &d->dev;
  1846. pcnet_common_init(d, nd, pci_pcnet_cleanup);
  1847. return (PCIDevice *)d;
  1848. }
  1849. /* SPARC32 interface */
  1850. #if defined (TARGET_SPARC) && !defined(TARGET_SPARC64) // Avoid compile failure
  1851. #include "sun4m.h"
  1852. static void parent_lance_reset(void *opaque, int irq, int level)
  1853. {
  1854. if (level)
  1855. pcnet_h_reset(opaque);
  1856. }
  1857. static void lance_mem_writew(void *opaque, target_phys_addr_t addr,
  1858. uint32_t val)
  1859. {
  1860. #ifdef PCNET_DEBUG_IO
  1861. printf("lance_mem_writew addr=" TARGET_FMT_plx " val=0x%04x\n", addr,
  1862. val & 0xffff);
  1863. #endif
  1864. pcnet_ioport_writew(opaque, addr, val & 0xffff);
  1865. }
  1866. static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr)
  1867. {
  1868. uint32_t val;
  1869. val = pcnet_ioport_readw(opaque, addr);
  1870. #ifdef PCNET_DEBUG_IO
  1871. printf("lance_mem_readw addr=" TARGET_FMT_plx " val = 0x%04x\n", addr,
  1872. val & 0xffff);
  1873. #endif
  1874. return val & 0xffff;
  1875. }
  1876. static CPUReadMemoryFunc *lance_mem_read[3] = {
  1877. NULL,
  1878. lance_mem_readw,
  1879. NULL,
  1880. };
  1881. static CPUWriteMemoryFunc *lance_mem_write[3] = {
  1882. NULL,
  1883. lance_mem_writew,
  1884. NULL,
  1885. };
  1886. static void lance_cleanup(VLANClientState *vc)
  1887. {
  1888. PCNetState *d = vc->opaque;
  1889. pcnet_common_cleanup(d);
  1890. qemu_free_irqs(d->reset_irq);
  1891. cpu_unregister_io_memory(d->mmio_index);
  1892. qemu_free(d);
  1893. }
  1894. void lance_init(NICInfo *nd, target_phys_addr_t leaddr, void *dma_opaque,
  1895. qemu_irq irq, qemu_irq *reset)
  1896. {
  1897. PCNetState *d;
  1898. qemu_check_nic_model(nd, "lance");
  1899. d = qemu_mallocz(sizeof(PCNetState));
  1900. d->mmio_index =
  1901. cpu_register_io_memory(0, lance_mem_read, lance_mem_write, d);
  1902. d->dma_opaque = dma_opaque;
  1903. d->reset_irq = qemu_allocate_irqs(parent_lance_reset, d, 1);
  1904. *reset = *d->reset_irq;
  1905. cpu_register_physical_memory(leaddr, 4, d->mmio_index);
  1906. d->irq = irq;
  1907. d->phys_mem_read = ledma_memory_read;
  1908. d->phys_mem_write = ledma_memory_write;
  1909. pcnet_common_init(d, nd, lance_cleanup);
  1910. }
  1911. #endif /* TARGET_SPARC */