X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/d6f56afa7470cf4c29f4f9fa4bf2dd1bd0ba9193..39f6725f8beebcda1b569aebdfb2c90975f3179b:/pci/pci-bother.c?ds=sidebyside diff --git a/pci/pci-bother.c b/pci/pci-bother.c index dd1ff21..f05c417 100644 --- a/pci/pci-bother.c +++ b/pci/pci-bother.c @@ -4,6 +4,7 @@ struct pci_bother { int bus, dev, fn; unsigned short origstate; + unsigned long origbars[6]; }; static struct pci_bother bothers[MAX_BOTHERS]; @@ -11,6 +12,8 @@ static int nbothers = 0; int pci_bother_add(pci_dev_t *dev) { + int i; + if (nbothers == MAX_BOTHERS) return -1; @@ -19,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++; @@ -27,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, 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, 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]); + } }