diff options
Diffstat (limited to 'drivers/net/can/usb/gs_usb.c')
| -rw-r--r-- | drivers/net/can/usb/gs_usb.c | 25 | 
1 files changed, 18 insertions, 7 deletions
| diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index bc86e9b329fd..b6f4de375df7 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; | 
