Staging: Fixes for me4000 pci data collection driver

Following Andrew Morton's review for this patch I made a patch that
fixes most of the remarks.
I've converted the sleep_on_timeout to wait_event_timeout but I
probably not in the right way.
Also I don't know what's the problem with the calls for get_user() so
I left them untouched.

Signed-off-by: Lior Dotan <liodot@gmail.com>
Cc: Andrew Morton <akpm@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Lior Dotan 2008-10-17 11:30:07 +02:00 committed by Greg Kroah-Hartman
parent b4c0ed1169
commit 0b65d3cc77
2 changed files with 543 additions and 543 deletions

File diff suppressed because it is too large Load Diff

View File

@ -329,46 +329,46 @@
Circular buffer used for analog input/output reads/writes. Circular buffer used for analog input/output reads/writes.
===========================================================================*/ ===========================================================================*/
typedef struct me4000_circ_buf { struct me4000_circ_buf {
s16 *buf; s16 *buf;
int volatile head; int volatile head;
int volatile tail; int volatile tail;
} me4000_circ_buf_t; };
/*============================================================================= /*=============================================================================
Information about the hardware capabilities Information about the hardware capabilities
===========================================================================*/ ===========================================================================*/
typedef struct me4000_ao_info { struct me4000_ao_info {
int count; int count;
int fifo_count; int fifo_count;
} me4000_ao_info_t; };
typedef struct me4000_ai_info { struct me4000_ai_info {
int count; int count;
int sh_count; int sh_count;
int diff_count; int diff_count;
int ex_trig_analog; int ex_trig_analog;
} me4000_ai_info_t; };
typedef struct me4000_dio_info { struct me4000_dio_info {
int count; int count;
} me4000_dio_info_t; };
typedef struct me4000_cnt_info { struct me4000_cnt_info {
int count; int count;
} me4000_cnt_info_t; };
typedef struct me4000_board { struct me4000_board {
u16 vendor_id; u16 vendor_id;
u16 device_id; u16 device_id;
me4000_ao_info_t ao; struct me4000_ao_info ao;
me4000_ai_info_t ai; struct me4000_ai_info ai;
me4000_dio_info_t dio; struct me4000_dio_info dio;
me4000_cnt_info_t cnt; struct me4000_cnt_info cnt;
} me4000_board_t; };
static me4000_board_t me4000_boards[] = { static struct me4000_board me4000_boards[] = {
{PCI_VENDOR_ID_MEILHAUS, 0x4610, {0, 0}, {16, 0, 0, 0}, {4}, {3}}, {PCI_VENDOR_ID_MEILHAUS, 0x4610, {0, 0}, {16, 0, 0, 0}, {4}, {3}},
{PCI_VENDOR_ID_MEILHAUS, 0x4650, {0, 0}, {16, 0, 0, 0}, {4}, {0}}, {PCI_VENDOR_ID_MEILHAUS, 0x4650, {0, 0}, {16, 0, 0, 0}, {4}, {0}},
@ -391,8 +391,6 @@ static me4000_board_t me4000_boards[] = {
{0}, {0},
}; };
#define ME4000_BOARD_VERSIONS (sizeof(me4000_boards) / sizeof(me4000_board_t) - 1)
/*============================================================================= /*=============================================================================
PCI device table. PCI device table.
This is used by modprobe to translate PCI IDs to drivers. This is used by modprobe to translate PCI IDs to drivers.
@ -427,19 +425,19 @@ MODULE_DEVICE_TABLE(pci, me4000_pci_table);
Global board and subdevice information structures Global board and subdevice information structures
===========================================================================*/ ===========================================================================*/
typedef struct me4000_info { struct me4000_info {
struct list_head list; // List of all detected boards struct list_head list; // List of all detected boards
int board_count; // Index of the board after detection int board_count; // Index of the board after detection
unsigned long plx_regbase; // PLX configuration space base address unsigned long plx_regbase; // PLX configuration space base address
unsigned long me4000_regbase; // Base address of the ME4000 resource_size_t me4000_regbase; // Base address of the ME4000
unsigned long timer_regbase; // Base address of the timer circuit resource_size_t timer_regbase; // Base address of the timer circuit
unsigned long program_regbase; // Base address to set the program pin for the xilinx resource_size_t program_regbase; // Base address to set the program pin for the xilinx
unsigned long plx_regbase_size; // PLX register set space unsigned long plx_regbase_size; // PLX register set space
unsigned long me4000_regbase_size; // ME4000 register set space resource_size_t me4000_regbase_size; // ME4000 register set space
unsigned long timer_regbase_size; // Timer circuit register set space resource_size_t timer_regbase_size; // Timer circuit register set space
unsigned long program_regbase_size; // Size of program base address of the ME4000 resource_size_t program_regbase_size; // Size of program base address of the ME4000
unsigned int serial_no; // Serial number of the board unsigned int serial_no; // Serial number of the board
unsigned char hw_revision; // Hardware revision of the board unsigned char hw_revision; // Hardware revision of the board
@ -451,7 +449,7 @@ typedef struct me4000_info {
int pci_func_no; // PCI function number int pci_func_no; // PCI function number
struct pci_dev *pci_dev_p; // General PCI information struct pci_dev *pci_dev_p; // General PCI information
me4000_board_t *board_p; // Holds the board capabilities struct me4000_board *board_p; // Holds the board capabilities
unsigned int irq; // IRQ assigned from the PCI BIOS unsigned int irq; // IRQ assigned from the PCI BIOS
unsigned int irq_count; // Count of external interrupts unsigned int irq_count; // Count of external interrupts
@ -464,18 +462,18 @@ typedef struct me4000_info {
struct me4000_dio_context *dio_context; // Digital I/O specific context struct me4000_dio_context *dio_context; // Digital I/O specific context
struct me4000_cnt_context *cnt_context; // Counter specific context struct me4000_cnt_context *cnt_context; // Counter specific context
struct me4000_ext_int_context *ext_int_context; // External interrupt specific context struct me4000_ext_int_context *ext_int_context; // External interrupt specific context
} me4000_info_t; };
typedef struct me4000_ao_context { struct me4000_ao_context {
struct list_head list; // linked list of me4000_ao_context_t struct list_head list; // linked list of me4000_ao_context_t
int index; // Index in the list int index; // Index in the list
int mode; // Indicates mode (0 = single, 1 = wraparound, 2 = continous) int mode; // Indicates mode (0 = single, 1 = wraparound, 2 = continous)
int dac_in_use; // Indicates if already opend int dac_in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
spinlock_t int_lock; // Used when locking out interrupts spinlock_t int_lock; // Used when locking out interrupts
me4000_circ_buf_t circ_buf; // Circular buffer struct me4000_circ_buf circ_buf; // Circular buffer
wait_queue_head_t wait_queue; // Wait queue to sleep while blocking write wait_queue_head_t wait_queue; // Wait queue to sleep while blocking write
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned int irq; // The irq associated with this ADC unsigned int irq; // The irq associated with this ADC
int volatile pipe_flag; // Indicates broken pipe set from me4000_ao_isr() int volatile pipe_flag; // Indicates broken pipe set from me4000_ao_isr()
unsigned long ctrl_reg; unsigned long ctrl_reg;
@ -486,9 +484,9 @@ typedef struct me4000_ao_context {
unsigned long irq_status_reg; unsigned long irq_status_reg;
unsigned long preload_reg; unsigned long preload_reg;
struct fasync_struct *fasync_p; // Queue for asynchronous notification struct fasync_struct *fasync_p; // Queue for asynchronous notification
} me4000_ao_context_t; };
typedef struct me4000_ai_context { struct me4000_ai_context {
struct list_head list; // linked list of me4000_ai_info_t struct list_head list; // linked list of me4000_ai_info_t
int mode; // Indicates mode int mode; // Indicates mode
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
@ -496,9 +494,9 @@ typedef struct me4000_ai_context {
spinlock_t int_lock; // Used when locking out interrupts spinlock_t int_lock; // Used when locking out interrupts
int number; // Number of the DAC int number; // Number of the DAC
unsigned int irq; // The irq associated with this ADC unsigned int irq; // The irq associated with this ADC
me4000_circ_buf_t circ_buf; // Circular buffer struct me4000_circ_buf circ_buf; // Circular buffer
wait_queue_head_t wait_queue; // Wait queue to sleep while blocking read wait_queue_head_t wait_queue; // Wait queue to sleep while blocking read
me4000_info_t *board_info; struct me4000_info *board_info;
struct fasync_struct *fasync_p; // Queue for asynchronous notification struct fasync_struct *fasync_p; // Queue for asynchronous notification
@ -523,48 +521,48 @@ typedef struct me4000_ai_context {
unsigned long channel_list_count; unsigned long channel_list_count;
unsigned long sample_counter; unsigned long sample_counter;
int sample_counter_reload; int sample_counter_reload;
} me4000_ai_context_t; };
typedef struct me4000_dio_context { struct me4000_dio_context {
struct list_head list; // linked list of me4000_dio_context_t struct list_head list; // linked list of me4000_dio_context_t
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
int number; int number;
int dio_count; int dio_count;
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned long dir_reg; unsigned long dir_reg;
unsigned long ctrl_reg; unsigned long ctrl_reg;
unsigned long port_0_reg; unsigned long port_0_reg;
unsigned long port_1_reg; unsigned long port_1_reg;
unsigned long port_2_reg; unsigned long port_2_reg;
unsigned long port_3_reg; unsigned long port_3_reg;
} me4000_dio_context_t; };
typedef struct me4000_cnt_context { struct me4000_cnt_context {
struct list_head list; // linked list of me4000_dio_context_t struct list_head list; // linked list of me4000_dio_context_t
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
int number; int number;
int cnt_count; int cnt_count;
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned long ctrl_reg; unsigned long ctrl_reg;
unsigned long counter_0_reg; unsigned long counter_0_reg;
unsigned long counter_1_reg; unsigned long counter_1_reg;
unsigned long counter_2_reg; unsigned long counter_2_reg;
} me4000_cnt_context_t; };
typedef struct me4000_ext_int_context { struct me4000_ext_int_context {
struct list_head list; // linked list of me4000_dio_context_t struct list_head list; // linked list of me4000_dio_context_t
int in_use; // Indicates if already opend int in_use; // Indicates if already opend
spinlock_t use_lock; // Guards in_use spinlock_t use_lock; // Guards in_use
int number; int number;
me4000_info_t *board_info; struct me4000_info *board_info;
unsigned int irq; unsigned int irq;
unsigned long int_count; unsigned long int_count;
struct fasync_struct *fasync_ptr; struct fasync_struct *fasync_ptr;
unsigned long ctrl_reg; unsigned long ctrl_reg;
unsigned long irq_status_reg; unsigned long irq_status_reg;
} me4000_ext_int_context_t; };
#endif #endif
@ -745,12 +743,12 @@ typedef struct me4000_ext_int_context {
General type definitions General type definitions
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_user_info { struct me4000_user_info {
int board_count; // Index of the board after detection int board_count; // Index of the board after detection
unsigned long plx_regbase; // PLX configuration space base address unsigned long plx_regbase; // PLX configuration space base address
unsigned long me4000_regbase; // Base address of the ME4000 resource_size_t me4000_regbase; // Base address of the ME4000
unsigned long plx_regbase_size; // PLX register set space unsigned long plx_regbase_size; // PLX register set space
unsigned long me4000_regbase_size; // ME4000 register set space resource_size_t me4000_regbase_size; // ME4000 register set space
unsigned long serial_no; // Serial number of the board unsigned long serial_no; // Serial number of the board
unsigned char hw_revision; // Hardware revision of the board unsigned char hw_revision; // Hardware revision of the board
unsigned short vendor_id; // Meilhaus vendor id (0x1402) unsigned short vendor_id; // Meilhaus vendor id (0x1402)
@ -773,62 +771,62 @@ typedef struct me4000_user_info {
int dio_count; // Count of digital I/O ports int dio_count; // Count of digital I/O ports
int cnt_count; // Count of counters int cnt_count; // Count of counters
} me4000_user_info_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for analog output Type definitions for analog output
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_ao_channel_list { struct me4000_ao_channel_list {
unsigned long count; unsigned long count;
unsigned long *list; unsigned long *list;
} me4000_ao_channel_list_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for analog input Type definitions for analog input
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_ai_channel_list { struct me4000_ai_channel_list {
unsigned long count; unsigned long count;
unsigned long *list; unsigned long *list;
} me4000_ai_channel_list_t; };
typedef struct me4000_ai_timer { struct me4000_ai_timer {
unsigned long pre_chan; unsigned long pre_chan;
unsigned long chan; unsigned long chan;
unsigned long scan_low; unsigned long scan_low;
unsigned long scan_high; unsigned long scan_high;
} me4000_ai_timer_t; };
typedef struct me4000_ai_config { struct me4000_ai_config {
me4000_ai_timer_t timer; struct me4000_ai_timer timer;
me4000_ai_channel_list_t channel_list; struct me4000_ai_channel_list channel_list;
int sh; int sh;
} me4000_ai_config_t; };
typedef struct me4000_ai_single { struct me4000_ai_single {
int channel; int channel;
int range; int range;
int mode; int mode;
short value; short value;
unsigned long timeout; unsigned long timeout;
} me4000_ai_single_t; };
typedef struct me4000_ai_trigger { struct me4000_ai_trigger {
int mode; int mode;
int edge; int edge;
} me4000_ai_trigger_t; };
typedef struct me4000_ai_sc { struct me4000_ai_sc {
unsigned long value; unsigned long value;
int reload; int reload;
} me4000_ai_sc_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for eeprom Type definitions for eeprom
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_eeprom { struct me4000_eeprom {
unsigned long date; unsigned long date;
short uni_10_offset; short uni_10_offset;
short uni_10_fullscale; short uni_10_fullscale;
@ -842,45 +840,45 @@ typedef struct me4000_eeprom {
short diff_10_fullscale; short diff_10_fullscale;
short diff_2_5_offset; short diff_2_5_offset;
short diff_2_5_fullscale; short diff_2_5_fullscale;
} me4000_eeprom_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for digital I/O Type definitions for digital I/O
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_dio_config { struct me4000_dio_config {
int port; int port;
int mode; int mode;
int function; int function;
} me4000_dio_config_t; };
typedef struct me4000_dio_byte { struct me4000_dio_byte {
int port; int port;
unsigned char byte; unsigned char byte;
} me4000_dio_byte_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for counters Type definitions for counters
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct me4000_cnt { struct me4000_cnt {
int counter; int counter;
unsigned short value; unsigned short value;
} me4000_cnt_t; };
typedef struct me4000_cnt_config { struct me4000_cnt_config {
int counter; int counter;
int mode; int mode;
} me4000_cnt_config_t; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
Type definitions for external interrupt Type definitions for external interrupt
----------------------------------------------------------------------------*/ ----------------------------------------------------------------------------*/
typedef struct { struct me4000_int {
int int1_count; int int1_count;
int int2_count; int int2_count;
} me4000_int_type; };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
The ioctls of the board The ioctls of the board
@ -888,7 +886,8 @@ typedef struct {
#define ME4000_IOCTL_MAXNR 50 #define ME4000_IOCTL_MAXNR 50
#define ME4000_MAGIC 'y' #define ME4000_MAGIC 'y'
#define ME4000_GET_USER_INFO _IOR (ME4000_MAGIC, 0, me4000_user_info_t) #define ME4000_GET_USER_INFO _IOR (ME4000_MAGIC, 0, \
struct me4000_user_info)
#define ME4000_AO_START _IOW (ME4000_MAGIC, 1, unsigned long) #define ME4000_AO_START _IOW (ME4000_MAGIC, 1, unsigned long)
#define ME4000_AO_STOP _IO (ME4000_MAGIC, 2) #define ME4000_AO_STOP _IO (ME4000_MAGIC, 2)
@ -904,25 +903,35 @@ typedef struct {
#define ME4000_AO_DISABLE_DO _IO (ME4000_MAGIC, 12) #define ME4000_AO_DISABLE_DO _IO (ME4000_MAGIC, 12)
#define ME4000_AO_FSM_STATE _IOR (ME4000_MAGIC, 13, int) #define ME4000_AO_FSM_STATE _IOR (ME4000_MAGIC, 13, int)
#define ME4000_AI_SINGLE _IOR (ME4000_MAGIC, 14, me4000_ai_single_t) #define ME4000_AI_SINGLE _IOR (ME4000_MAGIC, 14, \
struct me4000_ai_single)
#define ME4000_AI_START _IOW (ME4000_MAGIC, 15, unsigned long) #define ME4000_AI_START _IOW (ME4000_MAGIC, 15, unsigned long)
#define ME4000_AI_STOP _IO (ME4000_MAGIC, 16) #define ME4000_AI_STOP _IO (ME4000_MAGIC, 16)
#define ME4000_AI_IMMEDIATE_STOP _IO (ME4000_MAGIC, 17) #define ME4000_AI_IMMEDIATE_STOP _IO (ME4000_MAGIC, 17)
#define ME4000_AI_EX_TRIG_ENABLE _IO (ME4000_MAGIC, 18) #define ME4000_AI_EX_TRIG_ENABLE _IO (ME4000_MAGIC, 18)
#define ME4000_AI_EX_TRIG_DISABLE _IO (ME4000_MAGIC, 19) #define ME4000_AI_EX_TRIG_DISABLE _IO (ME4000_MAGIC, 19)
#define ME4000_AI_EX_TRIG_SETUP _IOW (ME4000_MAGIC, 20, me4000_ai_trigger_t) #define ME4000_AI_EX_TRIG_SETUP _IOW (ME4000_MAGIC, 20, \
#define ME4000_AI_CONFIG _IOW (ME4000_MAGIC, 21, me4000_ai_config_t) struct me4000_ai_trigger)
#define ME4000_AI_SC_SETUP _IOW (ME4000_MAGIC, 22, me4000_ai_sc_t) #define ME4000_AI_CONFIG _IOW (ME4000_MAGIC, 21, \
struct me4000_ai_config)
#define ME4000_AI_SC_SETUP _IOW (ME4000_MAGIC, 22, \
struct me4000_ai_sc)
#define ME4000_AI_FSM_STATE _IOR (ME4000_MAGIC, 23, int) #define ME4000_AI_FSM_STATE _IOR (ME4000_MAGIC, 23, int)
#define ME4000_DIO_CONFIG _IOW (ME4000_MAGIC, 24, me4000_dio_config_t) #define ME4000_DIO_CONFIG _IOW (ME4000_MAGIC, 24, \
#define ME4000_DIO_GET_BYTE _IOR (ME4000_MAGIC, 25, me4000_dio_byte_t) struct me4000_dio_config)
#define ME4000_DIO_SET_BYTE _IOW (ME4000_MAGIC, 26, me4000_dio_byte_t) #define ME4000_DIO_GET_BYTE _IOR (ME4000_MAGIC, 25, \
struct me4000_dio_byte)
#define ME4000_DIO_SET_BYTE _IOW (ME4000_MAGIC, 26, \
struct me4000_dio_byte)
#define ME4000_DIO_RESET _IO (ME4000_MAGIC, 27) #define ME4000_DIO_RESET _IO (ME4000_MAGIC, 27)
#define ME4000_CNT_READ _IOR (ME4000_MAGIC, 28, me4000_cnt_t) #define ME4000_CNT_READ _IOR (ME4000_MAGIC, 28, \
#define ME4000_CNT_WRITE _IOW (ME4000_MAGIC, 29, me4000_cnt_t) struct me4000_cnt)
#define ME4000_CNT_CONFIG _IOW (ME4000_MAGIC, 30, me4000_cnt_config_t) #define ME4000_CNT_WRITE _IOW (ME4000_MAGIC, 29, \
struct me4000_cnt)
#define ME4000_CNT_CONFIG _IOW (ME4000_MAGIC, 30, \
struct me4000_cnt_config)
#define ME4000_CNT_RESET _IO (ME4000_MAGIC, 31) #define ME4000_CNT_RESET _IO (ME4000_MAGIC, 31)
#define ME4000_EXT_INT_DISABLE _IO (ME4000_MAGIC, 32) #define ME4000_EXT_INT_DISABLE _IO (ME4000_MAGIC, 32)
@ -934,13 +943,16 @@ typedef struct {
#define ME4000_AI_FULLSCALE_ENABLE _IO (ME4000_MAGIC, 37) #define ME4000_AI_FULLSCALE_ENABLE _IO (ME4000_MAGIC, 37)
#define ME4000_AI_FULLSCALE_DISABLE _IO (ME4000_MAGIC, 38) #define ME4000_AI_FULLSCALE_DISABLE _IO (ME4000_MAGIC, 38)
#define ME4000_AI_EEPROM_READ _IOR (ME4000_MAGIC, 39, me4000_eeprom_t) #define ME4000_AI_EEPROM_READ _IOR (ME4000_MAGIC, 39, \
#define ME4000_AI_EEPROM_WRITE _IOW (ME4000_MAGIC, 40, me4000_eeprom_t) struct me4000_eeprom)
#define ME4000_AI_EEPROM_WRITE _IOW (ME4000_MAGIC, 40, \
struct me4000_eeprom)
#define ME4000_AO_SIMULTANEOUS_EX_TRIG _IO (ME4000_MAGIC, 41) #define ME4000_AO_SIMULTANEOUS_EX_TRIG _IO (ME4000_MAGIC, 41)
#define ME4000_AO_SIMULTANEOUS_SW _IO (ME4000_MAGIC, 42) #define ME4000_AO_SIMULTANEOUS_SW _IO (ME4000_MAGIC, 42)
#define ME4000_AO_SIMULTANEOUS_DISABLE _IO (ME4000_MAGIC, 43) #define ME4000_AO_SIMULTANEOUS_DISABLE _IO (ME4000_MAGIC, 43)
#define ME4000_AO_SIMULTANEOUS_UPDATE _IOW (ME4000_MAGIC, 44, me4000_ao_channel_list_t) #define ME4000_AO_SIMULTANEOUS_UPDATE _IOW (ME4000_MAGIC, 44, \
struct me4000_ao_channel_list)
#define ME4000_AO_SYNCHRONOUS_EX_TRIG _IO (ME4000_MAGIC, 45) #define ME4000_AO_SYNCHRONOUS_EX_TRIG _IO (ME4000_MAGIC, 45)
#define ME4000_AO_SYNCHRONOUS_SW _IO (ME4000_MAGIC, 46) #define ME4000_AO_SYNCHRONOUS_SW _IO (ME4000_MAGIC, 46)