diff options
author | non <non@FreeBSD.org> | 2002-11-28 01:13:58 +0000 |
---|---|---|
committer | non <non@FreeBSD.org> | 2002-11-28 01:13:58 +0000 |
commit | 3768f72e83c73cee8f2773fea1c23be1e0b370d7 (patch) | |
tree | 1864de89b1f6e3511f439febb3e2620ff94ddd6f /sys/dev/ncv | |
parent | cc69eba927d21e30427f549cd948a45dd0e42fad (diff) | |
download | FreeBSD-src-3768f72e83c73cee8f2773fea1c23be1e0b370d7.zip FreeBSD-src-3768f72e83c73cee8f2773fea1c23be1e0b370d7.tar.gz |
o Changes to support NEWCARD.
o Add needed headers.
o Add ncv_products[] product data and ncv_match() function.
o Change ncv_pccard_method[] to support both OLDCARD and NEWCARD.
Suggestion for REX-5572 matching part by imp.
Approved by: re
Diffstat (limited to 'sys/dev/ncv')
-rw-r--r-- | sys/dev/ncv/ncr53c500_pccard.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/sys/dev/ncv/ncr53c500_pccard.c b/sys/dev/ncv/ncr53c500_pccard.c index 8da6271..3a67d9e 100644 --- a/sys/dev/ncv/ncr53c500_pccard.c +++ b/sys/dev/ncv/ncr53c500_pccard.c @@ -48,6 +48,9 @@ #include <sys/device_port.h> +#include <dev/pccard/pccarddevs.h> +#include <dev/pccard/pccardvar.h> + #include <cam/scsi/scsi_low.h> #include <cam/scsi/scsi_low_pisa.h> @@ -71,6 +74,24 @@ static int ncvattach(DEVPORT_PDEVICE devi); static void ncv_card_unload(DEVPORT_PDEVICE); +static const struct ncv_product { + struct pccard_product prod; + int flags; +} ncv_products[] = { + { PCMCIA_CARD(EPSON, SC200, 0), 0}, + { PCMCIA_CARD(PANASONIC, KXLC002, 0), 0xb4d00000 }, + { PCMCIA_CARD(PANASONIC, KXLC004, 0), 0xb4d00100 }, + { PCMCIA_CARD(MACNICA, MPS100, 0), 0xb6250000 }, + { PCMCIA_CARD(MACNICA, MPS110, 0), 0 }, + { PCMCIA_CARD(NEC, PC9801N_J03R, 0), 0 }, + { PCMCIA_CARD(NEWMEDIA, BASICS_SCSI, 0), 0 }, + { PCMCIA_CARD(QLOGIC, PC05, 0), 0x84d00000 }, +#define FLAGS_REX5572 0x84d00000 + { PCMCIA_CARD(RATOC, REX5572, 0), FLAGS_REX5572 }, + { PCMCIA_CARD(RATOC, REX_R280, 0), 0x84d00000 }, + { { NULL }, 0 } +}; + /* * Additional code for FreeBSD new-bus PCCard frontend */ @@ -180,6 +201,32 @@ ncv_alloc_resource(DEVPORT_PDEVICE dev) return(0); } +static int ncv_pccard_match(device_t dev) +{ + const struct ncv_product *pp; + char *vendorstr; + char *prodstr; + + if ((pp = (const struct ncv_product *) pccard_product_lookup(dev, + (const struct pccard_product *) ncv_products, + sizeof(ncv_products[0]), NULL)) != NULL) { + device_set_desc(dev, pp->prod.pp_name); + device_set_flags(dev, pp->flags); + return(0); + } + if (pccard_get_vendor_str(dev, &vendorstr)) + return(EIO); + if (pccard_get_product_str(dev, &prodstr)) + return(EIO); + if (strcmp(vendorstr, "RATOC System Inc.") == 0 && + strncmp(prodstr, "SOUND/SCSI2 CARD", 16) == 0) { + device_set_desc(dev, "RATOC REX-5572"); + device_set_flags(dev, FLAGS_REX5572); + return (0); + } + return(EIO); +} + static int ncv_pccard_probe(DEVPORT_PDEVICE dev) { @@ -238,10 +285,15 @@ ncv_pccard_detach(DEVPORT_PDEVICE dev) static device_method_t ncv_pccard_methods[] = { /* Device interface */ - DEVMETHOD(device_probe, ncv_pccard_probe), - DEVMETHOD(device_attach, ncv_pccard_attach), + DEVMETHOD(device_probe, pccard_compat_probe), + DEVMETHOD(device_attach, pccard_compat_attach), DEVMETHOD(device_detach, ncv_pccard_detach), + /* Card interface */ + DEVMETHOD(card_compat_match, ncv_pccard_match), + DEVMETHOD(card_compat_probe, ncv_pccard_probe), + DEVMETHOD(card_compat_attach, ncv_pccard_attach), + { 0, 0 } }; |