2005-04-16 15:20:36 -07:00
/*
* Copyright ( c ) 1997 - 2000 LAN Media Corporation ( LMC )
* All rights reserved . www . lanmedia . com
*
* This code is written by :
* Andrew Stanley - Jones ( asj @ cban . com )
* Rob Braun ( bbraun @ vix . com ) ,
* Michael Graff ( explorer @ vix . com ) and
* Matt Thomas ( matt @ 3 am - software . com ) .
*
* With Help By :
* David Boggs
* Ron Crane
* Allan Cox
*
* This software may be used and distributed according to the terms
* of the GNU General Public License version 2 , incorporated herein by reference .
*
* Driver for the LanMedia LMC5200 , LMC5245 , LMC1000 , LMC1200 cards .
*/
# include <linux/kernel.h>
# include <linux/string.h>
# include <linux/timer.h>
# include <linux/ptrace.h>
# include <linux/errno.h>
# include <linux/ioport.h>
# include <linux/interrupt.h>
# include <linux/in.h>
# include <linux/if_arp.h>
# include <linux/netdevice.h>
# include <linux/etherdevice.h>
# include <linux/skbuff.h>
# include <linux/inet.h>
# include <linux/workqueue.h>
# include <linux/proc_fs.h>
# include <linux/bitops.h>
# include <asm/processor.h> /* Processor type for cache alignment. */
# include <asm/io.h>
# include <asm/dma.h>
# include <linux/smp.h>
# include "lmc.h"
# include "lmc_var.h"
# include "lmc_debug.h"
# include "lmc_ioctl.h"
# include "lmc_proto.h"
// attach
void lmc_proto_attach ( lmc_softc_t * sc ) /*FOLD00*/
{
lmc_trace ( sc - > lmc_device , " lmc_proto_attach in " ) ;
2009-01-08 22:52:11 +01:00
if ( sc - > if_type = = LMC_NET ) {
2005-04-16 15:20:36 -07:00
struct net_device * dev = sc - > lmc_device ;
/*
2008-07-02 20:46:21 +02:00
* They set a few basics because they don ' t use HDLC
2005-04-16 15:20:36 -07:00
*/
dev - > flags | = IFF_POINTOPOINT ;
dev - > hard_header_len = 0 ;
dev - > addr_len = 0 ;
}
lmc_trace ( sc - > lmc_device , " lmc_proto_attach out " ) ;
}
2008-07-02 20:46:21 +02:00
int lmc_proto_ioctl ( lmc_softc_t * sc , struct ifreq * ifr , int cmd )
2005-04-16 15:20:36 -07:00
{
2008-07-02 20:46:21 +02:00
lmc_trace ( sc - > lmc_device , " lmc_proto_ioctl " ) ;
if ( sc - > if_type = = LMC_PPP )
return hdlc_ioctl ( sc - > lmc_device , ifr , cmd ) ;
return - EOPNOTSUPP ;
2005-04-16 15:20:36 -07:00
}
2008-07-02 20:46:21 +02:00
int lmc_proto_open ( lmc_softc_t * sc )
2005-04-16 15:20:36 -07:00
{
2008-07-02 20:46:21 +02:00
int ret = 0 ;
2005-04-16 15:20:36 -07:00
2008-07-02 20:46:21 +02:00
lmc_trace ( sc - > lmc_device , " lmc_proto_open in " ) ;
2005-04-16 15:20:36 -07:00
2008-07-02 20:46:21 +02:00
if ( sc - > if_type = = LMC_PPP ) {
ret = hdlc_open ( sc - > lmc_device ) ;
if ( ret < 0 )
printk ( KERN_WARNING " %s: HDLC open failed: %d \n " ,
sc - > name , ret ) ;
}
lmc_trace ( sc - > lmc_device , " lmc_proto_open out " ) ;
return ret ;
2005-04-16 15:20:36 -07:00
}
2008-07-02 20:46:21 +02:00
void lmc_proto_close ( lmc_softc_t * sc )
2005-04-16 15:20:36 -07:00
{
2008-07-02 20:46:21 +02:00
lmc_trace ( sc - > lmc_device , " lmc_proto_close in " ) ;
2005-04-16 15:20:36 -07:00
2008-07-02 20:46:21 +02:00
if ( sc - > if_type = = LMC_PPP )
hdlc_close ( sc - > lmc_device ) ;
2005-04-16 15:20:36 -07:00
2008-07-02 20:46:21 +02:00
lmc_trace ( sc - > lmc_device , " lmc_proto_close out " ) ;
2005-04-16 15:20:36 -07:00
}
2007-12-22 17:52:52 +00:00
__be16 lmc_proto_type ( lmc_softc_t * sc , struct sk_buff * skb ) /*FOLD00*/
2005-04-16 15:20:36 -07:00
{
lmc_trace ( sc - > lmc_device , " lmc_proto_type in " ) ;
switch ( sc - > if_type ) {
case LMC_PPP :
2008-07-02 20:46:21 +02:00
return hdlc_type_trans ( skb , sc - > lmc_device ) ;
break ;
2005-04-16 15:20:36 -07:00
case LMC_NET :
return htons ( ETH_P_802_2 ) ;
break ;
case LMC_RAW : /* Packet type for skbuff kind of useless */
return htons ( ETH_P_802_2 ) ;
break ;
default :
printk ( KERN_WARNING " %s: No protocol set for this interface, assuming 802.2 (which is wrong!!) \n " , sc - > name ) ;
return htons ( ETH_P_802_2 ) ;
break ;
}
lmc_trace ( sc - > lmc_device , " lmc_proto_tye out " ) ;
}
void lmc_proto_netif ( lmc_softc_t * sc , struct sk_buff * skb ) /*FOLD00*/
{
lmc_trace ( sc - > lmc_device , " lmc_proto_netif in " ) ;
switch ( sc - > if_type ) {
case LMC_PPP :
case LMC_NET :
default :
netif_rx ( skb ) ;
break ;
case LMC_RAW :
break ;
}
lmc_trace ( sc - > lmc_device , " lmc_proto_netif out " ) ;
}