2
0

mcf_fec.c 18 KB

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