eepro100.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178
  1. /*
  2. * QEMU i8255x (PRO100) emulation
  3. *
  4. * Copyright (C) 2006-2011 Stefan Weil
  5. *
  6. * Portions of the code are copies from grub / etherboot eepro100.c
  7. * and linux e100.c.
  8. *
  9. * This program is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation, either version 2 of the License, or
  12. * (at your option) version 3 or any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  21. *
  22. * Tested features (i82559):
  23. * PXE boot (i386 guest, i386 / mips / mipsel / ppc host) ok
  24. * Linux networking (i386) ok
  25. *
  26. * Untested:
  27. * Windows networking
  28. *
  29. * References:
  30. *
  31. * Intel 8255x 10/100 Mbps Ethernet Controller Family
  32. * Open Source Software Developer Manual
  33. *
  34. * TODO:
  35. * * PHY emulation should be separated from nic emulation.
  36. * Most nic emulations could share the same phy code.
  37. * * i82550 is untested. It is programmed like the i82559.
  38. * * i82562 is untested. It is programmed like the i82559.
  39. * * Power management (i82558 and later) is not implemented.
  40. * * Wake-on-LAN is not implemented.
  41. */
  42. #include <stddef.h> /* offsetof */
  43. #include "hw.h"
  44. #include "pci.h"
  45. #include "net.h"
  46. #include "eeprom93xx.h"
  47. #include "sysemu.h"
  48. /* QEMU sends frames smaller than 60 bytes to ethernet nics.
  49. * Such frames are rejected by real nics and their emulations.
  50. * To avoid this behaviour, other nic emulations pad received
  51. * frames. The following definition enables this padding for
  52. * eepro100, too. We keep the define around in case it might
  53. * become useful the future if the core networking is ever
  54. * changed to pad short packets itself. */
  55. #define CONFIG_PAD_RECEIVED_FRAMES
  56. #define KiB 1024
  57. /* Debug EEPRO100 card. */
  58. #if 0
  59. # define DEBUG_EEPRO100
  60. #endif
  61. #ifdef DEBUG_EEPRO100
  62. #define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
  63. #else
  64. #define logout(fmt, ...) ((void)0)
  65. #endif
  66. /* Set flags to 0 to disable debug output. */
  67. #define INT 1 /* interrupt related actions */
  68. #define MDI 1 /* mdi related actions */
  69. #define OTHER 1
  70. #define RXTX 1
  71. #define EEPROM 1 /* eeprom related actions */
  72. #define TRACE(flag, command) ((flag) ? (command) : (void)0)
  73. #define missing(text) fprintf(stderr, "eepro100: feature is missing in this emulation: " text "\n")
  74. #define MAX_ETH_FRAME_SIZE 1514
  75. /* This driver supports several different devices which are declared here. */
  76. #define i82550 0x82550
  77. #define i82551 0x82551
  78. #define i82557A 0x82557a
  79. #define i82557B 0x82557b
  80. #define i82557C 0x82557c
  81. #define i82558A 0x82558a
  82. #define i82558B 0x82558b
  83. #define i82559A 0x82559a
  84. #define i82559B 0x82559b
  85. #define i82559C 0x82559c
  86. #define i82559ER 0x82559e
  87. #define i82562 0x82562
  88. #define i82801 0x82801
  89. /* Use 64 word EEPROM. TODO: could be a runtime option. */
  90. #define EEPROM_SIZE 64
  91. #define PCI_MEM_SIZE (4 * KiB)
  92. #define PCI_IO_SIZE 64
  93. #define PCI_FLASH_SIZE (128 * KiB)
  94. #define BIT(n) (1 << (n))
  95. #define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
  96. /* The SCB accepts the following controls for the Tx and Rx units: */
  97. #define CU_NOP 0x0000 /* No operation. */
  98. #define CU_START 0x0010 /* CU start. */
  99. #define CU_RESUME 0x0020 /* CU resume. */
  100. #define CU_STATSADDR 0x0040 /* Load dump counters address. */
  101. #define CU_SHOWSTATS 0x0050 /* Dump statistical counters. */
  102. #define CU_CMD_BASE 0x0060 /* Load CU base address. */
  103. #define CU_DUMPSTATS 0x0070 /* Dump and reset statistical counters. */
  104. #define CU_SRESUME 0x00a0 /* CU static resume. */
  105. #define RU_NOP 0x0000
  106. #define RX_START 0x0001
  107. #define RX_RESUME 0x0002
  108. #define RU_ABORT 0x0004
  109. #define RX_ADDR_LOAD 0x0006
  110. #define RX_RESUMENR 0x0007
  111. #define INT_MASK 0x0100
  112. #define DRVR_INT 0x0200 /* Driver generated interrupt. */
  113. typedef struct {
  114. PCIDeviceInfo pci;
  115. uint32_t device;
  116. uint8_t stats_size;
  117. bool has_extended_tcb_support;
  118. bool power_management;
  119. } E100PCIDeviceInfo;
  120. /* Offsets to the various registers.
  121. All accesses need not be longword aligned. */
  122. typedef enum {
  123. SCBStatus = 0, /* Status Word. */
  124. SCBAck = 1,
  125. SCBCmd = 2, /* Rx/Command Unit command and status. */
  126. SCBIntmask = 3,
  127. SCBPointer = 4, /* General purpose pointer. */
  128. SCBPort = 8, /* Misc. commands and operands. */
  129. SCBflash = 12, /* Flash memory control. */
  130. SCBeeprom = 14, /* EEPROM control. */
  131. SCBCtrlMDI = 16, /* MDI interface control. */
  132. SCBEarlyRx = 20, /* Early receive byte count. */
  133. SCBFlow = 24, /* Flow Control. */
  134. SCBpmdr = 27, /* Power Management Driver. */
  135. SCBgctrl = 28, /* General Control. */
  136. SCBgstat = 29, /* General Status. */
  137. } E100RegisterOffset;
  138. /* A speedo3 transmit buffer descriptor with two buffers... */
  139. typedef struct {
  140. uint16_t status;
  141. uint16_t command;
  142. uint32_t link; /* void * */
  143. uint32_t tbd_array_addr; /* transmit buffer descriptor array address. */
  144. uint16_t tcb_bytes; /* transmit command block byte count (in lower 14 bits */
  145. uint8_t tx_threshold; /* transmit threshold */
  146. uint8_t tbd_count; /* TBD number */
  147. #if 0
  148. /* This constitutes two "TBD" entries: hdr and data */
  149. uint32_t tx_buf_addr0; /* void *, header of frame to be transmitted. */
  150. int32_t tx_buf_size0; /* Length of Tx hdr. */
  151. uint32_t tx_buf_addr1; /* void *, data to be transmitted. */
  152. int32_t tx_buf_size1; /* Length of Tx data. */
  153. #endif
  154. } eepro100_tx_t;
  155. /* Receive frame descriptor. */
  156. typedef struct {
  157. int16_t status;
  158. uint16_t command;
  159. uint32_t link; /* struct RxFD * */
  160. uint32_t rx_buf_addr; /* void * */
  161. uint16_t count;
  162. uint16_t size;
  163. /* Ethernet frame data follows. */
  164. } eepro100_rx_t;
  165. typedef enum {
  166. COMMAND_EL = BIT(15),
  167. COMMAND_S = BIT(14),
  168. COMMAND_I = BIT(13),
  169. COMMAND_NC = BIT(4),
  170. COMMAND_SF = BIT(3),
  171. COMMAND_CMD = BITS(2, 0),
  172. } scb_command_bit;
  173. typedef enum {
  174. STATUS_C = BIT(15),
  175. STATUS_OK = BIT(13),
  176. } scb_status_bit;
  177. typedef struct {
  178. uint32_t tx_good_frames, tx_max_collisions, tx_late_collisions,
  179. tx_underruns, tx_lost_crs, tx_deferred, tx_single_collisions,
  180. tx_multiple_collisions, tx_total_collisions;
  181. uint32_t rx_good_frames, rx_crc_errors, rx_alignment_errors,
  182. rx_resource_errors, rx_overrun_errors, rx_cdt_errors,
  183. rx_short_frame_errors;
  184. uint32_t fc_xmt_pause, fc_rcv_pause, fc_rcv_unsupported;
  185. uint16_t xmt_tco_frames, rcv_tco_frames;
  186. /* TODO: i82559 has six reserved statistics but a total of 24 dwords. */
  187. uint32_t reserved[4];
  188. } eepro100_stats_t;
  189. typedef enum {
  190. cu_idle = 0,
  191. cu_suspended = 1,
  192. cu_active = 2,
  193. cu_lpq_active = 2,
  194. cu_hqp_active = 3
  195. } cu_state_t;
  196. typedef enum {
  197. ru_idle = 0,
  198. ru_suspended = 1,
  199. ru_no_resources = 2,
  200. ru_ready = 4
  201. } ru_state_t;
  202. typedef struct {
  203. PCIDevice dev;
  204. /* Hash register (multicast mask array, multiple individual addresses). */
  205. uint8_t mult[8];
  206. int mmio_index;
  207. NICState *nic;
  208. NICConf conf;
  209. uint8_t scb_stat; /* SCB stat/ack byte */
  210. uint8_t int_stat; /* PCI interrupt status */
  211. /* region must not be saved by nic_save. */
  212. uint32_t region1; /* PCI region 1 address */
  213. uint16_t mdimem[32];
  214. eeprom_t *eeprom;
  215. uint32_t device; /* device variant */
  216. /* (cu_base + cu_offset) address the next command block in the command block list. */
  217. uint32_t cu_base; /* CU base address */
  218. uint32_t cu_offset; /* CU address offset */
  219. /* (ru_base + ru_offset) address the RFD in the Receive Frame Area. */
  220. uint32_t ru_base; /* RU base address */
  221. uint32_t ru_offset; /* RU address offset */
  222. uint32_t statsaddr; /* pointer to eepro100_stats_t */
  223. /* Temporary status information (no need to save these values),
  224. * used while processing CU commands. */
  225. eepro100_tx_t tx; /* transmit buffer descriptor */
  226. uint32_t cb_address; /* = cu_base + cu_offset */
  227. /* Statistical counters. Also used for wake-up packet (i82559). */
  228. eepro100_stats_t statistics;
  229. /* Data in mem is always in the byte order of the controller (le).
  230. * It must be dword aligned to allow direct access to 32 bit values. */
  231. uint8_t mem[PCI_MEM_SIZE] __attribute__((aligned(8)));;
  232. /* Configuration bytes. */
  233. uint8_t configuration[22];
  234. /* vmstate for each particular nic */
  235. VMStateDescription *vmstate;
  236. /* Quasi static device properties (no need to save them). */
  237. uint16_t stats_size;
  238. bool has_extended_tcb_support;
  239. } EEPRO100State;
  240. /* Word indices in EEPROM. */
  241. typedef enum {
  242. EEPROM_CNFG_MDIX = 0x03,
  243. EEPROM_ID = 0x05,
  244. EEPROM_PHY_ID = 0x06,
  245. EEPROM_VENDOR_ID = 0x0c,
  246. EEPROM_CONFIG_ASF = 0x0d,
  247. EEPROM_DEVICE_ID = 0x23,
  248. EEPROM_SMBUS_ADDR = 0x90,
  249. } EEPROMOffset;
  250. /* Bit values for EEPROM ID word. */
  251. typedef enum {
  252. EEPROM_ID_MDM = BIT(0), /* Modem */
  253. EEPROM_ID_STB = BIT(1), /* Standby Enable */
  254. EEPROM_ID_WMR = BIT(2), /* ??? */
  255. EEPROM_ID_WOL = BIT(5), /* Wake on LAN */
  256. EEPROM_ID_DPD = BIT(6), /* Deep Power Down */
  257. EEPROM_ID_ALT = BIT(7), /* */
  258. /* BITS(10, 8) device revision */
  259. EEPROM_ID_BD = BIT(11), /* boot disable */
  260. EEPROM_ID_ID = BIT(13), /* id bit */
  261. /* BITS(15, 14) signature */
  262. EEPROM_ID_VALID = BIT(14), /* signature for valid eeprom */
  263. } eeprom_id_bit;
  264. /* Default values for MDI (PHY) registers */
  265. static const uint16_t eepro100_mdi_default[] = {
  266. /* MDI Registers 0 - 6, 7 */
  267. 0x3000, 0x780d, 0x02a8, 0x0154, 0x05e1, 0x0000, 0x0000, 0x0000,
  268. /* MDI Registers 8 - 15 */
  269. 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  270. /* MDI Registers 16 - 31 */
  271. 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  272. 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  273. };
  274. /* Readonly mask for MDI (PHY) registers */
  275. static const uint16_t eepro100_mdi_mask[] = {
  276. 0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
  277. 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  278. 0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
  279. 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  280. };
  281. /* Read a 16 bit little endian value from physical memory. */
  282. static uint16_t e100_ldw_le_phys(target_phys_addr_t addr)
  283. {
  284. /* Load 16 bit (little endian) word from emulated hardware. */
  285. uint16_t val;
  286. cpu_physical_memory_read(addr, &val, sizeof(val));
  287. return le16_to_cpu(val);
  288. }
  289. /* Read a 32 bit little endian value from physical memory. */
  290. static uint32_t e100_ldl_le_phys(target_phys_addr_t addr)
  291. {
  292. /* Load 32 bit (little endian) word from emulated hardware. */
  293. uint32_t val;
  294. cpu_physical_memory_read(addr, &val, sizeof(val));
  295. return le32_to_cpu(val);
  296. }
  297. /* Write a 16 bit little endian value to physical memory. */
  298. static void e100_stw_le_phys(target_phys_addr_t addr, uint16_t val)
  299. {
  300. val = cpu_to_le16(val);
  301. cpu_physical_memory_write(addr, &val, sizeof(val));
  302. }
  303. /* Write a 32 bit little endian value to physical memory. */
  304. static void e100_stl_le_phys(target_phys_addr_t addr, uint32_t val)
  305. {
  306. val = cpu_to_le32(val);
  307. cpu_physical_memory_write(addr, &val, sizeof(val));
  308. }
  309. #define POLYNOMIAL 0x04c11db6
  310. /* From FreeBSD */
  311. /* XXX: optimize */
  312. static unsigned compute_mcast_idx(const uint8_t * ep)
  313. {
  314. uint32_t crc;
  315. int carry, i, j;
  316. uint8_t b;
  317. crc = 0xffffffff;
  318. for (i = 0; i < 6; i++) {
  319. b = *ep++;
  320. for (j = 0; j < 8; j++) {
  321. carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
  322. crc <<= 1;
  323. b >>= 1;
  324. if (carry) {
  325. crc = ((crc ^ POLYNOMIAL) | carry);
  326. }
  327. }
  328. }
  329. return (crc & BITS(7, 2)) >> 2;
  330. }
  331. /* Read a 16 bit control/status (CSR) register. */
  332. static uint16_t e100_read_reg2(EEPRO100State *s, E100RegisterOffset addr)
  333. {
  334. assert(!((uintptr_t)&s->mem[addr] & 1));
  335. return le16_to_cpup((uint16_t *)&s->mem[addr]);
  336. }
  337. /* Read a 32 bit control/status (CSR) register. */
  338. static uint32_t e100_read_reg4(EEPRO100State *s, E100RegisterOffset addr)
  339. {
  340. assert(!((uintptr_t)&s->mem[addr] & 3));
  341. return le32_to_cpup((uint32_t *)&s->mem[addr]);
  342. }
  343. /* Write a 16 bit control/status (CSR) register. */
  344. static void e100_write_reg2(EEPRO100State *s, E100RegisterOffset addr,
  345. uint16_t val)
  346. {
  347. assert(!((uintptr_t)&s->mem[addr] & 1));
  348. cpu_to_le16w((uint16_t *)&s->mem[addr], val);
  349. }
  350. /* Read a 32 bit control/status (CSR) register. */
  351. static void e100_write_reg4(EEPRO100State *s, E100RegisterOffset addr,
  352. uint32_t val)
  353. {
  354. assert(!((uintptr_t)&s->mem[addr] & 3));
  355. cpu_to_le32w((uint32_t *)&s->mem[addr], val);
  356. }
  357. #if defined(DEBUG_EEPRO100)
  358. static const char *nic_dump(const uint8_t * buf, unsigned size)
  359. {
  360. static char dump[3 * 16 + 1];
  361. char *p = &dump[0];
  362. if (size > 16) {
  363. size = 16;
  364. }
  365. while (size-- > 0) {
  366. p += sprintf(p, " %02x", *buf++);
  367. }
  368. return dump;
  369. }
  370. #endif /* DEBUG_EEPRO100 */
  371. enum scb_stat_ack {
  372. stat_ack_not_ours = 0x00,
  373. stat_ack_sw_gen = 0x04,
  374. stat_ack_rnr = 0x10,
  375. stat_ack_cu_idle = 0x20,
  376. stat_ack_frame_rx = 0x40,
  377. stat_ack_cu_cmd_done = 0x80,
  378. stat_ack_not_present = 0xFF,
  379. stat_ack_rx = (stat_ack_sw_gen | stat_ack_rnr | stat_ack_frame_rx),
  380. stat_ack_tx = (stat_ack_cu_idle | stat_ack_cu_cmd_done),
  381. };
  382. static void disable_interrupt(EEPRO100State * s)
  383. {
  384. if (s->int_stat) {
  385. TRACE(INT, logout("interrupt disabled\n"));
  386. qemu_irq_lower(s->dev.irq[0]);
  387. s->int_stat = 0;
  388. }
  389. }
  390. static void enable_interrupt(EEPRO100State * s)
  391. {
  392. if (!s->int_stat) {
  393. TRACE(INT, logout("interrupt enabled\n"));
  394. qemu_irq_raise(s->dev.irq[0]);
  395. s->int_stat = 1;
  396. }
  397. }
  398. static void eepro100_acknowledge(EEPRO100State * s)
  399. {
  400. s->scb_stat &= ~s->mem[SCBAck];
  401. s->mem[SCBAck] = s->scb_stat;
  402. if (s->scb_stat == 0) {
  403. disable_interrupt(s);
  404. }
  405. }
  406. static void eepro100_interrupt(EEPRO100State * s, uint8_t status)
  407. {
  408. uint8_t mask = ~s->mem[SCBIntmask];
  409. s->mem[SCBAck] |= status;
  410. status = s->scb_stat = s->mem[SCBAck];
  411. status &= (mask | 0x0f);
  412. #if 0
  413. status &= (~s->mem[SCBIntmask] | 0x0xf);
  414. #endif
  415. if (status && (mask & 0x01)) {
  416. /* SCB mask and SCB Bit M do not disable interrupt. */
  417. enable_interrupt(s);
  418. } else if (s->int_stat) {
  419. disable_interrupt(s);
  420. }
  421. }
  422. static void eepro100_cx_interrupt(EEPRO100State * s)
  423. {
  424. /* CU completed action command. */
  425. /* Transmit not ok (82557 only, not in emulation). */
  426. eepro100_interrupt(s, 0x80);
  427. }
  428. static void eepro100_cna_interrupt(EEPRO100State * s)
  429. {
  430. /* CU left the active state. */
  431. eepro100_interrupt(s, 0x20);
  432. }
  433. static void eepro100_fr_interrupt(EEPRO100State * s)
  434. {
  435. /* RU received a complete frame. */
  436. eepro100_interrupt(s, 0x40);
  437. }
  438. static void eepro100_rnr_interrupt(EEPRO100State * s)
  439. {
  440. /* RU is not ready. */
  441. eepro100_interrupt(s, 0x10);
  442. }
  443. static void eepro100_mdi_interrupt(EEPRO100State * s)
  444. {
  445. /* MDI completed read or write cycle. */
  446. eepro100_interrupt(s, 0x08);
  447. }
  448. static void eepro100_swi_interrupt(EEPRO100State * s)
  449. {
  450. /* Software has requested an interrupt. */
  451. eepro100_interrupt(s, 0x04);
  452. }
  453. #if 0
  454. static void eepro100_fcp_interrupt(EEPRO100State * s)
  455. {
  456. /* Flow control pause interrupt (82558 and later). */
  457. eepro100_interrupt(s, 0x01);
  458. }
  459. #endif
  460. static void e100_pci_reset(EEPRO100State * s, E100PCIDeviceInfo *e100_device)
  461. {
  462. uint32_t device = s->device;
  463. uint8_t *pci_conf = s->dev.config;
  464. TRACE(OTHER, logout("%p\n", s));
  465. /* PCI Status */
  466. pci_set_word(pci_conf + PCI_STATUS, PCI_STATUS_DEVSEL_MEDIUM |
  467. PCI_STATUS_FAST_BACK);
  468. /* PCI Latency Timer */
  469. pci_set_byte(pci_conf + PCI_LATENCY_TIMER, 0x20); /* latency timer = 32 clocks */
  470. /* Capability Pointer is set by PCI framework. */
  471. /* Interrupt Line */
  472. /* Interrupt Pin */
  473. pci_set_byte(pci_conf + PCI_INTERRUPT_PIN, 1); /* interrupt pin A */
  474. /* Minimum Grant */
  475. pci_set_byte(pci_conf + PCI_MIN_GNT, 0x08);
  476. /* Maximum Latency */
  477. pci_set_byte(pci_conf + PCI_MAX_LAT, 0x18);
  478. s->stats_size = e100_device->stats_size;
  479. s->has_extended_tcb_support = e100_device->has_extended_tcb_support;
  480. switch (device) {
  481. case i82550:
  482. case i82551:
  483. case i82557A:
  484. case i82557B:
  485. case i82557C:
  486. case i82558A:
  487. case i82558B:
  488. case i82559A:
  489. case i82559B:
  490. case i82559ER:
  491. case i82562:
  492. case i82801:
  493. case i82559C:
  494. break;
  495. default:
  496. logout("Device %X is undefined!\n", device);
  497. }
  498. /* Standard TxCB. */
  499. s->configuration[6] |= BIT(4);
  500. /* Standard statistical counters. */
  501. s->configuration[6] |= BIT(5);
  502. if (s->stats_size == 80) {
  503. /* TODO: check TCO Statistical Counters bit. Documentation not clear. */
  504. if (s->configuration[6] & BIT(2)) {
  505. /* TCO statistical counters. */
  506. assert(s->configuration[6] & BIT(5));
  507. } else {
  508. if (s->configuration[6] & BIT(5)) {
  509. /* No extended statistical counters, i82557 compatible. */
  510. s->stats_size = 64;
  511. } else {
  512. /* i82558 compatible. */
  513. s->stats_size = 76;
  514. }
  515. }
  516. } else {
  517. if (s->configuration[6] & BIT(5)) {
  518. /* No extended statistical counters. */
  519. s->stats_size = 64;
  520. }
  521. }
  522. assert(s->stats_size > 0 && s->stats_size <= sizeof(s->statistics));
  523. if (e100_device->power_management) {
  524. /* Power Management Capabilities */
  525. int cfg_offset = 0xdc;
  526. int r = pci_add_capability(&s->dev, PCI_CAP_ID_PM,
  527. cfg_offset, PCI_PM_SIZEOF);
  528. assert(r >= 0);
  529. pci_set_word(pci_conf + cfg_offset + PCI_PM_PMC, 0x7e21);
  530. #if 0 /* TODO: replace dummy code for power management emulation. */
  531. /* TODO: Power Management Control / Status. */
  532. pci_set_word(pci_conf + cfg_offset + PCI_PM_CTRL, 0x0000);
  533. /* TODO: Ethernet Power Consumption Registers (i82559 and later). */
  534. pci_set_byte(pci_conf + cfg_offset + PCI_PM_PPB_EXTENSIONS, 0x0000);
  535. #endif
  536. }
  537. #if EEPROM_SIZE > 0
  538. if (device == i82557C || device == i82558B || device == i82559C) {
  539. /*
  540. TODO: get vendor id from EEPROM for i82557C or later.
  541. TODO: get device id from EEPROM for i82557C or later.
  542. TODO: status bit 4 can be disabled by EEPROM for i82558, i82559.
  543. TODO: header type is determined by EEPROM for i82559.
  544. TODO: get subsystem id from EEPROM for i82557C or later.
  545. TODO: get subsystem vendor id from EEPROM for i82557C or later.
  546. TODO: exp. rom baddr depends on a bit in EEPROM for i82558 or later.
  547. TODO: capability pointer depends on EEPROM for i82558.
  548. */
  549. logout("Get device id and revision from EEPROM!!!\n");
  550. }
  551. #endif /* EEPROM_SIZE > 0 */
  552. }
  553. static void nic_selective_reset(EEPRO100State * s)
  554. {
  555. size_t i;
  556. uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom);
  557. #if 0
  558. eeprom93xx_reset(s->eeprom);
  559. #endif
  560. memcpy(eeprom_contents, s->conf.macaddr.a, 6);
  561. eeprom_contents[EEPROM_ID] = EEPROM_ID_VALID;
  562. if (s->device == i82557B || s->device == i82557C)
  563. eeprom_contents[5] = 0x0100;
  564. eeprom_contents[EEPROM_PHY_ID] = 1;
  565. uint16_t sum = 0;
  566. for (i = 0; i < EEPROM_SIZE - 1; i++) {
  567. sum += eeprom_contents[i];
  568. }
  569. eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum;
  570. TRACE(EEPROM, logout("checksum=0x%04x\n", eeprom_contents[EEPROM_SIZE - 1]));
  571. memset(s->mem, 0, sizeof(s->mem));
  572. e100_write_reg4(s, SCBCtrlMDI, BIT(21));
  573. assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default));
  574. memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem));
  575. }
  576. static void nic_reset(void *opaque)
  577. {
  578. EEPRO100State *s = opaque;
  579. TRACE(OTHER, logout("%p\n", s));
  580. /* TODO: Clearing of hash register for selective reset, too? */
  581. memset(&s->mult[0], 0, sizeof(s->mult));
  582. nic_selective_reset(s);
  583. }
  584. #if defined(DEBUG_EEPRO100)
  585. static const char * const e100_reg[PCI_IO_SIZE / 4] = {
  586. "Command/Status",
  587. "General Pointer",
  588. "Port",
  589. "EEPROM/Flash Control",
  590. "MDI Control",
  591. "Receive DMA Byte Count",
  592. "Flow Control",
  593. "General Status/Control"
  594. };
  595. static char *regname(uint32_t addr)
  596. {
  597. static char buf[32];
  598. if (addr < PCI_IO_SIZE) {
  599. const char *r = e100_reg[addr / 4];
  600. if (r != 0) {
  601. snprintf(buf, sizeof(buf), "%s+%u", r, addr % 4);
  602. } else {
  603. snprintf(buf, sizeof(buf), "0x%02x", addr);
  604. }
  605. } else {
  606. snprintf(buf, sizeof(buf), "??? 0x%08x", addr);
  607. }
  608. return buf;
  609. }
  610. #endif /* DEBUG_EEPRO100 */
  611. /*****************************************************************************
  612. *
  613. * Command emulation.
  614. *
  615. ****************************************************************************/
  616. #if 0
  617. static uint16_t eepro100_read_command(EEPRO100State * s)
  618. {
  619. uint16_t val = 0xffff;
  620. TRACE(OTHER, logout("val=0x%04x\n", val));
  621. return val;
  622. }
  623. #endif
  624. /* Commands that can be put in a command list entry. */
  625. enum commands {
  626. CmdNOp = 0,
  627. CmdIASetup = 1,
  628. CmdConfigure = 2,
  629. CmdMulticastList = 3,
  630. CmdTx = 4,
  631. CmdTDR = 5, /* load microcode */
  632. CmdDump = 6,
  633. CmdDiagnose = 7,
  634. /* And some extra flags: */
  635. CmdSuspend = 0x4000, /* Suspend after completion. */
  636. CmdIntr = 0x2000, /* Interrupt after completion. */
  637. CmdTxFlex = 0x0008, /* Use "Flexible mode" for CmdTx command. */
  638. };
  639. static cu_state_t get_cu_state(EEPRO100State * s)
  640. {
  641. return ((s->mem[SCBStatus] & BITS(7, 6)) >> 6);
  642. }
  643. static void set_cu_state(EEPRO100State * s, cu_state_t state)
  644. {
  645. s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(7, 6)) + (state << 6);
  646. }
  647. static ru_state_t get_ru_state(EEPRO100State * s)
  648. {
  649. return ((s->mem[SCBStatus] & BITS(5, 2)) >> 2);
  650. }
  651. static void set_ru_state(EEPRO100State * s, ru_state_t state)
  652. {
  653. s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(5, 2)) + (state << 2);
  654. }
  655. static void dump_statistics(EEPRO100State * s)
  656. {
  657. /* Dump statistical data. Most data is never changed by the emulation
  658. * and always 0, so we first just copy the whole block and then those
  659. * values which really matter.
  660. * Number of data should check configuration!!!
  661. */
  662. cpu_physical_memory_write(s->statsaddr, &s->statistics, s->stats_size);
  663. e100_stl_le_phys(s->statsaddr + 0, s->statistics.tx_good_frames);
  664. e100_stl_le_phys(s->statsaddr + 36, s->statistics.rx_good_frames);
  665. e100_stl_le_phys(s->statsaddr + 48, s->statistics.rx_resource_errors);
  666. e100_stl_le_phys(s->statsaddr + 60, s->statistics.rx_short_frame_errors);
  667. #if 0
  668. e100_stw_le_phys(s->statsaddr + 76, s->statistics.xmt_tco_frames);
  669. e100_stw_le_phys(s->statsaddr + 78, s->statistics.rcv_tco_frames);
  670. missing("CU dump statistical counters");
  671. #endif
  672. }
  673. static void read_cb(EEPRO100State *s)
  674. {
  675. cpu_physical_memory_read(s->cb_address, &s->tx, sizeof(s->tx));
  676. s->tx.status = le16_to_cpu(s->tx.status);
  677. s->tx.command = le16_to_cpu(s->tx.command);
  678. s->tx.link = le32_to_cpu(s->tx.link);
  679. s->tx.tbd_array_addr = le32_to_cpu(s->tx.tbd_array_addr);
  680. s->tx.tcb_bytes = le16_to_cpu(s->tx.tcb_bytes);
  681. }
  682. static void tx_command(EEPRO100State *s)
  683. {
  684. uint32_t tbd_array = le32_to_cpu(s->tx.tbd_array_addr);
  685. uint16_t tcb_bytes = (le16_to_cpu(s->tx.tcb_bytes) & 0x3fff);
  686. /* Sends larger than MAX_ETH_FRAME_SIZE are allowed, up to 2600 bytes. */
  687. uint8_t buf[2600];
  688. uint16_t size = 0;
  689. uint32_t tbd_address = s->cb_address + 0x10;
  690. TRACE(RXTX, logout
  691. ("transmit, TBD array address 0x%08x, TCB byte count 0x%04x, TBD count %u\n",
  692. tbd_array, tcb_bytes, s->tx.tbd_count));
  693. if (tcb_bytes > 2600) {
  694. logout("TCB byte count too large, using 2600\n");
  695. tcb_bytes = 2600;
  696. }
  697. if (!((tcb_bytes > 0) || (tbd_array != 0xffffffff))) {
  698. logout
  699. ("illegal values of TBD array address and TCB byte count!\n");
  700. }
  701. assert(tcb_bytes <= sizeof(buf));
  702. while (size < tcb_bytes) {
  703. uint32_t tx_buffer_address = e100_ldl_le_phys(tbd_address);
  704. uint16_t tx_buffer_size = e100_ldw_le_phys(tbd_address + 4);
  705. #if 0
  706. uint16_t tx_buffer_el = e100_ldw_le_phys(tbd_address + 6);
  707. #endif
  708. tbd_address += 8;
  709. TRACE(RXTX, logout
  710. ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
  711. tx_buffer_address, tx_buffer_size));
  712. tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
  713. cpu_physical_memory_read(tx_buffer_address, &buf[size],
  714. tx_buffer_size);
  715. size += tx_buffer_size;
  716. }
  717. if (tbd_array == 0xffffffff) {
  718. /* Simplified mode. Was already handled by code above. */
  719. } else {
  720. /* Flexible mode. */
  721. uint8_t tbd_count = 0;
  722. if (s->has_extended_tcb_support && !(s->configuration[6] & BIT(4))) {
  723. /* Extended Flexible TCB. */
  724. for (; tbd_count < 2; tbd_count++) {
  725. uint32_t tx_buffer_address = e100_ldl_le_phys(tbd_address);
  726. uint16_t tx_buffer_size = e100_ldw_le_phys(tbd_address + 4);
  727. uint16_t tx_buffer_el = e100_ldw_le_phys(tbd_address + 6);
  728. tbd_address += 8;
  729. TRACE(RXTX, logout
  730. ("TBD (extended flexible mode): buffer address 0x%08x, size 0x%04x\n",
  731. tx_buffer_address, tx_buffer_size));
  732. tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
  733. cpu_physical_memory_read(tx_buffer_address, &buf[size],
  734. tx_buffer_size);
  735. size += tx_buffer_size;
  736. if (tx_buffer_el & 1) {
  737. break;
  738. }
  739. }
  740. }
  741. tbd_address = tbd_array;
  742. for (; tbd_count < s->tx.tbd_count; tbd_count++) {
  743. uint32_t tx_buffer_address = e100_ldl_le_phys(tbd_address);
  744. uint16_t tx_buffer_size = e100_ldw_le_phys(tbd_address + 4);
  745. uint16_t tx_buffer_el = e100_ldw_le_phys(tbd_address + 6);
  746. tbd_address += 8;
  747. TRACE(RXTX, logout
  748. ("TBD (flexible mode): buffer address 0x%08x, size 0x%04x\n",
  749. tx_buffer_address, tx_buffer_size));
  750. tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size);
  751. cpu_physical_memory_read(tx_buffer_address, &buf[size],
  752. tx_buffer_size);
  753. size += tx_buffer_size;
  754. if (tx_buffer_el & 1) {
  755. break;
  756. }
  757. }
  758. }
  759. TRACE(RXTX, logout("%p sending frame, len=%d,%s\n", s, size, nic_dump(buf, size)));
  760. qemu_send_packet(&s->nic->nc, buf, size);
  761. s->statistics.tx_good_frames++;
  762. /* Transmit with bad status would raise an CX/TNO interrupt.
  763. * (82557 only). Emulation never has bad status. */
  764. #if 0
  765. eepro100_cx_interrupt(s);
  766. #endif
  767. }
  768. static void set_multicast_list(EEPRO100State *s)
  769. {
  770. uint16_t multicast_count = s->tx.tbd_array_addr & BITS(13, 0);
  771. uint16_t i;
  772. memset(&s->mult[0], 0, sizeof(s->mult));
  773. TRACE(OTHER, logout("multicast list, multicast count = %u\n", multicast_count));
  774. for (i = 0; i < multicast_count; i += 6) {
  775. uint8_t multicast_addr[6];
  776. cpu_physical_memory_read(s->cb_address + 10 + i, multicast_addr, 6);
  777. TRACE(OTHER, logout("multicast entry %s\n", nic_dump(multicast_addr, 6)));
  778. unsigned mcast_idx = compute_mcast_idx(multicast_addr);
  779. assert(mcast_idx < 64);
  780. s->mult[mcast_idx >> 3] |= (1 << (mcast_idx & 7));
  781. }
  782. }
  783. static void action_command(EEPRO100State *s)
  784. {
  785. for (;;) {
  786. bool bit_el;
  787. bool bit_s;
  788. bool bit_i;
  789. bool bit_nc;
  790. uint16_t ok_status = STATUS_OK;
  791. s->cb_address = s->cu_base + s->cu_offset;
  792. read_cb(s);
  793. bit_el = ((s->tx.command & COMMAND_EL) != 0);
  794. bit_s = ((s->tx.command & COMMAND_S) != 0);
  795. bit_i = ((s->tx.command & COMMAND_I) != 0);
  796. bit_nc = ((s->tx.command & COMMAND_NC) != 0);
  797. #if 0
  798. bool bit_sf = ((s->tx.command & COMMAND_SF) != 0);
  799. #endif
  800. s->cu_offset = s->tx.link;
  801. TRACE(OTHER,
  802. logout("val=(cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
  803. s->tx.status, s->tx.command, s->tx.link));
  804. switch (s->tx.command & COMMAND_CMD) {
  805. case CmdNOp:
  806. /* Do nothing. */
  807. break;
  808. case CmdIASetup:
  809. cpu_physical_memory_read(s->cb_address + 8, &s->conf.macaddr.a[0], 6);
  810. TRACE(OTHER, logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6)));
  811. break;
  812. case CmdConfigure:
  813. cpu_physical_memory_read(s->cb_address + 8, &s->configuration[0],
  814. sizeof(s->configuration));
  815. TRACE(OTHER, logout("configuration: %s\n",
  816. nic_dump(&s->configuration[0], 16)));
  817. TRACE(OTHER, logout("configuration: %s\n",
  818. nic_dump(&s->configuration[16],
  819. ARRAY_SIZE(s->configuration) - 16)));
  820. if (s->configuration[20] & BIT(6)) {
  821. TRACE(OTHER, logout("Multiple IA bit\n"));
  822. }
  823. break;
  824. case CmdMulticastList:
  825. set_multicast_list(s);
  826. break;
  827. case CmdTx:
  828. if (bit_nc) {
  829. missing("CmdTx: NC = 0");
  830. ok_status = 0;
  831. break;
  832. }
  833. tx_command(s);
  834. break;
  835. case CmdTDR:
  836. TRACE(OTHER, logout("load microcode\n"));
  837. /* Starting with offset 8, the command contains
  838. * 64 dwords microcode which we just ignore here. */
  839. break;
  840. case CmdDiagnose:
  841. TRACE(OTHER, logout("diagnose\n"));
  842. /* Make sure error flag is not set. */
  843. s->tx.status = 0;
  844. break;
  845. default:
  846. missing("undefined command");
  847. ok_status = 0;
  848. break;
  849. }
  850. /* Write new status. */
  851. e100_stw_le_phys(s->cb_address, s->tx.status | ok_status | STATUS_C);
  852. if (bit_i) {
  853. /* CU completed action. */
  854. eepro100_cx_interrupt(s);
  855. }
  856. if (bit_el) {
  857. /* CU becomes idle. Terminate command loop. */
  858. set_cu_state(s, cu_idle);
  859. eepro100_cna_interrupt(s);
  860. break;
  861. } else if (bit_s) {
  862. /* CU becomes suspended. Terminate command loop. */
  863. set_cu_state(s, cu_suspended);
  864. eepro100_cna_interrupt(s);
  865. break;
  866. } else {
  867. /* More entries in list. */
  868. TRACE(OTHER, logout("CU list with at least one more entry\n"));
  869. }
  870. }
  871. TRACE(OTHER, logout("CU list empty\n"));
  872. /* List is empty. Now CU is idle or suspended. */
  873. }
  874. static void eepro100_cu_command(EEPRO100State * s, uint8_t val)
  875. {
  876. cu_state_t cu_state;
  877. switch (val) {
  878. case CU_NOP:
  879. /* No operation. */
  880. break;
  881. case CU_START:
  882. cu_state = get_cu_state(s);
  883. if (cu_state != cu_idle && cu_state != cu_suspended) {
  884. /* Intel documentation says that CU must be idle or suspended
  885. * for the CU start command. */
  886. logout("unexpected CU state is %u\n", cu_state);
  887. }
  888. set_cu_state(s, cu_active);
  889. s->cu_offset = e100_read_reg4(s, SCBPointer);
  890. action_command(s);
  891. break;
  892. case CU_RESUME:
  893. if (get_cu_state(s) != cu_suspended) {
  894. logout("bad CU resume from CU state %u\n", get_cu_state(s));
  895. /* Workaround for bad Linux eepro100 driver which resumes
  896. * from idle state. */
  897. #if 0
  898. missing("cu resume");
  899. #endif
  900. set_cu_state(s, cu_suspended);
  901. }
  902. if (get_cu_state(s) == cu_suspended) {
  903. TRACE(OTHER, logout("CU resuming\n"));
  904. set_cu_state(s, cu_active);
  905. action_command(s);
  906. }
  907. break;
  908. case CU_STATSADDR:
  909. /* Load dump counters address. */
  910. s->statsaddr = e100_read_reg4(s, SCBPointer);
  911. TRACE(OTHER, logout("val=0x%02x (status address)\n", val));
  912. break;
  913. case CU_SHOWSTATS:
  914. /* Dump statistical counters. */
  915. TRACE(OTHER, logout("val=0x%02x (dump stats)\n", val));
  916. dump_statistics(s);
  917. e100_stl_le_phys(s->statsaddr + s->stats_size, 0xa005);
  918. break;
  919. case CU_CMD_BASE:
  920. /* Load CU base. */
  921. TRACE(OTHER, logout("val=0x%02x (CU base address)\n", val));
  922. s->cu_base = e100_read_reg4(s, SCBPointer);
  923. break;
  924. case CU_DUMPSTATS:
  925. /* Dump and reset statistical counters. */
  926. TRACE(OTHER, logout("val=0x%02x (dump stats and reset)\n", val));
  927. dump_statistics(s);
  928. e100_stl_le_phys(s->statsaddr + s->stats_size, 0xa007);
  929. memset(&s->statistics, 0, sizeof(s->statistics));
  930. break;
  931. case CU_SRESUME:
  932. /* CU static resume. */
  933. missing("CU static resume");
  934. break;
  935. default:
  936. missing("Undefined CU command");
  937. }
  938. }
  939. static void eepro100_ru_command(EEPRO100State * s, uint8_t val)
  940. {
  941. switch (val) {
  942. case RU_NOP:
  943. /* No operation. */
  944. break;
  945. case RX_START:
  946. /* RU start. */
  947. if (get_ru_state(s) != ru_idle) {
  948. logout("RU state is %u, should be %u\n", get_ru_state(s), ru_idle);
  949. #if 0
  950. assert(!"wrong RU state");
  951. #endif
  952. }
  953. set_ru_state(s, ru_ready);
  954. s->ru_offset = e100_read_reg4(s, SCBPointer);
  955. TRACE(OTHER, logout("val=0x%02x (rx start)\n", val));
  956. break;
  957. case RX_RESUME:
  958. /* Restart RU. */
  959. if (get_ru_state(s) != ru_suspended) {
  960. logout("RU state is %u, should be %u\n", get_ru_state(s),
  961. ru_suspended);
  962. #if 0
  963. assert(!"wrong RU state");
  964. #endif
  965. }
  966. set_ru_state(s, ru_ready);
  967. break;
  968. case RU_ABORT:
  969. /* RU abort. */
  970. if (get_ru_state(s) == ru_ready) {
  971. eepro100_rnr_interrupt(s);
  972. }
  973. set_ru_state(s, ru_idle);
  974. break;
  975. case RX_ADDR_LOAD:
  976. /* Load RU base. */
  977. TRACE(OTHER, logout("val=0x%02x (RU base address)\n", val));
  978. s->ru_base = e100_read_reg4(s, SCBPointer);
  979. break;
  980. default:
  981. logout("val=0x%02x (undefined RU command)\n", val);
  982. missing("Undefined SU command");
  983. }
  984. }
  985. static void eepro100_write_command(EEPRO100State * s, uint8_t val)
  986. {
  987. eepro100_ru_command(s, val & 0x0f);
  988. eepro100_cu_command(s, val & 0xf0);
  989. if ((val) == 0) {
  990. TRACE(OTHER, logout("val=0x%02x\n", val));
  991. }
  992. /* Clear command byte after command was accepted. */
  993. s->mem[SCBCmd] = 0;
  994. }
  995. /*****************************************************************************
  996. *
  997. * EEPROM emulation.
  998. *
  999. ****************************************************************************/
  1000. #define EEPROM_CS 0x02
  1001. #define EEPROM_SK 0x01
  1002. #define EEPROM_DI 0x04
  1003. #define EEPROM_DO 0x08
  1004. static uint16_t eepro100_read_eeprom(EEPRO100State * s)
  1005. {
  1006. uint16_t val = e100_read_reg2(s, SCBeeprom);
  1007. if (eeprom93xx_read(s->eeprom)) {
  1008. val |= EEPROM_DO;
  1009. } else {
  1010. val &= ~EEPROM_DO;
  1011. }
  1012. TRACE(EEPROM, logout("val=0x%04x\n", val));
  1013. return val;
  1014. }
  1015. static void eepro100_write_eeprom(eeprom_t * eeprom, uint8_t val)
  1016. {
  1017. TRACE(EEPROM, logout("val=0x%02x\n", val));
  1018. /* mask unwritable bits */
  1019. #if 0
  1020. val = SET_MASKED(val, 0x31, eeprom->value);
  1021. #endif
  1022. int eecs = ((val & EEPROM_CS) != 0);
  1023. int eesk = ((val & EEPROM_SK) != 0);
  1024. int eedi = ((val & EEPROM_DI) != 0);
  1025. eeprom93xx_write(eeprom, eecs, eesk, eedi);
  1026. }
  1027. /*****************************************************************************
  1028. *
  1029. * MDI emulation.
  1030. *
  1031. ****************************************************************************/
  1032. #if defined(DEBUG_EEPRO100)
  1033. static const char * const mdi_op_name[] = {
  1034. "opcode 0",
  1035. "write",
  1036. "read",
  1037. "opcode 3"
  1038. };
  1039. static const char * const mdi_reg_name[] = {
  1040. "Control",
  1041. "Status",
  1042. "PHY Identification (Word 1)",
  1043. "PHY Identification (Word 2)",
  1044. "Auto-Negotiation Advertisement",
  1045. "Auto-Negotiation Link Partner Ability",
  1046. "Auto-Negotiation Expansion"
  1047. };
  1048. static const char *reg2name(uint8_t reg)
  1049. {
  1050. static char buffer[10];
  1051. const char *p = buffer;
  1052. if (reg < ARRAY_SIZE(mdi_reg_name)) {
  1053. p = mdi_reg_name[reg];
  1054. } else {
  1055. snprintf(buffer, sizeof(buffer), "reg=0x%02x", reg);
  1056. }
  1057. return p;
  1058. }
  1059. #endif /* DEBUG_EEPRO100 */
  1060. static uint32_t eepro100_read_mdi(EEPRO100State * s)
  1061. {
  1062. uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
  1063. #ifdef DEBUG_EEPRO100
  1064. uint8_t raiseint = (val & BIT(29)) >> 29;
  1065. uint8_t opcode = (val & BITS(27, 26)) >> 26;
  1066. uint8_t phy = (val & BITS(25, 21)) >> 21;
  1067. uint8_t reg = (val & BITS(20, 16)) >> 16;
  1068. uint16_t data = (val & BITS(15, 0));
  1069. #endif
  1070. /* Emulation takes no time to finish MDI transaction. */
  1071. val |= BIT(28);
  1072. TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
  1073. val, raiseint, mdi_op_name[opcode], phy,
  1074. reg2name(reg), data));
  1075. return val;
  1076. }
  1077. static void eepro100_write_mdi(EEPRO100State *s)
  1078. {
  1079. uint32_t val = e100_read_reg4(s, SCBCtrlMDI);
  1080. uint8_t raiseint = (val & BIT(29)) >> 29;
  1081. uint8_t opcode = (val & BITS(27, 26)) >> 26;
  1082. uint8_t phy = (val & BITS(25, 21)) >> 21;
  1083. uint8_t reg = (val & BITS(20, 16)) >> 16;
  1084. uint16_t data = (val & BITS(15, 0));
  1085. TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
  1086. val, raiseint, mdi_op_name[opcode], phy, reg2name(reg), data));
  1087. if (phy != 1) {
  1088. /* Unsupported PHY address. */
  1089. #if 0
  1090. logout("phy must be 1 but is %u\n", phy);
  1091. #endif
  1092. data = 0;
  1093. } else if (opcode != 1 && opcode != 2) {
  1094. /* Unsupported opcode. */
  1095. logout("opcode must be 1 or 2 but is %u\n", opcode);
  1096. data = 0;
  1097. } else if (reg > 6) {
  1098. /* Unsupported register. */
  1099. logout("register must be 0...6 but is %u\n", reg);
  1100. data = 0;
  1101. } else {
  1102. TRACE(MDI, logout("val=0x%08x (int=%u, %s, phy=%u, %s, data=0x%04x\n",
  1103. val, raiseint, mdi_op_name[opcode], phy,
  1104. reg2name(reg), data));
  1105. if (opcode == 1) {
  1106. /* MDI write */
  1107. switch (reg) {
  1108. case 0: /* Control Register */
  1109. if (data & 0x8000) {
  1110. /* Reset status and control registers to default. */
  1111. s->mdimem[0] = eepro100_mdi_default[0];
  1112. s->mdimem[1] = eepro100_mdi_default[1];
  1113. data = s->mdimem[reg];
  1114. } else {
  1115. /* Restart Auto Configuration = Normal Operation */
  1116. data &= ~0x0200;
  1117. }
  1118. break;
  1119. case 1: /* Status Register */
  1120. missing("not writable");
  1121. data = s->mdimem[reg];
  1122. break;
  1123. case 2: /* PHY Identification Register (Word 1) */
  1124. case 3: /* PHY Identification Register (Word 2) */
  1125. missing("not implemented");
  1126. break;
  1127. case 4: /* Auto-Negotiation Advertisement Register */
  1128. case 5: /* Auto-Negotiation Link Partner Ability Register */
  1129. break;
  1130. case 6: /* Auto-Negotiation Expansion Register */
  1131. default:
  1132. missing("not implemented");
  1133. }
  1134. s->mdimem[reg] = data;
  1135. } else if (opcode == 2) {
  1136. /* MDI read */
  1137. switch (reg) {
  1138. case 0: /* Control Register */
  1139. if (data & 0x8000) {
  1140. /* Reset status and control registers to default. */
  1141. s->mdimem[0] = eepro100_mdi_default[0];
  1142. s->mdimem[1] = eepro100_mdi_default[1];
  1143. }
  1144. break;
  1145. case 1: /* Status Register */
  1146. s->mdimem[reg] |= 0x0020;
  1147. break;
  1148. case 2: /* PHY Identification Register (Word 1) */
  1149. case 3: /* PHY Identification Register (Word 2) */
  1150. case 4: /* Auto-Negotiation Advertisement Register */
  1151. break;
  1152. case 5: /* Auto-Negotiation Link Partner Ability Register */
  1153. s->mdimem[reg] = 0x41fe;
  1154. break;
  1155. case 6: /* Auto-Negotiation Expansion Register */
  1156. s->mdimem[reg] = 0x0001;
  1157. break;
  1158. }
  1159. data = s->mdimem[reg];
  1160. }
  1161. /* Emulation takes no time to finish MDI transaction.
  1162. * Set MDI bit in SCB status register. */
  1163. s->mem[SCBAck] |= 0x08;
  1164. val |= BIT(28);
  1165. if (raiseint) {
  1166. eepro100_mdi_interrupt(s);
  1167. }
  1168. }
  1169. val = (val & 0xffff0000) + data;
  1170. e100_write_reg4(s, SCBCtrlMDI, val);
  1171. }
  1172. /*****************************************************************************
  1173. *
  1174. * Port emulation.
  1175. *
  1176. ****************************************************************************/
  1177. #define PORT_SOFTWARE_RESET 0
  1178. #define PORT_SELFTEST 1
  1179. #define PORT_SELECTIVE_RESET 2
  1180. #define PORT_DUMP 3
  1181. #define PORT_SELECTION_MASK 3
  1182. typedef struct {
  1183. uint32_t st_sign; /* Self Test Signature */
  1184. uint32_t st_result; /* Self Test Results */
  1185. } eepro100_selftest_t;
  1186. static uint32_t eepro100_read_port(EEPRO100State * s)
  1187. {
  1188. return 0;
  1189. }
  1190. static void eepro100_write_port(EEPRO100State *s)
  1191. {
  1192. uint32_t val = e100_read_reg4(s, SCBPort);
  1193. uint32_t address = (val & ~PORT_SELECTION_MASK);
  1194. uint8_t selection = (val & PORT_SELECTION_MASK);
  1195. switch (selection) {
  1196. case PORT_SOFTWARE_RESET:
  1197. nic_reset(s);
  1198. break;
  1199. case PORT_SELFTEST:
  1200. TRACE(OTHER, logout("selftest address=0x%08x\n", address));
  1201. eepro100_selftest_t data;
  1202. cpu_physical_memory_read(address, &data, sizeof(data));
  1203. data.st_sign = 0xffffffff;
  1204. data.st_result = 0;
  1205. cpu_physical_memory_write(address, &data, sizeof(data));
  1206. break;
  1207. case PORT_SELECTIVE_RESET:
  1208. TRACE(OTHER, logout("selective reset, selftest address=0x%08x\n", address));
  1209. nic_selective_reset(s);
  1210. break;
  1211. default:
  1212. logout("val=0x%08x\n", val);
  1213. missing("unknown port selection");
  1214. }
  1215. }
  1216. /*****************************************************************************
  1217. *
  1218. * General hardware emulation.
  1219. *
  1220. ****************************************************************************/
  1221. static uint8_t eepro100_read1(EEPRO100State * s, uint32_t addr)
  1222. {
  1223. uint8_t val = 0;
  1224. if (addr <= sizeof(s->mem) - sizeof(val)) {
  1225. val = s->mem[addr];
  1226. }
  1227. switch (addr) {
  1228. case SCBStatus:
  1229. case SCBAck:
  1230. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1231. break;
  1232. case SCBCmd:
  1233. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1234. #if 0
  1235. val = eepro100_read_command(s);
  1236. #endif
  1237. break;
  1238. case SCBIntmask:
  1239. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1240. break;
  1241. case SCBPort + 3:
  1242. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1243. break;
  1244. case SCBeeprom:
  1245. val = eepro100_read_eeprom(s);
  1246. break;
  1247. case SCBCtrlMDI:
  1248. case SCBCtrlMDI + 1:
  1249. case SCBCtrlMDI + 2:
  1250. case SCBCtrlMDI + 3:
  1251. val = (uint8_t)(eepro100_read_mdi(s) >> (8 * (addr & 3)));
  1252. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1253. break;
  1254. case SCBpmdr: /* Power Management Driver Register */
  1255. val = 0;
  1256. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1257. break;
  1258. case SCBgctrl: /* General Control Register */
  1259. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1260. break;
  1261. case SCBgstat: /* General Status Register */
  1262. /* 100 Mbps full duplex, valid link */
  1263. val = 0x07;
  1264. TRACE(OTHER, logout("addr=General Status val=%02x\n", val));
  1265. break;
  1266. default:
  1267. logout("addr=%s val=0x%02x\n", regname(addr), val);
  1268. missing("unknown byte read");
  1269. }
  1270. return val;
  1271. }
  1272. static uint16_t eepro100_read2(EEPRO100State * s, uint32_t addr)
  1273. {
  1274. uint16_t val = 0;
  1275. if (addr <= sizeof(s->mem) - sizeof(val)) {
  1276. val = e100_read_reg2(s, addr);
  1277. }
  1278. switch (addr) {
  1279. case SCBStatus:
  1280. case SCBCmd:
  1281. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1282. break;
  1283. case SCBeeprom:
  1284. val = eepro100_read_eeprom(s);
  1285. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1286. break;
  1287. case SCBCtrlMDI:
  1288. case SCBCtrlMDI + 2:
  1289. val = (uint16_t)(eepro100_read_mdi(s) >> (8 * (addr & 3)));
  1290. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1291. break;
  1292. default:
  1293. logout("addr=%s val=0x%04x\n", regname(addr), val);
  1294. missing("unknown word read");
  1295. }
  1296. return val;
  1297. }
  1298. static uint32_t eepro100_read4(EEPRO100State * s, uint32_t addr)
  1299. {
  1300. uint32_t val = 0;
  1301. if (addr <= sizeof(s->mem) - sizeof(val)) {
  1302. val = e100_read_reg4(s, addr);
  1303. }
  1304. switch (addr) {
  1305. case SCBStatus:
  1306. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1307. break;
  1308. case SCBPointer:
  1309. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1310. break;
  1311. case SCBPort:
  1312. val = eepro100_read_port(s);
  1313. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1314. break;
  1315. case SCBflash:
  1316. val = eepro100_read_eeprom(s);
  1317. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1318. break;
  1319. case SCBCtrlMDI:
  1320. val = eepro100_read_mdi(s);
  1321. break;
  1322. default:
  1323. logout("addr=%s val=0x%08x\n", regname(addr), val);
  1324. missing("unknown longword read");
  1325. }
  1326. return val;
  1327. }
  1328. static void eepro100_write1(EEPRO100State * s, uint32_t addr, uint8_t val)
  1329. {
  1330. /* SCBStatus is readonly. */
  1331. if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
  1332. s->mem[addr] = val;
  1333. }
  1334. switch (addr) {
  1335. case SCBStatus:
  1336. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1337. break;
  1338. case SCBAck:
  1339. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1340. eepro100_acknowledge(s);
  1341. break;
  1342. case SCBCmd:
  1343. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1344. eepro100_write_command(s, val);
  1345. break;
  1346. case SCBIntmask:
  1347. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1348. if (val & BIT(1)) {
  1349. eepro100_swi_interrupt(s);
  1350. }
  1351. eepro100_interrupt(s, 0);
  1352. break;
  1353. case SCBPointer:
  1354. case SCBPointer + 1:
  1355. case SCBPointer + 2:
  1356. case SCBPointer + 3:
  1357. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1358. break;
  1359. case SCBPort:
  1360. case SCBPort + 1:
  1361. case SCBPort + 2:
  1362. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1363. break;
  1364. case SCBPort + 3:
  1365. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1366. eepro100_write_port(s);
  1367. break;
  1368. case SCBFlow: /* does not exist on 82557 */
  1369. case SCBFlow + 1:
  1370. case SCBFlow + 2:
  1371. case SCBpmdr: /* does not exist on 82557 */
  1372. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1373. break;
  1374. case SCBeeprom:
  1375. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1376. eepro100_write_eeprom(s->eeprom, val);
  1377. break;
  1378. case SCBCtrlMDI:
  1379. case SCBCtrlMDI + 1:
  1380. case SCBCtrlMDI + 2:
  1381. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1382. break;
  1383. case SCBCtrlMDI + 3:
  1384. TRACE(OTHER, logout("addr=%s val=0x%02x\n", regname(addr), val));
  1385. eepro100_write_mdi(s);
  1386. break;
  1387. default:
  1388. logout("addr=%s val=0x%02x\n", regname(addr), val);
  1389. missing("unknown byte write");
  1390. }
  1391. }
  1392. static void eepro100_write2(EEPRO100State * s, uint32_t addr, uint16_t val)
  1393. {
  1394. /* SCBStatus is readonly. */
  1395. if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) {
  1396. e100_write_reg2(s, addr, val);
  1397. }
  1398. switch (addr) {
  1399. case SCBStatus:
  1400. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1401. s->mem[SCBAck] = (val >> 8);
  1402. eepro100_acknowledge(s);
  1403. break;
  1404. case SCBCmd:
  1405. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1406. eepro100_write_command(s, val);
  1407. eepro100_write1(s, SCBIntmask, val >> 8);
  1408. break;
  1409. case SCBPointer:
  1410. case SCBPointer + 2:
  1411. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1412. break;
  1413. case SCBPort:
  1414. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1415. break;
  1416. case SCBPort + 2:
  1417. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1418. eepro100_write_port(s);
  1419. break;
  1420. case SCBeeprom:
  1421. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1422. eepro100_write_eeprom(s->eeprom, val);
  1423. break;
  1424. case SCBCtrlMDI:
  1425. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1426. break;
  1427. case SCBCtrlMDI + 2:
  1428. TRACE(OTHER, logout("addr=%s val=0x%04x\n", regname(addr), val));
  1429. eepro100_write_mdi(s);
  1430. break;
  1431. default:
  1432. logout("addr=%s val=0x%04x\n", regname(addr), val);
  1433. missing("unknown word write");
  1434. }
  1435. }
  1436. static void eepro100_write4(EEPRO100State * s, uint32_t addr, uint32_t val)
  1437. {
  1438. if (addr <= sizeof(s->mem) - sizeof(val)) {
  1439. e100_write_reg4(s, addr, val);
  1440. }
  1441. switch (addr) {
  1442. case SCBPointer:
  1443. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1444. break;
  1445. case SCBPort:
  1446. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1447. eepro100_write_port(s);
  1448. break;
  1449. case SCBflash:
  1450. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1451. val = val >> 16;
  1452. eepro100_write_eeprom(s->eeprom, val);
  1453. break;
  1454. case SCBCtrlMDI:
  1455. TRACE(OTHER, logout("addr=%s val=0x%08x\n", regname(addr), val));
  1456. eepro100_write_mdi(s);
  1457. break;
  1458. default:
  1459. logout("addr=%s val=0x%08x\n", regname(addr), val);
  1460. missing("unknown longword write");
  1461. }
  1462. }
  1463. /*****************************************************************************
  1464. *
  1465. * Port mapped I/O.
  1466. *
  1467. ****************************************************************************/
  1468. static uint32_t ioport_read1(void *opaque, uint32_t addr)
  1469. {
  1470. EEPRO100State *s = opaque;
  1471. #if 0
  1472. logout("addr=%s\n", regname(addr));
  1473. #endif
  1474. return eepro100_read1(s, addr - s->region1);
  1475. }
  1476. static uint32_t ioport_read2(void *opaque, uint32_t addr)
  1477. {
  1478. EEPRO100State *s = opaque;
  1479. return eepro100_read2(s, addr - s->region1);
  1480. }
  1481. static uint32_t ioport_read4(void *opaque, uint32_t addr)
  1482. {
  1483. EEPRO100State *s = opaque;
  1484. return eepro100_read4(s, addr - s->region1);
  1485. }
  1486. static void ioport_write1(void *opaque, uint32_t addr, uint32_t val)
  1487. {
  1488. EEPRO100State *s = opaque;
  1489. #if 0
  1490. logout("addr=%s val=0x%02x\n", regname(addr), val);
  1491. #endif
  1492. eepro100_write1(s, addr - s->region1, val);
  1493. }
  1494. static void ioport_write2(void *opaque, uint32_t addr, uint32_t val)
  1495. {
  1496. EEPRO100State *s = opaque;
  1497. eepro100_write2(s, addr - s->region1, val);
  1498. }
  1499. static void ioport_write4(void *opaque, uint32_t addr, uint32_t val)
  1500. {
  1501. EEPRO100State *s = opaque;
  1502. eepro100_write4(s, addr - s->region1, val);
  1503. }
  1504. /***********************************************************/
  1505. /* PCI EEPRO100 definitions */
  1506. static void pci_map(PCIDevice * pci_dev, int region_num,
  1507. pcibus_t addr, pcibus_t size, int type)
  1508. {
  1509. EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
  1510. TRACE(OTHER, logout("region %d, addr=0x%08"FMT_PCIBUS", "
  1511. "size=0x%08"FMT_PCIBUS", type=%d\n",
  1512. region_num, addr, size, type));
  1513. assert(region_num == 1);
  1514. register_ioport_write(addr, size, 1, ioport_write1, s);
  1515. register_ioport_read(addr, size, 1, ioport_read1, s);
  1516. register_ioport_write(addr, size, 2, ioport_write2, s);
  1517. register_ioport_read(addr, size, 2, ioport_read2, s);
  1518. register_ioport_write(addr, size, 4, ioport_write4, s);
  1519. register_ioport_read(addr, size, 4, ioport_read4, s);
  1520. s->region1 = addr;
  1521. }
  1522. /*****************************************************************************
  1523. *
  1524. * Memory mapped I/O.
  1525. *
  1526. ****************************************************************************/
  1527. static void pci_mmio_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
  1528. {
  1529. EEPRO100State *s = opaque;
  1530. #if 0
  1531. logout("addr=%s val=0x%02x\n", regname(addr), val);
  1532. #endif
  1533. eepro100_write1(s, addr, val);
  1534. }
  1535. static void pci_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
  1536. {
  1537. EEPRO100State *s = opaque;
  1538. #if 0
  1539. logout("addr=%s val=0x%02x\n", regname(addr), val);
  1540. #endif
  1541. eepro100_write2(s, addr, val);
  1542. }
  1543. static void pci_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
  1544. {
  1545. EEPRO100State *s = opaque;
  1546. #if 0
  1547. logout("addr=%s val=0x%02x\n", regname(addr), val);
  1548. #endif
  1549. eepro100_write4(s, addr, val);
  1550. }
  1551. static uint32_t pci_mmio_readb(void *opaque, target_phys_addr_t addr)
  1552. {
  1553. EEPRO100State *s = opaque;
  1554. #if 0
  1555. logout("addr=%s\n", regname(addr));
  1556. #endif
  1557. return eepro100_read1(s, addr);
  1558. }
  1559. static uint32_t pci_mmio_readw(void *opaque, target_phys_addr_t addr)
  1560. {
  1561. EEPRO100State *s = opaque;
  1562. #if 0
  1563. logout("addr=%s\n", regname(addr));
  1564. #endif
  1565. return eepro100_read2(s, addr);
  1566. }
  1567. static uint32_t pci_mmio_readl(void *opaque, target_phys_addr_t addr)
  1568. {
  1569. EEPRO100State *s = opaque;
  1570. #if 0
  1571. logout("addr=%s\n", regname(addr));
  1572. #endif
  1573. return eepro100_read4(s, addr);
  1574. }
  1575. static CPUWriteMemoryFunc * const pci_mmio_write[] = {
  1576. pci_mmio_writeb,
  1577. pci_mmio_writew,
  1578. pci_mmio_writel
  1579. };
  1580. static CPUReadMemoryFunc * const pci_mmio_read[] = {
  1581. pci_mmio_readb,
  1582. pci_mmio_readw,
  1583. pci_mmio_readl
  1584. };
  1585. static int nic_can_receive(VLANClientState *nc)
  1586. {
  1587. EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
  1588. TRACE(RXTX, logout("%p\n", s));
  1589. return get_ru_state(s) == ru_ready;
  1590. #if 0
  1591. return !eepro100_buffer_full(s);
  1592. #endif
  1593. }
  1594. static ssize_t nic_receive(VLANClientState *nc, const uint8_t * buf, size_t size)
  1595. {
  1596. /* TODO:
  1597. * - Magic packets should set bit 30 in power management driver register.
  1598. * - Interesting packets should set bit 29 in power management driver register.
  1599. */
  1600. EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
  1601. uint16_t rfd_status = 0xa000;
  1602. #if defined(CONFIG_PAD_RECEIVED_FRAMES)
  1603. uint8_t min_buf[60];
  1604. #endif
  1605. static const uint8_t broadcast_macaddr[6] =
  1606. { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  1607. #if defined(CONFIG_PAD_RECEIVED_FRAMES)
  1608. /* Pad to minimum Ethernet frame length */
  1609. if (size < sizeof(min_buf)) {
  1610. memcpy(min_buf, buf, size);
  1611. memset(&min_buf[size], 0, sizeof(min_buf) - size);
  1612. buf = min_buf;
  1613. size = sizeof(min_buf);
  1614. }
  1615. #endif
  1616. if (s->configuration[8] & 0x80) {
  1617. /* CSMA is disabled. */
  1618. logout("%p received while CSMA is disabled\n", s);
  1619. return -1;
  1620. #if !defined(CONFIG_PAD_RECEIVED_FRAMES)
  1621. } else if (size < 64 && (s->configuration[7] & BIT(0))) {
  1622. /* Short frame and configuration byte 7/0 (discard short receive) set:
  1623. * Short frame is discarded */
  1624. logout("%p received short frame (%zu byte)\n", s, size);
  1625. s->statistics.rx_short_frame_errors++;
  1626. return -1;
  1627. #endif
  1628. } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & BIT(3))) {
  1629. /* Long frame and configuration byte 18/3 (long receive ok) not set:
  1630. * Long frames are discarded. */
  1631. logout("%p received long frame (%zu byte), ignored\n", s, size);
  1632. return -1;
  1633. } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) { /* !!! */
  1634. /* Frame matches individual address. */
  1635. /* TODO: check configuration byte 15/4 (ignore U/L). */
  1636. TRACE(RXTX, logout("%p received frame for me, len=%zu\n", s, size));
  1637. } else if (memcmp(buf, broadcast_macaddr, 6) == 0) {
  1638. /* Broadcast frame. */
  1639. TRACE(RXTX, logout("%p received broadcast, len=%zu\n", s, size));
  1640. rfd_status |= 0x0002;
  1641. } else if (buf[0] & 0x01) {
  1642. /* Multicast frame. */
  1643. TRACE(RXTX, logout("%p received multicast, len=%zu,%s\n", s, size, nic_dump(buf, size)));
  1644. if (s->configuration[21] & BIT(3)) {
  1645. /* Multicast all bit is set, receive all multicast frames. */
  1646. } else {
  1647. unsigned mcast_idx = compute_mcast_idx(buf);
  1648. assert(mcast_idx < 64);
  1649. if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
  1650. /* Multicast frame is allowed in hash table. */
  1651. } else if (s->configuration[15] & BIT(0)) {
  1652. /* Promiscuous: receive all. */
  1653. rfd_status |= 0x0004;
  1654. } else {
  1655. TRACE(RXTX, logout("%p multicast ignored\n", s));
  1656. return -1;
  1657. }
  1658. }
  1659. /* TODO: Next not for promiscuous mode? */
  1660. rfd_status |= 0x0002;
  1661. } else if (s->configuration[15] & BIT(0)) {
  1662. /* Promiscuous: receive all. */
  1663. TRACE(RXTX, logout("%p received frame in promiscuous mode, len=%zu\n", s, size));
  1664. rfd_status |= 0x0004;
  1665. } else if (s->configuration[20] & BIT(6)) {
  1666. /* Multiple IA bit set. */
  1667. unsigned mcast_idx = compute_mcast_idx(buf);
  1668. assert(mcast_idx < 64);
  1669. if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) {
  1670. TRACE(RXTX, logout("%p accepted, multiple IA bit set\n", s));
  1671. } else {
  1672. TRACE(RXTX, logout("%p frame ignored, multiple IA bit set\n", s));
  1673. return -1;
  1674. }
  1675. } else {
  1676. TRACE(RXTX, logout("%p received frame, ignored, len=%zu,%s\n", s, size,
  1677. nic_dump(buf, size)));
  1678. return size;
  1679. }
  1680. if (get_ru_state(s) != ru_ready) {
  1681. /* No resources available. */
  1682. logout("no resources, state=%u\n", get_ru_state(s));
  1683. /* TODO: RNR interrupt only at first failed frame? */
  1684. eepro100_rnr_interrupt(s);
  1685. s->statistics.rx_resource_errors++;
  1686. #if 0
  1687. assert(!"no resources");
  1688. #endif
  1689. return -1;
  1690. }
  1691. /* !!! */
  1692. eepro100_rx_t rx;
  1693. cpu_physical_memory_read(s->ru_base + s->ru_offset, &rx,
  1694. sizeof(eepro100_rx_t));
  1695. uint16_t rfd_command = le16_to_cpu(rx.command);
  1696. uint16_t rfd_size = le16_to_cpu(rx.size);
  1697. if (size > rfd_size) {
  1698. logout("Receive buffer (%" PRId16 " bytes) too small for data "
  1699. "(%zu bytes); data truncated\n", rfd_size, size);
  1700. size = rfd_size;
  1701. }
  1702. #if !defined(CONFIG_PAD_RECEIVED_FRAMES)
  1703. if (size < 64) {
  1704. rfd_status |= 0x0080;
  1705. }
  1706. #endif
  1707. TRACE(OTHER, logout("command 0x%04x, link 0x%08x, addr 0x%08x, size %u\n",
  1708. rfd_command, rx.link, rx.rx_buf_addr, rfd_size));
  1709. e100_stw_le_phys(s->ru_base + s->ru_offset +
  1710. offsetof(eepro100_rx_t, status), rfd_status);
  1711. e100_stw_le_phys(s->ru_base + s->ru_offset +
  1712. offsetof(eepro100_rx_t, count), size);
  1713. /* Early receive interrupt not supported. */
  1714. #if 0
  1715. eepro100_er_interrupt(s);
  1716. #endif
  1717. /* Receive CRC Transfer not supported. */
  1718. if (s->configuration[18] & BIT(2)) {
  1719. missing("Receive CRC Transfer");
  1720. return -1;
  1721. }
  1722. /* TODO: check stripping enable bit. */
  1723. #if 0
  1724. assert(!(s->configuration[17] & BIT(0)));
  1725. #endif
  1726. cpu_physical_memory_write(s->ru_base + s->ru_offset +
  1727. sizeof(eepro100_rx_t), buf, size);
  1728. s->statistics.rx_good_frames++;
  1729. eepro100_fr_interrupt(s);
  1730. s->ru_offset = le32_to_cpu(rx.link);
  1731. if (rfd_command & COMMAND_EL) {
  1732. /* EL bit is set, so this was the last frame. */
  1733. logout("receive: Running out of frames\n");
  1734. set_ru_state(s, ru_suspended);
  1735. }
  1736. if (rfd_command & COMMAND_S) {
  1737. /* S bit is set. */
  1738. set_ru_state(s, ru_suspended);
  1739. }
  1740. return size;
  1741. }
  1742. static const VMStateDescription vmstate_eepro100 = {
  1743. .version_id = 3,
  1744. .minimum_version_id = 2,
  1745. .minimum_version_id_old = 2,
  1746. .fields = (VMStateField []) {
  1747. VMSTATE_PCI_DEVICE(dev, EEPRO100State),
  1748. VMSTATE_UNUSED(32),
  1749. VMSTATE_BUFFER(mult, EEPRO100State),
  1750. VMSTATE_BUFFER(mem, EEPRO100State),
  1751. /* Save all members of struct between scb_stat and mem. */
  1752. VMSTATE_UINT8(scb_stat, EEPRO100State),
  1753. VMSTATE_UINT8(int_stat, EEPRO100State),
  1754. VMSTATE_UNUSED(3*4),
  1755. VMSTATE_MACADDR(conf.macaddr, EEPRO100State),
  1756. VMSTATE_UNUSED(19*4),
  1757. VMSTATE_UINT16_ARRAY(mdimem, EEPRO100State, 32),
  1758. /* The eeprom should be saved and restored by its own routines. */
  1759. VMSTATE_UINT32(device, EEPRO100State),
  1760. /* TODO check device. */
  1761. VMSTATE_UINT32(cu_base, EEPRO100State),
  1762. VMSTATE_UINT32(cu_offset, EEPRO100State),
  1763. VMSTATE_UINT32(ru_base, EEPRO100State),
  1764. VMSTATE_UINT32(ru_offset, EEPRO100State),
  1765. VMSTATE_UINT32(statsaddr, EEPRO100State),
  1766. /* Save eepro100_stats_t statistics. */
  1767. VMSTATE_UINT32(statistics.tx_good_frames, EEPRO100State),
  1768. VMSTATE_UINT32(statistics.tx_max_collisions, EEPRO100State),
  1769. VMSTATE_UINT32(statistics.tx_late_collisions, EEPRO100State),
  1770. VMSTATE_UINT32(statistics.tx_underruns, EEPRO100State),
  1771. VMSTATE_UINT32(statistics.tx_lost_crs, EEPRO100State),
  1772. VMSTATE_UINT32(statistics.tx_deferred, EEPRO100State),
  1773. VMSTATE_UINT32(statistics.tx_single_collisions, EEPRO100State),
  1774. VMSTATE_UINT32(statistics.tx_multiple_collisions, EEPRO100State),
  1775. VMSTATE_UINT32(statistics.tx_total_collisions, EEPRO100State),
  1776. VMSTATE_UINT32(statistics.rx_good_frames, EEPRO100State),
  1777. VMSTATE_UINT32(statistics.rx_crc_errors, EEPRO100State),
  1778. VMSTATE_UINT32(statistics.rx_alignment_errors, EEPRO100State),
  1779. VMSTATE_UINT32(statistics.rx_resource_errors, EEPRO100State),
  1780. VMSTATE_UINT32(statistics.rx_overrun_errors, EEPRO100State),
  1781. VMSTATE_UINT32(statistics.rx_cdt_errors, EEPRO100State),
  1782. VMSTATE_UINT32(statistics.rx_short_frame_errors, EEPRO100State),
  1783. VMSTATE_UINT32(statistics.fc_xmt_pause, EEPRO100State),
  1784. VMSTATE_UINT32(statistics.fc_rcv_pause, EEPRO100State),
  1785. VMSTATE_UINT32(statistics.fc_rcv_unsupported, EEPRO100State),
  1786. VMSTATE_UINT16(statistics.xmt_tco_frames, EEPRO100State),
  1787. VMSTATE_UINT16(statistics.rcv_tco_frames, EEPRO100State),
  1788. /* Configuration bytes. */
  1789. VMSTATE_BUFFER(configuration, EEPRO100State),
  1790. VMSTATE_END_OF_LIST()
  1791. }
  1792. };
  1793. static void nic_cleanup(VLANClientState *nc)
  1794. {
  1795. EEPRO100State *s = DO_UPCAST(NICState, nc, nc)->opaque;
  1796. s->nic = NULL;
  1797. }
  1798. static int pci_nic_uninit(PCIDevice *pci_dev)
  1799. {
  1800. EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
  1801. cpu_unregister_io_memory(s->mmio_index);
  1802. vmstate_unregister(&pci_dev->qdev, s->vmstate, s);
  1803. eeprom93xx_free(&pci_dev->qdev, s->eeprom);
  1804. qemu_del_vlan_client(&s->nic->nc);
  1805. return 0;
  1806. }
  1807. static NetClientInfo net_eepro100_info = {
  1808. .type = NET_CLIENT_TYPE_NIC,
  1809. .size = sizeof(NICState),
  1810. .can_receive = nic_can_receive,
  1811. .receive = nic_receive,
  1812. .cleanup = nic_cleanup,
  1813. };
  1814. static int e100_nic_init(PCIDevice *pci_dev)
  1815. {
  1816. EEPRO100State *s = DO_UPCAST(EEPRO100State, dev, pci_dev);
  1817. E100PCIDeviceInfo *e100_device = DO_UPCAST(E100PCIDeviceInfo, pci.qdev,
  1818. pci_dev->qdev.info);
  1819. TRACE(OTHER, logout("\n"));
  1820. s->device = e100_device->device;
  1821. e100_pci_reset(s, e100_device);
  1822. /* Add 64 * 2 EEPROM. i82557 and i82558 support a 64 word EEPROM,
  1823. * i82559 and later support 64 or 256 word EEPROM. */
  1824. s->eeprom = eeprom93xx_new(&pci_dev->qdev, EEPROM_SIZE);
  1825. /* Handler for memory-mapped I/O */
  1826. s->mmio_index =
  1827. cpu_register_io_memory(pci_mmio_read, pci_mmio_write, s,
  1828. DEVICE_LITTLE_ENDIAN);
  1829. pci_register_bar_simple(&s->dev, 0, PCI_MEM_SIZE,
  1830. PCI_BASE_ADDRESS_MEM_PREFETCH, s->mmio_index);
  1831. pci_register_bar(&s->dev, 1, PCI_IO_SIZE, PCI_BASE_ADDRESS_SPACE_IO,
  1832. pci_map);
  1833. pci_register_bar_simple(&s->dev, 2, PCI_FLASH_SIZE, 0, s->mmio_index);
  1834. qemu_macaddr_default_if_unset(&s->conf.macaddr);
  1835. logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6));
  1836. assert(s->region1 == 0);
  1837. nic_reset(s);
  1838. s->nic = qemu_new_nic(&net_eepro100_info, &s->conf,
  1839. pci_dev->qdev.info->name, pci_dev->qdev.id, s);
  1840. qemu_format_nic_info_str(&s->nic->nc, s->conf.macaddr.a);
  1841. TRACE(OTHER, logout("%s\n", s->nic->nc.info_str));
  1842. qemu_register_reset(nic_reset, s);
  1843. s->vmstate = qemu_malloc(sizeof(vmstate_eepro100));
  1844. memcpy(s->vmstate, &vmstate_eepro100, sizeof(vmstate_eepro100));
  1845. s->vmstate->name = s->nic->nc.model;
  1846. vmstate_register(&pci_dev->qdev, -1, s->vmstate, s);
  1847. add_boot_device_path(s->conf.bootindex, &pci_dev->qdev, "/ethernet-phy@0");
  1848. return 0;
  1849. }
  1850. static E100PCIDeviceInfo e100_devices[] = {
  1851. {
  1852. .pci.qdev.name = "i82550",
  1853. .pci.qdev.desc = "Intel i82550 Ethernet",
  1854. .device = i82550,
  1855. /* TODO: check device id. */
  1856. .pci.device_id = PCI_DEVICE_ID_INTEL_82551IT,
  1857. /* Revision ID: 0x0c, 0x0d, 0x0e. */
  1858. .pci.revision = 0x0e,
  1859. /* TODO: check size of statistical counters. */
  1860. .stats_size = 80,
  1861. /* TODO: check extended tcb support. */
  1862. .has_extended_tcb_support = true,
  1863. .power_management = true,
  1864. },{
  1865. .pci.qdev.name = "i82551",
  1866. .pci.qdev.desc = "Intel i82551 Ethernet",
  1867. .device = i82551,
  1868. .pci.device_id = PCI_DEVICE_ID_INTEL_82551IT,
  1869. /* Revision ID: 0x0f, 0x10. */
  1870. .pci.revision = 0x0f,
  1871. /* TODO: check size of statistical counters. */
  1872. .stats_size = 80,
  1873. .has_extended_tcb_support = true,
  1874. .power_management = true,
  1875. },{
  1876. .pci.qdev.name = "i82557a",
  1877. .pci.qdev.desc = "Intel i82557A Ethernet",
  1878. .device = i82557A,
  1879. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1880. .pci.revision = 0x01,
  1881. .power_management = false,
  1882. },{
  1883. .pci.qdev.name = "i82557b",
  1884. .pci.qdev.desc = "Intel i82557B Ethernet",
  1885. .device = i82557B,
  1886. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1887. .pci.revision = 0x02,
  1888. .power_management = false,
  1889. },{
  1890. .pci.qdev.name = "i82557c",
  1891. .pci.qdev.desc = "Intel i82557C Ethernet",
  1892. .device = i82557C,
  1893. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1894. .pci.revision = 0x03,
  1895. .power_management = false,
  1896. },{
  1897. .pci.qdev.name = "i82558a",
  1898. .pci.qdev.desc = "Intel i82558A Ethernet",
  1899. .device = i82558A,
  1900. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1901. .pci.revision = 0x04,
  1902. .stats_size = 76,
  1903. .has_extended_tcb_support = true,
  1904. .power_management = true,
  1905. },{
  1906. .pci.qdev.name = "i82558b",
  1907. .pci.qdev.desc = "Intel i82558B Ethernet",
  1908. .device = i82558B,
  1909. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1910. .pci.revision = 0x05,
  1911. .stats_size = 76,
  1912. .has_extended_tcb_support = true,
  1913. .power_management = true,
  1914. },{
  1915. .pci.qdev.name = "i82559a",
  1916. .pci.qdev.desc = "Intel i82559A Ethernet",
  1917. .device = i82559A,
  1918. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1919. .pci.revision = 0x06,
  1920. .stats_size = 80,
  1921. .has_extended_tcb_support = true,
  1922. .power_management = true,
  1923. },{
  1924. .pci.qdev.name = "i82559b",
  1925. .pci.qdev.desc = "Intel i82559B Ethernet",
  1926. .device = i82559B,
  1927. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1928. .pci.revision = 0x07,
  1929. .stats_size = 80,
  1930. .has_extended_tcb_support = true,
  1931. .power_management = true,
  1932. },{
  1933. .pci.qdev.name = "i82559c",
  1934. .pci.qdev.desc = "Intel i82559C Ethernet",
  1935. .device = i82559C,
  1936. .pci.device_id = PCI_DEVICE_ID_INTEL_82557,
  1937. #if 0
  1938. .pci.revision = 0x08,
  1939. #endif
  1940. /* TODO: Windows wants revision id 0x0c. */
  1941. .pci.revision = 0x0c,
  1942. #if EEPROM_SIZE > 0
  1943. .pci.subsystem_vendor_id = PCI_VENDOR_ID_INTEL,
  1944. .pci.subsystem_id = 0x0040,
  1945. #endif
  1946. .stats_size = 80,
  1947. .has_extended_tcb_support = true,
  1948. .power_management = true,
  1949. },{
  1950. .pci.qdev.name = "i82559er",
  1951. .pci.qdev.desc = "Intel i82559ER Ethernet",
  1952. .device = i82559ER,
  1953. .pci.device_id = PCI_DEVICE_ID_INTEL_82551IT,
  1954. .pci.revision = 0x09,
  1955. .stats_size = 80,
  1956. .has_extended_tcb_support = true,
  1957. .power_management = true,
  1958. },{
  1959. .pci.qdev.name = "i82562",
  1960. .pci.qdev.desc = "Intel i82562 Ethernet",
  1961. .device = i82562,
  1962. /* TODO: check device id. */
  1963. .pci.device_id = PCI_DEVICE_ID_INTEL_82551IT,
  1964. /* TODO: wrong revision id. */
  1965. .pci.revision = 0x0e,
  1966. .stats_size = 80,
  1967. .has_extended_tcb_support = true,
  1968. .power_management = true,
  1969. },{
  1970. /* Toshiba Tecra 8200. */
  1971. .pci.qdev.name = "i82801",
  1972. .pci.qdev.desc = "Intel i82801 Ethernet",
  1973. .device = i82801,
  1974. .pci.device_id = 0x2449,
  1975. .pci.revision = 0x03,
  1976. .stats_size = 80,
  1977. .has_extended_tcb_support = true,
  1978. .power_management = true,
  1979. }
  1980. };
  1981. static Property e100_properties[] = {
  1982. DEFINE_NIC_PROPERTIES(EEPRO100State, conf),
  1983. DEFINE_PROP_END_OF_LIST(),
  1984. };
  1985. static void eepro100_register_devices(void)
  1986. {
  1987. size_t i;
  1988. for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
  1989. PCIDeviceInfo *pci_dev = &e100_devices[i].pci;
  1990. /* We use the same rom file for all device ids.
  1991. QEMU fixes the device id during rom load. */
  1992. pci_dev->vendor_id = PCI_VENDOR_ID_INTEL;
  1993. pci_dev->class_id = PCI_CLASS_NETWORK_ETHERNET;
  1994. pci_dev->romfile = "pxe-eepro100.rom";
  1995. pci_dev->init = e100_nic_init;
  1996. pci_dev->exit = pci_nic_uninit;
  1997. pci_dev->qdev.props = e100_properties;
  1998. pci_dev->qdev.size = sizeof(EEPRO100State);
  1999. pci_qdev_register(pci_dev);
  2000. }
  2001. }
  2002. device_init(eepro100_register_devices)