summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/conf/NOTES6
-rw-r--r--sys/conf/options2
-rw-r--r--sys/dev/usb/uplcom.c31
-rw-r--r--sys/dev/usb/uvscom.c28
-rw-r--r--sys/modules/uplcom/Makefile3
5 files changed, 66 insertions, 4 deletions
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index eeeb1fc..051186a 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -2232,8 +2232,14 @@ options USB_DEBUG
options UKBD_DFLT_KEYMAP # specify the built-in keymap
makeoptions UKBD_DFLT_KEYMAP=it.iso
+# options for uplcom:
+options UPLCOM_INTR_INTERVAL=100 # interrpt pipe interval
+ # in milliseconds
+
# options for uvscom:
options UVSCOM_DEFAULT_OPKTSIZE=8 # default output packet size
+options UVSCOM_INTR_INTERVAL=100 # interrpt pipe interval
+ # in milliseconds
#####################################################################
# FireWire support
diff --git a/sys/conf/options b/sys/conf/options
index 8a3b1f2..26aa8e3 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -552,7 +552,9 @@ BUS_DEBUG opt_bus.h
# options for USB support
USB_DEBUG opt_usb.h
UKBD_DFLT_KEYMAP opt_ukbd.h
+UPLCOM_INTR_INTERVAL opt_uplcom.h
UVSCOM_DEFAULT_OPKTSIZE opt_uvscom.h
+UVSCOM_INTR_INTERVAL opt_uvscom.h
# Vinum options
VINUMDEBUG opt_vinum.h
diff --git a/sys/dev/usb/uplcom.c b/sys/dev/usb/uplcom.c
index e7a6240..f041a8e 100644
--- a/sys/dev/usb/uplcom.c
+++ b/sys/dev/usb/uplcom.c
@@ -73,6 +73,8 @@ __FBSDID("$FreeBSD$");
*
*/
+#include "opt_uplcom.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@@ -103,9 +105,9 @@ __FBSDID("$FreeBSD$");
#include <dev/usb/ucomvar.h>
+SYSCTL_NODE(_hw_usb, OID_AUTO, uplcom, CTLFLAG_RW, 0, "USB uplcom");
#ifdef USB_DEBUG
static int uplcomdebug = 0;
-SYSCTL_NODE(_hw_usb, OID_AUTO, uplcom, CTLFLAG_RW, 0, "USB uplcom");
SYSCTL_INT(_hw_usb_uplcom, OID_AUTO, debug, CTLFLAG_RW,
&uplcomdebug, 0, "uplcom debug level");
@@ -124,7 +126,9 @@ SYSCTL_INT(_hw_usb_uplcom, OID_AUTO, debug, CTLFLAG_RW,
#define UPLCOM_IFACE_INDEX 0
#define UPLCOM_SECOND_IFACE_INDEX 1
+#ifndef UPLCOM_INTR_INTERVAL
#define UPLCOM_INTR_INTERVAL 100 /* ms */
+#endif
#define UPLCOM_SET_REQUEST 0x01
#define UPLCOM_SET_CRTSCTS 0x41
@@ -238,6 +242,29 @@ MODULE_DEPEND(uplcom, usb, 1, 1, 1);
MODULE_DEPEND(uplcom, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(uplcom, UPLCOM_MODVER);
+static int uplcominterval = UPLCOM_INTR_INTERVAL;
+
+static int
+sysctl_hw_usb_uplcom_interval(SYSCTL_HANDLER_ARGS)
+{
+ int err, val;
+
+ val = uplcominterval;
+ err = sysctl_handle_int(oidp, &val, sizeof(val), req);
+ if (err != 0 || req->newptr == NULL)
+ return (err);
+ if (0 < val && val <= 1000)
+ uplcominterval = val;
+ else
+ err = EINVAL;
+
+ return (err);
+}
+
+SYSCTL_PROC(_hw_usb_uplcom, OID_AUTO, interval, CTLTYPE_INT | CTLFLAG_RW,
+ 0, sizeof(int), sysctl_hw_usb_uplcom_interval,
+ "I", "uplcom interrpt pipe interval");
+
USB_MATCH(uplcom)
{
USB_MATCH_START(uplcom, uaa);
@@ -702,7 +729,7 @@ uplcom_open(void *addr, int portno)
sc->sc_intr_buf,
sc->sc_isize,
uplcom_intr,
- UPLCOM_INTR_INTERVAL);
+ uplcominterval);
if (err) {
printf("%s: cannot open interrupt pipe (addr %d)\n",
USBDEVNAME(sc->sc_ucom.sc_dev),
diff --git a/sys/dev/usb/uvscom.c b/sys/dev/usb/uvscom.c
index 7911210..9f37bd9 100644
--- a/sys/dev/usb/uvscom.c
+++ b/sys/dev/usb/uvscom.c
@@ -93,7 +93,9 @@ SYSCTL_INT(_hw_usb_uvscom, OID_AUTO, debug, CTLFLAG_RW,
#define UVSCOM_CONFIG_INDEX 0
#define UVSCOM_IFACE_INDEX 0
+#ifndef UVSCOM_INTR_INTERVAL
#define UVSCOM_INTR_INTERVAL 100 /* mS */
+#endif
#define UVSCOM_UNIT_WAIT 5
@@ -251,6 +253,7 @@ MODULE_DEPEND(uvscom, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_VERSION(uvscom, UVSCOM_MODVER);
static int uvscomobufsiz = UVSCOM_DEFAULT_OPKTSIZE;
+static int uvscominterval = UVSCOM_INTR_INTERVAL;
static int
sysctl_hw_usb_uvscom_opktsize(SYSCTL_HANDLER_ARGS)
@@ -269,9 +272,29 @@ sysctl_hw_usb_uvscom_opktsize(SYSCTL_HANDLER_ARGS)
return (err);
}
+static int
+sysctl_hw_usb_uvscom_interval(SYSCTL_HANDLER_ARGS)
+{
+ int err, val;
+
+ val = uvscominterval;
+ err = sysctl_handle_int(oidp, &val, sizeof(val), req);
+ if (err != 0 || req->newptr == NULL)
+ return (err);
+ if (0 < val && val <= 1000)
+ uvscominterval = val;
+ else
+ err = EINVAL;
+
+ return (err);
+}
+
SYSCTL_PROC(_hw_usb_uvscom, OID_AUTO, opktsize, CTLTYPE_INT | CTLFLAG_RW,
0, sizeof(int), sysctl_hw_usb_uvscom_opktsize,
"I", "uvscom output packet size");
+SYSCTL_PROC(_hw_usb_uvscom, OID_AUTO, interval, CTLTYPE_INT | CTLFLAG_RW,
+ 0, sizeof(int), sysctl_hw_usb_uvscom_interval,
+ "I", "uvscom interrpt pipe interval");
USB_MATCH(uvscom)
{
@@ -748,6 +771,9 @@ uvscom_open(void *addr, int portno)
DPRINTF(("uvscom_open: sc = %p\n", sc));
+ /* change output packet size */
+ sc->sc_ucom.sc_obufsize = uvscomobufsiz;
+
if (sc->sc_intr_number != -1 && sc->sc_intr_pipe == NULL) {
DPRINTF(("uvscom_open: open interrupt pipe.\n"));
@@ -769,7 +795,7 @@ uvscom_open(void *addr, int portno)
sc->sc_intr_buf,
sc->sc_isize,
uvscom_intr,
- UVSCOM_INTR_INTERVAL);
+ uvscominterval);
if (err) {
printf("%s: cannot open interrupt pipe (addr %d)\n",
USBDEVNAME(sc->sc_ucom.sc_dev),
diff --git a/sys/modules/uplcom/Makefile b/sys/modules/uplcom/Makefile
index be46f95..20da20b 100644
--- a/sys/modules/uplcom/Makefile
+++ b/sys/modules/uplcom/Makefile
@@ -4,7 +4,8 @@ S= ${.CURDIR}/../..
.PATH: $S/dev/usb
KMOD= uplcom
-SRCS= uplcom.c ucomvar.h opt_usb.h device_if.h bus_if.h vnode_if.h
+SRCS= uplcom.c ucomvar.h opt_usb.h opt_uplcom.h \
+ device_if.h bus_if.h vnode_if.h
NOMAN=
.include <bsd.kmod.mk>
OpenPOWER on IntegriCloud