示例#1
0
static void rmnet_usb_rx_complete(struct urb *rx_urb)
{
	struct sk_buff	*skb = (struct sk_buff *) rx_urb->context;
	struct skb_data	*entry = (struct skb_data *) skb->cb;
	struct usbnet	*dev = entry->dev;
	unsigned int	unet_offset;
	unsigned int	unet_id;
	int		mux_id;

	unet_offset =  dev->driver_info->data * no_rmnet_insts_per_dev;

	if (!rx_urb->status && dev->data[4]) {
		mux_id = rmnet_usb_data_dmux(skb, rx_urb);
		if (mux_id < 0) {
			
			rx_urb->status = -EINVAL;
		} else {
			
			unet_id = unet_offset + mux_id;
			skb->dev = unet_list[unet_id]->net;
			
		

		}
	}

	rx_complete(rx_urb);
}
static void rmnet_usb_rx_complete(struct urb *rx_urb)
{
	struct sk_buff	*skb = (struct sk_buff *) rx_urb->context;
	struct skb_data	*entry = (struct skb_data *) skb->cb;
	struct usbnet	*dev = entry->dev;
	unsigned int	unet_offset;
	unsigned int	unet_id;
	int		mux_id;

	unet_offset =  dev->driver_info->data * no_rmnet_insts_per_dev;

	if (!rx_urb->status && dev->data[4]) {
		mux_id = rmnet_usb_data_dmux(skb, rx_urb);
		if (mux_id < 0) {
			/*resubmit urb and free skb in rx_complete*/
			rx_urb->status = -EINVAL;
		} else {
			/*map urb to actual network iface based on mux id*/
			unet_id = unet_offset + mux_id;
			skb->dev = unet_list[unet_id]->net;
			entry->dev = unet_list[unet_id];
		}
	}

	rx_complete(rx_urb);
}