diff options
Diffstat (limited to 'drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c')
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c index 163427b..1e2c998 100644 --- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c +++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_poll_support.c @@ -36,7 +36,7 @@ static ssize_t pps_fops_read(struct file *filp, char __user *buf, unsigned int len = 0, buf_len = 5000; char* temp_buf; - ssize_t ret_cnt; + ssize_t ret_cnt = 0; struct pps_info *info; info = filp->private_data; @@ -54,7 +54,8 @@ static ssize_t pps_fops_read(struct file *filp, char __user *buf, ret_cnt = simple_read_from_buffer(buf, count, f_pos, temp_buf, len); kfree(temp_buf); - EMACERR("poll pps2intr info=%d sent by kernel\n", gDWC_ETH_QOS_prv_data->avb_class_a_intr_cnt); + if (gDWC_ETH_QOS_prv_data) + EMACERR("poll pps2intr info=%d sent by kernel\n", gDWC_ETH_QOS_prv_data->avb_class_a_intr_cnt); } else if (info->channel_no == AVB_CLASS_B_CHANNEL_NUM ) { temp_buf = kzalloc(buf_len, GFP_KERNEL); if (!temp_buf) @@ -151,8 +152,8 @@ int pps_release(struct inode *inode, struct file *file) .poll = pps_fops_poll, }; -int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cdev, - struct class* pps_class, char *pps_dev_node_name) +int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev** pps_cdev, + struct class** pps_class, char *pps_dev_node_name) { int ret; EMACDBG("create_pps_interrupt_info_device_node enter \n"); @@ -164,28 +165,28 @@ int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cde goto alloc_chrdev1_region_fail; } - pps_cdev = cdev_alloc(); - if(!pps_cdev) { + *pps_cdev = cdev_alloc(); + if(!*pps_cdev) { ret = -ENOMEM; EMACERR("failed to alloc cdev\n"); goto fail_alloc_cdev; } - cdev_init(pps_cdev, &pps_fops); + cdev_init(*pps_cdev, &pps_fops); - ret = cdev_add(pps_cdev, *pps_dev_t, 1); + ret = cdev_add(*pps_cdev, *pps_dev_t, 1); if (ret < 0) { EMACERR(":cdev_add err=%d\n", -ret); goto cdev1_add_fail; } - pps_class = class_create(THIS_MODULE, pps_dev_node_name); - if(!pps_class) { + *pps_class = class_create(THIS_MODULE, pps_dev_node_name); + if(!*pps_class) { ret = -ENODEV; EMACERR("failed to create class\n"); goto fail_create_class; } - if (!device_create(pps_class, NULL, + if (!device_create(*pps_class, NULL, *pps_dev_t, NULL, pps_dev_node_name)) { ret = -EINVAL; EMACERR("failed to create device_create\n"); @@ -197,9 +198,9 @@ int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cde return 0; fail_create_device: - class_destroy(pps_class); + class_destroy(*pps_class); fail_create_class: - cdev_del(pps_cdev); + cdev_del(*pps_cdev); cdev1_add_fail: fail_alloc_cdev: unregister_chrdev_region(*pps_dev_t, 1); @@ -210,15 +211,19 @@ int create_pps_interrupt_info_device_node(dev_t *pps_dev_t, struct cdev* pps_cde int remove_pps_interrupt_info_device_node(struct DWC_ETH_QOS_prv_data *pdata) { + cdev_del(pdata->avb_class_a_cdev); device_destroy(pdata->avb_class_a_class, pdata->avb_class_a_dev_t); class_destroy(pdata->avb_class_a_class); - cdev_del(pdata->avb_class_a_cdev); unregister_chrdev_region(pdata->avb_class_a_dev_t, 1); + pdata->avb_class_a_cdev = NULL; + pdata->avb_class_a_class = NULL; + cdev_del(pdata->avb_class_b_cdev); device_destroy(pdata->avb_class_b_class, pdata->avb_class_b_dev_t); class_destroy(pdata->avb_class_b_class); - cdev_del(pdata->avb_class_b_cdev); unregister_chrdev_region(pdata->avb_class_b_dev_t, 1); + pdata->avb_class_b_cdev = NULL; + pdata->avb_class_b_class = NULL; return 0; } |