diff --git a/utils/pktlog/linux_ac.c b/utils/pktlog/linux_ac.c index 5f7af30610..47f2abf950 100644 --- a/utils/pktlog/linux_ac.c +++ b/utils/pktlog/linux_ac.c @@ -551,7 +551,7 @@ static void pktlog_detach(struct ol_txrx_pdev_t *handle) } } -static int pktlog_open(struct inode *i, struct file *f) +static int __pktlog_open(struct inode *i, struct file *f) { struct hif_opaque_softc *scn; struct ol_pktlog_dev_t *pl_dev; @@ -573,6 +573,11 @@ static int pktlog_open(struct inode *i, struct file *f) return -EBUSY; } + if (cds_is_load_or_unload_in_progress() || cds_is_driver_recovering()) { + pr_info("%s: Load/Unload or recovery is in progress", __func__); + return -EAGAIN; + } + pl_info->curr_pkt_state = PKTLOG_OPR_IN_PROGRESS_READ_START; scn = cds_get_context(QDF_MODULE_ID_HIF); if (!scn) { @@ -608,7 +613,18 @@ static int pktlog_open(struct inode *i, struct file *f) return ret; } -static int pktlog_release(struct inode *i, struct file *f) +static int pktlog_open(struct inode *i, struct file *f) +{ + int ret; + + cds_ssr_protect(__func__); + ret = __pktlog_open(i, f); + cds_ssr_unprotect(__func__); + + return ret; +} + +static int __pktlog_release(struct inode *i, struct file *f) { struct hif_opaque_softc *scn; struct ol_pktlog_dev_t *pl_dev; @@ -623,6 +639,11 @@ static int pktlog_release(struct inode *i, struct file *f) if (!pl_info) return -EINVAL; + if (cds_is_load_or_unload_in_progress() || cds_is_driver_recovering()) { + pr_info("%s: Load/Unload or recovery is in progress", __func__); + return -EAGAIN; + } + scn = cds_get_context(QDF_MODULE_ID_HIF); if (!scn) { pl_info->curr_pkt_state = PKTLOG_OPR_NOT_IN_PROGRESS; @@ -658,6 +679,17 @@ static int pktlog_release(struct inode *i, struct file *f) return ret; } +static int pktlog_release(struct inode *i, struct file *f) +{ + int ret; + + cds_ssr_protect(__func__); + ret = __pktlog_release(i, f); + cds_ssr_unprotect(__func__); + + return ret; +} + #ifndef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif @@ -828,6 +860,11 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) struct ath_pktlog_info *pl_info; struct ath_pktlog_buf *log_buf; + if (cds_is_load_or_unload_in_progress() || cds_is_driver_recovering()) { + pr_info("%s: Load/Unload or recovery is in progress", __func__); + return -EAGAIN; + } + pl_info = (struct ath_pktlog_info *) PDE_DATA(file->f_path.dentry->d_inode); if (!pl_info) @@ -970,9 +1007,12 @@ pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) PDE_DATA(file->f_path.dentry->d_inode); if (!pl_info) return 0; + + cds_ssr_protect(__func__); mutex_lock(&pl_info->pktlog_mutex); ret = __pktlog_read(file, buf, nbytes, ppos); mutex_unlock(&pl_info->pktlog_mutex); + cds_ssr_unprotect(__func__); return ret; } @@ -1037,7 +1077,7 @@ static struct vm_operations_struct pktlog_vmops = { fault:pktlog_fault, }; -static int pktlog_mmap(struct file *file, struct vm_area_struct *vma) +static int __pktlog_mmap(struct file *file, struct vm_area_struct *vma) { struct ath_pktlog_info *pl_info; @@ -1054,12 +1094,28 @@ static int pktlog_mmap(struct file *file, struct vm_area_struct *vma) return -ENOMEM; } + if (cds_is_load_or_unload_in_progress() || cds_is_driver_recovering()) { + pr_info("%s: Load/Unload or recovery is in progress", __func__); + return -EAGAIN; + } + vma->vm_flags |= VM_LOCKED; vma->vm_ops = &pktlog_vmops; pktlog_vopen(vma); return 0; } +static int pktlog_mmap(struct file *file, struct vm_area_struct *vma) +{ + int ret; + + cds_ssr_protect(__func__); + ret = __pktlog_mmap(file, vma); + cds_ssr_unprotect(__func__); + + return ret; +} + int pktlogmod_init(void *context) { int ret;