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); }