static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int retval = 0; u32 pyld_sz; u8 *param = NULL; IPAWANDBG("device %s got ioctl events :>>>\n", DRIVER_NAME); switch (cmd) { case WAN_IOC_ADD_FLT_RULE: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_install_fltr_rule_req_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (qmi_filter_request_send( (struct ipa_install_fltr_rule_req_msg_v01 *)param)) { IPAWANDBG("IPACM->Q6 add filter rule failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_ADD_FLT_RULE_INDEX: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_INDEX :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_fltr_installed_notif_req_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (qmi_filter_notify_send( (struct ipa_fltr_installed_notif_req_msg_v01 *)param)) { IPAWANDBG("IPACM->Q6 rule index fail\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; default: retval = -ENOTTY; } kfree(param); return retval; }
static long wan_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int retval = 0; u32 pyld_sz; u8 *param = NULL; IPAWANDBG("device %s got ioctl events :>>>\n", DRIVER_NAME); if (!process_ioctl) { IPAWANDBG("modem is in SSR, ignoring ioctl\n"); return -EAGAIN; } switch (cmd) { case WAN_IOC_ADD_FLT_RULE: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_install_fltr_rule_req_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (qmi_filter_request_send( (struct ipa_install_fltr_rule_req_msg_v01 *)param)) { IPAWANDBG("IPACM->Q6 add filter rule failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_ADD_FLT_RULE_INDEX: IPAWANDBG("device %s got WAN_IOC_ADD_FLT_RULE_INDEX :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct ipa_fltr_installed_notif_req_msg_v01); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (qmi_filter_notify_send( (struct ipa_fltr_installed_notif_req_msg_v01 *)param)) { IPAWANDBG("IPACM->Q6 rule index fail\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_VOTE_FOR_BW_MBPS: IPAWANDBG("device %s got WAN_IOC_VOTE_FOR_BW_MBPS :>>>\n", DRIVER_NAME); pyld_sz = sizeof(uint32_t); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (vote_for_bus_bw((uint32_t *)param)) { IPAWANERR("Failed to vote for bus BW\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_POLL_TETHERING_STATS: IPAWANDBG("device %s got WAN_IOCTL_POLL_TETHERING_STATS :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct wan_ioctl_poll_tethering_stats); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (rmnet_ipa_poll_tethering_stats( (struct wan_ioctl_poll_tethering_stats *)param)) { IPAWANERR("WAN_IOCTL_POLL_TETHERING_STATS failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; case WAN_IOC_SET_DATA_QUOTA: IPAWANDBG("device %s got WAN_IOCTL_SET_DATA_QUOTA :>>>\n", DRIVER_NAME); pyld_sz = sizeof(struct wan_ioctl_set_data_quota); param = kzalloc(pyld_sz, GFP_KERNEL); if (!param) { retval = -ENOMEM; break; } if (copy_from_user(param, (u8 *)arg, pyld_sz)) { retval = -EFAULT; break; } if (rmnet_ipa_set_data_quota( (struct wan_ioctl_set_data_quota *)param)) { IPAWANERR("WAN_IOC_SET_DATA_QUOTA failed\n"); retval = -EFAULT; break; } if (copy_to_user((u8 *)arg, param, pyld_sz)) { retval = -EFAULT; break; } break; default: retval = -ENOTTY; } kfree(param); return retval; }