mcf_fec.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. /*
  2. * ColdFire Fast Ethernet Controller emulation.
  3. *
  4. * Copyright (c) 2007 CodeSourcery.
  5. *
  6. * This code is licensed under the GPL
  7. */
  8. #include "qemu/osdep.h"
  9. #include "qemu/log.h"
  10. #include "hw/irq.h"
  11. #include "net/net.h"
  12. #include "qemu/module.h"
  13. #include "hw/m68k/mcf.h"
  14. #include "hw/m68k/mcf_fec.h"
  15. #include "hw/net/mii.h"
  16. #include "hw/qdev-properties.h"
  17. #include "hw/sysbus.h"
  18. #include <zlib.h> /* for crc32 */
  19. //#define DEBUG_FEC 1
  20. #ifdef DEBUG_FEC
  21. #define DPRINTF(fmt, ...) \
  22. do { printf("mcf_fec: " fmt , ## __VA_ARGS__); } while (0)
  23. #else
  24. #define DPRINTF(fmt, ...) do {} while(0)
  25. #endif
  26. #define FEC_MAX_DESC 1024
  27. #define FEC_MAX_FRAME_SIZE 2032
  28. #define FEC_MIB_SIZE 64
  29. struct mcf_fec_state {
  30. SysBusDevice parent_obj;
  31. MemoryRegion iomem;
  32. qemu_irq irq[FEC_NUM_IRQ];
  33. NICState *nic;
  34. NICConf conf;
  35. uint32_t irq_state;
  36. uint32_t eir;
  37. uint32_t eimr;
  38. int rx_enabled;
  39. uint32_t rx_descriptor;
  40. uint32_t tx_descriptor;
  41. uint32_t ecr;
  42. uint32_t mmfr;
  43. uint32_t mscr;
  44. uint32_t rcr;
  45. uint32_t tcr;
  46. uint32_t tfwr;
  47. uint32_t rfsr;
  48. uint32_t erdsr;
  49. uint32_t etdsr;
  50. uint32_t emrbr;
  51. uint32_t mib[FEC_MIB_SIZE];
  52. };
  53. #define FEC_INT_HB 0x80000000
  54. #define FEC_INT_BABR 0x40000000
  55. #define FEC_INT_BABT 0x20000000
  56. #define FEC_INT_GRA 0x10000000
  57. #define FEC_INT_TXF 0x08000000
  58. #define FEC_INT_TXB 0x04000000
  59. #define FEC_INT_RXF 0x02000000
  60. #define FEC_INT_RXB 0x01000000
  61. #define FEC_INT_MII 0x00800000
  62. #define FEC_INT_EB 0x00400000
  63. #define FEC_INT_LC 0x00200000
  64. #define FEC_INT_RL 0x00100000
  65. #define FEC_INT_UN 0x00080000
  66. #define FEC_EN 2
  67. #define FEC_RESET 1
  68. /* Map interrupt flags onto IRQ lines. */
  69. static const uint32_t mcf_fec_irq_map[FEC_NUM_IRQ] = {
  70. FEC_INT_TXF,
  71. FEC_INT_TXB,
  72. FEC_INT_UN,
  73. FEC_INT_RL,
  74. FEC_INT_RXF,
  75. FEC_INT_RXB,
  76. FEC_INT_MII,
  77. FEC_INT_LC,
  78. FEC_INT_HB,
  79. FEC_INT_GRA,
  80. FEC_INT_EB,
  81. FEC_INT_BABT,
  82. FEC_INT_BABR
  83. };
  84. /* Buffer Descriptor. */
  85. typedef struct {
  86. uint16_t flags;
  87. uint16_t length;
  88. uint32_t data;
  89. } mcf_fec_bd;
  90. #define FEC_BD_R 0x8000
  91. #define FEC_BD_E 0x8000
  92. #define FEC_BD_O1 0x4000
  93. #define FEC_BD_W 0x2000
  94. #define FEC_BD_O2 0x1000
  95. #define FEC_BD_L 0x0800
  96. #define FEC_BD_TC 0x0400
  97. #define FEC_BD_ABC 0x0200
  98. #define FEC_BD_M 0x0100
  99. #define FEC_BD_BC 0x0080
  100. #define FEC_BD_MC 0x0040
  101. #define FEC_BD_LG 0x0020
  102. #define FEC_BD_NO 0x0010
  103. #define FEC_BD_CR 0x0004
  104. #define FEC_BD_OV 0x0002
  105. #define FEC_BD_TR 0x0001
  106. #define MIB_RMON_T_DROP 0
  107. #define MIB_RMON_T_PACKETS 1
  108. #define MIB_RMON_T_BC_PKT 2
  109. #define MIB_RMON_T_MC_PKT 3
  110. #define MIB_RMON_T_CRC_ALIGN 4
  111. #define MIB_RMON_T_UNDERSIZE 5
  112. #define MIB_RMON_T_OVERSIZE 6
  113. #define MIB_RMON_T_FRAG 7
  114. #define MIB_RMON_T_JAB 8
  115. #define MIB_RMON_T_COL 9
  116. #define MIB_RMON_T_P64 10
  117. #define MIB_RMON_T_P65TO127 11
  118. #define MIB_RMON_T_P128TO255 12
  119. #define MIB_RMON_T_P256TO511 13
  120. #define MIB_RMON_T_P512TO1023 14
  121. #define MIB_RMON_T_P1024TO2047 15
  122. #define MIB_RMON_T_P_GTE2048 16
  123. #define MIB_RMON_T_OCTETS 17
  124. #define MIB_IEEE_T_DROP 18
  125. #define MIB_IEEE_T_FRAME_OK 19
  126. #define MIB_IEEE_T_1COL 20
  127. #define MIB_IEEE_T_MCOL 21
  128. #define MIB_IEEE_T_DEF 22
  129. #define MIB_IEEE_T_LCOL 23
  130. #define MIB_IEEE_T_EXCOL 24
  131. #define MIB_IEEE_T_MACERR 25
  132. #define MIB_IEEE_T_CSERR 26
  133. #define MIB_IEEE_T_SQE 27
  134. #define MIB_IEEE_T_FDXFC 28
  135. #define MIB_IEEE_T_OCTETS_OK 29
  136. #define MIB_RMON_R_DROP 32
  137. #define MIB_RMON_R_PACKETS 33
  138. #define MIB_RMON_R_BC_PKT 34
  139. #define MIB_RMON_R_MC_PKT 35
  140. #define MIB_RMON_R_CRC_ALIGN 36
  141. #define MIB_RMON_R_UNDERSIZE 37
  142. #define MIB_RMON_R_OVERSIZE 38
  143. #define MIB_RMON_R_FRAG 39
  144. #define MIB_RMON_R_JAB 40
  145. #define MIB_RMON_R_RESVD_0 41
  146. #define MIB_RMON_R_P64 42
  147. #define MIB_RMON_R_P65TO127 43
  148. #define MIB_RMON_R_P128TO255 44
  149. #define MIB_RMON_R_P256TO511 45
  150. #define MIB_RMON_R_P512TO1023 46
  151. #define MIB_RMON_R_P1024TO2047 47
  152. #define MIB_RMON_R_P_GTE2048 48
  153. #define MIB_RMON_R_OCTETS 49
  154. #define MIB_IEEE_R_DROP 50
  155. #define MIB_IEEE_R_FRAME_OK 51
  156. #define MIB_IEEE_R_CRC 52
  157. #define MIB_IEEE_R_ALIGN 53
  158. #define MIB_IEEE_R_MACERR 54
  159. #define MIB_IEEE_R_FDXFC 55
  160. #define MIB_IEEE_R_OCTETS_OK 56
  161. static void mcf_fec_read_bd(mcf_fec_bd *bd, uint32_t addr)
  162. {
  163. cpu_physical_memory_read(addr, bd, sizeof(*bd));
  164. be16_to_cpus(&bd->flags);
  165. be16_to_cpus(&bd->length);
  166. be32_to_cpus(&bd->data);
  167. }
  168. static void mcf_fec_write_bd(mcf_fec_bd *bd, uint32_t addr)
  169. {
  170. mcf_fec_bd tmp;
  171. tmp.flags = cpu_to_be16(bd->flags);
  172. tmp.length = cpu_to_be16(bd->length);
  173. tmp.data = cpu_to_be32(bd->data);
  174. cpu_physical_memory_write(addr, &tmp, sizeof(tmp));
  175. }
  176. static void mcf_fec_update(mcf_fec_state *s)
  177. {
  178. uint32_t active;
  179. uint32_t changed;
  180. uint32_t mask;
  181. int i;
  182. active = s->eir & s->eimr;
  183. changed = active ^s->irq_state;
  184. for (i = 0; i < FEC_NUM_IRQ; i++) {
  185. mask = mcf_fec_irq_map[i];
  186. if (changed & mask) {
  187. DPRINTF("IRQ %d = %d\n", i, (active & mask) != 0);
  188. qemu_set_irq(s->irq[i], (active & mask) != 0);
  189. }
  190. }
  191. s->irq_state = active;
  192. }
  193. static void mcf_fec_tx_stats(mcf_fec_state *s, int size)
  194. {
  195. s->mib[MIB_RMON_T_PACKETS]++;
  196. s->mib[MIB_RMON_T_OCTETS] += size;
  197. if (size < 64) {
  198. s->mib[MIB_RMON_T_FRAG]++;
  199. } else if (size == 64) {
  200. s->mib[MIB_RMON_T_P64]++;
  201. } else if (size < 128) {
  202. s->mib[MIB_RMON_T_P65TO127]++;
  203. } else if (size < 256) {
  204. s->mib[MIB_RMON_T_P128TO255]++;
  205. } else if (size < 512) {
  206. s->mib[MIB_RMON_T_P256TO511]++;
  207. } else if (size < 1024) {
  208. s->mib[MIB_RMON_T_P512TO1023]++;
  209. } else if (size < 2048) {
  210. s->mib[MIB_RMON_T_P1024TO2047]++;
  211. } else {
  212. s->mib[MIB_RMON_T_P_GTE2048]++;
  213. }
  214. s->mib[MIB_IEEE_T_FRAME_OK]++;
  215. s->mib[MIB_IEEE_T_OCTETS_OK] += size;
  216. }
  217. static void mcf_fec_do_tx(mcf_fec_state *s)
  218. {
  219. uint32_t addr;
  220. mcf_fec_bd bd;
  221. int frame_size;
  222. int len, descnt = 0;
  223. uint8_t frame[FEC_MAX_FRAME_SIZE];
  224. uint8_t *ptr;
  225. DPRINTF("do_tx\n");
  226. ptr = frame;
  227. frame_size = 0;
  228. addr = s->tx_descriptor;
  229. while (descnt++ < FEC_MAX_DESC) {
  230. mcf_fec_read_bd(&bd, addr);
  231. DPRINTF("tx_bd %x flags %04x len %d data %08x\n",
  232. addr, bd.flags, bd.length, bd.data);
  233. if ((bd.flags & FEC_BD_R) == 0) {
  234. /* Run out of descriptors to transmit. */
  235. break;
  236. }
  237. len = bd.length;
  238. if (frame_size + len > FEC_MAX_FRAME_SIZE) {
  239. len = FEC_MAX_FRAME_SIZE - frame_size;
  240. s->eir |= FEC_INT_BABT;
  241. }
  242. cpu_physical_memory_read(bd.data, ptr, len);
  243. ptr += len;
  244. frame_size += len;
  245. if (bd.flags & FEC_BD_L) {
  246. /* Last buffer in frame. */
  247. DPRINTF("Sending packet\n");
  248. qemu_send_packet(qemu_get_queue(s->nic), frame, frame_size);
  249. mcf_fec_tx_stats(s, frame_size);
  250. ptr = frame;
  251. frame_size = 0;
  252. s->eir |= FEC_INT_TXF;
  253. }
  254. s->eir |= FEC_INT_TXB;
  255. bd.flags &= ~FEC_BD_R;
  256. /* Write back the modified descriptor. */
  257. mcf_fec_write_bd(&bd, addr);
  258. /* Advance to the next descriptor. */
  259. if ((bd.flags & FEC_BD_W) != 0) {
  260. addr = s->etdsr;
  261. } else {
  262. addr += 8;
  263. }
  264. }
  265. s->tx_descriptor = addr;
  266. }
  267. static void mcf_fec_enable_rx(mcf_fec_state *s)
  268. {
  269. NetClientState *nc = qemu_get_queue(s->nic);
  270. mcf_fec_bd bd;
  271. mcf_fec_read_bd(&bd, s->rx_descriptor);
  272. s->rx_enabled = ((bd.flags & FEC_BD_E) != 0);
  273. if (s->rx_enabled) {
  274. qemu_flush_queued_packets(nc);
  275. }
  276. }
  277. static void mcf_fec_reset(DeviceState *dev)
  278. {
  279. mcf_fec_state *s = MCF_FEC_NET(dev);
  280. s->eir = 0;
  281. s->eimr = 0;
  282. s->rx_enabled = 0;
  283. s->ecr = 0;
  284. s->mscr = 0;
  285. s->rcr = 0x05ee0001;
  286. s->tcr = 0;
  287. s->tfwr = 0;
  288. s->rfsr = 0x500;
  289. }
  290. #define MMFR_WRITE_OP (1 << 28)
  291. #define MMFR_READ_OP (2 << 28)
  292. #define MMFR_PHYADDR(v) (((v) >> 23) & 0x1f)
  293. #define MMFR_REGNUM(v) (((v) >> 18) & 0x1f)
  294. static uint64_t mcf_fec_read_mdio(mcf_fec_state *s)
  295. {
  296. uint64_t v;
  297. if (s->mmfr & MMFR_WRITE_OP)
  298. return s->mmfr;
  299. if (MMFR_PHYADDR(s->mmfr) != 1)
  300. return s->mmfr |= 0xffff;
  301. switch (MMFR_REGNUM(s->mmfr)) {
  302. case MII_BMCR:
  303. v = MII_BMCR_SPEED | MII_BMCR_AUTOEN | MII_BMCR_FD;
  304. break;
  305. case MII_BMSR:
  306. v = MII_BMSR_100TX_FD | MII_BMSR_100TX_HD | MII_BMSR_10T_FD |
  307. MII_BMSR_10T_HD | MII_BMSR_MFPS | MII_BMSR_AN_COMP |
  308. MII_BMSR_AUTONEG | MII_BMSR_LINK_ST;
  309. break;
  310. case MII_PHYID1:
  311. v = DP83848_PHYID1;
  312. break;
  313. case MII_PHYID2:
  314. v = DP83848_PHYID2;
  315. break;
  316. case MII_ANAR:
  317. v = MII_ANAR_TXFD | MII_ANAR_TX | MII_ANAR_10FD |
  318. MII_ANAR_10 | MII_ANAR_CSMACD;
  319. break;
  320. case MII_ANLPAR:
  321. v = MII_ANLPAR_ACK | MII_ANLPAR_TXFD | MII_ANLPAR_TX |
  322. MII_ANLPAR_10FD | MII_ANLPAR_10 | MII_ANLPAR_CSMACD;
  323. break;
  324. default:
  325. v = 0xffff;
  326. break;
  327. }
  328. s->mmfr = (s->mmfr & ~0xffff) | v;
  329. return s->mmfr;
  330. }
  331. static uint64_t mcf_fec_read(void *opaque, hwaddr addr,
  332. unsigned size)
  333. {
  334. mcf_fec_state *s = (mcf_fec_state *)opaque;
  335. switch (addr & 0x3ff) {
  336. case 0x004: return s->eir;
  337. case 0x008: return s->eimr;
  338. case 0x010: return s->rx_enabled ? (1 << 24) : 0; /* RDAR */
  339. case 0x014: return 0; /* TDAR */
  340. case 0x024: return s->ecr;
  341. case 0x040: return mcf_fec_read_mdio(s);
  342. case 0x044: return s->mscr;
  343. case 0x064: return 0; /* MIBC */
  344. case 0x084: return s->rcr;
  345. case 0x0c4: return s->tcr;
  346. case 0x0e4: /* PALR */
  347. return (s->conf.macaddr.a[0] << 24) | (s->conf.macaddr.a[1] << 16)
  348. | (s->conf.macaddr.a[2] << 8) | s->conf.macaddr.a[3];
  349. break;
  350. case 0x0e8: /* PAUR */
  351. return (s->conf.macaddr.a[4] << 24) | (s->conf.macaddr.a[5] << 16) | 0x8808;
  352. case 0x0ec: return 0x10000; /* OPD */
  353. case 0x118: return 0;
  354. case 0x11c: return 0;
  355. case 0x120: return 0;
  356. case 0x124: return 0;
  357. case 0x144: return s->tfwr;
  358. case 0x14c: return 0x600;
  359. case 0x150: return s->rfsr;
  360. case 0x180: return s->erdsr;
  361. case 0x184: return s->etdsr;
  362. case 0x188: return s->emrbr;
  363. case 0x200 ... 0x2e0: return s->mib[(addr & 0x1ff) / 4];
  364. default:
  365. qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad address 0x%" HWADDR_PRIX "\n",
  366. __func__, addr);
  367. return 0;
  368. }
  369. }
  370. static void mcf_fec_write(void *opaque, hwaddr addr,
  371. uint64_t value, unsigned size)
  372. {
  373. mcf_fec_state *s = (mcf_fec_state *)opaque;
  374. switch (addr & 0x3ff) {
  375. case 0x004:
  376. s->eir &= ~value;
  377. break;
  378. case 0x008:
  379. s->eimr = value;
  380. break;
  381. case 0x010: /* RDAR */
  382. if ((s->ecr & FEC_EN) && !s->rx_enabled) {
  383. DPRINTF("RX enable\n");
  384. mcf_fec_enable_rx(s);
  385. }
  386. break;
  387. case 0x014: /* TDAR */
  388. if (s->ecr & FEC_EN) {
  389. mcf_fec_do_tx(s);
  390. }
  391. break;
  392. case 0x024:
  393. s->ecr = value;
  394. if (value & FEC_RESET) {
  395. DPRINTF("Reset\n");
  396. mcf_fec_reset(opaque);
  397. }
  398. if ((s->ecr & FEC_EN) == 0) {
  399. s->rx_enabled = 0;
  400. }
  401. break;
  402. case 0x040:
  403. s->mmfr = value;
  404. s->eir |= FEC_INT_MII;
  405. break;
  406. case 0x044:
  407. s->mscr = value & 0xfe;
  408. break;
  409. case 0x064:
  410. /* TODO: Implement MIB. */
  411. break;
  412. case 0x084:
  413. s->rcr = value & 0x07ff003f;
  414. /* TODO: Implement LOOP mode. */
  415. break;
  416. case 0x0c4: /* TCR */
  417. /* We transmit immediately, so raise GRA immediately. */
  418. s->tcr = value;
  419. if (value & 1)
  420. s->eir |= FEC_INT_GRA;
  421. break;
  422. case 0x0e4: /* PALR */
  423. s->conf.macaddr.a[0] = value >> 24;
  424. s->conf.macaddr.a[1] = value >> 16;
  425. s->conf.macaddr.a[2] = value >> 8;
  426. s->conf.macaddr.a[3] = value;
  427. break;
  428. case 0x0e8: /* PAUR */
  429. s->conf.macaddr.a[4] = value >> 24;
  430. s->conf.macaddr.a[5] = value >> 16;
  431. break;
  432. case 0x0ec:
  433. /* OPD */
  434. break;
  435. case 0x118:
  436. case 0x11c:
  437. case 0x120:
  438. case 0x124:
  439. /* TODO: implement MAC hash filtering. */
  440. break;
  441. case 0x144:
  442. s->tfwr = value & 3;
  443. break;
  444. case 0x14c:
  445. /* FRBR writes ignored. */
  446. break;
  447. case 0x150:
  448. s->rfsr = (value & 0x3fc) | 0x400;
  449. break;
  450. case 0x180:
  451. s->erdsr = value & ~3;
  452. s->rx_descriptor = s->erdsr;
  453. break;
  454. case 0x184:
  455. s->etdsr = value & ~3;
  456. s->tx_descriptor = s->etdsr;
  457. break;
  458. case 0x188:
  459. s->emrbr = value > 0 ? value & 0x7F0 : 0x7F0;
  460. break;
  461. case 0x200 ... 0x2e0:
  462. s->mib[(addr & 0x1ff) / 4] = value;
  463. break;
  464. default:
  465. qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad address 0x%" HWADDR_PRIX "\n",
  466. __func__, addr);
  467. return;
  468. }
  469. mcf_fec_update(s);
  470. }
  471. static void mcf_fec_rx_stats(mcf_fec_state *s, int size)
  472. {
  473. s->mib[MIB_RMON_R_PACKETS]++;
  474. s->mib[MIB_RMON_R_OCTETS] += size;
  475. if (size < 64) {
  476. s->mib[MIB_RMON_R_FRAG]++;
  477. } else if (size == 64) {
  478. s->mib[MIB_RMON_R_P64]++;
  479. } else if (size < 128) {
  480. s->mib[MIB_RMON_R_P65TO127]++;
  481. } else if (size < 256) {
  482. s->mib[MIB_RMON_R_P128TO255]++;
  483. } else if (size < 512) {
  484. s->mib[MIB_RMON_R_P256TO511]++;
  485. } else if (size < 1024) {
  486. s->mib[MIB_RMON_R_P512TO1023]++;
  487. } else if (size < 2048) {
  488. s->mib[MIB_RMON_R_P1024TO2047]++;
  489. } else {
  490. s->mib[MIB_RMON_R_P_GTE2048]++;
  491. }
  492. s->mib[MIB_IEEE_R_FRAME_OK]++;
  493. s->mib[MIB_IEEE_R_OCTETS_OK] += size;
  494. }
  495. static int mcf_fec_have_receive_space(mcf_fec_state *s, size_t want)
  496. {
  497. mcf_fec_bd bd;
  498. uint32_t addr;
  499. /* Walk descriptor list to determine if we have enough buffer */
  500. addr = s->rx_descriptor;
  501. while (want > 0) {
  502. mcf_fec_read_bd(&bd, addr);
  503. if ((bd.flags & FEC_BD_E) == 0) {
  504. return 0;
  505. }
  506. if (want < s->emrbr) {
  507. return 1;
  508. }
  509. want -= s->emrbr;
  510. /* Advance to the next descriptor. */
  511. if ((bd.flags & FEC_BD_W) != 0) {
  512. addr = s->erdsr;
  513. } else {
  514. addr += 8;
  515. }
  516. }
  517. return 0;
  518. }
  519. static ssize_t mcf_fec_receive(NetClientState *nc, const uint8_t *buf, size_t size)
  520. {
  521. mcf_fec_state *s = qemu_get_nic_opaque(nc);
  522. mcf_fec_bd bd;
  523. uint32_t flags = 0;
  524. uint32_t addr;
  525. uint32_t crc;
  526. uint32_t buf_addr;
  527. uint8_t *crc_ptr;
  528. unsigned int buf_len;
  529. size_t retsize;
  530. DPRINTF("do_rx len %d\n", size);
  531. if (!s->rx_enabled) {
  532. return -1;
  533. }
  534. /* 4 bytes for the CRC. */
  535. size += 4;
  536. crc = cpu_to_be32(crc32(~0, buf, size));
  537. crc_ptr = (uint8_t *)&crc;
  538. /* Huge frames are truncated. */
  539. if (size > FEC_MAX_FRAME_SIZE) {
  540. size = FEC_MAX_FRAME_SIZE;
  541. flags |= FEC_BD_TR | FEC_BD_LG;
  542. }
  543. /* Frames larger than the user limit just set error flags. */
  544. if (size > (s->rcr >> 16)) {
  545. flags |= FEC_BD_LG;
  546. }
  547. /* Check if we have enough space in current descriptors */
  548. if (!mcf_fec_have_receive_space(s, size)) {
  549. return 0;
  550. }
  551. addr = s->rx_descriptor;
  552. retsize = size;
  553. while (size > 0) {
  554. mcf_fec_read_bd(&bd, addr);
  555. buf_len = (size <= s->emrbr) ? size: s->emrbr;
  556. bd.length = buf_len;
  557. size -= buf_len;
  558. DPRINTF("rx_bd %x length %d\n", addr, bd.length);
  559. /* The last 4 bytes are the CRC. */
  560. if (size < 4)
  561. buf_len += size - 4;
  562. buf_addr = bd.data;
  563. cpu_physical_memory_write(buf_addr, buf, buf_len);
  564. buf += buf_len;
  565. if (size < 4) {
  566. cpu_physical_memory_write(buf_addr + buf_len, crc_ptr, 4 - size);
  567. crc_ptr += 4 - size;
  568. }
  569. bd.flags &= ~FEC_BD_E;
  570. if (size == 0) {
  571. /* Last buffer in frame. */
  572. bd.flags |= flags | FEC_BD_L;
  573. DPRINTF("rx frame flags %04x\n", bd.flags);
  574. s->eir |= FEC_INT_RXF;
  575. } else {
  576. s->eir |= FEC_INT_RXB;
  577. }
  578. mcf_fec_write_bd(&bd, addr);
  579. /* Advance to the next descriptor. */
  580. if ((bd.flags & FEC_BD_W) != 0) {
  581. addr = s->erdsr;
  582. } else {
  583. addr += 8;
  584. }
  585. }
  586. s->rx_descriptor = addr;
  587. mcf_fec_rx_stats(s, retsize);
  588. mcf_fec_enable_rx(s);
  589. mcf_fec_update(s);
  590. return retsize;
  591. }
  592. static const MemoryRegionOps mcf_fec_ops = {
  593. .read = mcf_fec_read,
  594. .write = mcf_fec_write,
  595. .endianness = DEVICE_NATIVE_ENDIAN,
  596. };
  597. static NetClientInfo net_mcf_fec_info = {
  598. .type = NET_CLIENT_DRIVER_NIC,
  599. .size = sizeof(NICState),
  600. .receive = mcf_fec_receive,
  601. };
  602. static void mcf_fec_realize(DeviceState *dev, Error **errp)
  603. {
  604. mcf_fec_state *s = MCF_FEC_NET(dev);
  605. s->nic = qemu_new_nic(&net_mcf_fec_info, &s->conf,
  606. object_get_typename(OBJECT(dev)), dev->id,
  607. &dev->mem_reentrancy_guard, s);
  608. qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
  609. }
  610. static void mcf_fec_instance_init(Object *obj)
  611. {
  612. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  613. mcf_fec_state *s = MCF_FEC_NET(obj);
  614. int i;
  615. memory_region_init_io(&s->iomem, obj, &mcf_fec_ops, s, "fec", 0x400);
  616. sysbus_init_mmio(sbd, &s->iomem);
  617. for (i = 0; i < FEC_NUM_IRQ; i++) {
  618. sysbus_init_irq(sbd, &s->irq[i]);
  619. }
  620. }
  621. static const Property mcf_fec_properties[] = {
  622. DEFINE_NIC_PROPERTIES(mcf_fec_state, conf),
  623. };
  624. static void mcf_fec_class_init(ObjectClass *oc, void *data)
  625. {
  626. DeviceClass *dc = DEVICE_CLASS(oc);
  627. set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
  628. dc->realize = mcf_fec_realize;
  629. dc->desc = "MCF Fast Ethernet Controller network device";
  630. device_class_set_legacy_reset(dc, mcf_fec_reset);
  631. device_class_set_props(dc, mcf_fec_properties);
  632. }
  633. static const TypeInfo mcf_fec_info = {
  634. .name = TYPE_MCF_FEC_NET,
  635. .parent = TYPE_SYS_BUS_DEVICE,
  636. .instance_size = sizeof(mcf_fec_state),
  637. .instance_init = mcf_fec_instance_init,
  638. .class_init = mcf_fec_class_init,
  639. };
  640. static void mcf_fec_register_types(void)
  641. {
  642. type_register_static(&mcf_fec_info);
  643. }
  644. type_init(mcf_fec_register_types)