diff -r 2fb8b9db1c86 -r d55eb581a87c baseport/syborg/ethernet/pdd/ethernet_device.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/baseport/syborg/ethernet/pdd/ethernet_device.h Tue Aug 04 10:28:23 2009 +0100 @@ -0,0 +1,174 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Register definitions and base classes for Ethernet Virtio. +* +*/ + +#ifndef __QEMUETHERNET_ +#define __QEMUETHERNET_ + +#include +#include + +#define SVPDBG +#ifdef SVPDBG +#define DP(format...) Kern::Printf(format) +#else +#define DP(format...) +#endif + +#define ETHERNET_PAYLOAD_SIZE 1500 + +#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1 +#define VIRTIO_CONFIG_S_DRIVER 2 +#define VIRTIO_CONFIG_S_DRIVER_OK 4 +#define VIRTIO_CONFIG_S_FAILED 0x80 + +/* This marks a buffer as continuing via the next field. */ +#define VRING_DESC_F_NEXT 1 +/* This marks a buffer as write-only (otherwise read-only). */ +#define VRING_DESC_F_WRITE 2 + +#define TX_QUEUE 1 +#define RX_QUEUE 0 + +#define VNET_MAC ((volatile TUint8 *)(0xc600c000 + 0x100)) +#define VNET ((volatile TUint32 *)0xc600c000) + +enum { + VIRTIO_ID = 0, + VIRTIO_DEVTYPE = 1, + VIRTIO_HOST_FEATURES = 2, + VIRTIO_GUEST_FEATURES = 3, + VIRTIO_QUEUE_BASE = 4, + VIRTIO_QUEUE_NUM = 5, + VIRTIO_QUEUE_SEL = 6, + VIRTIO_QUEUE_NOTIFY = 7, + VIRTIO_STATUS = 8, + VIRTIO_INT_ENABLE = 9, + VIRTIO_INT_STATUS = 10 +}; + +typedef struct +{ +#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 // Use csum_start, csum_offset + TUint8 flags; +#define VIRTIO_NET_HDR_GSO_NONE 0 // Not a GSO frame +#define VIRTIO_NET_HDR_GSO_TCPV4 1 // GSO frame, IPv4 TCP (TSO) +#define VIRTIO_NET_HDR_GSO_UDP 3 // GSO frame, IPv4 UDP (UFO) +#define VIRTIO_NET_HDR_GSO_TCPV6 4 // GSO frame, IPv6 TCP +#define VIRTIO_NET_HDR_GSO_ECN 0x80 // TCP has ECN set + TUint8 gso_type; + TUint16 hdr_len; + TUint16 gso_size; + TUint16 csum_start; + TUint16 csum_offset; +} virtio_net_hdr; + +typedef struct +{ + TUint64 addr; + TUint32 len; + TUint16 flags; + TUint16 next; +} vring_desc; + +typedef struct +{ + TUint16 flags; + TUint16 idx; + TUint16 ring[16]; + +} vring_avail; + +typedef struct +{ + TUint16 flags; + TUint16 idx; + struct { + TUint32 id; + TUint32 len; + } ring[16]; +} vring_used; + + +// +// Class to identify the device as ethernet device for Symbian +// +class EthernetDevice : public DEthernet +{ +public: + EthernetDevice(); + ~EthernetDevice(); + TInt DoCreate(TInt aUnit, const TDesC8* anInfo); + static void Isr(TAny* aPtr); + + // + // Functions that we must implement as we are inheriting from abstract base class + // + virtual TInt Start(); + virtual void Stop(TStopMode aMode); + virtual void GetConfig(TEthernetConfigV01 &aConfig) const; + virtual TInt ValidateConfig(const TEthernetConfigV01 &aConfig) const; + virtual void CheckConfig(TEthernetConfigV01 &aConfig); + virtual TInt Configure(TEthernetConfigV01 &aConfig); + virtual void MacConfigure(TEthernetConfigV01 &aConfig); + virtual void Caps(TDes8 &aCaps) const; + virtual TInt DisableIrqs(); + virtual void RestoreIrqs(TInt aIrq); + virtual TDfcQue* DfcQ(TInt aUnit); + virtual TInt Send(TBuf8 &aBuffer); + virtual TInt ReceiveFrame(TBuf8 &aBuffer, TBool okToUse); + +private: + + TEthernetConfigV01 iDefaultConfig; + TInt iInterruptId; + TDfc iRxDfc; + TUint32 iCreated; + TUint32 iStarted; + + //Virtio structs for transmitting data to QEMU. + volatile vring_desc *iTxDesc; + volatile vring_avail *iTxAvail; + volatile vring_used *iTxUsed; + //Ring size hardcoded in QEMU. + TUint tx_ring_size; + + //Virtio structs for receiving data from QEMU. + volatile vring_desc *iRxDesc; + volatile vring_avail *iRxAvail; + volatile vring_used *iRxUsed; + + TUint rx_ring_size; + TUint rx_last_used; + + //Virtio packet header definitions. + virtio_net_hdr rx_header; + virtio_net_hdr tx_header; + + //Buffers for Rx/Tx transmission. + TBuf8 iTxBuffer; + TBuf8 iRxBuffer; + + static void RxDfc(TAny* aPtr); + + //QEMU specific member functions + void AllocRings(); + void* AllocAligned(TUint16 size); + void AddRx(); + void SetMacAddress(void); +}; + +#endif // __QEMUETHERNET_