baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet_device.h
changeset 0 ffa851df0825
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/baseport/src/cedar/generic/base/syborg/ethernet/pdd/ethernet_device.h	Fri Jul 31 14:43:15 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 <ethernet.h>
+#include <system.h>
+
+#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<KMaxEthernetPacket+32> &aBuffer);
+	virtual TInt ReceiveFrame(TBuf8<KMaxEthernetPacket+32> &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<KMaxEthernetPacket+32> iTxBuffer;
+	TBuf8<KMaxEthernetPacket+32> iRxBuffer;
+		
+	static void RxDfc(TAny* aPtr);
+	
+	//QEMU specific member functions
+	void AllocRings();
+	void* AllocAligned(TUint16 size);
+	void AddRx();
+	void SetMacAddress(void);
+};
+
+#endif // __QEMUETHERNET_