4 * Copyright (c) 2019 Sven Schnelle <svens@stackframe.org>
6 * This work is licensed under the GNU GPL license version 2 or later.
9 #include "qemu/osdep.h"
12 #include "hw/pci/pci_device.h"
13 #include "hw/qdev-properties.h"
14 #include "hw/nvram/eeprom93xx.h"
15 #include "migration/vmstate.h"
16 #include "sysemu/sysemu.h"
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
;
46 uint8_t filter
[16][6];
49 static const VMStateDescription vmstate_pci_tulip
= {
51 .fields
= (const 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),
70 static void tulip_desc_read(TULIPState
*s
, hwaddr p
,
71 struct tulip_descriptor
*desc
)
73 const MemTxAttrs attrs
= { .memory
= true };
75 if (s
->csr
[0] & CSR0_DBO
) {
76 ldl_be_pci_dma(&s
->dev
, p
, &desc
->status
, attrs
);
77 ldl_be_pci_dma(&s
->dev
, p
+ 4, &desc
->control
, attrs
);
78 ldl_be_pci_dma(&s
->dev
, p
+ 8, &desc
->buf_addr1
, attrs
);
79 ldl_be_pci_dma(&s
->dev
, p
+ 12, &desc
->buf_addr2
, attrs
);
81 ldl_le_pci_dma(&s
->dev
, p
, &desc
->status
, attrs
);
82 ldl_le_pci_dma(&s
->dev
, p
+ 4, &desc
->control
, attrs
);
83 ldl_le_pci_dma(&s
->dev
, p
+ 8, &desc
->buf_addr1
, attrs
);
84 ldl_le_pci_dma(&s
->dev
, p
+ 12, &desc
->buf_addr2
, attrs
);
88 static void tulip_desc_write(TULIPState
*s
, hwaddr p
,
89 struct tulip_descriptor
*desc
)
91 const MemTxAttrs attrs
= { .memory
= true };
93 if (s
->csr
[0] & CSR0_DBO
) {
94 stl_be_pci_dma(&s
->dev
, p
, desc
->status
, attrs
);
95 stl_be_pci_dma(&s
->dev
, p
+ 4, desc
->control
, attrs
);
96 stl_be_pci_dma(&s
->dev
, p
+ 8, desc
->buf_addr1
, attrs
);
97 stl_be_pci_dma(&s
->dev
, p
+ 12, desc
->buf_addr2
, attrs
);
99 stl_le_pci_dma(&s
->dev
, p
, desc
->status
, attrs
);
100 stl_le_pci_dma(&s
->dev
, p
+ 4, desc
->control
, attrs
);
101 stl_le_pci_dma(&s
->dev
, p
+ 8, desc
->buf_addr1
, attrs
);
102 stl_le_pci_dma(&s
->dev
, p
+ 12, desc
->buf_addr2
, attrs
);
106 static void tulip_update_int(TULIPState
*s
)
108 uint32_t ie
= s
->csr
[5] & s
->csr
[7];
111 s
->csr
[5] &= ~(CSR5_AIS
| CSR5_NIS
);
113 if (ie
& (CSR5_TI
| CSR5_TU
| CSR5_RI
| CSR5_GTE
| CSR5_ERI
)) {
114 s
->csr
[5] |= CSR5_NIS
;
117 if (ie
& (CSR5_LC
| CSR5_GPI
| CSR5_FBE
| CSR5_LNF
| CSR5_ETI
| CSR5_RWT
|
118 CSR5_RPS
| CSR5_RU
| CSR5_UNF
| CSR5_LNP_ANC
| CSR5_TJT
|
120 s
->csr
[5] |= CSR5_AIS
;
123 assert = s
->csr
[5] & s
->csr
[7] & (CSR5_AIS
| CSR5_NIS
);
124 trace_tulip_irq(s
->csr
[5], s
->csr
[7], assert ? "assert" : "deassert");
125 qemu_set_irq(s
->irq
, assert);
128 static bool tulip_rx_stopped(TULIPState
*s
)
130 return ((s
->csr
[5] >> CSR5_RS_SHIFT
) & CSR5_RS_MASK
) == CSR5_RS_STOPPED
;
133 static void tulip_dump_tx_descriptor(TULIPState
*s
,
134 struct tulip_descriptor
*desc
)
136 trace_tulip_descriptor("TX ", s
->current_tx_desc
,
137 desc
->status
, desc
->control
>> 22,
138 desc
->control
& 0x7ff, (desc
->control
>> 11) & 0x7ff,
139 desc
->buf_addr1
, desc
->buf_addr2
);
142 static void tulip_dump_rx_descriptor(TULIPState
*s
,
143 struct tulip_descriptor
*desc
)
145 trace_tulip_descriptor("RX ", s
->current_rx_desc
,
146 desc
->status
, desc
->control
>> 22,
147 desc
->control
& 0x7ff, (desc
->control
>> 11) & 0x7ff,
148 desc
->buf_addr1
, desc
->buf_addr2
);
151 static void tulip_next_rx_descriptor(TULIPState
*s
,
152 struct tulip_descriptor
*desc
)
154 if (desc
->control
& RDES1_RER
) {
155 s
->current_rx_desc
= s
->csr
[3];
156 } else if (desc
->control
& RDES1_RCH
) {
157 s
->current_rx_desc
= desc
->buf_addr2
;
159 s
->current_rx_desc
+= sizeof(struct tulip_descriptor
) +
160 (((s
->csr
[0] >> CSR0_DSL_SHIFT
) & CSR0_DSL_MASK
) << 2);
162 s
->current_rx_desc
&= ~3ULL;
165 static void tulip_copy_rx_bytes(TULIPState
*s
, struct tulip_descriptor
*desc
)
167 int len1
= (desc
->control
>> RDES1_BUF1_SIZE_SHIFT
) & RDES1_BUF1_SIZE_MASK
;
168 int len2
= (desc
->control
>> RDES1_BUF2_SIZE_SHIFT
) & RDES1_BUF2_SIZE_MASK
;
171 if (s
->rx_frame_len
&& len1
) {
172 if (s
->rx_frame_len
> len1
) {
175 len
= s
->rx_frame_len
;
178 pci_dma_write(&s
->dev
, desc
->buf_addr1
, s
->rx_frame
+
179 (s
->rx_frame_size
- s
->rx_frame_len
), len
);
180 s
->rx_frame_len
-= len
;
183 if (s
->rx_frame_len
&& len2
) {
184 if (s
->rx_frame_len
> len2
) {
187 len
= s
->rx_frame_len
;
190 pci_dma_write(&s
->dev
, desc
->buf_addr2
, s
->rx_frame
+
191 (s
->rx_frame_size
- s
->rx_frame_len
), len
);
192 s
->rx_frame_len
-= len
;
196 static bool tulip_filter_address(TULIPState
*s
, const uint8_t *addr
)
198 static const char broadcast
[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
202 for (i
= 0; i
< 16 && ret
== false; i
++) {
203 if (!memcmp(&s
->filter
[i
], addr
, ETH_ALEN
)) {
208 if (!memcmp(addr
, broadcast
, ETH_ALEN
)) {
212 if (s
->csr
[6] & (CSR6_PR
| CSR6_RA
)) {
213 /* Promiscuous mode enabled */
214 s
->rx_status
|= RDES0_FF
;
218 if ((s
->csr
[6] & CSR6_PM
) && (addr
[0] & 1)) {
219 /* Pass all Multicast enabled */
220 s
->rx_status
|= RDES0_MF
;
224 if (s
->csr
[6] & CSR6_IF
) {
230 static ssize_t
tulip_receive(TULIPState
*s
, const uint8_t *buf
, size_t size
)
232 struct tulip_descriptor desc
;
234 trace_tulip_receive(buf
, size
);
236 if (size
< 14 || size
> sizeof(s
->rx_frame
) - 4
237 || s
->rx_frame_len
|| tulip_rx_stopped(s
)) {
241 if (!tulip_filter_address(s
, buf
)) {
246 tulip_desc_read(s
, s
->current_rx_desc
, &desc
);
247 tulip_dump_rx_descriptor(s
, &desc
);
249 if (!(desc
.status
& RDES0_OWN
)) {
250 s
->csr
[5] |= CSR5_RU
;
252 return s
->rx_frame_size
- s
->rx_frame_len
;
256 if (!s
->rx_frame_len
) {
257 s
->rx_frame_size
= size
+ 4;
258 s
->rx_status
= RDES0_LS
|
259 ((s
->rx_frame_size
& RDES0_FL_MASK
) << RDES0_FL_SHIFT
);
260 desc
.status
|= RDES0_FS
;
261 memcpy(s
->rx_frame
, buf
, size
);
262 s
->rx_frame_len
= s
->rx_frame_size
;
265 tulip_copy_rx_bytes(s
, &desc
);
267 if (!s
->rx_frame_len
) {
268 desc
.status
|= s
->rx_status
;
269 s
->csr
[5] |= CSR5_RI
;
272 tulip_dump_rx_descriptor(s
, &desc
);
273 tulip_desc_write(s
, s
->current_rx_desc
, &desc
);
274 tulip_next_rx_descriptor(s
, &desc
);
275 } while (s
->rx_frame_len
);
279 static ssize_t
tulip_receive_nc(NetClientState
*nc
,
280 const uint8_t *buf
, size_t size
)
282 return tulip_receive(qemu_get_nic_opaque(nc
), buf
, size
);
285 static NetClientInfo net_tulip_info
= {
286 .type
= NET_CLIENT_DRIVER_NIC
,
287 .size
= sizeof(NICState
),
288 .receive
= tulip_receive_nc
,
291 static const char *tulip_reg_name(const hwaddr addr
)
348 static const char *tulip_rx_state_name(int state
)
351 case CSR5_RS_STOPPED
:
354 case CSR5_RS_RUNNING_FETCH
:
355 return "RUNNING/FETCH";
357 case CSR5_RS_RUNNING_CHECK_EOR
:
358 return "RUNNING/CHECK EOR";
360 case CSR5_RS_RUNNING_WAIT_RECEIVE
:
361 return "WAIT RECEIVE";
363 case CSR5_RS_SUSPENDED
:
366 case CSR5_RS_RUNNING_CLOSE
:
367 return "RUNNING/CLOSE";
369 case CSR5_RS_RUNNING_FLUSH
:
370 return "RUNNING/FLUSH";
372 case CSR5_RS_RUNNING_QUEUE
:
373 return "RUNNING/QUEUE";
381 static const char *tulip_tx_state_name(int state
)
384 case CSR5_TS_STOPPED
:
387 case CSR5_TS_RUNNING_FETCH
:
388 return "RUNNING/FETCH";
390 case CSR5_TS_RUNNING_WAIT_EOT
:
391 return "RUNNING/WAIT EOT";
393 case CSR5_TS_RUNNING_READ_BUF
:
394 return "RUNNING/READ BUF";
396 case CSR5_TS_RUNNING_SETUP
:
397 return "RUNNING/SETUP";
399 case CSR5_TS_SUSPENDED
:
402 case CSR5_TS_RUNNING_CLOSE
:
403 return "RUNNING/CLOSE";
411 static void tulip_update_rs(TULIPState
*s
, int state
)
413 s
->csr
[5] &= ~(CSR5_RS_MASK
<< CSR5_RS_SHIFT
);
414 s
->csr
[5] |= (state
& CSR5_RS_MASK
) << CSR5_RS_SHIFT
;
415 trace_tulip_rx_state(tulip_rx_state_name(state
));
418 static uint16_t tulip_mdi_default
[] = {
419 /* MDI Registers 0 - 6, 7 */
420 0x3100, 0xf02c, 0x7810, 0x0000, 0x0501, 0x4181, 0x0000, 0x0000,
421 /* MDI Registers 8 - 15 */
422 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
423 /* MDI Registers 16 - 31 */
424 0x0003, 0x0000, 0x0001, 0x0000, 0x3b40, 0x0000, 0x0000, 0x0000,
425 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
428 /* Readonly mask for MDI (PHY) registers */
429 static const uint16_t tulip_mdi_mask
[] = {
430 0x0000, 0xffff, 0xffff, 0xffff, 0xc01f, 0xffff, 0xffff, 0x0000,
431 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
432 0x0fff, 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff,
433 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
436 static uint16_t tulip_mii_read(TULIPState
*s
, int phy
, int reg
)
440 ret
= tulip_mdi_default
[reg
];
442 trace_tulip_mii_read(phy
, reg
, ret
);
446 static void tulip_mii_write(TULIPState
*s
, int phy
, int reg
, uint16_t data
)
448 trace_tulip_mii_write(phy
, reg
, data
);
454 tulip_mdi_default
[reg
] &= ~tulip_mdi_mask
[reg
];
455 tulip_mdi_default
[reg
] |= (data
& tulip_mdi_mask
[reg
]);
458 static void tulip_mii(TULIPState
*s
)
460 uint32_t changed
= s
->old_csr9
^ s
->csr
[9];
464 if (!(changed
& CSR9_MDC
)) {
468 if (!(s
->csr
[9] & CSR9_MDC
)) {
475 if (s
->csr
[9] & CSR9_MDO
&& (s
->mii_bitcnt
< 16 ||
476 !(s
->csr
[9] & CSR9_MII
))) {
477 /* write op or address bits */
481 if (s
->mii_bitcnt
>= 16 && (s
->csr
[9] & CSR9_MII
)) {
482 if (s
->mii_word
& 0x8000) {
483 s
->csr
[9] |= CSR9_MDI
;
485 s
->csr
[9] &= ~CSR9_MDI
;
489 if (s
->mii_word
== 0xffffffff) {
491 } else if (s
->mii_bitcnt
== 16) {
492 op
= (s
->mii_word
>> 12) & 0x0f;
493 phy
= (s
->mii_word
>> 7) & 0x1f;
494 reg
= (s
->mii_word
>> 2) & 0x1f;
497 s
->mii_word
= tulip_mii_read(s
, phy
, reg
);
499 } else if (s
->mii_bitcnt
== 32) {
500 op
= (s
->mii_word
>> 28) & 0x0f;
501 phy
= (s
->mii_word
>> 23) & 0x1f;
502 reg
= (s
->mii_word
>> 18) & 0x1f;
503 data
= s
->mii_word
& 0xffff;
506 tulip_mii_write(s
, phy
, reg
, data
);
511 static uint32_t tulip_csr9_read(TULIPState
*s
)
513 if (s
->csr
[9] & CSR9_SR
) {
514 if (eeprom93xx_read(s
->eeprom
)) {
515 s
->csr
[9] |= CSR9_SR_DO
;
517 s
->csr
[9] &= ~CSR9_SR_DO
;
525 static void tulip_update_ts(TULIPState
*s
, int state
)
527 s
->csr
[5] &= ~(CSR5_TS_MASK
<< CSR5_TS_SHIFT
);
528 s
->csr
[5] |= (state
& CSR5_TS_MASK
) << CSR5_TS_SHIFT
;
529 trace_tulip_tx_state(tulip_tx_state_name(state
));
532 static uint64_t tulip_read(void *opaque
, hwaddr addr
,
535 TULIPState
*s
= opaque
;
540 data
= tulip_csr9_read(s
);
544 /* Fake autocompletion complete until we have PHY emulation */
545 data
= 5 << CSR12_ANS_SHIFT
;
550 qemu_log_mask(LOG_GUEST_ERROR
, "%s: read access at unknown address"
551 " 0x%"PRIx64
"\n", __func__
, addr
);
553 data
= s
->csr
[addr
>> 3];
557 trace_tulip_reg_read(addr
, tulip_reg_name(addr
), size
, data
);
561 static void tulip_tx(TULIPState
*s
, struct tulip_descriptor
*desc
)
563 if (s
->tx_frame_len
) {
564 if ((s
->csr
[6] >> CSR6_OM_SHIFT
) & CSR6_OM_MASK
) {
565 /* Internal or external Loopback */
566 tulip_receive(s
, s
->tx_frame
, s
->tx_frame_len
);
567 } else if (s
->tx_frame_len
<= sizeof(s
->tx_frame
)) {
568 qemu_send_packet(qemu_get_queue(s
->nic
),
569 s
->tx_frame
, s
->tx_frame_len
);
573 if (desc
->control
& TDES1_IC
) {
574 s
->csr
[5] |= CSR5_TI
;
579 static int tulip_copy_tx_buffers(TULIPState
*s
, struct tulip_descriptor
*desc
)
581 int len1
= (desc
->control
>> TDES1_BUF1_SIZE_SHIFT
) & TDES1_BUF1_SIZE_MASK
;
582 int len2
= (desc
->control
>> TDES1_BUF2_SIZE_SHIFT
) & TDES1_BUF2_SIZE_MASK
;
584 if (s
->tx_frame_len
+ len1
> sizeof(s
->tx_frame
)) {
585 qemu_log_mask(LOG_GUEST_ERROR
,
586 "%s: descriptor overflow (ofs: %u, len:%d, size:%zu)\n",
587 __func__
, s
->tx_frame_len
, len1
, sizeof(s
->tx_frame
));
591 pci_dma_read(&s
->dev
, desc
->buf_addr1
,
592 s
->tx_frame
+ s
->tx_frame_len
, len1
);
593 s
->tx_frame_len
+= len1
;
596 if (s
->tx_frame_len
+ len2
> sizeof(s
->tx_frame
)) {
597 qemu_log_mask(LOG_GUEST_ERROR
,
598 "%s: descriptor overflow (ofs: %u, len:%d, size:%zu)\n",
599 __func__
, s
->tx_frame_len
, len2
, sizeof(s
->tx_frame
));
603 pci_dma_read(&s
->dev
, desc
->buf_addr2
,
604 s
->tx_frame
+ s
->tx_frame_len
, len2
);
605 s
->tx_frame_len
+= len2
;
607 desc
->status
= (len1
+ len2
) ? 0 : 0x7fffffff;
612 static void tulip_setup_filter_addr(TULIPState
*s
, uint8_t *buf
, int n
)
616 s
->filter
[n
][0] = buf
[offset
];
617 s
->filter
[n
][1] = buf
[offset
+ 1];
619 s
->filter
[n
][2] = buf
[offset
+ 4];
620 s
->filter
[n
][3] = buf
[offset
+ 5];
622 s
->filter
[n
][4] = buf
[offset
+ 8];
623 s
->filter
[n
][5] = buf
[offset
+ 9];
625 trace_tulip_setup_filter(n
, s
->filter
[n
][5], s
->filter
[n
][4],
626 s
->filter
[n
][3], s
->filter
[n
][2], s
->filter
[n
][1], s
->filter
[n
][0]);
629 static void tulip_setup_frame(TULIPState
*s
,
630 struct tulip_descriptor
*desc
)
633 int len
= (desc
->control
>> TDES1_BUF1_SIZE_SHIFT
) & TDES1_BUF1_SIZE_MASK
;
636 trace_tulip_setup_frame();
639 pci_dma_read(&s
->dev
, desc
->buf_addr1
, buf
, len
);
640 for (i
= 0; i
< 16; i
++) {
641 tulip_setup_filter_addr(s
, buf
, i
);
645 desc
->status
= 0x7fffffff;
647 if (desc
->control
& TDES1_IC
) {
648 s
->csr
[5] |= CSR5_TI
;
653 static void tulip_next_tx_descriptor(TULIPState
*s
,
654 struct tulip_descriptor
*desc
)
656 if (desc
->control
& TDES1_TER
) {
657 s
->current_tx_desc
= s
->csr
[4];
658 } else if (desc
->control
& TDES1_TCH
) {
659 s
->current_tx_desc
= desc
->buf_addr2
;
661 s
->current_tx_desc
+= sizeof(struct tulip_descriptor
) +
662 (((s
->csr
[0] >> CSR0_DSL_SHIFT
) & CSR0_DSL_MASK
) << 2);
664 s
->current_tx_desc
&= ~3ULL;
667 static uint32_t tulip_ts(TULIPState
*s
)
669 return (s
->csr
[5] >> CSR5_TS_SHIFT
) & CSR5_TS_MASK
;
672 static void tulip_xmit_list_update(TULIPState
*s
)
674 #define TULIP_DESC_MAX 128
676 struct tulip_descriptor desc
;
678 if (tulip_ts(s
) != CSR5_TS_SUSPENDED
) {
682 for (i
= 0; i
< TULIP_DESC_MAX
; i
++) {
683 tulip_desc_read(s
, s
->current_tx_desc
, &desc
);
684 tulip_dump_tx_descriptor(s
, &desc
);
686 if (!(desc
.status
& TDES0_OWN
)) {
687 tulip_update_ts(s
, CSR5_TS_SUSPENDED
);
688 s
->csr
[5] |= CSR5_TU
;
693 if (desc
.control
& TDES1_SET
) {
694 tulip_setup_frame(s
, &desc
);
696 if (desc
.control
& TDES1_FS
) {
700 if (!tulip_copy_tx_buffers(s
, &desc
)) {
701 if (desc
.control
& TDES1_LS
) {
706 tulip_desc_write(s
, s
->current_tx_desc
, &desc
);
707 tulip_next_tx_descriptor(s
, &desc
);
711 static void tulip_csr9_write(TULIPState
*s
, uint32_t old_val
,
714 if (new_val
& CSR9_SR
) {
715 eeprom93xx_write(s
->eeprom
,
716 !!(new_val
& CSR9_SR_CS
),
717 !!(new_val
& CSR9_SR_SK
),
718 !!(new_val
& CSR9_SR_DI
));
722 static void tulip_reset(TULIPState
*s
)
726 s
->csr
[0] = 0xfe000000;
727 s
->csr
[1] = 0xffffffff;
728 s
->csr
[2] = 0xffffffff;
729 s
->csr
[5] = 0xf0000000;
730 s
->csr
[6] = 0x32000040;
731 s
->csr
[7] = 0xf3fe0000;
732 s
->csr
[8] = 0xe0000000;
733 s
->csr
[9] = 0xfff483ff;
734 s
->csr
[11] = 0xfffe0000;
735 s
->csr
[12] = 0x000000c6;
736 s
->csr
[13] = 0xffff0000;
737 s
->csr
[14] = 0xffffffff;
738 s
->csr
[15] = 0x8ff00000;
741 static void tulip_qdev_reset(DeviceState
*dev
)
743 PCIDevice
*d
= PCI_DEVICE(dev
);
744 TULIPState
*s
= TULIP(d
);
749 static void tulip_write(void *opaque
, hwaddr addr
,
750 uint64_t data
, unsigned size
)
752 TULIPState
*s
= opaque
;
753 trace_tulip_reg_write(addr
, tulip_reg_name(addr
), size
, data
);
758 if (data
& CSR0_SWR
) {
765 tulip_xmit_list_update(s
);
769 qemu_flush_queued_packets(qemu_get_queue(s
->nic
));
773 s
->csr
[3] = data
& ~3ULL;
774 s
->current_rx_desc
= s
->csr
[3];
775 qemu_flush_queued_packets(qemu_get_queue(s
->nic
));
779 s
->csr
[4] = data
& ~3ULL;
780 s
->current_tx_desc
= s
->csr
[4];
781 tulip_xmit_list_update(s
);
785 /* Status register, write clears bit */
786 s
->csr
[5] &= ~(data
& (CSR5_TI
| CSR5_TPS
| CSR5_TU
| CSR5_TJT
|
787 CSR5_LNP_ANC
| CSR5_UNF
| CSR5_RI
| CSR5_RU
|
788 CSR5_RPS
| CSR5_RWT
| CSR5_ETI
| CSR5_GTE
|
789 CSR5_LNF
| CSR5_FBE
| CSR5_ERI
| CSR5_AIS
|
790 CSR5_NIS
| CSR5_GPI
| CSR5_LC
));
796 if (s
->csr
[6] & CSR6_SR
) {
797 tulip_update_rs(s
, CSR5_RS_RUNNING_WAIT_RECEIVE
);
798 qemu_flush_queued_packets(qemu_get_queue(s
->nic
));
800 tulip_update_rs(s
, CSR5_RS_STOPPED
);
803 if (s
->csr
[6] & CSR6_ST
) {
804 tulip_update_ts(s
, CSR5_TS_SUSPENDED
);
805 tulip_xmit_list_update(s
);
807 tulip_update_ts(s
, CSR5_TS_STOPPED
);
821 tulip_csr9_write(s
, s
->csr
[9], data
);
822 /* don't clear MII read data */
823 s
->csr
[9] &= CSR9_MDI
;
824 s
->csr
[9] |= (data
& ~CSR9_MDI
);
826 s
->old_csr9
= s
->csr
[9];
838 /* SIA Status register, some bits are cleared by writing 1 */
839 s
->csr
[12] &= ~(data
& (CSR12_MRA
| CSR12_TRA
| CSR12_ARA
));
855 qemu_log_mask(LOG_GUEST_ERROR
, "%s: write to CSR at unknown address "
856 "0x%"PRIx64
"\n", __func__
, addr
);
861 static const MemoryRegionOps tulip_ops
= {
863 .write
= tulip_write
,
864 .endianness
= DEVICE_LITTLE_ENDIAN
,
866 .min_access_size
= 4,
867 .max_access_size
= 4,
871 static void tulip_idblock_crc(TULIPState
*s
, uint16_t *srom
)
875 unsigned char bitval
, crc
;
879 for (word
= 0; word
< len
; word
++) {
880 for (bit
= 15; bit
>= 0; bit
--) {
881 if ((word
== (len
- 1)) && (bit
== 7)) {
883 * Insert the correct CRC result into input data stream
886 srom
[len
- 1] = (srom
[len
- 1] & 0xff00) | (unsigned short)crc
;
889 bitval
= ((srom
[word
] >> bit
) & 1) ^ ((crc
>> 7) & 1);
899 static uint16_t tulip_srom_crc(TULIPState
*s
, uint8_t *eeprom
, size_t len
)
901 unsigned long crc
= 0xffffffff;
902 unsigned long flippedcrc
= 0;
903 unsigned char currentbyte
;
904 unsigned int msb
, bit
, i
;
906 for (i
= 0; i
< len
; i
++) {
907 currentbyte
= eeprom
[i
];
908 for (bit
= 0; bit
< 8; bit
++) {
909 msb
= (crc
>> 31) & 1;
911 if (msb
^ (currentbyte
& 1)) {
919 for (i
= 0; i
< 32; i
++) {
925 return (flippedcrc
^ 0xffffffff) & 0xffff;
928 static const uint8_t eeprom_default
[128] = {
929 0x3c, 0x10, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
931 0x56, 0x08, 0x04, 0x01, 0x00, 0x80, 0x48, 0xb3,
932 0x0e, 0xa7, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x08,
933 0x01, 0x8d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x78,
934 0xe0, 0x01, 0x00, 0x50, 0x00, 0x18, 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, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6b,
941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
942 0x48, 0xb3, 0x0e, 0xa7, 0x40, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
947 static void tulip_fill_eeprom(TULIPState
*s
)
949 uint16_t *eeprom
= eeprom93xx_data(s
->eeprom
);
950 memcpy(eeprom
, eeprom_default
, 128);
952 /* patch in our mac address */
953 eeprom
[10] = cpu_to_le16(s
->c
.macaddr
.a
[0] | (s
->c
.macaddr
.a
[1] << 8));
954 eeprom
[11] = cpu_to_le16(s
->c
.macaddr
.a
[2] | (s
->c
.macaddr
.a
[3] << 8));
955 eeprom
[12] = cpu_to_le16(s
->c
.macaddr
.a
[4] | (s
->c
.macaddr
.a
[5] << 8));
956 tulip_idblock_crc(s
, eeprom
);
957 eeprom
[63] = cpu_to_le16(tulip_srom_crc(s
, (uint8_t *)eeprom
, 126));
960 static void pci_tulip_realize(PCIDevice
*pci_dev
, Error
**errp
)
962 TULIPState
*s
= DO_UPCAST(TULIPState
, dev
, pci_dev
);
965 pci_conf
= s
->dev
.config
;
966 pci_conf
[PCI_INTERRUPT_PIN
] = 1; /* interrupt pin A */
968 qemu_macaddr_default_if_unset(&s
->c
.macaddr
);
970 s
->eeprom
= eeprom93xx_new(&pci_dev
->qdev
, 64);
971 tulip_fill_eeprom(s
);
973 memory_region_init_io(&s
->io
, OBJECT(&s
->dev
), &tulip_ops
, s
,
976 memory_region_init_io(&s
->memory
, OBJECT(&s
->dev
), &tulip_ops
, s
,
979 pci_register_bar(&s
->dev
, 0, PCI_BASE_ADDRESS_SPACE_IO
, &s
->io
);
980 pci_register_bar(&s
->dev
, 1, PCI_BASE_ADDRESS_SPACE_MEMORY
, &s
->memory
);
982 s
->irq
= pci_allocate_irq(&s
->dev
);
984 s
->nic
= qemu_new_nic(&net_tulip_info
, &s
->c
,
985 object_get_typename(OBJECT(pci_dev
)),
987 &pci_dev
->qdev
.mem_reentrancy_guard
, s
);
988 qemu_format_nic_info_str(qemu_get_queue(s
->nic
), s
->c
.macaddr
.a
);
991 static void pci_tulip_exit(PCIDevice
*pci_dev
)
993 TULIPState
*s
= DO_UPCAST(TULIPState
, dev
, pci_dev
);
995 qemu_del_nic(s
->nic
);
996 qemu_free_irq(s
->irq
);
997 eeprom93xx_free(&pci_dev
->qdev
, s
->eeprom
);
1000 static void tulip_instance_init(Object
*obj
)
1002 PCIDevice
*pci_dev
= PCI_DEVICE(obj
);
1003 TULIPState
*d
= DO_UPCAST(TULIPState
, dev
, pci_dev
);
1005 device_add_bootindex_property(obj
, &d
->c
.bootindex
,
1006 "bootindex", "/ethernet-phy@0",
1010 static Property tulip_properties
[] = {
1011 DEFINE_NIC_PROPERTIES(TULIPState
, c
),
1012 DEFINE_PROP_END_OF_LIST(),
1015 static void tulip_class_init(ObjectClass
*klass
, void *data
)
1017 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1018 PCIDeviceClass
*k
= PCI_DEVICE_CLASS(klass
);
1020 k
->realize
= pci_tulip_realize
;
1021 k
->exit
= pci_tulip_exit
;
1022 k
->vendor_id
= PCI_VENDOR_ID_DEC
;
1023 k
->device_id
= PCI_DEVICE_ID_DEC_21143
;
1024 k
->subsystem_vendor_id
= PCI_VENDOR_ID_HP
;
1025 k
->subsystem_id
= 0x104f;
1026 k
->class_id
= PCI_CLASS_NETWORK_ETHERNET
;
1027 dc
->vmsd
= &vmstate_pci_tulip
;
1028 device_class_set_props(dc
, tulip_properties
);
1029 device_class_set_legacy_reset(dc
, tulip_qdev_reset
);
1030 set_bit(DEVICE_CATEGORY_NETWORK
, dc
->categories
);
1033 static const TypeInfo tulip_info
= {
1035 .parent
= TYPE_PCI_DEVICE
,
1036 .instance_size
= sizeof(TULIPState
),
1037 .class_init
= tulip_class_init
,
1038 .instance_init
= tulip_instance_init
,
1039 .interfaces
= (InterfaceInfo
[]) {
1040 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
1045 static void tulip_register_types(void)
1047 type_register_static(&tulip_info
);
1050 type_init(tulip_register_types
)