/* * Copyright (c) 2009 Herbert Poetzl. All rights reserved. * * VirtioNet.h * * HISTORY * * August 12th, 2009 Created * */ #ifndef _VIRTIONET_H #define _VIRTIONET_H #include #include #include #include #include #include #include #include #include #include #include #include "virtio/virtio_pci.h" #include "virtio/virtio_ring.h" #include "virtio/virtio_net.h" #define VIOLog(fmt, args...) do { \ if (verbose) IOLog(fmt, ## args); \ } while(0) struct vdesc { void *addr; uint32_t size; }; class VirtioNet : public IOEthernetController { OSDeclareDefaultStructors(VirtioNet) private: IOPCIDevice *pciDev; IOInterruptEventSource *irqSrc; IOWorkLoop *workLoop; UInt16 pioBase; IOMemoryMap *mmioBase; IOEthernetAddress myAddress; IOEthernetInterface *netIf; IOMbufNaturalMemoryCursor *rxMbufCurs; IOMbufNaturalMemoryCursor *txMbufCurs; struct vring vring[3]; IOPhysicalAddress virtq[3]; struct vdesc * vdesc[3]; // -------------------------------------------------- // Debugging // -------------------------------------------------- void dumpPacket(mbuf_t m); bool setupVQueue(uint16_t idx); bool releaseVQueue(uint16_t idx); void releaseBuffer(uint16_t idx, uint16_t descIdx); void *getBuffer(uint16_t idx, uint16_t *descIdx); void putBuffer(uint16_t idx, uint16_t descIdx); bool addBuffers(uint16_t idx, size_t size, int count); bool makeBufferAvail(uint16_t idx, uint16_t descIdx); inline void VirtioNet::WriteMMIO8(uint16_t offset, uint8_t value) { pciDev->ioWrite8(offset, value, mmioBase); } inline void VirtioNet::WriteMMIO16(uint16_t offset, uint16_t value) { pciDev->ioWrite16(offset, value, mmioBase); } inline void VirtioNet::WriteMMIO32(uint16_t offset, uint32_t value) { pciDev->ioWrite32(offset, value, mmioBase); } inline uint8_t VirtioNet::ReadMMIO8(uint16_t offset) { return pciDev->ioRead8(offset, mmioBase); } inline uint16_t VirtioNet::ReadMMIO16(uint16_t offset) { return pciDev->ioRead16(offset, mmioBase); } inline uint32_t VirtioNet::ReadMMIO32(uint16_t offset) { return pciDev->ioRead32(offset, mmioBase); } public: // -------------------------------------------------- // IONetworkController methods. // -------------------------------------------------- virtual bool init(OSDictionary *properties); virtual void free(); virtual bool start(IOService * provider); virtual void stop(IOService * provider); virtual IOReturn enable(IONetworkInterface *netif); virtual IOReturn disable(IONetworkInterface *netif); // virtual bool createWorkLoop(); // virtual IOWorkLoop *getWorkLoop() const; // virtual IOOutputQueue *createOutputQueue(); virtual UInt32 outputPacket(mbuf_t m, void *param); virtual const OSString *newVendorString() const; virtual const OSString *newModelString() const; // -------------------------------------------------- // IONetworkController methods.(Debugger) // -------------------------------------------------- virtual void sendPacket(void *pkt, UInt32 pkt_len); virtual void receivePacket(void * pkt, UInt32 *pkt_len, UInt32 timeout); // -------------------------------------------------- // IOEthernetController methods. // -------------------------------------------------- virtual IOReturn getHardwareAddress(IOEthernetAddress *addr); // -------------------------------------------------- // VirtioNet driver specific methods. // -------------------------------------------------- void handleInterrupt(OSObject* target, void * refCon, IOService *pciDev, int source); }; #endif /* !_VIRTIONET_H */