PATCH: remove ifs from ancient backcompat in mwave driver

Alan Cox (alan@lxorguk.ukuu.org.uk)
Fri, 21 Mar 2003 19:23:41 GMT


Also add warning about a broken spinlock/sleep someone still has to fix

diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65/drivers/char/mwave/mwavedd.c linux-2.5.65-ac2/drivers/char/mwave/mwavedd.c
--- linux-2.5.65/drivers/char/mwave/mwavedd.c 2003-02-10 18:38:11.000000000 +0000
+++ linux-2.5.65-ac2/drivers/char/mwave/mwavedd.c 2003-03-07 14:30:52.000000000 +0000
@@ -53,46 +53,20 @@
#include <linux/init.h>
#include <linux/major.h>
#include <linux/miscdevice.h>
-#include <linux/proc_fs.h>
+#include <linux/device.h>
#include <linux/serial.h>
#include <linux/sched.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
#include <linux/spinlock.h>
-#else
-#include <asm/spinlock.h>
-#endif
#include <linux/delay.h>
#include "smapi.h"
#include "mwavedd.h"
#include "3780i.h"
#include "tp3780i.h"

-#ifndef __exit
-#define __exit
-#endif
-
MODULE_DESCRIPTION("3780i Advanced Communications Processor (Mwave) driver");
MODULE_AUTHOR("Mike Sullivan and Paul Schroeder");
MODULE_LICENSE("GPL");

-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-static int mwave_get_info(char *buf, char **start, off_t offset, int len);
-#else
-static int mwave_read_proc(char *buf, char **start, off_t offset, int xlen, int unused);
-static struct proc_dir_entry mwave_proc = {
- 0, /* unsigned short low_ino */
- 5, /* unsigned short namelen */
- "mwave", /* const char *name */
- S_IFREG | S_IRUGO, /* mode_t mode */
- 1, /* nlink_t nlink */
- 0, /* uid_t uid */
- 0, /* gid_t gid */
- 0, /* unsigned long size */
- NULL, /* struct inode_operations *ops */
- &mwave_read_proc /* int (*get_info) (...) */
-};
-#endif
-
/*
* These parameters support the setting of MWave resources. Note that no
* checks are made against other devices (ie. superio) for conflicts.
@@ -157,19 +131,23 @@

case IOCTL_MW_RESET:
PRINTK_1(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_RESET calling tp3780I_ResetDSP\n");
+ "mwavedd::mwave_ioctl, IOCTL_MW_RESET"
+ " calling tp3780I_ResetDSP\n");
retval = tp3780I_ResetDSP(&pDrvData->rBDData);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_RESET retval %x from tp3780I_ResetDSP\n",
+ "mwavedd::mwave_ioctl, IOCTL_MW_RESET"
+ " retval %x from tp3780I_ResetDSP\n",
retval);
break;

case IOCTL_MW_RUN:
PRINTK_1(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_RUN calling tp3780I_StartDSP\n");
+ "mwavedd::mwave_ioctl, IOCTL_MW_RUN"
+ " calling tp3780I_StartDSP\n");
retval = tp3780I_StartDSP(&pDrvData->rBDData);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_RUN retval %x from tp3780I_StartDSP\n",
+ "mwavedd::mwave_ioctl, IOCTL_MW_RUN"
+ " retval %x from tp3780I_StartDSP\n",
retval);
break;

@@ -177,17 +155,24 @@
MW_ABILITIES rAbilities;

PRINTK_1(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES calling tp3780I_QueryAbilities\n");
- retval = tp3780I_QueryAbilities(&pDrvData->rBDData, &rAbilities);
+ "mwavedd::mwave_ioctl,"
+ " IOCTL_MW_DSP_ABILITIES calling"
+ " tp3780I_QueryAbilities\n");
+ retval = tp3780I_QueryAbilities(&pDrvData->rBDData,
+ &rAbilities);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES retval %x from tp3780I_QueryAbilities\n",
+ "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES"
+ " retval %x from tp3780I_QueryAbilities\n",
retval);
if (retval == 0) {
- if( copy_to_user((char *) ioarg, (char *) &rAbilities, sizeof(MW_ABILITIES)) )
+ if( copy_to_user((char *) ioarg,
+ (char *) &rAbilities,
+ sizeof(MW_ABILITIES)) )
return -EFAULT;
}
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES exit retval %x\n",
+ "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES"
+ " exit retval %x\n",
retval);
}
break;
@@ -197,15 +182,21 @@
MW_READWRITE rReadData;
unsigned short *pusBuffer = 0;

- if( copy_from_user((char *) &rReadData, (char *) ioarg, sizeof(MW_READWRITE)) )
+ if( copy_from_user((char *) &rReadData,
+ (char *) ioarg,
+ sizeof(MW_READWRITE)) )
return -EFAULT;
pusBuffer = (unsigned short *) (rReadData.pBuf);

PRINTK_4(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_READ_DATA, size %lx, ioarg %lx pusBuffer %p\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_READ_DATA,"
+ " size %lx, ioarg %lx pusBuffer %p\n",
rReadData.ulDataLength, ioarg, pusBuffer);
- retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, iocmd,
- (void *) pusBuffer, rReadData.ulDataLength, rReadData.usDspAddress);
+ retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
+ iocmd,
+ (void *) pusBuffer,
+ rReadData.ulDataLength,
+ rReadData.usDspAddress);
}
break;

@@ -213,12 +204,14 @@
MW_READWRITE rReadData;
unsigned short *pusBuffer = 0;

- if( copy_from_user((char *) &rReadData, (char *) ioarg, sizeof(MW_READWRITE)) )
+ if( copy_from_user((char *) &rReadData, (char *) ioarg,
+ sizeof(MW_READWRITE)) )
return -EFAULT;
pusBuffer = (unsigned short *) (rReadData.pBuf);

PRINTK_4(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_READ_INST, size %lx, ioarg %lx pusBuffer %p\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_READ_INST,"
+ " size %lx, ioarg %lx pusBuffer %p\n",
rReadData.ulDataLength / 2, ioarg,
pusBuffer);
retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
@@ -232,16 +225,21 @@
MW_READWRITE rWriteData;
unsigned short *pusBuffer = 0;

- if( copy_from_user((char *) &rWriteData, (char *) ioarg, sizeof(MW_READWRITE)) )
+ if( copy_from_user((char *) &rWriteData,
+ (char *) ioarg,
+ sizeof(MW_READWRITE)) )
return -EFAULT;
pusBuffer = (unsigned short *) (rWriteData.pBuf);

PRINTK_4(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_WRITE_DATA, size %lx, ioarg %lx pusBuffer %p\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_WRITE_DATA,"
+ " size %lx, ioarg %lx pusBuffer %p\n",
rWriteData.ulDataLength, ioarg,
pusBuffer);
- retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, iocmd,
- pusBuffer, rWriteData.ulDataLength, rWriteData.usDspAddress);
+ retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData,
+ iocmd, pusBuffer,
+ rWriteData.ulDataLength,
+ rWriteData.usDspAddress);
}
break;

@@ -249,16 +247,21 @@
MW_READWRITE rWriteData;
unsigned short *pusBuffer = 0;

- if( copy_from_user((char *) &rWriteData, (char *) ioarg, sizeof(MW_READWRITE)) )
+ if( copy_from_user((char *) &rWriteData,
+ (char *) ioarg,
+ sizeof(MW_READWRITE)) )
return -EFAULT;
pusBuffer = (unsigned short *) (rWriteData.pBuf);

PRINTK_4(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_WRITE_INST, size %lx, ioarg %lx pusBuffer %p\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_WRITE_INST,"
+ " size %lx, ioarg %lx pusBuffer %p\n",
rWriteData.ulDataLength, ioarg,
pusBuffer);
- retval = tp3780I_ReadWriteDspIStore(&pDrvData->rBDData, iocmd,
- pusBuffer, rWriteData.ulDataLength, rWriteData.usDspAddress);
+ retval = tp3780I_ReadWriteDspIStore(&pDrvData->rBDData,
+ iocmd, pusBuffer,
+ rWriteData.ulDataLength,
+ rWriteData.usDspAddress);
}
break;

@@ -266,23 +269,25 @@
unsigned int ipcnum = (unsigned int) ioarg;

PRINTK_3(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC ipcnum %x entry usIntCount %x\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC"
+ " ipcnum %x entry usIntCount %x\n",
ipcnum,
pDrvData->IPCs[ipcnum].usIntCount);

- if (ipcnum > 16) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl: IOCTL_MW_REGISTER_IPC: Error: Invalid ipcnum %x\n", ipcnum);
+ if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::mwave_ioctl:"
+ " IOCTL_MW_REGISTER_IPC:"
+ " Error: Invalid ipcnum %x\n",
+ ipcnum);
return -EINVAL;
}
pDrvData->IPCs[ipcnum].bIsHere = FALSE;
pDrvData->IPCs[ipcnum].bIsEnabled = TRUE;
- #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- #else
- current->priority = 0x28; /* boost to provide priority timing */
- #endif

PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC ipcnum %x exit\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC"
+ " ipcnum %x exit\n",
ipcnum);
}
break;
@@ -293,17 +298,22 @@
unsigned long flags;

PRINTK_3(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC ipcnum %x, usIntCount %x\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC"
+ " ipcnum %x, usIntCount %x\n",
ipcnum,
pDrvData->IPCs[ipcnum].usIntCount);
- if (ipcnum > 16) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl: IOCTL_MW_GET_IPC: Error: Invalid ipcnum %x\n", ipcnum);
+ if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::mwave_ioctl:"
+ " IOCTL_MW_GET_IPC: Error:"
+ " Invalid ipcnum %x\n", ipcnum);
return -EINVAL;
}

if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) {
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl, thread for ipc %x going to sleep\n",
+ "mwavedd::mwave_ioctl, thread for"
+ " ipc %x going to sleep\n",
ipcnum);

spin_lock_irqsave(&ipc_lock, flags);
@@ -313,10 +323,13 @@
pDrvData->IPCs[ipcnum].usIntCount = 2; /* first int has been handled */
spin_unlock_irqrestore(&ipc_lock, flags);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC ipcnum %x handling first int\n",
+ "mwavedd::mwave_ioctl"
+ " IOCTL_MW_GET_IPC ipcnum %x"
+ " handling first int\n",
ipcnum);
} else { /* either 1st int has not yet occurred, or we have already handled the first int */
pDrvData->IPCs[ipcnum].bIsHere = TRUE;
+#warning "Sleeping on spinlock"
interruptible_sleep_on(&pDrvData->IPCs[ipcnum].ipc_wait_queue);
pDrvData->IPCs[ipcnum].bIsHere = FALSE;
if (pDrvData->IPCs[ipcnum].usIntCount == 1) {
@@ -325,11 +338,16 @@
}
spin_unlock_irqrestore(&ipc_lock, flags);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC ipcnum %x woke up and returning to application\n",
+ "mwavedd::mwave_ioctl"
+ " IOCTL_MW_GET_IPC ipcnum %x"
+ " woke up and returning to"
+ " application\n",
ipcnum);
}
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC, returning thread for ipc %x processing\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC,"
+ " returning thread for ipc %x"
+ " processing\n",
ipcnum);
}
}
@@ -339,10 +357,15 @@
unsigned int ipcnum = (unsigned int) ioarg;

PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_ioctl IOCTL_MW_UNREGISTER_IPC ipcnum %x\n",
+ "mwavedd::mwave_ioctl IOCTL_MW_UNREGISTER_IPC"
+ " ipcnum %x\n",
ipcnum);
- if (ipcnum > 16) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl: IOCTL_MW_UNREGISTER_IPC: Error: Invalid ipcnum %x\n", ipcnum);
+ if (ipcnum > ARRAY_SIZE(pDrvData->IPCs)) {
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::mwave_ioctl:"
+ " IOCTL_MW_UNREGISTER_IPC:"
+ " Error: Invalid ipcnum %x\n",
+ ipcnum);
return -EINVAL;
}
if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) {
@@ -355,7 +378,9 @@
break;

default:
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl: Error: Unrecognized iocmd %x\n", iocmd);
+ PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl:"
+ " Error: Unrecognized iocmd %x\n",
+ iocmd);
return -ENOTTY;
break;
} /* switch */
@@ -381,7 +406,8 @@
size_t count, loff_t * ppos)
{
PRINTK_5(TRACE_MWAVE,
- "mwavedd::mwave_write entry file %p, buf %p, count %x ppos %p\n",
+ "mwavedd::mwave_write entry file %p, buf %p,"
+ " count %x ppos %p\n",
file, buf, count, ppos);

return -EINVAL;
@@ -400,7 +426,9 @@
/* OK */
break;
default:
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::register_serial_portandirq: Error: Illegal port %x\n", port );
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::register_serial_portandirq:"
+ " Error: Illegal port %x\n", port );
return -1;
} /* switch */
/* port is okay */
@@ -413,7 +441,9 @@
/* OK */
break;
default:
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::register_serial_portandirq: Error: Illegal irq %x\n", irq );
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::register_serial_portandirq:"
+ " Error: Illegal irq %x\n", irq );
return -1;
} /* switch */
/* irq is okay */
@@ -427,7 +457,6 @@
}


-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
static struct file_operations mwave_fops = {
.owner = THIS_MODULE,
.read = mwave_read,
@@ -436,24 +465,46 @@
.open = mwave_open,
.release = mwave_close
};
-#else
-static struct file_operations mwave_fops = {
- NULL, /* lseek */
- mwave_read, /* read */
- mwave_write, /* write */
- NULL, /* readdir */
- NULL, /* poll */
- mwave_ioctl, /* ioctl */
- NULL, /* mmap */
- mwave_open, /* open */
- NULL, /* flush */
- mwave_close /* release */
-};
-#endif
+

static struct miscdevice mwave_misc_dev = { MWAVE_MINOR, "mwave", &mwave_fops };

/*
+ * sysfs support <paulsch@us.ibm.com>
+ */
+
+struct device mwave_device;
+
+/* Prevent code redundancy, create a macro for mwave_show_* functions. */
+#define mwave_show_function(attr_name, format_string, field) \
+static ssize_t mwave_show_##attr_name(struct device *dev, char *buf) \
+{ \
+ DSP_3780I_CONFIG_SETTINGS *pSettings = \
+ &mwave_s_mdd.rBDData.rDspSettings; \
+ return sprintf(buf, format_string, pSettings->field); \
+}
+
+/* All of our attributes are read attributes. */
+#define mwave_dev_rd_attr(attr_name, format_string, field) \
+ mwave_show_function(attr_name, format_string, field) \
+static DEVICE_ATTR(attr_name, S_IRUGO, mwave_show_##attr_name, NULL)
+
+mwave_dev_rd_attr (3780i_dma, "%i\n", usDspDma);
+mwave_dev_rd_attr (3780i_irq, "%i\n", usDspIrq);
+mwave_dev_rd_attr (3780i_io, "%#.4x\n", usDspBaseIO);
+mwave_dev_rd_attr (uart_irq, "%i\n", usUartIrq);
+mwave_dev_rd_attr (uart_io, "%#.4x\n", usUartBaseIO);
+
+static struct device_attribute * const mwave_dev_attrs[] = {
+ &dev_attr_3780i_dma,
+ &dev_attr_3780i_irq,
+ &dev_attr_3780i_io,
+ &dev_attr_uart_irq,
+ &dev_attr_uart_io,
+};
+
+
+/*
* mwave_init is called on module load
*
* mwave_exit is called on module unload
@@ -461,17 +512,16 @@
*/
static void mwave_exit(void)
{
+ int i;
pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;

PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_exit entry\n");

- if (pDrvData->bProcEntryCreated) {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- remove_proc_entry("mwave", NULL);
-#else
- proc_unregister(&proc_root, mwave_proc.low_ino);
-#endif
+ for (i = 0; i < ARRAY_SIZE(mwave_dev_attrs); i++) {
+ device_remove_file(&mwave_device, mwave_dev_attrs[i]);
}
+ device_unregister(&mwave_device);
+
if ( pDrvData->sLine >= 0 ) {
unregister_serial(pDrvData->sLine);
}
@@ -497,72 +547,81 @@
{
int i;
int retval = 0;
- unsigned int resultMiscRegister;
pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd;

- memset(&mwave_s_mdd, 0, sizeof(MWAVE_DEVICE_DATA));
-
PRINTK_1(TRACE_MWAVE, "mwavedd::mwave_init entry\n");

+ memset(&mwave_s_mdd, 0, sizeof(MWAVE_DEVICE_DATA));
+
pDrvData->bBDInitialized = FALSE;
pDrvData->bResourcesClaimed = FALSE;
pDrvData->bDSPEnabled = FALSE;
pDrvData->bDSPReset = FALSE;
pDrvData->bMwaveDevRegistered = FALSE;
pDrvData->sLine = -1;
- pDrvData->bProcEntryCreated = FALSE;

- for (i = 0; i < 16; i++) {
+ for (i = 0; i < ARRAY_SIZE(pDrvData->IPCs); i++) {
pDrvData->IPCs[i].bIsEnabled = FALSE;
pDrvData->IPCs[i].bIsHere = FALSE;
pDrvData->IPCs[i].usIntCount = 0; /* no ints received yet */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
init_waitqueue_head(&pDrvData->IPCs[i].ipc_wait_queue);
-#endif
}

retval = tp3780I_InitializeBoardData(&pDrvData->rBDData);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_init, return from tp3780I_InitializeBoardData retval %x\n",
+ "mwavedd::mwave_init, return from tp3780I_InitializeBoardData"
+ " retval %x\n",
retval);
if (retval) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_init: Error: Failed to initialize board data\n");
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::mwave_init: Error:"
+ " Failed to initialize board data\n");
goto cleanup_error;
}
pDrvData->bBDInitialized = TRUE;

retval = tp3780I_CalcResources(&pDrvData->rBDData);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_init, return from tp3780I_CalcResources retval %x\n",
+ "mwavedd::mwave_init, return from tp3780I_CalcResources"
+ " retval %x\n",
retval);
if (retval) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd:mwave_init: Error: Failed to calculate resources\n");
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd:mwave_init: Error:"
+ " Failed to calculate resources\n");
goto cleanup_error;
}

retval = tp3780I_ClaimResources(&pDrvData->rBDData);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_init, return from tp3780I_ClaimResources retval %x\n",
+ "mwavedd::mwave_init, return from tp3780I_ClaimResources"
+ " retval %x\n",
retval);
if (retval) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd:mwave_init: Error: Failed to claim resources\n");
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd:mwave_init: Error:"
+ " Failed to claim resources\n");
goto cleanup_error;
}
pDrvData->bResourcesClaimed = TRUE;

retval = tp3780I_EnableDSP(&pDrvData->rBDData);
PRINTK_2(TRACE_MWAVE,
- "mwavedd::mwave_init, return from tp3780I_EnableDSP retval %x\n",
+ "mwavedd::mwave_init, return from tp3780I_EnableDSP"
+ " retval %x\n",
retval);
if (retval) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd:mwave_init: Error: Failed to enable DSP\n");
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd:mwave_init: Error:"
+ " Failed to enable DSP\n");
goto cleanup_error;
}
pDrvData->bDSPEnabled = TRUE;

- resultMiscRegister = misc_register(&mwave_misc_dev);
- if (resultMiscRegister < 0) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd:mwave_init: Error: Failed to register misc device\n");
+ if (misc_register(&mwave_misc_dev) < 0) {
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd:mwave_init: Error:"
+ " Failed to register misc device\n");
goto cleanup_error;
}
pDrvData->bMwaveDevRegistered = TRUE;
@@ -572,28 +631,36 @@
pDrvData->rBDData.rDspSettings.usUartIrq
);
if (pDrvData->sLine < 0) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd:mwave_init: Error: Failed to register serial driver\n");
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd:mwave_init: Error:"
+ " Failed to register serial driver\n");
goto cleanup_error;
}
/* uart is registered */

- if (
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
- !create_proc_info_entry("mwave", 0, NULL, mwave_get_info)
-#else
- proc_register(&proc_root, &mwave_proc)
-#endif
- ) {
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_init: Error: Failed to register /proc/mwave\n");
- goto cleanup_error;
+ /* sysfs */
+ memset(&mwave_device, 0, sizeof (struct device));
+ snprintf(mwave_device.name, DEVICE_NAME_SIZE, "mwave");
+ snprintf(mwave_device.bus_id, BUS_ID_SIZE, "mwave");
+
+ device_register(&mwave_device);
+ for (i = 0; i < ARRAY_SIZE(mwave_dev_attrs); i++) {
+ if(device_create_file(&mwave_device, mwave_dev_attrs[i])) {
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd:mwave_init: Error:"
+ " Failed to create sysfs file %s\n",
+ mwave_dev_attrs[i]->attr.name);
+ goto cleanup_error;
+ }
}
- pDrvData->bProcEntryCreated = TRUE;

/* SUCCESS! */
return 0;

cleanup_error:
- PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_init: Error: Failed to initialize\n");
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "mwavedd::mwave_init: Error:"
+ " Failed to initialize\n");
mwave_exit(); /* clean up */

return -EIO;
@@ -601,39 +668,3 @@

module_init(mwave_init);

-
-/*
-* proc entry stuff added by Ian Pilcher <pilcher@us.ibm.com>
-*/
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-static int mwave_get_info(char *buf, char **start, off_t offset, int len)
-{
- DSP_3780I_CONFIG_SETTINGS *pSettings = &mwave_s_mdd.rBDData.rDspSettings;
-
- char *out = buf;
-
- out += sprintf(out, "3780i_IRQ %i\n", pSettings->usDspIrq);
- out += sprintf(out, "3780i_DMA %i\n", pSettings->usDspDma);
- out += sprintf(out, "3780i_IO %#.4x\n", pSettings->usDspBaseIO);
- out += sprintf(out, "UART_IRQ %i\n", pSettings->usUartIrq);
- out += sprintf(out, "UART_IO %#.4x\n", pSettings->usUartBaseIO);
-
- return out - buf;
-}
-#else /* kernel version < 2.4.0 */
-static int mwave_read_proc(char *buf, char **start, off_t offset,
- int xlen, int unused)
-{
- DSP_3780I_CONFIG_SETTINGS *pSettings = &mwave_s_mdd.rBDData.rDspSettings;
- int len;
-
- len = sprintf(buf, "3780i_IRQ %i\n", pSettings->usDspIrq);
- len += sprintf(&buf[len], "3780i_DMA %i\n", pSettings->usDspDma);
- len += sprintf(&buf[len], "3780i_IO %#.4x\n", pSettings->usDspBaseIO);
- len += sprintf(&buf[len], "UART_IRQ %i\n", pSettings->usUartIrq);
- len += sprintf(&buf[len], "UART_IO %#.4x\n", pSettings->usUartBaseIO);
-
- return len;
-}
-#endif
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65/drivers/char/mwave/mwavedd.h linux-2.5.65-ac2/drivers/char/mwave/mwavedd.h
--- linux-2.5.65/drivers/char/mwave/mwavedd.h 2003-02-10 18:38:43.000000000 +0000
+++ linux-2.5.65-ac2/drivers/char/mwave/mwavedd.h 2003-03-06 23:15:49.000000000 +0000
@@ -126,11 +126,7 @@
BOOLEAN bIsEnabled;
BOOLEAN bIsHere;
/* entry spin lock */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
wait_queue_head_t ipc_wait_queue;
-#else
- struct wait_queue *ipc_wait_queue;
-#endif
} MWAVE_IPC;

typedef struct _MWAVE_DEVICE_DATA {
@@ -143,7 +139,6 @@
BOOLEAN bDSPReset;
MWAVE_IPC IPCs[16];
BOOLEAN bMwaveDevRegistered;
- BOOLEAN bProcEntryCreated;
short sLine;

} MWAVE_DEVICE_DATA, *pMWAVE_DEVICE_DATA;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65/drivers/char/mwave/mwavepub.h linux-2.5.65-ac2/drivers/char/mwave/mwavepub.h
--- linux-2.5.65/drivers/char/mwave/mwavepub.h 2003-02-10 18:39:17.000000000 +0000
+++ linux-2.5.65-ac2/drivers/char/mwave/mwavepub.h 2003-03-06 23:15:49.000000000 +0000
@@ -50,13 +50,8 @@
#ifndef _LINUX_MWAVEPUB_H
#define _LINUX_MWAVEPUB_H

-#ifndef MWAVEM_APP_DIST
#include <linux/miscdevice.h>
-#endif

-#ifdef MWAVEM_APP_DIST
-#define MWAVE_MINOR 219
-#endif

typedef struct _MW_ABILITIES {
unsigned long instr_per_sec;
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65/drivers/char/mwave/smapi.c linux-2.5.65-ac2/drivers/char/mwave/smapi.c
--- linux-2.5.65/drivers/char/mwave/smapi.c 2003-02-10 18:38:53.000000000 +0000
+++ linux-2.5.65-ac2/drivers/char/mwave/smapi.c 2003-03-06 23:15:49.000000000 +0000
@@ -280,10 +280,11 @@
if ((usSI & 0xFF) == mwave_uart_irq) {
#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_ERROR(KERN_ERR_MWAVE
+ "smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
#else
PRINTK_3(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
#endif
- "smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI, mwave_uart_irq);
#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_1(TRACE_SMAPI,
"smapi::smapi_set_DSP_cfg Disabling conflicting serial port\n");
@@ -300,13 +301,14 @@
if ((usSI >> 8) == uartio_index) {
#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_ERROR(KERN_ERR_MWAVE
+ "smapi::smapi_set_DSP_cfg: Serial port A base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
#else
PRINTK_3(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg: Serial port A base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
#endif
- "smapi::smapi_set_DSP_cfg: Serial port A base I/O address index %x conflicts with uartio_index %x\n", usSI >> 8, uartio_index);
#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_1(TRACE_SMAPI,
- "smapi::smapi_set_DSP_cfg Disabling conflicting serial port\n");
+ "smapi::smapi_set_DSP_cfg Disabling conflicting serial port A\n");
bRC = smapi_request (0x1403, 0x0100, 0, usSI,
&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
if (bRC) goto exit_smapi_request_error;
@@ -331,13 +333,14 @@
if ((usSI & 0xFF) == mwave_uart_irq) {
#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_ERROR(KERN_ERR_MWAVE
+ "smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
#else
PRINTK_3(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
#endif
- "smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI, mwave_uart_irq);
#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_1(TRACE_SMAPI,
- "smapi::smapi_set_DSP_cfg Disabling conflicting serial port\n");
+ "smapi::smapi_set_DSP_cfg Disabling conflicting serial port B\n");
bRC = smapi_request(0x1405, 0x0100, 0, usSI,
&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
if (bRC) goto exit_smapi_request_error;
@@ -351,13 +354,14 @@
if ((usSI >> 8) == uartio_index) {
#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_ERROR(KERN_ERR_MWAVE
+ "smapi::smapi_set_DSP_cfg: Serial port B base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
#else
PRINTK_3(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg: Serial port B base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
#endif
- "smapi::smapi_set_DSP_cfg: Serial port B base I/O address index %x conflicts with uartio_index %x\n", usSI >> 8, uartio_index);
#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_1 (TRACE_SMAPI,
- "smapi::smapi_set_DSP_cfg Disabling conflicting serial port\n");
+ "smapi::smapi_set_DSP_cfg Disabling conflicting serial port B\n");
bRC = smapi_request (0x1405, 0x0100, 0, usSI,
&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
if (bRC) goto exit_smapi_request_error;
@@ -380,39 +384,15 @@
&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
if (bRC) goto exit_smapi_request_error;
/* bRC == 0 */
- if ((usCX & 0xff) == mwave_uart_irq) { /* serial port is enabled */
-#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
- PRINTK_ERROR(KERN_ERR_MWAVE
-#else
- PRINTK_3(TRACE_SMAPI,
-#endif
- "smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usSI, mwave_uart_irq);
-#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
- PRINTK_1(TRACE_SMAPI,
- "smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
- bRC = smapi_request(0x1701, 0x0100, 0, 0,
- &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
- if (bRC) goto exit_smapi_request_error;
- bRC = smapi_request(0x1700, 0, 0, 0,
- &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
- if (bRC) goto exit_smapi_request_error;
- bRC = smapi_request(0x1705, 0x01ff, 0, usSI,
- &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
- if (bRC) goto exit_smapi_request_error;
- bRC = smapi_request(0x1704, 0x0000, 0, 0,
- &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
- if (bRC) goto exit_smapi_request_error;
-#else
- goto exit_conflict;
-#endif
- } else {
- if ((usSI & 0xff) == uartio_index) {
+ if ((usCX & 0xff) != 0xff) { /* IR port not disabled */
+ if ((usCX & 0xff) == mwave_uart_irq) {
#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_ERROR(KERN_ERR_MWAVE
+ "smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usCX & 0xff, mwave_uart_irq);
#else
PRINTK_3(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usCX & 0xff, mwave_uart_irq);
#endif
- "smapi::smapi_set_DSP_cfg: IR port base I/O address index %x conflicts with uartio_index %x\n", usSI & 0xff, uartio_index);
#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
PRINTK_1(TRACE_SMAPI,
"smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
@@ -431,6 +411,34 @@
#else
goto exit_conflict;
#endif
+ } else {
+ if ((usSI & 0xff) == uartio_index) {
+#ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
+ PRINTK_ERROR(KERN_ERR_MWAVE
+ "smapi::smapi_set_DSP_cfg: IR port base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI & 0xff], ausUartBases[uartio_index]);
+#else
+ PRINTK_3(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg: IR port base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI & 0xff], ausUartBases[uartio_index]);
+#endif
+#ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
+ PRINTK_1(TRACE_SMAPI,
+ "smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
+ bRC = smapi_request(0x1701, 0x0100, 0, 0,
+ &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
+ if (bRC) goto exit_smapi_request_error;
+ bRC = smapi_request(0x1700, 0, 0, 0,
+ &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
+ if (bRC) goto exit_smapi_request_error;
+ bRC = smapi_request(0x1705, 0x01ff, 0, usSI,
+ &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
+ if (bRC) goto exit_smapi_request_error;
+ bRC = smapi_request(0x1704, 0x0000, 0, 0,
+ &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
+ if (bRC) goto exit_smapi_request_error;
+#else
+ goto exit_conflict;
+#endif
+ }
}
}
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/