diff options
Diffstat (limited to 'drivers/net/can/usb')
| -rw-r--r-- | drivers/net/can/usb/gs_usb.c | 23 | 
1 files changed, 11 insertions, 12 deletions
diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index c9482d6e947b..69b8d6da651b 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -289,11 +289,6 @@ struct gs_host_frame {  #define GS_MAX_RX_URBS 30  #define GS_NAPI_WEIGHT 32 -/* Maximum number of interfaces the driver supports per device. - * Current hardware only supports 3 interfaces. The future may vary. - */ -#define GS_MAX_INTF 3 -  struct gs_tx_context {  	struct gs_can *dev;  	unsigned int echo_id; @@ -324,7 +319,6 @@ struct gs_can {  /* usb interface struct */  struct gs_usb { -	struct gs_can *canch[GS_MAX_INTF];  	struct usb_anchor rx_submitted;  	struct usb_device *udev; @@ -336,9 +330,11 @@ struct gs_usb {  	unsigned int hf_size_rx;  	u8 active_channels; +	u8 channel_cnt;  	unsigned int pipe_in;  	unsigned int pipe_out; +	struct gs_can *canch[] __counted_by(channel_cnt);  };  /* 'allocate' a tx context. @@ -599,7 +595,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)  	}  	/* device reports out of range channel id */ -	if (hf->channel >= GS_MAX_INTF) +	if (hf->channel >= parent->channel_cnt)  		goto device_detach;  	dev = parent->canch[hf->channel]; @@ -699,7 +695,7 @@ resubmit_urb:  	/* USB failure take down all interfaces */  	if (rc == -ENODEV) {  device_detach: -		for (rc = 0; rc < GS_MAX_INTF; rc++) { +		for (rc = 0; rc < parent->channel_cnt; rc++) {  			if (parent->canch[rc])  				netif_device_detach(parent->canch[rc]->netdev);  		} @@ -1249,6 +1245,7 @@ static struct gs_can *gs_make_candev(unsigned int channel,  	netdev->flags |= IFF_ECHO; /* we support full roundtrip echo */  	netdev->dev_id = channel; +	netdev->dev_port = channel;  	/* dev setup */  	strcpy(dev->bt_const.name, KBUILD_MODNAME); @@ -1460,17 +1457,19 @@ static int gs_usb_probe(struct usb_interface *intf,  	icount = dconf.icount + 1;  	dev_info(&intf->dev, "Configuring for %u interfaces\n", icount); -	if (icount > GS_MAX_INTF) { +	if (icount > type_max(parent->channel_cnt)) {  		dev_err(&intf->dev,  			"Driver cannot handle more that %u CAN interfaces\n", -			GS_MAX_INTF); +			type_max(parent->channel_cnt));  		return -EINVAL;  	} -	parent = kzalloc(sizeof(*parent), GFP_KERNEL); +	parent = kzalloc(struct_size(parent, canch, icount), GFP_KERNEL);  	if (!parent)  		return -ENOMEM; +	parent->channel_cnt = icount; +  	init_usb_anchor(&parent->rx_submitted);  	usb_set_intfdata(intf, parent); @@ -1531,7 +1530,7 @@ static void gs_usb_disconnect(struct usb_interface *intf)  		return;  	} -	for (i = 0; i < GS_MAX_INTF; i++) +	for (i = 0; i < parent->channel_cnt; i++)  		if (parent->canch[i])  			gs_destroy_candev(parent->canch[i]);  | 
