Loading drivers/platform/msm/ipa/ipa.c +17 −1 Original line number Diff line number Diff line Loading @@ -2972,10 +2972,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) { Loading Loading @@ -3050,6 +3065,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); Loading drivers/platform/msm/ipa/ipa_i.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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_ */ drivers/platform/msm/ipa/ipa_nat.c +79 −41 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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)); Loading @@ -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; Loading @@ -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); Loading Loading @@ -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); Loading Loading
drivers/platform/msm/ipa/ipa.c +17 −1 Original line number Diff line number Diff line Loading @@ -2972,10 +2972,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) { Loading Loading @@ -3050,6 +3065,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); Loading
drivers/platform/msm/ipa/ipa_i.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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_ */
drivers/platform/msm/ipa/ipa_nat.c +79 −41 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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)); Loading @@ -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; Loading @@ -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); Loading Loading @@ -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); Loading