From 0d1aa5f96a850ba0cf8fd63ad83371a0ff327735 Mon Sep 17 00:00:00 2001 From: Miod Vallat Date: Wed, 16 Nov 2005 21:23:56 +0000 Subject: Overhaul the way HP-IB devices are probed. We will now do an exhaustive probe of the (slave, punit) tuple space, since this is the only way we can get a dual disk or dual tape enclosure to attach two devices of the same kind. This allows us to get rid of the hpibbus resource map and related functions. --- sys/arch/hp300/dev/ct.c | 9 ++- sys/arch/hp300/dev/hd.c | 30 ++-------- sys/arch/hp300/dev/hpib.c | 129 ++++++++++++------------------------------- sys/arch/hp300/dev/hpibvar.h | 10 +--- sys/arch/hp300/dev/mt.c | 5 +- 5 files changed, 50 insertions(+), 133 deletions(-) (limited to 'sys/arch/hp300') diff --git a/sys/arch/hp300/dev/ct.c b/sys/arch/hp300/dev/ct.c index 93cfa3eccb0..10b453964a9 100644 --- a/sys/arch/hp300/dev/ct.c +++ b/sys/arch/hp300/dev/ct.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ct.c,v 1.11 2005/01/15 21:13:08 miod Exp $ */ +/* $OpenBSD: ct.c,v 1.12 2005/11/16 21:23:55 miod Exp $ */ /* $NetBSD: ct.c,v 1.21 1997/04/02 22:37:23 scottr Exp $ */ /* @@ -134,7 +134,7 @@ void ctcommand(dev_t, int, int); cdev_decl(ct); bdev_decl(ct); -struct ctinfo { +const struct ctinfo { short hwid; short punit; char *desc; @@ -217,13 +217,12 @@ ctident(parent, sc, ha) /* Is it one of the tapes we support? */ for (id = 0; id < nctinfo; id++) - if (ha->ha_id == ctinfo[id].hwid) + if (ha->ha_id == ctinfo[id].hwid && + ha->ha_punit == ctinfo[id].punit) break; if (id == nctinfo) return (0); - ha->ha_punit = ctinfo[id].punit; - /* * So far, so good. Get drive parameters. Note command * is always issued to unit 0. diff --git a/sys/arch/hp300/dev/hd.c b/sys/arch/hp300/dev/hd.c index 6b2258a068a..9a9a83d01c7 100644 --- a/sys/arch/hp300/dev/hd.c +++ b/sys/arch/hp300/dev/hd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hd.c,v 1.34 2005/11/15 21:09:44 miod Exp $ */ +/* $OpenBSD: hd.c,v 1.35 2005/11/16 21:23:55 miod Exp $ */ /* $NetBSD: rd.c,v 1.33 1997/07/10 18:14:08 kleink Exp $ */ /* @@ -162,13 +162,13 @@ const char *err_info[16] = { NULL }; -int hddebug = 0x80; #define HDB_FOLLOW 0x01 #define HDB_STATUS 0x02 #define HDB_IDENT 0x04 #define HDB_IO 0x08 #define HDB_ASYNC 0x10 #define HDB_ERROR 0x80 +int hddebug = HDB_ERROR | HDB_IDENT; #endif /* @@ -271,28 +271,9 @@ hdmatch(parent, match, aux) struct device *parent; void *match, *aux; { - struct cfdata *cf = match; struct hpibbus_attach_args *ha = aux; - /* - * Set punit if operator specified one in the kernel - * configuration file. - */ - if (cf->hpibbuscf_punit != HPIBBUS_PUNIT_UNK && - cf->hpibbuscf_punit < HPIB_NPUNITS) - ha->ha_punit = cf->hpibbuscf_punit; - - if (hdident(parent, NULL, ha) == 0) { - /* - * XXX Some aging HP-IB drives are slow to - * XXX respond; give them a chance to catch - * XXX up and probe them again. - */ - delay(10000); - ha->ha_id = hpibid(parent->dv_unit, ha->ha_slave); - return (hdident(parent, NULL, ha)); - } - return (1); + return (hdident(parent, NULL, ha)); } void @@ -359,9 +340,10 @@ hdident(parent, sc, ha) /* Is it one of the disks we support? */ for (id = 0; id < numhdidentinfo; id++) - if (ha->ha_id == hdidentinfo[id].ri_hwid) + if (ha->ha_id == hdidentinfo[id].ri_hwid && + ha->ha_punit <= hdidentinfo[id].ri_maxunum) break; - if (id == numhdidentinfo || ha->ha_punit > hdidentinfo[id].ri_maxunum) + if (id == numhdidentinfo) return (0); /* diff --git a/sys/arch/hp300/dev/hpib.c b/sys/arch/hp300/dev/hpib.c index f8a39b5d85f..703158a0051 100644 --- a/sys/arch/hp300/dev/hpib.c +++ b/sys/arch/hp300/dev/hpib.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hpib.c,v 1.12 2005/11/14 20:21:42 miod Exp $ */ +/* $OpenBSD: hpib.c,v 1.13 2005/11/16 21:23:55 miod Exp $ */ /* $NetBSD: hpib.c,v 1.16 1997/04/27 20:58:57 thorpej Exp $ */ /* @@ -62,12 +62,9 @@ struct cfdriver hpibbus_cd = { }; void hpibbus_attach_children(struct hpibbus_softc *); -int hpibbussearch(struct device *, void *, void *); +int hpibbussubmatch(struct device *, void *, void *); int hpibbusprint(void *, const char *); -int hpibbus_alloc(struct hpibbus_softc *, int, int); -void hpibbus_free(struct hpibbus_softc *, int, int); - void hpibstart(void *); void hpibdone(void *); @@ -82,7 +79,7 @@ int hpibdmathresh = 3; /* byte count beyond which to attempt dma */ * probably Amigo, too) are tagged with a 16-bit ID. * * HP-IB has a 2-level addressing scheme; slave, the analog - * of a SCSI ID, and punit, the analog of a SCSI LUN. Unforunately, + * of a SCSI ID, and punit, the analog of a SCSI LUN. Unfortunately, * IDs are on a per-slave basis; punits are often used for disk * drives that have an accompanying tape drive on the second punit. * @@ -92,17 +89,9 @@ int hpibdmathresh = 3; /* byte count beyond which to attempt dma */ * have ID tags, and often the host cannot even tell if such * a device is attached to the system! * - * These two nasty bits mean that we have to treat HP-IB as - * an indirect bus. However, since we are given some ID - * information, it is unreasonable to disallow cloning of - * CS/80 devices. - * - * To deal with all of this, we use the semi-twisted scheme - * in hpibbus_attach_children(). For each HP-IB slave, we loop - * through all of the possibly-configured children, allowing - * them to modify the punit parameter (but NOT the slave!). - * - * This is evil, but what can you do? + * We nevertheless probe the whole (slave, punit) tuple space, since + * drivers for devices with a unique ID know exactly where to attach; + * and we disallow ``star'' locators for other drivers. */ int @@ -157,63 +146,52 @@ hpibbus_attach_children(sc) struct hpibbus_softc *sc; { struct hpibbus_attach_args ha; - int slave; + int id, slave, punit; + int i; - for (slave = 0; slave < 8; slave++) { + for (slave = 0; slave < HPIB_NSLAVES; slave++) { /* * Get the ID tag for the device, if any. * Plotters won't identify themselves, and * get the same value as non-existent devices. + * However, aging HP-IB drives are slow to respond; try up + * to three times to get a valid ID. */ - ha.ha_id = hpibid(sc->sc_dev.dv_unit, slave); - - ha.ha_slave = slave; /* not to be modified by children */ - ha.ha_punit = 0; /* children modify this */ + for (i = 0; i < 3; i++) { + id = hpibid(sc->sc_dev.dv_unit, slave); + if ((id & 0x200) != 0) + break; + delay(10000); + } - /* - * Search though all configured children for this bus. - */ - (void)config_found_sm(&sc->sc_dev, &ha, hpibbusprint, - hpibbussearch); + for (punit = 0; punit < HPIB_NPUNITS; punit++) { + /* + * Search through all configured children for this bus. + */ + ha.ha_id = id; + ha.ha_slave = slave; + ha.ha_punit = punit; + (void)config_found_sm(&sc->sc_dev, &ha, hpibbusprint, + hpibbussubmatch); + } } } int -hpibbussearch(parent, match, aux) +hpibbussubmatch(parent, match, aux) struct device *parent; void *match, *aux; { struct cfdata *cf = match; - struct hpibbus_softc *sc = (struct hpibbus_softc *)parent; struct hpibbus_attach_args *ha = aux; - int pri; - - /* Make sure this is in a consistent state. */ - ha->ha_punit = 0; - pri = (*cf->cf_attach->ca_match)(parent, cf, ha); - if (pri > 0) { - /* - * The device probe has succeeded, and filled in - * the punit information. Make sure the configuration - * allows for this slave/punit combination. - */ - if (cf->hpibbuscf_slave != HPIBBUS_SLAVE_UNK && - cf->hpibbuscf_slave != ha->ha_slave) - return (0); - if (cf->hpibbuscf_punit != HPIBBUS_PUNIT_UNK && - cf->hpibbuscf_punit != ha->ha_punit) - return (0); - - /* - * Allocate the device's address from the bus's - * resource map. - */ - if (hpibbus_alloc(sc, ha->ha_slave, ha->ha_punit)) - return (0); - } - - return (pri); + if (cf->hpibbuscf_slave != HPIBBUS_SLAVE_UNK && + cf->hpibbuscf_slave != ha->ha_slave) + return (0); + if (cf->hpibbuscf_punit != HPIBBUS_PUNIT_UNK && + cf->hpibbuscf_punit != ha->ha_punit) + return (0); + return ((*cf->cf_attach->ca_match)(parent, match, aux)); } int @@ -224,7 +202,7 @@ hpibbusprint(aux, pnp) struct hpibbus_attach_args *ha = aux; if (pnp != NULL) { - if (ha->ha_id == 0) + if (ha->ha_id == 0 || ha->ha_punit != 0 /* XXX */) return (QUIET); printf("HP-IB device (id %04X) at %s", ha->ha_id, pnp); } @@ -429,38 +407,3 @@ hpibintr(arg) return ((sc->sc_ops->hpib_intr)(arg)); } - -int -hpibbus_alloc(sc, slave, punit) - struct hpibbus_softc *sc; - int slave, punit; -{ - - if (slave >= HPIB_NSLAVES || - punit >= HPIB_NPUNITS) - panic("hpibbus_alloc: device address out of range"); - - if (sc->sc_rmap[slave][punit] == 0) { - sc->sc_rmap[slave][punit] = 1; - return (0); - } - return (1); -} - -void -hpibbus_free(sc, slave, punit) - struct hpibbus_softc *sc; - int slave, punit; -{ - - if (slave >= HPIB_NSLAVES || - punit >= HPIB_NPUNITS) - panic("hpibbus_free: device address out of range"); - -#ifdef DIAGNOSTIC - if (sc->sc_rmap[slave][punit] == 0) - panic("hpibbus_free: not allocated"); -#endif - - sc->sc_rmap[slave][punit] = 0; -} diff --git a/sys/arch/hp300/dev/hpibvar.h b/sys/arch/hp300/dev/hpibvar.h index 70c1e40587d..c0bb1c41357 100644 --- a/sys/arch/hp300/dev/hpibvar.h +++ b/sys/arch/hp300/dev/hpibvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: hpibvar.h,v 1.8 2003/06/02 23:27:44 millert Exp $ */ +/* $OpenBSD: hpibvar.h,v 1.9 2005/11/16 21:23:55 miod Exp $ */ /* $NetBSD: hpibvar.h,v 1.10 1997/03/31 07:34:25 scottr Exp $ */ /* @@ -148,12 +148,6 @@ struct hpibbus_softc { char *sc_addr; int sc_count; int sc_curcnt; - - /* - * HP-IB is an indirect bus; this cheezy resource map - * keeps track of slave/punit allocations. - */ - char sc_rmap[HPIB_NSLAVES][HPIB_NPUNITS]; }; /* sc_flags */ @@ -184,8 +178,6 @@ int hpibid(int, int); int hpibreq(struct device *, struct hpibqueue *); void hpibfree(struct device *, struct hpibqueue *); -int hpibbus_alloc(struct hpibbus_softc *, int, int); -void hpibbus_free(struct hpibbus_softc *, int, int); int hpibintr(void *); int hpibdevprint(void *, const char *); diff --git a/sys/arch/hp300/dev/mt.c b/sys/arch/hp300/dev/mt.c index d25c9617baf..338f818afc0 100644 --- a/sys/arch/hp300/dev/mt.c +++ b/sys/arch/hp300/dev/mt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mt.c,v 1.13 2005/01/15 21:13:08 miod Exp $ */ +/* $OpenBSD: mt.c,v 1.14 2005/11/16 21:23:55 miod Exp $ */ /* $NetBSD: mt.c,v 1.8 1997/03/31 07:37:29 scottr Exp $ */ /* @@ -173,7 +173,8 @@ mtident(sc, ha) int i; for (i = 0; i < nmtinfo; i++) { - if (ha->ha_id == mtinfo[i].hwid) { + if (ha->ha_id == mtinfo[i].hwid && + ha->ha_punit == 0) { if (sc != NULL) { sc->sc_type = mtinfo[i].hwid; printf(": %s tape\n", mtinfo[i].desc); -- cgit v1.2.3