Merge remote-tracking branch 'remotes/amarkovic/tags/mips-queue-june-01-2020' into...
[qemu/ar7.git] / hw / net / tulip.c
blob6cefc0add27b172aa80b6fba72de117e701322fb
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;
174 if (s->rx_frame_len + len > sizeof(s->rx_frame)) {
175 return;
177 pci_dma_write(&s->dev, desc->buf_addr1, s->rx_frame +
178 (s->rx_frame_size - s->rx_frame_len), len);
179 s->rx_frame_len -= len;
182 if (s->rx_frame_len && len2) {
183 if (s->rx_frame_len > len2) {
184 len = len2;
185 } else {
186 len = s->rx_frame_len;
189 if (s->rx_frame_len + len > sizeof(s->rx_frame)) {
190 return;
192 pci_dma_write(&s->dev, desc->buf_addr2, s->rx_frame +
193 (s->rx_frame_size - s->rx_frame_len), len);
194 s->rx_frame_len -= len;
198 static bool tulip_filter_address(TULIPState *s, const uint8_t *addr)
200 static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
201 bool ret = false;
202 int i;
204 for (i = 0; i < 16 && ret == false; i++) {
205 if (!memcmp(&s->filter[i], addr, ETH_ALEN)) {
206 ret = true;
210 if (!memcmp(addr, broadcast, ETH_ALEN)) {
211 return true;
214 if (s->csr[6] & (CSR6_PR | CSR6_RA)) {
215 /* Promiscuous mode enabled */
216 s->rx_status |= RDES0_FF;
217 return true;
220 if ((s->csr[6] & CSR6_PM) && (addr[0] & 1)) {
221 /* Pass all Multicast enabled */
222 s->rx_status |= RDES0_MF;
223 return true;
226 if (s->csr[6] & CSR6_IF) {
227 ret ^= true;
229 return ret;
232 static ssize_t tulip_receive(TULIPState *s, const uint8_t *buf, size_t size)
234 struct tulip_descriptor desc;
236 trace_tulip_receive(buf, size);
238 if (size < 14 || size > sizeof(s->rx_frame) - 4
239 || s->rx_frame_len || tulip_rx_stopped(s)) {
240 return 0;
243 if (!tulip_filter_address(s, buf)) {
244 return size;
247 do {
248 tulip_desc_read(s, s->current_rx_desc, &desc);
249 tulip_dump_rx_descriptor(s, &desc);
251 if (!(desc.status & RDES0_OWN)) {
252 s->csr[5] |= CSR5_RU;
253 tulip_update_int(s);
254 return s->rx_frame_size - s->rx_frame_len;
256 desc.status = 0;
258 if (!s->rx_frame_len) {
259 s->rx_frame_size = size + 4;
260 s->rx_status = RDES0_LS |
261 ((s->rx_frame_size & RDES0_FL_MASK) << RDES0_FL_SHIFT);
262 desc.status |= RDES0_FS;
263 memcpy(s->rx_frame, buf, size);
264 s->rx_frame_len = s->rx_frame_size;
267 tulip_copy_rx_bytes(s, &desc);
269 if (!s->rx_frame_len) {
270 desc.status |= s->rx_status;
271 s->csr[5] |= CSR5_RI;
272 tulip_update_int(s);
274 tulip_dump_rx_descriptor(s, &desc);
275 tulip_desc_write(s, s->current_rx_desc, &desc);
276 tulip_next_rx_descriptor(s, &desc);
277 } while (s->rx_frame_len);
278 return size;
281 static ssize_t tulip_receive_nc(NetClientState *nc,
282 const uint8_t *buf, size_t size)
284 return tulip_receive(qemu_get_nic_opaque(nc), buf, size);
287 static NetClientInfo net_tulip_info = {
288 .type = NET_CLIENT_DRIVER_NIC,
289 .size = sizeof(NICState),
290 .receive = tulip_receive_nc,
293 static const char *tulip_reg_name(const hwaddr addr)
295 switch (addr) {
296 case CSR(0):
297 return "CSR0";
299 case CSR(1):
300 return "CSR1";
302 case CSR(2):
303 return "CSR2";
305 case CSR(3):
306 return "CSR3";
308 case CSR(4):
309 return "CSR4";
311 case CSR(5):
312 return "CSR5";
314 case CSR(6):
315 return "CSR6";
317 case CSR(7):
318 return "CSR7";
320 case CSR(8):
321 return "CSR8";
323 case CSR(9):
324 return "CSR9";
326 case CSR(10):
327 return "CSR10";
329 case CSR(11):
330 return "CSR11";
332 case CSR(12):
333 return "CSR12";
335 case CSR(13):
336 return "CSR13";
338 case CSR(14):
339 return "CSR14";
341 case CSR(15):
342 return "CSR15";
344 default:
345 break;
347 return "";
350 static const char *tulip_rx_state_name(int state)
352 switch (state) {
353 case CSR5_RS_STOPPED:
354 return "STOPPED";
356 case CSR5_RS_RUNNING_FETCH:
357 return "RUNNING/FETCH";
359 case CSR5_RS_RUNNING_CHECK_EOR:
360 return "RUNNING/CHECK EOR";
362 case CSR5_RS_RUNNING_WAIT_RECEIVE:
363 return "WAIT RECEIVE";
365 case CSR5_RS_SUSPENDED:
366 return "SUSPENDED";
368 case CSR5_RS_RUNNING_CLOSE:
369 return "RUNNING/CLOSE";
371 case CSR5_RS_RUNNING_FLUSH:
372 return "RUNNING/FLUSH";
374 case CSR5_RS_RUNNING_QUEUE:
375 return "RUNNING/QUEUE";
377 default:
378 break;
380 return "";
383 static const char *tulip_tx_state_name(int state)
385 switch (state) {
386 case CSR5_TS_STOPPED:
387 return "STOPPED";
389 case CSR5_TS_RUNNING_FETCH:
390 return "RUNNING/FETCH";
392 case CSR5_TS_RUNNING_WAIT_EOT:
393 return "RUNNING/WAIT EOT";
395 case CSR5_TS_RUNNING_READ_BUF:
396 return "RUNNING/READ BUF";
398 case CSR5_TS_RUNNING_SETUP:
399 return "RUNNING/SETUP";
401 case CSR5_TS_SUSPENDED:
402 return "SUSPENDED";
404 case CSR5_TS_RUNNING_CLOSE:
405 return "RUNNING/CLOSE";
407 default:
408 break;
410 return "";
413 static void tulip_update_rs(TULIPState *s, int state)
415 s->csr[5] &= ~(CSR5_RS_MASK << CSR5_RS_SHIFT);
416 s->csr[5] |= (state & CSR5_RS_MASK) << CSR5_RS_SHIFT;
417 trace_tulip_rx_state(tulip_rx_state_name(state));
420 static uint16_t tulip_mdi_default[] = {
421 /* MDI Registers 0 - 6, 7 */
422 0x3100, 0xf02c, 0x7810, 0x0000, 0x0501, 0x4181, 0x0000, 0x0000,
423 /* MDI Registers 8 - 15 */
424 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
425 /* MDI Registers 16 - 31 */
426 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
427 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
430 /* Readonly mask for MDI (PHY) registers */
431 static const uint16_t tulip_mdi_mask[] = {
432 0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
433 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
434 0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
435 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
438 static uint16_t tulip_mii_read(TULIPState *s, int phy, int reg)
440 uint16_t ret = 0;
441 if (phy == 1) {
442 ret = tulip_mdi_default[reg];
444 trace_tulip_mii_read(phy, reg, ret);
445 return ret;
448 static void tulip_mii_write(TULIPState *s, int phy, int reg, uint16_t data)
450 trace_tulip_mii_write(phy, reg, data);
452 if (phy != 1) {
453 return;
456 tulip_mdi_default[reg] &= ~tulip_mdi_mask[reg];
457 tulip_mdi_default[reg] |= (data & tulip_mdi_mask[reg]);
460 static void tulip_mii(TULIPState *s)
462 uint32_t changed = s->old_csr9 ^ s->csr[9];
463 uint16_t data;
464 int op, phy, reg;
466 if (!(changed & CSR9_MDC)) {
467 return;
470 if (!(s->csr[9] & CSR9_MDC)) {
471 return;
474 s->mii_bitcnt++;
475 s->mii_word <<= 1;
477 if (s->csr[9] & CSR9_MDO && (s->mii_bitcnt < 16 ||
478 !(s->csr[9] & CSR9_MII))) {
479 /* write op or address bits */
480 s->mii_word |= 1;
483 if (s->mii_bitcnt >= 16 && (s->csr[9] & CSR9_MII)) {
484 if (s->mii_word & 0x8000) {
485 s->csr[9] |= CSR9_MDI;
486 } else {
487 s->csr[9] &= ~CSR9_MDI;
491 if (s->mii_word == 0xffffffff) {
492 s->mii_bitcnt = 0;
493 } else if (s->mii_bitcnt == 16) {
494 op = (s->mii_word >> 12) & 0x0f;
495 phy = (s->mii_word >> 7) & 0x1f;
496 reg = (s->mii_word >> 2) & 0x1f;
498 if (op == 6) {
499 s->mii_word = tulip_mii_read(s, phy, reg);
501 } else if (s->mii_bitcnt == 32) {
502 op = (s->mii_word >> 28) & 0x0f;
503 phy = (s->mii_word >> 23) & 0x1f;
504 reg = (s->mii_word >> 18) & 0x1f;
505 data = s->mii_word & 0xffff;
507 if (op == 5) {
508 tulip_mii_write(s, phy, reg, data);
513 static uint32_t tulip_csr9_read(TULIPState *s)
515 if (s->csr[9] & CSR9_SR) {
516 if (eeprom93xx_read(s->eeprom)) {
517 s->csr[9] |= CSR9_SR_DO;
518 } else {
519 s->csr[9] &= ~CSR9_SR_DO;
523 tulip_mii(s);
524 return s->csr[9];
527 static void tulip_update_ts(TULIPState *s, int state)
529 s->csr[5] &= ~(CSR5_TS_MASK << CSR5_TS_SHIFT);
530 s->csr[5] |= (state & CSR5_TS_MASK) << CSR5_TS_SHIFT;
531 trace_tulip_tx_state(tulip_tx_state_name(state));
534 static uint64_t tulip_read(void *opaque, hwaddr addr,
535 unsigned size)
537 TULIPState *s = opaque;
538 uint64_t data = 0;
540 switch (addr) {
541 case CSR(9):
542 data = tulip_csr9_read(s);
543 break;
545 case CSR(12):
546 /* Fake autocompletion complete until we have PHY emulation */
547 data = 5 << CSR12_ANS_SHIFT;
548 break;
550 default:
551 if (addr & 7) {
552 qemu_log_mask(LOG_GUEST_ERROR, "%s: read access at unknown address"
553 " 0x%"PRIx64"\n", __func__, addr);
554 } else {
555 data = s->csr[addr >> 3];
557 break;
559 trace_tulip_reg_read(addr, tulip_reg_name(addr), size, data);
560 return data;
563 static void tulip_tx(TULIPState *s, struct tulip_descriptor *desc)
565 if (s->tx_frame_len) {
566 if ((s->csr[6] >> CSR6_OM_SHIFT) & CSR6_OM_MASK) {
567 /* Internal or external Loopback */
568 tulip_receive(s, s->tx_frame, s->tx_frame_len);
569 } else if (s->tx_frame_len <= sizeof(s->tx_frame)) {
570 qemu_send_packet(qemu_get_queue(s->nic),
571 s->tx_frame, s->tx_frame_len);
575 if (desc->control & TDES1_IC) {
576 s->csr[5] |= CSR5_TI;
577 tulip_update_int(s);
581 static int tulip_copy_tx_buffers(TULIPState *s, struct tulip_descriptor *desc)
583 int len1 = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
584 int len2 = (desc->control >> TDES1_BUF2_SIZE_SHIFT) & TDES1_BUF2_SIZE_MASK;
586 if (s->tx_frame_len + len1 > sizeof(s->tx_frame)) {
587 return -1;
589 if (len1) {
590 pci_dma_read(&s->dev, desc->buf_addr1,
591 s->tx_frame + s->tx_frame_len, len1);
592 s->tx_frame_len += len1;
595 if (s->tx_frame_len + len2 > sizeof(s->tx_frame)) {
596 return -1;
598 if (len2) {
599 pci_dma_read(&s->dev, desc->buf_addr2,
600 s->tx_frame + s->tx_frame_len, len2);
601 s->tx_frame_len += len2;
603 desc->status = (len1 + len2) ? 0 : 0x7fffffff;
605 return 0;
608 static void tulip_setup_filter_addr(TULIPState *s, uint8_t *buf, int n)
610 int offset = n * 12;
612 s->filter[n][0] = buf[offset];
613 s->filter[n][1] = buf[offset + 1];
615 s->filter[n][2] = buf[offset + 4];
616 s->filter[n][3] = buf[offset + 5];
618 s->filter[n][4] = buf[offset + 8];
619 s->filter[n][5] = buf[offset + 9];
621 trace_tulip_setup_filter(n, s->filter[n][5], s->filter[n][4],
622 s->filter[n][3], s->filter[n][2], s->filter[n][1], s->filter[n][0]);
625 static void tulip_setup_frame(TULIPState *s,
626 struct tulip_descriptor *desc)
628 uint8_t buf[4096];
629 int len = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
630 int i;
632 trace_tulip_setup_frame();
634 if (len == 192) {
635 pci_dma_read(&s->dev, desc->buf_addr1, buf, len);
636 for (i = 0; i < 16; i++) {
637 tulip_setup_filter_addr(s, buf, i);
641 desc->status = 0x7fffffff;
643 if (desc->control & TDES1_IC) {
644 s->csr[5] |= CSR5_TI;
645 tulip_update_int(s);
649 static void tulip_next_tx_descriptor(TULIPState *s,
650 struct tulip_descriptor *desc)
652 if (desc->control & TDES1_TER) {
653 s->current_tx_desc = s->csr[4];
654 } else if (desc->control & TDES1_TCH) {
655 s->current_tx_desc = desc->buf_addr2;
656 } else {
657 s->current_tx_desc += sizeof(struct tulip_descriptor) +
658 (((s->csr[0] >> CSR0_DSL_SHIFT) & CSR0_DSL_MASK) << 2);
660 s->current_tx_desc &= ~3ULL;
663 static uint32_t tulip_ts(TULIPState *s)
665 return (s->csr[5] >> CSR5_TS_SHIFT) & CSR5_TS_MASK;
668 static void tulip_xmit_list_update(TULIPState *s)
670 #define TULIP_DESC_MAX 128
671 uint8_t i = 0;
672 struct tulip_descriptor desc;
674 if (tulip_ts(s) != CSR5_TS_SUSPENDED) {
675 return;
678 for (i = 0; i < TULIP_DESC_MAX; i++) {
679 tulip_desc_read(s, s->current_tx_desc, &desc);
680 tulip_dump_tx_descriptor(s, &desc);
682 if (!(desc.status & TDES0_OWN)) {
683 tulip_update_ts(s, CSR5_TS_SUSPENDED);
684 s->csr[5] |= CSR5_TU;
685 tulip_update_int(s);
686 return;
689 if (desc.control & TDES1_SET) {
690 tulip_setup_frame(s, &desc);
691 } else {
692 if (desc.control & TDES1_FS) {
693 s->tx_frame_len = 0;
696 if (!tulip_copy_tx_buffers(s, &desc)) {
697 if (desc.control & TDES1_LS) {
698 tulip_tx(s, &desc);
702 tulip_desc_write(s, s->current_tx_desc, &desc);
703 tulip_next_tx_descriptor(s, &desc);
707 static void tulip_csr9_write(TULIPState *s, uint32_t old_val,
708 uint32_t new_val)
710 if (new_val & CSR9_SR) {
711 eeprom93xx_write(s->eeprom,
712 !!(new_val & CSR9_SR_CS),
713 !!(new_val & CSR9_SR_SK),
714 !!(new_val & CSR9_SR_DI));
718 static void tulip_reset(TULIPState *s)
720 trace_tulip_reset();
722 s->csr[0] = 0xfe000000;
723 s->csr[1] = 0xffffffff;
724 s->csr[2] = 0xffffffff;
725 s->csr[5] = 0xf0000000;
726 s->csr[6] = 0x32000040;
727 s->csr[7] = 0xf3fe0000;
728 s->csr[8] = 0xe0000000;
729 s->csr[9] = 0xfff483ff;
730 s->csr[11] = 0xfffe0000;
731 s->csr[12] = 0x000000c6;
732 s->csr[13] = 0xffff0000;
733 s->csr[14] = 0xffffffff;
734 s->csr[15] = 0x8ff00000;
737 static void tulip_qdev_reset(DeviceState *dev)
739 PCIDevice *d = PCI_DEVICE(dev);
740 TULIPState *s = TULIP(d);
742 tulip_reset(s);
745 static void tulip_write(void *opaque, hwaddr addr,
746 uint64_t data, unsigned size)
748 TULIPState *s = opaque;
749 trace_tulip_reg_write(addr, tulip_reg_name(addr), size, data);
751 switch (addr) {
752 case CSR(0):
753 s->csr[0] = data;
754 if (data & CSR0_SWR) {
755 tulip_reset(s);
756 tulip_update_int(s);
758 break;
760 case CSR(1):
761 tulip_xmit_list_update(s);
762 break;
764 case CSR(2):
765 qemu_flush_queued_packets(qemu_get_queue(s->nic));
766 break;
768 case CSR(3):
769 s->csr[3] = data & ~3ULL;
770 s->current_rx_desc = s->csr[3];
771 qemu_flush_queued_packets(qemu_get_queue(s->nic));
772 break;
774 case CSR(4):
775 s->csr[4] = data & ~3ULL;
776 s->current_tx_desc = s->csr[4];
777 tulip_xmit_list_update(s);
778 break;
780 case CSR(5):
781 /* Status register, write clears bit */
782 s->csr[5] &= ~(data & (CSR5_TI | CSR5_TPS | CSR5_TU | CSR5_TJT |
783 CSR5_LNP_ANC | CSR5_UNF | CSR5_RI | CSR5_RU |
784 CSR5_RPS | CSR5_RWT | CSR5_ETI | CSR5_GTE |
785 CSR5_LNF | CSR5_FBE | CSR5_ERI | CSR5_AIS |
786 CSR5_NIS | CSR5_GPI | CSR5_LC));
787 tulip_update_int(s);
788 break;
790 case CSR(6):
791 s->csr[6] = data;
792 if (s->csr[6] & CSR6_SR) {
793 tulip_update_rs(s, CSR5_RS_RUNNING_WAIT_RECEIVE);
794 qemu_flush_queued_packets(qemu_get_queue(s->nic));
795 } else {
796 tulip_update_rs(s, CSR5_RS_STOPPED);
799 if (s->csr[6] & CSR6_ST) {
800 tulip_update_ts(s, CSR5_TS_SUSPENDED);
801 tulip_xmit_list_update(s);
802 } else {
803 tulip_update_ts(s, CSR5_TS_STOPPED);
805 break;
807 case CSR(7):
808 s->csr[7] = data;
809 tulip_update_int(s);
810 break;
812 case CSR(8):
813 s->csr[9] = data;
814 break;
816 case CSR(9):
817 tulip_csr9_write(s, s->csr[9], data);
818 /* don't clear MII read data */
819 s->csr[9] &= CSR9_MDI;
820 s->csr[9] |= (data & ~CSR9_MDI);
821 tulip_mii(s);
822 s->old_csr9 = s->csr[9];
823 break;
825 case CSR(10):
826 s->csr[10] = data;
827 break;
829 case CSR(11):
830 s->csr[11] = data;
831 break;
833 case CSR(12):
834 /* SIA Status register, some bits are cleared by writing 1 */
835 s->csr[12] &= ~(data & (CSR12_MRA | CSR12_TRA | CSR12_ARA));
836 break;
838 case CSR(13):
839 s->csr[13] = data;
840 break;
842 case CSR(14):
843 s->csr[14] = data;
844 break;
846 case CSR(15):
847 s->csr[15] = data;
848 break;
850 default:
851 qemu_log_mask(LOG_GUEST_ERROR, "%s: write to CSR at unknown address "
852 "0x%"PRIx64"\n", __func__, addr);
853 break;
857 static const MemoryRegionOps tulip_ops = {
858 .read = tulip_read,
859 .write = tulip_write,
860 .endianness = DEVICE_LITTLE_ENDIAN,
861 .impl = {
862 .min_access_size = 4,
863 .max_access_size = 4,
867 static void tulip_idblock_crc(TULIPState *s, uint16_t *srom)
869 int word, n;
870 int bit;
871 unsigned char bitval, crc;
872 const int len = 9;
873 n = 0;
874 crc = -1;
876 for (word = 0; word < len; word++) {
877 for (bit = 15; bit >= 0; bit--) {
878 if ((word == (len - 1)) && (bit == 7)) {
880 * Insert the correct CRC result into input data stream
881 * in place.
883 srom[len - 1] = (srom[len - 1] & 0xff00) | (unsigned short)crc;
884 break;
886 n++;
887 bitval = ((srom[word] >> bit) & 1) ^ ((crc >> 7) & 1);
888 crc = crc << 1;
889 if (bitval == 1) {
890 crc ^= 6;
891 crc |= 0x01;
897 static uint16_t tulip_srom_crc(TULIPState *s, uint8_t *eeprom, size_t len)
899 unsigned long crc = 0xffffffff;
900 unsigned long flippedcrc = 0;
901 unsigned char currentbyte;
902 unsigned int msb, bit, i;
904 for (i = 0; i < len; i++) {
905 currentbyte = eeprom[i];
906 for (bit = 0; bit < 8; bit++) {
907 msb = (crc >> 31) & 1;
908 crc <<= 1;
909 if (msb ^ (currentbyte & 1)) {
910 crc ^= 0x04c11db6;
911 crc |= 0x00000001;
913 currentbyte >>= 1;
917 for (i = 0; i < 32; i++) {
918 flippedcrc <<= 1;
919 bit = crc & 1;
920 crc >>= 1;
921 flippedcrc += bit;
923 return (flippedcrc ^ 0xffffffff) & 0xffff;
926 static const uint8_t eeprom_default[128] = {
927 0x3c, 0x10, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00,
928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929 0x56, 0x08, 0x04, 0x01, 0x00, 0x80, 0x48, 0xb3,
930 0x0e, 0xa7, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x08,
931 0x01, 0x8d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x78,
932 0xe0, 0x01, 0x00, 0x50, 0x00, 0x18, 0x00, 0x00,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6b,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
940 0x48, 0xb3, 0x0e, 0xa7, 0x40, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 static void tulip_fill_eeprom(TULIPState *s)
947 uint16_t *eeprom = eeprom93xx_data(s->eeprom);
948 memcpy(eeprom, eeprom_default, 128);
950 /* patch in our mac address */
951 eeprom[10] = cpu_to_le16(s->c.macaddr.a[0] | (s->c.macaddr.a[1] << 8));
952 eeprom[11] = cpu_to_le16(s->c.macaddr.a[2] | (s->c.macaddr.a[3] << 8));
953 eeprom[12] = cpu_to_le16(s->c.macaddr.a[4] | (s->c.macaddr.a[5] << 8));
954 tulip_idblock_crc(s, eeprom);
955 eeprom[63] = cpu_to_le16(tulip_srom_crc(s, (uint8_t *)eeprom, 126));
958 static void pci_tulip_realize(PCIDevice *pci_dev, Error **errp)
960 TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
961 uint8_t *pci_conf;
963 pci_conf = s->dev.config;
964 pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
966 s->eeprom = eeprom93xx_new(&pci_dev->qdev, 64);
967 tulip_fill_eeprom(s);
969 memory_region_init_io(&s->io, OBJECT(&s->dev), &tulip_ops, s,
970 "tulip-io", 128);
972 memory_region_init_io(&s->memory, OBJECT(&s->dev), &tulip_ops, s,
973 "tulip-mem", 128);
975 pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
976 pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->memory);
978 s->irq = pci_allocate_irq(&s->dev);
980 qemu_macaddr_default_if_unset(&s->c.macaddr);
982 s->nic = qemu_new_nic(&net_tulip_info, &s->c,
983 object_get_typename(OBJECT(pci_dev)),
984 pci_dev->qdev.id, s);
985 qemu_format_nic_info_str(qemu_get_queue(s->nic), s->c.macaddr.a);
988 static void pci_tulip_exit(PCIDevice *pci_dev)
990 TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
992 qemu_del_nic(s->nic);
993 qemu_free_irq(s->irq);
994 eeprom93xx_free(&pci_dev->qdev, s->eeprom);
997 static void tulip_instance_init(Object *obj)
999 PCIDevice *pci_dev = PCI_DEVICE(obj);
1000 TULIPState *d = DO_UPCAST(TULIPState, dev, pci_dev);
1002 device_add_bootindex_property(obj, &d->c.bootindex,
1003 "bootindex", "/ethernet-phy@0",
1004 &pci_dev->qdev);
1007 static Property tulip_properties[] = {
1008 DEFINE_NIC_PROPERTIES(TULIPState, c),
1009 DEFINE_PROP_END_OF_LIST(),
1012 static void tulip_class_init(ObjectClass *klass, void *data)
1014 DeviceClass *dc = DEVICE_CLASS(klass);
1015 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1017 k->realize = pci_tulip_realize;
1018 k->exit = pci_tulip_exit;
1019 k->vendor_id = PCI_VENDOR_ID_DEC;
1020 k->device_id = PCI_DEVICE_ID_DEC_21143;
1021 k->subsystem_vendor_id = 0x103c;
1022 k->subsystem_id = 0x104f;
1023 k->class_id = PCI_CLASS_NETWORK_ETHERNET;
1024 dc->vmsd = &vmstate_pci_tulip;
1025 device_class_set_props(dc, tulip_properties);
1026 dc->reset = tulip_qdev_reset;
1027 set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
1030 static const TypeInfo tulip_info = {
1031 .name = TYPE_TULIP,
1032 .parent = TYPE_PCI_DEVICE,
1033 .instance_size = sizeof(TULIPState),
1034 .class_init = tulip_class_init,
1035 .instance_init = tulip_instance_init,
1036 .interfaces = (InterfaceInfo[]) {
1037 { INTERFACE_CONVENTIONAL_PCI_DEVICE },
1038 { },
1042 static void tulip_register_types(void)
1044 type_register_static(&tulip_info);
1047 type_init(tulip_register_types)