summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorse <se@FreeBSD.org>1999-01-19 23:29:20 +0000
committerse <se@FreeBSD.org>1999-01-19 23:29:20 +0000
commit2142e794d720c024a10ed406c58af94d4dd0ab6b (patch)
tree7fe02de1c4a8aa39ce6e7823fa18def84b54a456
parent1b9be3b5a8aed57d7ee12ba5025079529ea33d28 (diff)
downloadFreeBSD-src-2142e794d720c024a10ed406c58af94d4dd0ab6b.zip
FreeBSD-src-2142e794d720c024a10ed406c58af94d4dd0ab6b.tar.gz
Fix problem with zero valued map registers followed by valid map entries.
The previous code just ignored the invalid map register, but this gave surprising results because of the way pci_map_port() associated the map register offset supplied with a map entry in the map array.
-rw-r--r--sys/dev/pci/pci.c3
-rw-r--r--sys/dev/pci/pcivar.h4
-rw-r--r--sys/pci/pci.c3
-rw-r--r--sys/pci/pci_compat.c19
-rw-r--r--sys/pci/pcivar.h4
5 files changed, 19 insertions, 14 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 447570c..73b8142 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pci.c,v 1.91 1998/11/09 08:08:06 peter Exp $
+ * $Id: pci.c,v 1.92 1999/01/12 01:44:42 eivind Exp $
*
*/
@@ -190,6 +190,7 @@ pci_readmaps(pcicfgregs *cfg, int maxmaps)
testval = pci_cfgread(cfg, reg, 4);
pci_cfgwrite(cfg, reg, base, 4);
+ map[j].reg = reg;
map[j].base = pci_mapbase(base);
map[j].type = pci_maptype(base);
map[j].ln2size = pci_mapsize(testval);
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index 15f1478..7843e3a 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pcivar.h,v 1.23 1998/12/14 05:47:29 dillon Exp $
+ * $Id: pcivar.h,v 1.24 1999/01/13 04:59:19 bde Exp $
*
*/
@@ -66,7 +66,7 @@ typedef struct {
#define PCI_MAPPORT 0x04 /* port map */
u_int8_t ln2size;
u_int8_t ln2range;
-/* u_int8_t dummy;*/
+ u_int8_t reg; /* offset of map register in config space */
} pcimap;
/* config header information common to all header types */
diff --git a/sys/pci/pci.c b/sys/pci/pci.c
index 447570c..73b8142 100644
--- a/sys/pci/pci.c
+++ b/sys/pci/pci.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pci.c,v 1.91 1998/11/09 08:08:06 peter Exp $
+ * $Id: pci.c,v 1.92 1999/01/12 01:44:42 eivind Exp $
*
*/
@@ -190,6 +190,7 @@ pci_readmaps(pcicfgregs *cfg, int maxmaps)
testval = pci_cfgread(cfg, reg, 4);
pci_cfgwrite(cfg, reg, base, 4);
+ map[j].reg = reg;
map[j].base = pci_mapbase(base);
map[j].type = pci_maptype(base);
map[j].ln2size = pci_mapsize(testval);
diff --git a/sys/pci/pci_compat.c b/sys/pci/pci_compat.c
index 5ea0d5e..9f4c612 100644
--- a/sys/pci/pci_compat.c
+++ b/sys/pci/pci_compat.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pci_compat.c,v 1.18 1999/01/13 04:59:19 bde Exp $
+ * $Id: pci_compat.c,v 1.19 1999/01/14 06:22:10 jdp Exp $
*
*/
@@ -59,13 +59,16 @@
static int
pci_mapno(pcicfgregs *cfg, int reg)
{
- int map = -1;
- if ((reg & 0x03) == 0) {
- map = (reg -0x10) / 4;
- if (map < 0 || map >= cfg->nummaps)
- map = -1;
- }
- return (map);
+ int i, nummaps;
+ pcimap *map;
+
+ nummaps = cfg->nummaps;
+ map = cfg->map;
+
+ for (i = 0; i < nummaps; i++)
+ if (map[i].reg == reg)
+ return (i);
+ return (-1);
}
static int
diff --git a/sys/pci/pcivar.h b/sys/pci/pcivar.h
index 15f1478..7843e3a 100644
--- a/sys/pci/pcivar.h
+++ b/sys/pci/pcivar.h
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pcivar.h,v 1.23 1998/12/14 05:47:29 dillon Exp $
+ * $Id: pcivar.h,v 1.24 1999/01/13 04:59:19 bde Exp $
*
*/
@@ -66,7 +66,7 @@ typedef struct {
#define PCI_MAPPORT 0x04 /* port map */
u_int8_t ln2size;
u_int8_t ln2range;
-/* u_int8_t dummy;*/
+ u_int8_t reg; /* offset of map register in config space */
} pcimap;
/* config header information common to all header types */
OpenPOWER on IntegriCloud