|
@@ -86,8 +86,8 @@ module_param(mwave_uart_io, int, 0);
|
|
|
|
|
|
static int mwave_open(struct inode *inode, struct file *file);
|
|
|
static int mwave_close(struct inode *inode, struct file *file);
|
|
|
-static int mwave_ioctl(struct inode *inode, struct file *filp,
|
|
|
- unsigned int iocmd, unsigned long ioarg);
|
|
|
+static long mwave_ioctl(struct file *filp, unsigned int iocmd,
|
|
|
+ unsigned long ioarg);
|
|
|
|
|
|
MWAVE_DEVICE_DATA mwave_s_mdd;
|
|
|
|
|
@@ -119,16 +119,16 @@ static int mwave_close(struct inode *inode, struct file *file)
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
- unsigned int iocmd, unsigned long ioarg)
|
|
|
+static long mwave_ioctl(struct file *file, unsigned int iocmd,
|
|
|
+ unsigned long ioarg)
|
|
|
{
|
|
|
unsigned int retval = 0;
|
|
|
pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;
|
|
|
void __user *arg = (void __user *)ioarg;
|
|
|
|
|
|
- PRINTK_5(TRACE_MWAVE,
|
|
|
- "mwavedd::mwave_ioctl, entry inode %p file %p cmd %x arg %x\n",
|
|
|
- inode, file, iocmd, (int) ioarg);
|
|
|
+ PRINTK_4(TRACE_MWAVE,
|
|
|
+ "mwavedd::mwave_ioctl, entry file %p cmd %x arg %x\n",
|
|
|
+ file, iocmd, (int) ioarg);
|
|
|
|
|
|
switch (iocmd) {
|
|
|
|
|
@@ -136,7 +136,9 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
PRINTK_1(TRACE_MWAVE,
|
|
|
"mwavedd::mwave_ioctl, IOCTL_MW_RESET"
|
|
|
" calling tp3780I_ResetDSP\n");
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_ResetDSP(&pDrvData->rBDData);
|
|
|
+ unlock_kernel();
|
|
|
PRINTK_2(TRACE_MWAVE,
|
|
|
"mwavedd::mwave_ioctl, IOCTL_MW_RESET"
|
|
|
" retval %x from tp3780I_ResetDSP\n",
|
|
@@ -147,7 +149,9 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
PRINTK_1(TRACE_MWAVE,
|
|
|
"mwavedd::mwave_ioctl, IOCTL_MW_RUN"
|
|
|
" calling tp3780I_StartDSP\n");
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_StartDSP(&pDrvData->rBDData);
|
|
|
+ unlock_kernel();
|
|
|
PRINTK_2(TRACE_MWAVE,
|
|
|
"mwavedd::mwave_ioctl, IOCTL_MW_RUN"
|
|
|
" retval %x from tp3780I_StartDSP\n",
|
|
@@ -161,8 +165,10 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
"mwavedd::mwave_ioctl,"
|
|
|
" IOCTL_MW_DSP_ABILITIES calling"
|
|
|
" tp3780I_QueryAbilities\n");
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_QueryAbilities(&pDrvData->rBDData,
|
|
|
&rAbilities);
|
|
|
+ unlock_kernel();
|
|
|
PRINTK_2(TRACE_MWAVE,
|
|
|
"mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES"
|
|
|
" retval %x from tp3780I_QueryAbilities\n",
|
|
@@ -193,11 +199,13 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
"mwavedd::mwave_ioctl IOCTL_MW_READ_DATA,"
|
|
|
" size %lx, ioarg %lx pusBuffer %p\n",
|
|
|
rReadData.ulDataLength, ioarg, pusBuffer);
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
|
|
|
iocmd,
|
|
|
pusBuffer,
|
|
|
rReadData.ulDataLength,
|
|
|
rReadData.usDspAddress);
|
|
|
+ unlock_kernel();
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -215,10 +223,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
" size %lx, ioarg %lx pusBuffer %p\n",
|
|
|
rReadData.ulDataLength / 2, ioarg,
|
|
|
pusBuffer);
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
|
|
|
iocmd, pusBuffer,
|
|
|
rReadData.ulDataLength / 2,
|
|
|
rReadData.usDspAddress);
|
|
|
+ unlock_kernel();
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -236,10 +246,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
" size %lx, ioarg %lx pusBuffer %p\n",
|
|
|
rWriteData.ulDataLength, ioarg,
|
|
|
pusBuffer);
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
|
|
|
iocmd, pusBuffer,
|
|
|
rWriteData.ulDataLength,
|
|
|
rWriteData.usDspAddress);
|
|
|
+ unlock_kernel();
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -257,10 +269,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
" size %lx, ioarg %lx pusBuffer %p\n",
|
|
|
rWriteData.ulDataLength, ioarg,
|
|
|
pusBuffer);
|
|
|
+ lock_kernel();
|
|
|
retval = tp3780I_ReadWriteDspIStore(&pDrvData->rBDData,
|
|
|
iocmd, pusBuffer,
|
|
|
rWriteData.ulDataLength,
|
|
|
rWriteData.usDspAddress);
|
|
|
+ unlock_kernel();
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -281,8 +295,10 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
ipcnum);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
+ lock_kernel();
|
|
|
pDrvData->IPCs[ipcnum].bIsHere = FALSE;
|
|
|
pDrvData->IPCs[ipcnum].bIsEnabled = TRUE;
|
|
|
+ unlock_kernel();
|
|
|
|
|
|
PRINTK_2(TRACE_MWAVE,
|
|
|
"mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC"
|
|
@@ -307,6 +323,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ lock_kernel();
|
|
|
if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) {
|
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
|
|
|
@@ -347,6 +364,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
" processing\n",
|
|
|
ipcnum);
|
|
|
}
|
|
|
+ unlock_kernel();
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -365,19 +383,18 @@ static int mwave_ioctl(struct inode *inode, struct file *file,
|
|
|
ipcnum);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
+ lock_kernel();
|
|
|
if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) {
|
|
|
pDrvData->IPCs[ipcnum].bIsEnabled = FALSE;
|
|
|
if (pDrvData->IPCs[ipcnum].bIsHere == TRUE) {
|
|
|
wake_up_interruptible(&pDrvData->IPCs[ipcnum].ipc_wait_queue);
|
|
|
}
|
|
|
}
|
|
|
+ unlock_kernel();
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl:"
|
|
|
- " Error: Unrecognized iocmd %x\n",
|
|
|
- iocmd);
|
|
|
return -ENOTTY;
|
|
|
break;
|
|
|
} /* switch */
|
|
@@ -460,7 +477,7 @@ static const struct file_operations mwave_fops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.read = mwave_read,
|
|
|
.write = mwave_write,
|
|
|
- .ioctl = mwave_ioctl,
|
|
|
+ .unlocked_ioctl = mwave_ioctl,
|
|
|
.open = mwave_open,
|
|
|
.release = mwave_close
|
|
|
};
|