On Thu, Jul 30, 2015 at 08:19:19AM +0200, Stefan Koch wrote: > Interfaces are allowed per default. > This can disabled or enabled (again) by writing 0 or 1 to > /sys/bus/usb/devices/usbX/interface_authorized_default > > Signed-off-by: Stefan Koch <skoch@xxxxxxx> > --- > drivers/usb/core/hcd.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ > drivers/usb/core/message.c | 1 + > include/linux/usb/hcd.h | 3 +++ > 3 files changed, 51 insertions(+) > > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c > index cbcd092..84b5923 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -882,9 +882,53 @@ static ssize_t authorized_default_store(struct device *dev, > } > static DEVICE_ATTR_RW(authorized_default); > > +/* > + * interface_authorized_default_show - show default authorization status > + * for USB interfaces > + * > + * note: interface_authorized_default is the default value > + * for initializing the authorized attribute of interfaces > + */ > +static ssize_t interface_authorized_default_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct usb_device *usb_dev = to_usb_device(dev); > + struct usb_hcd *hcd = bus_to_hcd(usb_dev->bus); > + > + return sprintf(buf, "%u\n", !!HCD_INTF_AUTHORIZED(hcd)); > +} > + > +/* > + * interface_authorized_default_store - store default authorization status > + * for USB interfaces > + * > + * note: interface_authorized_default is the default value > + * for initializing the authorized attribute of interfaces > + */ > +static ssize_t interface_authorized_default_store(struct device *dev, > + struct device_attribute *attr, const char *buf, size_t count) > +{ > + struct usb_device *usb_dev = to_usb_device(dev); > + struct usb_hcd *hcd = bus_to_hcd(usb_dev->bus); > + int rc = count; > + bool val; > + > + if (strtobool(buf, &val) != 0) > + return -EINVAL; > + > + if (val) > + set_bit(HCD_FLAG_INTF_AUTHORIZED, &hcd->flags); > + else > + clear_bit(HCD_FLAG_INTF_AUTHORIZED, &hcd->flags); > + > + return rc; > +} > +static DEVICE_ATTR_RW(interface_authorized_default); > + > /* Group all the USB bus attributes */ > static struct attribute *usb_bus_attrs[] = { > &dev_attr_authorized_default.attr, > + &dev_attr_interface_authorized_default.attr, > NULL, > }; > > @@ -2682,6 +2726,9 @@ int usb_add_hcd(struct usb_hcd *hcd, > hcd->authorized_default = authorized_default; > set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); > > + /* per default all interfaces are authorized */ > + set_bit(HCD_FLAG_INTF_AUTHORIZED, &hcd->flags); > + > /* HC is in reset state, but accessible. Now do the one-time init, > * bottom up so that hcds can customize the root hubs before hub_wq > * starts talking to them. (Note, bus id is assigned early too.) > diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c > index f368d20..3d25d89 100644 > --- a/drivers/usb/core/message.c > +++ b/drivers/usb/core/message.c > @@ -1807,6 +1807,7 @@ free_interfaces: > intfc = cp->intf_cache[i]; > intf->altsetting = intfc->altsetting; > intf->num_altsetting = intfc->num_altsetting; > + intf->authorized = !!HCD_INTF_AUTHORIZED(hcd); > kref_get(&intfc->ref); > > alt = usb_altnum_to_altsetting(intf, 0); > diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h > index c9aa779..7b8ddae 100644 > --- a/include/linux/usb/hcd.h > +++ b/include/linux/usb/hcd.h > @@ -120,6 +120,7 @@ struct usb_hcd { > #define HCD_FLAG_WAKEUP_PENDING 4 /* root hub is resuming? */ > #define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */ > #define HCD_FLAG_DEAD 6 /* controller has died? */ > +#define HCD_FLAG_INTF_AUTHORIZED 8 /* authorize interfaces? */ Again, what happened to this being '7'? Don't skip bits for no reason. thanks, greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html