2
0

eepro100.c 69 KB

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