From: Jack Lange Date: Wed, 4 Mar 2009 00:13:48 +0000 (-0600) Subject: formatting changes to the vnic X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=27962526dcc19380add6b33d48d6fcefa7968526 formatting changes to the vnic --- diff --git a/palacios/src/devices/vnic.c b/palacios/src/devices/vnic.c index 286a5c1..dfaaf74 100644 --- a/palacios/src/devices/vnic.c +++ b/palacios/src/devices/vnic.c @@ -82,42 +82,90 @@ struct nic_context{ struct vm_device *current_vnic; -#define compare_mac(src, dst) ({ \ - ((src[0] == dst[0]) && \ - (src[1] == dst[1]) && \ - (src[2] == dst[2]) && \ - (src[3] == dst[3]) && \ - (src[4] == dst[4]) && \ - (src[5] == dst[5]))? 1:0; \ +#define compare_mac(src, dst) ({ \ + ( (src[0] == dst[0]) && \ + (src[1] == dst[1]) && \ + (src[2] == dst[2]) && \ + (src[3] == dst[3]) && \ + (src[4] == dst[4]) && \ + (src[5] == dst[5]) ) ? 1 : 0; \ }) -static void dump_state(struct vm_device *dev) -{ - int i; - uchar_t *p; - struct nic_context *nic_state = (struct nic_context *)dev->private_data; - PrintDebug("====VNIC: Dumping state Begin ==========\n"); - PrintDebug("Registers:\n"); - p = (uchar_t *)&nic_state->regs; - for(i = 0; i < sizeof(struct nic_regs); i++) - PrintDebug("Regs[i] = 0x%2x\n", (int)p[i]); - - PrintDebug("Memory:\n"); - for(i = 0; i < 32; i++) + + +/* + * Host/Network byte conversion functions + * TODO: These are not compiler safe + * TODO: consistent names would be nice... + */ + +static inline uint16_t cpu2le16(uint16_t val) { + uint16_t p = 0; + uchar_t * p1 = (uchar_t *)&p; + + p1[0] = val; + p1[1] = val >> 8; + + return p; +} + + +static inline uint32_t cpu2le32(uint32_t val) { + uint32_t p = 0; + uchar_t * p1 = (uchar_t *)&p; + + p1[0] = val; + p1[1] = val >> 8; + p1[2] = val >> 16; + p1[3] = val >> 24; + + return p; +} + +static inline uint16_t le16_to_cpu(const uint16_t * p) { + const uchar_t * p1 = (const uchar_t *)p; + return p1[0] | (p1[1] << 8); +} + +static inline uint32_t le32_to_cpu(const uint32_t *p) { + const uchar_t * p1 = (const uchar_t *)p; + return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24); +} + + + + +static void dump_state(struct vm_device * dev) { + int i = 0; + uchar_t * p = NULL; + struct nic_context * nic_state = (struct nic_context *)dev->private_data; + + PrintDebug("====VNIC: Dumping state Begin ==========\n"); + PrintDebug("Registers:\n"); + + p = (uchar_t *)&nic_state->regs; + + for (i = 0; i < sizeof(struct nic_regs); i++) { + PrintDebug("Regs[i] = 0x%2x\n", (int)p[i]); + } + + PrintDebug("Memory:\n"); + + for (i = 0; i < 32; i++) { PrintDebug("0x%02x ", nic_state->mem[i]); - PrintDebug("\n"); - PrintDebug("====VNIC: Dumping state End==========\n"); + } + + PrintDebug("\n"); + PrintDebug("====VNIC: Dumping state End==========\n"); } -static void vnic_update_irq(struct vm_device *dev) -{ - int isr; - struct nic_context *nic_state = (struct nic_context *)dev->private_data; - struct guest_info *guest = dev->vm; - - isr = ((nic_state->regs.isr & nic_state->regs.imr) & 0x7f); +static void vnic_update_irq(struct vm_device * dev) { + struct nic_context * nic_state = (struct nic_context *)dev->private_data; + struct guest_info * guest = dev->vm; + + int isr = ((nic_state->regs.isr & nic_state->regs.imr) & 0x7f); if ((isr & 0x7f) != 0x0) { v3_raise_irq(guest, NIC_IRQ); @@ -125,8 +173,7 @@ static void vnic_update_irq(struct vm_device *dev) } } -static void init_vnic_context(struct vm_device *dev) -{ +static void init_vnic_context(struct vm_device * dev) { struct nic_context *nic_state = (struct nic_context *)dev->private_data; int i; uchar_t mac[6] = {0x52, 0x54, 0x0, 0x12, 0x34, 0x56}; @@ -137,11 +184,13 @@ static void init_vnic_context(struct vm_device *dev) nic_state->regs.imr = 0x00; nic_state->regs.cmd = 0x22; - for (i = 0; i < 6; i++) + for (i = 0; i < 6; i++) { nic_state->regs.macaddr[i] = nic_state->mac[i] = mac[i]; + } - for (i = 0; i < 8; i++) + for (i = 0; i < 8; i++) { nic_state->regs.mult[i] = 0xff; + } for(i = 0; i < 32; i++) { nic_state->mem[i] = 0xff; @@ -152,26 +201,27 @@ static void init_vnic_context(struct vm_device *dev) nic_state->mem[15] = 0x57; dump_state(dev); - } -static int vnic_send_packet(struct vm_device *dev, uchar_t *pkt, int length) -{ + + +static int vnic_send_packet(struct vm_device *dev, uchar_t *pkt, int length) { int i; PrintDebug("\nVNIC: Sending Packet\n"); - for (i = 0; iprivate_data; - struct nic_regs *nregs = &(nic_state->regs); +struct vm_device * get_rx_dev(uchar_t * dst_mac) { + struct nic_context * nic_state = (struct nic_context *)current_vnic->private_data; + struct nic_regs * nregs = &(nic_state->regs); static const uchar_t brocast_mac[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; @@ -179,63 +229,68 @@ struct vm_device * get_rx_dev(uchar_t *dst_mac) // promiscuous model } else { if (compare_mac(dst_mac, brocast_mac)) { //broadcast address - if (!(nregs->rcr & 0x04)) + if (!(nregs->rcr & 0x04)) { return NULL; + } } else if (dst_mac[0] & 0x01) { // multicast packet, not fully done here // ========== - if (!(nregs->rcr & 0x08)) + if (!(nregs->rcr & 0x08)) { return NULL; + } } else if (!compare_mac(dst_mac, nic_state->mac)) { return NULL; } else { - + // TODO: ELSE?? } } return current_vnic; } -static int vnic_rxbuf_full(struct vm_device *dev) -{ +static int vnic_rxbuf_full(struct vm_device * dev) { int empty, index, boundary; - struct nic_context *nic_state = (struct nic_context *)dev->private_data; + struct nic_context * nic_state = (struct nic_context *)dev->private_data; index = nic_state->regs.curpag << 8; boundary = nic_state->regs.boundary << 8; - if (index < boundary) + if (index < boundary) { empty = boundary - index; - else + } else { empty = ((nic_state->regs.pgstop - nic_state->regs.pgstart) << 8) - (index - boundary); - - if (empty < (MAX_ETH_FRAME_SIZE + 4)) + } + + if (empty < (MAX_ETH_FRAME_SIZE + 4)) { return 1; - + } + return 0; } #define MIN_BUF_SIZE 60 -static void vnic_receive(struct vm_device *dev, const uchar_t *pkt, int length) -{ - struct nic_context *nic_state = (struct nic_context *)dev->private_data; - struct nic_regs *nregs = &(nic_state->regs); - uchar_t *p; - uint32_t total_len, next, len, index, empty; +static void vnic_receive(struct vm_device * dev, const uchar_t * pkt, int length) { + struct nic_context * nic_state = (struct nic_context *)dev->private_data; + struct nic_regs * nregs = &(nic_state->regs); + + uchar_t * p = NULL; + uint32_t total_len = 0; + uint32_t next = 0; + uint32_t len = 0; + uint32_t index = 0; + uint32_t empty = 0; uchar_t buf[60]; - uint32_t start, stop; - - + uint32_t start = nregs->pgstart << 8; + uint32_t stop = nregs->pgstop << 8; + //PrintDebug("VNIC: received packet, len=%d\n", length); - - start = nregs->pgstart << 8; - stop = nregs->pgstop << 8; - if (nregs->cmd & NE2K_STOP) - return; + if (nregs->cmd & NE2K_STOP) { + return; + } if (vnic_rxbuf_full(dev)){ - PrintDebug("VNIC: received buffer overflow\n"); + PrintDebug("VNIC: received buffer overflow\n"); return; } @@ -243,45 +298,62 @@ static void vnic_receive(struct vm_device *dev, const uchar_t *pkt, int length) if (length < MIN_BUF_SIZE) { memcpy(buf, pkt, length); memset(buf + length, 0, MIN_BUF_SIZE - length); + pkt = buf; + length = MIN_BUF_SIZE; } index = nregs->curpag << 8; + // 4 bytes header total_len = length + 4; + // address for next packet (4 bytes for CRC) next = index + ((total_len + 4 + 255) & ~0xff); - if (next >= stop) + + if (next >= stop) { next -= stop - start; + } p = nic_state->mem + index; nregs->rsr = ENRSR_RXOK; - if (pkt[0] & 0x01) + if (pkt[0] & 0x01) { nregs->rsr |= ENRSR_PHY; - + } + p[0] = nregs->rsr; p[1] = next >> 8; p[2] = total_len; p[3] = total_len >> 8; + index += 4; while (length > 0) { - if (index <= stop) + if (index <= stop) { empty = stop - index; - else - empty = 0; + } else { + empty = 0; + } + len = length; - if (len > empty) + + if (len > empty) { len = empty; + } + memcpy(nic_state->mem + index, pkt, len); pkt += len; index += len; - if (index == stop) + + if (index == stop) { index = start; + } + length -= len; } + nregs->curpag = next >> 8; nregs->isr |= ENISR_RX; @@ -290,18 +362,17 @@ static void vnic_receive(struct vm_device *dev, const uchar_t *pkt, int length) // =====begin here #if 0 -void pci_vnic_init(PCIBus *bus, NICInfo *nd, int devfn) +void pci_vnic_init(PCIBus * bus, NICInfo * nd, int devfn) { - PCINE2000State *d; - NE2000State *s; - uint8_t *pci_conf; - struct pci_device *pdev; - - pdev = pci_register_device(bus, - "NE2000", sizeof(PCINE2000State), - devfn, - NULL, NULL); + PCINE2000State * d = NULL; + NE2000State * s = NULL; + uint8_t * pci_conf = NULL; + struct pci_device * pdev = pci_register_device(bus, + "NE2000", sizeof(PCINE2000State), + devfn, + NULL, NULL); pci_conf = d->dev.config; + pci_conf[0x00] = 0xec; // Realtek 8029 pci_conf[0x01] = 0x10; pci_conf[0x02] = 0x29; @@ -314,10 +385,15 @@ void pci_vnic_init(PCIBus *bus, NICInfo *nd, int devfn) pci_register_io_region(&d->dev, 0, 0x100, PCI_ADDRESS_SPACE_IO, ne2000_map); s = &d->ne2000; + s->irq = d->dev.irq[0]; + s->pci_dev = (PCIDevice *)d; + memcpy(s->macaddr, nd->macaddr, 6); + ne2000_reset(s); + s->vc = qemu_new_vlan_client(nd->vlan, ne2000_receive, ne2000_can_receive, s); @@ -336,25 +412,27 @@ void pci_vnic_init(PCIBus *bus, NICInfo *nd, int devfn) #endif //End Here==================================== -static int netif_input(uchar_t * pkt, uint_t size) -{ +static int netif_input(uchar_t * pkt, uint_t size) { uint_t i; - struct vm_device *dev; + struct vm_device * dev = NULL; PrintDebug("\nVNIC: Packet Received:\nSource:"); + for (i = 6; i < 12; i++) { - PrintDebug("%x ", pkt[i]); + PrintDebug("%x ", pkt[i]); } dev = get_rx_dev(pkt); - if (dev == NULL) - return 0; - + if (dev == NULL) { + return 0; + } PrintDebug("\n"); - for(i= 0; iprivate_data; - uchar_t val; + uchar_t val = 0; int index; if (length == 1) { - memcpy(&val, src, 1); + memcpy(&val, src, 1); } else { - PrintDebug("vnic_write error: length %d\n", length); - return length; + PrintDebug("vnic_write error: length %d\n", length); + return length; } port &= 0x1f; @@ -384,261 +461,280 @@ static int vnic_ioport_write(ushort_t port, if (port == EN0_COMMAND) { nic_state->regs.cmd = val; + if (!(val & NE2K_STOP)) { nic_state->regs.isr &= ~ENISR_RESET; + if ((val & (NE2K_DMAREAD | NE2K_DMAWRITE)) && - nic_state->regs.rbcr == 0) { + nic_state->regs.rbcr == 0) { nic_state->regs.isr |= ENISR_RDC; vnic_update_irq(dev); } + + if (val & NE2K_TRANSMIT) { index = (nic_state->regs.tpsr << 8); - if (index >= NE2K_PMEM_END) + + if (index >= NE2K_PMEM_END) { index -= NE2K_PMEM_SIZE; + } + if (index + nic_state->regs.tbcr <= NE2K_PMEM_END) { vnic_send_packet(dev, nic_state->mem + index, nic_state->regs.tbcr); } + nic_state->regs.tsr = ENTSR_PTX; nic_state->regs.isr |= ENISR_TX; nic_state->regs.cmd &= ~NE2K_TRANSMIT; + vnic_update_irq(dev); } } + } else { page = nic_state->regs.cmd >> 6; - if(page == 0){ - switch(port) { - case EN0_STARTPG: - nic_state->regs.pgstart = val; - break; - case EN0_STOPPG: - nic_state->regs.pgstop = val; - break; - case EN0_BOUNDARY: - nic_state->regs.boundary = val; - break; - case EN0_TPSR: - nic_state->regs.tpsr = val; - break; - case EN0_TCNTLO: - nic_state->regs.tbcr = (nic_state->regs.tbcr & 0xff00) | val; - break; - case EN0_TCNTHI: - nic_state->regs.tbcr = (nic_state->regs.tbcr & 0x00ff) | (val << 8); - break; - case EN0_ISR: - nic_state->regs.isr &= ~(val & 0x7f); - vnic_update_irq(dev); - break; - case EN0_RSARLO: - nic_state->regs.rsar = (nic_state->regs.rsar & 0xff00) | val; - break; - case EN0_RSARHI: - nic_state->regs.rsar = (nic_state->regs.rsar & 0x00ff) | (val << 8); - break; - case EN0_RCNTLO: - nic_state->regs.rbcr = (nic_state->regs.rbcr & 0xff00) | val; - break; - case EN0_RCNTHI: - nic_state->regs.rbcr = (nic_state->regs.rbcr & 0x00ff) | (val << 8); - break; - case EN0_RXCR: - nic_state->regs.rcr = val; - break; - case EN0_TXCR: - nic_state->regs.tcr = val; - case EN0_DCFG: - nic_state->regs.dcr = val; - break; - case EN0_IMR: - nic_state->regs.imr = val; - vnic_update_irq(dev); - break; - default: - PrintDebug("vnic_write error: invalid port:0x%x\n", port); - break; - } - } - if(page == 1){ - switch(port) { - case EN1_PHYS ... EN1_PHYS + 5: - nic_state->regs.phys[port - EN1_PHYS] = val; - break; - case EN1_CURPAG: - nic_state->regs.curpag = val; - break; - case EN1_MULT ... EN1_MULT + 7: - nic_state->regs.mult[port - EN1_MULT] = val; - break; - default: - PrintDebug("vnic_write error: invalid port:0x%x\n", port); - break; - } - } - if(page == 2){ - switch(port) { - case EN2_LDMA0: - nic_state->regs.clda = (nic_state->regs.clda & 0xff00) | val; - break; - case EN2_LDMA1: - nic_state->regs.clda = (nic_state->regs.clda & 0x00ff) | (val << 8); - break; - case EN2_RNPR: - nic_state->regs.rnpp = val; - break; - case EN2_LNRP: - nic_state->regs.lnpp = val; - break; - case EN2_ACNT0: - nic_state->regs.addcnt = (nic_state->regs.addcnt & 0xff00) | val; - break; - case EN2_ACNT1: - nic_state->regs.addcnt = (nic_state->regs.addcnt & 0x00ff) | (val << 8); - break; - default: - PrintDebug("vnic_write error: invalid port:0x%x\n", port); - break; - } - } - } - //dump_state(dev); + if (page == 0){ + + switch(port) { + case EN0_STARTPG: + nic_state->regs.pgstart = val; + break; + case EN0_STOPPG: + nic_state->regs.pgstop = val; + break; + case EN0_BOUNDARY: + nic_state->regs.boundary = val; + break; + case EN0_TPSR: + nic_state->regs.tpsr = val; + break; + case EN0_TCNTLO: + nic_state->regs.tbcr = (nic_state->regs.tbcr & 0xff00) | val; + break; + case EN0_TCNTHI: + nic_state->regs.tbcr = (nic_state->regs.tbcr & 0x00ff) | (val << 8); + break; + case EN0_ISR: + nic_state->regs.isr &= ~(val & 0x7f); + vnic_update_irq(dev); + break; + case EN0_RSARLO: + nic_state->regs.rsar = (nic_state->regs.rsar & 0xff00) | val; + break; + case EN0_RSARHI: + nic_state->regs.rsar = (nic_state->regs.rsar & 0x00ff) | (val << 8); + break; + case EN0_RCNTLO: + nic_state->regs.rbcr = (nic_state->regs.rbcr & 0xff00) | val; + break; + case EN0_RCNTHI: + nic_state->regs.rbcr = (nic_state->regs.rbcr & 0x00ff) | (val << 8); + break; + case EN0_RXCR: + nic_state->regs.rcr = val; + break; + case EN0_TXCR: + nic_state->regs.tcr = val; + case EN0_DCFG: + nic_state->regs.dcr = val; + break; + case EN0_IMR: + nic_state->regs.imr = val; + vnic_update_irq(dev); + break; + default: + PrintDebug("vnic_write error: invalid port:0x%x\n", port); + break; + } + } + + + if (page == 1) { + + switch(port) { + case EN1_PHYS ... EN1_PHYS + 5: + nic_state->regs.phys[port - EN1_PHYS] = val; + break; + case EN1_CURPAG: + nic_state->regs.curpag = val; + break; + case EN1_MULT ... EN1_MULT + 7: + nic_state->regs.mult[port - EN1_MULT] = val; + break; + default: + PrintDebug("vnic_write error: invalid port:0x%x\n", port); + break; + } + } + + + if (page == 2) { + + switch(port) { + case EN2_LDMA0: + nic_state->regs.clda = (nic_state->regs.clda & 0xff00) | val; + break; + case EN2_LDMA1: + nic_state->regs.clda = (nic_state->regs.clda & 0x00ff) | (val << 8); + break; + case EN2_RNPR: + nic_state->regs.rnpp = val; + break; + case EN2_LNRP: + nic_state->regs.lnpp = val; + break; + case EN2_ACNT0: + nic_state->regs.addcnt = (nic_state->regs.addcnt & 0xff00) | val; + break; + case EN2_ACNT1: + nic_state->regs.addcnt = (nic_state->regs.addcnt & 0x00ff) | (val << 8); + break; + default: + PrintDebug("vnic_write error: invalid port:0x%x\n", port); + break; + } + } + } + + //dump_state(dev); - return length; + return length; } -static int vnic_ioport_read(ushort_t port, - void * dst, - uint_t length, - struct vm_device *dev) -{ - uchar_t page, ret; +static int vnic_ioport_read(ushort_t port, void * dst, uint_t length, struct vm_device *dev) { + uchar_t page = 0; + int val = 0; struct nic_context *nic_state = (struct nic_context* )dev->private_data; if (length > 1) { - PrintDebug("vnic_read error: length %d\n", length); - return length; + PrintDebug("vnic_read error: length %d\n", length); + valurn length; } port &= 0x1f; if (port == EN0_COMMAND) { - ret = nic_state->regs.cmd; + val = nic_state->regs.cmd; } else { page = nic_state->regs.cmd >> 6; - if (page == 0){ - switch(port) { - case EN0_CLDALO: - ret = nic_state->regs.clda & 0x00ff; + + if (page == 0) { + + switch (port) { + case EN0_CLDALO: + val = nic_state->regs.clda & 0x00ff; break; case EN0_CLDAHI: - ret = (nic_state->regs.clda & 0xff00) >> 8; + val = (nic_state->regs.clda & 0xff00) >> 8; break; case EN0_BOUNDARY: - ret = nic_state->regs.boundary; + val = nic_state->regs.boundary; break; - case EN0_TSR: - ret = nic_state->regs.tsr; + case EN0_TSR: + val = nic_state->regs.tsr; break; - case EN0_NCR: - ret = nic_state->regs.ncr; + case EN0_NCR: + val = nic_state->regs.ncr; break; case EN0_FIFO: - ret = nic_state->regs.fifo; + val = nic_state->regs.fifo; break; - case EN0_ISR: - ret = nic_state->regs.isr; + case EN0_ISR: + val = nic_state->regs.isr; vnic_update_irq(dev); break; - case EN0_CRDALO: - ret = nic_state->regs.crda & 0x00ff; + case EN0_CRDALO: + val = nic_state->regs.crda & 0x00ff; break; case EN0_CRDAHI: - ret = (nic_state->regs.crda & 0xff00) >> 8; + val = (nic_state->regs.crda & 0xff00) >> 8; break; case EN0_RSR: - ret = nic_state->regs.rsr; + val = nic_state->regs.rsr; break; - case EN0_COUNTER0: - ret = nic_state->regs.cntr & 0x000000ff; - break; + case EN0_COUNTER0: + val = nic_state->regs.cntr & 0x000000ff; + break; case EN0_COUNTER1: - ret = (nic_state->regs.cntr & 0x0000ff00) >> 8; - break; + val = (nic_state->regs.cntr & 0x0000ff00) >> 8; + break; case EN0_COUNTER2: - ret = (nic_state->regs.cntr & 0x00ff0000) >> 16; - break; - default: - PrintDebug("vnic_read error: invalid port:0x%x\n", port); - ret = 0x00; - break; - } - } - if (page == 1){ - switch(port) { + val = (nic_state->regs.cntr & 0x00ff0000) >> 16; + break; + default: + PrintDebug("vnic_read error: invalid port:0x%x\n", port); + val = 0x00; + break; + } + + } else if (page == 1) { + + switch(port) { case EN1_PHYS ... EN1_PHYS + 5: - ret = nic_state->regs.phys[port - EN1_PHYS]; + val = nic_state->regs.phys[port - EN1_PHYS]; break; case EN1_CURPAG: - ret = nic_state->regs.curpag; + val = nic_state->regs.curpag; break; case EN1_MULT ... EN1_MULT + 7: - ret = nic_state->regs.mult[port - EN1_MULT]; + val = nic_state->regs.mult[port - EN1_MULT]; break; - default: - PrintDebug("vnic_read error: invalid port:0x%x\n", port); - ret = 0x00; - break; - } - } - if (page == 2){ - switch(port) { - case EN2_STARTPG: - ret = nic_state->regs.pgstart; + default: + PrintDebug("vnic_read error: invalid port:0x%x\n", port); + val = 0x00; break; - case EN2_STOPPG: - ret = nic_state->regs.pgstop; + } + + } else if (page == 2) { + + switch(port) { + case EN2_STARTPG: + val = nic_state->regs.pgstart; + break; + case EN2_STOPPG: + val = nic_state->regs.pgstop; break; - case EN2_RNPR: - ret = nic_state->regs.rnpp; + case EN2_RNPR: + val = nic_state->regs.rnpp; break; - case EN2_LNRP: - ret = nic_state->regs.lnpp; + case EN2_LNRP: + val = nic_state->regs.lnpp; break; - case EN2_TPSR: - ret = nic_state->regs.tpsr; + case EN2_TPSR: + val = nic_state->regs.tpsr; break; - case EN2_ACNT0: - ret = nic_state->regs.addcnt & 0x00ff; + case EN2_ACNT0: + val = nic_state->regs.addcnt & 0x00ff; break; - case EN2_ACNT1: - ret = (nic_state->regs.addcnt & 0xff00) >> 8; + case EN2_ACNT1: + val = (nic_state->regs.addcnt & 0xff00) >> 8; break; - case EN2_RCR: - ret = nic_state->regs.rcr; + case EN2_RCR: + val = nic_state->regs.rcr; break; - case EN2_TCR: - ret = nic_state->regs.tcr; + case EN2_TCR: + val = nic_state->regs.tcr; break; - case EN2_DCR: - ret = nic_state->regs.dcr; + case EN2_DCR: + val = nic_state->regs.dcr; break; - case EN2_IMR: - ret = nic_state->regs.imr; + case EN2_IMR: + val = nic_state->regs.imr; break; - default: + default: PrintDebug("vnic_read error: invalid port:0x%x\n", port); - ret = 0x00; + val = 0x00; break; - } - } + } + } } - memcpy(dst, &ret, 1); + memcpy(dst, &val, 1); - PrintDebug("vnic_read: port:0x%x (%u bytes): 0x%x\n", port,length, (int)ret); + PrintDebug("vnic_read: port:0x%x (%u bytes): 0x%x\n", port,length, (uint32_t)val); //dump_state(dev); @@ -646,133 +742,98 @@ static int vnic_ioport_read(ushort_t port, } -static inline uint16_t cpu2le16(uint16_t val) -{ - uint16_t p; - uchar_t *p1 = (uchar_t *)&p; - - p1[0] = val; - p1[1] = val >> 8; - - return p; -} - -static inline uint32_t cpu2le32(uint32_t val) -{ - uint32_t p; - uchar_t *p1 = (uchar_t *)&p; - p1[0] = val; - p1[1] = val >> 8; - p1[2] = val >> 16; - p1[3] = val >> 24; +static void vnic_mem_writeb(struct nic_context * nic_state, + uint32_t addr, + uint32_t val) { + uchar_t tmp = (uchar_t) (val & 0x000000ff); - return p; -} - -static inline uint16_t le16_to_cpu(const uint16_t *p) -{ - const uchar_t *p1 = (const uchar_t *)p; - return p1[0] | (p1[1] << 8); -} - -static inline uint32_t le32_to_cpu(const uint32_t *p) -{ - const uchar_t *p1 = (const uchar_t *)p; - return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24); -} - -static void vnic_mem_writeb(struct nic_context *nic_state, - uint32_t addr, - uint32_t val) -{ - uchar_t tmp; - - tmp = (uchar_t) (val & 0x000000ff); - if (addr < 32 || (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE)) { + if ( (addr < 32) || + ((addr >= NE2K_PMEM_START && addr) < NE2K_MEM_SIZE) ) { nic_state->mem[addr] = tmp; } PrintDebug("wmem addr: %x val: %x\n", addr, val); } -static void vnic_mem_writew(struct nic_context *nic_state, - uint32_t addr, - uint32_t val) -{ +static void vnic_mem_writew(struct nic_context * nic_state, + uint32_t addr, + uint32_t val) { + addr &= ~1; //XXX: check exact behaviour if not even - if (addr < 32 || - (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE)) { + + if ( (addr < 32) || + ((addr >= NE2K_PMEM_START && addr) < NE2K_MEM_SIZE)) { *(ushort_t *)(nic_state->mem + addr) = cpu2le16(val); } PrintDebug("wmem addr: %x val: %x\n", addr, val); } -static void vnic_mem_writel(struct nic_context *nic_state, - uint32_t addr, - uint32_t val) -{ +static void vnic_mem_writel(struct nic_context * nic_state, + uint32_t addr, + uint32_t val) { addr &= ~1; // XXX: check exact behaviour if not even - if (addr < 32 || - (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE)) { + + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE) ) ) { *(uint32_t *)(nic_state->mem + addr) = cpu2le32(val); } - + PrintDebug("wmem addr: %x val: %x\n", addr, val); } -static uchar_t vnic_mem_readb(struct nic_context *nic_state, uint32_t addr) -{ +static uchar_t vnic_mem_readb(struct nic_context * nic_state, uint32_t addr) { PrintDebug("rmem addr: %x\n", addr); - if (addr < 32 || - (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE)) { + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE)) ) { return nic_state->mem[addr]; } else { return 0xff; } } -static ushort_t vnic_mem_readw(struct nic_context *nic_state, uint32_t addr) -{ +static ushort_t vnic_mem_readw(struct nic_context * nic_state, uint32_t addr) { PrintDebug("rmem addr: %x\n", addr); addr &= ~1; //XXX: check exact behaviour if not even - if (addr < 32 || - (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE)) { + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE))) { return (ushort_t)le16_to_cpu((ushort_t *)(nic_state->mem + addr)); } else { return 0xffff; } } -static uint32_t vnic_mem_readl(struct nic_context *nic_state, uint32_t addr) -{ +static uint32_t vnic_mem_readl(struct nic_context * nic_state, uint32_t addr) { PrintDebug("rmem addr: %x\n", addr); addr &= ~1; //XXX: check exact behaviour if not even - if (addr < 32 || - (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE)) { + + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE))) { return (uint32_t)le32_to_cpu((uint32_t *)(nic_state->mem + addr)); } else { return 0xffffffff; } } -static void vnic_dma_update(struct vm_device *dev, int len) -{ +static void vnic_dma_update(struct vm_device * dev, int len) { struct nic_context *nic_state = (struct nic_context *)dev->private_data; nic_state->regs.rsar += len; // wrap - if (nic_state->regs.rsar == nic_state->regs.pgstop) + + if (nic_state->regs.rsar == nic_state->regs.pgstop) { nic_state->regs.rsar = nic_state->regs.pgstart; + } if (nic_state->regs.rbcr <= len) { nic_state->regs.rbcr = 0; nic_state->regs.isr |= ENISR_RDC; + vnic_update_irq(dev); } else { nic_state->regs.rbcr -= len; @@ -782,146 +843,126 @@ static void vnic_dma_update(struct vm_device *dev, int len) //for data port read/write static int vnic_data_read(ushort_t port, - void * dst, - uint_t length, - struct vm_device *dev) -{ - uint32_t val; - struct nic_context *nic_state = (struct nic_context *)dev->private_data; - - // current dma address - uint32_t addr = nic_state->regs.rsar; - - switch(length){ - case 1: - val = vnic_mem_readb(nic_state, addr); - break; - case 2: - val = vnic_mem_readw(nic_state, addr); - break; - case 4: - val = vnic_mem_readl(nic_state, addr); - break; - default: - PrintDebug("vnic_data_read error: invalid length %d\n", length); - val = 0x0; - } + void * dst, + uint_t length, + struct vm_device * dev) { + uint32_t val = 0; + struct nic_context *nic_state = (struct nic_context *)dev->private_data; + + // current dma address + uint32_t addr = nic_state->regs.rsar; + + switch (length) { + case 1: + val = vnic_mem_readb(nic_state, addr); + break; + case 2: + val = vnic_mem_readw(nic_state, addr); + break; + case 4: + val = vnic_mem_readl(nic_state, addr); + break; + default: + PrintDebug("vnic_data_read error: invalid length %d\n", length); + val = 0x0; + } - vnic_dma_update(dev, length); + vnic_dma_update(dev, length); - memcpy(dst, &val, length); + memcpy(dst, &val, length); - PrintDebug("vnic_read: port:0x%x (%u bytes): 0x%x", port & 0x1f,length, val); + PrintDebug("vnic_read: port:0x%x (%u bytes): 0x%x", port & 0x1f,length, val); - return length; + return length; } static int vnic_data_write(ushort_t port, - void * src, - uint_t length, - struct vm_device *dev) -{ - uint32_t val; - struct nic_context *nic_state = (struct nic_context *)dev->private_data; + void * src, + uint_t length, + struct vm_device * dev) { + uint32_t val = 0; + struct nic_context * nic_state = (struct nic_context *)dev->private_data; - uint32_t addr = nic_state->regs.rsar; + uint32_t addr = nic_state->regs.rsar; - if (nic_state->regs.rbcr == 0) - return length; + if (nic_state->regs.rbcr == 0) { + return length; + } - memcpy(&val, src, length); + memcpy(&val, src, length); - //determine the starting address of reading/writing - //addr= ?? + //determine the starting address of reading/writing + //addr= ?? - switch (length){ - case 1: - vnic_mem_writeb(nic_state, addr, val); - break; - case 2: - vnic_mem_writew(nic_state, addr, val); - break; - case 4: - vnic_mem_writel(nic_state, addr, val); - break; - default: - PrintDebug("nic_data_write error: invalid length %d\n", length); - } + switch (length) { + case 1: + vnic_mem_writeb(nic_state, addr, val); + break; + case 2: + vnic_mem_writew(nic_state, addr, val); + break; + case 4: + vnic_mem_writel(nic_state, addr, val); + break; + default: + PrintDebug("nic_data_write error: invalid length %d\n", length); + } - vnic_dma_update(dev, length); + vnic_dma_update(dev, length); - PrintDebug("vnic_write: port:0x%x (%u bytes): 0x%x\n", port & 0x1f,length, val); + PrintDebug("vnic_write: port:0x%x (%u bytes): 0x%x\n", port & 0x1f,length, val); - return length; + return length; } -static int vnic_reset_device(struct vm_device * dev) -{ +static int vnic_reset_device(struct vm_device * dev) { - PrintDebug("vnic: reset device\n"); + PrintDebug("vnic: reset device\n"); - init_vnic_context(dev); + init_vnic_context(dev); - return 0; + return 0; } //for 0xc11f port -static int vnic_reset_port_read(ushort_t port, - void * dst, - uint_t length, - struct vm_device *dev) -{ - uint32_t val = 0x0; - - memcpy(dst, &val, length); +static int vnic_reset_port_read(ushort_t port, void * dst, uint_t length, struct vm_device * dev) { + uint32_t val = 0; - PrintDebug("vnic_read: port:0x%x (%u bytes): 0x%x\n", port,length, val); + PrintDebug("vnic_read: port:0x%x (%u bytes): 0x%x\n", port,length, val); + memcpy(dst, &val, length); - vnic_reset_device(dev); + vnic_reset_device(dev); - return length; + return length; } -static int vnic_reset_port_write(ushort_t port, - void * src, - uint_t length, - struct vm_device *dev) -{ - uint32_t val; - - memcpy(&val, src, length); +static int vnic_reset_port_write(ushort_t port, void * src, uint_t length, struct vm_device * dev) { + uint32_t val = 0; - PrintDebug("vnic_write: port:0x%x (%u bytes): 0x%x\n", port,length, val); + PrintDebug("vnic_write: port:0x%x (%u bytes): 0x%x\n", port,length, val); + memcpy(&val, src, length); - return length; + return length; } -static int vnic_start_device(struct vm_device *dev) -{ - PrintDebug("vnic: start device\n"); - - return 0; +static int vnic_start_device(struct vm_device * dev) { + PrintDebug("vnic: start device\n"); + return 0; } -static int vnic_stop_device(struct vm_device *dev) -{ - PrintDebug("vnic: stop device\n"); - - return 0; +static int vnic_stop_device(struct vm_device * dev) { + PrintDebug("vnic: stop device\n"); + return 0; } -static void init_phy_network() -{ - - V3_REGISTER_PKT_DELIVERY(&netif_input); - +static void init_phy_network() { + V3_REGISTER_PKT_DELIVERY(&netif_input); } -static int vnic_init_device(struct vm_device * dev) -{ +static int vnic_init_device(struct vm_device * dev) { int i; PrintDebug("vnic: init_device\n"); @@ -931,9 +972,10 @@ static int vnic_init_device(struct vm_device * dev) current_vnic = dev; - for (i = 0; i < 16; i++){ - v3_dev_hook_io(dev, NIC_BASE_ADDR + i, &vnic_ioport_read, &vnic_ioport_write); + for (i = 0; i < 16; i++) { + v3_dev_hook_io(dev, NIC_BASE_ADDR + i, &vnic_ioport_read, &vnic_ioport_write); } + v3_dev_hook_io(dev, NIC_BASE_ADDR + NIC_DATA_PORT, &vnic_data_read, &vnic_data_write); v3_dev_hook_io(dev, NIC_BASE_ADDR + NIC_RESET_PORT, &vnic_reset_port_read, &vnic_reset_port_write); @@ -942,42 +984,40 @@ static int vnic_init_device(struct vm_device * dev) -static int vnic_deinit_device(struct vm_device *dev) -{ - int i; +static int vnic_deinit_device(struct vm_device * dev) { + int i; - for (i = 0; i<16; i++){ + for (i = 0; i < 16; i++){ v3_dev_unhook_io(dev, NIC_BASE_ADDR + i); - } + } - v3_dev_unhook_io(dev, NIC_BASE_ADDR + NIC_DATA_PORT); - v3_dev_unhook_io(dev, NIC_BASE_ADDR + NIC_RESET_PORT); + v3_dev_unhook_io(dev, NIC_BASE_ADDR + NIC_DATA_PORT); + v3_dev_unhook_io(dev, NIC_BASE_ADDR + NIC_RESET_PORT); - //vnic_reset_device(dev); + //vnic_reset_device(dev); - return 0; + return 0; } static struct vm_device_ops dev_ops = { - .init = vnic_init_device, - .deinit = vnic_deinit_device, - .reset = vnic_reset_device, - .start = vnic_start_device, - .stop = vnic_stop_device, + .init = vnic_init_device, + .deinit = vnic_deinit_device, + .reset = vnic_reset_device, + .start = vnic_start_device, + .stop = vnic_stop_device, }; -struct vm_device *v3_create_vnic() -{ - struct nic_context * nic_state = V3_Malloc(sizeof(struct nic_context)); +struct vm_device * v3_create_vnic() { + struct nic_context * nic_state = V3_Malloc(sizeof(struct nic_context)); - //memset(nic_state, 0, sizeof(struct nic_context)); + //memset(nic_state, 0, sizeof(struct nic_context)); - //PrintDebug("VNIC internal at %x\n",(int)nic_state); + //PrintDebug("VNIC internal at %x\n",(int)nic_state); - struct vm_device *device = v3_create_device("VNIC", &dev_ops, nic_state); + struct vm_device *device = v3_create_device("VNIC", &dev_ops, nic_state); - return device; + return device; }