ppc/pnv: Loop on the threads of the chip to find a matching NVT
[qemu/ar7.git] / hw / net / tulip.c
blobf85f54341fab635a4d5756a6c44424eab92ddd5f
1 /*
2 * QEMU TULIP Emulation
4 * Copyright (c) 2019 Sven Schnelle <svens@stackframe.org>
6 * This work is licensed under the GNU GPL license version 2 or later.
7 */
9 #include "qemu/osdep.h"
10 #include "qemu/log.h"
11 #include "hw/irq.h"
12 #include "hw/pci/pci.h"
13 #include "hw/qdev-properties.h"
14 #include "hw/nvram/eeprom93xx.h"
15 #include "migration/vmstate.h"
16 #include "sysemu/sysemu.h"
17 #include "tulip.h"
18 #include "trace.h"
19 #include "net/eth.h"
21 typedef struct TULIPState {
22 PCIDevice dev;
23 MemoryRegion io;
24 MemoryRegion memory;
25 NICConf c;
26 qemu_irq irq;
27 NICState *nic;
28 eeprom_t *eeprom;
29 uint32_t csr[16];
31 /* state for MII */
32 uint32_t old_csr9;
33 uint32_t mii_word;
34 uint32_t mii_bitcnt;
36 hwaddr current_rx_desc;
37 hwaddr current_tx_desc;
39 uint8_t rx_frame[2048];
40 uint8_t tx_frame[2048];
41 uint16_t tx_frame_len;
42 uint16_t rx_frame_len;
43 uint16_t rx_frame_size;
45 uint32_t rx_status;
46 uint8_t filter[16][6];
47 } TULIPState;
49 static const VMStateDescription vmstate_pci_tulip = {
50 .name = "tulip",
51 .fields = (VMStateField[]) {
52 VMSTATE_PCI_DEVICE(dev, TULIPState),
53 VMSTATE_UINT32_ARRAY(csr, TULIPState, 16),
54 VMSTATE_UINT32(old_csr9, TULIPState),
55 VMSTATE_UINT32(mii_word, TULIPState),
56 VMSTATE_UINT32(mii_bitcnt, TULIPState),
57 VMSTATE_UINT64(current_rx_desc, TULIPState),
58 VMSTATE_UINT64(current_tx_desc, TULIPState),
59 VMSTATE_BUFFER(rx_frame, TULIPState),
60 VMSTATE_BUFFER(tx_frame, TULIPState),
61 VMSTATE_UINT16(rx_frame_len, TULIPState),
62 VMSTATE_UINT16(tx_frame_len, TULIPState),
63 VMSTATE_UINT16(rx_frame_size, TULIPState),
64 VMSTATE_UINT32(rx_status, TULIPState),
65 VMSTATE_UINT8_2DARRAY(filter, TULIPState, 16, 6),
66 VMSTATE_END_OF_LIST()
70 static void tulip_desc_read(TULIPState *s, hwaddr p,
71 struct tulip_descriptor *desc)
73 if (s->csr[0] & CSR0_DBO) {
74 desc->status = ldl_be_pci_dma(&s->dev, p);
75 desc->control = ldl_be_pci_dma(&s->dev, p + 4);
76 desc->buf_addr1 = ldl_be_pci_dma(&s->dev, p + 8);
77 desc->buf_addr2 = ldl_be_pci_dma(&s->dev, p + 12);
78 } else {
79 desc->status = ldl_le_pci_dma(&s->dev, p);
80 desc->control = ldl_le_pci_dma(&s->dev, p + 4);
81 desc->buf_addr1 = ldl_le_pci_dma(&s->dev, p + 8);
82 desc->buf_addr2 = ldl_le_pci_dma(&s->dev, p + 12);
86 static void tulip_desc_write(TULIPState *s, hwaddr p,
87 struct tulip_descriptor *desc)
89 if (s->csr[0] & CSR0_DBO) {
90 stl_be_pci_dma(&s->dev, p, desc->status);
91 stl_be_pci_dma(&s->dev, p + 4, desc->control);
92 stl_be_pci_dma(&s->dev, p + 8, desc->buf_addr1);
93 stl_be_pci_dma(&s->dev, p + 12, desc->buf_addr2);
94 } else {
95 stl_le_pci_dma(&s->dev, p, desc->status);
96 stl_le_pci_dma(&s->dev, p + 4, desc->control);
97 stl_le_pci_dma(&s->dev, p + 8, desc->buf_addr1);
98 stl_le_pci_dma(&s->dev, p + 12, desc->buf_addr2);
102 static void tulip_update_int(TULIPState *s)
104 uint32_t ie = s->csr[5] & s->csr[7];
105 bool assert = false;
107 s->csr[5] &= ~(CSR5_AIS | CSR5_NIS);
109 if (ie & (CSR5_TI | CSR5_TU | CSR5_RI | CSR5_GTE | CSR5_ERI)) {
110 s->csr[5] |= CSR5_NIS;
113 if (ie & (CSR5_LC | CSR5_GPI | CSR5_FBE | CSR5_LNF | CSR5_ETI | CSR5_RWT |
114 CSR5_RPS | CSR5_RU | CSR5_UNF | CSR5_LNP_ANC | CSR5_TJT |
115 CSR5_TPS)) {
116 s->csr[5] |= CSR5_AIS;
119 assert = s->csr[5] & s->csr[7] & (CSR5_AIS | CSR5_NIS);
120 trace_tulip_irq(s->csr[5], s->csr[7], assert ? "assert" : "deassert");
121 qemu_set_irq(s->irq, assert);
124 static bool tulip_rx_stopped(TULIPState *s)
126 return ((s->csr[5] >> CSR5_RS_SHIFT) & CSR5_RS_MASK) == CSR5_RS_STOPPED;
129 static void tulip_dump_tx_descriptor(TULIPState *s,
130 struct tulip_descriptor *desc)
132 trace_tulip_descriptor("TX ", s->current_tx_desc,
133 desc->status, desc->control >> 22,
134 desc->control & 0x7ff, (desc->control >> 11) & 0x7ff,
135 desc->buf_addr1, desc->buf_addr2);
138 static void tulip_dump_rx_descriptor(TULIPState *s,
139 struct tulip_descriptor *desc)
141 trace_tulip_descriptor("RX ", s->current_rx_desc,
142 desc->status, desc->control >> 22,
143 desc->control & 0x7ff, (desc->control >> 11) & 0x7ff,
144 desc->buf_addr1, desc->buf_addr2);
147 static void tulip_next_rx_descriptor(TULIPState *s,
148 struct tulip_descriptor *desc)
150 if (desc->control & RDES1_RER) {
151 s->current_rx_desc = s->csr[3];
152 } else if (desc->control & RDES1_RCH) {
153 s->current_rx_desc = desc->buf_addr2;
154 } else {
155 s->current_rx_desc += sizeof(struct tulip_descriptor) +
156 (((s->csr[0] >> CSR0_DSL_SHIFT) & CSR0_DSL_MASK) << 2);
158 s->current_rx_desc &= ~3ULL;
161 static void tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
163 int len1 = (desc->control >> RDES1_BUF1_SIZE_SHIFT) & RDES1_BUF1_SIZE_MASK;
164 int len2 = (desc->control >> RDES1_BUF2_SIZE_SHIFT) & RDES1_BUF2_SIZE_MASK;
165 int len;
167 if (s->rx_frame_len && len1) {
168 if (s->rx_frame_len > len1) {
169 len = len1;
170 } else {
171 len = s->rx_frame_len;
173 pci_dma_write(&s->dev, desc->buf_addr1, s->rx_frame +
174 (s->rx_frame_size - s->rx_frame_len), len);
175 s->rx_frame_len -= len;
178 if (s->rx_frame_len && len2) {
179 if (s->rx_frame_len > len2) {
180 len = len2;
181 } else {
182 len = s->rx_frame_len;
184 pci_dma_write(&s->dev, desc->buf_addr2, s->rx_frame +
185 (s->rx_frame_size - s->rx_frame_len), len);
186 s->rx_frame_len -= len;
190 static bool tulip_filter_address(TULIPState *s, const uint8_t *addr)
192 static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
193 bool ret = false;
194 int i;
196 for (i = 0; i < 16 && ret == false; i++) {
197 if (!memcmp(&s->filter[i], addr, ETH_ALEN)) {
198 ret = true;
202 if (!memcmp(addr, broadcast, ETH_ALEN)) {
203 return true;
206 if (s->csr[6] & (CSR6_PR | CSR6_RA)) {
207 /* Promiscuous mode enabled */
208 s->rx_status |= RDES0_FF;
209 return true;
212 if ((s->csr[6] & CSR6_PM) && (addr[0] & 1)) {
213 /* Pass all Multicast enabled */
214 s->rx_status |= RDES0_MF;
215 return true;
218 if (s->csr[6] & CSR6_IF) {
219 ret ^= true;
221 return ret;
224 static ssize_t tulip_receive(TULIPState *s, const uint8_t *buf, size_t size)
226 struct tulip_descriptor desc;
228 trace_tulip_receive(buf, size);
230 if (size < 14 || size > 2048 || s->rx_frame_len || tulip_rx_stopped(s)) {
231 return 0;
234 if (!tulip_filter_address(s, buf)) {
235 return size;
238 do {
239 tulip_desc_read(s, s->current_rx_desc, &desc);
240 tulip_dump_rx_descriptor(s, &desc);
242 if (!(desc.status & RDES0_OWN)) {
243 s->csr[5] |= CSR5_RU;
244 tulip_update_int(s);
245 return s->rx_frame_size - s->rx_frame_len;
247 desc.status = 0;
249 if (!s->rx_frame_len) {
250 s->rx_frame_size = size + 4;
251 s->rx_status = RDES0_LS |
252 ((s->rx_frame_size & RDES0_FL_MASK) << RDES0_FL_SHIFT);
253 desc.status |= RDES0_FS;
254 memcpy(s->rx_frame, buf, size);
255 s->rx_frame_len = s->rx_frame_size;
258 tulip_copy_rx_bytes(s, &desc);
260 if (!s->rx_frame_len) {
261 desc.status |= s->rx_status;
262 s->csr[5] |= CSR5_RI;
263 tulip_update_int(s);
265 tulip_dump_rx_descriptor(s, &desc);
266 tulip_desc_write(s, s->current_rx_desc, &desc);
267 tulip_next_rx_descriptor(s, &desc);
268 } while (s->rx_frame_len);
269 return size;
272 static ssize_t tulip_receive_nc(NetClientState *nc,
273 const uint8_t *buf, size_t size)
275 return tulip_receive(qemu_get_nic_opaque(nc), buf, size);
279 static NetClientInfo net_tulip_info = {
280 .type = NET_CLIENT_DRIVER_NIC,
281 .size = sizeof(NICState),
282 .receive = tulip_receive_nc,
285 static const char *tulip_reg_name(const hwaddr addr)
287 switch (addr) {
288 case CSR(0):
289 return "CSR0";
291 case CSR(1):
292 return "CSR1";
294 case CSR(2):
295 return "CSR2";
297 case CSR(3):
298 return "CSR3";
300 case CSR(4):
301 return "CSR4";
303 case CSR(5):
304 return "CSR5";
306 case CSR(6):
307 return "CSR6";
309 case CSR(7):
310 return "CSR7";
312 case CSR(8):
313 return "CSR8";
315 case CSR(9):
316 return "CSR9";
318 case CSR(10):
319 return "CSR10";
321 case CSR(11):
322 return "CSR11";
324 case CSR(12):
325 return "CSR12";
327 case CSR(13):
328 return "CSR13";
330 case CSR(14):
331 return "CSR14";
333 case CSR(15):
334 return "CSR15";
336 default:
337 break;
339 return "";
342 static const char *tulip_rx_state_name(int state)
344 switch (state) {
345 case CSR5_RS_STOPPED:
346 return "STOPPED";
348 case CSR5_RS_RUNNING_FETCH:
349 return "RUNNING/FETCH";
351 case CSR5_RS_RUNNING_CHECK_EOR:
352 return "RUNNING/CHECK EOR";
354 case CSR5_RS_RUNNING_WAIT_RECEIVE:
355 return "WAIT RECEIVE";
357 case CSR5_RS_SUSPENDED:
358 return "SUSPENDED";
360 case CSR5_RS_RUNNING_CLOSE:
361 return "RUNNING/CLOSE";
363 case CSR5_RS_RUNNING_FLUSH:
364 return "RUNNING/FLUSH";
366 case CSR5_RS_RUNNING_QUEUE:
367 return "RUNNING/QUEUE";
369 default:
370 break;
372 return "";
375 static const char *tulip_tx_state_name(int state)
377 switch (state) {
378 case CSR5_TS_STOPPED:
379 return "STOPPED";
381 case CSR5_TS_RUNNING_FETCH:
382 return "RUNNING/FETCH";
384 case CSR5_TS_RUNNING_WAIT_EOT:
385 return "RUNNING/WAIT EOT";
387 case CSR5_TS_RUNNING_READ_BUF:
388 return "RUNNING/READ BUF";
390 case CSR5_TS_RUNNING_SETUP:
391 return "RUNNING/SETUP";
393 case CSR5_TS_SUSPENDED:
394 return "SUSPENDED";
396 case CSR5_TS_RUNNING_CLOSE:
397 return "RUNNING/CLOSE";
399 default:
400 break;
402 return "";
405 static void tulip_update_rs(TULIPState *s, int state)
407 s->csr[5] &= ~(CSR5_RS_MASK << CSR5_RS_SHIFT);
408 s->csr[5] |= (state & CSR5_RS_MASK) << CSR5_RS_SHIFT;
409 trace_tulip_rx_state(tulip_rx_state_name(state));
412 static uint16_t tulip_mdi_default[] = {
413 /* MDI Registers 0 - 6, 7 */
414 0x3100, 0xf02c, 0x7810, 0x0000, 0x0501, 0x4181, 0x0000, 0x0000,
415 /* MDI Registers 8 - 15 */
416 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
417 /* MDI Registers 16 - 31 */
418 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
419 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
422 /* Readonly mask for MDI (PHY) registers */
423 static const uint16_t tulip_mdi_mask[] = {
424 0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
425 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
426 0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
427 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
430 static uint16_t tulip_mii_read(TULIPState *s, int phy, int reg)
432 uint16_t ret = 0;
433 if (phy == 1) {
434 ret = tulip_mdi_default[reg];
436 trace_tulip_mii_read(phy, reg, ret);
437 return ret;
440 static void tulip_mii_write(TULIPState *s, int phy, int reg, uint16_t data)
442 trace_tulip_mii_write(phy, reg, data);
444 if (phy != 1) {
445 return;
448 tulip_mdi_default[reg] &= ~tulip_mdi_mask[reg];
449 tulip_mdi_default[reg] |= (data & tulip_mdi_mask[reg]);
452 static void tulip_mii(TULIPState *s)
454 uint32_t changed = s->old_csr9 ^ s->csr[9];
455 uint16_t data;
456 int op, phy, reg;
458 if (!(changed & CSR9_MDC)) {
459 return;
462 if (!(s->csr[9] & CSR9_MDC)) {
463 return;
466 s->mii_bitcnt++;
467 s->mii_word <<= 1;
469 if (s->csr[9] & CSR9_MDO && (s->mii_bitcnt < 16 ||
470 !(s->csr[9] & CSR9_MII))) {
471 /* write op or address bits */
472 s->mii_word |= 1;
475 if (s->mii_bitcnt >= 16 && (s->csr[9] & CSR9_MII)) {
476 if (s->mii_word & 0x8000) {
477 s->csr[9] |= CSR9_MDI;
478 } else {
479 s->csr[9] &= ~CSR9_MDI;
483 if (s->mii_word == 0xffffffff) {
484 s->mii_bitcnt = 0;
485 } else if (s->mii_bitcnt == 16) {
486 op = (s->mii_word >> 12) & 0x0f;
487 phy = (s->mii_word >> 7) & 0x1f;
488 reg = (s->mii_word >> 2) & 0x1f;
490 if (op == 6) {
491 s->mii_word = tulip_mii_read(s, phy, reg);
493 } else if (s->mii_bitcnt == 32) {
494 op = (s->mii_word >> 28) & 0x0f;
495 phy = (s->mii_word >> 23) & 0x1f;
496 reg = (s->mii_word >> 18) & 0x1f;
497 data = s->mii_word & 0xffff;
499 if (op == 5) {
500 tulip_mii_write(s, phy, reg, data);
505 static uint32_t tulip_csr9_read(TULIPState *s)
507 if (s->csr[9] & CSR9_SR) {
508 if (eeprom93xx_read(s->eeprom)) {
509 s->csr[9] |= CSR9_SR_DO;
510 } else {
511 s->csr[9] &= ~CSR9_SR_DO;
515 tulip_mii(s);
516 return s->csr[9];
519 static void tulip_update_ts(TULIPState *s, int state)
521 s->csr[5] &= ~(CSR5_TS_MASK << CSR5_TS_SHIFT);
522 s->csr[5] |= (state & CSR5_TS_MASK) << CSR5_TS_SHIFT;
523 trace_tulip_tx_state(tulip_tx_state_name(state));
526 static uint64_t tulip_read(void *opaque, hwaddr addr,
527 unsigned size)
529 TULIPState *s = opaque;
530 uint64_t data = 0;
532 switch (addr) {
533 case CSR(9):
534 data = tulip_csr9_read(s);
535 break;
537 case CSR(12):
538 /* Fake autocompletion complete until we have PHY emulation */
539 data = 5 << CSR12_ANS_SHIFT;
540 break;
542 default:
543 if (addr & 7) {
544 qemu_log_mask(LOG_GUEST_ERROR, "%s: read access at unknown address"
545 " 0x%"PRIx64"\n", __func__, addr);
546 } else {
547 data = s->csr[addr >> 3];
549 break;
551 trace_tulip_reg_read(addr, tulip_reg_name(addr), size, data);
552 return data;
555 static void tulip_tx(TULIPState *s, struct tulip_descriptor *desc)
557 if (s->tx_frame_len) {
558 if ((s->csr[6] >> CSR6_OM_SHIFT) & CSR6_OM_MASK) {
559 /* Internal or external Loopback */
560 tulip_receive(s, s->tx_frame, s->tx_frame_len);
561 } else {
562 qemu_send_packet(qemu_get_queue(s->nic),
563 s->tx_frame, s->tx_frame_len);
567 if (desc->control & TDES1_IC) {
568 s->csr[5] |= CSR5_TI;
569 tulip_update_int(s);
573 static void tulip_copy_tx_buffers(TULIPState *s, struct tulip_descriptor *desc)
575 int len1 = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
576 int len2 = (desc->control >> TDES1_BUF2_SIZE_SHIFT) & TDES1_BUF2_SIZE_MASK;
578 if (len1) {
579 pci_dma_read(&s->dev, desc->buf_addr1,
580 s->tx_frame + s->tx_frame_len, len1);
581 s->tx_frame_len += len1;
584 if (len2) {
585 pci_dma_read(&s->dev, desc->buf_addr2,
586 s->tx_frame + s->tx_frame_len, len2);
587 s->tx_frame_len += len2;
589 desc->status = (len1 + len2) ? 0 : 0x7fffffff;
592 static void tulip_setup_filter_addr(TULIPState *s, uint8_t *buf, int n)
594 int offset = n * 12;
596 s->filter[n][0] = buf[offset];
597 s->filter[n][1] = buf[offset + 1];
599 s->filter[n][2] = buf[offset + 4];
600 s->filter[n][3] = buf[offset + 5];
602 s->filter[n][4] = buf[offset + 8];
603 s->filter[n][5] = buf[offset + 9];
605 trace_tulip_setup_filter(n, s->filter[n][5], s->filter[n][4],
606 s->filter[n][3], s->filter[n][2], s->filter[n][1], s->filter[n][0]);
609 static void tulip_setup_frame(TULIPState *s,
610 struct tulip_descriptor *desc)
612 uint8_t buf[4096];
613 int len = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
614 int i;
616 trace_tulip_setup_frame();
618 if (len == 192) {
619 pci_dma_read(&s->dev, desc->buf_addr1, buf, len);
620 for (i = 0; i < 16; i++) {
621 tulip_setup_filter_addr(s, buf, i);
625 desc->status = 0x7fffffff;
627 if (desc->control & TDES1_IC) {
628 s->csr[5] |= CSR5_TI;
629 tulip_update_int(s);
633 static void tulip_next_tx_descriptor(TULIPState *s,
634 struct tulip_descriptor *desc)
636 if (desc->control & TDES1_TER) {
637 s->current_tx_desc = s->csr[4];
638 } else if (desc->control & TDES1_TCH) {
639 s->current_tx_desc = desc->buf_addr2;
640 } else {
641 s->current_tx_desc += sizeof(struct tulip_descriptor) +
642 (((s->csr[0] >> CSR0_DSL_SHIFT) & CSR0_DSL_MASK) << 2);
644 s->current_tx_desc &= ~3ULL;
647 static uint32_t tulip_ts(TULIPState *s)
649 return (s->csr[5] >> CSR5_TS_SHIFT) & CSR5_TS_MASK;
652 static void tulip_xmit_list_update(TULIPState *s)
654 struct tulip_descriptor desc;
656 if (tulip_ts(s) != CSR5_TS_SUSPENDED) {
657 return;
660 for (;;) {
661 tulip_desc_read(s, s->current_tx_desc, &desc);
662 tulip_dump_tx_descriptor(s, &desc);
664 if (!(desc.status & TDES0_OWN)) {
665 tulip_update_ts(s, CSR5_TS_SUSPENDED);
666 s->csr[5] |= CSR5_TU;
667 tulip_update_int(s);
668 return;
671 if (desc.control & TDES1_SET) {
672 tulip_setup_frame(s, &desc);
673 } else {
674 if (desc.control & TDES1_FS) {
675 s->tx_frame_len = 0;
678 tulip_copy_tx_buffers(s, &desc);
680 if (desc.control & TDES1_LS) {
681 tulip_tx(s, &desc);
684 tulip_desc_write(s, s->current_tx_desc, &desc);
685 tulip_next_tx_descriptor(s, &desc);
689 static void tulip_csr9_write(TULIPState *s, uint32_t old_val,
690 uint32_t new_val)
692 if (new_val & CSR9_SR) {
693 eeprom93xx_write(s->eeprom,
694 !!(new_val & CSR9_SR_CS),
695 !!(new_val & CSR9_SR_SK),
696 !!(new_val & CSR9_SR_DI));
700 static void tulip_reset(TULIPState *s)
702 trace_tulip_reset();
704 s->csr[0] = 0xfe000000;
705 s->csr[1] = 0xffffffff;
706 s->csr[2] = 0xffffffff;
707 s->csr[5] = 0xf0000000;
708 s->csr[6] = 0x32000040;
709 s->csr[7] = 0xf3fe0000;
710 s->csr[8] = 0xe0000000;
711 s->csr[9] = 0xfff483ff;
712 s->csr[11] = 0xfffe0000;
713 s->csr[12] = 0x000000c6;
714 s->csr[13] = 0xffff0000;
715 s->csr[14] = 0xffffffff;
716 s->csr[15] = 0x8ff00000;
719 static void tulip_qdev_reset(DeviceState *dev)
721 PCIDevice *d = PCI_DEVICE(dev);
722 TULIPState *s = TULIP(d);
724 tulip_reset(s);
727 static void tulip_write(void *opaque, hwaddr addr,
728 uint64_t data, unsigned size)
730 TULIPState *s = opaque;
731 trace_tulip_reg_write(addr, tulip_reg_name(addr), size, data);
733 switch (addr) {
734 case CSR(0):
735 s->csr[0] = data;
736 if (data & CSR0_SWR) {
737 tulip_reset(s);
738 tulip_update_int(s);
740 break;
742 case CSR(1):
743 tulip_xmit_list_update(s);
744 break;
746 case CSR(2):
747 qemu_flush_queued_packets(qemu_get_queue(s->nic));
748 break;
750 case CSR(3):
751 s->csr[3] = data & ~3ULL;
752 s->current_rx_desc = s->csr[3];
753 qemu_flush_queued_packets(qemu_get_queue(s->nic));
754 break;
756 case CSR(4):
757 s->csr[4] = data & ~3ULL;
758 s->current_tx_desc = s->csr[4];
759 tulip_xmit_list_update(s);
760 break;
762 case CSR(5):
763 /* Status register, write clears bit */
764 s->csr[5] &= ~(data & (CSR5_TI | CSR5_TPS | CSR5_TU | CSR5_TJT |
765 CSR5_LNP_ANC | CSR5_UNF | CSR5_RI | CSR5_RU |
766 CSR5_RPS | CSR5_RWT | CSR5_ETI | CSR5_GTE |
767 CSR5_LNF | CSR5_FBE | CSR5_ERI | CSR5_AIS |
768 CSR5_NIS | CSR5_GPI | CSR5_LC));
769 tulip_update_int(s);
770 break;
772 case CSR(6):
773 s->csr[6] = data;
774 if (s->csr[6] & CSR6_SR) {
775 tulip_update_rs(s, CSR5_RS_RUNNING_WAIT_RECEIVE);
776 qemu_flush_queued_packets(qemu_get_queue(s->nic));
777 } else {
778 tulip_update_rs(s, CSR5_RS_STOPPED);
781 if (s->csr[6] & CSR6_ST) {
782 tulip_update_ts(s, CSR5_TS_SUSPENDED);
783 tulip_xmit_list_update(s);
784 } else {
785 tulip_update_ts(s, CSR5_TS_STOPPED);
787 break;
789 case CSR(7):
790 s->csr[7] = data;
791 tulip_update_int(s);
792 break;
794 case CSR(8):
795 s->csr[9] = data;
796 break;
798 case CSR(9):
799 tulip_csr9_write(s, s->csr[9], data);
800 /* don't clear MII read data */
801 s->csr[9] &= CSR9_MDI;
802 s->csr[9] |= (data & ~CSR9_MDI);
803 tulip_mii(s);
804 s->old_csr9 = s->csr[9];
805 break;
807 case CSR(10):
808 s->csr[10] = data;
809 break;
811 case CSR(11):
812 s->csr[11] = data;
813 break;
815 case CSR(12):
816 /* SIA Status register, some bits are cleared by writing 1 */
817 s->csr[12] &= ~(data & (CSR12_MRA | CSR12_TRA | CSR12_ARA));
818 break;
820 case CSR(13):
821 s->csr[13] = data;
822 break;
824 case CSR(14):
825 s->csr[14] = data;
826 break;
828 case CSR(15):
829 s->csr[15] = data;
830 break;
832 default:
833 qemu_log_mask(LOG_GUEST_ERROR, "%s: write to CSR at unknown address "
834 "0x%"PRIx64"\n", __func__, addr);
835 break;
839 static const MemoryRegionOps tulip_ops = {
840 .read = tulip_read,
841 .write = tulip_write,
842 .endianness = DEVICE_LITTLE_ENDIAN,
843 .impl = {
844 .min_access_size = 4,
845 .max_access_size = 4,
849 static void tulip_idblock_crc(TULIPState *s, uint16_t *srom)
851 int word, n;
852 int bit;
853 unsigned char bitval, crc;
854 const int len = 9;
855 n = 0;
856 crc = -1;
858 for (word = 0; word < len; word++) {
859 for (bit = 15; bit >= 0; bit--) {
860 if ((word == (len - 1)) && (bit == 7)) {
862 * Insert the correct CRC result into input data stream
863 * in place.
865 srom[len - 1] = (srom[len - 1] & 0xff00) | (unsigned short)crc;
866 break;
868 n++;
869 bitval = ((srom[word] >> bit) & 1) ^ ((crc >> 7) & 1);
870 crc = crc << 1;
871 if (bitval == 1) {
872 crc ^= 6;
873 crc |= 0x01;
879 static uint16_t tulip_srom_crc(TULIPState *s, uint8_t *eeprom, size_t len)
881 unsigned long crc = 0xffffffff;
882 unsigned long flippedcrc = 0;
883 unsigned char currentbyte;
884 unsigned int msb, bit, i;
886 for (i = 0; i < len; i++) {
887 currentbyte = eeprom[i];
888 for (bit = 0; bit < 8; bit++) {
889 msb = (crc >> 31) & 1;
890 crc <<= 1;
891 if (msb ^ (currentbyte & 1)) {
892 crc ^= 0x04c11db6;
893 crc |= 0x00000001;
895 currentbyte >>= 1;
899 for (i = 0; i < 32; i++) {
900 flippedcrc <<= 1;
901 bit = crc & 1;
902 crc >>= 1;
903 flippedcrc += bit;
905 return (flippedcrc ^ 0xffffffff) & 0xffff;
908 static const uint8_t eeprom_default[128] = {
909 0x3c, 0x10, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
911 0x56, 0x08, 0x04, 0x01, 0x00, 0x80, 0x48, 0xb3,
912 0x0e, 0xa7, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x08,
913 0x01, 0x8d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x78,
914 0xe0, 0x01, 0x00, 0x50, 0x00, 0x18, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
920 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6b,
921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
922 0x48, 0xb3, 0x0e, 0xa7, 0x40, 0x00, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
924 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927 static void tulip_fill_eeprom(TULIPState *s)
929 uint16_t *eeprom = eeprom93xx_data(s->eeprom);
930 memcpy(eeprom, eeprom_default, 128);
932 /* patch in our mac address */
933 eeprom[10] = cpu_to_le16(s->c.macaddr.a[0] | (s->c.macaddr.a[1] << 8));
934 eeprom[11] = cpu_to_le16(s->c.macaddr.a[2] | (s->c.macaddr.a[3] << 8));
935 eeprom[12] = cpu_to_le16(s->c.macaddr.a[4] | (s->c.macaddr.a[5] << 8));
936 tulip_idblock_crc(s, eeprom);
937 eeprom[63] = cpu_to_le16(tulip_srom_crc(s, (uint8_t *)eeprom, 126));
940 static void pci_tulip_realize(PCIDevice *pci_dev, Error **errp)
942 TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
943 uint8_t *pci_conf;
945 pci_conf = s->dev.config;
946 pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
948 s->eeprom = eeprom93xx_new(&pci_dev->qdev, 64);
949 tulip_fill_eeprom(s);
951 memory_region_init_io(&s->io, OBJECT(&s->dev), &tulip_ops, s,
952 "tulip-io", 128);
954 memory_region_init_io(&s->memory, OBJECT(&s->dev), &tulip_ops, s,
955 "tulip-mem", 128);
957 pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
958 pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->memory);
960 s->irq = pci_allocate_irq(&s->dev);
962 qemu_macaddr_default_if_unset(&s->c.macaddr);
964 s->nic = qemu_new_nic(&net_tulip_info, &s->c,
965 object_get_typename(OBJECT(pci_dev)),
966 pci_dev->qdev.id, s);
967 qemu_format_nic_info_str(qemu_get_queue(s->nic), s->c.macaddr.a);
970 static void pci_tulip_exit(PCIDevice *pci_dev)
972 TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
974 qemu_del_nic(s->nic);
975 qemu_free_irq(s->irq);
976 eeprom93xx_free(&pci_dev->qdev, s->eeprom);
979 static void tulip_instance_init(Object *obj)
981 PCIDevice *pci_dev = PCI_DEVICE(obj);
982 TULIPState *d = DO_UPCAST(TULIPState, dev, pci_dev);
984 device_add_bootindex_property(obj, &d->c.bootindex,
985 "bootindex", "/ethernet-phy@0",
986 &pci_dev->qdev, NULL);
989 static Property tulip_properties[] = {
990 DEFINE_NIC_PROPERTIES(TULIPState, c),
991 DEFINE_PROP_END_OF_LIST(),
994 static void tulip_class_init(ObjectClass *klass, void *data)
996 DeviceClass *dc = DEVICE_CLASS(klass);
997 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
999 k->realize = pci_tulip_realize;
1000 k->exit = pci_tulip_exit;
1001 k->vendor_id = PCI_VENDOR_ID_DEC;
1002 k->device_id = PCI_DEVICE_ID_DEC_21143;
1003 k->subsystem_vendor_id = 0x103c;
1004 k->subsystem_id = 0x104f;
1005 k->class_id = PCI_CLASS_NETWORK_ETHERNET;
1006 dc->vmsd = &vmstate_pci_tulip;
1007 dc->props = tulip_properties;
1008 dc->reset = tulip_qdev_reset;
1009 set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
1012 static const TypeInfo tulip_info = {
1013 .name = TYPE_TULIP,
1014 .parent = TYPE_PCI_DEVICE,
1015 .instance_size = sizeof(TULIPState),
1016 .class_init = tulip_class_init,
1017 .instance_init = tulip_instance_init,
1018 .interfaces = (InterfaceInfo[]) {
1019 { INTERFACE_CONVENTIONAL_PCI_DEVICE },
1020 { },
1024 static void tulip_register_types(void)
1026 type_register_static(&tulip_info);
1029 type_init(tulip_register_types)