Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa350f43 authored by Skylar Chang's avatar Skylar Chang
Browse files

msm: ipa: move ipaNatTable device node creation



For running ipacm/ipanat as net_admin instead of
root on Android. The dev/ipaNatTable device node
creation should be done in bootup time instead of
dynamic allocate.

Change-Id: I6e2b166edcb68c381bd4525b5bf22e65bde79a03
Signed-off-by: default avatarSkylar Chang <chiaweic@codeaurora.org>
parent 156aa1e4
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -2977,10 +2977,25 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
		result = -ENODEV;
		goto fail_cdev_add;
	}
	IPADBG("ipa cdev added successful. major:%d minor:%d",
	IPADBG("ipa cdev added successful. major:%d minor:%d\n",
			MAJOR(ipa_ctx->dev_num),
			MINOR(ipa_ctx->dev_num));

	if (create_nat_device()) {
		IPAERR("unable to create nat device\n");
		result = -ENODEV;
		goto fail_nat_dev_add;
	}

	/* Create workqueue for power management */
	ipa_ctx->power_mgmt_wq =
		create_singlethread_workqueue("ipa_power_mgmt");
	if (!ipa_ctx->power_mgmt_wq) {
		IPAERR("failed to create wq\n");
		result = -ENOMEM;
		goto fail_init_hw;
	}

	/* Initialize IPA RM (resource manager) */
	result = ipa_rm_initialize();
	if (result) {
@@ -3055,6 +3070,7 @@ fail_ipa_interrupts_init:
fail_create_apps_resource:
	ipa_rm_exit();
fail_ipa_rm_init:
fail_nat_dev_add:
	cdev_del(&ipa_ctx->cdev);
fail_cdev_add:
	device_destroy(ipa_ctx->class, ipa_ctx->dev_num);
+3 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include "ipa_reg.h"

#define DRV_NAME "ipa"
#define NAT_DEV_NAME "ipaNatTable"
#define IPA_COOKIE 0x57831603
#define MTU_BYTE 1500

@@ -579,6 +580,7 @@ struct ipa_nat_mem {
	bool is_mapped;
	bool is_sys_mem;
	bool is_dev_init;
	bool is_dev;
	struct mutex lock;
	void *nat_base_address;
	char *ipv4_rules_addr;
@@ -1048,4 +1050,5 @@ int ipa_sps_connect_safe(struct sps_pipe *h, struct sps_connect *connect,
int ipa_uc_interface_init(void);
int ipa_uc_reset_pipe(enum ipa_client_type ipa_client);
void ipa_register_panic_hdlr(void);
int create_nat_device(void);
#endif /* _IPA_I_H_ */
+79 −41
Original line number Diff line number Diff line
@@ -114,48 +114,20 @@ static const struct file_operations ipa_nat_fops = {
};

/**
 * allocate_nat_device() - Allocates memory for the NAT device
 * @mem:	[in/out] memory parameters
 * create_nat_device() - Create the NAT device
 *
 * Called by NAT client driver to allocate memory for the NAT entries. Based on
 * the request size either shared or system memory will be used.
 * Called during ipa init to create nat device
 *
 * Returns:	0 on success, negative on failure
 */
int allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem)
int create_nat_device(void)
{
	struct ipa_nat_mem *nat_ctx = &(ipa_ctx->nat_mem);
	int gfp_flags = GFP_KERNEL | __GFP_ZERO;
	int result;

	IPADBG("passed memory size %zu\n", mem->size);
	IPADBG("\n");

	mutex_lock(&nat_ctx->lock);
	if (mem->size <= 0 || !strlen(mem->dev_name)
			|| nat_ctx->is_dev_init == true) {
		IPADBG("Invalid Parameters or device is already init\n");
		result = -EPERM;
		goto bail;
	}

	if (mem->size > IPA_NAT_PHYS_MEM_SIZE) {
		IPADBG("Allocating system memory\n");
		nat_ctx->is_sys_mem = true;
		nat_ctx->vaddr =
		   dma_alloc_coherent(ipa_ctx->pdev, mem->size,
				   &nat_ctx->dma_handle, gfp_flags);
		if (nat_ctx->vaddr == NULL) {
			IPAERR("memory alloc failed\n");
			result = -ENOMEM;
			goto bail;
		}
		nat_ctx->size = mem->size;
	} else {
		IPADBG("using shared(local) memory\n");
		nat_ctx->is_sys_mem = false;
	}

	nat_ctx->class = class_create(THIS_MODULE, mem->dev_name);
	nat_ctx->class = class_create(THIS_MODULE, NAT_DEV_NAME);
	if (IS_ERR(nat_ctx->class)) {
		IPAERR("unable to create the class\n");
		result = -ENODEV;
@@ -164,7 +136,7 @@ int allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem)
	result = alloc_chrdev_region(&nat_ctx->dev_num,
					0,
					1,
					mem->dev_name);
					NAT_DEV_NAME);
	if (result) {
		IPAERR("alloc_chrdev_region err.\n");
		result = -ENODEV;
@@ -173,7 +145,7 @@ int allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem)

	nat_ctx->dev =
	   device_create(nat_ctx->class, NULL, nat_ctx->dev_num, nat_ctx,
			"%s", mem->dev_name);
			"%s", NAT_DEV_NAME);

	if (IS_ERR(nat_ctx->dev)) {
		IPAERR("device_create err:%ld\n", PTR_ERR(nat_ctx->dev));
@@ -190,8 +162,12 @@ int allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem)
		IPAERR("cdev_add err=%d\n", -result);
		goto cdev_add_fail;
	}
	nat_ctx->is_dev_init = true;
	IPADBG("IPA NAT driver init successfully\n");
	IPADBG("ipa nat dev added successful. major:%d minor:%d\n",
			MAJOR(nat_ctx->dev_num),
			MINOR(nat_ctx->dev_num));

	nat_ctx->is_dev = true;
	IPADBG("IPA NAT device created successfully\n");
	result = 0;
	goto bail;

@@ -211,6 +187,72 @@ vaddr_alloc_fail:
		nat_ctx->dma_handle = 0;
		nat_ctx->size = 0;
	}

bail:
	mutex_unlock(&nat_ctx->lock);

	return result;
}

/**
 * allocate_nat_device() - Allocates memory for the NAT device
 * @mem:	[in/out] memory parameters
 *
 * Called by NAT client driver to allocate memory for the NAT entries. Based on
 * the request size either shared or system memory will be used.
 *
 * Returns:	0 on success, negative on failure
 */
int allocate_nat_device(struct ipa_ioc_nat_alloc_mem *mem)
{
	struct ipa_nat_mem *nat_ctx = &(ipa_ctx->nat_mem);
	int gfp_flags = GFP_KERNEL | __GFP_ZERO;
	int result;

	IPADBG("passed memory size %zu\n", mem->size);

	mutex_lock(&nat_ctx->lock);
	if (strcmp(mem->dev_name, NAT_DEV_NAME)) {
		IPAERR("Nat device name mismatch\n");
		IPAERR("Expect: %s Recv: %s\n", NAT_DEV_NAME, mem->dev_name);
		result = -EPERM;
		goto bail;
	}

	if (nat_ctx->is_dev != true) {
		IPAERR("Nat device not created successfully during boot up\n");
		result = -EPERM;
		goto bail;
	}

	if (mem->size <= 0 ||
			nat_ctx->is_dev_init == true) {
		IPAERR("Invalid Parameters or device is already init\n");
		result = -EPERM;
		goto bail;
	}

	if (mem->size > IPA_NAT_PHYS_MEM_SIZE) {
		IPADBG("Allocating system memory\n");
		nat_ctx->is_sys_mem = true;
		nat_ctx->vaddr =
		   dma_alloc_coherent(ipa_ctx->pdev, mem->size,
				   &nat_ctx->dma_handle, gfp_flags);
		if (nat_ctx->vaddr == NULL) {
			IPAERR("memory alloc failed\n");
			result = -ENOMEM;
			goto bail;
		}
		nat_ctx->size = mem->size;
	} else {
		IPADBG("using shared(local) memory\n");
		nat_ctx->is_sys_mem = false;
	}

	nat_ctx->is_dev_init = true;
	IPADBG("IPA NAT dev init successfully\n");
	result = 0;

bail:
	mutex_unlock(&nat_ctx->lock);

@@ -459,10 +501,6 @@ void ipa_nat_free_mem_and_device(struct ipa_nat_mem *nat_ctx)
	}
	nat_ctx->is_mapped = false;
	nat_ctx->is_sys_mem = false;
	cdev_del(&nat_ctx->cdev);
	device_destroy(nat_ctx->class, nat_ctx->dev_num);
	unregister_chrdev_region(nat_ctx->dev_num, 1);
	class_destroy(nat_ctx->class);
	nat_ctx->is_dev_init = false;

	mutex_unlock(&nat_ctx->lock);