diff options
author | Emanuele Ghidoli <emanuele.ghidoli@toradex.com> | 2023-05-25 14:02:32 +0200 |
---|---|---|
committer | Emanuele Ghidoli <emanuele.ghidoli@toradex.com> | 2023-05-25 14:02:58 +0200 |
commit | 73aeddc78590a2b530cda6fd8daba4e5ec921ff4 (patch) | |
tree | 2ed6353368277e60e893b98345f70c210e8d674f | |
parent | b86c6cf6c19015e1d9aed22a57b088a4961e7b58 (diff) |
Revert "linux-toradex-mainline: fix usb gadget regression"
This reverts commit b86c6cf6c19015e1d9aed22a57b088a4961e7b58.
The two removed patches are already available in upstream kernel.
Related-to: ELB-5180
Signed-off-by: Emanuele Ghidoli <emanuele.ghidoli@toradex.com>
3 files changed, 0 insertions, 395 deletions
diff --git a/recipes-kernel/linux/linux-toradex-mainline-git/0001-Revert-usb-gadget-udc-core-Prevent-redundant-calls-t.patch b/recipes-kernel/linux/linux-toradex-mainline-git/0001-Revert-usb-gadget-udc-core-Prevent-redundant-calls-t.patch deleted file mode 100644 index d452f8c..0000000 --- a/recipes-kernel/linux/linux-toradex-mainline-git/0001-Revert-usb-gadget-udc-core-Prevent-redundant-calls-t.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 0da83f3da26ddc97d43a69693100f3d0467a8e38 Mon Sep 17 00:00:00 2001 -From: Francesco Dolcini <francesco.dolcini@toradex.com> -Date: Fri, 12 May 2023 15:14:34 +0200 -Subject: [PATCH 1/2] Revert "usb: gadget: udc: core: Prevent redundant calls - to pullup" - -This reverts commit a3afbf5cc887fc3401f012fe629810998ed61859. - -This depends on commit 0db213ea8eed ("usb: gadget: udc: core: Invoke -usb_gadget_connect only when started") that introduces a regression, -revert it till the issue is fixed. - -Cc: stable@vger.kernel.org -Reported-by: Stephan Gerhold <stephan@gerhold.net> -Reported-by: Francesco Dolcini <francesco.dolcini@toradex.com> -Link: https://lore.kernel.org/all/ZF4BvgsOyoKxdPFF@francesco-nb.int.toradex.com/ -Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> -Upstream-Status: Submitted [https://lore.kernel.org/all/20230512131435.205464-2-francesco@dolcini.it/] -Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> ---- - drivers/usb/gadget/udc/core.c | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c -index e85706812d61e..016d03e57a63d 100644 ---- a/drivers/usb/gadget/udc/core.c -+++ b/drivers/usb/gadget/udc/core.c -@@ -676,9 +676,6 @@ static int usb_gadget_connect_locked(struct usb_gadget *gadget) - goto out; - } - -- if (gadget->connected) -- goto out; -- - if (gadget->deactivated || !gadget->udc->started) { - /* - * If gadget is deactivated we only save new state. --- -2.35.3 - diff --git a/recipes-kernel/linux/linux-toradex-mainline-git/0002-Revert-usb-gadget-udc-core-Invoke-usb_gadget_connect.patch b/recipes-kernel/linux/linux-toradex-mainline-git/0002-Revert-usb-gadget-udc-core-Invoke-usb_gadget_connect.patch deleted file mode 100644 index 075f787..0000000 --- a/recipes-kernel/linux/linux-toradex-mainline-git/0002-Revert-usb-gadget-udc-core-Invoke-usb_gadget_connect.patch +++ /dev/null @@ -1,353 +0,0 @@ -From b4f6bbf05eb32814fcb17276e0d8e61bb42d2253 Mon Sep 17 00:00:00 2001 -From: Francesco Dolcini <francesco.dolcini@toradex.com> -Date: Fri, 12 May 2023 15:14:35 +0200 -Subject: [PATCH 2/2] Revert "usb: gadget: udc: core: Invoke usb_gadget_connect - only when started" - -This reverts commit 0db213ea8eed5534a5169e807f28103cbc9d23df. - -It introduces an issues with configuring the USB gadget hangs forever -on multiple Qualcomm and NXP i.MX SoC at least. - -Cc: stable@vger.kernel.org -Fixes: 0db213ea8eed ("usb: gadget: udc: core: Invoke usb_gadget_connect only when started") -Reported-by: Stephan Gerhold <stephan@gerhold.net> -Reported-by: Francesco Dolcini <francesco.dolcini@toradex.com> -Link: https://lore.kernel.org/all/ZF4BvgsOyoKxdPFF@francesco-nb.int.toradex.com/ -Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> -Upstream-Status: Submitted [https://lore.kernel.org/all/20230512131435.205464-3-francesco@dolcini.it/] -Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> ---- - drivers/usb/gadget/udc/core.c | 148 ++++++++++------------------------ - 1 file changed, 44 insertions(+), 104 deletions(-) - -diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c -index 016d03e57a63d..bf9878e1a72a8 100644 ---- a/drivers/usb/gadget/udc/core.c -+++ b/drivers/usb/gadget/udc/core.c -@@ -37,10 +37,6 @@ static struct bus_type gadget_bus_type; - * @vbus: for udcs who care about vbus status, this value is real vbus status; - * for udcs who do not care about vbus status, this value is always true - * @started: the UDC's started state. True if the UDC had started. -- * @connect_lock: protects udc->vbus, udc->started, gadget->connect, gadget->deactivate related -- * functions. usb_gadget_connect_locked, usb_gadget_disconnect_locked, -- * usb_udc_connect_control_locked, usb_gadget_udc_start_locked, usb_gadget_udc_stop_locked are -- * called with this lock held. - * - * This represents the internal data structure which is used by the UDC-class - * to hold information about udc driver and gadget together. -@@ -52,7 +48,6 @@ struct usb_udc { - struct list_head list; - bool vbus; - bool started; -- struct mutex connect_lock; - }; - - static struct class *udc_class; -@@ -665,9 +660,17 @@ int usb_gadget_vbus_disconnect(struct usb_gadget *gadget) - } - EXPORT_SYMBOL_GPL(usb_gadget_vbus_disconnect); - --/* Internal version of usb_gadget_connect needs to be called with connect_lock held. */ --static int usb_gadget_connect_locked(struct usb_gadget *gadget) -- __must_hold(&gadget->udc->connect_lock) -+/** -+ * usb_gadget_connect - software-controlled connect to USB host -+ * @gadget:the peripheral being connected -+ * -+ * Enables the D+ (or potentially D-) pullup. The host will start -+ * enumerating this gadget when the pullup is active and a VBUS session -+ * is active (the link is powered). -+ * -+ * Returns zero on success, else negative errno. -+ */ -+int usb_gadget_connect(struct usb_gadget *gadget) - { - int ret = 0; - -@@ -676,12 +679,10 @@ static int usb_gadget_connect_locked(struct usb_gadget *gadget) - goto out; - } - -- if (gadget->deactivated || !gadget->udc->started) { -+ if (gadget->deactivated) { - /* - * If gadget is deactivated we only save new state. - * Gadget will be connected automatically after activation. -- * -- * udc first needs to be started before gadget can be pulled up. - */ - gadget->connected = true; - goto out; -@@ -696,32 +697,22 @@ static int usb_gadget_connect_locked(struct usb_gadget *gadget) - - return ret; - } -+EXPORT_SYMBOL_GPL(usb_gadget_connect); - - /** -- * usb_gadget_connect - software-controlled connect to USB host -- * @gadget:the peripheral being connected -+ * usb_gadget_disconnect - software-controlled disconnect from USB host -+ * @gadget:the peripheral being disconnected - * -- * Enables the D+ (or potentially D-) pullup. The host will start -- * enumerating this gadget when the pullup is active and a VBUS session -- * is active (the link is powered). -+ * Disables the D+ (or potentially D-) pullup, which the host may see -+ * as a disconnect (when a VBUS session is active). Not all systems -+ * support software pullup controls. -+ * -+ * Following a successful disconnect, invoke the ->disconnect() callback -+ * for the current gadget driver so that UDC drivers don't need to. - * - * Returns zero on success, else negative errno. - */ --int usb_gadget_connect(struct usb_gadget *gadget) --{ -- int ret; -- -- mutex_lock(&gadget->udc->connect_lock); -- ret = usb_gadget_connect_locked(gadget); -- mutex_unlock(&gadget->udc->connect_lock); -- -- return ret; --} --EXPORT_SYMBOL_GPL(usb_gadget_connect); -- --/* Internal version of usb_gadget_disconnect needs to be called with connect_lock held. */ --static int usb_gadget_disconnect_locked(struct usb_gadget *gadget) -- __must_hold(&gadget->udc->connect_lock) -+int usb_gadget_disconnect(struct usb_gadget *gadget) - { - int ret = 0; - -@@ -733,12 +724,10 @@ static int usb_gadget_disconnect_locked(struct usb_gadget *gadget) - if (!gadget->connected) - goto out; - -- if (gadget->deactivated || !gadget->udc->started) { -+ if (gadget->deactivated) { - /* - * If gadget is deactivated we only save new state. - * Gadget will stay disconnected after activation. -- * -- * udc should have been started before gadget being pulled down. - */ - gadget->connected = false; - goto out; -@@ -758,30 +747,6 @@ static int usb_gadget_disconnect_locked(struct usb_gadget *gadget) - - return ret; - } -- --/** -- * usb_gadget_disconnect - software-controlled disconnect from USB host -- * @gadget:the peripheral being disconnected -- * -- * Disables the D+ (or potentially D-) pullup, which the host may see -- * as a disconnect (when a VBUS session is active). Not all systems -- * support software pullup controls. -- * -- * Following a successful disconnect, invoke the ->disconnect() callback -- * for the current gadget driver so that UDC drivers don't need to. -- * -- * Returns zero on success, else negative errno. -- */ --int usb_gadget_disconnect(struct usb_gadget *gadget) --{ -- int ret; -- -- mutex_lock(&gadget->udc->connect_lock); -- ret = usb_gadget_disconnect_locked(gadget); -- mutex_unlock(&gadget->udc->connect_lock); -- -- return ret; --} - EXPORT_SYMBOL_GPL(usb_gadget_disconnect); - - /** -@@ -802,11 +767,10 @@ int usb_gadget_deactivate(struct usb_gadget *gadget) - if (gadget->deactivated) - goto out; - -- mutex_lock(&gadget->udc->connect_lock); - if (gadget->connected) { -- ret = usb_gadget_disconnect_locked(gadget); -+ ret = usb_gadget_disconnect(gadget); - if (ret) -- goto unlock; -+ goto out; - - /* - * If gadget was being connected before deactivation, we want -@@ -816,8 +780,6 @@ int usb_gadget_deactivate(struct usb_gadget *gadget) - } - gadget->deactivated = true; - --unlock: -- mutex_unlock(&gadget->udc->connect_lock); - out: - trace_usb_gadget_deactivate(gadget, ret); - -@@ -841,7 +803,6 @@ int usb_gadget_activate(struct usb_gadget *gadget) - if (!gadget->deactivated) - goto out; - -- mutex_lock(&gadget->udc->connect_lock); - gadget->deactivated = false; - - /* -@@ -849,8 +810,7 @@ int usb_gadget_activate(struct usb_gadget *gadget) - * while it was being deactivated, we call usb_gadget_connect(). - */ - if (gadget->connected) -- ret = usb_gadget_connect_locked(gadget); -- mutex_unlock(&gadget->udc->connect_lock); -+ ret = usb_gadget_connect(gadget); - - out: - trace_usb_gadget_activate(gadget, ret); -@@ -1091,13 +1051,12 @@ EXPORT_SYMBOL_GPL(usb_gadget_set_state); - - /* ------------------------------------------------------------------------- */ - --/* Acquire connect_lock before calling this function. */ --static void usb_udc_connect_control_locked(struct usb_udc *udc) __must_hold(&udc->connect_lock) -+static void usb_udc_connect_control(struct usb_udc *udc) - { -- if (udc->vbus && udc->started) -- usb_gadget_connect_locked(udc->gadget); -+ if (udc->vbus) -+ usb_gadget_connect(udc->gadget); - else -- usb_gadget_disconnect_locked(udc->gadget); -+ usb_gadget_disconnect(udc->gadget); - } - - /** -@@ -1113,12 +1072,10 @@ void usb_udc_vbus_handler(struct usb_gadget *gadget, bool status) - { - struct usb_udc *udc = gadget->udc; - -- mutex_lock(&udc->connect_lock); - if (udc) { - udc->vbus = status; -- usb_udc_connect_control_locked(udc); -+ usb_udc_connect_control(udc); - } -- mutex_unlock(&udc->connect_lock); - } - EXPORT_SYMBOL_GPL(usb_udc_vbus_handler); - -@@ -1140,7 +1097,7 @@ void usb_gadget_udc_reset(struct usb_gadget *gadget, - EXPORT_SYMBOL_GPL(usb_gadget_udc_reset); - - /** -- * usb_gadget_udc_start_locked - tells usb device controller to start up -+ * usb_gadget_udc_start - tells usb device controller to start up - * @udc: The UDC to be started - * - * This call is issued by the UDC Class driver when it's about -@@ -1151,11 +1108,8 @@ EXPORT_SYMBOL_GPL(usb_gadget_udc_reset); - * necessary to have it powered on. - * - * Returns zero on success, else negative errno. -- * -- * Caller should acquire connect_lock before invoking this function. - */ --static inline int usb_gadget_udc_start_locked(struct usb_udc *udc) -- __must_hold(&udc->connect_lock) -+static inline int usb_gadget_udc_start(struct usb_udc *udc) - { - int ret; - -@@ -1172,7 +1126,7 @@ static inline int usb_gadget_udc_start_locked(struct usb_udc *udc) - } - - /** -- * usb_gadget_udc_stop_locked - tells usb device controller we don't need it anymore -+ * usb_gadget_udc_stop - tells usb device controller we don't need it anymore - * @udc: The UDC to be stopped - * - * This call is issued by the UDC Class driver after calling -@@ -1181,11 +1135,8 @@ static inline int usb_gadget_udc_start_locked(struct usb_udc *udc) - * The details are implementation specific, but it can go as - * far as powering off UDC completely and disable its data - * line pullups. -- * -- * Caller should acquire connect lock before invoking this function. - */ --static inline void usb_gadget_udc_stop_locked(struct usb_udc *udc) -- __must_hold(&udc->connect_lock) -+static inline void usb_gadget_udc_stop(struct usb_udc *udc) - { - if (!udc->started) { - dev_err(&udc->dev, "UDC had already stopped\n"); -@@ -1344,7 +1295,6 @@ int usb_add_gadget(struct usb_gadget *gadget) - - udc->gadget = gadget; - gadget->udc = udc; -- mutex_init(&udc->connect_lock); - - udc->started = false; - -@@ -1546,15 +1496,11 @@ static int gadget_bind_driver(struct device *dev) - if (ret) - goto err_bind; - -- mutex_lock(&udc->connect_lock); -- ret = usb_gadget_udc_start_locked(udc); -- if (ret) { -- mutex_unlock(&udc->connect_lock); -+ ret = usb_gadget_udc_start(udc); -+ if (ret) - goto err_start; -- } - usb_gadget_enable_async_callbacks(udc); -- usb_udc_connect_control_locked(udc); -- mutex_unlock(&udc->connect_lock); -+ usb_udc_connect_control(udc); - - kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); - return 0; -@@ -1585,14 +1531,12 @@ static void gadget_unbind_driver(struct device *dev) - - kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); - -- mutex_lock(&udc->connect_lock); -- usb_gadget_disconnect_locked(gadget); -+ usb_gadget_disconnect(gadget); - usb_gadget_disable_async_callbacks(udc); - if (gadget->irq) - synchronize_irq(gadget->irq); - udc->driver->unbind(gadget); -- usb_gadget_udc_stop_locked(udc); -- mutex_unlock(&udc->connect_lock); -+ usb_gadget_udc_stop(udc); - - mutex_lock(&udc_lock); - driver->is_bound = false; -@@ -1678,15 +1622,11 @@ static ssize_t soft_connect_store(struct device *dev, - } - - if (sysfs_streq(buf, "connect")) { -- mutex_lock(&udc->connect_lock); -- usb_gadget_udc_start_locked(udc); -- usb_gadget_connect_locked(udc->gadget); -- mutex_unlock(&udc->connect_lock); -+ usb_gadget_udc_start(udc); -+ usb_gadget_connect(udc->gadget); - } else if (sysfs_streq(buf, "disconnect")) { -- mutex_lock(&udc->connect_lock); -- usb_gadget_disconnect_locked(udc->gadget); -- usb_gadget_udc_stop_locked(udc); -- mutex_unlock(&udc->connect_lock); -+ usb_gadget_disconnect(udc->gadget); -+ usb_gadget_udc_stop(udc); - } else { - dev_err(dev, "unsupported command '%s'\n", buf); - ret = -EINVAL; --- -2.35.3 - diff --git a/recipes-kernel/linux/linux-toradex-mainline_git.bb b/recipes-kernel/linux/linux-toradex-mainline_git.bb index 16965dd..fc66717 100644 --- a/recipes-kernel/linux/linux-toradex-mainline_git.bb +++ b/recipes-kernel/linux/linux-toradex-mainline_git.bb @@ -43,8 +43,6 @@ SRC_URI:append = " \ file://0002-arm64-dts-imx8mp-verdin-Add-yavia-carrier-board.patch \ file://0001-media-v4l2-async-fix-binding-async-subdevs-with-mult.patch \ file://0002-media-i2c-ov5640-Implement-get_mbus_config.patch \ - file://0001-Revert-usb-gadget-udc-core-Prevent-redundant-calls-t.patch \ - file://0002-Revert-usb-gadget-udc-core-Invoke-usb_gadget_connect.patch \ " LINUX_VERSION ?= "6.1.27" |