summaryrefslogtreecommitdiff
path: root/backend/plustek-pp_ptdrv.c
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff.email>2023-02-12 17:35:53 +0100
committerJörg Frings-Fürst <debian@jff.email>2023-02-12 17:35:53 +0100
commit84357741a6a6e6430f199b2c3f7498e0e97da9ad (patch)
tree23e8d66ede9506b94c76fb36910ca3c7dd15c74e /backend/plustek-pp_ptdrv.c
parent302276dc1b90cfc972fb726ca94a23b18f4b0088 (diff)
New upstream version 1.2.1upstream/1.2.1upstream
Diffstat (limited to 'backend/plustek-pp_ptdrv.c')
-rw-r--r--backend/plustek-pp_ptdrv.c703
1 files changed, 0 insertions, 703 deletions
diff --git a/backend/plustek-pp_ptdrv.c b/backend/plustek-pp_ptdrv.c
index bf3a389..58b58b1 100644
--- a/backend/plustek-pp_ptdrv.c
+++ b/backend/plustek-pp_ptdrv.c
@@ -94,52 +94,13 @@
* If you do not wish that, delete this exception notice.
* <hr>
*/
-#ifdef __KERNEL__
-# include <linux/module.h>
-# include <linux/version.h>
-
-# ifdef CONFIG_DEVFS_FS
-# include <linux/devfs_fs_kernel.h>
-# if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,69))
-# define DEVFS_26_STYLE
-# endif
-# endif
-#endif
-
#include "plustek-pp_scan.h"
-#ifdef __KERNEL__
-# include <linux/param.h>
-#endif
-
/****************************** static vars **********************************/
/* default port is at 0x378 */
static int port[_MAX_PTDEVS] = { 0x378, 0, 0, 0 };
-#ifdef __KERNEL__
-static pScanData PtDrvDevices[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = NULL};
-
-/* default is 180 secs for lamp switch off */
-static int lampoff[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 180 };
-
-/* warmup period for lamp (30 secs) */
-static int warmup[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 30 };
-
-/* switch lamp off on unload (default = no)*/
-static int lOffonEnd[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
-
-/* model override (0-->none) */
-static UShort mov[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
-
-/* forceMode (0--> auto, 1: SPP, 2:EPP, others: auto) */
-static UShort forceMode[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
-
-/* to use delayed I/O for each device */
-static Bool slowIO[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = _FALSE };
-
-#else
-
static pScanData PtDrvDevices[_MAX_PTDEVS]= { NULL, NULL, NULL, NULL };
static int lampoff[_MAX_PTDEVS] = { 180, 180, 180, 180 };
static int warmup[_MAX_PTDEVS] = { 30, 30, 30, 30 };
@@ -147,140 +108,14 @@ static int lOffonEnd[_MAX_PTDEVS] = { 0, 0, 0, 0 };
static UShort mov[_MAX_PTDEVS] = { 0, 0, 0, 0 };
static UShort forceMode[_MAX_PTDEVS] = { 0, 0, 0, 0 };
-#endif
-
/* timers for warmup checks */
static TimerDef toTimer[_MAX_PTDEVS];
-#ifndef __KERNEL__
static Bool PtDrvInitialized = _FALSE;
#ifdef HAVE_SETITIMER
static struct itimerval saveSettings;
#endif
-#else
-static Bool deviceScanning = _FALSE;
-
-static struct timer_list tl[_MAX_PTDEVS];
-
-/* for calculation of the timer expiration */
-extern volatile unsigned long jiffies;
-
-/* the parameter interface
- */
-#if ((LINUX_VERSION_CODE > 0x020111) && defined(MODULE))
-MODULE_AUTHOR("Gerhard Jaeger <gerhard@gjaeger.de>");
-MODULE_DESCRIPTION("Plustek parallelport-scanner driver");
-
-/* addresses this 'new' license feature... */
-#ifdef MODULE_LICENSE
-MODULE_LICENSE("GPL");
-#endif
-
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13))
-MODULE_PARM(port, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-MODULE_PARM(lampoff, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-MODULE_PARM(warmup,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-MODULE_PARM(lOffonEnd, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-MODULE_PARM(mov, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-MODULE_PARM(slowIO,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-MODULE_PARM(forceMode,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
-
-#else
-
-static int array_len = _MAX_PTDEVS;
-
-module_param_array(port, int, &array_len, 0);
-module_param_array(lampoff, int, &array_len, 0);
-module_param_array(warmup, int, &array_len, 0);
-module_param_array(lOffonEnd, int, &array_len, 0);
-module_param_array(mov, ushort, &array_len, 0);
-module_param_array(slowIO, int, &array_len, 0);
-module_param_array(forceMode, ushort, &array_len, 0);
-
-#endif
-
-
-MODULE_PARM_DESC(port, "I/O base address of parport");
-MODULE_PARM_DESC(lampoff, "Lamp-Off timer preset in seconds");
-MODULE_PARM_DESC(warmup, "Minimum warmup time in seconds");
-MODULE_PARM_DESC(lOffonEnd, "1 - switchoff lamp on unload");
-MODULE_PARM_DESC(mov, "Modell-override switch");
-MODULE_PARM_DESC(slowIO, "0 = Fast I/O, 1 = Delayed I/O");
-MODULE_PARM_DESC(forceMode, "0 = use auto detection, "
- "1 = use SPP mode, 2 = use EPP mode");
-#endif
-
-#if defined (CONFIG_DEVFS_FS)
-# ifndef (DEVFS_26_STYLE)
- static devfs_handle_t devfs_handle = NULL;
-# endif
-#else
-# ifdef LINUX_26
- static class_t *ptdrv_class;
-# endif
-#endif
-/*
- * the module interface
- */
-static int pt_drv_open ( struct inode *, struct file *);
-static CLOSETYPE pt_drv_close( struct inode *, struct file *);
-
-#ifdef LINUX_20
- static int pt_drv_read( struct inode*, struct file*, char*, int );
- static int pt_drv_write( struct inode*, struct file*, const char*, int );
-#else
- static ssize_t pt_drv_read ( struct file *file,
- char *buffer, size_t count, loff_t *);
- static ssize_t pt_drv_write( struct file *file,
- const char *buffer, size_t tmp,loff_t *count);
-#endif
-
-#ifdef NOLOCK_IOCTL
- static long pt_drv_ioctl( struct file *, UInt, unsigned long );
-#else
- static int pt_drv_ioctl( struct inode *, struct file *, UInt, unsigned long );
-#endif
-
-
-/*
- * the driver interface
- */
-#ifdef LINUX_20
-
-static struct file_operations pt_drv_fops =
-{
- NULL, /* seek */
- pt_drv_read, /* read */
- pt_drv_write, /* write */
- NULL, /* readdir */
- NULL, /* select */
- pt_drv_ioctl, /* ioctl */
- NULL, /* mmap */
- pt_drv_open, /* open */
- pt_drv_close, /* release */
- NULL, /* fsync */
- NULL, /* fasync */
- NULL, /* check_media_change */
- NULL /* revalidate */
-};
-
-#else /* 2.2.x and higher stuff */
-
-static struct file_operations pt_drv_fops = {
-#ifdef LINUX_24
- owner: THIS_MODULE,
-#endif
- read: pt_drv_read,
- write: pt_drv_write,
- IOCTL: pt_drv_ioctl,
- open: pt_drv_open,
- release: pt_drv_close,
-};
-
-#endif
-
-#endif /* guard __KERNEL */
/****************************** some prototypes ******************************/
@@ -288,23 +123,6 @@ static void ptdrvStartLampTimer( pScanData ps );
/****************************** local functions ******************************/
-#ifdef __KERNEL__
-/** depending on the device, return the data structure
- */
-static pScanData get_pt_from_inode(struct inode *ip)
-{
- int minor = _MINOR(ip);
-
- /*
- * unit out of range
- */
- if (minor >= _MAX_PTDEVS )
- return NULL;
-
- return( PtDrvDevices[minor] );
-}
-#endif
-
/** copy user-space data into kernel memory
*/
static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
@@ -315,32 +133,9 @@ static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
if((NULL == useraddr) || ( 0 == size))
return _E_INVALID;
-#ifdef __KERNEL__
- if ((err = verify_area_20(VERIFY_READ, useraddr, size)))
- return err;
-#endif
-
switch (size) {
-#ifdef __KERNEL__
- case sizeof(u_char):
- GET_USER_RET(*(u_char *)where, (u_char *) useraddr, -EFAULT);
- break;
-
- case sizeof(u_short):
- GET_USER_RET(*(u_short *)where, (u_short *) useraddr, -EFAULT);
- break;
-
- case sizeof(u_long):
- GET_USER_RET(*(u_long *)where, (u_long *) useraddr, -EFAULT);
- break;
-
- default:
- if (copy_from_user(where, useraddr, size))
- return -EFAULT;
-#else
default:
memcpy( where, useraddr, size );
-#endif
}
return err;
}
@@ -354,20 +149,11 @@ static int putUserPtr( const pVoid ptr, pVoid useraddr, UInt size )
if (NULL == useraddr)
return _E_INVALID;
-#ifdef __KERNEL__
- if ((err = verify_area_20(VERIFY_WRITE, useraddr, size)))
- return err;
-
- if (copy_to_user(useraddr, ptr, size ))
- return -EFAULT;
-#else
memcpy( useraddr, ptr, size );
-#endif
return err;
}
-#ifndef __KERNEL__
static unsigned long copy_from_user( pVoid dest, pVoid src, unsigned long len )
{
memcpy( dest, src, len );
@@ -379,37 +165,16 @@ static unsigned long copy_to_user( pVoid dest, pVoid src, unsigned long len )
memcpy( dest, src, len );
return 0;
}
-#endif
/**
*/
static int putUserVal(const ULong value, pVoid useraddr, UInt size)
{
-#ifdef __KERNEL__
- int err;
-#endif
-
if (NULL == useraddr)
return _E_INVALID;
-#ifdef __KERNEL__
- if ((err = verify_area_20(VERIFY_WRITE, useraddr, size)))
- return err;
-#endif
-
switch (size) {
-#ifdef __KERNEL__
- case sizeof(u_char):
- PUT_USER_RET((u_char)value, (u_char *) useraddr, -EFAULT);
- break;
- case sizeof(u_short):
- PUT_USER_RET((u_short)value, (u_short *) useraddr, -EFAULT);
- break;
- case sizeof(u_long):
- PUT_USER_RET((u_long)value, (u_long *) useraddr, -EFAULT);
- break;
-#else
case sizeof(UChar):
*(pUChar)useraddr = (UChar)value;
break;
@@ -420,7 +185,6 @@ static int putUserVal(const ULong value, pVoid useraddr, UInt size)
*(pULong)useraddr = (ULong)value;
break;
-#endif
default:
return _E_INVALID;
}
@@ -506,22 +270,14 @@ static void ptdrvLampWarmup( pScanData ps )
/**
*/
-#ifdef __KERNEL__
-static void ptdrvLampTimerIrq( unsigned long ptr )
-#else
static void ptdrvLampTimerIrq( int sig_num )
-#endif
{
pScanData ps;
DBG( DBG_HIGH, "!! IRQ !! Lamp-Timer stopped.\n" );
-#ifdef __KERNEL__
- ps = (pScanData)ptr;
-#else
_VAR_NOT_USED( sig_num );
ps = PtDrvDevices[0];
-#endif
/*
* paranoia check!
@@ -559,7 +315,6 @@ static void ptdrvLampTimerIrq( int sig_num )
*/
static void ptdrvStartLampTimer( pScanData ps )
{
-#ifndef __KERNEL__
sigset_t block, pause_mask;
struct sigaction s;
#ifdef HAVE_SETITIMER
@@ -597,17 +352,6 @@ static void ptdrvStartLampTimer( pScanData ps )
#else
alarm( ps->lampoff );
#endif
-#else
- init_timer( &tl[ps->devno] );
-
- /* timeout val in seconds */
- tl[ps->devno].expires = jiffies + ps->lampoff * HZ;
- tl[ps->devno].data = (unsigned long)ps;
- tl[ps->devno].function = ptdrvLampTimerIrq;
-
- if( 0 != ps->lampoff )
- add_timer( &tl[ps->devno] );
-#endif
DBG( DBG_HIGH, "Lamp-Timer started!\n" );
}
@@ -616,7 +360,6 @@ static void ptdrvStartLampTimer( pScanData ps )
*/
static void ptdrvStopLampTimer( pScanData ps )
{
-#ifndef __KERNEL__
sigset_t block, pause_mask;
/* block SIGALRM */
@@ -630,10 +373,6 @@ static void ptdrvStopLampTimer( pScanData ps )
_VAR_NOT_USED( ps );
alarm(0);
#endif
-#else
- if( 0 != ps->lampoff )
- del_timer( &tl[ps->devno] );
-#endif
DBG( DBG_HIGH, "Lamp-Timer stopped!\n" );
}
@@ -701,23 +440,11 @@ static int ptdrvOpenDevice( pScanData ps )
UShort lastMode;
ULong devno;
-#ifdef __KERNEL__
- UShort flags;
- struct pardevice *pd;
- struct parport *pp;
- ProcDirDef procDir;
-#else
int pd;
-#endif
/*
* push some values from the struct
*/
-#ifdef __KERNEL__
- flags = ps->flags;
- pp = ps->pp;
- procDir = ps->procDir;
-#endif
pd = ps->pardev;
iobase = ps->sCaps.wIOBase;
asic = ps->sCaps.AsicID;
@@ -734,29 +461,10 @@ static int ptdrvOpenDevice( pScanData ps )
/*
* pop the val(s)
*/
-#ifdef __KERNEL__
- ps->flags = flags;
- ps->pp = pp;
- ps->procDir = procDir;
-#endif
ps->pardev = pd;
ps->bLastLampStatus = lastStat;
ps->IO.lastPortMode = lastMode;
ps->devno = devno;
-
-#ifdef __KERNEL__
- if( _TRUE == slowIO[devno] ) {
- DBG( DBG_LOW, "Using slow I/O\n" );
- ps->IO.slowIO = _TRUE;
- ps->IO.fnOut = IOOutDelayed;
- ps->IO.fnIn = IOInDelayed;
- } else {
- DBG( DBG_LOW, "Using fast I/O\n" );
- ps->IO.slowIO = _FALSE;
- ps->IO.fnOut = IOOut;
- ps->IO.fnIn = IOIn;
- }
-#endif
ps->ModelOverride = mov[devno];
ps->warmup = warmup[devno];
ps->lampoff = lampoff[devno];
@@ -798,19 +506,6 @@ static int ptdrvInit( int devno )
return _E_ALLOC;
}
-#ifdef __KERNEL__
- if( _TRUE == slowIO[devno] ) {
- DBG( DBG_LOW, "Using slow I/O\n" );
- ps->IO.slowIO = _TRUE;
- ps->IO.fnOut = IOOutDelayed;
- ps->IO.fnIn = IOInDelayed;
- } else {
- DBG( DBG_LOW, "Using fast I/O\n" );
- ps->IO.slowIO = _FALSE;
- ps->IO.fnOut = IOOut;
- ps->IO.fnIn = IOIn;
- }
-#endif
ps->ModelOverride = mov[devno];
ps->warmup = warmup[devno];
ps->lampoff = lampoff[devno];
@@ -845,13 +540,8 @@ static int ptdrvInit( int devno )
if( _OK == retval ) {
-#ifdef __KERNEL__
- _PRINT( "pt_drv%u: %s found on port 0x%04x\n",
- devno, MiscGetModelName(ps->sCaps.Model), ps->IO.pbSppDataPort );
-#else
DBG( DBG_LOW, "pt_drv%u: %s found\n",
devno, MiscGetModelName(ps->sCaps.Model));
-#endif
/*
* initialize the timespan timer
@@ -859,43 +549,23 @@ static int ptdrvInit( int devno )
MiscStartTimer( &toTimer[ps->devno], (_SECOND * ps->warmup));
if( 0 == ps->lampoff )
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_LOW,
-#endif
"pt_drv%u: Lamp-Timer switched off.\n", devno );
else {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_LOW,
-#endif
"pt_drv%u: Lamp-Timer set to %u seconds.\n",
devno, ps->lampoff );
}
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_LOW,
-#endif
"pt_drv%u: WarmUp period set to %u seconds.\n",
devno, ps->warmup );
if( 0 == ps->lOffonEnd ) {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_LOW,
-#endif
"pt_drv%u: Lamp untouched on driver unload.\n", devno );
} else {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_LOW,
-#endif
"pt_drv%u: Lamp switch-off on driver unload.\n", devno );
}
@@ -1287,31 +957,19 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
int retval = _OK;
#ifdef _ASIC_98001_SIM
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_LOW,
-#endif
"pt_drv : Software-Emulation active, can't read!\n" );
return _E_INVALID;
#endif
if((NULL == buffer) || (NULL == ps)) {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_HIGH,
-#endif
"pt_drv : Internal NULL-pointer!\n" );
return _E_NULLPTR;
}
if( 0 == count ) {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_HIGH,
-#endif
"pt_drv%u: reading 0 bytes makes no sense!\n", ps->devno );
return _E_INVALID;
}
@@ -1325,11 +983,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
* when using the cat /dev/pt_drv command!
*/
if (!(ps->DataInf.dwVxdFlag & _VF_ENVIRONMENT_READY)) {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_HIGH,
-#endif
"pt_drv%u: Cannot read, driver not initialized!\n",ps->devno);
return _E_SEQUENCE;
}
@@ -1340,11 +994,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
ps->Scan.bp.pMonoBuf = _KALLOC( ps->DataInf.dwAppPhyBytesPerLine, GFP_KERNEL);
if ( NULL == ps->Scan.bp.pMonoBuf ) {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_HIGH,
-#endif
"pt_drv%u: Not enough memory available!\n", ps->devno );
return _E_ALLOC;
}
@@ -1355,11 +1005,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
scaleBuf = _KALLOC( ps->DataInf.dwAppPhyBytesPerLine, GFP_KERNEL);
if ( NULL == scaleBuf ) {
_KFREE( ps->Scan.bp.pMonoBuf );
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_HIGH,
-#endif
"pt_drv%u: Not enough memory available!\n", ps->devno );
return _E_ALLOC;
}
@@ -1406,11 +1052,7 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
retval = ps->Calibration( ps );
if( _OK != retval ) {
-#ifdef __KERNEL__
- _PRINT(
-#else
DBG( DBG_HIGH,
-#endif
"pt_drv%u: calibration failed, result = %i\n",
ps->devno, retval );
goto ReadFinished;
@@ -1507,12 +1149,9 @@ static int ptdrvRead( pScanData ps, pUChar buffer, int count )
ps->Scan.dwLinesToRead--;
/* needed, esp. to avoid freezing the system in SPP mode */
-#ifdef __KERNEL__
- schedule();
/*#else
sched_yield();
*/
-#endif
}
if (ps->fScanningStatus) {
@@ -1565,346 +1204,6 @@ ReadFinished:
return retval;
}
-/*************************** the module interface ****************************/
-
-#ifdef __KERNEL__ /* the kernel module interface */
-
-/* Designed to be used as a module */
-#ifdef MODULE
-
-/*.............................................................................
- * gets called upon module initialization
- */
-#ifdef LINUX_26
-static int __init ptdrv_init( void )
-#else
-int init_module( void )
-#endif
-{
- UInt devCount;
- UInt i;
- int retval = _OK;
- int result = _OK;
-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
- char controlname[24];
-#endif
-# ifdef LINUX_26
- char devname[20];
-#endif
-
- DBG( DBG_HIGH, "*********************************************\n" );
- DBG( DBG_HIGH, "pt_drv: init_module()\n" );
-
-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
- devfs_handle = devfs_mk_dir(NULL, "scanner", NULL);
- if( devfs_register_chrdev(_PTDRV_MAJOR, _DRV_NAME, &pt_drv_fops)) {
-#else
- if( register_chrdev(_PTDRV_MAJOR, _DRV_NAME, &pt_drv_fops)) {
-#endif
-
- _PRINT(KERN_INFO "pt_drv: unable to get major %d for pt_drv devices\n",
- _PTDRV_MAJOR);
- return -EIO;
- }
- printk( KERN_INFO "pt_drv : driver version "_PTDRV_VERSTR"\n" );
-
-#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
- ptdrv_class = class_create(THIS_MODULE, "scanner");
- if (IS_ERR(ptdrv_class))
- goto out_devfs;
-#endif
-
- /* register the proc_fs */
- ProcFsInitialize();
-
- /* go through the list of defined ports and try to find a device
- */
- devCount = 0;
- for( i = 0; i < _MAX_PTDEVS; i++ ) {
-
- if( 0 != port[i] ) {
- result = ptdrvInit( i );
-
- if ( _OK == result ) {
- PtDrvDevices[i]->flags |= _PTDRV_INITALIZED;
-
-#ifdef CONFIG_DEVFS_FS
-# ifndef DEVFS_26_STYLE
- sprintf( controlname, "scanner/pt_drv%d", devCount );
- devfs_register( NULL, controlname,
- DEVFS_FL_DEFAULT, _PTDRV_MAJOR, 0,
- (S_IFCHR | S_IRUGO | S_IWUGO | S_IFCHR),
- &pt_drv_fops, NULL );
-# else /* DEVFS_26_STYLE */
- devfs_mk_cdev(MKDEV(_PTDRV_MAJOR, devCount),
- (S_IFCHR | S_IRUGO | S_IWUGO | S_IFCHR),
- "scanner/pt_drv%d", devCount);
-# endif
-#else
-# ifdef LINUX_26
- sprintf(devname, "pt_drv%d", devCount);
- CLASS_DEV_CREATE(ptdrv_class,
- MKDEV(_PTDRV_MAJOR, devCount), NULL,
- devname);
-
-# endif /* LINUX_26 */
-#endif /* CONFIG_DEVFS_FS */
- ProcFsRegisterDevice( PtDrvDevices[i] );
- devCount++;
- } else {
- retval = result;
- ptdrvShutdown( PtDrvDevices[i] );
- PtDrvDevices[i] = NULL;
- }
- }
- }
-
- /* * if something went wrong, shutdown all... */
- if( devCount == 0 ) {
-
-#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
-out_devfs:
- class_destroy(ptdrv_class);
-#endif
-
-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
- devfs_unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
-#else
- unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
-#endif
- ProcFsShutdown();
-
-#ifdef __KERNEL__
- _PRINT( KERN_INFO "pt_drv : no device(s) detected, (%i)\n", retval );
-#endif
-
- } else {
-
- DBG( DBG_HIGH, "pt_drv : init done, %u device(s) found\n", devCount );
- retval = _OK;
- }
- DBG( DBG_HIGH, "---------------------------------------------\n" );
-
- deviceScanning = _FALSE;
- return retval;
-}
-
-/*.............................................................................
- * cleanup the show
- */
-#ifdef LINUX_26
-static void __exit ptdrv_exit( void )
-#else
-void cleanup_module( void )
-#endif
-{
- UInt i;
- pScanData ps;
-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
- char controlname[24];
- devfs_handle_t master;
-#endif
-
- DBG( DBG_HIGH, "pt_drv: cleanup_module()\n" );
-
- for ( i = 0; i < _MAX_PTDEVS; i++ ) {
-
- ps = PtDrvDevices[i];
- PtDrvDevices[i] = NULL;
-
- if ( NULL != ps ) {
-#ifdef CONFIG_DEVFS_FS
-# ifndef DEVFS_26_STYLE
- sprintf( controlname, "scanner/pt_drv%d", i );
- master = devfs_find_handle( NULL,controlname, 0, 0,
- DEVFS_SPECIAL_CHR, 0 );
- devfs_unregister( master );
-# else
- devfs_remove("scanner/pt_drv%d", i);
-# endif
-#else
-# ifdef LINUX_26
- CLASS_DEV_DESTROY(ptdrv_class, MKDEV(_PTDRV_MAJOR, i));
-# endif /* LINUX_26 */
-#endif /* CONFIG_DEVFS_FS */
- ptdrvShutdown( ps );
- ProcFsUnregisterDevice( ps );
- }
- }
-
-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
- devfs_unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
-#else
- unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
-#endif
- ProcFsShutdown();
-
-#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
- class_destroy(ptdrv_class);
-#endif
-
- DBG( DBG_HIGH, "pt_drv: cleanup done.\n" );
- DBG( DBG_HIGH, "*********************************************\n" );
-}
-
-#ifdef LINUX_26
-module_init(ptdrv_init);
-module_exit(ptdrv_exit);
-#endif
-
-#endif /*MODULE*/
-
-
-/*.............................................................................
- * device open...
- */
-static int pt_drv_open(struct inode *inode, struct file *file)
-{
- pScanData ps;
-
- DBG( DBG_HIGH, "pt_drv_open()\n" );
-
- ps = get_pt_from_inode(inode);
-
- if ( NULL == ps ) {
- return(-ENXIO);
- }
-
- /* device not found ? */
- if (!(ps->flags & _PTDRV_INITALIZED)) {
- return(-ENXIO);
- }
-
- /* device is busy ? */
- if (ps->flags & _PTDRV_OPEN) {
- return(-EBUSY);
- }
-
-#ifdef LINUX_26
- if (!try_module_get(THIS_MODULE))
- return -EAGAIN;
-#else
- MOD_INC_USE_COUNT;
-#endif
- ps->flags |= _PTDRV_OPEN;
-
- return _OK;
-}
-
-/*.............................................................................
- * device close...
- */
-static CLOSETYPE pt_drv_close(struct inode * inode, struct file * file)
-{
- pScanData ps;
-
- DBG( DBG_HIGH, "pt_drv_close()\n" );
-
- if ((ps = get_pt_from_inode(inode)) ) {
-
- ptdrvClose( ps );
-
- ps->flags &= ~_PTDRV_OPEN;
-#ifdef LINUX_26
- module_put(THIS_MODULE);
-#else
- MOD_DEC_USE_COUNT;
-#endif
- CLOSERETURN(0);
- } else {
-
- DBG( DBG_HIGH, "pt_drv: - close failed!\n" );
- CLOSERETURN(-ENXIO);
- }
-}
-
-/*.............................................................................
- * read data from device
- */
-#ifdef LINUX_20
-static int pt_drv_read(struct inode *inode, struct file *file,
- char *buffer, int count)
-{
- int result;
- pScanData ps;
-
- if ( !(ps = get_pt_from_inode(inode)))
- return(-ENXIO);
-#else
-static ssize_t pt_drv_read( struct file *file,
- char *buffer, size_t count, loff_t *tmp )
-{
- int result;
- pScanData ps;
-
- if ( !(ps = get_pt_from_inode(file->f_dentry->d_inode)) )
- return(-ENXIO);
-#endif
- if ((result = verify_area_20(VERIFY_WRITE, buffer, count)))
- return result;
-
- /*
- * as the driver contains some global vars, it is not
- * possible to scan simultaenously with two or more devices
- */
- if( _TRUE == deviceScanning ) {
- printk( KERN_INFO "pt_drv: device %u busy!!!\n", ps->devno );
- return(-EBUSY);
- }
-
- deviceScanning = _TRUE;
-
- result = ptdrvRead( ps, buffer, count );
-
- deviceScanning = _FALSE;
- return result;
-}
-
-/*.............................................................................
- * writing makes no sense
- */
-#ifdef LINUX_20
-static int pt_drv_write(struct inode * inode, struct file * file,
- const char * buffer, int count)
-{
- return -EPERM;
-}
-#else
- static ssize_t pt_drv_write( struct file * file,const char * buffer,
- size_t tmp,loff_t* count)
-{
- return -EPERM;
-}
-#endif
-
-/*.............................................................................
- * the ioctl interface
- */
-#ifdef NOLOCK_IOCTL
-static long pt_drv_ioctl( struct file *file, UInt cmd, unsigned long arg )
-{
- pScanData ps;
-
- if ( !(ps = get_pt_from_inode(file->f_dentry->d_inode)) )
- return(-ENXIO);
-
- return ptdrvIoctl( ps, cmd, (pVoid)arg);
-}
-#else
-static int pt_drv_ioctl( struct inode *inode, struct file *file,
- UInt cmd, unsigned long arg )
-{
- pScanData ps;
-
- if ( !(ps = get_pt_from_inode(inode)) )
- return(-ENXIO);
-
- return ptdrvIoctl( ps, cmd, (pVoid)arg);
-}
-#endif
-
-#else /* the user-mode interface */
-
/*.............................................................................
* here we only have wrapper functions
*/
@@ -1980,6 +1279,4 @@ static int PtDrvRead ( pUChar buffer, int count )
return ptdrvRead( PtDrvDevices[0], buffer, count );
}
-#endif /* guard __KERNEL__ */
-
/* END PLUSTEK-PP_PTDRV.C ...................................................*/