[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 10/31] ftgmac100: add IEEE 802.1Q VLAN support
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 10/31] ftgmac100: add IEEE 802.1Q VLAN support |
Date: |
Fri, 8 Jun 2018 13:44:56 +0100 |
From: Cédric Le Goater <address@hidden>
The ftgmac100 NIC supports VLAN tag insertion and the MAC engine also
has a control to remove VLAN tags from received packets.
The VLAN control bits and VLAN tag information are contained in the
second word of the transmit and receive descriptors. The Insert VLAN
bit and the VLAN Tag available bit are only valid in the first segment
of the packet.
Signed-off-by: Cédric Le Goater <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Message-id: address@hidden
Signed-off-by: Peter Maydell <address@hidden>
---
hw/net/ftgmac100.c | 31 ++++++++++++++++++++++++++++++-
1 file changed, 30 insertions(+), 1 deletion(-)
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
index 425ac36cff8..abf80655f28 100644
--- a/hw/net/ftgmac100.c
+++ b/hw/net/ftgmac100.c
@@ -443,6 +443,22 @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t
tx_ring,
break;
}
+ /* Check for VLAN */
+ if (bd.des0 & FTGMAC100_TXDES0_FTS &&
+ bd.des1 & FTGMAC100_TXDES1_INS_VLANTAG &&
+ be16_to_cpu(PKT_GET_ETH_HDR(ptr)->h_proto) != ETH_P_VLAN) {
+ if (frame_size + len + 4 > sizeof(s->frame)) {
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d
bytes\n",
+ __func__, len);
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
+ len = sizeof(s->frame) - frame_size - 4;
+ }
+ memmove(ptr + 16, ptr + 12, len - 12);
+ stw_be_p(ptr + 12, ETH_P_VLAN);
+ stw_be_p(ptr + 14, bd.des1);
+ len += 4;
+ }
+
ptr += len;
frame_size += len;
if (bd.des0 & FTGMAC100_TXDES0_LTS) {
@@ -864,7 +880,20 @@ static ssize_t ftgmac100_receive(NetClientState *nc, const
uint8_t *buf,
buf_len += size - 4;
}
buf_addr = bd.des3;
- dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
+ if (first && proto == ETH_P_VLAN && buf_len >= 18) {
+ bd.des1 = lduw_be_p(buf + 14) | FTGMAC100_RXDES1_VLANTAG_AVAIL;
+
+ if (s->maccr & FTGMAC100_MACCR_RM_VLAN) {
+ dma_memory_write(&address_space_memory, buf_addr, buf, 12);
+ dma_memory_write(&address_space_memory, buf_addr + 12, buf +
16,
+ buf_len - 16);
+ } else {
+ dma_memory_write(&address_space_memory, buf_addr, buf,
buf_len);
+ }
+ } else {
+ bd.des1 = 0;
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
+ }
buf += buf_len;
if (size < 4) {
dma_memory_write(&address_space_memory, buf_addr + buf_len,
--
2.17.1
- [Qemu-devel] [PULL 00/31] target-arm queue, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 10/31] ftgmac100: add IEEE 802.1Q VLAN support,
Peter Maydell <=
- [Qemu-devel] [PULL 11/31] ftgmac100: fix multicast hash routine, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 08/31] aspeed: add the pc9552 chips to the witherspoon machine, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 13/31] hw/arm: Remove the deprecated xlnx-ep108 machine, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 06/31] aspeed: Add EEPROM I2C devices, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 05/31] smbus: add a smbus_eeprom_init_one() routine, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 04/31] aspeed: add an I2C RTC device to all machines, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 12/31] ftgmac100: remove check on runt messages, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 03/31] aspeed: add support for the witherspoon-bmc board, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 09/31] ftgmac100: compute maximum frame size depending on the protocol, Peter Maydell, 2018/06/08
- [Qemu-devel] [PULL 18/31] ppc/pnv: Add trailing '\n' to qemu_log() calls, Peter Maydell, 2018/06/08