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