X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/ec2d61895a6b60afbed9661240d868405310dc7f..bec09bd18a879a22688c68febaff8c65da41f752:/pci/pci-bother.c diff --git a/pci/pci-bother.c b/pci/pci-bother.c index 0c3c0ec..f05c417 100644 --- a/pci/pci-bother.c +++ b/pci/pci-bother.c @@ -1,8 +1,10 @@ #include +#include struct pci_bother { int bus, dev, fn; unsigned short origstate; + unsigned long origbars[6]; }; static struct pci_bother bothers[MAX_BOTHERS]; @@ -10,6 +12,8 @@ static int nbothers = 0; int pci_bother_add(pci_dev_t *dev) { + int i; + if (nbothers == MAX_BOTHERS) return -1; @@ -18,6 +22,8 @@ int pci_bother_add(pci_dev_t *dev) bothers[nbothers].fn = dev->fn; bothers[nbothers].origstate = pci_read16(dev->bus, dev->dev, dev->fn, 0x04); + for (i = 0; i < 6; i++) + bothers[nbothers].origbars[i] = pci_read32(dev->bus, dev->dev, dev->fn, 0x10 + i * 4); nbothers++; @@ -26,16 +32,24 @@ int pci_bother_add(pci_dev_t *dev) void pci_bother_all() { - int i; + int i, j; for (i = 0; i < nbothers; i++) - pci_write16(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x0); + { + pci_write16(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x04, 0x0); + for (j = 0; j < 6; j++) + pci_write32(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x10 + j * 4, 0); + } } void pci_unbother_all() { - int i; + int i, j; for (i = 0; i < nbothers; i++) - pci_write16(bothers[i].bus, bothers[i].dev, bothers[i].fn, bothers[i].origstate); + { + pci_write16(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x04, bothers[i].origstate); + for (j = 0; j < 6; j++) + pci_write32(bothers[i].bus, bothers[i].dev, bothers[i].fn, 0x10 + j * 4, bothers[i].origbars[j]); + } }