Index: sys/dev/pci/pci_map.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/pci_map.c,v retrieving revision 1.23 diff -u -b -r1.23 pci_map.c --- sys/dev/pci/pci_map.c 28 Apr 2008 20:23:55 -0000 1.23 +++ sys/dev/pci/pci_map.c 12 Jun 2008 16:48:09 -0000 @@ -271,6 +271,15 @@ int busflags, bus_space_tag_t *tagp, bus_space_handle_t *handlep, bus_addr_t *basep, bus_size_t *sizep) { + return pci_mapreg_submap(pa, reg, type, busflags, 0, 0, tagp, basep, + sizep); +} + +int +pci_mapreg_submap(struct pci_attach_args *pa, int reg, pcireg_t type, + int busflags, bus_size_t maxsize, bus_size_t offset, bus_space_tag_t *tagp, + bus_space_handle_t *handlep, bus_addr_t *basep, bus_size_t *sizep) +{ bus_space_tag_t tag; bus_space_handle_t handle; bus_addr_t base; @@ -304,7 +313,17 @@ splx(s); } - if (bus_space_map(tag, base, size, busflags | flags, &handle)) + /* If we're called with maxsize/offset of 0, behave like + * pci_mapreg_map. + */ + + maxsize = maxsize && offset ? maxsize : size; + base += offset; + + if ((maxsize < size && offset + maxsize <= size) || offset != 0) + return (1); + + if (bus_space_map(tag, base, maxsize, busflags | flags, &handle)) return (1); if (tagp != 0) @@ -314,7 +333,7 @@ if (basep != 0) *basep = base; if (sizep != 0) - *sizep = size; + *sizep = maxsize; return (0); }