/home/hillier_g/checkout/most4linux/most-kernel/most-netservice.c File Reference

Implementation of the MOST NetService driver. More...

Go to the source code of this file.

Defines

#define DRIVER_NAME   "most-netservice"
#define PR   DRIVER_NAME ": "

Functions

static int most_nets_open (struct inode *, struct file *)
static int most_nets_release (struct inode *inode, struct file *file)
static int most_nets_ioctl (struct inode *, struct file *, unsigned int, unsigned long)
static void process_sigsend_handler (unsigned long)
static int ioctl_write_register (struct most_nets_dev *, unsigned long)
static int ioctl_read_register (struct most_nets_dev *, unsigned long)
static int ioctl_write_regblock (struct most_nets_dev *, unsigned long)
static int ioctl_read_regblock (struct most_nets_dev *, unsigned long)
static int ioctl_read_int (struct most_nets_dev *)
static int ioctl_irq_set (struct most_nets_dev *, unsigned long)
static int ioctl_irq_reset (struct most_nets_dev *, unsigned long)
static int ioctl_reset (struct most_nets_dev *)
static DECLARE_TASKLET (sigsend_tasklet, process_sigsend_handler, 0)
 DEFINE_NRTSIG (nrt_signal)
static int nets_probe (struct most_dev *most_dev)
int nets_remove (struct most_dev *dev)
static void nrtsig_handler (rtnrt_nrtsig_t nrt_sig)
static void nets_int_handler (struct most_dev *dev, unsigned int intstatus)
static int __init most_nets_init (void)
static void __exit most_nets_exit (void)

Variables

static char * version = "$Rev: 641 $"
most_nets_devmost_nets_devices [MOST_DEVICE_NUMBER]
static struct file_operations most_nets_file_operations
static unsigned long cards_to_send_interrupt = 0
static struct most_high_driver most_netservice_high_driver


Detailed Description

Implementation of the MOST NetService driver.

Definition in file most-netservice.c.


Define Documentation

#define DRIVER_NAME   "most-netservice"

The name of the driver.

Definition at line 50 of file most-netservice.c.

#define PR   DRIVER_NAME ": "

The prefix for printk statements in this driver

Definition at line 55 of file most-netservice.c.


Function Documentation

static int most_nets_open ( struct inode *  inode,
struct file *  filp 
) [static]

Opens the device. Creates a per-file structure.

Parameters:
inode the inode
filp the file pointer
Returns:
0 on success, an error code on failure

Definition at line 176 of file most-netservice.c.

References most_nets_dev::cdev, most_nets_dev::most_dev, MOST_DEV_CARDNUMBER, most_manage_usage, most_nets_dev::open_count, PR, pr_nets_debug, and rtnrt_info.

static int most_nets_release ( struct inode *  inode,
struct file *  filp 
) [static]

The release function. Frees the allocated memory.

Parameters:
inode the inode
filp the file pointer
Returns:
0 on success

Definition at line 294 of file most-netservice.c.

References most_nets_dev::most_dev, MOST_DEV_CARDNUMBER, most_manage_usage, most_nets_dev::open_count, PR, and pr_nets_debug.

static int most_nets_ioctl ( struct inode *  inode,
struct file *  file,
unsigned int  cmd,
unsigned long  arg 
) [static]

The ioctl() system call which implements the basic operations. The valid commands are described in the header file most-netservices.h where they are defined.

Parameters:
inode the inode
file the file
cmd the command
arg the command argument
Returns:
0 on success, a negative value on error

Definition at line 219 of file most-netservice.c.

References ioctl_irq_reset(), ioctl_irq_set(), ioctl_read_int(), ioctl_read_regblock(), ioctl_read_register(), ioctl_reset(), ioctl_write_regblock(), ioctl_write_register(), MOST_NETS_IOCTL_MAGIC, MOST_NETS_IRQ_RESET, MOST_NETS_IRQ_SET, MOST_NETS_MAXIOCTL, MOST_NETS_READ_INT, MOST_NETS_READREG, MOST_NETS_READREG_BLOCK, MOST_NETS_RESET, MOST_NETS_WRITEREG, and MOST_NETS_WRITEREG_BLOCK.

static void process_sigsend_handler ( unsigned long  data  )  [static]

Tasklet that gets started if an interrupt occured. It sends all processes that belongs to a PCI card that has an interrupt signalled in cards_to_send_interrupt the requested signal.

Parameters:
data the "cookie" (required if more tasklets have been assigned the same function)

Definition at line 129 of file most-netservice.c.

References assert, cards_to_send_interrupt, ISMAINT, ISMINT, MNS_AINT, MNS_INT, MOST_DEVICE_NUMBER, most_kill(), and most_nets_devices.

static int ioctl_write_register ( struct most_nets_dev dev,
unsigned long  ioctl_arg 
) [static]

Writes the register specified in arg with the value specified in arg.

Parameters:
dev the most_nets_dev structure
ioctl_arg the ioctl argument (must be parsed in this function)
Returns:
0 on success, any other error code (negative) on failure

Definition at line 316 of file most-netservice.c.

References single_transfer_arg::address, most_nets_dev::most_dev, most_writereg8104, PR, pr_ioctl_debug, and single_transfer_arg::value.

Referenced by most_nets_ioctl().

static int ioctl_read_register ( struct most_nets_dev dev,
unsigned long  ioctl_arg 
) [static]

Reads the register specified in arg with the value specified in arg.

Parameters:
dev the most_nets_dev structure
ioctl_arg the ioctl argument (must be parsed in this function)
Returns:
0 on success, any other error code (negative) on failure

Definition at line 345 of file most-netservice.c.

References single_transfer_arg::address, most_nets_dev::most_dev, most_readreg8104, PR, pr_ioctl_debug, and single_transfer_arg::value.

Referenced by most_nets_ioctl().

static int ioctl_write_regblock ( struct most_nets_dev dev,
unsigned long  ioctl_arg 
) [static]

Performs the MOST_NETS_WRITEREG_BLOCK ioctl() call as described in the desciption of the definition of MOST_NETS_WRITEREG_BLOCK.

Parameters:
dev the most_nets_dev structure
ioctl_arg the ioctl argument (must be parsed in this function)
Returns:
the number of registers written on success, a negative error code on failure

Definition at line 425 of file most-netservice.c.

References block_transfer_arg::address, most_nets_dev::buffer, block_transfer_arg::count, block_transfer_arg::data, most_nets_dev::most_dev, most_writereg8104, PR, and pr_ioctl_debug.

Referenced by most_nets_ioctl().

static int ioctl_read_regblock ( struct most_nets_dev dev,
unsigned long  ioctl_arg 
) [static]

Performs the MOST_NETS_READREG_BLOCK ioctl() call as described in the command near the definition of MOST_NETS_WRITEREG_BLOCK.

Parameters:
dev the most_nets_dev structure
ioctl_arg the ioctl argument (must be parsed in this function)
Returns:
the number of registers written on success, a negative error code on failure

Definition at line 383 of file most-netservice.c.

References block_transfer_arg::address, most_nets_dev::buffer, block_transfer_arg::count, block_transfer_arg::data, most_nets_dev::most_dev, most_readreg8104, PR, and pr_ioctl_debug.

Referenced by most_nets_ioctl().

static int ioctl_read_int ( struct most_nets_dev dev  )  [static]

Performs the MOST_NETS_READ_INT ioctl() call as described in the description of the definition of MOST_NETS_READ_INT.

Parameters:
dev the most_nets_dev structure
Returns:
true if an interrupt is active (i.e. /INT is low), false if no interrupt is active (i.e. /INT is high) and a negative value on error

Definition at line 470 of file most-netservice.c.

References ISMINT, most_nets_dev::most_dev, MOST_PCI_INTSTATUS_REG, most_readreg, PR, and pr_ioctl_debug.

Referenced by most_nets_ioctl().

static int ioctl_irq_set ( struct most_nets_dev dev,
unsigned long  ioctl_arg 
) [static]

Implements registering a userspace process for the IRQ. This function is called in process context, so current is set valid.

See documentation of MOST_NETS_IRQ_SET ioctl() constant in the header file for more information.

Parameters:
dev the most_nets_dev structure
ioctl_arg the ioctl() argument
Returns:
an error code on failure or 0 on success

Definition at line 496 of file most-netservice.c.

References IEMAINT, IEMINT, most_nets_dev::intmask, is_between_excl, MNS_AINT, MNS_INT, most_nets_dev::most_dev, most_intset, PR, pr_ioctl_debug, rtnrt_err, interrupt_set_arg::sigmask, most_nets_dev::signo, interrupt_set_arg::signo, and most_nets_dev::task.

Referenced by most_nets_ioctl().

static int ioctl_irq_reset ( struct most_nets_dev dev,
unsigned long  ioctl_arg 
) [static]

Implements registering a userspace process for the IRQ. This function is called in process context, so current is set valid.

See documentation of MOST_NETS_IRQ_SET ioctl() constant in the header file for more information.

Parameters:
dev the most_nets_dev structure
ioctl_arg the ioctl() argument
Returns:
an error code on failure or 0 on success

Definition at line 545 of file most-netservice.c.

References IEMAINT, IEMINT, most_nets_dev::intmask, most_nets_dev::most_dev, most_intset, most_writereg8104, MSGC, PR, and pr_ioctl_debug.

Referenced by most_nets_ioctl().

static int ioctl_reset ( struct most_nets_dev dev  )  [static]

Resets the MOST Transceiver.

Parameters:
dev the MOST NetService device

Definition at line 577 of file most-netservice.c.

References most_nets_dev::most_dev, and most_reset.

Referenced by most_nets_ioctl().

static DECLARE_TASKLET ( sigsend_tasklet  ,
process_sigsend_handler  ,
 
) [static]

Tasklet that is responsible for sending signals to the processes, see documentation of process_sigsend_handler.

DEFINE_NRTSIG ( nrt_signal   ) 

Non real-time signalling service handler. This is needed because the interrupt handler runs in RT context if compiled with RT_RTDM and some tasks must be done from Linux context.

static int nets_probe ( struct most_dev most_dev  )  [static]

Gets called by the MOST driver when a new MOST device was discovered.

Parameters:
most_dev the most_dev that was discovered
Returns:
0 on success, an error code on failure

Definition at line 590 of file most-netservice.c.

References most_nets_dev::buffer, most_nets_dev::cdev, MAX_OPEN_PROCESSES, most_nets_dev::most_dev, MOST_DEV_CARDNUMBER, MOST_DEV_MAJOR, MOST_DEVICE_NUMBER, most_nets_devices, most_nets_file_operations, MOST_NETS_MINOR_OFFSET, most_nets_dev::open_count, PR, pr_nets_debug, return_value_if_fails_dbg, and most_nets_dev::task.

int nets_remove ( struct most_dev dev  ) 

Gets called by the MOST Base driver when a MOST device was removed.

Parameters:
dev the most_pci_device that was discovered
Returns:
0 on success, an error code on failure

Definition at line 646 of file most-netservice.c.

References most_nets_dev::cdev, MOST_DEV_CARDNUMBER, most_nets_devices, PR, and pr_nets_debug.

static void nrtsig_handler ( rtnrt_nrtsig_t  nrt_sig  )  [inline, static]

Handles the NRT part of the interrupt handling if compiled with RT_RTDM. It simply schedules the tasklet. This must be done from Linux context because RTAI could interrupt the Linux kernel at any time.

Parameters:
nrt_sig the signal handle

Definition at line 670 of file most-netservice.c.

Referenced by most_nets_init(), and nets_int_handler().

static void nets_int_handler ( struct most_dev dev,
unsigned int  intstatus 
) [static]

Called on every interrupt. This function needs to make sure that the corresponding processes gets notified on the interrupt. To do this, it sets a bit in the module-global variable cards_to_send_interrupt and schedules a tasklet which then sends the signal. This guarantees short durations of the interrupt service routine.

Parameters:
dev the device that fired the interrupt
intstatus the interrupt status register

Definition at line 685 of file most-netservice.c.

References assert, cards_to_send_interrupt, IEMINT, most_nets_dev::intstatus, MOST_DEV_CARDNUMBER, most_intset, most_nets_devices, nrtsig_handler(), and rtnrt_nrtsig_action.

static int __init most_nets_init ( void   )  [static]

This function gets called if the kernel loads this module.

Returns:
0 on success, an error code on failure

Definition at line 727 of file most-netservice.c.

References DRIVER_NAME, most_netservice_high_driver, most_register_high_driver(), nrtsig_handler(), rtnrt_info, rtnrt_nrtsig_init, and version.

static void __exit most_nets_exit ( void   )  [static]

This function gets called if the Kernel removes this module.

Definition at line 746 of file most-netservice.c.

References DRIVER_NAME, most_deregister_high_driver(), most_netservice_high_driver, rtnrt_info, rtnrt_nrtsig_destroy, and version.


Variable Documentation

char* version = "$Rev: 641 $" [static]

Variable that holds the driver version.

Definition at line 61 of file most-netservice.c.

struct most_nets_dev* most_nets_devices[MOST_DEVICE_NUMBER]

Array for each device.

Definition at line 86 of file most-netservice.c.

Referenced by nets_int_handler(), nets_probe(), nets_remove(), and process_sigsend_handler().

struct file_operations most_nets_file_operations [static]

Initial value:

 {
    .owner   = THIS_MODULE,
    .open    = most_nets_open,
    .ioctl   = most_nets_ioctl,
    .release = most_nets_release
}
Create a set of file operations for our new device.

Definition at line 92 of file most-netservice.c.

Referenced by nets_probe().

unsigned long cards_to_send_interrupt = 0 [static]

A bitmask of tasks which should be sent an interrupt. The interrupt service routine just sets a bit in this mask and schedules the corresponding tasklet. The tasklet then sends the interrupt.

Definition at line 104 of file most-netservice.c.

Referenced by nets_int_handler(), and process_sigsend_handler().

struct most_high_driver most_netservice_high_driver [static]

Initial value:

 {
    .name               = "most-netservice",
    .sema_list          = LIST_HEAD_INIT(most_netservice_high_driver.sema_list),
    .spin_list          = LIST_HEAD_INIT(most_netservice_high_driver.spin_list),
    .probe              = nets_probe,
    .remove             = nets_remove,
    .int_handler        = nets_int_handler,
    .interrupt_mask     = (IEMAINT | IEMINT)
}
The structure for the MOST High driver that is registered by the MOST PCI driver

Definition at line 711 of file most-netservice.c.

Referenced by most_nets_exit(), and most_nets_init().


Generated on Fri Mar 9 14:48:58 2007 for MOST Linux Drivers (Linux and RTAI) by  doxygen 1.5.0