Re: [PATCH] usb: gadget: Add uevent to notify userspace
On 22 September 2016 at 18:58, Mark Brownwrote: > On Thu, Sep 22, 2016 at 06:53:12PM +0800, Baolin Wang wrote: >> From: Badhri Jagan Sridharan >> >> Some USB managament on userspace (like Android system) rely on the uevents >> generated by the composition driver to generate user notifications. Thus this >> patch adds uevents to be generated whenever USB changes its state: connected, >> disconnected, configured. >> >> The original code was created by Badhri Jagan Sridharan, and I did some >> optimization. >> >> CC: Badhri Jagan Sridharan >> Signed-off-by: Baolin Wang > > If you're sending a patch someone else wrote you need their > Signed-off-by - if they didn't provide one you need to talk to them > about that and get it. Ah, I missed that. I will add it if there are no objection from Badhr.i > >> +config USB_CONFIGFS_UEVENT >> + boolean "Uevent notification of Gadget state" >> + depends on USB_CONFIGFS >> + help >> + Enable uevent notifications to userspace when the gadget >> + state changes. The gadget can be in any of the following >> + three states: "CONNECTED/DISCONNECTED/CONFIGURED" > > Why not just generate the events unconditionally? If userspace doesn't need notification, then we can save some time to do the enumeration without the uevent things. -- Baolin.wang Best Regards
Re: [PATCH] usb: gadget: Add uevent to notify userspace
On 22 September 2016 at 18:58, Mark Brown wrote: > On Thu, Sep 22, 2016 at 06:53:12PM +0800, Baolin Wang wrote: >> From: Badhri Jagan Sridharan >> >> Some USB managament on userspace (like Android system) rely on the uevents >> generated by the composition driver to generate user notifications. Thus this >> patch adds uevents to be generated whenever USB changes its state: connected, >> disconnected, configured. >> >> The original code was created by Badhri Jagan Sridharan, and I did some >> optimization. >> >> CC: Badhri Jagan Sridharan >> Signed-off-by: Baolin Wang > > If you're sending a patch someone else wrote you need their > Signed-off-by - if they didn't provide one you need to talk to them > about that and get it. Ah, I missed that. I will add it if there are no objection from Badhr.i > >> +config USB_CONFIGFS_UEVENT >> + boolean "Uevent notification of Gadget state" >> + depends on USB_CONFIGFS >> + help >> + Enable uevent notifications to userspace when the gadget >> + state changes. The gadget can be in any of the following >> + three states: "CONNECTED/DISCONNECTED/CONFIGURED" > > Why not just generate the events unconditionally? If userspace doesn't need notification, then we can save some time to do the enumeration without the uevent things. -- Baolin.wang Best Regards
Re: [PATCH] usb: gadget: Add uevent to notify userspace
On Thu, Sep 22, 2016 at 06:53:12PM +0800, Baolin Wang wrote: > From: Badhri Jagan Sridharan> > Some USB managament on userspace (like Android system) rely on the uevents > generated by the composition driver to generate user notifications. Thus this > patch adds uevents to be generated whenever USB changes its state: connected, > disconnected, configured. > > The original code was created by Badhri Jagan Sridharan, and I did some > optimization. > > CC: Badhri Jagan Sridharan > Signed-off-by: Baolin Wang If you're sending a patch someone else wrote you need their Signed-off-by - if they didn't provide one you need to talk to them about that and get it. > +config USB_CONFIGFS_UEVENT > + boolean "Uevent notification of Gadget state" > + depends on USB_CONFIGFS > + help > + Enable uevent notifications to userspace when the gadget > + state changes. The gadget can be in any of the following > + three states: "CONNECTED/DISCONNECTED/CONFIGURED" Why not just generate the events unconditionally? signature.asc Description: PGP signature
Re: [PATCH] usb: gadget: Add uevent to notify userspace
On Thu, Sep 22, 2016 at 06:53:12PM +0800, Baolin Wang wrote: > From: Badhri Jagan Sridharan > > Some USB managament on userspace (like Android system) rely on the uevents > generated by the composition driver to generate user notifications. Thus this > patch adds uevents to be generated whenever USB changes its state: connected, > disconnected, configured. > > The original code was created by Badhri Jagan Sridharan, and I did some > optimization. > > CC: Badhri Jagan Sridharan > Signed-off-by: Baolin Wang If you're sending a patch someone else wrote you need their Signed-off-by - if they didn't provide one you need to talk to them about that and get it. > +config USB_CONFIGFS_UEVENT > + boolean "Uevent notification of Gadget state" > + depends on USB_CONFIGFS > + help > + Enable uevent notifications to userspace when the gadget > + state changes. The gadget can be in any of the following > + three states: "CONNECTED/DISCONNECTED/CONFIGURED" Why not just generate the events unconditionally? signature.asc Description: PGP signature
[PATCH] usb: gadget: Add uevent to notify userspace
From: Badhri Jagan SridharanSome USB managament on userspace (like Android system) rely on the uevents generated by the composition driver to generate user notifications. Thus this patch adds uevents to be generated whenever USB changes its state: connected, disconnected, configured. The original code was created by Badhri Jagan Sridharan, and I did some optimization. CC: Badhri Jagan Sridharan Signed-off-by: Baolin Wang --- drivers/usb/gadget/Kconfig|8 +++ drivers/usb/gadget/configfs.c | 107 + 2 files changed, 115 insertions(+) diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 2ea3fc3..9f5d0c6 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -223,6 +223,14 @@ config USB_CONFIGFS appropriate symbolic links. For more information see Documentation/usb/gadget_configfs.txt. +config USB_CONFIGFS_UEVENT + boolean "Uevent notification of Gadget state" + depends on USB_CONFIGFS + help + Enable uevent notifications to userspace when the gadget + state changes. The gadget can be in any of the following + three states: "CONNECTED/DISCONNECTED/CONFIGURED" + config USB_CONFIGFS_SERIAL bool "Generic serial bulk in/out" depends on USB_CONFIGFS diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 3984787..4c2bc27 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -60,6 +60,11 @@ struct gadget_info { bool use_os_desc; char b_vendor_code; char qw_sign[OS_STRING_QW_SIGN_LEN]; +#ifdef CONFIG_USB_CONFIGFS_UEVENT + bool connected; + bool sw_connected; + struct work_struct work; +#endif }; static inline struct gadget_info *to_gadget_info(struct config_item *item) @@ -1197,6 +1202,57 @@ int composite_dev_prepare(struct usb_composite_driver *composite, int composite_os_desc_req_prepare(struct usb_composite_dev *cdev, struct usb_ep *ep0); +#ifdef CONFIG_USB_CONFIGFS_UEVENT +static void configfs_work(struct work_struct *data) +{ + struct gadget_info *gi = container_of(data, struct gadget_info, work); + struct usb_composite_dev *cdev = >cdev; + char *disconnected[2] = { "USB_STATE=DISCONNECTED", NULL }; + char *connected[2] = { "USB_STATE=CONNECTED", NULL }; + char *configured[2] = { "USB_STATE=CONFIGURED", NULL }; + /* 0-connected 1-configured 2-disconnected */ + bool status[3] = { false, false, false }; + unsigned long flags; + bool uevent_sent = false; + + spin_lock_irqsave(>lock, flags); + if (cdev->config && gi->connected) + status[1] = true; + + if (gi->connected != gi->sw_connected) { + if (gi->connected) + status[0] = true; + else + status[2] = true; + gi->sw_connected = gi->connected; + } + spin_unlock_irqrestore(>lock, flags); + + if (status[0]) { + kobject_uevent_env(>dev->kobj, KOBJ_CHANGE, connected); + pr_info("%s: sent uevent %s\n", __func__, connected[0]); + uevent_sent = true; + } + + if (status[1]) { + kobject_uevent_env(>dev->kobj, KOBJ_CHANGE, configured); + pr_info("%s: sent uevent %s\n", __func__, configured[0]); + uevent_sent = true; + } + + if (status[2]) { + kobject_uevent_env(>dev->kobj, KOBJ_CHANGE, disconnected); + pr_info("%s: sent uevent %s\n", __func__, disconnected[0]); + uevent_sent = true; + } + + if (!uevent_sent) { + pr_info("%s: did not send uevent (%d %d %p)\n", __func__, + gi->connected, gi->sw_connected, cdev->config); + } +} +#endif + static void purge_configs_funcs(struct gadget_info *gi) { struct usb_configuration*c; @@ -1386,13 +1442,60 @@ static void configfs_composite_unbind(struct usb_gadget *gadget) set_gadget_data(gadget, NULL); } +#ifdef CONFIG_USB_CONFIGFS_UEVENT +static int configfs_setup(struct usb_gadget *gadget, + const struct usb_ctrlrequest *c) +{ + struct usb_composite_dev *cdev = get_gadget_data(gadget); + struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev); + int value = -EOPNOTSUPP; + unsigned long flags; + + spin_lock_irqsave(>lock, flags); + if (!gi->connected) { + gi->connected = 1; + schedule_work(>work); + } + spin_unlock_irqrestore(>lock, flags); + + value = composite_setup(gadget, c); + + spin_lock_irqsave(>lock, flags); + if (c->bRequest == USB_REQ_SET_CONFIGURATION && cdev->config) + schedule_work(>work); +
[PATCH] usb: gadget: Add uevent to notify userspace
From: Badhri Jagan Sridharan Some USB managament on userspace (like Android system) rely on the uevents generated by the composition driver to generate user notifications. Thus this patch adds uevents to be generated whenever USB changes its state: connected, disconnected, configured. The original code was created by Badhri Jagan Sridharan, and I did some optimization. CC: Badhri Jagan Sridharan Signed-off-by: Baolin Wang --- drivers/usb/gadget/Kconfig|8 +++ drivers/usb/gadget/configfs.c | 107 + 2 files changed, 115 insertions(+) diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 2ea3fc3..9f5d0c6 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -223,6 +223,14 @@ config USB_CONFIGFS appropriate symbolic links. For more information see Documentation/usb/gadget_configfs.txt. +config USB_CONFIGFS_UEVENT + boolean "Uevent notification of Gadget state" + depends on USB_CONFIGFS + help + Enable uevent notifications to userspace when the gadget + state changes. The gadget can be in any of the following + three states: "CONNECTED/DISCONNECTED/CONFIGURED" + config USB_CONFIGFS_SERIAL bool "Generic serial bulk in/out" depends on USB_CONFIGFS diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 3984787..4c2bc27 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -60,6 +60,11 @@ struct gadget_info { bool use_os_desc; char b_vendor_code; char qw_sign[OS_STRING_QW_SIGN_LEN]; +#ifdef CONFIG_USB_CONFIGFS_UEVENT + bool connected; + bool sw_connected; + struct work_struct work; +#endif }; static inline struct gadget_info *to_gadget_info(struct config_item *item) @@ -1197,6 +1202,57 @@ int composite_dev_prepare(struct usb_composite_driver *composite, int composite_os_desc_req_prepare(struct usb_composite_dev *cdev, struct usb_ep *ep0); +#ifdef CONFIG_USB_CONFIGFS_UEVENT +static void configfs_work(struct work_struct *data) +{ + struct gadget_info *gi = container_of(data, struct gadget_info, work); + struct usb_composite_dev *cdev = >cdev; + char *disconnected[2] = { "USB_STATE=DISCONNECTED", NULL }; + char *connected[2] = { "USB_STATE=CONNECTED", NULL }; + char *configured[2] = { "USB_STATE=CONFIGURED", NULL }; + /* 0-connected 1-configured 2-disconnected */ + bool status[3] = { false, false, false }; + unsigned long flags; + bool uevent_sent = false; + + spin_lock_irqsave(>lock, flags); + if (cdev->config && gi->connected) + status[1] = true; + + if (gi->connected != gi->sw_connected) { + if (gi->connected) + status[0] = true; + else + status[2] = true; + gi->sw_connected = gi->connected; + } + spin_unlock_irqrestore(>lock, flags); + + if (status[0]) { + kobject_uevent_env(>dev->kobj, KOBJ_CHANGE, connected); + pr_info("%s: sent uevent %s\n", __func__, connected[0]); + uevent_sent = true; + } + + if (status[1]) { + kobject_uevent_env(>dev->kobj, KOBJ_CHANGE, configured); + pr_info("%s: sent uevent %s\n", __func__, configured[0]); + uevent_sent = true; + } + + if (status[2]) { + kobject_uevent_env(>dev->kobj, KOBJ_CHANGE, disconnected); + pr_info("%s: sent uevent %s\n", __func__, disconnected[0]); + uevent_sent = true; + } + + if (!uevent_sent) { + pr_info("%s: did not send uevent (%d %d %p)\n", __func__, + gi->connected, gi->sw_connected, cdev->config); + } +} +#endif + static void purge_configs_funcs(struct gadget_info *gi) { struct usb_configuration*c; @@ -1386,13 +1442,60 @@ static void configfs_composite_unbind(struct usb_gadget *gadget) set_gadget_data(gadget, NULL); } +#ifdef CONFIG_USB_CONFIGFS_UEVENT +static int configfs_setup(struct usb_gadget *gadget, + const struct usb_ctrlrequest *c) +{ + struct usb_composite_dev *cdev = get_gadget_data(gadget); + struct gadget_info *gi = container_of(cdev, struct gadget_info, cdev); + int value = -EOPNOTSUPP; + unsigned long flags; + + spin_lock_irqsave(>lock, flags); + if (!gi->connected) { + gi->connected = 1; + schedule_work(>work); + } + spin_unlock_irqrestore(>lock, flags); + + value = composite_setup(gadget, c); + + spin_lock_irqsave(>lock, flags); + if (c->bRequest == USB_REQ_SET_CONFIGURATION && cdev->config) + schedule_work(>work); + spin_unlock_irqrestore(>lock, flags); + + return