Make the ISA bus keep track of more PNP details.  Plus a minor style
fix while I'm here.  More could be done here, but except for some SBCs
that don't have ACPI, there's limited value to anybody in doing so.
This commit is contained in:
imp 2008-11-02 18:48:54 +00:00
parent e0025a35ca
commit e4a289ae9d
5 changed files with 34 additions and 6 deletions

View File

@ -699,9 +699,10 @@ pnpbios_identify(driver_t *driver, device_t parent)
(!(pd->attrib & PNPATTR_NOCONFIG) &&
PNPATTR_CONFIG(pd->attrib) != PNPATTR_CONFIG_STATIC)
? ISACFGATTR_DYNAMIC : 0);
isa_set_pnpbios_handle(dev, pd->handle);
ISA_SET_CONFIG_CALLBACK(parent, dev, pnpbios_set_config, 0);
pnp_parse_resources(dev, &pd->devdata[0],
pd->size - sizeof(struct pnp_sysdev), 0);
pd->size - sizeof(struct pnp_sysdev), 0);
if (!device_get_desc(dev))
device_set_desc_copy(dev, pnp_eisaformat(pd->devid));

View File

@ -467,9 +467,6 @@ isa_assign_resources(device_t child)
return (0);
}
/*
* Called after other devices have initialised to probe for isa devices.
*/
void
isa_probe_children(device_t dev)
{
@ -762,6 +759,18 @@ isa_read_ivar(device_t bus, device_t dev, int index, uintptr_t * result)
*result = idev->id_config_attr;
break;
case ISA_IVAR_PNP_CSN:
*result = idev->id_pnp_csn;
break;
case ISA_IVAR_PNP_LDN:
*result = idev->id_pnp_ldn;
break;
case ISA_IVAR_PNPBIOS_HANDLE:
*result = idev->id_pnpbios_handle;
break;
default:
return (ENOENT);
}
@ -1026,6 +1035,13 @@ static int
isa_child_location_str(device_t bus, device_t child, char *buf,
size_t buflen)
{
#if 0
/* id_pnphandle isn't there yet */
struct isa_device *idev = DEVTOISA(child);
if (idev->id_vendorid)
snprintf(buf, buflen, "pnphandle=%d", idev->id_pnphandle);
#endif
/* Nothing here yet */
*buf = '\0';
return (0);

View File

@ -56,6 +56,9 @@ struct isa_device {
isa_config_cb *id_config_cb; /* callback function */
void *id_config_arg; /* callback argument */
int id_config_attr; /* pnp config attributes */
int id_pnpbios_handle; /* pnp handle, if any */
int id_pnp_csn; /* pnp Card Number */
int id_pnp_ldn; /* pnp Logical device on card */
};
#define DEVTOISA(dev) ((struct isa_device *) device_get_ivars(dev))

View File

@ -48,7 +48,7 @@ typedef void isa_config_cb(void *arg, struct isa_config *config, int enable);
#define ISA_ORDER_PNPBIOS 10 /* plug-and-play BIOS inflexible hardware */
#define ISA_ORDER_SENSITIVE 20 /* legacy sensitive hardware */
#define ISA_ORDER_SPECULATIVE 30 /* legacy non-sensitive hardware */
#define ISA_ORDER_PNP 40 /* plug-and-play hardware */
#define ISA_ORDER_PNP 40 /* plug-and-play flexible hardware */
/*
* Limits on resources that we can manage
@ -125,7 +125,10 @@ enum isa_device_ivars {
ISA_IVAR_SERIAL,
ISA_IVAR_LOGICALID,
ISA_IVAR_COMPATID,
ISA_IVAR_CONFIGATTR
ISA_IVAR_CONFIGATTR,
ISA_IVAR_PNP_CSN,
ISA_IVAR_PNP_LDN,
ISA_IVAR_PNPBIOS_HANDLE
};
/*
@ -152,6 +155,9 @@ ISA_ACCESSOR(serial, SERIAL, int)
ISA_ACCESSOR(logicalid, LOGICALID, int)
ISA_ACCESSOR(compatid, COMPATID, int)
ISA_ACCESSOR(configattr, CONFIGATTR, int)
ISA_ACCESSOR(pnp_csn, PNP_CSN, int)
ISA_ACCESSOR(pnp_ldn, PNP_LDN, int)
ISA_ACCESSOR(pnpbios_handle, PNPBIOS_HANDLE, int)
/* Device class for ISA bridges. */
extern devclass_t isab_devclass;

View File

@ -522,6 +522,8 @@ pnp_create_devices(device_t parent, pnp_id *p, int csn,
csnldn->ldn = ldn;
ISA_SET_CONFIG_CALLBACK(parent, dev, pnp_set_config,
csnldn);
isa_set_pnp_csn(dev, csn);
isa_set_pnp_ldn(dev, ldn);
ldn++;
startres = resp;
break;