static netdev_tx_t baseband_usb_netdev_start_xmit(
	struct sk_buff *skb, struct net_device *dev)
{
	int i;
	struct baseband_usb *usb;
	int err;

	pr_debug("baseband_usb_netdev_start_xmit\n");

	/* check input */
	if (!skb) {
		pr_err("no skb\n");
		return NETDEV_TX_BUSY;
	}
	if (!dev) {
		pr_err("no net dev\n");
		return NETDEV_TX_BUSY;
	}

	/* find index of network device which is transmitting */
	for (i = 0; i < max_intfs; i++) {
		if (usb_net_raw_ip_dev[i] == dev)
			break;
	}
	if (i >= max_intfs) {
		pr_err("unknown net dev %p\n", dev);
		return NETDEV_TX_BUSY;
	}
	usb = baseband_usb_net[i];

	/* autoresume if suspended */
	if (usb->usb.interface) {
		usb_autopm_get_interface_async(usb->usb.interface);
	} else {
		pr_err("%s: tx get interface error\n", __func__);
		netif_stop_queue(dev);
		usb->stats.tx_errors++;
		return NETDEV_TX_BUSY;
	}

	/* submit tx urb */
	err = usb_net_raw_ip_tx_urb_submit(usb, skb);
	if (err < 0) {
		pr_err("%s: tx urb submit error\n", __func__);
		netif_stop_queue(dev);
		usb->stats.tx_errors++;
		return NETDEV_TX_BUSY;
	}

	return NETDEV_TX_OK;
}
Example #2
0
static netdev_tx_t baseband_usb_netdev_start_xmit(
	struct sk_buff *skb, struct net_device *dev)
{
	int i;
	struct baseband_usb *usb;
	int err;

	pr_debug("baseband_usb_netdev_start_xmit\n");

	/* check input */
	if (!skb) {
		pr_err("no skb\n");
		return NETDEV_TX_BUSY;
	}
	if (!dev) {
		pr_err("no net dev\n");
		return NETDEV_TX_BUSY;
	}

	/* find index of network device which is transmitting */
	for (i = 0; i < max_intfs; i++) {
		if (usb_net_raw_ip_dev[i] == dev)
			break;
	}
	if (i >= max_intfs) {
		pr_err("unknown net dev %p\n", dev);
		return NETDEV_TX_BUSY;
	}
	usb = baseband_usb_net[i];

	/* submit tx urb */
	err = usb_net_raw_ip_tx_urb_submit(usb, skb);
	if (err < 0) {
		pr_err("tx urb submit error\n");
		netif_stop_queue(dev);
		return NETDEV_TX_BUSY;
	}

	return NETDEV_TX_OK;
}
Example #3
0
static netdev_tx_t baseband_usb_netdev_start_xmit(
	struct sk_buff *skb, struct net_device *dev)
{
	/* 77228-5 patch */
	int i;
	struct baseband_usb *usb;
	/* 77228-5 patch */
	int err;

	//+Sophia:0112
	struct rmnet_private *p = netdev_priv(dev);
	//-Sophia:0112

	pr_debug("baseband_usb_netdev_start_xmit\n");

	/* check input */
	if (!skb) {
		pr_err("no skb\n");
		/* 77969-7 patch */
		return NETDEV_TX_BUSY;
		/* 77969-7 patch */
	}

	/* 77228-5 patch */
	if (!dev) {
		pr_err("no net dev\n");
		/* 77969-7 patch */
		return NETDEV_TX_BUSY;
		/* 77969-7 patch */
	/* 77228-5 patch */
	}
	/* 77228-5 patch */

	/* find index of network device which is transmitting */
	for (i = 0; i < max_intfs; i++) {
		if (usb_net_raw_ip_dev[i] == dev)
			break;
	/* 77228-5 patch */
	}
	/* 77228-5 patch */
	if (i >= max_intfs) {
		pr_err("unknown net dev %p\n", dev);
		/* 77969-7 patch */
		return NETDEV_TX_BUSY;
		/* 77969-7 patch */
	/* 77228-5 patch */
	}
	/* 77228-5 patch */
	usb = baseband_usb_net[i];
	/* 77228-5 patch */

	//+Sophia:0112
	p->stats.tx_packets++;
	p->stats.tx_bytes += skb->len - 14;
	//-Sophia:0112

	if (usb->usb.interface) {
		/* autoresume if suspended */
		usb_autopm_get_interface_async(usb->usb.interface);
	} else{
		pr_err("tx urb submit error\n");
		netif_stop_queue(dev);
		return NETDEV_TX_BUSY;
	}

#if 0
	if (usb->susp_count > 0) {
		//pr_info("%s: usb->susp_count %d > 0 (suspended -> autoresume)\n",__func__, usb->susp_count);
		if (usb_autopm_get_interface_async(usb->usb.interface) >= 0) {
			usb_autopm_put_interface_async(usb->usb.interface);
		}else{
			pr_debug("usb_autopm_get_interface_async failed!\n");

		}
		//return NETDEV_TX_BUSY;
	}
#endif
	/* submit tx urb */
	/* 77228-5 patch */
	err = usb_net_raw_ip_tx_urb_submit(usb, skb);
	/* 77228-5 patch */
	
	if (err < 0) {
		/* 77228-5 patch */
		pr_err("tx urb submit error\n");
		/* 77228-5 patch */
		rawlog4("[ref] -- %s(%d) %d\n", __func__, __LINE__, --autopm_refcnt);
		/*83290-1*/
		netif_stop_queue(dev);
		/*83290-1*/
		/* 77969-5 patch */
		return NETDEV_TX_BUSY;
		/* 77969-5 patch */
	}
	
	return NETDEV_TX_OK;
}