2 * Comtrol SV11 card driver
4 * This is a slightly odd Z85230 synchronous driver. All you need to
9 * It supports DMA using two DMA channels in SYNC mode. The driver doesn't
10 * use these facilities
12 * The control port is at io+1, the data at io+3 and turning off the DMA
13 * is done by writing 0 to io+4
15 * The hardware does the bus handling to avoid the need for delays between
16 * touching control registers.
18 * Port B isnt wired (why - beats me)
21 #include <linux/module.h>
22 #include <linux/kernel.h>
24 #include <linux/net.h>
25 #include <linux/skbuff.h>
26 #include <linux/netdevice.h>
27 #include <linux/if_arp.h>
28 #include <linux/delay.h>
29 #include <linux/ioport.h>
34 #include <asm/byteorder.h>
35 #include <net/syncppp.h>
42 void *if_ptr
; /* General purpose pointer (used by SPPP) */
43 struct z8530_dev sync
;
44 struct ppp_device netdev
;
48 * Network driver support routines
52 * Frame receive. Simple for our card as we do sync ppp and there
53 * is no funny garbage involved
56 static void hostess_input(struct z8530_channel
*c
, struct sk_buff
*skb
)
58 /* Drop the CRC - it's not a good idea to try and negotiate it ;) */
59 skb_trim(skb
, skb
->len
-2);
60 skb
->protocol
=__constant_htons(ETH_P_WAN_PPP
);
61 skb
->mac
.raw
=skb
->data
;
62 skb
->dev
=c
->netdevice
;
64 * Send it to the PPP layer. We don't have time to process
68 c
->netdevice
->last_rx
= jiffies
;
72 * We've been placed in the UP state
75 static int hostess_open(struct net_device
*d
)
77 struct sv11_device
*sv11
=d
->priv
;
86 err
=z8530_sync_open(d
, &sv11
->sync
.chanA
);
89 err
=z8530_sync_dma_open(d
, &sv11
->sync
.chanA
);
92 err
=z8530_sync_txdma_open(d
, &sv11
->sync
.chanA
);
107 z8530_sync_close(d
, &sv11
->sync
.chanA
);
110 z8530_sync_dma_close(d
, &sv11
->sync
.chanA
);
113 z8530_sync_txdma_close(d
, &sv11
->sync
.chanA
);
118 sv11
->sync
.chanA
.rx_function
=hostess_input
;
124 netif_start_queue(d
);
128 static int hostess_close(struct net_device
*d
)
130 struct sv11_device
*sv11
=d
->priv
;
134 sv11
->sync
.chanA
.rx_function
=z8530_null_rx
;
147 z8530_sync_close(d
, &sv11
->sync
.chanA
);
150 z8530_sync_dma_close(d
, &sv11
->sync
.chanA
);
153 z8530_sync_txdma_close(d
, &sv11
->sync
.chanA
);
159 static int hostess_ioctl(struct net_device
*d
, struct ifreq
*ifr
, int cmd
)
161 /* struct sv11_device *sv11=d->priv;
162 z8530_ioctl(d,&sv11->sync.chanA,ifr,cmd) */
163 return sppp_do_ioctl(d
, ifr
,cmd
);
166 static struct net_device_stats
*hostess_get_stats(struct net_device
*d
)
168 struct sv11_device
*sv11
=d
->priv
;
170 return z8530_get_stats(&sv11
->sync
.chanA
);
176 * Passed PPP frames, fire them downwind.
179 static int hostess_queue_xmit(struct sk_buff
*skb
, struct net_device
*d
)
181 struct sv11_device
*sv11
=d
->priv
;
182 return z8530_queue_xmit(&sv11
->sync
.chanA
, skb
);
185 static int hostess_neigh_setup(struct neighbour
*n
)
187 if (n
->nud_state
== NUD_NONE
) {
188 n
->ops
= &arp_broken_ops
;
189 n
->output
= n
->ops
->output
;
194 static int hostess_neigh_setup_dev(struct net_device
*dev
, struct neigh_parms
*p
)
196 if (p
->tbl
->family
== AF_INET
) {
197 p
->neigh_setup
= hostess_neigh_setup
;
204 static void sv11_setup(struct net_device
*dev
)
206 dev
->open
= hostess_open
;
207 dev
->stop
= hostess_close
;
208 dev
->hard_start_xmit
= hostess_queue_xmit
;
209 dev
->get_stats
= hostess_get_stats
;
210 dev
->do_ioctl
= hostess_ioctl
;
211 dev
->neigh_setup
= hostess_neigh_setup_dev
;
215 * Description block for a Comtrol Hostess SV11 card
218 static struct sv11_device
*sv11_init(int iobase
, int irq
)
220 struct z8530_dev
*dev
;
221 struct sv11_device
*sv
;
224 * Get the needed I/O space
227 if(!request_region(iobase
, 8, "Comtrol SV11"))
229 printk(KERN_WARNING
"hostess: I/O 0x%X already in use.\n", iobase
);
233 sv
=(struct sv11_device
*)kmalloc(sizeof(struct sv11_device
), GFP_KERNEL
);
237 memset(sv
, 0, sizeof(*sv
));
238 sv
->if_ptr
=&sv
->netdev
;
240 sv
->netdev
.dev
= alloc_netdev(0, "hdlc%d", sv11_setup
);
244 SET_MODULE_OWNER(sv
->netdev
.dev
);
249 * Stuff in the I/O addressing
254 dev
->chanA
.ctrlio
=iobase
+1;
255 dev
->chanA
.dataio
=iobase
+3;
256 dev
->chanB
.ctrlio
=-1;
257 dev
->chanB
.dataio
=-1;
258 dev
->chanA
.irqs
=&z8530_nop
;
259 dev
->chanB
.irqs
=&z8530_nop
;
261 outb(0, iobase
+4); /* DMA off */
263 /* We want a fast IRQ for this device. Actually we'd like an even faster
264 IRQ ;) - This is one driver RtLinux is made for */
266 if(request_irq(irq
, &z8530_interrupt
, SA_INTERRUPT
, "Hostess SV11", dev
)<0)
268 printk(KERN_WARNING
"hostess: IRQ %d already in use.\n", irq
);
273 dev
->chanA
.private=sv
;
274 dev
->chanA
.netdevice
=sv
->netdev
.dev
;
281 * You can have DMA off or 1 and 3 thats the lot
286 outb(0x03|0x08, iobase
+4); /* DMA on */
287 if(request_dma(dev
->chanA
.txdma
, "Hostess SV/11 (TX)")!=0)
292 if(request_dma(dev
->chanA
.rxdma
, "Hostess SV/11 (RX)")!=0)
297 /* Kill our private IRQ line the hostess can end up chattering
298 until the configuration is set */
302 * Begin normal initialise
305 if(z8530_init(dev
)!=0)
307 printk(KERN_ERR
"Z8530 series device not found.\n");
311 z8530_channel_load(&dev
->chanB
, z8530_dead_port
);
312 if(dev
->type
==Z85C30
)
313 z8530_channel_load(&dev
->chanA
, z8530_hdlc_kilostream
);
315 z8530_channel_load(&dev
->chanA
, z8530_hdlc_kilostream_85230
);
321 * Now we can take the IRQ
323 if(dev_alloc_name(dev
->chanA
.netdevice
,"hdlc%d")>=0)
325 struct net_device
*d
=dev
->chanA
.netdevice
;
328 * Initialise the PPP components
330 sppp_attach(&sv
->netdev
);
336 d
->base_addr
= iobase
;
340 if(register_netdev(d
))
342 printk(KERN_ERR
"%s: unable to register device.\n",
348 z8530_describe(dev
, "I/O", iobase
);
354 free_dma(dev
->chanA
.rxdma
);
357 free_dma(dev
->chanA
.txdma
);
361 free_netdev(sv
->netdev
.dev
);
365 release_region(iobase
,8);
369 static void sv11_shutdown(struct sv11_device
*dev
)
371 sppp_detach(dev
->netdev
.dev
);
372 unregister_netdev(dev
->netdev
.dev
);
373 z8530_shutdown(&dev
->sync
);
374 free_irq(dev
->sync
.irq
, dev
);
378 free_dma(dev
->sync
.chanA
.rxdma
);
379 free_dma(dev
->sync
.chanA
.txdma
);
381 release_region(dev
->sync
.chanA
.ctrlio
-1, 8);
382 free_netdev(dev
->netdev
.dev
);
391 module_param(io
, int, 0);
392 MODULE_PARM_DESC(io
, "The I/O base of the Comtrol Hostess SV11 card");
393 module_param(dma
, int, 0);
394 MODULE_PARM_DESC(dma
, "Set this to 1 to use DMA1/DMA3 for TX/RX");
395 module_param(irq
, int, 0);
396 MODULE_PARM_DESC(irq
, "The interrupt line setting for the Comtrol Hostess SV11 card");
398 MODULE_AUTHOR("Alan Cox");
399 MODULE_LICENSE("GPL");
400 MODULE_DESCRIPTION("Modular driver for the Comtrol Hostess SV11");
402 static struct sv11_device
*sv11_unit
;
404 int init_module(void)
406 printk(KERN_INFO
"SV-11 Z85230 Synchronous Driver v 0.03.\n");
407 printk(KERN_INFO
"(c) Copyright 2001, Red Hat Inc.\n");
408 if((sv11_unit
=sv11_init(io
,irq
))==NULL
)
413 void cleanup_module(void)
416 sv11_shutdown(sv11_unit
);