]> git.proxmox.com Git - mirror_qemu.git/blob - hw/net/tulip.c
Merge remote-tracking branch 'remotes/philmd/tags/mips-20210711' into staging
[mirror_qemu.git] / hw / net / tulip.c
1 /*
2 * QEMU TULIP Emulation
3 *
4 * Copyright (c) 2019 Sven Schnelle <svens@stackframe.org>
5 *
6 * This work is licensed under the GNU GPL license version 2 or later.
7 */
8
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"
20
21 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];
30
31 /* state for MII */
32 uint32_t old_csr9;
33 uint32_t mii_word;
34 uint32_t mii_bitcnt;
35
36 hwaddr current_rx_desc;
37 hwaddr current_tx_desc;
38
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;
44
45 uint32_t rx_status;
46 uint8_t filter[16][6];
47 };
48
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()
67 }
68 };
69
70 static void tulip_desc_read(TULIPState *s, hwaddr p,
71 struct tulip_descriptor *desc)
72 {
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);
83 }
84 }
85
86 static void tulip_desc_write(TULIPState *s, hwaddr p,
87 struct tulip_descriptor *desc)
88 {
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);
99 }
100 }
101
102 static void tulip_update_int(TULIPState *s)
103 {
104 uint32_t ie = s->csr[5] & s->csr[7];
105 bool assert = false;
106
107 s->csr[5] &= ~(CSR5_AIS | CSR5_NIS);
108
109 if (ie & (CSR5_TI | CSR5_TU | CSR5_RI | CSR5_GTE | CSR5_ERI)) {
110 s->csr[5] |= CSR5_NIS;
111 }
112
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;
117 }
118
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);
122 }
123
124 static bool tulip_rx_stopped(TULIPState *s)
125 {
126 return ((s->csr[5] >> CSR5_RS_SHIFT) & CSR5_RS_MASK) == CSR5_RS_STOPPED;
127 }
128
129 static void tulip_dump_tx_descriptor(TULIPState *s,
130 struct tulip_descriptor *desc)
131 {
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);
136 }
137
138 static void tulip_dump_rx_descriptor(TULIPState *s,
139 struct tulip_descriptor *desc)
140 {
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);
145 }
146
147 static void tulip_next_rx_descriptor(TULIPState *s,
148 struct tulip_descriptor *desc)
149 {
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);
157 }
158 s->current_rx_desc &= ~3ULL;
159 }
160
161 static void tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc)
162 {
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;
166
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;
172 }
173
174 pci_dma_write(&s->dev, desc->buf_addr1, s->rx_frame +
175 (s->rx_frame_size - s->rx_frame_len), len);
176 s->rx_frame_len -= len;
177 }
178
179 if (s->rx_frame_len && len2) {
180 if (s->rx_frame_len > len2) {
181 len = len2;
182 } else {
183 len = s->rx_frame_len;
184 }
185
186 pci_dma_write(&s->dev, desc->buf_addr2, s->rx_frame +
187 (s->rx_frame_size - s->rx_frame_len), len);
188 s->rx_frame_len -= len;
189 }
190 }
191
192 static bool tulip_filter_address(TULIPState *s, const uint8_t *addr)
193 {
194 static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
195 bool ret = false;
196 int i;
197
198 for (i = 0; i < 16 && ret == false; i++) {
199 if (!memcmp(&s->filter[i], addr, ETH_ALEN)) {
200 ret = true;
201 }
202 }
203
204 if (!memcmp(addr, broadcast, ETH_ALEN)) {
205 return true;
206 }
207
208 if (s->csr[6] & (CSR6_PR | CSR6_RA)) {
209 /* Promiscuous mode enabled */
210 s->rx_status |= RDES0_FF;
211 return true;
212 }
213
214 if ((s->csr[6] & CSR6_PM) && (addr[0] & 1)) {
215 /* Pass all Multicast enabled */
216 s->rx_status |= RDES0_MF;
217 return true;
218 }
219
220 if (s->csr[6] & CSR6_IF) {
221 ret ^= true;
222 }
223 return ret;
224 }
225
226 static ssize_t tulip_receive(TULIPState *s, const uint8_t *buf, size_t size)
227 {
228 struct tulip_descriptor desc;
229
230 trace_tulip_receive(buf, size);
231
232 if (size < 14 || size > sizeof(s->rx_frame) - 4
233 || s->rx_frame_len || tulip_rx_stopped(s)) {
234 return 0;
235 }
236
237 if (!tulip_filter_address(s, buf)) {
238 return size;
239 }
240
241 do {
242 tulip_desc_read(s, s->current_rx_desc, &desc);
243 tulip_dump_rx_descriptor(s, &desc);
244
245 if (!(desc.status & RDES0_OWN)) {
246 s->csr[5] |= CSR5_RU;
247 tulip_update_int(s);
248 return s->rx_frame_size - s->rx_frame_len;
249 }
250 desc.status = 0;
251
252 if (!s->rx_frame_len) {
253 s->rx_frame_size = size + 4;
254 s->rx_status = RDES0_LS |
255 ((s->rx_frame_size & RDES0_FL_MASK) << RDES0_FL_SHIFT);
256 desc.status |= RDES0_FS;
257 memcpy(s->rx_frame, buf, size);
258 s->rx_frame_len = s->rx_frame_size;
259 }
260
261 tulip_copy_rx_bytes(s, &desc);
262
263 if (!s->rx_frame_len) {
264 desc.status |= s->rx_status;
265 s->csr[5] |= CSR5_RI;
266 tulip_update_int(s);
267 }
268 tulip_dump_rx_descriptor(s, &desc);
269 tulip_desc_write(s, s->current_rx_desc, &desc);
270 tulip_next_rx_descriptor(s, &desc);
271 } while (s->rx_frame_len);
272 return size;
273 }
274
275 static ssize_t tulip_receive_nc(NetClientState *nc,
276 const uint8_t *buf, size_t size)
277 {
278 return tulip_receive(qemu_get_nic_opaque(nc), buf, size);
279 }
280
281 static NetClientInfo net_tulip_info = {
282 .type = NET_CLIENT_DRIVER_NIC,
283 .size = sizeof(NICState),
284 .receive = tulip_receive_nc,
285 };
286
287 static const char *tulip_reg_name(const hwaddr addr)
288 {
289 switch (addr) {
290 case CSR(0):
291 return "CSR0";
292
293 case CSR(1):
294 return "CSR1";
295
296 case CSR(2):
297 return "CSR2";
298
299 case CSR(3):
300 return "CSR3";
301
302 case CSR(4):
303 return "CSR4";
304
305 case CSR(5):
306 return "CSR5";
307
308 case CSR(6):
309 return "CSR6";
310
311 case CSR(7):
312 return "CSR7";
313
314 case CSR(8):
315 return "CSR8";
316
317 case CSR(9):
318 return "CSR9";
319
320 case CSR(10):
321 return "CSR10";
322
323 case CSR(11):
324 return "CSR11";
325
326 case CSR(12):
327 return "CSR12";
328
329 case CSR(13):
330 return "CSR13";
331
332 case CSR(14):
333 return "CSR14";
334
335 case CSR(15):
336 return "CSR15";
337
338 default:
339 break;
340 }
341 return "";
342 }
343
344 static const char *tulip_rx_state_name(int state)
345 {
346 switch (state) {
347 case CSR5_RS_STOPPED:
348 return "STOPPED";
349
350 case CSR5_RS_RUNNING_FETCH:
351 return "RUNNING/FETCH";
352
353 case CSR5_RS_RUNNING_CHECK_EOR:
354 return "RUNNING/CHECK EOR";
355
356 case CSR5_RS_RUNNING_WAIT_RECEIVE:
357 return "WAIT RECEIVE";
358
359 case CSR5_RS_SUSPENDED:
360 return "SUSPENDED";
361
362 case CSR5_RS_RUNNING_CLOSE:
363 return "RUNNING/CLOSE";
364
365 case CSR5_RS_RUNNING_FLUSH:
366 return "RUNNING/FLUSH";
367
368 case CSR5_RS_RUNNING_QUEUE:
369 return "RUNNING/QUEUE";
370
371 default:
372 break;
373 }
374 return "";
375 }
376
377 static const char *tulip_tx_state_name(int state)
378 {
379 switch (state) {
380 case CSR5_TS_STOPPED:
381 return "STOPPED";
382
383 case CSR5_TS_RUNNING_FETCH:
384 return "RUNNING/FETCH";
385
386 case CSR5_TS_RUNNING_WAIT_EOT:
387 return "RUNNING/WAIT EOT";
388
389 case CSR5_TS_RUNNING_READ_BUF:
390 return "RUNNING/READ BUF";
391
392 case CSR5_TS_RUNNING_SETUP:
393 return "RUNNING/SETUP";
394
395 case CSR5_TS_SUSPENDED:
396 return "SUSPENDED";
397
398 case CSR5_TS_RUNNING_CLOSE:
399 return "RUNNING/CLOSE";
400
401 default:
402 break;
403 }
404 return "";
405 }
406
407 static void tulip_update_rs(TULIPState *s, int state)
408 {
409 s->csr[5] &= ~(CSR5_RS_MASK << CSR5_RS_SHIFT);
410 s->csr[5] |= (state & CSR5_RS_MASK) << CSR5_RS_SHIFT;
411 trace_tulip_rx_state(tulip_rx_state_name(state));
412 }
413
414 static uint16_t tulip_mdi_default[] = {
415 /* MDI Registers 0 - 6, 7 */
416 0x3100, 0xf02c, 0x7810, 0x0000, 0x0501, 0x4181, 0x0000, 0x0000,
417 /* MDI Registers 8 - 15 */
418 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
419 /* MDI Registers 16 - 31 */
420 0x0003, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
421 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
422 };
423
424 /* Readonly mask for MDI (PHY) registers */
425 static const uint16_t tulip_mdi_mask[] = {
426 0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
427 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
428 0x0fff, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
429 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
430 };
431
432 static uint16_t tulip_mii_read(TULIPState *s, int phy, int reg)
433 {
434 uint16_t ret = 0;
435 if (phy == 1) {
436 ret = tulip_mdi_default[reg];
437 }
438 trace_tulip_mii_read(phy, reg, ret);
439 return ret;
440 }
441
442 static void tulip_mii_write(TULIPState *s, int phy, int reg, uint16_t data)
443 {
444 trace_tulip_mii_write(phy, reg, data);
445
446 if (phy != 1) {
447 return;
448 }
449
450 tulip_mdi_default[reg] &= ~tulip_mdi_mask[reg];
451 tulip_mdi_default[reg] |= (data & tulip_mdi_mask[reg]);
452 }
453
454 static void tulip_mii(TULIPState *s)
455 {
456 uint32_t changed = s->old_csr9 ^ s->csr[9];
457 uint16_t data;
458 int op, phy, reg;
459
460 if (!(changed & CSR9_MDC)) {
461 return;
462 }
463
464 if (!(s->csr[9] & CSR9_MDC)) {
465 return;
466 }
467
468 s->mii_bitcnt++;
469 s->mii_word <<= 1;
470
471 if (s->csr[9] & CSR9_MDO && (s->mii_bitcnt < 16 ||
472 !(s->csr[9] & CSR9_MII))) {
473 /* write op or address bits */
474 s->mii_word |= 1;
475 }
476
477 if (s->mii_bitcnt >= 16 && (s->csr[9] & CSR9_MII)) {
478 if (s->mii_word & 0x8000) {
479 s->csr[9] |= CSR9_MDI;
480 } else {
481 s->csr[9] &= ~CSR9_MDI;
482 }
483 }
484
485 if (s->mii_word == 0xffffffff) {
486 s->mii_bitcnt = 0;
487 } else if (s->mii_bitcnt == 16) {
488 op = (s->mii_word >> 12) & 0x0f;
489 phy = (s->mii_word >> 7) & 0x1f;
490 reg = (s->mii_word >> 2) & 0x1f;
491
492 if (op == 6) {
493 s->mii_word = tulip_mii_read(s, phy, reg);
494 }
495 } else if (s->mii_bitcnt == 32) {
496 op = (s->mii_word >> 28) & 0x0f;
497 phy = (s->mii_word >> 23) & 0x1f;
498 reg = (s->mii_word >> 18) & 0x1f;
499 data = s->mii_word & 0xffff;
500
501 if (op == 5) {
502 tulip_mii_write(s, phy, reg, data);
503 }
504 }
505 }
506
507 static uint32_t tulip_csr9_read(TULIPState *s)
508 {
509 if (s->csr[9] & CSR9_SR) {
510 if (eeprom93xx_read(s->eeprom)) {
511 s->csr[9] |= CSR9_SR_DO;
512 } else {
513 s->csr[9] &= ~CSR9_SR_DO;
514 }
515 }
516
517 tulip_mii(s);
518 return s->csr[9];
519 }
520
521 static void tulip_update_ts(TULIPState *s, int state)
522 {
523 s->csr[5] &= ~(CSR5_TS_MASK << CSR5_TS_SHIFT);
524 s->csr[5] |= (state & CSR5_TS_MASK) << CSR5_TS_SHIFT;
525 trace_tulip_tx_state(tulip_tx_state_name(state));
526 }
527
528 static uint64_t tulip_read(void *opaque, hwaddr addr,
529 unsigned size)
530 {
531 TULIPState *s = opaque;
532 uint64_t data = 0;
533
534 switch (addr) {
535 case CSR(9):
536 data = tulip_csr9_read(s);
537 break;
538
539 case CSR(12):
540 /* Fake autocompletion complete until we have PHY emulation */
541 data = 5 << CSR12_ANS_SHIFT;
542 break;
543
544 default:
545 if (addr & 7) {
546 qemu_log_mask(LOG_GUEST_ERROR, "%s: read access at unknown address"
547 " 0x%"PRIx64"\n", __func__, addr);
548 } else {
549 data = s->csr[addr >> 3];
550 }
551 break;
552 }
553 trace_tulip_reg_read(addr, tulip_reg_name(addr), size, data);
554 return data;
555 }
556
557 static void tulip_tx(TULIPState *s, struct tulip_descriptor *desc)
558 {
559 if (s->tx_frame_len) {
560 if ((s->csr[6] >> CSR6_OM_SHIFT) & CSR6_OM_MASK) {
561 /* Internal or external Loopback */
562 tulip_receive(s, s->tx_frame, s->tx_frame_len);
563 } else if (s->tx_frame_len <= sizeof(s->tx_frame)) {
564 qemu_send_packet(qemu_get_queue(s->nic),
565 s->tx_frame, s->tx_frame_len);
566 }
567 }
568
569 if (desc->control & TDES1_IC) {
570 s->csr[5] |= CSR5_TI;
571 tulip_update_int(s);
572 }
573 }
574
575 static int tulip_copy_tx_buffers(TULIPState *s, struct tulip_descriptor *desc)
576 {
577 int len1 = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
578 int len2 = (desc->control >> TDES1_BUF2_SIZE_SHIFT) & TDES1_BUF2_SIZE_MASK;
579
580 if (s->tx_frame_len + len1 > sizeof(s->tx_frame)) {
581 qemu_log_mask(LOG_GUEST_ERROR,
582 "%s: descriptor overflow (ofs: %u, len:%d, size:%zu)\n",
583 __func__, s->tx_frame_len, len1, sizeof(s->tx_frame));
584 return -1;
585 }
586 if (len1) {
587 pci_dma_read(&s->dev, desc->buf_addr1,
588 s->tx_frame + s->tx_frame_len, len1);
589 s->tx_frame_len += len1;
590 }
591
592 if (s->tx_frame_len + len2 > sizeof(s->tx_frame)) {
593 qemu_log_mask(LOG_GUEST_ERROR,
594 "%s: descriptor overflow (ofs: %u, len:%d, size:%zu)\n",
595 __func__, s->tx_frame_len, len2, sizeof(s->tx_frame));
596 return -1;
597 }
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;
602 }
603 desc->status = (len1 + len2) ? 0 : 0x7fffffff;
604
605 return 0;
606 }
607
608 static void tulip_setup_filter_addr(TULIPState *s, uint8_t *buf, int n)
609 {
610 int offset = n * 12;
611
612 s->filter[n][0] = buf[offset];
613 s->filter[n][1] = buf[offset + 1];
614
615 s->filter[n][2] = buf[offset + 4];
616 s->filter[n][3] = buf[offset + 5];
617
618 s->filter[n][4] = buf[offset + 8];
619 s->filter[n][5] = buf[offset + 9];
620
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]);
623 }
624
625 static void tulip_setup_frame(TULIPState *s,
626 struct tulip_descriptor *desc)
627 {
628 uint8_t buf[4096];
629 int len = (desc->control >> TDES1_BUF1_SIZE_SHIFT) & TDES1_BUF1_SIZE_MASK;
630 int i;
631
632 trace_tulip_setup_frame();
633
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);
638 }
639 }
640
641 desc->status = 0x7fffffff;
642
643 if (desc->control & TDES1_IC) {
644 s->csr[5] |= CSR5_TI;
645 tulip_update_int(s);
646 }
647 }
648
649 static void tulip_next_tx_descriptor(TULIPState *s,
650 struct tulip_descriptor *desc)
651 {
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);
659 }
660 s->current_tx_desc &= ~3ULL;
661 }
662
663 static uint32_t tulip_ts(TULIPState *s)
664 {
665 return (s->csr[5] >> CSR5_TS_SHIFT) & CSR5_TS_MASK;
666 }
667
668 static void tulip_xmit_list_update(TULIPState *s)
669 {
670 #define TULIP_DESC_MAX 128
671 uint8_t i = 0;
672 struct tulip_descriptor desc;
673
674 if (tulip_ts(s) != CSR5_TS_SUSPENDED) {
675 return;
676 }
677
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);
681
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;
687 }
688
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;
694 }
695
696 if (!tulip_copy_tx_buffers(s, &desc)) {
697 if (desc.control & TDES1_LS) {
698 tulip_tx(s, &desc);
699 }
700 }
701 }
702 tulip_desc_write(s, s->current_tx_desc, &desc);
703 tulip_next_tx_descriptor(s, &desc);
704 }
705 }
706
707 static void tulip_csr9_write(TULIPState *s, uint32_t old_val,
708 uint32_t new_val)
709 {
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));
715 }
716 }
717
718 static void tulip_reset(TULIPState *s)
719 {
720 trace_tulip_reset();
721
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;
735 }
736
737 static void tulip_qdev_reset(DeviceState *dev)
738 {
739 PCIDevice *d = PCI_DEVICE(dev);
740 TULIPState *s = TULIP(d);
741
742 tulip_reset(s);
743 }
744
745 static void tulip_write(void *opaque, hwaddr addr,
746 uint64_t data, unsigned size)
747 {
748 TULIPState *s = opaque;
749 trace_tulip_reg_write(addr, tulip_reg_name(addr), size, data);
750
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);
757 }
758 break;
759
760 case CSR(1):
761 tulip_xmit_list_update(s);
762 break;
763
764 case CSR(2):
765 qemu_flush_queued_packets(qemu_get_queue(s->nic));
766 break;
767
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;
773
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;
779
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;
789
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);
797 }
798
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);
804 }
805 break;
806
807 case CSR(7):
808 s->csr[7] = data;
809 tulip_update_int(s);
810 break;
811
812 case CSR(8):
813 s->csr[9] = data;
814 break;
815
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;
824
825 case CSR(10):
826 s->csr[10] = data;
827 break;
828
829 case CSR(11):
830 s->csr[11] = data;
831 break;
832
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;
837
838 case CSR(13):
839 s->csr[13] = data;
840 break;
841
842 case CSR(14):
843 s->csr[14] = data;
844 break;
845
846 case CSR(15):
847 s->csr[15] = data;
848 break;
849
850 default:
851 qemu_log_mask(LOG_GUEST_ERROR, "%s: write to CSR at unknown address "
852 "0x%"PRIx64"\n", __func__, addr);
853 break;
854 }
855 }
856
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,
864 },
865 };
866
867 static void tulip_idblock_crc(TULIPState *s, uint16_t *srom)
868 {
869 int word, n;
870 int bit;
871 unsigned char bitval, crc;
872 const int len = 9;
873 n = 0;
874 crc = -1;
875
876 for (word = 0; word < len; word++) {
877 for (bit = 15; bit >= 0; bit--) {
878 if ((word == (len - 1)) && (bit == 7)) {
879 /*
880 * Insert the correct CRC result into input data stream
881 * in place.
882 */
883 srom[len - 1] = (srom[len - 1] & 0xff00) | (unsigned short)crc;
884 break;
885 }
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;
892 }
893 }
894 }
895 }
896
897 static uint16_t tulip_srom_crc(TULIPState *s, uint8_t *eeprom, size_t len)
898 {
899 unsigned long crc = 0xffffffff;
900 unsigned long flippedcrc = 0;
901 unsigned char currentbyte;
902 unsigned int msb, bit, i;
903
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;
912 }
913 currentbyte >>= 1;
914 }
915 }
916
917 for (i = 0; i < 32; i++) {
918 flippedcrc <<= 1;
919 bit = crc & 1;
920 crc >>= 1;
921 flippedcrc += bit;
922 }
923 return (flippedcrc ^ 0xffffffff) & 0xffff;
924 }
925
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,
943 };
944
945 static void tulip_fill_eeprom(TULIPState *s)
946 {
947 uint16_t *eeprom = eeprom93xx_data(s->eeprom);
948 memcpy(eeprom, eeprom_default, 128);
949
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));
956 }
957
958 static void pci_tulip_realize(PCIDevice *pci_dev, Error **errp)
959 {
960 TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
961 uint8_t *pci_conf;
962
963 pci_conf = s->dev.config;
964 pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
965
966 s->eeprom = eeprom93xx_new(&pci_dev->qdev, 64);
967 tulip_fill_eeprom(s);
968
969 memory_region_init_io(&s->io, OBJECT(&s->dev), &tulip_ops, s,
970 "tulip-io", 128);
971
972 memory_region_init_io(&s->memory, OBJECT(&s->dev), &tulip_ops, s,
973 "tulip-mem", 128);
974
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);
977
978 s->irq = pci_allocate_irq(&s->dev);
979
980 qemu_macaddr_default_if_unset(&s->c.macaddr);
981
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);
986 }
987
988 static void pci_tulip_exit(PCIDevice *pci_dev)
989 {
990 TULIPState *s = DO_UPCAST(TULIPState, dev, pci_dev);
991
992 qemu_del_nic(s->nic);
993 qemu_free_irq(s->irq);
994 eeprom93xx_free(&pci_dev->qdev, s->eeprom);
995 }
996
997 static void tulip_instance_init(Object *obj)
998 {
999 PCIDevice *pci_dev = PCI_DEVICE(obj);
1000 TULIPState *d = DO_UPCAST(TULIPState, dev, pci_dev);
1001
1002 device_add_bootindex_property(obj, &d->c.bootindex,
1003 "bootindex", "/ethernet-phy@0",
1004 &pci_dev->qdev);
1005 }
1006
1007 static Property tulip_properties[] = {
1008 DEFINE_NIC_PROPERTIES(TULIPState, c),
1009 DEFINE_PROP_END_OF_LIST(),
1010 };
1011
1012 static void tulip_class_init(ObjectClass *klass, void *data)
1013 {
1014 DeviceClass *dc = DEVICE_CLASS(klass);
1015 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1016
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);
1028 }
1029
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 { },
1039 },
1040 };
1041
1042 static void tulip_register_types(void)
1043 {
1044 type_register_static(&tulip_info);
1045 }
1046
1047 type_init(tulip_register_types)