diff options
author | Krzysztof Hałasa <khc@pm.waw.pl> | 2008-07-02 11:47:52 -0400 |
---|---|---|
committer | Krzysztof Hałasa <khc@pm.waw.pl> | 2008-07-23 17:05:55 -0400 |
commit | 52e8a6a2d8dc19002d1757870d16051157ce999c (patch) | |
tree | 32e65d1160f279861c3667a031fdd20df456ffdd /drivers/net/wan/hostess_sv11.c | |
parent | aca257530f7d681b953961090ad729c32aa5ad62 (diff) |
WAN: Convert Zilog-based drivers to generic HDLC
Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
Diffstat (limited to 'drivers/net/wan/hostess_sv11.c')
-rw-r--r-- | drivers/net/wan/hostess_sv11.c | 382 |
1 files changed, 154 insertions, 228 deletions
diff --git a/drivers/net/wan/hostess_sv11.c b/drivers/net/wan/hostess_sv11.c index f3065d3473fd..e299313f828a 100644 --- a/drivers/net/wan/hostess_sv11.c +++ b/drivers/net/wan/hostess_sv11.c | |||
@@ -16,6 +16,8 @@ | |||
16 | * touching control registers. | 16 | * touching control registers. |
17 | * | 17 | * |
18 | * Port B isnt wired (why - beats me) | 18 | * Port B isnt wired (why - beats me) |
19 | * | ||
20 | * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl> | ||
19 | */ | 21 | */ |
20 | 22 | ||
21 | #include <linux/module.h> | 23 | #include <linux/module.h> |
@@ -26,6 +28,7 @@ | |||
26 | #include <linux/netdevice.h> | 28 | #include <linux/netdevice.h> |
27 | #include <linux/if_arp.h> | 29 | #include <linux/if_arp.h> |
28 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
31 | #include <linux/hdlc.h> | ||
29 | #include <linux/ioport.h> | 32 | #include <linux/ioport.h> |
30 | #include <net/arp.h> | 33 | #include <net/arp.h> |
31 | 34 | ||
@@ -33,34 +36,31 @@ | |||
33 | #include <asm/io.h> | 36 | #include <asm/io.h> |
34 | #include <asm/dma.h> | 37 | #include <asm/dma.h> |
35 | #include <asm/byteorder.h> | 38 | #include <asm/byteorder.h> |
36 | #include <net/syncppp.h> | ||
37 | #include "z85230.h" | 39 | #include "z85230.h" |
38 | 40 | ||
39 | static int dma; | 41 | static int dma; |
40 | 42 | ||
41 | struct sv11_device | ||
42 | { | ||
43 | void *if_ptr; /* General purpose pointer (used by SPPP) */ | ||
44 | struct z8530_dev sync; | ||
45 | struct ppp_device netdev; | ||
46 | }; | ||
47 | |||
48 | /* | 43 | /* |
49 | * Network driver support routines | 44 | * Network driver support routines |
50 | */ | 45 | */ |
51 | 46 | ||
47 | static inline struct z8530_dev* dev_to_sv(struct net_device *dev) | ||
48 | { | ||
49 | return (struct z8530_dev *)dev_to_hdlc(dev)->priv; | ||
50 | } | ||
51 | |||
52 | /* | 52 | /* |
53 | * Frame receive. Simple for our card as we do sync ppp and there | 53 | * Frame receive. Simple for our card as we do HDLC and there |
54 | * is no funny garbage involved | 54 | * is no funny garbage involved |
55 | */ | 55 | */ |
56 | 56 | ||
57 | static void hostess_input(struct z8530_channel *c, struct sk_buff *skb) | 57 | static void hostess_input(struct z8530_channel *c, struct sk_buff *skb) |
58 | { | 58 | { |
59 | /* Drop the CRC - it's not a good idea to try and negotiate it ;) */ | 59 | /* Drop the CRC - it's not a good idea to try and negotiate it ;) */ |
60 | skb_trim(skb, skb->len-2); | 60 | skb_trim(skb, skb->len - 2); |
61 | skb->protocol=__constant_htons(ETH_P_WAN_PPP); | 61 | skb->protocol = hdlc_type_trans(skb, c->netdevice); |
62 | skb_reset_mac_header(skb); | 62 | skb_reset_mac_header(skb); |
63 | skb->dev=c->netdevice; | 63 | skb->dev = c->netdevice; |
64 | /* | 64 | /* |
65 | * Send it to the PPP layer. We don't have time to process | 65 | * Send it to the PPP layer. We don't have time to process |
66 | * it right now. | 66 | * it right now. |
@@ -68,56 +68,51 @@ static void hostess_input(struct z8530_channel *c, struct sk_buff *skb) | |||
68 | netif_rx(skb); | 68 | netif_rx(skb); |
69 | c->netdevice->last_rx = jiffies; | 69 | c->netdevice->last_rx = jiffies; |
70 | } | 70 | } |
71 | 71 | ||
72 | /* | 72 | /* |
73 | * We've been placed in the UP state | 73 | * We've been placed in the UP state |
74 | */ | 74 | */ |
75 | 75 | ||
76 | static int hostess_open(struct net_device *d) | 76 | static int hostess_open(struct net_device *d) |
77 | { | 77 | { |
78 | struct sv11_device *sv11=d->ml_priv; | 78 | struct z8530_dev *sv11 = dev_to_sv(d); |
79 | int err = -1; | 79 | int err = -1; |
80 | 80 | ||
81 | /* | 81 | /* |
82 | * Link layer up | 82 | * Link layer up |
83 | */ | 83 | */ |
84 | switch(dma) | 84 | switch (dma) { |
85 | { | ||
86 | case 0: | 85 | case 0: |
87 | err=z8530_sync_open(d, &sv11->sync.chanA); | 86 | err = z8530_sync_open(d, &sv11->chanA); |
88 | break; | 87 | break; |
89 | case 1: | 88 | case 1: |
90 | err=z8530_sync_dma_open(d, &sv11->sync.chanA); | 89 | err = z8530_sync_dma_open(d, &sv11->chanA); |
91 | break; | 90 | break; |
92 | case 2: | 91 | case 2: |
93 | err=z8530_sync_txdma_open(d, &sv11->sync.chanA); | 92 | err = z8530_sync_txdma_open(d, &sv11->chanA); |
94 | break; | 93 | break; |
95 | } | 94 | } |
96 | 95 | ||
97 | if(err) | 96 | if (err) |
98 | return err; | 97 | return err; |
99 | /* | 98 | |
100 | * Begin PPP | 99 | err = hdlc_open(d); |
101 | */ | 100 | if (err) { |
102 | err=sppp_open(d); | 101 | switch (dma) { |
103 | if(err) | ||
104 | { | ||
105 | switch(dma) | ||
106 | { | ||
107 | case 0: | 102 | case 0: |
108 | z8530_sync_close(d, &sv11->sync.chanA); | 103 | z8530_sync_close(d, &sv11->chanA); |
109 | break; | 104 | break; |
110 | case 1: | 105 | case 1: |
111 | z8530_sync_dma_close(d, &sv11->sync.chanA); | 106 | z8530_sync_dma_close(d, &sv11->chanA); |
112 | break; | 107 | break; |
113 | case 2: | 108 | case 2: |
114 | z8530_sync_txdma_close(d, &sv11->sync.chanA); | 109 | z8530_sync_txdma_close(d, &sv11->chanA); |
115 | break; | 110 | break; |
116 | } | 111 | } |
117 | return err; | 112 | return err; |
118 | } | 113 | } |
119 | sv11->sync.chanA.rx_function=hostess_input; | 114 | sv11->chanA.rx_function = hostess_input; |
120 | 115 | ||
121 | /* | 116 | /* |
122 | * Go go go | 117 | * Go go go |
123 | */ | 118 | */ |
@@ -128,30 +123,24 @@ static int hostess_open(struct net_device *d) | |||
128 | 123 | ||
129 | static int hostess_close(struct net_device *d) | 124 | static int hostess_close(struct net_device *d) |
130 | { | 125 | { |
131 | struct sv11_device *sv11=d->ml_priv; | 126 | struct z8530_dev *sv11 = dev_to_sv(d); |
132 | /* | 127 | /* |
133 | * Discard new frames | 128 | * Discard new frames |
134 | */ | 129 | */ |
135 | sv11->sync.chanA.rx_function=z8530_null_rx; | 130 | sv11->chanA.rx_function = z8530_null_rx; |
136 | /* | 131 | |
137 | * PPP off | 132 | hdlc_close(d); |
138 | */ | ||
139 | sppp_close(d); | ||
140 | /* | ||
141 | * Link layer down | ||
142 | */ | ||
143 | netif_stop_queue(d); | 133 | netif_stop_queue(d); |
144 | 134 | ||
145 | switch(dma) | 135 | switch (dma) { |
146 | { | ||
147 | case 0: | 136 | case 0: |
148 | z8530_sync_close(d, &sv11->sync.chanA); | 137 | z8530_sync_close(d, &sv11->chanA); |
149 | break; | 138 | break; |
150 | case 1: | 139 | case 1: |
151 | z8530_sync_dma_close(d, &sv11->sync.chanA); | 140 | z8530_sync_dma_close(d, &sv11->chanA); |
152 | break; | 141 | break; |
153 | case 2: | 142 | case 2: |
154 | z8530_sync_txdma_close(d, &sv11->sync.chanA); | 143 | z8530_sync_txdma_close(d, &sv11->chanA); |
155 | break; | 144 | break; |
156 | } | 145 | } |
157 | return 0; | 146 | return 0; |
@@ -159,232 +148,174 @@ static int hostess_close(struct net_device *d) | |||
159 | 148 | ||
160 | static int hostess_ioctl(struct net_device *d, struct ifreq *ifr, int cmd) | 149 | static int hostess_ioctl(struct net_device *d, struct ifreq *ifr, int cmd) |
161 | { | 150 | { |
162 | /* struct sv11_device *sv11=d->ml_priv; | 151 | /* struct z8530_dev *sv11=dev_to_sv(d); |
163 | z8530_ioctl(d,&sv11->sync.chanA,ifr,cmd) */ | 152 | z8530_ioctl(d,&sv11->chanA,ifr,cmd) */ |
164 | return sppp_do_ioctl(d, ifr,cmd); | 153 | return hdlc_ioctl(d, ifr, cmd); |
165 | } | ||
166 | |||
167 | static struct net_device_stats *hostess_get_stats(struct net_device *d) | ||
168 | { | ||
169 | struct sv11_device *sv11=d->ml_priv; | ||
170 | if(sv11) | ||
171 | return z8530_get_stats(&sv11->sync.chanA); | ||
172 | else | ||
173 | return NULL; | ||
174 | } | 154 | } |
175 | 155 | ||
176 | /* | 156 | /* |
177 | * Passed PPP frames, fire them downwind. | 157 | * Passed network frames, fire them downwind. |
178 | */ | 158 | */ |
179 | 159 | ||
180 | static int hostess_queue_xmit(struct sk_buff *skb, struct net_device *d) | 160 | static int hostess_queue_xmit(struct sk_buff *skb, struct net_device *d) |
181 | { | 161 | { |
182 | struct sv11_device *sv11=d->ml_priv; | 162 | return z8530_queue_xmit(&dev_to_sv(d)->chanA, skb); |
183 | return z8530_queue_xmit(&sv11->sync.chanA, skb); | ||
184 | } | 163 | } |
185 | 164 | ||
186 | static int hostess_neigh_setup(struct neighbour *n) | 165 | static int hostess_attach(struct net_device *dev, unsigned short encoding, |
166 | unsigned short parity) | ||
187 | { | 167 | { |
188 | if (n->nud_state == NUD_NONE) { | 168 | if (encoding == ENCODING_NRZ && parity == PARITY_CRC16_PR1_CCITT) |
189 | n->ops = &arp_broken_ops; | 169 | return 0; |
190 | n->output = n->ops->output; | 170 | return -EINVAL; |
191 | } | ||
192 | return 0; | ||
193 | } | ||
194 | |||
195 | static int hostess_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) | ||
196 | { | ||
197 | if (p->tbl->family == AF_INET) { | ||
198 | p->neigh_setup = hostess_neigh_setup; | ||
199 | p->ucast_probes = 0; | ||
200 | p->mcast_probes = 0; | ||
201 | } | ||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | static void sv11_setup(struct net_device *dev) | ||
206 | { | ||
207 | dev->open = hostess_open; | ||
208 | dev->stop = hostess_close; | ||
209 | dev->hard_start_xmit = hostess_queue_xmit; | ||
210 | dev->get_stats = hostess_get_stats; | ||
211 | dev->do_ioctl = hostess_ioctl; | ||
212 | dev->neigh_setup = hostess_neigh_setup_dev; | ||
213 | } | 171 | } |
214 | 172 | ||
215 | /* | 173 | /* |
216 | * Description block for a Comtrol Hostess SV11 card | 174 | * Description block for a Comtrol Hostess SV11 card |
217 | */ | 175 | */ |
218 | 176 | ||
219 | static struct sv11_device *sv11_init(int iobase, int irq) | 177 | static struct z8530_dev *sv11_init(int iobase, int irq) |
220 | { | 178 | { |
221 | struct z8530_dev *dev; | 179 | struct z8530_dev *sv; |
222 | struct sv11_device *sv; | 180 | struct net_device *netdev; |
223 | |||
224 | /* | 181 | /* |
225 | * Get the needed I/O space | 182 | * Get the needed I/O space |
226 | */ | 183 | */ |
227 | 184 | ||
228 | if(!request_region(iobase, 8, "Comtrol SV11")) | 185 | if (!request_region(iobase, 8, "Comtrol SV11")) { |
229 | { | 186 | printk(KERN_WARNING "hostess: I/O 0x%X already in use.\n", |
230 | printk(KERN_WARNING "hostess: I/O 0x%X already in use.\n", iobase); | 187 | iobase); |
231 | return NULL; | 188 | return NULL; |
232 | } | 189 | } |
233 | 190 | ||
234 | sv = kzalloc(sizeof(struct sv11_device), GFP_KERNEL); | 191 | sv = kzalloc(sizeof(struct z8530_dev), GFP_KERNEL); |
235 | if(!sv) | 192 | if (!sv) |
236 | goto fail3; | 193 | goto err_kzalloc; |
237 | 194 | ||
238 | sv->if_ptr=&sv->netdev; | ||
239 | |||
240 | sv->netdev.dev = alloc_netdev(0, "hdlc%d", sv11_setup); | ||
241 | if(!sv->netdev.dev) | ||
242 | goto fail2; | ||
243 | |||
244 | dev=&sv->sync; | ||
245 | |||
246 | /* | 195 | /* |
247 | * Stuff in the I/O addressing | 196 | * Stuff in the I/O addressing |
248 | */ | 197 | */ |
249 | 198 | ||
250 | dev->active = 0; | 199 | sv->active = 0; |
251 | 200 | ||
252 | dev->chanA.ctrlio=iobase+1; | 201 | sv->chanA.ctrlio = iobase + 1; |
253 | dev->chanA.dataio=iobase+3; | 202 | sv->chanA.dataio = iobase + 3; |
254 | dev->chanB.ctrlio=-1; | 203 | sv->chanB.ctrlio = -1; |
255 | dev->chanB.dataio=-1; | 204 | sv->chanB.dataio = -1; |
256 | dev->chanA.irqs=&z8530_nop; | 205 | sv->chanA.irqs = &z8530_nop; |
257 | dev->chanB.irqs=&z8530_nop; | 206 | sv->chanB.irqs = &z8530_nop; |
258 | 207 | ||
259 | outb(0, iobase+4); /* DMA off */ | 208 | outb(0, iobase + 4); /* DMA off */ |
260 | 209 | ||
261 | /* We want a fast IRQ for this device. Actually we'd like an even faster | 210 | /* We want a fast IRQ for this device. Actually we'd like an even faster |
262 | IRQ ;) - This is one driver RtLinux is made for */ | 211 | IRQ ;) - This is one driver RtLinux is made for */ |
263 | 212 | ||
264 | if(request_irq(irq, &z8530_interrupt, IRQF_DISABLED, "Hostess SV11", dev)<0) | 213 | if (request_irq(irq, &z8530_interrupt, IRQF_DISABLED, |
265 | { | 214 | "Hostess SV11", sv) < 0) { |
266 | printk(KERN_WARNING "hostess: IRQ %d already in use.\n", irq); | 215 | printk(KERN_WARNING "hostess: IRQ %d already in use.\n", irq); |
267 | goto fail1; | 216 | goto err_irq; |
268 | } | 217 | } |
269 | 218 | ||
270 | dev->irq=irq; | 219 | sv->irq = irq; |
271 | dev->chanA.private=sv; | 220 | sv->chanA.private = sv; |
272 | dev->chanA.netdevice=sv->netdev.dev; | 221 | sv->chanA.dev = sv; |
273 | dev->chanA.dev=dev; | 222 | sv->chanB.dev = sv; |
274 | dev->chanB.dev=dev; | 223 | |
275 | 224 | if (dma) { | |
276 | if(dma) | ||
277 | { | ||
278 | /* | 225 | /* |
279 | * You can have DMA off or 1 and 3 thats the lot | 226 | * You can have DMA off or 1 and 3 thats the lot |
280 | * on the Comtrol. | 227 | * on the Comtrol. |
281 | */ | 228 | */ |
282 | dev->chanA.txdma=3; | 229 | sv->chanA.txdma = 3; |
283 | dev->chanA.rxdma=1; | 230 | sv->chanA.rxdma = 1; |
284 | outb(0x03|0x08, iobase+4); /* DMA on */ | 231 | outb(0x03 | 0x08, iobase + 4); /* DMA on */ |
285 | if(request_dma(dev->chanA.txdma, "Hostess SV/11 (TX)")!=0) | 232 | if (request_dma(sv->chanA.txdma, "Hostess SV/11 (TX)")) |
286 | goto fail; | 233 | goto err_txdma; |
287 | 234 | ||
288 | if(dma==1) | 235 | if (dma == 1) |
289 | { | 236 | if (request_dma(sv->chanA.rxdma, "Hostess SV/11 (RX)")) |
290 | if(request_dma(dev->chanA.rxdma, "Hostess SV/11 (RX)")!=0) | 237 | goto err_rxdma; |
291 | goto dmafail; | ||
292 | } | ||
293 | } | 238 | } |
294 | 239 | ||
295 | /* Kill our private IRQ line the hostess can end up chattering | 240 | /* Kill our private IRQ line the hostess can end up chattering |
296 | until the configuration is set */ | 241 | until the configuration is set */ |
297 | disable_irq(irq); | 242 | disable_irq(irq); |
298 | 243 | ||
299 | /* | 244 | /* |
300 | * Begin normal initialise | 245 | * Begin normal initialise |
301 | */ | 246 | */ |
302 | 247 | ||
303 | if(z8530_init(dev)!=0) | 248 | if (z8530_init(sv)) { |
304 | { | ||
305 | printk(KERN_ERR "Z8530 series device not found.\n"); | 249 | printk(KERN_ERR "Z8530 series device not found.\n"); |
306 | enable_irq(irq); | 250 | enable_irq(irq); |
307 | goto dmafail2; | 251 | goto free_dma; |
308 | } | 252 | } |
309 | z8530_channel_load(&dev->chanB, z8530_dead_port); | 253 | z8530_channel_load(&sv->chanB, z8530_dead_port); |
310 | if(dev->type==Z85C30) | 254 | if (sv->type == Z85C30) |
311 | z8530_channel_load(&dev->chanA, z8530_hdlc_kilostream); | 255 | z8530_channel_load(&sv->chanA, z8530_hdlc_kilostream); |
312 | else | 256 | else |
313 | z8530_channel_load(&dev->chanA, z8530_hdlc_kilostream_85230); | 257 | z8530_channel_load(&sv->chanA, z8530_hdlc_kilostream_85230); |
314 | 258 | ||
315 | enable_irq(irq); | 259 | enable_irq(irq); |
316 | |||
317 | 260 | ||
318 | /* | 261 | /* |
319 | * Now we can take the IRQ | 262 | * Now we can take the IRQ |
320 | */ | 263 | */ |
321 | if(dev_alloc_name(dev->chanA.netdevice,"hdlc%d")>=0) | ||
322 | { | ||
323 | struct net_device *d=dev->chanA.netdevice; | ||
324 | 264 | ||
325 | /* | 265 | sv->chanA.netdevice = netdev = alloc_hdlcdev(sv); |
326 | * Initialise the PPP components | 266 | if (!netdev) |
327 | */ | 267 | goto free_dma; |
328 | d->ml_priv = sv; | ||
329 | sppp_attach(&sv->netdev); | ||
330 | |||
331 | /* | ||
332 | * Local fields | ||
333 | */ | ||
334 | |||
335 | d->base_addr = iobase; | ||
336 | d->irq = irq; | ||
337 | |||
338 | if(register_netdev(d)) | ||
339 | { | ||
340 | printk(KERN_ERR "%s: unable to register device.\n", | ||
341 | d->name); | ||
342 | sppp_detach(d); | ||
343 | goto dmafail2; | ||
344 | } | ||
345 | 268 | ||
346 | z8530_describe(dev, "I/O", iobase); | 269 | dev_to_hdlc(netdev)->attach = hostess_attach; |
347 | dev->active=1; | 270 | dev_to_hdlc(netdev)->xmit = hostess_queue_xmit; |
348 | return sv; | 271 | netdev->open = hostess_open; |
272 | netdev->stop = hostess_close; | ||
273 | netdev->do_ioctl = hostess_ioctl; | ||
274 | netdev->base_addr = iobase; | ||
275 | netdev->irq = irq; | ||
276 | |||
277 | if (register_hdlc_device(netdev)) { | ||
278 | printk(KERN_ERR "hostess: unable to register HDLC device.\n"); | ||
279 | free_netdev(netdev); | ||
280 | goto free_dma; | ||
349 | } | 281 | } |
350 | dmafail2: | 282 | |
351 | if(dma==1) | 283 | z8530_describe(sv, "I/O", iobase); |
352 | free_dma(dev->chanA.rxdma); | 284 | sv->active = 1; |
353 | dmafail: | 285 | return sv; |
354 | if(dma) | 286 | |
355 | free_dma(dev->chanA.txdma); | 287 | free_dma: |
356 | fail: | 288 | if (dma == 1) |
357 | free_irq(irq, dev); | 289 | free_dma(sv->chanA.rxdma); |
358 | fail1: | 290 | err_rxdma: |
359 | free_netdev(sv->netdev.dev); | 291 | if (dma) |
360 | fail2: | 292 | free_dma(sv->chanA.txdma); |
293 | err_txdma: | ||
294 | free_irq(irq, sv); | ||
295 | err_irq: | ||
361 | kfree(sv); | 296 | kfree(sv); |
362 | fail3: | 297 | err_kzalloc: |
363 | release_region(iobase,8); | 298 | release_region(iobase, 8); |
364 | return NULL; | 299 | return NULL; |
365 | } | 300 | } |
366 | 301 | ||
367 | static void sv11_shutdown(struct sv11_device *dev) | 302 | static void sv11_shutdown(struct z8530_dev *dev) |
368 | { | 303 | { |
369 | sppp_detach(dev->netdev.dev); | 304 | unregister_hdlc_device(dev->chanA.netdevice); |
370 | unregister_netdev(dev->netdev.dev); | 305 | z8530_shutdown(dev); |
371 | z8530_shutdown(&dev->sync); | 306 | free_irq(dev->irq, dev); |
372 | free_irq(dev->sync.irq, dev); | 307 | if (dma) { |
373 | if(dma) | 308 | if (dma == 1) |
374 | { | 309 | free_dma(dev->chanA.rxdma); |
375 | if(dma==1) | 310 | free_dma(dev->chanA.txdma); |
376 | free_dma(dev->sync.chanA.rxdma); | ||
377 | free_dma(dev->sync.chanA.txdma); | ||
378 | } | 311 | } |
379 | release_region(dev->sync.chanA.ctrlio-1, 8); | 312 | release_region(dev->chanA.ctrlio - 1, 8); |
380 | free_netdev(dev->netdev.dev); | 313 | free_netdev(dev->chanA.netdevice); |
381 | kfree(dev); | 314 | kfree(dev); |
382 | } | 315 | } |
383 | 316 | ||
384 | #ifdef MODULE | 317 | static int io = 0x200; |
385 | 318 | static int irq = 9; | |
386 | static int io=0x200; | ||
387 | static int irq=9; | ||
388 | 319 | ||
389 | module_param(io, int, 0); | 320 | module_param(io, int, 0); |
390 | MODULE_PARM_DESC(io, "The I/O base of the Comtrol Hostess SV11 card"); | 321 | MODULE_PARM_DESC(io, "The I/O base of the Comtrol Hostess SV11 card"); |
@@ -397,22 +328,17 @@ MODULE_AUTHOR("Alan Cox"); | |||
397 | MODULE_LICENSE("GPL"); | 328 | MODULE_LICENSE("GPL"); |
398 | MODULE_DESCRIPTION("Modular driver for the Comtrol Hostess SV11"); | 329 | MODULE_DESCRIPTION("Modular driver for the Comtrol Hostess SV11"); |
399 | 330 | ||
400 | static struct sv11_device *sv11_unit; | 331 | static struct z8530_dev *sv11_unit; |
401 | 332 | ||
402 | int init_module(void) | 333 | int init_module(void) |
403 | { | 334 | { |
404 | printk(KERN_INFO "SV-11 Z85230 Synchronous Driver v 0.03.\n"); | 335 | if ((sv11_unit = sv11_init(io, irq)) == NULL) |
405 | printk(KERN_INFO "(c) Copyright 2001, Red Hat Inc.\n"); | ||
406 | if((sv11_unit=sv11_init(io,irq))==NULL) | ||
407 | return -ENODEV; | 336 | return -ENODEV; |
408 | return 0; | 337 | return 0; |
409 | } | 338 | } |
410 | 339 | ||
411 | void cleanup_module(void) | 340 | void cleanup_module(void) |
412 | { | 341 | { |
413 | if(sv11_unit) | 342 | if (sv11_unit) |
414 | sv11_shutdown(sv11_unit); | 343 | sv11_shutdown(sv11_unit); |
415 | } | 344 | } |
416 | |||
417 | #endif | ||
418 | |||