From ac7452631f13ef6bbb59e825e8e3ebb14d8e9a46 Mon Sep 17 00:00:00 2001 From: mdodd Date: Wed, 16 Apr 2003 03:15:08 +0000 Subject: Return status for PCI methods '{enable,disable}_{io,busmaster}'. Reviewed by: imp --- sys/dev/pci/pci.c | 58 +++++++++++++++++++++++++++++++++++++++-------- sys/dev/pci/pci_if.m | 8 +++---- sys/dev/pci/pci_private.h | 8 +++---- sys/dev/pci/pcivar.h | 16 ++++++------- 4 files changed, 65 insertions(+), 25 deletions(-) (limited to 'sys/dev/pci') diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index 51fe63b..372a082 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; } } diff --git a/sys/dev/pci/pci_if.m b/sys/dev/pci/pci_if.m index 8dab04e..bd19565 100644 --- a/sys/dev/pci/pci_if.m +++ b/sys/dev/pci/pci_if.m @@ -56,23 +56,23 @@ METHOD int set_powerstate { int state; }; -METHOD void enable_busmaster { +METHOD int enable_busmaster { device_t dev; device_t child; }; -METHOD void disable_busmaster { +METHOD int disable_busmaster { device_t dev; device_t child; }; -METHOD void enable_io { +METHOD int enable_io { device_t dev; device_t child; int space; }; -METHOD void disable_io { +METHOD int disable_io { device_t dev; device_t child; int space; diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h index 1064997..f0387d0 100644 --- a/sys/dev/pci/pci_private.h +++ b/sys/dev/pci/pci_private.h @@ -54,10 +54,10 @@ u_int32_t pci_read_config_method(device_t dev, device_t child, int reg, int width); void pci_write_config_method(device_t dev, device_t child, int reg, u_int32_t val, int width); -void pci_enable_busmaster_method(device_t dev, device_t child); -void pci_disable_busmaster_method(device_t dev, device_t child); -void pci_enable_io_method(device_t dev, device_t child, int space); -void pci_disable_io_method(device_t dev, device_t child, int space); +int pci_enable_busmaster_method(device_t dev, device_t child); +int pci_disable_busmaster_method(device_t dev, device_t child); +int pci_enable_io_method(device_t dev, device_t child, int space); +int pci_disable_io_method(device_t dev, device_t child, int space); struct resource *pci_alloc_resource(device_t dev, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags); diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h index 45df9e4..53ad3a0 100644 --- a/sys/dev/pci/pcivar.h +++ b/sys/dev/pci/pcivar.h @@ -249,28 +249,28 @@ PCIB_ACCESSOR(bus, BUS, u_int32_t) * These should be used in preference to manually manipulating * configuration space. */ -static __inline void +static __inline int pci_enable_busmaster(device_t dev) { - PCI_ENABLE_BUSMASTER(device_get_parent(dev), dev); + return(PCI_ENABLE_BUSMASTER(device_get_parent(dev), dev)); } -static __inline void +static __inline int pci_disable_busmaster(device_t dev) { - PCI_DISABLE_BUSMASTER(device_get_parent(dev), dev); + return(PCI_DISABLE_BUSMASTER(device_get_parent(dev), dev)); } -static __inline void +static __inline int pci_enable_io(device_t dev, int space) { - PCI_ENABLE_IO(device_get_parent(dev), dev, space); + return(PCI_ENABLE_IO(device_get_parent(dev), dev, space)); } -static __inline void +static __inline int pci_disable_io(device_t dev, int space) { - PCI_DISABLE_IO(device_get_parent(dev), dev, space); + return(PCI_DISABLE_IO(device_get_parent(dev), dev, space)); } /* -- cgit v1.1