Jun Kuriyama wrote:
> I'm planning to commit these changes into src/sys/pccard/. This adds
> two features. These features are obtained from PAO.
Sorry, I forgot to add patch. :-)
--
Jun Kuriyama // kuriy...@sky.rim.or.jp
// kuriy...@freebsd.org
Index: cardinfo.h
===================================================================
RCS file: /home/ncvs/src/sys/pccard/cardinfo.h,v
retrieving revision 1.10
diff -u -r1.10 cardinfo.h
--- cardinfo.h 1998/04/20 15:20:58 1.10
+++ cardinfo.h 1999/02/07 14:20:48
@@ -45,6 +45,8 @@
#define PIOCRWFLAG _IOW('P', 7, int) /* Set flags for drv use */
#define PIOCRWMEM _IOWR('P', 8, unsigned long) /* Set mem for drv use */
#define PIOCSPOW _IOW('P', 9, struct power) /* Set power structure */
+#define PIOCSVIR _IOW('P', 10, int) /* Virtual insert/remove */
+#define PIOCSBEEP _IOW('P', 11, int) /* Select Beep */
/*
* Debug codes.
*/
@@ -54,7 +56,7 @@
/*
* Slot states for PIOCGSTATE
*/
-enum cardstate { noslot, empty, suspend, filled };
+enum cardstate { noslot, empty, suspend, filled, inactive };
/*
* Descriptor structure for memory map.
Index: driver.h
===================================================================
RCS file: /home/ncvs/src/sys/pccard/driver.h,v
retrieving revision 1.6
diff -u -r1.6 driver.h
--- driver.h 1999/01/19 00:18:25 1.6
+++ driver.h 1999/02/07 14:20:48
@@ -23,6 +23,6 @@
void pccard_remove_beep __P((void));
void pccard_success_beep __P((void));
void pccard_failure_beep __P((void));
-void pccard_beep_select __P((enum beepstate));
+int pccard_beep_select __P((enum beepstate));
#endif /* !_PCCARD_DRIVER_H_ */
Index: pccard.c
===================================================================
RCS file: /home/ncvs/src/sys/pccard/pccard.c,v
retrieving revision 1.70
diff -u -r1.70 pccard.c
--- pccard.c 1999/01/27 23:45:40 1.70
+++ pccard.c 1999/02/07 14:20:48
@@ -897,6 +897,7 @@
struct mem_desc *mp;
struct io_desc *ip;
int s, err;
+ int pwval;
/* beep is disabled until the 1st call of crdioctl() */
pccard_beep_select(BEEP_ON);
@@ -1026,6 +1027,53 @@
else
pccard_failure_beep();
return err;
+ /*
+ * Virtual removal/insertion
+ *
+ * State of cards:
+ *
+ * insertion virtual removal
+ * (empty) --------> (filled) --------> (inactive)
+ * ^ ^ | ^ | |
+ * | | | | | |
+ * | +---------------+ +-----------------+ |
+ * | removal virtual insertion |
+ * | |
+ * +----------------------------------------+
+ * removal
+ *
+ * -- hosokawa
+ */
+ case PIOCSVIR:
+ pwval = *(int *)data;
+ /* virtual removal */
+ if (!pwval) {
+ if (slt->state != filled) {
+ return EINVAL;
+ }
+ s = splhigh();
+ disable_slot(slt);
+ slt->state = inactive;
+ splx(s);
+ pccard_remove_beep();
+ selwakeup(&slt->selp);
+ }
+ /* virtual insertion */
+ else {
+ if (slt->state != inactive) {
+ return EINVAL;
+ }
+ slt->insert_seq = 1;
+ timeout(inserted, (void *)slt, hz/4);
+ pccard_insert_beep();
+ break;
+ }
+ break;
+ case PIOCSBEEP:
+ if (pccard_beep_select(*(int *)data)) {
+ return EINVAL;
+ }
+ break;
}
return(0);
}
Index: pccard_beep.c
===================================================================
RCS file: /home/ncvs/src/sys/pccard/pccard_beep.c,v
retrieving revision 1.1
diff -u -r1.1 pccard_beep.c
--- pccard_beep.c 1997/10/26 06:06:48 1.1
+++ pccard_beep.c 1999/02/07 14:20:48
@@ -64,7 +64,11 @@
sysbeep(PCCARD_BEEP_PITCH2, PCCARD_BEEP_DURATION2);
}
-void pccard_beep_select(enum beepstate state)
+int pccard_beep_select(enum beepstate state)
{
- allow_beep = state;
+ if (state == BEEP_ON || state == BEEP_OFF) {
+ allow_beep = state;
+ return 0;
+ }
+ return 1;
}