Lines Matching +full:stop +full:- +full:ack
4 * Copyright (C) 2006-2011 Stefan Weil
9 * SPDX-License-Identifier: GPL-2.0-or-later
42 * * Wake-on-LAN is not implemented.
48 #include "hw/qdev-properties.h"
75 #define logout(fmt, ...) fprintf(stderr, "EE100\t%-24s" fmt, __func__, ## __VA_ARGS__)
115 #define BITS(n, m) (((0xffffffffU << (31 - n)) >> (31 - n + m)) << m)
249 uint8_t scb_stat; /* SCB stat/ack byte */
268 /* Statistical counters. Also used for wake-up packet (i82559). */
314 /* MDI Registers 0 - 6, 7 */
316 /* MDI Registers 8 - 15 */
318 /* MDI Registers 16 - 31 */
336 assert(!((uintptr_t)&s->mem[addr] & 1)); in e100_read_reg2()
337 return lduw_le_p(&s->mem[addr]); in e100_read_reg2()
343 assert(!((uintptr_t)&s->mem[addr] & 3)); in e100_read_reg4()
344 return ldl_le_p(&s->mem[addr]); in e100_read_reg4()
351 assert(!((uintptr_t)&s->mem[addr] & 1)); in e100_write_reg2()
352 stw_le_p(&s->mem[addr], val); in e100_write_reg2()
359 assert(!((uintptr_t)&s->mem[addr] & 3)); in e100_write_reg4()
360 stl_le_p(&s->mem[addr], val); in e100_write_reg4()
371 while (size-- > 0) { in nic_dump()
392 if (s->int_stat) { in disable_interrupt()
394 pci_irq_deassert(&s->dev); in disable_interrupt()
395 s->int_stat = 0; in disable_interrupt()
401 if (!s->int_stat) { in enable_interrupt()
403 pci_irq_assert(&s->dev); in enable_interrupt()
404 s->int_stat = 1; in enable_interrupt()
410 s->scb_stat &= ~s->mem[SCBAck]; in eepro100_acknowledge()
411 s->mem[SCBAck] = s->scb_stat; in eepro100_acknowledge()
412 if (s->scb_stat == 0) { in eepro100_acknowledge()
419 uint8_t mask = ~s->mem[SCBIntmask]; in eepro100_interrupt()
420 s->mem[SCBAck] |= status; in eepro100_interrupt()
421 status = s->scb_stat = s->mem[SCBAck]; in eepro100_interrupt()
424 status &= (~s->mem[SCBIntmask] | 0x0xf); in eepro100_interrupt()
429 } else if (s->int_stat) { in eepro100_interrupt()
482 uint32_t device = s->device; in e100_pci_reset()
483 uint8_t *pci_conf = s->dev.config; in e100_pci_reset()
501 s->stats_size = info->stats_size; in e100_pci_reset()
502 s->has_extended_tcb_support = info->has_extended_tcb_support; in e100_pci_reset()
524 s->configuration[6] |= BIT(4); in e100_pci_reset()
527 s->configuration[6] |= BIT(5); in e100_pci_reset()
529 if (s->stats_size == 80) { in e100_pci_reset()
531 if (s->configuration[6] & BIT(2)) { in e100_pci_reset()
533 assert(s->configuration[6] & BIT(5)); in e100_pci_reset()
535 if (s->configuration[6] & BIT(5)) { in e100_pci_reset()
537 s->stats_size = 64; in e100_pci_reset()
540 s->stats_size = 76; in e100_pci_reset()
544 if (s->configuration[6] & BIT(5)) { in e100_pci_reset()
546 s->stats_size = 64; in e100_pci_reset()
549 assert(s->stats_size > 0 && s->stats_size <= sizeof(s->statistics)); in e100_pci_reset()
551 if (info->power_management) { in e100_pci_reset()
554 int r = pci_pm_init(&s->dev, cfg_offset, errp); in e100_pci_reset()
588 uint16_t *eeprom_contents = eeprom93xx_data(s->eeprom); in nic_selective_reset()
590 eeprom93xx_reset(s->eeprom); in nic_selective_reset()
592 memcpy(eeprom_contents, s->conf.macaddr.a, 6); in nic_selective_reset()
594 if (s->device == i82557B || s->device == i82557C) in nic_selective_reset()
598 for (i = 0; i < EEPROM_SIZE - 1; i++) { in nic_selective_reset()
601 eeprom_contents[EEPROM_SIZE - 1] = 0xbaba - sum; in nic_selective_reset()
602 TRACE(EEPROM, logout("checksum=0x%04x\n", eeprom_contents[EEPROM_SIZE - 1])); in nic_selective_reset()
604 memset(s->mem, 0, sizeof(s->mem)); in nic_selective_reset()
607 assert(sizeof(s->mdimem) == sizeof(eepro100_mdi_default)); in nic_selective_reset()
608 memcpy(&s->mdimem[0], &eepro100_mdi_default[0], sizeof(s->mdimem)); in nic_selective_reset()
616 memset(&s->mult[0], 0, sizeof(s->mult)); in nic_reset()
683 return ((s->mem[SCBStatus] & BITS(7, 6)) >> 6); in get_cu_state()
688 s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(7, 6)) + (state << 6); in set_cu_state()
693 return ((s->mem[SCBStatus] & BITS(5, 2)) >> 2); in get_ru_state()
698 s->mem[SCBStatus] = (s->mem[SCBStatus] & ~BITS(5, 2)) + (state << 2); in set_ru_state()
710 pci_dma_write(&s->dev, s->statsaddr, &s->statistics, s->stats_size); in dump_statistics()
711 stl_le_pci_dma(&s->dev, s->statsaddr + 0, in dump_statistics()
712 s->statistics.tx_good_frames, attrs); in dump_statistics()
713 stl_le_pci_dma(&s->dev, s->statsaddr + 36, in dump_statistics()
714 s->statistics.rx_good_frames, attrs); in dump_statistics()
715 stl_le_pci_dma(&s->dev, s->statsaddr + 48, in dump_statistics()
716 s->statistics.rx_resource_errors, attrs); in dump_statistics()
717 stl_le_pci_dma(&s->dev, s->statsaddr + 60, in dump_statistics()
718 s->statistics.rx_short_frame_errors, attrs); in dump_statistics()
720 stw_le_pci_dma(&s->dev, s->statsaddr + 76, in dump_statistics()
721 s->statistics.xmt_tco_frames, attrs); in dump_statistics()
722 stw_le_pci_dma(&s->dev, s->statsaddr + 78, in dump_statistics()
723 s->statistics.rcv_tco_frames, attrs); in dump_statistics()
730 pci_dma_read(&s->dev, s->cb_address, &s->tx, sizeof(s->tx)); in read_cb()
731 s->tx.status = le16_to_cpu(s->tx.status); in read_cb()
732 s->tx.command = le16_to_cpu(s->tx.command); in read_cb()
733 s->tx.link = le32_to_cpu(s->tx.link); in read_cb()
734 s->tx.tbd_array_addr = le32_to_cpu(s->tx.tbd_array_addr); in read_cb()
735 s->tx.tcb_bytes = le16_to_cpu(s->tx.tcb_bytes); in read_cb()
741 uint32_t tbd_array = s->tx.tbd_array_addr; in tx_command()
742 uint16_t tcb_bytes = s->tx.tcb_bytes & 0x3fff; in tx_command()
746 uint32_t tbd_address = s->cb_address + 0x10; in tx_command()
749 tbd_array, tcb_bytes, s->tx.tbd_count)); in tx_command()
764 pci_dma_read(&s->dev, tbd_address, &buf[size], tcb_bytes); in tx_command()
776 if (s->has_extended_tcb_support && !(s->configuration[6] & BIT(4))) { in tx_command()
779 ldl_le_pci_dma(&s->dev, tbd_address, &tx_buffer_address, attrs); in tx_command()
780 lduw_le_pci_dma(&s->dev, tbd_address + 4, &tx_buffer_size, attrs); in tx_command()
781 lduw_le_pci_dma(&s->dev, tbd_address + 6, &tx_buffer_el, attrs); in tx_command()
786 tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size); in tx_command()
787 pci_dma_read(&s->dev, tx_buffer_address, in tx_command()
796 for (; tbd_count < s->tx.tbd_count; tbd_count++) { in tx_command()
797 ldl_le_pci_dma(&s->dev, tbd_address, &tx_buffer_address, attrs); in tx_command()
798 lduw_le_pci_dma(&s->dev, tbd_address + 4, &tx_buffer_size, attrs); in tx_command()
799 lduw_le_pci_dma(&s->dev, tbd_address + 6, &tx_buffer_el, attrs); in tx_command()
804 tx_buffer_size = MIN(tx_buffer_size, sizeof(buf) - size); in tx_command()
805 pci_dma_read(&s->dev, tx_buffer_address, in tx_command()
814 qemu_send_packet(qemu_get_queue(s->nic), buf, size); in tx_command()
815 s->statistics.tx_good_frames++; in tx_command()
825 uint16_t multicast_count = s->tx.tbd_array_addr & BITS(13, 0); in set_multicast_list()
827 memset(&s->mult[0], 0, sizeof(s->mult)); in set_multicast_list()
831 pci_dma_read(&s->dev, s->cb_address + 10 + i, multicast_addr, 6); in set_multicast_list()
836 s->mult[mcast_idx >> 3] |= (1 << (mcast_idx & 7)); in set_multicast_list()
843 /* The loop below won't stop if it gets special handcrafted data. in action_command()
853 s->cb_address = s->cu_base + s->cu_offset; in action_command()
855 bit_el = ((s->tx.command & COMMAND_EL) != 0); in action_command()
856 bit_s = ((s->tx.command & COMMAND_S) != 0); in action_command()
857 bit_i = ((s->tx.command & COMMAND_I) != 0); in action_command()
858 bit_nc = ((s->tx.command & COMMAND_NC) != 0); in action_command()
860 bool bit_sf = ((s->tx.command & COMMAND_SF) != 0); in action_command()
863 if (max_loop_count-- == 0) { in action_command()
869 s->cu_offset = s->tx.link; in action_command()
872 s->tx.status, s->tx.command, s->tx.link)); in action_command()
873 switch (s->tx.command & COMMAND_CMD) { in action_command()
878 pci_dma_read(&s->dev, s->cb_address + 8, &s->conf.macaddr.a[0], 6); in action_command()
879 TRACE(OTHER, logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6))); in action_command()
882 pci_dma_read(&s->dev, s->cb_address + 8, in action_command()
883 &s->configuration[0], sizeof(s->configuration)); in action_command()
885 nic_dump(&s->configuration[0], 16))); in action_command()
887 nic_dump(&s->configuration[16], in action_command()
888 ARRAY_SIZE(s->configuration) - 16))); in action_command()
889 if (s->configuration[20] & BIT(6)) { in action_command()
912 s->tx.status = 0; in action_command()
920 stw_le_pci_dma(&s->dev, s->cb_address, in action_command()
921 s->tx.status | ok_status | STATUS_C, attrs); in action_command()
961 s->cu_offset = e100_read_reg4(s, SCBPointer); in eepro100_cu_command()
982 s->statsaddr = e100_read_reg4(s, SCBPointer); in eepro100_cu_command()
984 if (s->statsaddr & 3) { in eepro100_cu_command()
990 s->statsaddr &= ~3; in eepro100_cu_command()
997 stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa005, attrs); in eepro100_cu_command()
1002 s->cu_base = e100_read_reg4(s, SCBPointer); in eepro100_cu_command()
1008 stl_le_pci_dma(&s->dev, s->statsaddr + s->stats_size, 0xa007, attrs); in eepro100_cu_command()
1009 memset(&s->statistics, 0, sizeof(s->statistics)); in eepro100_cu_command()
1035 s->ru_offset = e100_read_reg4(s, SCBPointer); in eepro100_ru_command()
1036 qemu_flush_queued_packets(qemu_get_queue(s->nic)); in eepro100_ru_command()
1060 s->ru_base = e100_read_reg4(s, SCBPointer); in eepro100_ru_command()
1076 s->mem[SCBCmd] = 0; in eepro100_write_command()
1093 if (eeprom93xx_read(s->eeprom)) { in eepro100_read_eeprom()
1108 val = SET_MASKED(val, 0x31, eeprom->value); in eepro100_write_eeprom()
1136 "Auto-Negotiation Advertisement",
1137 "Auto-Negotiation Link Partner Ability",
1138 "Auto-Negotiation Expansion"
1207 s->mdimem[0] = eepro100_mdi_default[0]; in eepro100_write_mdi()
1208 s->mdimem[1] = eepro100_mdi_default[1]; in eepro100_write_mdi()
1209 data = s->mdimem[reg]; in eepro100_write_mdi()
1222 case 4: /* Auto-Negotiation Advertisement Register */ in eepro100_write_mdi()
1223 case 5: /* Auto-Negotiation Link Partner Ability Register */ in eepro100_write_mdi()
1225 case 6: /* Auto-Negotiation Expansion Register */ in eepro100_write_mdi()
1229 s->mdimem[reg] &= eepro100_mdi_mask[reg]; in eepro100_write_mdi()
1230 s->mdimem[reg] |= data & ~eepro100_mdi_mask[reg]; in eepro100_write_mdi()
1237 s->mdimem[0] = eepro100_mdi_default[0]; in eepro100_write_mdi()
1238 s->mdimem[1] = eepro100_mdi_default[1]; in eepro100_write_mdi()
1242 s->mdimem[reg] |= 0x0020; in eepro100_write_mdi()
1246 case 4: /* Auto-Negotiation Advertisement Register */ in eepro100_write_mdi()
1248 case 5: /* Auto-Negotiation Link Partner Ability Register */ in eepro100_write_mdi()
1249 s->mdimem[reg] = 0x41fe; in eepro100_write_mdi()
1251 case 6: /* Auto-Negotiation Expansion Register */ in eepro100_write_mdi()
1252 s->mdimem[reg] = 0x0001; in eepro100_write_mdi()
1255 data = s->mdimem[reg]; in eepro100_write_mdi()
1259 s->mem[SCBAck] |= 0x08; in eepro100_write_mdi()
1303 pci_dma_read(&s->dev, address, (uint8_t *) &data, sizeof(data)); in eepro100_write_port()
1306 pci_dma_write(&s->dev, address, (uint8_t *) &data, sizeof(data)); in eepro100_write_port()
1327 if (addr <= sizeof(s->mem) - sizeof(val)) { in eepro100_read1()
1328 val = s->mem[addr]; in eepro100_read1()
1380 if (addr <= sizeof(s->mem) - sizeof(val)) { in eepro100_read2()
1408 if (addr <= sizeof(s->mem) - sizeof(val)) { in eepro100_read4()
1440 if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) { in eepro100_write1()
1441 s->mem[addr] = val; in eepro100_write1()
1486 eepro100_write_eeprom(s->eeprom, val); in eepro100_write1()
1506 if (addr > SCBStatus && addr <= sizeof(s->mem) - sizeof(val)) { in eepro100_write2()
1513 s->mem[SCBAck] = (val >> 8); in eepro100_write2()
1534 eepro100_write_eeprom(s->eeprom, val); in eepro100_write2()
1551 if (addr <= sizeof(s->mem) - sizeof(val)) { in eepro100_write4()
1566 eepro100_write_eeprom(s->eeprom, val); in eepro100_write4()
1620 * - Magic packets should set bit 30 in power management driver register. in nic_receive()
1621 * - Interesting packets should set bit 29 in power management driver register. in nic_receive()
1636 memset(&min_buf[size], 0, sizeof(min_buf) - size); in nic_receive()
1642 if (s->configuration[8] & 0x80) { in nic_receive()
1645 return -1; in nic_receive()
1647 } else if (size < 64 && (s->configuration[7] & BIT(0))) { in nic_receive()
1651 s->statistics.rx_short_frame_errors++; in nic_receive()
1652 return -1; in nic_receive()
1654 } else if ((size > MAX_ETH_FRAME_SIZE + 4) && !(s->configuration[18] & BIT(3))) { in nic_receive()
1658 return -1; in nic_receive()
1659 } else if (memcmp(buf, s->conf.macaddr.a, 6) == 0) { /* !!! */ in nic_receive()
1670 if (s->configuration[21] & BIT(3)) { in nic_receive()
1675 if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) { in nic_receive()
1677 } else if (s->configuration[15] & BIT(0)) { in nic_receive()
1682 return -1; in nic_receive()
1687 } else if (s->configuration[15] & BIT(0)) { in nic_receive()
1691 } else if (s->configuration[20] & BIT(6)) { in nic_receive()
1695 if (s->mult[mcast_idx >> 3] & (1 << (mcast_idx & 7))) { in nic_receive()
1699 return -1; in nic_receive()
1712 s->statistics.rx_resource_errors++; in nic_receive()
1716 return -1; in nic_receive()
1720 pci_dma_read(&s->dev, s->ru_base + s->ru_offset, in nic_receive()
1737 stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset + in nic_receive()
1739 stw_le_pci_dma(&s->dev, s->ru_base + s->ru_offset + in nic_receive()
1746 if (s->configuration[18] & BIT(2)) { in nic_receive()
1748 return -1; in nic_receive()
1752 assert(!(s->configuration[17] & BIT(0))); in nic_receive()
1754 pci_dma_write(&s->dev, s->ru_base + s->ru_offset + in nic_receive()
1756 s->statistics.rx_good_frames++; in nic_receive()
1758 s->ru_offset = le32_to_cpu(rx.link); in nic_receive()
1827 vmstate_unregister(VMSTATE_IF(&pci_dev->qdev), s->vmstate, s); in pci_nic_uninit()
1828 g_free(s->vmstate); in pci_nic_uninit()
1829 eeprom93xx_free(&pci_dev->qdev, s->eeprom); in pci_nic_uninit()
1830 qemu_del_nic(s->nic); in pci_nic_uninit()
1847 s->device = info->device; in e100_nic_realize()
1857 s->eeprom = eeprom93xx_new(&pci_dev->qdev, EEPROM_SIZE); in e100_nic_realize()
1859 /* Handler for memory-mapped I/O */ in e100_nic_realize()
1860 memory_region_init_io(&s->mmio_bar, OBJECT(s), &eepro100_ops, s, in e100_nic_realize()
1861 "eepro100-mmio", PCI_MEM_SIZE); in e100_nic_realize()
1862 pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->mmio_bar); in e100_nic_realize()
1863 memory_region_init_io(&s->io_bar, OBJECT(s), &eepro100_ops, s, in e100_nic_realize()
1864 "eepro100-io", PCI_IO_SIZE); in e100_nic_realize()
1865 pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->io_bar); in e100_nic_realize()
1867 memory_region_init_io(&s->flash_bar, OBJECT(s), &eepro100_ops, s, in e100_nic_realize()
1868 "eepro100-flash", PCI_FLASH_SIZE); in e100_nic_realize()
1869 pci_register_bar(&s->dev, 2, 0, &s->flash_bar); in e100_nic_realize()
1871 qemu_macaddr_default_if_unset(&s->conf.macaddr); in e100_nic_realize()
1872 logout("macaddr: %s\n", nic_dump(&s->conf.macaddr.a[0], 6)); in e100_nic_realize()
1876 s->nic = qemu_new_nic(&net_eepro100_info, &s->conf, in e100_nic_realize()
1878 pci_dev->qdev.id, in e100_nic_realize()
1879 &pci_dev->qdev.mem_reentrancy_guard, s); in e100_nic_realize()
1881 qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a); in e100_nic_realize()
1882 TRACE(OTHER, logout("%s\n", qemu_get_queue(s->nic)->info_str)); in e100_nic_realize()
1886 s->vmstate = g_memdup(&vmstate_eepro100, sizeof(vmstate_eepro100)); in e100_nic_realize()
1887 s->vmstate->name = qemu_get_queue(s->nic)->model; in e100_nic_realize()
1888 vmstate_register_any(VMSTATE_IF(&pci_dev->qdev), s->vmstate, s); in e100_nic_realize()
1894 device_add_bootindex_property(obj, &s->conf.bootindex, in eepro100_instance_init()
1895 "bootindex", "/ethernet-phy@0", in eepro100_instance_init()
2039 * a stop-gap hack to allow incremental qdev conversion so we cannot use it in eepro100_get_class_by_name()
2071 set_bit(DEVICE_CATEGORY_NETWORK, dc->categories); in eepro100_class_init()
2073 dc->desc = info->desc; in eepro100_class_init()
2074 k->vendor_id = PCI_VENDOR_ID_INTEL; in eepro100_class_init()
2075 k->class_id = PCI_CLASS_NETWORK_ETHERNET; in eepro100_class_init()
2076 k->romfile = "pxe-eepro100.rom"; in eepro100_class_init()
2077 k->realize = e100_nic_realize; in eepro100_class_init()
2078 k->exit = pci_nic_uninit; in eepro100_class_init()
2079 k->device_id = info->device_id; in eepro100_class_init()
2080 k->revision = info->revision; in eepro100_class_init()
2081 k->subsystem_vendor_id = info->subsystem_vendor_id; in eepro100_class_init()
2082 k->subsystem_id = info->subsystem_id; in eepro100_class_init()
2092 type_info.name = info->name; in eepro100_register_types()