summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2009-02-24 03:43:05 +0000
committerthompsa <thompsa@FreeBSD.org>2009-02-24 03:43:05 +0000
commitf1a1841fd46d19db9e9c9715c72e7253c6821208 (patch)
treef4792f6be15577c3da25ef086c5ab15d262ccb99
parent8041f6f6948e9212d22713bd2c0c2bec494e144c (diff)
downloadFreeBSD-src-f1a1841fd46d19db9e9c9715c72e7253c6821208.zip
FreeBSD-src-f1a1841fd46d19db9e9c9715c72e7253c6821208.tar.gz
MFp4 //depot/projects/usb@157974
Add support for setting and getting the USB template value through libusb20 and usbconfig. Submitted by: Hans Petter Selasky
-rw-r--r--lib/libusb20/libusb20.324
-rw-r--r--lib/libusb20/libusb20.c17
-rw-r--r--lib/libusb20/libusb20_int.h4
-rw-r--r--lib/libusb20/libusb20_ugen20.c14
-rw-r--r--sys/dev/usb/usb_dev.c9
-rw-r--r--sys/dev/usb/usb_device.h4
-rw-r--r--sys/dev/usb/usb_ioctl.h2
-rw-r--r--usr.sbin/usbconfig/usbconfig.c33
8 files changed, 107 insertions, 0 deletions
diff --git a/lib/libusb20/libusb20.3 b/lib/libusb20/libusb20.3
index 8b7639a..3fe8642 100644
--- a/lib/libusb20/libusb20.3
+++ b/lib/libusb20/libusb20.3
@@ -698,6 +698,30 @@ returned.
.
.Sh USB BACKEND OPERATIONS
.
+.Fn libusb20_be_get_template pbackend ptemp
+This function will return the currently selected global USB device
+side mode template into the integer pointer
+.Fa ptemp .
+This function returns zero on success else a LIBUSB20_ERROR value is
+returned.
+.
+.Pp
+.
+.Fn libusb20_be_set_template pbackend temp
+This function will set the global USB device side mode template to
+.Fa temp .
+The new template is not activated until after the next USB
+enumeration.
+The template number decides how the USB device will present itself to
+the USB Host, like Mass Storage Device, USB Ethernet Device. Also see
+the
+.Xr usb2_template 4
+module.
+This function returns zero on success else a LIBUSB20_ERROR value is
+returned.
+.
+.Pp
+.
.Fn libusb20_be_get_dev_quirk pbackend index pquirk
This function will return the device quirk according to
.Fa index
diff --git a/lib/libusb20/libusb20.c b/lib/libusb20/libusb20.c
index 814bd26..52c447d 100644
--- a/lib/libusb20/libusb20.c
+++ b/lib/libusb20/libusb20.c
@@ -1165,6 +1165,23 @@ libusb20_be_get_perm(struct libusb20_backend *pbe, mode_t *mode)
return (pbe->methods->root_get_perm(pbe, mode));
}
+int
+libusb20_be_set_template(struct libusb20_backend *pbe, int temp)
+{
+ return (pbe->methods->root_set_template(pbe, temp));
+}
+
+int
+libusb20_be_get_template(struct libusb20_backend *pbe, int *ptemp)
+{
+ int temp;
+
+ if (ptemp == NULL)
+ ptemp = &temp;
+
+ return (pbe->methods->root_get_template(pbe, ptemp));
+}
+
struct libusb20_device *
libusb20_be_device_foreach(struct libusb20_backend *pbe, struct libusb20_device *pdev)
{
diff --git a/lib/libusb20/libusb20_int.h b/lib/libusb20/libusb20_int.h
index 5e89bfe..b65aac0 100644
--- a/lib/libusb20/libusb20_int.h
+++ b/lib/libusb20/libusb20_int.h
@@ -70,6 +70,8 @@ typedef int (libusb20_root_get_perm_t)(struct libusb20_backend *pbe, mode_t *mod
typedef int (libusb20_root_set_owner_t)(struct libusb20_backend *pbe, uid_t user, gid_t group);
typedef int (libusb20_root_set_perm_t)(struct libusb20_backend *pbe, mode_t mode);
typedef void (libusb20_exit_backend_t)(struct libusb20_backend *pbe);
+typedef int (libusb20_root_set_template_t)(struct libusb20_backend *pbe, int temp);
+typedef int (libusb20_root_get_template_t)(struct libusb20_backend *pbe, int *ptemp);
#define LIBUSB20_DEFINE(n,field) \
libusb20_##field##_t *field;
@@ -105,6 +107,8 @@ typedef void (libusb20_exit_backend_t)(struct libusb20_backend *pbe);
m(n, root_get_owner) \
m(n, root_set_perm) \
m(n, root_get_perm) \
+ m(n, root_set_template) \
+ m(n, root_get_template) \
/* mandatory device methods */ \
m(n, open_device) \
m(n, close_device) \
diff --git a/lib/libusb20/libusb20_ugen20.c b/lib/libusb20/libusb20_ugen20.c
index 7bfe2ce..17a54ea 100644
--- a/lib/libusb20/libusb20_ugen20.c
+++ b/lib/libusb20/libusb20_ugen20.c
@@ -72,6 +72,8 @@ static libusb20_root_set_owner_t ugen20_root_set_owner;
static libusb20_root_get_owner_t ugen20_root_get_owner;
static libusb20_root_set_perm_t ugen20_root_set_perm;
static libusb20_root_get_perm_t ugen20_root_get_perm;
+static libusb20_root_set_template_t ugen20_root_set_template;
+static libusb20_root_get_template_t ugen20_root_get_template;
const struct libusb20_backend_methods libusb20_ugen20_backend = {
LIBUSB20_BACKEND(LIBUSB20_DECLARE, ugen20)
@@ -1179,3 +1181,15 @@ ugen20_root_get_perm(struct libusb20_backend *pbe, mode_t *mode)
return (ugen20_be_do_perm(USB_GET_ROOT_PERM, 0, 0, 0, 0,
NULL, NULL, mode));
}
+
+static int
+ugen20_root_set_template(struct libusb20_backend *pbe, int temp)
+{
+ return (ugen20_be_ioctl(USB_SET_TEMPLATE, &temp));
+}
+
+static int
+ugen20_root_get_template(struct libusb20_backend *pbe, int *ptemp)
+{
+ return (ugen20_be_ioctl(USB_GET_TEMPLATE, ptemp));
+}
diff --git a/sys/dev/usb/usb_dev.c b/sys/dev/usb/usb_dev.c
index f8e2c96..8df78d2 100644
--- a/sys/dev/usb/usb_dev.c
+++ b/sys/dev/usb/usb_dev.c
@@ -1377,6 +1377,15 @@ usb2_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
case USB_DEV_QUIRK_REMOVE:
err = usb2_quirk_ioctl_p(cmd, data, fflag, td);
break;
+ case USB_GET_TEMPLATE:
+ *(int *)data = usb2_template;
+ break;
+ case USB_SET_TEMPLATE:
+ err = priv_check(curthread, PRIV_ROOT);
+ if (err)
+ break;
+ usb2_template = *(int *)data;
+ break;
default:
err = ENOTTY;
break;
diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h
index e20479d..4c296d4 100644
--- a/sys/dev/usb/usb_device.h
+++ b/sys/dev/usb/usb_device.h
@@ -155,6 +155,10 @@ struct usb2_device {
char product[64]; /* product string */
};
+/* globals */
+
+extern int usb2_template;
+
/* function prototypes */
struct usb2_device *usb2_alloc_device(device_t parent_dev, struct usb2_bus *bus,
diff --git a/sys/dev/usb/usb_ioctl.h b/sys/dev/usb/usb_ioctl.h
index 27e4bea..73f7796 100644
--- a/sys/dev/usb/usb_ioctl.h
+++ b/sys/dev/usb/usb_ioctl.h
@@ -267,6 +267,8 @@ struct usb2_gen_quirk {
#define USB_SET_PORT_DISABLE _IOW ('U', 144, int)
#define USB_SET_POWER_MODE _IOW ('U', 145, int)
#define USB_GET_POWER_MODE _IOR ('U', 146, int)
+#define USB_SET_TEMPLATE _IOW ('U', 147, int)
+#define USB_GET_TEMPLATE _IOR ('U', 148, int)
/* Modem device */
#define USB_GET_CM_OVER_DATA _IOR ('U', 180, int)
diff --git a/usr.sbin/usbconfig/usbconfig.c b/usr.sbin/usbconfig/usbconfig.c
index 4b69dc5..8a4ac1d 100644
--- a/usr.sbin/usbconfig/usbconfig.c
+++ b/usr.sbin/usbconfig/usbconfig.c
@@ -42,6 +42,7 @@
struct options {
const char *quirkname;
void *buffer;
+ int template;
gid_t gid;
uid_t uid;
mode_t mode;
@@ -65,6 +66,8 @@ struct options {
uint8_t got_set_alt:1;
uint8_t got_set_owner:1;
uint8_t got_set_perm:1;
+ uint8_t got_set_template:1;
+ uint8_t got_get_template:1;
uint8_t got_suspend:1;
uint8_t got_resume:1;
uint8_t got_reset:1;
@@ -99,6 +102,8 @@ enum {
T_SET_ALT,
T_SET_OWNER,
T_SET_PERM,
+ T_SET_TEMPLATE,
+ T_GET_TEMPLATE,
T_ADD_DEVICE_QUIRK,
T_REMOVE_DEVICE_QUIRK,
T_SHOW_IFACE_DRIVER,
@@ -130,6 +135,8 @@ static const struct token token[] = {
{"set_alt", T_SET_ALT, 1},
{"set_owner", T_SET_OWNER, 1},
{"set_perm", T_SET_PERM, 1},
+ {"set_template", T_SET_TEMPLATE, 1},
+ {"get_template", T_GET_TEMPLATE, 0},
{"add_dev_quirk_vplh", T_ADD_DEVICE_QUIRK, 5},
{"remove_dev_quirk_vplh", T_REMOVE_DEVICE_QUIRK, 5},
{"dump_quirk_names", T_DUMP_QUIRK_NAMES, 0},
@@ -283,6 +290,8 @@ usage(void)
" set_alt <alt_index>" "\n"
" set_owner <user:group>" "\n"
" set_perm <mode>" "\n"
+ " set_template <template>" "\n"
+ " get_template" "\n"
" add_dev_quirk_vplh <vid> <pid> <lo_rev> <hi_rev> <quirk>" "\n"
" remove_dev_quirk_vplh <vid> <pid> <lo_rev> <hi_rev> <quirk>" "\n"
" dump_quirk_names" "\n"
@@ -358,6 +367,20 @@ flush_command(struct libusb20_backend *pbe, struct options *opt)
be_dev_add_quirk(pbe,
opt->vid, opt->pid, opt->lo_rev, opt->hi_rev, opt->quirkname);
}
+ if (opt->got_set_template) {
+ opt->got_any--;
+ if (libusb20_be_set_template(pbe, opt->template)) {
+ printf("Setting USB template %u failed, "
+ "continuing.\n", opt->template);
+ }
+ }
+ if (opt->got_get_template) {
+ opt->got_any--;
+ if (libusb20_be_get_template(pbe, &opt->template))
+ printf("USB template: <unknown>\n");
+ else
+ printf("USB template: %u\n", opt->template);
+ }
if (opt->got_any == 0) {
/*
* do not scan through all the devices if there are no valid
@@ -691,6 +714,16 @@ main(int argc, char **argv)
opt->got_any++;
n++;
break;
+ case T_SET_TEMPLATE:
+ opt->template = a_mode(argv[n + 1]);
+ opt->got_set_template = 1;
+ opt->got_any++;
+ n++;
+ break;
+ case T_GET_TEMPLATE:
+ opt->got_get_template = 1;
+ opt->got_any++;
+ break;
case T_DUMP_DEVICE_DESC:
opt->got_dump_device_desc = 1;
opt->got_any++;
OpenPOWER on IntegriCloud