summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u
diff options
context:
space:
mode:
authorZhi-Jun Robin Fu <Zhijun.Fu@Sun.COM>2010-04-22 15:10:46 +0800
committerZhi-Jun Robin Fu <Zhijun.Fu@Sun.COM>2010-04-22 15:10:46 +0800
commit8d7fafffed373567f52062b634e61fd50858b8d9 (patch)
treecb77823b1668cdc1d8277f0e4ffa5858f2a721fc /usr/src/uts/sun4u
parentc6698ca1e2450f37cc5ee4cdded3e5472088ba41 (diff)
downloadillumos-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.c33
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,