diff options
author | Matthew N. Dodd <mdodd@FreeBSD.org> | 2003-04-16 03:15:08 +0000 |
---|---|---|
committer | Matthew N. Dodd <mdodd@FreeBSD.org> | 2003-04-16 03:15:08 +0000 |
commit | c047e5b1a9d3c13f345a17a28dbb2569ad68d123 (patch) | |
tree | cf23c71c7e34af0cfac5b28b2ffe945c0e186ffe /sys/dev/pci/pci.c | |
parent | 9dc7076193d52c5eaaa7fd0820ebc0956291541b (diff) | |
download | src-c047e5b1a9d3c13f345a17a28dbb2569ad68d123.tar.gz src-c047e5b1a9d3c13f345a17a28dbb2569ad68d123.zip |
Return status for PCI methods '{enable,disable}_{io,busmaster}'.
Reviewed by: imp
Notes
Notes:
svn path=/head/; revision=113544
Diffstat (limited to 'sys/dev/pci/pci.c')
-rw-r--r-- | sys/dev/pci/pci.c | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index 51fe63b9440f..372a08278c1a 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -568,42 +568,81 @@ pci_clear_command_bit(device_t dev, device_t child, u_int16_t bit) PCI_WRITE_CONFIG(dev, child, PCIR_COMMAND, command, 2); } -void +int pci_enable_busmaster_method(device_t dev, device_t child) { pci_set_command_bit(dev, child, PCIM_CMD_BUSMASTEREN); + return (0); } -void +int pci_disable_busmaster_method(device_t dev, device_t child) { pci_clear_command_bit(dev, child, PCIM_CMD_BUSMASTEREN); + return (0); } -void +int pci_enable_io_method(device_t dev, device_t child, int space) { + u_int16_t command; + u_int16_t bit; + char *error; + + bit = 0; + error = NULL; + switch(space) { case SYS_RES_IOPORT: - pci_set_command_bit(dev, child, PCIM_CMD_PORTEN); + bit = PCIM_CMD_PORTEN; + error = "port"; break; case SYS_RES_MEMORY: - pci_set_command_bit(dev, child, PCIM_CMD_MEMEN); + bit = PCIM_CMD_MEMEN; + error = "memory"; + break; + default: + return (EINVAL); break; } + pci_set_command_bit(dev, child, bit); + command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2); + if (command & bit) + return (0); + device_printf(child, "failed to enable %s mapping!\n", error); + return (ENXIO); } -void +int pci_disable_io_method(device_t dev, device_t child, int space) { + u_int16_t command; + u_int16_t bit; + char *error; + + bit = 0; + error = NULL; + switch(space) { case SYS_RES_IOPORT: - pci_clear_command_bit(dev, child, PCIM_CMD_PORTEN); + bit = PCIM_CMD_PORTEN; + error = "port"; break; case SYS_RES_MEMORY: - pci_clear_command_bit(dev, child, PCIM_CMD_MEMEN); + bit = PCIM_CMD_MEMEN; + error = "memory"; + break; + default: + return (EINVAL); break; } + pci_clear_command_bit(dev, child, bit); + command = PCI_READ_CONFIG(dev, child, PCIR_COMMAND, 2); + if (command & bit) { + device_printf(child, "failed to disable %s mapping!\n", error); + return (ENXIO); + } + return (0); } /* @@ -1326,7 +1365,8 @@ pci_alloc_resource(device_t dev, device_t child, int type, int *rid, * Enable the I/O mode. We should also be allocating * resources too. XXX */ - PCI_ENABLE_IO(dev, child, type); + if (PCI_ENABLE_IO(dev, child, type)) + return (NULL); break; } } |