Commit | Line | Data |
---|---|---|
1da177e4 LT |
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> | |
1da177e4 | 28 | #include <linux/interrupt.h> |
1da177e4 LT |
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> | |
1da177e4 LT |
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 | ||
1da177e4 LT |
49 | // attach |
50 | void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/ | |
51 | { | |
52 | lmc_trace(sc->lmc_device, "lmc_proto_attach in"); | |
991990a1 | 53 | if (sc->if_type == LMC_NET) { |
1da177e4 LT |
54 | struct net_device *dev = sc->lmc_device; |
55 | /* | |
64bef763 | 56 | * They set a few basics because they don't use HDLC |
1da177e4 LT |
57 | */ |
58 | dev->flags |= IFF_POINTOPOINT; | |
1da177e4 LT |
59 | dev->hard_header_len = 0; |
60 | dev->addr_len = 0; | |
61 | } | |
1da177e4 LT |
62 | lmc_trace(sc->lmc_device, "lmc_proto_attach out"); |
63 | } | |
64 | ||
64bef763 | 65 | int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd) |
1da177e4 | 66 | { |
64bef763 KH |
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; | |
1da177e4 LT |
71 | } |
72 | ||
64bef763 | 73 | int lmc_proto_open(lmc_softc_t *sc) |
1da177e4 | 74 | { |
64bef763 | 75 | int ret = 0; |
1da177e4 | 76 | |
64bef763 | 77 | lmc_trace(sc->lmc_device, "lmc_proto_open in"); |
1da177e4 | 78 | |
64bef763 KH |
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; | |
1da177e4 LT |
88 | } |
89 | ||
64bef763 | 90 | void lmc_proto_close(lmc_softc_t *sc) |
1da177e4 | 91 | { |
64bef763 | 92 | lmc_trace(sc->lmc_device, "lmc_proto_close in"); |
1da177e4 | 93 | |
64bef763 KH |
94 | if (sc->if_type == LMC_PPP) |
95 | hdlc_close(sc->lmc_device); | |
1da177e4 | 96 | |
64bef763 | 97 | lmc_trace(sc->lmc_device, "lmc_proto_close out"); |
1da177e4 LT |
98 | } |
99 | ||
90458401 | 100 | __be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/ |
1da177e4 LT |
101 | { |
102 | lmc_trace(sc->lmc_device, "lmc_proto_type in"); | |
103 | switch(sc->if_type){ | |
104 | case LMC_PPP: | |
64bef763 KH |
105 | return hdlc_type_trans(skb, sc->lmc_device); |
106 | break; | |
1da177e4 LT |
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 | ||
122 | void 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: | |
1da177e4 LT |
129 | netif_rx(skb); |
130 | break; | |
131 | case LMC_RAW: | |
132 | break; | |
133 | } | |
134 | lmc_trace(sc->lmc_device, "lmc_proto_netif out"); | |
135 | } |