diff options
| author | Zhi-Jun Robin Fu <Zhijun.Fu@Sun.COM> | 2010-04-22 15:10:46 +0800 |
|---|---|---|
| committer | Zhi-Jun Robin Fu <Zhijun.Fu@Sun.COM> | 2010-04-22 15:10:46 +0800 |
| commit | 8d7fafffed373567f52062b634e61fd50858b8d9 (patch) | |
| tree | cb77823b1668cdc1d8277f0e4ffa5858f2a721fc /usr/src/uts/sun4u | |
| parent | c6698ca1e2450f37cc5ee4cdded3e5472088ba41 (diff) | |
| download | illumos-joyent-8d7fafffed373567f52062b634e61fd50858b8d9.tar.gz | |
6910668 the code for 6831378 should do better error handling
Diffstat (limited to 'usr/src/uts/sun4u')
| -rw-r--r-- | usr/src/uts/sun4u/io/pciex/pci_cfgacc_4u.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/usr/src/uts/sun4u/io/pciex/pci_cfgacc_4u.c b/usr/src/uts/sun4u/io/pciex/pci_cfgacc_4u.c index 65296bec24..9d12a74ce6 100644 --- a/usr/src/uts/sun4u/io/pciex/pci_cfgacc_4u.c +++ b/usr/src/uts/sun4u/io/pciex/pci_cfgacc_4u.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. */ #include <sys/sunddi.h> @@ -43,11 +42,16 @@ static boolean_t pci_cfgacc_valid(pci_cfgacc_req_t *req) { - /* do not support 64 bit pci config space access */ - return (IS_P2ALIGNED(req->offset, req->size) && + int sz = req->size; + + if (IS_P2ALIGNED(req->offset, sz) && (req->offset < PCIE_CFG_SPACE_SIZE) && - ((req->size == 1) || (req->size == 2) || - (req->size == 4) || (req->size == 8))); + ((sz & 0xf) && ISP2(sz))) + return (B_TRUE); + + cmn_err(CE_WARN, "illegal PCI request: offset = %x, size = %d", + req->offset, sz); + return (B_FALSE); } /* @@ -60,8 +64,8 @@ pci_cfgacc_get(dev_info_t *dip, uint16_t bdf, uint16_t offset, uint8_t size) uint64_t base_addr; uint64_t val; - if ((bus_p = PCIE_DIP2DOWNBUS(dip)) == NULL) - return ((uint64_t)-1); + bus_p = PCIE_DIP2DOWNBUS(dip); + ASSERT(bus_p != NULL); base_addr = bus_p->bus_cfgacc_base; base_addr += RC_BDF_TO_CFGADDR(bdf, offset); @@ -93,8 +97,8 @@ pci_cfgacc_set(dev_info_t *dip, uint16_t bdf, uint16_t offset, uint8_t size, pcie_bus_t *bus_p; uint64_t base_addr; - if ((bus_p = PCIE_DIP2DOWNBUS(dip)) == NULL) - return; + bus_p = PCIE_DIP2DOWNBUS(dip); + ASSERT(bus_p != NULL); base_addr = bus_p->bus_cfgacc_base; base_addr += RC_BDF_TO_CFGADDR(bdf, offset); @@ -122,12 +126,11 @@ pci_cfgacc_set(dev_info_t *dip, uint16_t bdf, uint16_t offset, uint8_t size, void pci_cfgacc_acc(pci_cfgacc_req_t *req) { - /* is request valid? */ - if (!pci_cfgacc_valid(req)) { - if (!req->write) - VAL64(req) = (uint64_t)-1; + if (!req->write) + VAL64(req) = (uint64_t)-1; + + if (!pci_cfgacc_valid(req)) return; - } if (req->write) { pci_cfgacc_set(req->rcdip, req->bdf, req->offset, |
