diff options
author | julian <julian@FreeBSD.org> | 2000-11-15 12:05:21 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 2000-11-15 12:05:21 +0000 |
commit | 1d057a35b4040f11815794dae2c1747a2fe893ed (patch) | |
tree | 8750a7c1ab4614cca76e41a9af5f5f56e0a4a751 /share | |
parent | e8e772bc307dea1a4ed87571b7d501acf796af0d (diff) | |
download | FreeBSD-src-1d057a35b4040f11815794dae2c1747a2fe893ed.zip FreeBSD-src-1d057a35b4040f11815794dae2c1747a2fe893ed.tar.gz |
Slight cleanups after comments from John Hay (Thanks!)
Also add more comments.
Diffstat (limited to 'share')
-rwxr-xr-x | share/examples/drivers/make_device_driver.sh | 73 |
1 files changed, 54 insertions, 19 deletions
diff --git a/share/examples/drivers/make_device_driver.sh b/share/examples/drivers/make_device_driver.sh index 597e1a8..8057464 100755 --- a/share/examples/drivers/make_device_driver.sh +++ b/share/examples/drivers/make_device_driver.sh @@ -334,8 +334,10 @@ ${1}_isa_identify (driver_t *driver, device_t parent) /* XXX look at dev/acpica/acpi_isa.c for use of ISA_ADD_CONFIG() macro */ /* XXX What is ISA_SET_CONFIG_CALLBACK(parent, child, pnpbios_set_config, 0) ?*/ for (i = 0; i < MAXHINTS; i++) { - if (((ioport = res[i].ioport) == 0) - && ((irq = res[i].irq) == 0)) { + + ioport = res[i].ioport; + irq = res[i].irq; + if ((ioport == 0) && (irq == 0)) { return; /* we've added all our local hints */ } @@ -393,6 +395,14 @@ ${1}_isa_probe (device_t device) * error == ENXIO, It is a PNP device but not in out table. * error == ENOENT, I is not a PNP device.. try heuristic probes. * -- logic from if_ed_isa.c, added info from isa/isa_if.m: + * + * If we had a list of devices that we could handle really well, + * and a list which we could handle only basic functions, then + * we would call this twice, once for each list, + * and return a value of '-2' or something if we could + * only handle basic functions. This would allow a specific + * Widgetplus driver to make a better offer if it knows how to + * do all the extended functions. (see non-pnp part for more info) */ error = ISA_PNP_PROBE(parent, device, ${1}_ids); switch (error) { @@ -409,30 +419,43 @@ ${1}_isa_probe (device_t device) * in case we are looking for an old pre-PNP card. * * Hopefully the 'identify' routine will have picked these - * up for us first. + * up for us first if they use some proprietary detection + * method. * - * The ports etc should come from a 'hints' section + * The ports, irqs etc should come from a 'hints' section * which is read in by code in isa/isahint.c * and kern/subr_bus.c to create resource entries, * or have been added by the 'identify routine above. - * - * First make a temporary resource reservation. + * Note that HINTS based resourse requests have NO + * SIZE for the memory or ports requests (just a base) + * so we may need to 'correct' this before we + * do any probing. + */ + /* + * find out the values of any resources we + * need for our dumb probe. Also check we have enough ports + * in the request. (could be hints based). + * Should probably do the same for memory regions too. + */ + error = bus_get_resource(device, SYS_RES_IOPORT, 0, + &port_start, &port_count); + if (port_count != NUMPORTS) { + bus_set_resource(device, SYS_RES_IOPORT, 0, + port_start, NUMPORTS); + } + + /* + * Make a temporary resource reservation. * If we can't get the resources we need then * we need to abort. Possibly this indicates - * the resources were used by another device. + * the resources were used by another device + * in which case the probe would have failed anyhow. */ if ((error = (${1}_allocate_resources(device)))) { error = ENXIO; goto errexit; } - /* - * find out the values of any resources we - * need for our dumb probe. - */ - error = bus_get_resource(device, SYS_RES_IOPORT, 0, - &port_start, &port_count); - /* dummy heuristic type probe */ if ( inb(port_start) != EXPECTED_VALUE) { /* @@ -452,14 +475,16 @@ ${1}_isa_probe (device_t device) error = bus_set_resource(device, SYS_RES_MEMORY, /*rid*/0, membase, memsize); /* - * We found one.. + * We found one, return non-positive numbers.. + * Return -N if we cant handle it, but not well. * Return -2 if we would LIKE the device * Return -1 if we want it a lot * Return 0 if we MUST get the device * This allows drivers to 'bid' for a device. */ device_set_desc(device, "ACME Widget model 1234"); - error = 0; /* we really want it */ + error = -1; /* we want it but someone else + may be even better */ } /* * Unreserve the resources for now because @@ -551,6 +576,16 @@ static struct _pcsid { 0x00000000, NULL } }; +/* + * See if this card is specifically mentionned in our list of known devices. + * Theoretically we might also put in a weak bid for some devices that + * report themselves o be some generic type of device if we can handle + * that generic type. (other PCI_XXX calls give that info). + * This would allow a specific driver to over-ride us. + * + * See the comments in the ISA section regarding returning non-positive + * values from probe routines. + */ static int ${1}_pci_probe (device_t device) { @@ -561,7 +596,7 @@ ${1}_pci_probe (device_t device) ++ep; if (ep->desc) { device_set_desc(device, ep->desc); - return 0; + return 0; /* If there may be a better driver, return -2 */ } else { return ENXIO; } @@ -738,12 +773,12 @@ ${1}_deallocate_resources(device_t device) scp->rid_ioport, scp->res_ioport); scp->res_ioport = 0; } - if (scp->res_ioport != 0) { + if (scp->res_memory != 0) { bus_deactivate_resource(device, SYS_RES_MEMORY, scp->rid_memory, scp->res_memory); bus_release_resource(device, SYS_RES_MEMORY, scp->rid_memory, scp->res_memory); - scp->res_ioport = 0; + scp->res_memory = 0; } if (scp->res_drq != 0) { bus_deactivate_resource(device, SYS_RES_DRQ, |