summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/pci.c
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>2000-12-09 09:15:38 +0000
committermsmith <msmith@FreeBSD.org>2000-12-09 09:15:38 +0000
commitc174181f432119d1dae3f5e58ecc14c8d7b6f545 (patch)
tree778814cdc635e7529f9fbfe4aa3c4e514721437b /sys/dev/pci/pci.c
parent27cc24d5300b6a98af9deb85109f95f0685fe01e (diff)
downloadFreeBSD-src-c174181f432119d1dae3f5e58ecc14c8d7b6f545.zip
FreeBSD-src-c174181f432119d1dae3f5e58ecc14c8d7b6f545.tar.gz
- Fix the device database parsing code so that it actually works.
- Improve the formatting for devices identified by the database. - Fix the pcib_route_interrupt method definition, as an old version snuck in here somehow 8( - Remove a couple of the vendor/device IDs for PCI:ISA bridges which correctly identify themselves. Submitted by: peter
Diffstat (limited to 'sys/dev/pci/pci.c')
-rw-r--r--sys/dev/pci/pci.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 4699069..4395646 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -1149,7 +1149,7 @@ pci_probe_nomatch(device_t dev, device_t child)
* Look for a listing for this device in a loaded device database.
*/
if ((device = pci_describe_device(child)) != NULL) {
- printf("<%s>", device);
+ device_printf(dev, "<%s>", device);
free(device, M_DEVBUF);
} else {
/*
@@ -1209,26 +1209,42 @@ static int
pci_describe_parse_line(char **ptr, int *vendor, int *device, char **desc)
{
char *cp = *ptr;
+ int left;
*device = -1;
*vendor = -1;
- *desc = NULL;
+ **desc = '\0';
for (;;) {
- if ((cp - pci_vendordata) >= pci_vendordata_size)
+ left = pci_vendordata_size - (cp - pci_vendordata);
+ if (left <= 0) {
+ *ptr = cp;
return(1);
+ }
/* vendor entry? */
- if (sscanf(cp, "%x\t%80[^\n]", vendor, *desc) == 2)
+ if (*cp != '\t' && sscanf(cp, "%x\t%80[^\n]", vendor, *desc) == 2)
break;
/* device entry? */
- if (sscanf(cp, "\t%x\t%80[^\n]", device, *desc) == 2)
+ if (*cp == '\t' && sscanf(cp, "%x\t%80[^\n]", device, *desc) == 2)
break;
/* skip to next line */
- while (*cp != '\n')
+ while (*cp != '\n' && left > 0) {
+ cp++;
+ left--;
+ }
+ if (*cp == '\n') {
cp++;
+ left--;
+ }
+ }
+ /* skip to next line */
+ while (*cp != '\n' && left > 0) {
cp++;
+ left--;
}
+ if (*cp == '\n' && left > 0)
+ cp++;
*ptr = cp;
return(0);
}
@@ -1262,8 +1278,10 @@ pci_describe_device(device_t dev)
if ((dp = malloc(80, M_DEVBUF, M_NOWAIT)) == NULL)
goto out;
for (;;) {
- if (pci_describe_parse_line(&line, &vendor, &device, &dp))
- goto out;
+ if (pci_describe_parse_line(&line, &vendor, &device, &dp)) {
+ *dp = 0;
+ break;
+ }
if (vendor != -1) {
*dp = 0;
break;
@@ -1271,8 +1289,10 @@ pci_describe_device(device_t dev)
if (device == pci_get_device(dev))
break;
}
+ if (dp[0] == '\0')
+ snprintf(dp, 80, "0x%x", pci_get_device(dev));
if ((desc = malloc(strlen(vp) + strlen(dp) + 3, M_DEVBUF, M_NOWAIT)) != NULL)
- sprintf(desc, "%s%s%s", vp, (dp[0] != 0) ? ", " : "", dp);
+ sprintf(desc, "%s, %s", vp, dp);
out:
if (vp != NULL)
free(vp, M_DEVBUF);
OpenPOWER on IntegriCloud