Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[platform/kernel/linux-starfive.git] / drivers / net / wan / sdla.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * SDLA         An implementation of a driver for the Sangoma S502/S508 series
4  *              multi-protocol PC interface card.  Initial offering is with 
5  *              the DLCI driver, providing Frame Relay support for linux.
6  *
7  *              Global definitions for the Frame relay interface.
8  *
9  * Version:     @(#)sdla.c   0.30       12 Sep 1996
10  *
11  * Credits:     Sangoma Technologies, for the use of 2 cards for an extended
12  *                      period of time.
13  *              David Mandelstam <dm@sangoma.com> for getting me started on 
14  *                      this project, and incentive to complete it.
15  *              Gene Kozen <74604.152@compuserve.com> for providing me with
16  *                      important information about the cards.
17  *
18  * Author:      Mike McLagan <mike.mclagan@linux.org>
19  *
20  * Changes:
21  *              0.15    Mike McLagan    Improved error handling, packet dropping
22  *              0.20    Mike McLagan    New transmit/receive flags for config
23  *                                      If in FR mode, don't accept packets from
24  *                                      non DLCI devices.
25  *              0.25    Mike McLagan    Fixed problem with rejecting packets
26  *                                      from non DLCI devices.
27  *              0.30    Mike McLagan    Fixed kernel panic when used with modified
28  *                                      ifconfig
29  */
30
31 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32
33 #include <linux/module.h>
34 #include <linux/kernel.h>
35 #include <linux/types.h>
36 #include <linux/fcntl.h>
37 #include <linux/interrupt.h>
38 #include <linux/ptrace.h>
39 #include <linux/ioport.h>
40 #include <linux/in.h>
41 #include <linux/slab.h>
42 #include <linux/string.h>
43 #include <linux/timer.h>
44 #include <linux/errno.h>
45 #include <linux/init.h>
46 #include <linux/netdevice.h>
47 #include <linux/skbuff.h>
48 #include <linux/if_arp.h>
49 #include <linux/if_frad.h>
50 #include <linux/sdla.h>
51 #include <linux/bitops.h>
52
53 #include <asm/io.h>
54 #include <asm/dma.h>
55 #include <linux/uaccess.h>
56
57 static const char* version = "SDLA driver v0.30, 12 Sep 1996, mike.mclagan@linux.org";
58
59 static unsigned int valid_port[] = { 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390};
60
61 static unsigned int valid_mem[] = {
62                                     0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, 0xAE000, 
63                                     0xB0000, 0xB2000, 0xB4000, 0xB6000, 0xB8000, 0xBA000, 0xBC000, 0xBE000,
64                                     0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, 0xCE000,
65                                     0xD0000, 0xD2000, 0xD4000, 0xD6000, 0xD8000, 0xDA000, 0xDC000, 0xDE000,
66                                     0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, 0xEE000}; 
67
68 static DEFINE_SPINLOCK(sdla_lock);
69
70 /*********************************************************
71  *
72  * these are the core routines that access the card itself 
73  *
74  *********************************************************/
75
76 #define SDLA_WINDOW(dev,addr) outb((((addr) >> 13) & 0x1F), (dev)->base_addr + SDLA_REG_Z80_WINDOW)
77
78 static void __sdla_read(struct net_device *dev, int addr, void *buf, short len)
79 {
80         char          *temp;
81         const void    *base;
82         int           offset, bytes;
83
84         temp = buf;
85         while(len)
86         {       
87                 offset = addr & SDLA_ADDR_MASK;
88                 bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len;
89                 base = (const void *) (dev->mem_start + offset);
90
91                 SDLA_WINDOW(dev, addr);
92                 memcpy(temp, base, bytes);
93
94                 addr += bytes;
95                 temp += bytes;
96                 len  -= bytes;
97         }  
98 }
99
100 static void sdla_read(struct net_device *dev, int addr, void *buf, short len)
101 {
102         unsigned long flags;
103         spin_lock_irqsave(&sdla_lock, flags);
104         __sdla_read(dev, addr, buf, len);
105         spin_unlock_irqrestore(&sdla_lock, flags);
106 }
107
108 static void __sdla_write(struct net_device *dev, int addr, 
109                          const void *buf, short len)
110 {
111         const char    *temp;
112         void          *base;
113         int           offset, bytes;
114
115         temp = buf;
116         while(len)
117         {
118                 offset = addr & SDLA_ADDR_MASK;
119                 bytes = offset + len > SDLA_WINDOW_SIZE ? SDLA_WINDOW_SIZE - offset : len;
120                 base = (void *) (dev->mem_start + offset);
121
122                 SDLA_WINDOW(dev, addr);
123                 memcpy(base, temp, bytes);
124
125                 addr += bytes;
126                 temp += bytes;
127                 len  -= bytes;
128         }
129 }
130
131 static void sdla_write(struct net_device *dev, int addr, 
132                        const void *buf, short len)
133 {
134         unsigned long flags;
135
136         spin_lock_irqsave(&sdla_lock, flags);
137         __sdla_write(dev, addr, buf, len);
138         spin_unlock_irqrestore(&sdla_lock, flags);
139 }
140
141
142 static void sdla_clear(struct net_device *dev)
143 {
144         unsigned long flags;
145         char          *base;
146         int           len, addr, bytes;
147
148         len = 65536;    
149         addr = 0;
150         bytes = SDLA_WINDOW_SIZE;
151         base = (void *) dev->mem_start;
152
153         spin_lock_irqsave(&sdla_lock, flags);
154         while(len)
155         {
156                 SDLA_WINDOW(dev, addr);
157                 memset(base, 0, bytes);
158
159                 addr += bytes;
160                 len  -= bytes;
161         }
162         spin_unlock_irqrestore(&sdla_lock, flags);
163
164 }
165
166 static char sdla_byte(struct net_device *dev, int addr)
167 {
168         unsigned long flags;
169         char          byte, *temp;
170
171         temp = (void *) (dev->mem_start + (addr & SDLA_ADDR_MASK));
172
173         spin_lock_irqsave(&sdla_lock, flags);
174         SDLA_WINDOW(dev, addr);
175         byte = *temp;
176         spin_unlock_irqrestore(&sdla_lock, flags);
177
178         return byte;
179 }
180
181 static void sdla_stop(struct net_device *dev)
182 {
183         struct frad_local *flp;
184
185         flp = netdev_priv(dev);
186         switch(flp->type)
187         {
188                 case SDLA_S502A:
189                         outb(SDLA_S502A_HALT, dev->base_addr + SDLA_REG_CONTROL);
190                         flp->state = SDLA_HALT;
191                         break;
192                 case SDLA_S502E:
193                         outb(SDLA_HALT, dev->base_addr + SDLA_REG_Z80_CONTROL);
194                         outb(SDLA_S502E_ENABLE, dev->base_addr + SDLA_REG_CONTROL);
195                         flp->state = SDLA_S502E_ENABLE;
196                         break;
197                 case SDLA_S507:
198                         flp->state &= ~SDLA_CPUEN;
199                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
200                         break;
201                 case SDLA_S508:
202                         flp->state &= ~SDLA_CPUEN;
203                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
204                         break;
205         }
206 }
207
208 static void sdla_start(struct net_device *dev)
209 {
210         struct frad_local *flp;
211
212         flp = netdev_priv(dev);
213         switch(flp->type)
214         {
215                 case SDLA_S502A:
216                         outb(SDLA_S502A_NMI, dev->base_addr + SDLA_REG_CONTROL);
217                         outb(SDLA_S502A_START, dev->base_addr + SDLA_REG_CONTROL);
218                         flp->state = SDLA_S502A_START;
219                         break;
220                 case SDLA_S502E:
221                         outb(SDLA_S502E_CPUEN, dev->base_addr + SDLA_REG_Z80_CONTROL);
222                         outb(0x00, dev->base_addr + SDLA_REG_CONTROL);
223                         flp->state = 0;
224                         break;
225                 case SDLA_S507:
226                         flp->state |= SDLA_CPUEN;
227                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
228                         break;
229                 case SDLA_S508:
230                         flp->state |= SDLA_CPUEN;
231                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
232                         break;
233         }
234 }
235
236 /****************************************************
237  *
238  * this is used for the S502A/E cards to determine
239  * the speed of the onboard CPU.  Calibration is
240  * necessary for the Frame Relay code uploaded 
241  * later.  Incorrect results cause timing problems
242  * with link checks & status messages
243  *
244  ***************************************************/
245
246 static int sdla_z80_poll(struct net_device *dev, int z80_addr, int jiffs, char resp1, char resp2)
247 {
248         unsigned long start, done, now;
249         char          resp, *temp;
250
251         start = now = jiffies;
252         done = jiffies + jiffs;
253
254         temp = (void *)dev->mem_start;
255         temp += z80_addr & SDLA_ADDR_MASK;
256         
257         resp = ~resp1;
258         while (time_before(jiffies, done) && (resp != resp1) && (!resp2 || (resp != resp2)))
259         {
260                 if (jiffies != now)
261                 {
262                         SDLA_WINDOW(dev, z80_addr);
263                         now = jiffies;
264                         resp = *temp;
265                 }
266         }
267         return time_before(jiffies, done) ? jiffies - start : -1;
268 }
269
270 /* constants for Z80 CPU speed */
271 #define Z80_READY               '1'     /* Z80 is ready to begin */
272 #define LOADER_READY            '2'     /* driver is ready to begin */
273 #define Z80_SCC_OK              '3'     /* SCC is on board */
274 #define Z80_SCC_BAD             '4'     /* SCC was not found */
275
276 static int sdla_cpuspeed(struct net_device *dev, struct ifreq *ifr)
277 {
278         int  jiffs;
279         char data;
280
281         sdla_start(dev);
282         if (sdla_z80_poll(dev, 0, 3*HZ, Z80_READY, 0) < 0)
283                 return -EIO;
284
285         data = LOADER_READY;
286         sdla_write(dev, 0, &data, 1);
287
288         if ((jiffs = sdla_z80_poll(dev, 0, 8*HZ, Z80_SCC_OK, Z80_SCC_BAD)) < 0)
289                 return -EIO;
290
291         sdla_stop(dev);
292         sdla_read(dev, 0, &data, 1);
293
294         if (data == Z80_SCC_BAD)
295         {
296                 printk("%s: SCC bad\n", dev->name);
297                 return -EIO;
298         }
299
300         if (data != Z80_SCC_OK)
301                 return -EINVAL;
302
303         if (jiffs < 165)
304                 ifr->ifr_mtu = SDLA_CPU_16M;
305         else if (jiffs < 220)
306                 ifr->ifr_mtu = SDLA_CPU_10M;
307         else if (jiffs < 258)
308                 ifr->ifr_mtu = SDLA_CPU_8M;
309         else if (jiffs < 357)
310                 ifr->ifr_mtu = SDLA_CPU_7M;
311         else if (jiffs < 467)
312                 ifr->ifr_mtu = SDLA_CPU_5M;
313         else
314                 ifr->ifr_mtu = SDLA_CPU_3M;
315  
316         return 0;
317 }
318
319 /************************************************
320  *
321  *  Direct interaction with the Frame Relay code 
322  *  starts here.
323  *
324  ************************************************/
325
326 struct _dlci_stat 
327 {
328         short dlci;
329         char  flags;
330 } __packed;
331
332 struct _frad_stat 
333 {
334         char    flags;
335         struct _dlci_stat dlcis[SDLA_MAX_DLCI];
336 };
337
338 static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int len, void *data) 
339 {
340         struct _dlci_stat *pstatus;
341         short             *pdlci;
342         int               i;
343         char              *state, line[30];
344
345         switch (ret)
346         {
347                 case SDLA_RET_MODEM:
348                         state = data;
349                         if (*state & SDLA_MODEM_DCD_LOW)
350                                 netdev_info(dev, "Modem DCD unexpectedly low!\n");
351                         if (*state & SDLA_MODEM_CTS_LOW)
352                                 netdev_info(dev, "Modem CTS unexpectedly low!\n");
353                         /* I should probably do something about this! */
354                         break;
355
356                 case SDLA_RET_CHANNEL_OFF:
357                         netdev_info(dev, "Channel became inoperative!\n");
358                         /* same here */
359                         break;
360
361                 case SDLA_RET_CHANNEL_ON:
362                         netdev_info(dev, "Channel became operative!\n");
363                         /* same here */
364                         break;
365
366                 case SDLA_RET_DLCI_STATUS:
367                         netdev_info(dev, "Status change reported by Access Node\n");
368                         len /= sizeof(struct _dlci_stat);
369                         for(pstatus = data, i=0;i < len;i++,pstatus++)
370                         {
371                                 if (pstatus->flags & SDLA_DLCI_NEW)
372                                         state = "new";
373                                 else if (pstatus->flags & SDLA_DLCI_DELETED)
374                                         state = "deleted";
375                                 else if (pstatus->flags & SDLA_DLCI_ACTIVE)
376                                         state = "active";
377                                 else
378                                 {
379                                         sprintf(line, "unknown status: %02X", pstatus->flags);
380                                         state = line;
381                                 }
382                                 netdev_info(dev, "DLCI %i: %s\n",
383                                             pstatus->dlci, state);
384                                 /* same here */
385                         }
386                         break;
387
388                 case SDLA_RET_DLCI_UNKNOWN:
389                         netdev_info(dev, "Received unknown DLCIs:");
390                         len /= sizeof(short);
391                         for(pdlci = data,i=0;i < len;i++,pdlci++)
392                                 pr_cont(" %i", *pdlci);
393                         pr_cont("\n");
394                         break;
395
396                 case SDLA_RET_TIMEOUT:
397                         netdev_err(dev, "Command timed out!\n");
398                         break;
399
400                 case SDLA_RET_BUF_OVERSIZE:
401                         netdev_info(dev, "Bc/CIR overflow, acceptable size is %i\n",
402                                     len);
403                         break;
404
405                 case SDLA_RET_BUF_TOO_BIG:
406                         netdev_info(dev, "Buffer size over specified max of %i\n",
407                                     len);
408                         break;
409
410                 case SDLA_RET_CHANNEL_INACTIVE:
411                 case SDLA_RET_DLCI_INACTIVE:
412                 case SDLA_RET_CIR_OVERFLOW:
413                 case SDLA_RET_NO_BUFS:
414                         if (cmd == SDLA_INFORMATION_WRITE)
415                                 break;
416
417                 default: 
418                         netdev_dbg(dev, "Cmd 0x%02X generated return code 0x%02X\n",
419                                    cmd, ret);
420                         /* Further processing could be done here */
421                         break;
422         }
423 }
424
425 static int sdla_cmd(struct net_device *dev, int cmd, short dlci, short flags, 
426                         void *inbuf, short inlen, void *outbuf, short *outlen)
427 {
428         static struct _frad_stat status;
429         struct frad_local        *flp;
430         struct sdla_cmd          *cmd_buf;
431         unsigned long            pflags;
432         unsigned long            jiffs;
433         int                      ret, waiting, len;
434         long                     window;
435
436         flp = netdev_priv(dev);
437         window = flp->type == SDLA_S508 ? SDLA_508_CMD_BUF : SDLA_502_CMD_BUF;
438         cmd_buf = (struct sdla_cmd *)(dev->mem_start + (window & SDLA_ADDR_MASK));
439         ret = 0;
440         len = 0;
441         jiffs = jiffies + HZ;  /* 1 second is plenty */
442
443         spin_lock_irqsave(&sdla_lock, pflags);
444         SDLA_WINDOW(dev, window);
445         cmd_buf->cmd = cmd;
446         cmd_buf->dlci = dlci;
447         cmd_buf->flags = flags;
448
449         if (inbuf)
450                 memcpy(cmd_buf->data, inbuf, inlen);
451
452         cmd_buf->length = inlen;
453
454         cmd_buf->opp_flag = 1;
455         spin_unlock_irqrestore(&sdla_lock, pflags);
456
457         waiting = 1;
458         len = 0;
459         while (waiting && time_before_eq(jiffies, jiffs))
460         {
461                 if (waiting++ % 3) 
462                 {
463                         spin_lock_irqsave(&sdla_lock, pflags);
464                         SDLA_WINDOW(dev, window);
465                         waiting = ((volatile int)(cmd_buf->opp_flag));
466                         spin_unlock_irqrestore(&sdla_lock, pflags);
467                 }
468         }
469         
470         if (!waiting)
471         {
472
473                 spin_lock_irqsave(&sdla_lock, pflags);
474                 SDLA_WINDOW(dev, window);
475                 ret = cmd_buf->retval;
476                 len = cmd_buf->length;
477                 if (outbuf && outlen)
478                 {
479                         *outlen = *outlen >= len ? len : *outlen;
480
481                         if (*outlen)
482                                 memcpy(outbuf, cmd_buf->data, *outlen);
483                 }
484
485                 /* This is a local copy that's used for error handling */
486                 if (ret)
487                         memcpy(&status, cmd_buf->data, len > sizeof(status) ? sizeof(status) : len);
488
489                 spin_unlock_irqrestore(&sdla_lock, pflags);
490         }
491         else
492                 ret = SDLA_RET_TIMEOUT;
493
494         if (ret != SDLA_RET_OK)
495                 sdla_errors(dev, cmd, dlci, ret, len, &status);
496
497         return ret;
498 }
499
500 /***********************************************
501  *
502  * these functions are called by the DLCI driver 
503  *
504  ***********************************************/
505
506 static int sdla_reconfig(struct net_device *dev);
507
508 static int sdla_activate(struct net_device *slave, struct net_device *master)
509 {
510         struct frad_local *flp;
511         int i;
512
513         flp = netdev_priv(slave);
514
515         for(i=0;i<CONFIG_DLCI_MAX;i++)
516                 if (flp->master[i] == master)
517                         break;
518
519         if (i == CONFIG_DLCI_MAX)
520                 return -ENODEV;
521
522         flp->dlci[i] = abs(flp->dlci[i]);
523
524         if (netif_running(slave) && (flp->config.station == FRAD_STATION_NODE))
525                 sdla_cmd(slave, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL);
526
527         return 0;
528 }
529
530 static int sdla_deactivate(struct net_device *slave, struct net_device *master)
531 {
532         struct frad_local *flp;
533         int               i;
534
535         flp = netdev_priv(slave);
536
537         for(i=0;i<CONFIG_DLCI_MAX;i++)
538                 if (flp->master[i] == master)
539                         break;
540
541         if (i == CONFIG_DLCI_MAX)
542                 return -ENODEV;
543
544         flp->dlci[i] = -abs(flp->dlci[i]);
545
546         if (netif_running(slave) && (flp->config.station == FRAD_STATION_NODE))
547                 sdla_cmd(slave, SDLA_DEACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL);
548
549         return 0;
550 }
551
552 static int sdla_assoc(struct net_device *slave, struct net_device *master)
553 {
554         struct frad_local *flp;
555         int               i;
556
557         if (master->type != ARPHRD_DLCI)
558                 return -EINVAL;
559
560         flp = netdev_priv(slave);
561
562         for(i=0;i<CONFIG_DLCI_MAX;i++)
563         {
564                 if (!flp->master[i])
565                         break;
566                 if (abs(flp->dlci[i]) == *(short *)(master->dev_addr))
567                         return -EADDRINUSE;
568         } 
569
570         if (i == CONFIG_DLCI_MAX)
571                 return -EMLINK;  /* #### Alan: Comments on this ?? */
572
573
574         flp->master[i] = master;
575         flp->dlci[i] = -*(short *)(master->dev_addr);
576         master->mtu = slave->mtu;
577
578         if (netif_running(slave)) {
579                 if (flp->config.station == FRAD_STATION_CPE)
580                         sdla_reconfig(slave);
581                 else
582                         sdla_cmd(slave, SDLA_ADD_DLCI, 0, 0, master->dev_addr, sizeof(short), NULL, NULL);
583         }
584
585         return 0;
586 }
587
588 static int sdla_deassoc(struct net_device *slave, struct net_device *master)
589 {
590         struct frad_local *flp;
591         int               i;
592
593         flp = netdev_priv(slave);
594
595         for(i=0;i<CONFIG_DLCI_MAX;i++)
596                 if (flp->master[i] == master)
597                         break;
598
599         if (i == CONFIG_DLCI_MAX)
600                 return -ENODEV;
601
602         flp->master[i] = NULL;
603         flp->dlci[i] = 0;
604
605
606         if (netif_running(slave)) {
607                 if (flp->config.station == FRAD_STATION_CPE)
608                         sdla_reconfig(slave);
609                 else
610                         sdla_cmd(slave, SDLA_DELETE_DLCI, 0, 0, master->dev_addr, sizeof(short), NULL, NULL);
611         }
612
613         return 0;
614 }
615
616 static int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get)
617 {
618         struct frad_local *flp;
619         struct dlci_local *dlp;
620         int               i;
621         short             len, ret;
622
623         flp = netdev_priv(slave);
624
625         for(i=0;i<CONFIG_DLCI_MAX;i++)
626                 if (flp->master[i] == master)
627                         break;
628
629         if (i == CONFIG_DLCI_MAX)
630                 return -ENODEV;
631
632         dlp = netdev_priv(master);
633
634         ret = SDLA_RET_OK;
635         len = sizeof(struct dlci_conf);
636         if (netif_running(slave)) {
637                 if (get)
638                         ret = sdla_cmd(slave, SDLA_READ_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0,  
639                                     NULL, 0, &dlp->config, &len);
640                 else
641                         ret = sdla_cmd(slave, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0,  
642                                     &dlp->config, sizeof(struct dlci_conf) - 4 * sizeof(short), NULL, NULL);
643         }
644
645         return ret == SDLA_RET_OK ? 0 : -EIO;
646 }
647
648 /**************************
649  *
650  * now for the Linux driver 
651  *
652  **************************/
653
654 /* NOTE: the DLCI driver deals with freeing the SKB!! */
655 static netdev_tx_t sdla_transmit(struct sk_buff *skb,
656                                  struct net_device *dev)
657 {
658         struct frad_local *flp;
659         int               ret, addr, accept, i;
660         short             size;
661         unsigned long     flags;
662         struct buf_entry  *pbuf;
663
664         flp = netdev_priv(dev);
665         ret = 0;
666         accept = 1;
667
668         netif_stop_queue(dev);
669
670         /*
671          * stupid GateD insists on setting up the multicast router thru us
672          * and we're ill equipped to handle a non Frame Relay packet at this
673          * time!
674          */
675
676         accept = 1;
677         switch (dev->type)
678         {
679                 case ARPHRD_FRAD:
680                         if (skb->dev->type != ARPHRD_DLCI)
681                         {
682                                 netdev_warn(dev, "Non DLCI device, type %i, tried to send on FRAD module\n",
683                                             skb->dev->type);
684                                 accept = 0;
685                         }
686                         break;
687                 default:
688                         netdev_warn(dev, "unknown firmware type 0x%04X\n",
689                                     dev->type);
690                         accept = 0;
691                         break;
692         }
693         if (accept)
694         {
695                 /* this is frame specific, but till there's a PPP module, it's the default */
696                 switch (flp->type)
697                 {
698                         case SDLA_S502A:
699                         case SDLA_S502E:
700                                 ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, skb->data, skb->len, NULL, NULL);
701                                 break;
702                                 case SDLA_S508:
703                                 size = sizeof(addr);
704                                 ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, NULL, skb->len, &addr, &size);
705                                 if (ret == SDLA_RET_OK)
706                                 {
707
708                                         spin_lock_irqsave(&sdla_lock, flags);
709                                         SDLA_WINDOW(dev, addr);
710                                         pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK));
711                                         __sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
712                                         SDLA_WINDOW(dev, addr);
713                                         pbuf->opp_flag = 1;
714                                         spin_unlock_irqrestore(&sdla_lock, flags);
715                                 }
716                                 break;
717                 }
718
719                 switch (ret)
720                 {
721                         case SDLA_RET_OK:
722                                 dev->stats.tx_packets++;
723                                 break;
724
725                         case SDLA_RET_CIR_OVERFLOW:
726                         case SDLA_RET_BUF_OVERSIZE:
727                         case SDLA_RET_NO_BUFS:
728                                 dev->stats.tx_dropped++;
729                                 break;
730
731                         default:
732                                 dev->stats.tx_errors++;
733                                 break;
734                 }
735         }
736         netif_wake_queue(dev);
737         for(i=0;i<CONFIG_DLCI_MAX;i++)
738         {
739                 if(flp->master[i]!=NULL)
740                         netif_wake_queue(flp->master[i]);
741         }               
742
743         dev_kfree_skb(skb);
744         return NETDEV_TX_OK;
745 }
746
747 static void sdla_receive(struct net_device *dev)
748 {
749         struct net_device         *master;
750         struct frad_local *flp;
751         struct dlci_local *dlp;
752         struct sk_buff   *skb;
753
754         struct sdla_cmd *cmd;
755         struct buf_info *pbufi;
756         struct buf_entry  *pbuf;
757
758         unsigned long     flags;
759         int               i=0, received, success, addr, buf_base, buf_top;
760         short             dlci, len, len2, split;
761
762         flp = netdev_priv(dev);
763         success = 1;
764         received = addr = buf_top = buf_base = 0;
765         len = dlci = 0;
766         skb = NULL;
767         master = NULL;
768         cmd = NULL;
769         pbufi = NULL;
770         pbuf = NULL;
771
772         spin_lock_irqsave(&sdla_lock, flags);
773
774         switch (flp->type)
775         {
776                 case SDLA_S502A:
777                 case SDLA_S502E:
778                         cmd = (void *) (dev->mem_start + (SDLA_502_RCV_BUF & SDLA_ADDR_MASK));
779                         SDLA_WINDOW(dev, SDLA_502_RCV_BUF);
780                         success = cmd->opp_flag;
781                         if (!success)
782                                 break;
783
784                         dlci = cmd->dlci;
785                         len = cmd->length;
786                         break;
787
788                 case SDLA_S508:
789                         pbufi = (void *) (dev->mem_start + (SDLA_508_RXBUF_INFO & SDLA_ADDR_MASK));
790                         SDLA_WINDOW(dev, SDLA_508_RXBUF_INFO);
791                         pbuf = (void *) (dev->mem_start + ((pbufi->rse_base + flp->buffer * sizeof(struct buf_entry)) & SDLA_ADDR_MASK));
792                         success = pbuf->opp_flag;
793                         if (!success)
794                                 break;
795
796                         buf_top = pbufi->buf_top;
797                         buf_base = pbufi->buf_base;
798                         dlci = pbuf->dlci;
799                         len = pbuf->length;
800                         addr = pbuf->buf_addr;
801                         break;
802         }
803
804         /* common code, find the DLCI and get the SKB */
805         if (success)
806         {
807                 for (i=0;i<CONFIG_DLCI_MAX;i++)
808                         if (flp->dlci[i] == dlci)
809                                 break;
810
811                 if (i == CONFIG_DLCI_MAX)
812                 {
813                         netdev_notice(dev, "Received packet from invalid DLCI %i, ignoring\n",
814                                       dlci);
815                         dev->stats.rx_errors++;
816                         success = 0;
817                 }
818         }
819
820         if (success)
821         {
822                 master = flp->master[i];
823                 skb = dev_alloc_skb(len + sizeof(struct frhdr));
824                 if (skb == NULL) 
825                 {
826                         netdev_notice(dev, "Memory squeeze, dropping packet\n");
827                         dev->stats.rx_dropped++;
828                         success = 0;
829                 }
830                 else
831                         skb_reserve(skb, sizeof(struct frhdr));
832         }
833
834         /* pick up the data */
835         switch (flp->type)
836         {
837                 case SDLA_S502A:
838                 case SDLA_S502E:
839                         if (success)
840                                 __sdla_read(dev, SDLA_502_RCV_BUF + SDLA_502_DATA_OFS, skb_put(skb,len), len);
841
842                         SDLA_WINDOW(dev, SDLA_502_RCV_BUF);
843                         cmd->opp_flag = 0;
844                         break;
845
846                 case SDLA_S508:
847                         if (success)
848                         {
849                                 /* is this buffer split off the end of the internal ring buffer */
850                                 split = addr + len > buf_top + 1 ? len - (buf_top - addr + 1) : 0;
851                                 len2 = len - split;
852
853                                 __sdla_read(dev, addr, skb_put(skb, len2), len2);
854                                 if (split)
855                                         __sdla_read(dev, buf_base, skb_put(skb, split), split);
856                         }
857
858                         /* increment the buffer we're looking at */
859                         SDLA_WINDOW(dev, SDLA_508_RXBUF_INFO);
860                         flp->buffer = (flp->buffer + 1) % pbufi->rse_num;
861                         pbuf->opp_flag = 0;
862                         break;
863         }
864
865         if (success)
866         {
867                 dev->stats.rx_packets++;
868                 dlp = netdev_priv(master);
869                 (*dlp->receive)(skb, master);
870         }
871
872         spin_unlock_irqrestore(&sdla_lock, flags);
873 }
874
875 static irqreturn_t sdla_isr(int dummy, void *dev_id)
876 {
877         struct net_device     *dev;
878         struct frad_local *flp;
879         char              byte;
880
881         dev = dev_id;
882
883         flp = netdev_priv(dev);
884
885         if (!flp->initialized)
886         {
887                 netdev_warn(dev, "irq %d for uninitialized device\n", dev->irq);
888                 return IRQ_NONE;
889         }
890
891         byte = sdla_byte(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE);
892         switch (byte)
893         {
894                 case SDLA_INTR_RX:
895                         sdla_receive(dev);
896                         break;
897
898                 /* the command will get an error return, which is processed above */
899                 case SDLA_INTR_MODEM:
900                 case SDLA_INTR_STATUS:
901                         sdla_cmd(dev, SDLA_READ_DLC_STATUS, 0, 0, NULL, 0, NULL, NULL);
902                         break;
903
904                 case SDLA_INTR_TX:
905                 case SDLA_INTR_COMPLETE:
906                 case SDLA_INTR_TIMER:
907                         netdev_warn(dev, "invalid irq flag 0x%02X\n", byte);
908                         break;
909         }
910
911         /* the S502E requires a manual acknowledgement of the interrupt */ 
912         if (flp->type == SDLA_S502E)
913         {
914                 flp->state &= ~SDLA_S502E_INTACK;
915                 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
916                 flp->state |= SDLA_S502E_INTACK;
917                 outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
918         }
919
920         /* this clears the byte, informing the Z80 we're done */
921         byte = 0;
922         sdla_write(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte));
923         return IRQ_HANDLED;
924 }
925
926 static void sdla_poll(struct timer_list *t)
927 {
928         struct frad_local *flp = from_timer(flp, t, timer);
929         struct net_device *dev = flp->dev;
930
931         if (sdla_byte(dev, SDLA_502_RCV_BUF))
932                 sdla_receive(dev);
933
934         flp->timer.expires = 1;
935         add_timer(&flp->timer);
936 }
937
938 static int sdla_close(struct net_device *dev)
939 {
940         struct frad_local *flp;
941         struct intr_info  intr;
942         int               len, i;
943         short             dlcis[CONFIG_DLCI_MAX];
944
945         flp = netdev_priv(dev);
946
947         len = 0;
948         for(i=0;i<CONFIG_DLCI_MAX;i++)
949                 if (flp->dlci[i])
950                         dlcis[len++] = abs(flp->dlci[i]);
951         len *= 2;
952
953         if (flp->config.station == FRAD_STATION_NODE)
954         {
955                 for(i=0;i<CONFIG_DLCI_MAX;i++)
956                         if (flp->dlci[i] > 0) 
957                                 sdla_cmd(dev, SDLA_DEACTIVATE_DLCI, 0, 0, dlcis, len, NULL, NULL);
958                 sdla_cmd(dev, SDLA_DELETE_DLCI, 0, 0, &flp->dlci[i], sizeof(flp->dlci[i]), NULL, NULL);
959         }
960
961         memset(&intr, 0, sizeof(intr));
962         /* let's start up the reception */
963         switch(flp->type)
964         {
965                 case SDLA_S502A:
966                         del_timer(&flp->timer); 
967                         break;
968
969                 case SDLA_S502E:
970                         sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(char) + sizeof(short), NULL, NULL);
971                         flp->state &= ~SDLA_S502E_INTACK;
972                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
973                         break;
974
975                 case SDLA_S507:
976                         break;
977
978                 case SDLA_S508:
979                         sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(struct intr_info), NULL, NULL);
980                         flp->state &= ~SDLA_S508_INTEN;
981                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
982                         break;
983         }
984
985         sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
986
987         netif_stop_queue(dev);
988         
989         return 0;
990 }
991
992 struct conf_data {
993         struct frad_conf config;
994         short            dlci[CONFIG_DLCI_MAX];
995 };
996
997 static int sdla_open(struct net_device *dev)
998 {
999         struct frad_local *flp;
1000         struct dlci_local *dlp;
1001         struct conf_data  data;
1002         struct intr_info  intr;
1003         int               len, i;
1004         char              byte;
1005
1006         flp = netdev_priv(dev);
1007
1008         if (!flp->initialized)
1009                 return -EPERM;
1010
1011         if (!flp->configured)
1012                 return -EPERM;
1013
1014         /* time to send in the configuration */
1015         len = 0;
1016         for(i=0;i<CONFIG_DLCI_MAX;i++)
1017                 if (flp->dlci[i])
1018                         data.dlci[len++] = abs(flp->dlci[i]);
1019         len *= 2;
1020
1021         memcpy(&data.config, &flp->config, sizeof(struct frad_conf));
1022         len += sizeof(struct frad_conf);
1023
1024         sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
1025         sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, 0, 0, &data, len, NULL, NULL);
1026
1027         if (flp->type == SDLA_S508)
1028                 flp->buffer = 0;
1029
1030         sdla_cmd(dev, SDLA_ENABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
1031
1032         /* let's start up the reception */
1033         memset(&intr, 0, sizeof(intr));
1034         switch(flp->type)
1035         {
1036                 case SDLA_S502A:
1037                         flp->timer.expires = 1;
1038                         add_timer(&flp->timer);
1039                         break;
1040
1041                 case SDLA_S502E:
1042                         flp->state |= SDLA_S502E_ENABLE;
1043                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
1044                         flp->state |= SDLA_S502E_INTACK;
1045                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
1046                         byte = 0;
1047                         sdla_write(dev, SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte));
1048                         intr.flags = SDLA_INTR_RX | SDLA_INTR_STATUS | SDLA_INTR_MODEM;
1049                         sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(char) + sizeof(short), NULL, NULL);
1050                         break;
1051
1052                 case SDLA_S507:
1053                         break;
1054
1055                 case SDLA_S508:
1056                         flp->state |= SDLA_S508_INTEN;
1057                         outb(flp->state, dev->base_addr + SDLA_REG_CONTROL);
1058                         byte = 0;
1059                         sdla_write(dev, SDLA_508_IRQ_INTERFACE, &byte, sizeof(byte));
1060                         intr.flags = SDLA_INTR_RX | SDLA_INTR_STATUS | SDLA_INTR_MODEM;
1061                         intr.irq = dev->irq;
1062                         sdla_cmd(dev, SDLA_SET_IRQ_TRIGGER, 0, 0, &intr, sizeof(struct intr_info), NULL, NULL);
1063                         break;
1064         }
1065
1066         if (flp->config.station == FRAD_STATION_CPE)
1067         {
1068                 byte = SDLA_ICS_STATUS_ENQ;
1069                 sdla_cmd(dev, SDLA_ISSUE_IN_CHANNEL_SIGNAL, 0, 0, &byte, sizeof(byte), NULL, NULL);
1070         }
1071         else
1072         {
1073                 sdla_cmd(dev, SDLA_ADD_DLCI, 0, 0, data.dlci, len - sizeof(struct frad_conf), NULL, NULL);
1074                 for(i=0;i<CONFIG_DLCI_MAX;i++)
1075                         if (flp->dlci[i] > 0)
1076                                 sdla_cmd(dev, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], 2*sizeof(flp->dlci[i]), NULL, NULL);
1077         }
1078
1079         /* configure any specific DLCI settings */
1080         for(i=0;i<CONFIG_DLCI_MAX;i++)
1081                 if (flp->dlci[i])
1082                 {
1083                         dlp = netdev_priv(flp->master[i]);
1084                         if (dlp->configured)
1085                                 sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0, &dlp->config, sizeof(struct dlci_conf), NULL, NULL);
1086                 }
1087
1088         netif_start_queue(dev);
1089         
1090         return 0;
1091 }
1092
1093 static int sdla_config(struct net_device *dev, struct frad_conf __user *conf, int get)
1094 {
1095         struct frad_local *flp;
1096         struct conf_data  data;
1097         int               i;
1098         short             size;
1099
1100         if (dev->type == 0xFFFF)
1101                 return -EUNATCH;
1102
1103         flp = netdev_priv(dev);
1104
1105         if (!get)
1106         {
1107                 if (netif_running(dev))
1108                         return -EBUSY;
1109
1110                 if(copy_from_user(&data.config, conf, sizeof(struct frad_conf)))
1111                         return -EFAULT;
1112
1113                 if (data.config.station & ~FRAD_STATION_NODE)
1114                         return -EINVAL;
1115
1116                 if (data.config.flags & ~FRAD_VALID_FLAGS)
1117                         return -EINVAL;
1118
1119                 if ((data.config.kbaud < 0) || 
1120                          ((data.config.kbaud > 128) && (flp->type != SDLA_S508)))
1121                         return -EINVAL;
1122
1123                 if (data.config.clocking & ~(FRAD_CLOCK_INT | SDLA_S508_PORT_RS232))
1124                         return -EINVAL;
1125
1126                 if ((data.config.mtu < 0) || (data.config.mtu > SDLA_MAX_MTU))
1127                         return -EINVAL;
1128
1129                 if ((data.config.T391 < 5) || (data.config.T391 > 30))
1130                         return -EINVAL;
1131
1132                 if ((data.config.T392 < 5) || (data.config.T392 > 30))
1133                         return -EINVAL;
1134
1135                 if ((data.config.N391 < 1) || (data.config.N391 > 255))
1136                         return -EINVAL;
1137
1138                 if ((data.config.N392 < 1) || (data.config.N392 > 10))
1139                         return -EINVAL;
1140
1141                 if ((data.config.N393 < 1) || (data.config.N393 > 10))
1142                         return -EINVAL;
1143
1144                 memcpy(&flp->config, &data.config, sizeof(struct frad_conf));
1145                 flp->config.flags |= SDLA_DIRECT_RECV;
1146
1147                 if (flp->type == SDLA_S508)
1148                         flp->config.flags |= SDLA_TX70_RX30;
1149
1150                 if (dev->mtu != flp->config.mtu)
1151                 {
1152                         /* this is required to change the MTU */
1153                         dev->mtu = flp->config.mtu;
1154                         for(i=0;i<CONFIG_DLCI_MAX;i++)
1155                                 if (flp->master[i])
1156                                         flp->master[i]->mtu = flp->config.mtu;
1157                 }
1158
1159                 flp->config.mtu += sizeof(struct frhdr);
1160
1161                 /* off to the races! */
1162                 if (!flp->configured)
1163                         sdla_start(dev);
1164
1165                 flp->configured = 1;
1166         }
1167         else
1168         {
1169                 /* no sense reading if the CPU isn't started */
1170                 if (netif_running(dev))
1171                 {
1172                         size = sizeof(data);
1173                         if (sdla_cmd(dev, SDLA_READ_DLCI_CONFIGURATION, 0, 0, NULL, 0, &data, &size) != SDLA_RET_OK)
1174                                 return -EIO;
1175                 }
1176                 else
1177                         if (flp->configured)
1178                                 memcpy(&data.config, &flp->config, sizeof(struct frad_conf));
1179                         else
1180                                 memset(&data.config, 0, sizeof(struct frad_conf));
1181
1182                 memcpy(&flp->config, &data.config, sizeof(struct frad_conf));
1183                 data.config.flags &= FRAD_VALID_FLAGS;
1184                 data.config.mtu -= data.config.mtu > sizeof(struct frhdr) ? sizeof(struct frhdr) : data.config.mtu;
1185                 return copy_to_user(conf, &data.config, sizeof(struct frad_conf))?-EFAULT:0;
1186         }
1187
1188         return 0;
1189 }
1190
1191 static int sdla_xfer(struct net_device *dev, struct sdla_mem __user *info, int read)
1192 {
1193         struct sdla_mem mem;
1194         char    *temp;
1195
1196         if(copy_from_user(&mem, info, sizeof(mem)))
1197                 return -EFAULT;
1198                 
1199         if (read)
1200         {       
1201                 temp = kzalloc(mem.len, GFP_KERNEL);
1202                 if (!temp)
1203                         return -ENOMEM;
1204                 sdla_read(dev, mem.addr, temp, mem.len);
1205                 if(copy_to_user(mem.data, temp, mem.len))
1206                 {
1207                         kfree(temp);
1208                         return -EFAULT;
1209                 }
1210                 kfree(temp);
1211         }
1212         else
1213         {
1214                 temp = memdup_user(mem.data, mem.len);
1215                 if (IS_ERR(temp))
1216                         return PTR_ERR(temp);
1217                 sdla_write(dev, mem.addr, temp, mem.len);
1218                 kfree(temp);
1219         }
1220         return 0;
1221 }
1222
1223 static int sdla_reconfig(struct net_device *dev)
1224 {
1225         struct frad_local *flp;
1226         struct conf_data  data;
1227         int               i, len;
1228
1229         flp = netdev_priv(dev);
1230
1231         len = 0;
1232         for(i=0;i<CONFIG_DLCI_MAX;i++)
1233                 if (flp->dlci[i])
1234                         data.dlci[len++] = flp->dlci[i];
1235         len *= 2;
1236
1237         memcpy(&data, &flp->config, sizeof(struct frad_conf));
1238         len += sizeof(struct frad_conf);
1239
1240         sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
1241         sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, 0, 0, &data, len, NULL, NULL);
1242         sdla_cmd(dev, SDLA_ENABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
1243
1244         return 0;
1245 }
1246
1247 static int sdla_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
1248 {
1249         struct frad_local *flp;
1250
1251         if(!capable(CAP_NET_ADMIN))
1252                 return -EPERM;
1253                 
1254         flp = netdev_priv(dev);
1255
1256         if (!flp->initialized)
1257                 return -EINVAL;
1258
1259         switch (cmd)
1260         {
1261                 case FRAD_GET_CONF:
1262                 case FRAD_SET_CONF:
1263                         return sdla_config(dev, ifr->ifr_data, cmd == FRAD_GET_CONF);
1264
1265                 case SDLA_IDENTIFY:
1266                         ifr->ifr_flags = flp->type;
1267                         break;
1268
1269                 case SDLA_CPUSPEED:
1270                         return sdla_cpuspeed(dev, ifr);
1271
1272 /* ==========================================================
1273 NOTE:  This is rather a useless action right now, as the
1274        current driver does not support protocols other than
1275        FR.  However, Sangoma has modules for a number of
1276        other protocols in the works.
1277 ============================================================*/
1278                 case SDLA_PROTOCOL:
1279                         if (flp->configured)
1280                                 return -EALREADY;
1281
1282                         switch (ifr->ifr_flags)
1283                         {
1284                                 case ARPHRD_FRAD:
1285                                         dev->type = ifr->ifr_flags;
1286                                         break;
1287                                 default:
1288                                         return -ENOPROTOOPT;
1289                         }
1290                         break;
1291
1292                 case SDLA_CLEARMEM:
1293                         sdla_clear(dev);
1294                         break;
1295
1296                 case SDLA_WRITEMEM:
1297                 case SDLA_READMEM:
1298                         if(!capable(CAP_SYS_RAWIO))
1299                                 return -EPERM;
1300                         return sdla_xfer(dev, ifr->ifr_data, cmd == SDLA_READMEM);
1301
1302                 case SDLA_START:
1303                         sdla_start(dev);
1304                         break;
1305
1306                 case SDLA_STOP:
1307                         sdla_stop(dev);
1308                         break;
1309
1310                 default:
1311                         return -EOPNOTSUPP;
1312         }
1313         return 0;
1314 }
1315
1316 static int sdla_change_mtu(struct net_device *dev, int new_mtu)
1317 {
1318         if (netif_running(dev))
1319                 return -EBUSY;
1320
1321         /* for now, you can't change the MTU! */
1322         return -EOPNOTSUPP;
1323 }
1324
1325 static int sdla_set_config(struct net_device *dev, struct ifmap *map)
1326 {
1327         struct frad_local *flp;
1328         int               i;
1329         char              byte;
1330         unsigned base;
1331         int err = -EINVAL;
1332
1333         flp = netdev_priv(dev);
1334
1335         if (flp->initialized)
1336                 return -EINVAL;
1337
1338         for(i=0; i < ARRAY_SIZE(valid_port); i++)
1339                 if (valid_port[i] == map->base_addr)
1340                         break;   
1341
1342         if (i == ARRAY_SIZE(valid_port))
1343                 return -EINVAL;
1344
1345         if (!request_region(map->base_addr, SDLA_IO_EXTENTS, dev->name)){
1346                 pr_warn("io-port 0x%04lx in use\n", dev->base_addr);
1347                 return -EINVAL;
1348         }
1349         base = map->base_addr;
1350
1351         /* test for card types, S502A, S502E, S507, S508                 */
1352         /* these tests shut down the card completely, so clear the state */
1353         flp->type = SDLA_UNKNOWN;
1354         flp->state = 0;
1355    
1356         for(i=1;i<SDLA_IO_EXTENTS;i++)
1357                 if (inb(base + i) != 0xFF)
1358                         break;
1359
1360         if (i == SDLA_IO_EXTENTS) {   
1361                 outb(SDLA_HALT, base + SDLA_REG_Z80_CONTROL);
1362                 if ((inb(base + SDLA_S502_STS) & 0x0F) == 0x08) {
1363                         outb(SDLA_S502E_INTACK, base + SDLA_REG_CONTROL);
1364                         if ((inb(base + SDLA_S502_STS) & 0x0F) == 0x0C) {
1365                                 outb(SDLA_HALT, base + SDLA_REG_CONTROL);
1366                                 flp->type = SDLA_S502E;
1367                                 goto got_type;
1368                         }
1369                 }
1370         }
1371
1372         for(byte=inb(base),i=0;i<SDLA_IO_EXTENTS;i++)
1373                 if (inb(base + i) != byte)
1374                         break;
1375
1376         if (i == SDLA_IO_EXTENTS) {
1377                 outb(SDLA_HALT, base + SDLA_REG_CONTROL);
1378                 if ((inb(base + SDLA_S502_STS) & 0x7E) == 0x30) {
1379                         outb(SDLA_S507_ENABLE, base + SDLA_REG_CONTROL);
1380                         if ((inb(base + SDLA_S502_STS) & 0x7E) == 0x32) {
1381                                 outb(SDLA_HALT, base + SDLA_REG_CONTROL);
1382                                 flp->type = SDLA_S507;
1383                                 goto got_type;
1384                         }
1385                 }
1386         }
1387
1388         outb(SDLA_HALT, base + SDLA_REG_CONTROL);
1389         if ((inb(base + SDLA_S508_STS) & 0x3F) == 0x00) {
1390                 outb(SDLA_S508_INTEN, base + SDLA_REG_CONTROL);
1391                 if ((inb(base + SDLA_S508_STS) & 0x3F) == 0x10) {
1392                         outb(SDLA_HALT, base + SDLA_REG_CONTROL);
1393                         flp->type = SDLA_S508;
1394                         goto got_type;
1395                 }
1396         }
1397
1398         outb(SDLA_S502A_HALT, base + SDLA_REG_CONTROL);
1399         if (inb(base + SDLA_S502_STS) == 0x40) {
1400                 outb(SDLA_S502A_START, base + SDLA_REG_CONTROL);
1401                 if (inb(base + SDLA_S502_STS) == 0x40) {
1402                         outb(SDLA_S502A_INTEN, base + SDLA_REG_CONTROL);
1403                         if (inb(base + SDLA_S502_STS) == 0x44) {
1404                                 outb(SDLA_S502A_START, base + SDLA_REG_CONTROL);
1405                                 flp->type = SDLA_S502A;
1406                                 goto got_type;
1407                         }
1408                 }
1409         }
1410
1411         netdev_notice(dev, "Unknown card type\n");
1412         err = -ENODEV;
1413         goto fail;
1414
1415 got_type:
1416         switch(base) {
1417                 case 0x270:
1418                 case 0x280:
1419                 case 0x380: 
1420                 case 0x390:
1421                         if (flp->type != SDLA_S508 && flp->type != SDLA_S507)
1422                                 goto fail;
1423         }
1424
1425         switch (map->irq) {
1426                 case 2:
1427                         if (flp->type != SDLA_S502E)
1428                                 goto fail;
1429                         break;
1430
1431                 case 10:
1432                 case 11:
1433                 case 12:
1434                 case 15:
1435                 case 4:
1436                         if (flp->type != SDLA_S508 && flp->type != SDLA_S507)
1437                                 goto fail;
1438                         break;
1439                 case 3:
1440                 case 5:
1441                 case 7:
1442                         if (flp->type == SDLA_S502A)
1443                                 goto fail;
1444                         break;
1445
1446                 default:
1447                         goto fail;
1448         }
1449
1450         err = -EAGAIN;
1451         if (request_irq(dev->irq, sdla_isr, 0, dev->name, dev)) 
1452                 goto fail;
1453
1454         if (flp->type == SDLA_S507) {
1455                 switch(dev->irq) {
1456                         case 3:
1457                                 flp->state = SDLA_S507_IRQ3;
1458                                 break;
1459                         case 4:
1460                                 flp->state = SDLA_S507_IRQ4;
1461                                 break;
1462                         case 5:
1463                                 flp->state = SDLA_S507_IRQ5;
1464                                 break;
1465                         case 7:
1466                                 flp->state = SDLA_S507_IRQ7;
1467                                 break;
1468                         case 10:
1469                                 flp->state = SDLA_S507_IRQ10;
1470                                 break;
1471                         case 11:
1472                                 flp->state = SDLA_S507_IRQ11;
1473                                 break;
1474                         case 12:
1475                                 flp->state = SDLA_S507_IRQ12;
1476                                 break;
1477                         case 15:
1478                                 flp->state = SDLA_S507_IRQ15;
1479                                 break;
1480                 }
1481         }
1482
1483         for(i=0; i < ARRAY_SIZE(valid_mem); i++)
1484                 if (valid_mem[i] == map->mem_start)
1485                         break;   
1486
1487         err = -EINVAL;
1488         if (i == ARRAY_SIZE(valid_mem))
1489                 goto fail2;
1490
1491         if (flp->type == SDLA_S502A && (map->mem_start & 0xF000) >> 12 == 0x0E)
1492                 goto fail2;
1493
1494         if (flp->type != SDLA_S507 && map->mem_start >> 16 == 0x0B)
1495                 goto fail2;
1496
1497         if (flp->type == SDLA_S507 && map->mem_start >> 16 == 0x0D)
1498                 goto fail2;
1499
1500         byte = flp->type != SDLA_S508 ? SDLA_8K_WINDOW : 0;
1501         byte |= (map->mem_start & 0xF000) >> (12 + (flp->type == SDLA_S508 ? 1 : 0));
1502         switch(flp->type) {
1503                 case SDLA_S502A:
1504                 case SDLA_S502E:
1505                         switch (map->mem_start >> 16) {
1506                                 case 0x0A:
1507                                         byte |= SDLA_S502_SEG_A;
1508                                         break;
1509                                 case 0x0C:
1510                                         byte |= SDLA_S502_SEG_C;
1511                                         break;
1512                                 case 0x0D:
1513                                         byte |= SDLA_S502_SEG_D;
1514                                         break;
1515                                 case 0x0E:
1516                                         byte |= SDLA_S502_SEG_E;
1517                                         break;
1518                         }
1519                         break;
1520                 case SDLA_S507:
1521                         switch (map->mem_start >> 16) {
1522                                 case 0x0A:
1523                                         byte |= SDLA_S507_SEG_A;
1524                                         break;
1525                                 case 0x0B:
1526                                         byte |= SDLA_S507_SEG_B;
1527                                         break;
1528                                 case 0x0C:
1529                                         byte |= SDLA_S507_SEG_C;
1530                                         break;
1531                                 case 0x0E:
1532                                         byte |= SDLA_S507_SEG_E;
1533                                         break;
1534                         }
1535                         break;
1536                 case SDLA_S508:
1537                         switch (map->mem_start >> 16) {
1538                                 case 0x0A:
1539                                         byte |= SDLA_S508_SEG_A;
1540                                         break;
1541                                 case 0x0C:
1542                                         byte |= SDLA_S508_SEG_C;
1543                                         break;
1544                                 case 0x0D:
1545                                         byte |= SDLA_S508_SEG_D;
1546                                         break;
1547                                 case 0x0E:
1548                                         byte |= SDLA_S508_SEG_E;
1549                                         break;
1550                         }
1551                         break;
1552         }
1553
1554         /* set the memory bits, and enable access */
1555         outb(byte, base + SDLA_REG_PC_WINDOW);
1556
1557         switch(flp->type)
1558         {
1559                 case SDLA_S502E:
1560                         flp->state = SDLA_S502E_ENABLE;
1561                         break;
1562                 case SDLA_S507:
1563                         flp->state |= SDLA_MEMEN;
1564                         break;
1565                 case SDLA_S508:
1566                         flp->state = SDLA_MEMEN;
1567                         break;
1568         }
1569         outb(flp->state, base + SDLA_REG_CONTROL);
1570
1571         dev->irq = map->irq;
1572         dev->base_addr = base;
1573         dev->mem_start = map->mem_start;
1574         dev->mem_end = dev->mem_start + 0x2000;
1575         flp->initialized = 1;
1576         return 0;
1577
1578 fail2:
1579         free_irq(map->irq, dev);
1580 fail:
1581         release_region(base, SDLA_IO_EXTENTS);
1582         return err;
1583 }
1584  
1585 static const struct net_device_ops sdla_netdev_ops = {
1586         .ndo_open       = sdla_open,
1587         .ndo_stop       = sdla_close,
1588         .ndo_do_ioctl   = sdla_ioctl,
1589         .ndo_set_config = sdla_set_config,
1590         .ndo_start_xmit = sdla_transmit,
1591         .ndo_change_mtu = sdla_change_mtu,
1592 };
1593
1594 static void setup_sdla(struct net_device *dev)
1595 {
1596         struct frad_local *flp = netdev_priv(dev);
1597
1598         netdev_boot_setup_check(dev);
1599
1600         dev->netdev_ops         = &sdla_netdev_ops;
1601         dev->flags              = 0;
1602         dev->type               = 0xFFFF;
1603         dev->hard_header_len    = 0;
1604         dev->addr_len           = 0;
1605         dev->mtu                = SDLA_MAX_MTU;
1606
1607         flp->activate           = sdla_activate;
1608         flp->deactivate         = sdla_deactivate;
1609         flp->assoc              = sdla_assoc;
1610         flp->deassoc            = sdla_deassoc;
1611         flp->dlci_conf          = sdla_dlci_conf;
1612         flp->dev                = dev;
1613
1614         timer_setup(&flp->timer, sdla_poll, 0);
1615         flp->timer.expires      = 1;
1616 }
1617
1618 static struct net_device *sdla;
1619
1620 static int __init init_sdla(void)
1621 {
1622         int err;
1623
1624         printk("%s.\n", version);
1625
1626         sdla = alloc_netdev(sizeof(struct frad_local), "sdla0",
1627                             NET_NAME_UNKNOWN, setup_sdla);
1628         if (!sdla) 
1629                 return -ENOMEM;
1630
1631         err = register_netdev(sdla);
1632         if (err) 
1633                 free_netdev(sdla);
1634
1635         return err;
1636 }
1637
1638 static void __exit exit_sdla(void)
1639 {
1640         struct frad_local *flp = netdev_priv(sdla);
1641
1642         unregister_netdev(sdla);
1643         if (flp->initialized) {
1644                 free_irq(sdla->irq, sdla);
1645                 release_region(sdla->base_addr, SDLA_IO_EXTENTS);
1646         }
1647         del_timer_sync(&flp->timer);
1648         free_netdev(sdla);
1649 }
1650
1651 MODULE_LICENSE("GPL");
1652
1653 module_init(init_sdla);
1654 module_exit(exit_sdla);