X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/7a914840b833dba82398623bbde04a1744627398..46486ad5520048346dc360fb8f224bdd4aea74ef:/net/net.c?ds=sidebyside diff --git a/net/net.c b/net/net.c index 575b5e4..7312fde 100644 --- a/net/net.c +++ b/net/net.c @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include #include "net.h" @@ -7,10 +10,72 @@ static struct nic *_nic = 0x0; extern struct pci_driver a3c90x_driver; +static char test[1024] = {0}; + +static char packet[4096] = {0}; + +typedef struct packet_t { + char from[6]; + char to[6]; + unsigned short ethertype; + char data[]; +} packet_t; + +static unsigned char vga_read(unsigned char idx) +{ + outb(CRTC_IDX_REG, idx); + return inb(CRTC_DATA_REG); +} + +static unsigned int vga_base() +{ + return (((unsigned int) vga_read(CRTC_START_ADDR_MSB_IDX)) << 9) + + (((unsigned int) vga_read(CRTC_START_ADDR_LSB_IDX)) << 1); +} + void eth_poll() { - if (_nic) - _nic->poll(_nic, 0); + int i; +// static int c; + static short pos = 0x0; + unsigned short base = vga_base(); + unsigned char *p = (unsigned char *)0xB8000; + smram_state_t old_state; + + if (!_nic) + return; + + if (_nic->poll(_nic, 0)) { + _nic->packet = packet; + _nic->poll(_nic, 1); + + packet_t * p = (packet_t *) packet; + + outputf("NIC: Packet: %d 0x%x", _nic->packetlen, p->ethertype); + if (p->ethertype == 0x3813) { + outputf("NIC: Command: 0x%x", *((uint16_t *)p->data)); + } + } + smram_tseg_set_state(SMRAM_TSEG_OPEN); + old_state = smram_save_state(); + +// if ((c++) % 2) +// return; + + test[0] = pos >> 8; + test[1] = pos & 0xFF; + test[2] = base >> 8; + test[3] = base & 0xFF; + + smram_aseg_set_state(SMRAM_ASEG_SMMCODE); + + for (i = 4; i < 1024; i++) + { + test[i] = p[pos++]; + pos %= 0x8000; + } + smram_restore_state(old_state); + _nic->transmit("\x00\x03\x93\x87\x84\x8C", 0x1337, 1024, test); } int eth_register(struct nic *nic) @@ -23,6 +88,7 @@ int eth_register(struct nic *nic) void eth_init() { - if (pci_probe_driver(a3c90x_driver)) - outputf("found 3c90x, hopefully!"); + /* Required for DMA to work. :( */ + smram_tseg_set_state(SMRAM_TSEG_OPEN); + pci_probe_driver(a3c90x_driver); }