qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [PATCH 2/6] ftgmac100: add IEEE 802.1Q VLAN support


From: Cédric Le Goater
Subject: Re: [Qemu-arm] [PATCH 2/6] ftgmac100: add IEEE 802.1Q VLAN support
Date: Tue, 29 May 2018 18:56:12 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2

On 05/29/2018 03:34 PM, Philippe Mathieu-Daudé wrote:
> Hi Cédric,
> 
> On 05/29/2018 03:28 AM, Cédric Le Goater wrote:
>> 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>
>> ---
>>  hw/net/ftgmac100.c | 32 +++++++++++++++++++++++++++++++-
>>  1 file changed, 31 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
>> index 7598d08c9cb9..50af1222464a 100644
>> --- a/hw/net/ftgmac100.c
>> +++ b/hw/net/ftgmac100.c
>> @@ -443,6 +443,24 @@ 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);
>> +            ptr[12] = 0x81;
>> +            ptr[13] = 0x00;
> 
>                stw_be_p(ptr + 12, ETH_P_VLAN);
> 
>> +            ptr[14] = (uint8_t) bd.des1 >> 8;
>> +            ptr[15] = (uint8_t) bd.des1;
> 
>                stw_be_p(ptr + 12, bd.des1);

ptr + 14

>> +            len += 4;
>> +        }
>> +
>>          ptr += len;
>>          frame_size += len;
>>          if (bd.des0 & FTGMAC100_TXDES0_LTS) {
>> @@ -858,7 +876,19 @@ 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 = (buf[14] << 8) | buf[15] | 
>> FTGMAC100_RXDES1_VLANTAG_AVAIL;
> 
>                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,
>>
> 
> With ldst API uses:
> Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
> 

Sure, I will fix these.

Thanks,

C. 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]