diff options
author | nate <nate@FreeBSD.org> | 1996-02-21 23:20:21 +0000 |
---|---|---|
committer | nate <nate@FreeBSD.org> | 1996-02-21 23:20:21 +0000 |
commit | 3f825d95474a8cf312608785fad3b15deb2f486a (patch) | |
tree | 9e776d3327ba0212196369625f4d5b82ffa8d5d5 /sys/pccard/pccard.c | |
parent | 98df79c16931ef02ab7229300615dca86fad47dc (diff) | |
download | FreeBSD-src-3f825d95474a8cf312608785fad3b15deb2f486a.zip FreeBSD-src-3f825d95474a8cf312608785fad3b15deb2f486a.tar.gz |
Updated PC-CARD support to contain most of the code from the latest
Japanese BSD-Nomad release.
Reviewed by: phk
Submitted by: hosokawa@mt.cs.keio.ac.jp and the rest of the Nomads
Diffstat (limited to 'sys/pccard/pccard.c')
-rw-r--r-- | sys/pccard/pccard.c | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/sys/pccard/pccard.c b/sys/pccard/pccard.c index 0c0c452..fd99cdf 100644 --- a/sys/pccard/pccard.c +++ b/sys/pccard/pccard.c @@ -55,7 +55,7 @@ #include <pccard/driver.h> #include <pccard/slot.h> - +#include <i386/include/laptops.h> extern struct kern_devconf kdc_cpu0; @@ -144,6 +144,7 @@ pccard_add_driver(struct pccard_drv *dp) printf("Driver %s already loaded\n", dp->name); return; } + printf("pccard driver %s added\n", dp->name); dp->next = drivers; drivers = dp; } @@ -357,12 +358,17 @@ pccard_alloc_intr(int imask, inthand2_t *hand, int unit, int *maskp) int irq; unsigned int mask; +#if 0 + /* + * this overrides IRQ masks specified by pccardd, + * so I removed this code. (hosokawa@mt.cs.keio.ac.jp) + */ imask = 1<< 3; imask |= 1<< 5; imask |= 1<< 9; imask |= 1<<11; imask |= 1<<15; - +#endif for (irq = 1; irq < 16; irq++) { mask = 1ul << irq; @@ -542,6 +548,17 @@ inserted(void *arg) } /* + * Insert/Remove beep + */ + +static int beepok = 1; + +static void enable_beep(void *dummy) +{ + beepok = 1; +} + +/* * Card event callback. Called at splhigh to prevent * device interrupts from interceding. */ @@ -566,12 +583,18 @@ int s; sp->state = empty; splx(s); printf("Card removed, slot %d\n", sp->slot); + sysbeep(PCCARD_BEEP_PITCH0, PCCARD_BEEP_DURATION0); + beepok = 0; + timeout(enable_beep, (void *)NULL, hz/5); selwakeup(&sp->selp); } break; case card_inserted: sp->insert_seq = 1; timeout(inserted, (void *)sp, hz/4); + sysbeep(PCCARD_BEEP_PITCH0, PCCARD_BEEP_DURATION0); + beepok = 0; + timeout(enable_beep, (void *)NULL, hz/5); break; } } @@ -733,7 +756,7 @@ crdwrite(dev_t dev, struct uio *uio, int ioflag) static int crdioctl(dev_t dev, int cmd, caddr_t data, int fflag, struct proc *p) { - int s; + int s, err; struct slot *sp = pccard_slots[minor(dev)]; struct mem_desc *mp; struct io_desc *ip; @@ -853,7 +876,12 @@ crdioctl(dev_t dev, int cmd, caddr_t data, int fflag, struct proc *p) case PIOCSDRV: if (suser(p->p_ucred, &p->p_acflag)) return(EPERM); - return(allocate_driver(sp, (struct drv_desc *)data)); + err = allocate_driver(sp, (struct drv_desc *)data); + if (!err) + sysbeep(PCCARD_BEEP_PITCH1, PCCARD_BEEP_DURATION1); + else + sysbeep(PCCARD_BEEP_PITCH2, PCCARD_BEEP_DURATION2); + return err; } return(0); } @@ -929,5 +957,3 @@ crd_drvinit(void *unused) } SYSINIT(crddev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,crd_drvinit,NULL) - - |