summaryrefslogtreecommitdiffstats
path: root/sys/pccard/pccard.c
diff options
context:
space:
mode:
authornate <nate@FreeBSD.org>1996-02-21 23:20:21 +0000
committernate <nate@FreeBSD.org>1996-02-21 23:20:21 +0000
commit3f825d95474a8cf312608785fad3b15deb2f486a (patch)
tree9e776d3327ba0212196369625f4d5b82ffa8d5d5 /sys/pccard/pccard.c
parent98df79c16931ef02ab7229300615dca86fad47dc (diff)
downloadFreeBSD-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.c38
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)
-
-
OpenPOWER on IntegriCloud