1 /* 2 * Copyright (c) 1997-2000 LAN Media Corporation (LMC) 3 * All rights reserved. www.lanmedia.com 4 * 5 * This code is written by: 6 * Andrew Stanley-Jones (asj@cban.com) 7 * Rob Braun (bbraun@vix.com), 8 * Michael Graff (explorer@vix.com) and 9 * Matt Thomas (matt@3am-software.com). 10 * 11 * With Help By: 12 * David Boggs 13 * Ron Crane 14 * Allan Cox 15 * 16 * This software may be used and distributed according to the terms 17 * of the GNU General Public License version 2, incorporated herein by reference. 18 * 19 * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards. 20 */ 21 22#include <linux/kernel.h> 23#include <linux/string.h> 24#include <linux/timer.h> 25#include <linux/ptrace.h> 26#include <linux/errno.h> 27#include <linux/ioport.h> 28#include <linux/interrupt.h> 29#include <linux/in.h> 30#include <linux/if_arp.h> 31#include <linux/netdevice.h> 32#include <linux/etherdevice.h> 33#include <linux/skbuff.h> 34#include <linux/inet.h> 35#include <linux/workqueue.h> 36#include <linux/proc_fs.h> 37#include <linux/bitops.h> 38#include <asm/processor.h> /* Processor type for cache alignment. */ 39#include <asm/io.h> 40#include <asm/dma.h> 41#include <linux/smp.h> 42 43#include "lmc.h" 44#include "lmc_var.h" 45#include "lmc_debug.h" 46#include "lmc_ioctl.h" 47#include "lmc_proto.h" 48 49// attach 50void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/ 51{ 52 lmc_trace(sc->lmc_device, "lmc_proto_attach in"); 53 if (sc->if_type == LMC_NET) { 54 struct net_device *dev = sc->lmc_device; 55 /* 56 * They set a few basics because they don't use HDLC 57 */ 58 dev->flags |= IFF_POINTOPOINT; 59 dev->hard_header_len = 0; 60 dev->addr_len = 0; 61 } 62 lmc_trace(sc->lmc_device, "lmc_proto_attach out"); 63} 64 65int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd) 66{ 67 lmc_trace(sc->lmc_device, "lmc_proto_ioctl"); 68 if (sc->if_type == LMC_PPP) 69 return hdlc_ioctl(sc->lmc_device, ifr, cmd); 70 return -EOPNOTSUPP; 71} 72 73int lmc_proto_open(lmc_softc_t *sc) 74{ 75 int ret = 0; 76 77 lmc_trace(sc->lmc_device, "lmc_proto_open in"); 78 79 if (sc->if_type == LMC_PPP) { 80 ret = hdlc_open(sc->lmc_device); 81 if (ret < 0) 82 printk(KERN_WARNING "%s: HDLC open failed: %d\n", 83 sc->name, ret); 84 } 85 86 lmc_trace(sc->lmc_device, "lmc_proto_open out"); 87 return ret; 88} 89 90void lmc_proto_close(lmc_softc_t *sc) 91{ 92 lmc_trace(sc->lmc_device, "lmc_proto_close in"); 93 94 if (sc->if_type == LMC_PPP) 95 hdlc_close(sc->lmc_device); 96 97 lmc_trace(sc->lmc_device, "lmc_proto_close out"); 98} 99 100__be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/ 101{ 102 lmc_trace(sc->lmc_device, "lmc_proto_type in"); 103 switch(sc->if_type){ 104 case LMC_PPP: 105 return hdlc_type_trans(skb, sc->lmc_device); 106 break; 107 case LMC_NET: 108 return htons(ETH_P_802_2); 109 break; 110 case LMC_RAW: /* Packet type for skbuff kind of useless */ 111 return htons(ETH_P_802_2); 112 break; 113 default: 114 printk(KERN_WARNING "%s: No protocol set for this interface, assuming 802.2 (which is wrong!!)\n", sc->name); 115 return htons(ETH_P_802_2); 116 break; 117 } 118 lmc_trace(sc->lmc_device, "lmc_proto_tye out"); 119 120} 121 122void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/ 123{ 124 lmc_trace(sc->lmc_device, "lmc_proto_netif in"); 125 switch(sc->if_type){ 126 case LMC_PPP: 127 case LMC_NET: 128 default: 129 netif_rx(skb); 130 break; 131 case LMC_RAW: 132 break; 133 } 134 lmc_trace(sc->lmc_device, "lmc_proto_netif out"); 135} 136