static int wwan_stop(struct net_device *dev)
{
	pr_debug("[%s] wwan_stop()\n", dev->name);
	__wwan_close(dev);
	netif_stop_queue(dev);
	return 0;
}
static int wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	int rc = 0;

	switch (cmd) {
	case RMNET_IOCTL_SET_LLP_IP:        
		break;
	case RMNET_IOCTL_GET_LLP:           
		ifr->ifr_ifru.ifru_data = (void *) RMNET_MODE_LLP_IP;
		break;
	case RMNET_IOCTL_SET_QOS_DISABLE:   
		break;
	case RMNET_IOCTL_FLOW_ENABLE:
		tc_qdisc_flow_control(dev, (u32)ifr->ifr_data, 1);
		pr_debug("[%s] %s: enabled flow", dev->name, __func__);
		break;
	case RMNET_IOCTL_FLOW_DISABLE:
		tc_qdisc_flow_control(dev, (u32)ifr->ifr_data, 0);
		pr_debug("[%s] %s: disabled flow", dev->name, __func__);
		break;
	case RMNET_IOCTL_GET_QOS:           
		
		ifr->ifr_ifru.ifru_data = (void *) 0;
		break;
	case RMNET_IOCTL_GET_OPMODE:        
		ifr->ifr_ifru.ifru_data = (void *) RMNET_MODE_LLP_IP;
		break;
	case RMNET_IOCTL_OPEN:  
		rc = __wwan_open(dev);
		pr_debug("[%s] wwan_ioctl(): open transport port\n",
		     dev->name);
		break;
	case RMNET_IOCTL_CLOSE:  
		rc = __wwan_close(dev);
		pr_debug("[%s] wwan_ioctl(): close transport port\n",
		     dev->name);
		break;
	default:
		pr_err("[%s] error: wwan_ioct called for unsupported cmd[%d]",
		       dev->name, cmd);
		return -EINVAL;
	}
	return rc;
}
/**
 * wwan_ioctl() - I/O control for wwan network driver.
 *
 * @dev: network device
 * @ifr: ignored
 * @cmd: cmd to be excecuded. can be one of the following:
 * WWAN_IOCTL_OPEN - Open the network interface
 * WWAN_IOCTL_CLOSE - Close the network interface
 *
 * Return codes:
 * 0: success
 * NETDEV_TX_BUSY: Error while transmitting the skb. Try again
 * later
 * -EFAULT: Error while transmitting the skb
 */
static int wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
	int rc = 0;
	struct rmnet_ioctl_data_s ioctl_data;

	switch (cmd) {
	case RMNET_IOCTL_SET_LLP_IP:        /* Set RAWIP protocol */
		break;
	case RMNET_IOCTL_GET_LLP:           /* Get link protocol state */
		ioctl_data.u.operation_mode = RMNET_MODE_LLP_IP;
		if (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,
			sizeof(struct rmnet_ioctl_data_s)))
			rc = -EFAULT;
		break;
	case RMNET_IOCTL_SET_QOS_DISABLE:   /* Set QoS header disabled */
		break;
	case RMNET_IOCTL_FLOW_ENABLE:
		if (copy_from_user(&ioctl_data, ifr->ifr_ifru.ifru_data,
			sizeof(struct rmnet_ioctl_data_s))) {
			rc = -EFAULT;
			break;
		}
		tc_qdisc_flow_control(dev, ioctl_data.u.tcm_handle, 1);
		pr_debug("[%s] %s: enabled flow", dev->name, __func__);
		break;
	case RMNET_IOCTL_FLOW_DISABLE:
		if (copy_from_user(&ioctl_data, ifr->ifr_ifru.ifru_data,
			sizeof(struct rmnet_ioctl_data_s))) {
			rc = -EFAULT;
			break;
		}
		tc_qdisc_flow_control(dev, ioctl_data.u.tcm_handle, 0);
		pr_debug("[%s] %s: disabled flow", dev->name, __func__);
		break;
	case RMNET_IOCTL_GET_QOS:           /* Get QoS header state    */
		/* QoS disabled */
		ioctl_data.u.operation_mode = 0;
		if (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,
			sizeof(struct rmnet_ioctl_data_s)))
			rc = -EFAULT;
		break;
	case RMNET_IOCTL_GET_OPMODE:        /* Get operation mode      */
		ioctl_data.u.operation_mode = RMNET_MODE_LLP_IP;
		if (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,
			sizeof(struct rmnet_ioctl_data_s)))
			rc = -EFAULT;
		break;
	case RMNET_IOCTL_OPEN:  /* Open transport port */
		rc = __wwan_open(dev);
		pr_debug("[%s] wwan_ioctl(): open transport port\n",
		     dev->name);
		break;
	case RMNET_IOCTL_CLOSE:  /* Close transport port */
		rc = __wwan_close(dev);
		pr_debug("[%s] wwan_ioctl(): close transport port\n",
		     dev->name);
		break;
	default:
		pr_err("[%s] error: wwan_ioct called for unsupported cmd[%d]",
		       dev->name, cmd);
		return -EINVAL;
	}
	return rc;
}