2005-04-16 15:20:36 -07:00
/*
* Linux ARCnet driver - COM20020 chipset support
2015-05-05 10:05:47 -07:00
*
2005-04-16 15:20:36 -07:00
* Written 1997 by David Woodhouse .
* Written 1994 - 1999 by Avery Pennarun .
* Written 1999 by Martin Mares < mj @ ucw . cz > .
* Derived from skeleton . c by Donald Becker .
*
* Special thanks to Contemporary Controls , Inc . ( www . ccontrols . com )
* for sponsoring the further development of this driver .
*
* * * * * * * * * * * * * * * * * * * * * * *
*
* The original copyright of skeleton . c was as follows :
*
* skeleton . c Written 1993 by Donald Becker .
* Copyright 1993 United States Government as represented by the
* Director , National Security Agency . This software may only be used
* and distributed according to the terms of the GNU General Public License as
* modified by SRC , incorporated herein by reference .
*
* * * * * * * * * * * * * * * * * * * * * * *
*
* For more details , see drivers / net / arcnet . c
*
* * * * * * * * * * * * * * * * * * * * * * *
*/
2015-05-05 10:05:56 -07:00
# define pr_fmt(fmt) "arcnet:" KBUILD_MODNAME ": " fmt
2005-04-16 15:20:36 -07:00
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/types.h>
# include <linux/ioport.h>
# include <linux/errno.h>
# include <linux/delay.h>
# include <linux/netdevice.h>
# include <linux/init.h>
2011-06-06 10:43:46 +00:00
# include <linux/interrupt.h>
2015-05-05 10:05:51 -07:00
# include <linux/io.h>
2005-04-16 15:20:36 -07:00
2015-05-05 10:06:03 -07:00
# include "arcdevice.h"
# include "com20020.h"
2015-05-05 10:06:04 -07:00
static const char * const clockrates [ ] = {
" XXXXXXX " , " XXXXXXXX " , " XXXXXX " , " 2.5 Mb/s " ,
" 1.25Mb/s " , " 625 Kb/s " , " 312.5 Kb/s " , " 156.25 Kb/s " ,
" Reserved " , " Reserved " , " Reserved "
2015-05-05 10:05:49 -07:00
} ;
2005-04-16 15:20:36 -07:00
static void com20020_command ( struct net_device * dev , int command ) ;
static int com20020_status ( struct net_device * dev ) ;
static void com20020_setmask ( struct net_device * dev , int mask ) ;
static int com20020_reset ( struct net_device * dev , int really_reset ) ;
static void com20020_copy_to_card ( struct net_device * dev , int bufnum ,
int offset , void * buf , int count ) ;
static void com20020_copy_from_card ( struct net_device * dev , int bufnum ,
int offset , void * buf , int count ) ;
static void com20020_set_mc_list ( struct net_device * dev ) ;
static void com20020_close ( struct net_device * ) ;
static void com20020_copy_from_card ( struct net_device * dev , int bufnum ,
int offset , void * buf , int count )
{
int ioaddr = dev - > base_addr , ofs = 512 * bufnum + offset ;
/* set up the address register */
2015-05-05 10:06:06 -07:00
arcnet_outb ( ( ofs > > 8 ) | RDDATAflag | AUTOINCflag ,
ioaddr , COM20020_REG_W_ADDR_HI ) ;
arcnet_outb ( ofs & 0xff , ioaddr , COM20020_REG_W_ADDR_LO ) ;
2005-04-16 15:20:36 -07:00
/* copy the data */
2015-05-05 10:06:06 -07:00
TIME ( dev , " insb " , count ,
arcnet_insb ( ioaddr , COM20020_REG_RW_MEMDATA , buf , count ) ) ;
2005-04-16 15:20:36 -07:00
}
static void com20020_copy_to_card ( struct net_device * dev , int bufnum ,
int offset , void * buf , int count )
{
int ioaddr = dev - > base_addr , ofs = 512 * bufnum + offset ;
/* set up the address register */
2015-05-05 10:06:06 -07:00
arcnet_outb ( ( ofs > > 8 ) | AUTOINCflag , ioaddr , COM20020_REG_W_ADDR_HI ) ;
arcnet_outb ( ofs & 0xff , ioaddr , COM20020_REG_W_ADDR_LO ) ;
2005-04-16 15:20:36 -07:00
/* copy the data */
2015-05-05 10:06:06 -07:00
TIME ( dev , " outsb " , count ,
arcnet_outsb ( ioaddr , COM20020_REG_RW_MEMDATA , buf , count ) ) ;
2005-04-16 15:20:36 -07:00
}
/* Reset the card and check some basic stuff during the detection stage. */
int com20020_check ( struct net_device * dev )
{
int ioaddr = dev - > base_addr , status ;
2008-11-12 23:37:49 -08:00
struct arcnet_local * lp = netdev_priv ( dev ) ;
2005-04-16 15:20:36 -07:00
2015-04-15 11:43:57 +02:00
arcnet_outb ( XTOcfg ( 3 ) | RESETcfg , ioaddr , COM20020_REG_W_CONFIG ) ;
2015-05-05 10:06:06 -07:00
udelay ( 5 ) ;
2015-04-15 11:43:57 +02:00
arcnet_outb ( XTOcfg ( 3 ) , ioaddr , COM20020_REG_W_CONFIG ) ;
2005-04-16 15:20:36 -07:00
mdelay ( RESETtime ) ;
lp - > setup = lp - > clockm ? 0 : ( lp - > clockp < < 1 ) ;
lp - > setup2 = ( lp - > clockm < < 4 ) | 8 ;
/* CHECK: should we do this for SOHARD cards ? */
/* Enable P1Mode for backplane mode */
lp - > setup = lp - > setup | P1MODE ;
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_SETUP1 ) ;
arcnet_outb ( lp - > setup , ioaddr , COM20020_REG_W_XREG ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:05:49 -07:00
if ( lp - > clockm ! = 0 ) {
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_SETUP2 ) ;
arcnet_outb ( lp - > setup2 , ioaddr , COM20020_REG_W_XREG ) ;
2015-05-05 10:05:47 -07:00
2005-04-16 15:20:36 -07:00
/* must now write the magic "restart operation" command */
mdelay ( 1 ) ;
2015-04-15 11:43:57 +02:00
arcnet_outb ( STARTIOcmd , ioaddr , COM20020_REG_W_COMMAND ) ;
2005-04-16 15:20:36 -07:00
}
2015-03-20 15:20:59 +01:00
lp - > config = ( lp - > timeout < < 3 ) | ( lp - > backplane < < 2 ) | SUB_NODE ;
2005-04-16 15:20:36 -07:00
/* set node ID to 0x42 (but transmitter is disabled, so it's okay) */
2015-05-05 10:06:06 -07:00
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
arcnet_outb ( 0x42 , ioaddr , COM20020_REG_W_XREG ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:06:06 -07:00
status = arcnet_inb ( ioaddr , COM20020_REG_R_STATUS ) ;
2005-04-16 15:20:36 -07:00
if ( ( status & 0x99 ) ! = ( NORXflag | TXFREEflag | RESETflag ) ) {
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " status invalid (%Xh). \n " , status ) ;
2005-04-16 15:20:36 -07:00
return - ENODEV ;
}
2015-05-05 10:05:55 -07:00
arc_printk ( D_INIT_REASONS , dev , " status after reset: %X \n " , status ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:06:06 -07:00
arcnet_outb ( CFLAGScmd | RESETclear | CONFIGclear ,
ioaddr , COM20020_REG_W_COMMAND ) ;
status = arcnet_inb ( ioaddr , COM20020_REG_R_STATUS ) ;
2015-05-05 10:05:55 -07:00
arc_printk ( D_INIT_REASONS , dev , " status after reset acknowledged: %X \n " ,
status ) ;
2005-04-16 15:20:36 -07:00
/* Read first location of memory */
2015-05-05 10:06:06 -07:00
arcnet_outb ( 0 | RDDATAflag | AUTOINCflag ,
ioaddr , COM20020_REG_W_ADDR_HI ) ;
arcnet_outb ( 0 , ioaddr , COM20020_REG_W_ADDR_LO ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:06:06 -07:00
status = arcnet_inb ( ioaddr , COM20020_REG_RW_MEMDATA ) ;
2015-05-05 10:05:59 -07:00
if ( status ! = TESTvalue ) {
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Signature byte not found (%02Xh != D1h). \n " ,
status ) ;
2005-04-16 15:20:36 -07:00
return - ENODEV ;
}
return 0 ;
}
2014-09-29 11:55:35 +02:00
static int com20020_set_hwaddr ( struct net_device * dev , void * addr )
{
int ioaddr = dev - > base_addr ;
struct arcnet_local * lp = netdev_priv ( dev ) ;
struct sockaddr * hwaddr = addr ;
memcpy ( dev - > dev_addr , hwaddr - > sa_data , 1 ) ;
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_NODE ) ;
arcnet_outb ( dev - > dev_addr [ 0 ] , ioaddr , COM20020_REG_W_XREG ) ;
2014-09-29 11:55:35 +02:00
return 0 ;
}
2015-03-20 15:20:59 +01:00
static int com20020_netdev_open ( struct net_device * dev )
{
int ioaddr = dev - > base_addr ;
struct arcnet_local * lp = netdev_priv ( dev ) ;
lp - > config | = TXENcfg ;
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
return arcnet_open ( dev ) ;
}
static int com20020_netdev_close ( struct net_device * dev )
{
int ioaddr = dev - > base_addr ;
struct arcnet_local * lp = netdev_priv ( dev ) ;
arcnet_close ( dev ) ;
/* disable transmitter */
lp - > config & = ~ TXENcfg ;
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
return 0 ;
}
2009-01-09 13:01:10 +00:00
const struct net_device_ops com20020_netdev_ops = {
2015-03-20 15:20:59 +01:00
. ndo_open = com20020_netdev_open ,
. ndo_stop = com20020_netdev_close ,
2009-01-09 13:01:10 +00:00
. ndo_start_xmit = arcnet_send_packet ,
. ndo_tx_timeout = arcnet_timeout ,
2014-09-29 11:55:35 +02:00
. ndo_set_mac_address = com20020_set_hwaddr ,
2011-08-16 06:29:01 +00:00
. ndo_set_rx_mode = com20020_set_mc_list ,
2009-01-09 13:01:10 +00:00
} ;
2005-04-16 15:20:36 -07:00
/* Set up the struct net_device associated with this card. Called after
* probing succeeds .
*/
int com20020_found ( struct net_device * dev , int shared )
{
struct arcnet_local * lp ;
int ioaddr = dev - > base_addr ;
/* Initialize the rest of the device structure. */
2008-11-12 23:37:49 -08:00
lp = netdev_priv ( dev ) ;
2005-04-16 15:20:36 -07:00
lp - > hw . owner = THIS_MODULE ;
lp - > hw . command = com20020_command ;
lp - > hw . status = com20020_status ;
lp - > hw . intmask = com20020_setmask ;
lp - > hw . reset = com20020_reset ;
lp - > hw . copy_to_card = com20020_copy_to_card ;
lp - > hw . copy_from_card = com20020_copy_from_card ;
lp - > hw . close = com20020_close ;
2015-05-05 10:06:02 -07:00
/* FIXME: do this some other way! */
2005-04-16 15:20:36 -07:00
if ( ! dev - > dev_addr [ 0 ] )
2015-05-05 10:06:06 -07:00
dev - > dev_addr [ 0 ] = arcnet_inb ( ioaddr , 8 ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_SETUP1 ) ;
arcnet_outb ( lp - > setup , ioaddr , COM20020_REG_W_XREG ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:05:49 -07:00
if ( lp - > card_flags & ARC_CAN_10MBIT ) {
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_SETUP2 ) ;
arcnet_outb ( lp - > setup2 , ioaddr , COM20020_REG_W_XREG ) ;
2015-05-05 10:05:47 -07:00
2005-04-16 15:20:36 -07:00
/* must now write the magic "restart operation" command */
mdelay ( 1 ) ;
2015-04-15 11:43:57 +02:00
arcnet_outb ( STARTIOcmd , ioaddr , COM20020_REG_W_COMMAND ) ;
2005-04-16 15:20:36 -07:00
}
2015-03-20 15:20:59 +01:00
lp - > config = ( lp - > timeout < < 3 ) | ( lp - > backplane < < 2 ) | SUB_NODE ;
2005-04-16 15:20:36 -07:00
/* Default 0x38 + register: Node ID */
2015-05-05 10:06:06 -07:00
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
arcnet_outb ( dev - > dev_addr [ 0 ] , ioaddr , COM20020_REG_W_XREG ) ;
2005-04-16 15:20:36 -07:00
/* reserve the irq */
2009-11-18 23:29:17 -08:00
if ( request_irq ( dev - > irq , arcnet_interrupt , shared ,
2005-04-16 15:20:36 -07:00
" arcnet (COM20020) " , dev ) ) {
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Can't get IRQ %d! \n " , dev - > irq ) ;
2005-04-16 15:20:36 -07:00
return - ENODEV ;
}
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " %s: station %02Xh found at %03lXh, IRQ %d. \n " ,
lp - > card_name , dev - > dev_addr [ 0 ] , dev - > base_addr , dev - > irq ) ;
2005-04-16 15:20:36 -07:00
if ( lp - > backplane )
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Using backplane mode. \n " ) ;
2005-04-16 15:20:36 -07:00
if ( lp - > timeout ! = 3 )
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Using extended timeout value of %d \n " ,
lp - > timeout ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Using CKP %d - data rate %s \n " ,
lp - > setup > > 1 ,
2015-05-05 10:06:04 -07:00
clockrates [ 3 -
( ( lp - > setup2 & 0xF0 ) > > 4 ) +
( ( lp - > setup & 0x0F ) > > 1 ) ] ) ;
/* The clockrates array index looks very fragile.
* It seems like it could have negative indexing .
*/
2005-04-16 15:20:36 -07:00
if ( register_netdev ( dev ) ) {
free_irq ( dev - > irq , dev ) ;
return - EIO ;
}
return 0 ;
}
2015-05-05 10:05:52 -07:00
/* Do a hardware reset on the card, and set up necessary registers.
2015-05-05 10:05:47 -07:00
*
2005-04-16 15:20:36 -07:00
* This should be called as little as possible , because it disrupts the
* token on the network ( causes a RECON ) and requires a significant delay .
*
* However , it does make sure the card is in a defined state .
*/
static int com20020_reset ( struct net_device * dev , int really_reset )
{
2008-11-12 23:37:49 -08:00
struct arcnet_local * lp = netdev_priv ( dev ) ;
2005-04-16 15:20:36 -07:00
u_int ioaddr = dev - > base_addr ;
u_char inbyte ;
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s: dev: %p, lp: %p, dev->name: %s \n " ,
__FILE__ , __LINE__ , __func__ , dev , lp , dev - > name ) ;
arc_printk ( D_INIT , dev , " Resetting %s (status=%02Xh) \n " ,
2015-05-05 10:06:06 -07:00
dev - > name , arcnet_inb ( ioaddr , COM20020_REG_R_STATUS ) ) ;
2005-04-16 15:20:36 -07:00
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " , __FILE__ , __LINE__ , __func__ ) ;
2015-03-20 15:20:59 +01:00
lp - > config | = ( lp - > timeout < < 3 ) | ( lp - > backplane < < 2 ) ;
2005-04-16 15:20:36 -07:00
/* power-up defaults */
2015-05-05 10:06:06 -07:00
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " , __FILE__ , __LINE__ , __func__ ) ;
2005-04-16 15:20:36 -07:00
if ( really_reset ) {
/* reset the card */
2015-04-15 11:43:57 +02:00
arcnet_outb ( lp - > config | RESETcfg , ioaddr , COM20020_REG_W_CONFIG ) ;
2015-05-05 10:06:06 -07:00
udelay ( 5 ) ;
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
2015-05-05 10:06:02 -07:00
mdelay ( RESETtime * 2 ) ;
/* COM20020 seems to be slower sometimes */
2005-04-16 15:20:36 -07:00
}
/* clear flags & end reset */
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " , __FILE__ , __LINE__ , __func__ ) ;
2015-05-05 10:06:06 -07:00
arcnet_outb ( CFLAGScmd | RESETclear | CONFIGclear ,
ioaddr , COM20020_REG_W_COMMAND ) ;
2005-04-16 15:20:36 -07:00
/* verify that the ARCnet signature byte is present */
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " , __FILE__ , __LINE__ , __func__ ) ;
2005-04-16 15:20:36 -07:00
com20020_copy_from_card ( dev , 0 , 0 , & inbyte , 1 ) ;
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " , __FILE__ , __LINE__ , __func__ ) ;
2005-04-16 15:20:36 -07:00
if ( inbyte ! = TESTvalue ) {
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " ,
__FILE__ , __LINE__ , __func__ ) ;
arc_printk ( D_NORMAL , dev , " reset failed: TESTvalue not present. \n " ) ;
2005-04-16 15:20:36 -07:00
return 1 ;
}
/* enable extended (512-byte) packets */
2015-05-05 10:06:06 -07:00
arcnet_outb ( CONFIGcmd | EXTconf , ioaddr , COM20020_REG_W_COMMAND ) ;
2015-05-05 10:05:55 -07:00
arc_printk ( D_DEBUG , dev , " %s: %d: %s \n " , __FILE__ , __LINE__ , __func__ ) ;
2005-04-16 15:20:36 -07:00
/* done! return success. */
return 0 ;
}
static void com20020_setmask ( struct net_device * dev , int mask )
{
u_int ioaddr = dev - > base_addr ;
2015-05-05 10:05:48 -07:00
2015-05-05 10:05:55 -07:00
arc_printk ( D_DURING , dev , " Setting mask to %x at %x \n " , mask , ioaddr ) ;
2015-05-05 10:06:06 -07:00
arcnet_outb ( mask , ioaddr , COM20020_REG_W_INTMASK ) ;
2005-04-16 15:20:36 -07:00
}
static void com20020_command ( struct net_device * dev , int cmd )
{
u_int ioaddr = dev - > base_addr ;
2015-05-05 10:05:48 -07:00
2015-05-05 10:06:06 -07:00
arcnet_outb ( cmd , ioaddr , COM20020_REG_W_COMMAND ) ;
2005-04-16 15:20:36 -07:00
}
static int com20020_status ( struct net_device * dev )
{
u_int ioaddr = dev - > base_addr ;
2015-05-05 10:06:06 -07:00
return arcnet_inb ( ioaddr , COM20020_REG_R_STATUS ) +
( arcnet_inb ( ioaddr , COM20020_REG_R_DIAGSTAT ) < < 8 ) ;
2005-04-16 15:20:36 -07:00
}
static void com20020_close ( struct net_device * dev )
{
2008-11-12 23:37:49 -08:00
struct arcnet_local * lp = netdev_priv ( dev ) ;
2005-04-16 15:20:36 -07:00
int ioaddr = dev - > base_addr ;
/* disable transmitter */
lp - > config & = ~ TXENcfg ;
2015-05-05 10:06:06 -07:00
arcnet_outb ( lp - > config , ioaddr , COM20020_REG_W_CONFIG ) ;
2005-04-16 15:20:36 -07:00
}
/* Set or clear the multicast filter for this adaptor.
* num_addrs = = - 1 Promiscuous mode , receive all packets
* num_addrs = = 0 Normal mode , clear multicast list
* num_addrs > 0 Multicast mode , receive normal and MC packets , and do
* best - effort filtering .
* FIXME - do multicast stuff , not just promiscuous .
*/
static void com20020_set_mc_list ( struct net_device * dev )
{
2008-11-12 23:37:49 -08:00
struct arcnet_local * lp = netdev_priv ( dev ) ;
2005-04-16 15:20:36 -07:00
int ioaddr = dev - > base_addr ;
2015-05-05 10:06:02 -07:00
if ( ( dev - > flags & IFF_PROMISC ) & & ( dev - > flags & IFF_UP ) ) {
/* Enable promiscuous mode */
2005-04-16 15:20:36 -07:00
if ( ! ( lp - > setup & PROMISCset ) )
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Setting promiscuous flag... \n " ) ;
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_SETUP1 ) ;
2005-04-16 15:20:36 -07:00
lp - > setup | = PROMISCset ;
2015-05-05 10:06:06 -07:00
arcnet_outb ( lp - > setup , ioaddr , COM20020_REG_W_XREG ) ;
2015-05-05 10:06:02 -07:00
} else {
2005-04-16 15:20:36 -07:00
/* Disable promiscuous mode, use normal mode */
if ( ( lp - > setup & PROMISCset ) )
2015-05-05 10:05:55 -07:00
arc_printk ( D_NORMAL , dev , " Resetting promiscuous flag... \n " ) ;
2015-05-05 10:06:06 -07:00
com20020_set_subaddress ( lp , ioaddr , SUB_SETUP1 ) ;
2005-04-16 15:20:36 -07:00
lp - > setup & = ~ PROMISCset ;
2015-05-05 10:06:06 -07:00
arcnet_outb ( lp - > setup , ioaddr , COM20020_REG_W_XREG ) ;
2005-04-16 15:20:36 -07:00
}
}
2006-11-08 19:51:03 -08:00
# if defined(CONFIG_ARCNET_COM20020_PCI_MODULE) || \
2007-02-12 00:52:22 -08:00
defined ( CONFIG_ARCNET_COM20020_ISA_MODULE ) | | \
defined ( CONFIG_ARCNET_COM20020_CS_MODULE )
2005-04-16 15:20:36 -07:00
EXPORT_SYMBOL ( com20020_check ) ;
EXPORT_SYMBOL ( com20020_found ) ;
2009-01-25 21:17:25 -08:00
EXPORT_SYMBOL ( com20020_netdev_ops ) ;
2006-11-08 19:51:03 -08:00
# endif
2005-04-16 15:20:36 -07:00
MODULE_LICENSE ( " GPL " ) ;
2006-11-08 19:51:03 -08:00
# ifdef MODULE
2008-02-28 01:31:08 -06:00
static int __init com20020_module_init ( void )
2005-04-16 15:20:36 -07:00
{
2015-05-05 10:05:54 -07:00
if ( BUGLVL ( D_NORMAL ) )
2015-05-05 10:06:02 -07:00
pr_info ( " %s \n " , " COM20020 chipset support (by David Woodhouse et al.) " ) ;
2005-04-16 15:20:36 -07:00
return 0 ;
}
2008-02-28 01:31:08 -06:00
static void __exit com20020_module_exit ( void )
2005-04-16 15:20:36 -07:00
{
}
2008-02-28 01:31:08 -06:00
module_init ( com20020_module_init ) ;
module_exit ( com20020_module_exit ) ;
2005-04-16 15:20:36 -07:00
# endif /* MODULE */