isa(4) is an indirect bus, which means that drivers that attach to it
need to provide an xxxprobe() method instead of an xxxmatch() method.
The critical difference is xxxprobe() is given a device softc for the
second argument, whereas a xxxmatch() is given the cfdata as the
second argument.
However, a number of our ISA device drivers treat the second argument
as a cfdata instead of a softc. Diff below addresses this. (Only
complication: unlike isa(4), isapnp(4) is a direct bus, and if_we.c
used the same probe/match code for both.)
Does this look right? (Compile tested on i386, but I don't have any
ISA hardware, and I'm not having any luck with qemu's "isapc" machine
at the moment...)
Index: if_lc_isa.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/isa/if_lc_isa.c,v
retrieving revision 1.8
diff -u -p -r1.8 if_lc_isa.c
--- if_lc_isa.c 10 Aug 2009 22:08:04 -0000 1.8
+++ if_lc_isa.c 14 Jun 2011 05:38:30 -0000
@@ -182,7 +182,7 @@ lemac_isa_probe(parent, match, aux)
void *aux;
{
struct isa_attach_args *ia = aux;
- struct cfdata *cf = match;
+ struct cfdata *cf = ((struct device *)match)->dv_cfdata;
struct lemac_softc sc;
snprintf(sc.sc_dv.dv_xname, sizeof sc.sc_dv.dv_xname, "%s%d",
Index: if_we.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/isa/if_we.c,v
retrieving revision 1.20
diff -u -p -r1.20 if_we.c
--- if_we.c 26 Jun 2008 05:42:16 -0000 1.20
+++ if_we.c 14 Jun 2011 05:41:34 -0000
@@ -110,6 +110,7 @@ struct we_softc {
};
int we_probe(struct device *, void *, void *);
+int we_match(struct device *, void *, void *);
void we_attach(struct device *, struct device *, void *);
struct cfattach we_isa_ca = {
@@ -118,7 +119,7 @@ struct cfattach we_isa_ca = {
#if NWE_ISAPNP
struct cfattach we_isapnp_ca = {
- sizeof(struct we_softc), we_probe, we_attach
+ sizeof(struct we_softc), we_match, we_attach
};
#endif /* NWE_ISAPNP */
@@ -185,6 +186,14 @@ do { \
int
we_probe(struct device *parent, void *match, void *aux)
+{
+ struct cfdata *cf = ((struct device *)match)->dv_cfdata;
+
+ return (we_match(parent, cf, aux));
+}
+
+int
+we_match(struct device *parent, void *match, void *aux)
{
struct isa_attach_args *ia = aux;
struct cfdata *cf = match;
Index: radiotrack2.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/isa/radiotrack2.c,v
retrieving revision 1.3
diff -u -p -r1.3 radiotrack2.c
--- radiotrack2.c 7 Jan 2002 18:32:19 -0000 1.3
+++ radiotrack2.c 14 Jun 2011 05:34:52 -0000
@@ -127,7 +127,7 @@ rtii_probe(struct device *parent, void *
struct isa_attach_args *ia = aux;
bus_space_tag_t iot = ia->ia_iot;
bus_space_handle_t ioh;
- struct cfdata *cf = match;
+ struct cfdata *cf = ((struct device *)match)->dv_cfdata;
int iosize = 1, iobase = ia->ia_iobase;
if (!RTII_BASE_VALID(iobase)) {
Index: sf16fmr2.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/isa/sf16fmr2.c,v
retrieving revision 1.6
diff -u -p -r1.6 sf16fmr2.c
--- sf16fmr2.c 15 Oct 2002 15:00:11 -0000 1.6
+++ sf16fmr2.c 14 Jun 2011 05:34:32 -0000
@@ -140,7 +140,7 @@ sf2r_probe(struct device *parent, void *
struct isa_attach_args *ia = aux;
bus_space_tag_t iot = ia->ia_iot;
bus_space_handle_t ioh;
- struct cfdata *cf = match;
+ struct cfdata *cf = ((struct device *)match)->dv_cfdata;
int iosize = 1, iobase = ia->ia_iobase;
if (!SF16FMR2_BASE_VALID(iobase)) {
Index: wdc_isa.c
===================================================================
RCS file: /home/mdempsky/anoncvs/cvs/src/sys/dev/isa/wdc_isa.c,v
retrieving revision 1.14
diff -u -p -r1.14 wdc_isa.c
--- wdc_isa.c 9 May 2011 22:33:54 -0000 1.14
+++ wdc_isa.c 14 Jun 2011 05:34:05 -0000
@@ -83,7 +83,7 @@ wdc_isa_probe(struct device *parent, voi
{
struct channel_softc ch;
struct isa_attach_args *ia = aux;
- struct cfdata *cf = match;
+ struct cfdata *cf = ((struct device *)match)->dv_cfdata;
int result = 0;
bzero(&ch, sizeof ch);