From: Joshua Wise Date: Thu, 2 Oct 2008 23:23:10 +0000 (-0400) Subject: merge X-Git-Url: http://git.joshuawise.com/netwatch.git/commitdiff_plain/d6f56afa7470cf4c29f4f9fa4bf2dd1bd0ba9193?hp=c61d5f405f2f7fcdcc0a883e18ae7873f4fcd9d7 merge --- diff --git a/aseg/Makefile b/aseg/Makefile index dfedc2a..4072606 100644 --- a/aseg/Makefile +++ b/aseg/Makefile @@ -2,8 +2,9 @@ CC=gcc CFLAGS=-I../include -I../include/raw -nostdlib -nostdinc -fno-builtin -D__RAW__ -Wall -Werror -pedantic -ansi -std=gnu99 OBJS=counter.o firstrun.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o \ - ../ich2/smram-ich2.o ../ich2/smi.o vga-overlay.o packet.o ../lib/sprintf.o \ - ../lib/doprnt.o ../pci/pci.o ../net/net.o ../ich2/ich2-timer.o + ../ich2/smram-ich2.o ../ich2/smi.o vga-overlay.o packet.o \ + ../lib/sprintf.o ../lib/doprnt.o ../pci/pci.o ../net/net.o \ + ../ich2/ich2-timer.o ../pci/pci-bother.o all: aseg.elf diff --git a/aseg/counter.c b/aseg/counter.c index 868ec45..4876acf 100644 --- a/aseg/counter.c +++ b/aseg/counter.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "../net/net.h" #include "vga-overlay.h" #include "packet.h" @@ -96,6 +97,7 @@ void smi_entry(void) pcisave = inl(0xCF8); vgasave = inb(0x3D4); + pci_unbother_all(); counter++; sprintf(statstr, "15-412! %08x %08x", smi_status(), counter); @@ -112,6 +114,7 @@ void smi_entry(void) smi_poll(); + pci_bother_all(); outl(0xCF8, pcisave); outb(0x3D4, vgasave); } diff --git a/include/pci-bother.h b/include/pci-bother.h new file mode 100644 index 0000000..ff71755 --- /dev/null +++ b/include/pci-bother.h @@ -0,0 +1,12 @@ +#ifndef _PCI_BOTHER_H +#define _PCI_BOTHER_H + +#include + +#define MAX_BOTHERS 5 + +extern int pci_bother_add(pci_dev_t *dev); +extern void pci_bother_all(); +extern void pci_unbother_all(); + +#endif diff --git a/net/net.c b/net/net.c index 7f1932f..18eaddf 100644 --- a/net/net.c +++ b/net/net.c @@ -1,9 +1,8 @@ #include +#include #include #include "net.h" -static int found = 0, _bus, _dev, _fn; - struct nic nic; static int bother_3c905(pci_dev_t *dev, void *nutrinus) @@ -12,11 +11,7 @@ static int bother_3c905(pci_dev_t *dev, void *nutrinus) { outputf("Found a 3c905 to bother"); - _bus = dev->bus; - _dev = dev->dev; - _fn = dev->fn; - found = 1; - + pci_bother_add(dev); return 1; } return 0; @@ -24,12 +19,7 @@ static int bother_3c905(pci_dev_t *dev, void *nutrinus) void eth_poll() { - if (!found) - return; - - pci_write16(_bus, _dev, _fn, 0x04, 0xFF); - - pci_write16(_bus, _dev, _fn, 0x04, 0x00); + /* ... */ } void eth_init() diff --git a/pci/pci-bother.c b/pci/pci-bother.c new file mode 100644 index 0000000..dd1ff21 --- /dev/null +++ b/pci/pci-bother.c @@ -0,0 +1,42 @@ +#include +#include + +struct pci_bother { + int bus, dev, fn; + unsigned short origstate; +}; + +static struct pci_bother bothers[MAX_BOTHERS]; +static int nbothers = 0; + +int pci_bother_add(pci_dev_t *dev) +{ + if (nbothers == MAX_BOTHERS) + return -1; + + bothers[nbothers].bus = dev->bus; + bothers[nbothers].dev = dev->dev; + bothers[nbothers].fn = dev->fn; + + bothers[nbothers].origstate = pci_read16(dev->bus, dev->dev, dev->fn, 0x04); + + nbothers++; + + return 0; +} + +void pci_bother_all() +{ + int i; + + for (i = 0; i < nbothers; i++) + pci_write16(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x04, 0x0); +} + +void pci_unbother_all() +{ + int i; + + for (i = 0; i < nbothers; i++) + pci_write16(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x04, bothers[i].origstate); +}