X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/ec2d61895a6b60afbed9661240d868405310dc7f..8e7d9af004f36ed0d2dc94d1e8254e2ff5a32503:/pci/pci-bother.c?ds=inline diff --git a/pci/pci-bother.c b/pci/pci-bother.c index 0c3c0ec..bc6429a 100644 --- a/pci/pci-bother.c +++ b/pci/pci-bother.c @@ -1,8 +1,20 @@ +/* pci-bother.c + * PCI bothering code + * NetWatch system management mode administration console + * + * Copyright (c) 2008 Jacob Potter and Joshua Wise. All rights reserved. + * This program is free software; you can redistribute and/or modify it under + * the terms found in the file LICENSE in the root of this source tree. + * + */ + #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 +22,8 @@ static int nbothers = 0; int pci_bother_add(pci_dev_t *dev) { + int i; + if (nbothers == MAX_BOTHERS) return -1; @@ -18,6 +32,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 +42,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]); + } }