Patch "can: gs_usb: add usb endpoint address detection at driver probe step" has been added to the 6.12-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    can: gs_usb: add usb endpoint address detection at driver probe step

to the 6.12-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     can-gs_usb-add-usb-endpoint-address-detection-at-dri.patch
and it can be found in the queue-6.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 52bef541cfcb0090c4c57bf06eb011d0e0c90492
Author: Alexander Kozhinov <ak.alexander.kozhinov@xxxxxxxxx>
Date:   Fri Oct 18 23:24:26 2024 +0200

    can: gs_usb: add usb endpoint address detection at driver probe step
    
    [ Upstream commit 889b2ae9139a87b3390f7003cb1bb3d65bf90a26 ]
    
    There is an approach made to implement gs_usb firmware/driver based on
    Zephyr RTOS. It was found that USB stack of Zephyr RTOS overwrites USB
    EP addresses, if they have different last 4 bytes in absence of other
    endpoints.
    
    For example in case of gs_usb candlelight firmware EP-IN is 0x81 and
    EP-OUT 0x02. If there are no additional USB endpoints, Zephyr RTOS will
    overwrite EP-OUT to 0x01. More information can be found in the
    discussion with Zephyr RTOS USB stack maintainer here:
    
    https://github.com/zephyrproject-rtos/zephyr/issues/67812
    
    There are already two different gs_usb FW driver implementations based
    on Zephyr RTOS:
    
    1. https://github.com/CANnectivity/cannectivity
       (by: https://github.com/henrikbrixandersen)
    2. https://github.com/zephyrproject-rtos/zephyr/compare/main...KozhinovAlexander:zephyr:gs_usb
       (by: https://github.com/KozhinovAlexander)
    
    At the moment both Zephyr RTOS implementations use dummy USB endpoint,
    to overcome described USB stack behavior from Zephyr itself. Since
    Zephyr RTOS is intended to be used on microcontrollers with very
    constrained amount of resources (ROM, RAM) and additional endpoint
    requires memory, it is more convenient to update the gs_usb driver in
    the Linux kernel.
    
    To fix this problem, update the gs_usb driver from using hard coded
    endpoint numbers to evaluate the endpoint descriptors and use the
    endpoints provided there.
    
    Fixes: d08e973a77d1 ("can: gs_usb: Added support for the GS_USB CAN devices")
    Reviewed-by: Vincent Mailhol <mailhol.vincent@xxxxxxxxxx>
    Signed-off-by: Alexander Kozhinov <ak.alexander.kozhinov@xxxxxxxxx>
    Link: https://patch.msgid.link/20241018212450.31746-1-ak.alexander.kozhinov@xxxxxxxxx
    Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
index bc86e9b329fd1..b6f4de375df75 100644
--- a/drivers/net/can/usb/gs_usb.c
+++ b/drivers/net/can/usb/gs_usb.c
@@ -43,9 +43,6 @@
 #define USB_XYLANTA_SAINT3_VENDOR_ID 0x16d0
 #define USB_XYLANTA_SAINT3_PRODUCT_ID 0x0f30
 
-#define GS_USB_ENDPOINT_IN 1
-#define GS_USB_ENDPOINT_OUT 2
-
 /* Timestamp 32 bit timer runs at 1 MHz (1 µs tick). Worker accounts
  * for timer overflow (will be after ~71 minutes)
  */
@@ -336,6 +333,9 @@ struct gs_usb {
 
 	unsigned int hf_size_rx;
 	u8 active_channels;
+
+	unsigned int pipe_in;
+	unsigned int pipe_out;
 };
 
 /* 'allocate' a tx context.
@@ -687,7 +687,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
 
 resubmit_urb:
 	usb_fill_bulk_urb(urb, parent->udev,
-			  usb_rcvbulkpipe(parent->udev, GS_USB_ENDPOINT_IN),
+			  parent->pipe_in,
 			  hf, dev->parent->hf_size_rx,
 			  gs_usb_receive_bulk_callback, parent);
 
@@ -819,7 +819,7 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
 	}
 
 	usb_fill_bulk_urb(urb, dev->udev,
-			  usb_sndbulkpipe(dev->udev, GS_USB_ENDPOINT_OUT),
+			  dev->parent->pipe_out,
 			  hf, dev->hf_size_tx,
 			  gs_usb_xmit_callback, txc);
 
@@ -925,8 +925,7 @@ static int gs_can_open(struct net_device *netdev)
 			/* fill, anchor, and submit rx urb */
 			usb_fill_bulk_urb(urb,
 					  dev->udev,
-					  usb_rcvbulkpipe(dev->udev,
-							  GS_USB_ENDPOINT_IN),
+					  dev->parent->pipe_in,
 					  buf,
 					  dev->parent->hf_size_rx,
 					  gs_usb_receive_bulk_callback, parent);
@@ -1413,6 +1412,7 @@ static int gs_usb_probe(struct usb_interface *intf,
 			const struct usb_device_id *id)
 {
 	struct usb_device *udev = interface_to_usbdev(intf);
+	struct usb_endpoint_descriptor *ep_in, *ep_out;
 	struct gs_host_frame *hf;
 	struct gs_usb *parent;
 	struct gs_host_config hconf = {
@@ -1422,6 +1422,13 @@ static int gs_usb_probe(struct usb_interface *intf,
 	unsigned int icount, i;
 	int rc;
 
+	rc = usb_find_common_endpoints(intf->cur_altsetting,
+				       &ep_in, &ep_out, NULL, NULL);
+	if (rc) {
+		dev_err(&intf->dev, "Required endpoints not found\n");
+		return rc;
+	}
+
 	/* send host config */
 	rc = usb_control_msg_send(udev, 0,
 				  GS_USB_BREQ_HOST_FORMAT,
@@ -1466,6 +1473,10 @@ static int gs_usb_probe(struct usb_interface *intf,
 	usb_set_intfdata(intf, parent);
 	parent->udev = udev;
 
+	/* store the detected endpoints */
+	parent->pipe_in = usb_rcvbulkpipe(parent->udev, ep_in->bEndpointAddress);
+	parent->pipe_out = usb_sndbulkpipe(parent->udev, ep_out->bEndpointAddress);
+
 	for (i = 0; i < icount; i++) {
 		unsigned int hf_size_rx = 0;
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux