farsync.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:60k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *      FarSync X21 driver for Linux (2.4.x kernel version)
  3.  *
  4.  *      Actually sync driver for X.21, V.35 and V.24 on FarSync T-series cards
  5.  *
  6.  *      Copyright (C) 2001 FarSite Communications Ltd.
  7.  *      www.farsite.co.uk
  8.  *
  9.  *      This program is free software; you can redistribute it and/or
  10.  *      modify it under the terms of the GNU General Public License
  11.  *      as published by the Free Software Foundation; either version
  12.  *      2 of the License, or (at your option) any later version.
  13.  *
  14.  *      Author: R.J.Dunlop      <bob.dunlop@farsite.co.uk>
  15.  */
  16. #include <linux/module.h>
  17. #include <linux/kernel.h>
  18. #include <linux/pci.h>
  19. #include <linux/ioport.h>
  20. #include <linux/netdevice.h>
  21. #include <linux/init.h>
  22. #include <linux/if_arp.h>
  23. #include <asm/uaccess.h>
  24. #include <net/syncppp.h>
  25. #include "farsync.h"
  26. /*
  27.  *      Module info
  28.  */
  29. MODULE_AUTHOR("R.J.Dunlop <bob.dunlop@farsite.co.uk>");
  30. MODULE_DESCRIPTION("FarSync T-Series X21 driver. FarSite Communications Ltd.");
  31. EXPORT_NO_SYMBOLS;
  32. /*      Driver configuration and global parameters
  33.  *      ==========================================
  34.  */
  35. /*      Number of ports (per card) supported
  36.  */
  37. #define FST_MAX_PORTS           4
  38. /*      PCI vendor and device IDs
  39.  */
  40. #define FSC_PCI_VENDOR_ID       0x1619  /* FarSite Communications Ltd */
  41. #define T2P_PCI_DEVICE_ID       0x0400  /* T2P X21 2 port card */
  42. #define T4P_PCI_DEVICE_ID       0x0440  /* T4P X21 4 port card */
  43. /*      Default parameters for the link
  44.  */
  45. #define FST_TX_QUEUE_LEN        100     /* At 8Mbps a longer queue length is
  46.                                          * useful, the syncppp module forces
  47.                                          * this down assuming a slower line I
  48.                                          * guess.
  49.                                          */
  50. #define FST_MAX_MTU             8000    /* Huge but possible */
  51. #define FST_DEF_MTU             1500    /* Common sane value */
  52. #define FST_TX_TIMEOUT          (2*HZ)
  53. #ifdef ARPHRD_RAWHDLC
  54. #define ARPHRD_MYTYPE   ARPHRD_RAWHDLC  /* Raw frames */
  55. #else
  56. #define ARPHRD_MYTYPE   ARPHRD_HDLC     /* Cisco-HDLC (keepalives etc) */
  57. #endif
  58. /*      Card shared memory layout
  59.  *      =========================
  60.  */
  61. #pragma pack(1)
  62. /*      This information is derived in part from the FarSite FarSync Smc.h
  63.  *      file. Unfortunately various name clashes and the non-portability of the
  64.  *      bit field declarations in that file have meant that I have chosen to
  65.  *      recreate the information here.
  66.  *
  67.  *      The SMC (Shared Memory Configuration) has a version number that is
  68.  *      incremented every time there is a significant change. This number can
  69.  *      be used to check that we have not got out of step with the firmware
  70.  *      contained in the .CDE files.
  71.  */
  72. #define SMC_VERSION 11
  73. #define FST_MEMSIZE 0x100000    /* Size of card memory (1Mb) */
  74. #define SMC_BASE 0x00002000L    /* Base offset of the shared memory window main
  75.                                  * configuration structure */
  76. #define BFM_BASE 0x00010000L    /* Base offset of the shared memory window DMA
  77.                                  * buffers */
  78. #define LEN_TX_BUFFER 8192      /* Size of packet buffers */
  79. #define LEN_RX_BUFFER 8192
  80. #define LEN_SMALL_TX_BUFFER 256 /* Size of obsolete buffs used for DOS diags */
  81. #define LEN_SMALL_RX_BUFFER 256
  82. #define NUM_TX_BUFFER 2         /* Must be power of 2. Fixed by firmware */
  83. #define NUM_RX_BUFFER 8
  84. /* Interrupt retry time in milliseconds */
  85. #define INT_RETRY_TIME 2
  86. /*      The Am186CH/CC processors support a SmartDMA mode using circular pools
  87.  *      of buffer descriptors. The structure is almost identical to that used
  88.  *      in the LANCE Ethernet controllers. Details available as PDF from the
  89.  *      AMD web site: http://www.amd.com/products/epd/processors/
  90.  *                    2.16bitcont/3.am186cxfa/a21914/21914.pdf
  91.  */
  92. struct txdesc {                 /* Transmit descriptor */
  93.         volatile u16 ladr;      /* Low order address of packet. This is a
  94.                                  * linear address in the Am186 memory space
  95.                                  */
  96.         volatile u8  hadr;      /* High order address. Low 4 bits only, high 4
  97.                                  * bits must be zero
  98.                                  */
  99.         volatile u8  bits;      /* Status and config */
  100.         volatile u16 bcnt;      /* 2s complement of packet size in low 15 bits.
  101.                                  * Transmit terminal count interrupt enable in
  102.                                  * top bit.
  103.                                  */
  104.                  u16 unused;    /* Not used in Tx */
  105. };
  106. struct rxdesc {                 /* Receive descriptor */
  107.         volatile u16 ladr;      /* Low order address of packet */
  108.         volatile u8  hadr;      /* High order address */
  109.         volatile u8  bits;      /* Status and config */
  110.         volatile u16 bcnt;      /* 2s complement of buffer size in low 15 bits.
  111.                                  * Receive terminal count interrupt enable in
  112.                                  * top bit.
  113.                                  */
  114.         volatile u16 mcnt;      /* Message byte count (15 bits) */
  115. };
  116. /* Convert a length into the 15 bit 2's complement */
  117. /* #define cnv_bcnt(len)   (( ~(len) + 1 ) & 0x7FFF ) */
  118. /* Since we need to set the high bit to enable the completion interrupt this
  119.  * can be made a lot simpler
  120.  */
  121. #define cnv_bcnt(len)   (-(len))
  122. /* Status and config bits for the above */
  123. #define DMA_OWN         0x80            /* SmartDMA owns the descriptor */
  124. #define TX_STP          0x02            /* Tx: start of packet */
  125. #define TX_ENP          0x01            /* Tx: end of packet */
  126. #define RX_ERR          0x40            /* Rx: error (OR of next 4 bits) */
  127. #define RX_FRAM         0x20            /* Rx: framing error */
  128. #define RX_OFLO         0x10            /* Rx: overflow error */
  129. #define RX_CRC          0x08            /* Rx: CRC error */
  130. #define RX_HBUF         0x04            /* Rx: buffer error */
  131. #define RX_STP          0x02            /* Rx: start of packet */
  132. #define RX_ENP          0x01            /* Rx: end of packet */
  133. /* Interrupts from the card are caused by various events and these are presented
  134.  * in a circular buffer as several events may be processed on one physical int
  135.  */
  136. #define MAX_CIRBUFF     32
  137. struct cirbuff {
  138.         u8 rdindex;             /* read, then increment and wrap */
  139.         u8 wrindex;             /* write, then increment and wrap */
  140.         u8 evntbuff[MAX_CIRBUFF];
  141. };
  142. /* Interrupt event codes.
  143.  * Where appropriate the two low order bits indicate the port number
  144.  */
  145. #define CTLA_CHG        0x18    /* Control signal changed */
  146. #define CTLB_CHG        0x19
  147. #define CTLC_CHG        0x1A
  148. #define CTLD_CHG        0x1B
  149. #define INIT_CPLT       0x20    /* Initialisation complete */
  150. #define INIT_FAIL       0x21    /* Initialisation failed */
  151. #define ABTA_SENT       0x24    /* Abort sent */
  152. #define ABTB_SENT       0x25
  153. #define ABTC_SENT       0x26
  154. #define ABTD_SENT       0x27
  155. #define TXA_UNDF        0x28    /* Transmission underflow */
  156. #define TXB_UNDF        0x29
  157. #define TXC_UNDF        0x2A
  158. #define TXD_UNDF        0x2B
  159. /* Port physical configuration. See farsync.h for field values */
  160. struct port_cfg {
  161.         u16  lineInterface;     /* Physical interface type */
  162.         u8   x25op;             /* Unused at present */
  163.         u8   internalClock;     /* 1 => internal clock, 0 => external */
  164.         u32  lineSpeed;         /* Speed in bps */
  165. };
  166. /* Finally sling all the above together into the shared memory structure.
  167.  * Sorry it's a hodge podge of arrays, structures and unused bits, it's been
  168.  * evolving under NT for some time so I guess we're stuck with it.
  169.  * The structure starts at offset SMC_BASE.
  170.  * See farsync.h for some field values.
  171.  */
  172. struct fst_shared {
  173.                                 /* DMA descriptor rings */
  174.         struct rxdesc rxDescrRing[FST_MAX_PORTS][NUM_RX_BUFFER];
  175.         struct txdesc txDescrRing[FST_MAX_PORTS][NUM_TX_BUFFER];
  176.                                 /* Obsolete small buffers */
  177.         u8  smallRxBuffer[FST_MAX_PORTS][NUM_RX_BUFFER][LEN_SMALL_RX_BUFFER];
  178.         u8  smallTxBuffer[FST_MAX_PORTS][NUM_TX_BUFFER][LEN_SMALL_TX_BUFFER];
  179.         u8  taskStatus;         /* 0x00 => initialising, 0x01 => running,
  180.                                  * 0xFF => halted
  181.                                  */
  182.         u8  interruptHandshake; /* Set to 0x01 by adapter to signal interrupt,
  183.                                  * set to 0xEE by host to acknowledge interrupt
  184.                                  */
  185.         u16 smcVersion;         /* Must match SMC_VERSION */
  186.         u32 smcFirmwareVersion; /* 0xIIVVRRBB where II = product ID, VV = major
  187.                                  * version, RR = revision and BB = build
  188.                                  */
  189.         u16 txa_done;           /* Obsolete completion flags */
  190.         u16 rxa_done;
  191.         u16 txb_done;
  192.         u16 rxb_done;
  193.         u16 txc_done;
  194.         u16 rxc_done;
  195.         u16 txd_done;
  196.         u16 rxd_done;
  197.         u16 mailbox[4];         /* Diagnostics mailbox. Not used */
  198.         struct cirbuff interruptEvent;  /* interrupt causes */
  199.         u32 v24IpSts[FST_MAX_PORTS];    /* V.24 control input status */
  200.         u32 v24OpSts[FST_MAX_PORTS];    /* V.24 control output status */
  201.         struct port_cfg portConfig[FST_MAX_PORTS];
  202.         u16 clockStatus[FST_MAX_PORTS]; /* lsb: 0=> present, 1=> absent */
  203.         u16 cableStatus;                /* lsb: 0=> present, 1=> absent */
  204.         u16 txDescrIndex[FST_MAX_PORTS]; /* transmit descriptor ring index */
  205.         u16 rxDescrIndex[FST_MAX_PORTS]; /* receive descriptor ring index */
  206.         u16 portMailbox[FST_MAX_PORTS][2];      /* command, modifier */
  207.         u16 cardMailbox[4];                     /* Not used */
  208.                                 /* Number of times that card thinks the host has
  209.                                  * missed an interrupt by not acknowledging
  210.                                  * within 2mS (I guess NT has problems)
  211.                                  */
  212.         u32 interruptRetryCount;
  213.                                 /* Driver private data used as an ID. We'll not
  214.                                  * use this on Linux I'd rather keep such things
  215.                                  * in main memory rather than on the PCI bus
  216.                                  */
  217.         u32 portHandle[FST_MAX_PORTS];
  218.                                 /* Count of Tx underflows for stats */
  219.         u32 transmitBufferUnderflow[FST_MAX_PORTS];
  220.                                 /* Debounced V.24 control input status */
  221.         u32 v24DebouncedSts[FST_MAX_PORTS];
  222.                                 /* Adapter debounce timers. Don't touch */
  223.         u32 ctsTimer[FST_MAX_PORTS];
  224.         u32 ctsTimerRun[FST_MAX_PORTS];
  225.         u32 dcdTimer[FST_MAX_PORTS];
  226.         u32 dcdTimerRun[FST_MAX_PORTS];
  227.         u32 numberOfPorts;      /* Number of ports detected at startup */
  228.         u16 _reserved[64];
  229.         u16 cardMode;           /* Bit-mask to enable features:
  230.                                  * Bit 0: 1 enables LED identify mode
  231.                                  */
  232.         u16 portScheduleOffset;
  233.         u32 endOfSmcSignature;  /* endOfSmcSignature MUST be the last member of
  234.                                  * the structure and marks the end of the shared
  235.                                  * memory. Adapter code initializes its value as
  236.                                  * END_SIG.
  237.                                  */
  238. };
  239. /* endOfSmcSignature value */
  240. #define END_SIG                 0x12345678
  241. /* Mailbox values. (portMailbox) */
  242. #define NOP             0       /* No operation */
  243. #define ACK             1       /* Positive acknowledgement to PC driver */
  244. #define NAK             2       /* Negative acknowledgement to PC driver */
  245. #define STARTPORT       3       /* Start an HDLC port */
  246. #define STOPPORT        4       /* Stop an HDLC port */
  247. #define ABORTTX         5       /* Abort the transmitter for a port */
  248. #define SETV24O         6       /* Set V24 outputs */
  249. /* Larger buffers are positioned in memory at offset BFM_BASE */
  250. struct buf_window {
  251.         u8 txBuffer[FST_MAX_PORTS][NUM_TX_BUFFER][LEN_TX_BUFFER];
  252.         u8 rxBuffer[FST_MAX_PORTS][NUM_RX_BUFFER][LEN_RX_BUFFER];
  253. };
  254. /* Calculate offset of a buffer object within the shared memory window */
  255. #define BUF_OFFSET(X)   ((unsigned int)&(((struct buf_window *)BFM_BASE)->X))
  256. #pragma pack()
  257. /*      Device driver private information
  258.  *      =================================
  259.  */
  260. /*      Per port (line or channel) information
  261.  */
  262. struct fst_port_info {
  263.         void                   *if_ptr; /* Some drivers describe this as a
  264.                                          * general purpose pointer. However if
  265.                                          * using syncPPP it has a very specific
  266.                                          * purpose: it must be the first item in
  267.                                          * the structure pointed to by dev->priv
  268.                                          * and must in turn point to the
  269.                                          * associated ppp_device structure.
  270.                                          */
  271.         struct fst_card_info   *card;   /* Card we're associated with */
  272.         int                     index;  /* Port index on the card */
  273.         int                     proto;  /* Protocol we are running */
  274.         int                     hwif;   /* Line hardware (lineInterface copy) */
  275.         int                     run;    /* Port is running */
  276.         int                     rxpos;  /* Next Rx buffer to use */
  277.         int                     txpos;  /* Next Tx buffer to use */
  278.         int                     txipos; /* Next Tx buffer to check for free */
  279.         int                     txcnt;  /* Count of Tx buffers in use */
  280.         struct net_device      *dev;    /* Kernel network device entry */
  281.         struct net_device_stats stats;  /* Standard statistics */
  282.         struct ppp_device       pppdev; /* Link to syncPPP */
  283. };
  284. /*      Per card information
  285.  */
  286. struct fst_card_info {
  287.         char          *mem;             /* Card memory mapped to kernel space */
  288.         char          *ctlmem;          /* Control memory for PCI cards */
  289.         unsigned int   phys_mem;        /* Physical memory window address */
  290.         unsigned int   phys_ctlmem;     /* Physical control memory address */
  291.         unsigned int   irq;             /* Interrupt request line number */
  292.         unsigned int   nports;          /* Number of serial ports */
  293.         unsigned int   type;            /* Type index of card */
  294.         unsigned int   state;           /* State of card */
  295.         spinlock_t     card_lock;       /* Lock for SMP access */
  296.         unsigned short pci_conf;        /* PCI card config in I/O space */
  297.                                         /* Per port info */
  298.         struct fst_port_info ports[ FST_MAX_PORTS ];
  299. };
  300. /*
  301.  *      Shared memory window access macros
  302.  *
  303.  *      We have a nice memory based structure above, which could be directly
  304.  *      mapped on i386 but might not work on other architectures unless we use
  305.  *      the readb,w,l and writeb,w,l macros. Unfortunately these macros take
  306.  *      physical offsets so we have to convert. The only saving grace is that
  307.  *      this should all collapse back to a simple indirection eventually.
  308.  */
  309. #define WIN_OFFSET(X)   ((long)&(((struct fst_shared *)SMC_BASE)->X))
  310. #define FST_RDB(C,E)    readb ((C)->mem + WIN_OFFSET(E))
  311. #define FST_RDW(C,E)    readw ((C)->mem + WIN_OFFSET(E))
  312. #define FST_RDL(C,E)    readl ((C)->mem + WIN_OFFSET(E))
  313. #define FST_WRB(C,E,B)  writeb ((B), (C)->mem + WIN_OFFSET(E))
  314. #define FST_WRW(C,E,W)  writew ((W), (C)->mem + WIN_OFFSET(E))
  315. #define FST_WRL(C,E,L)  writel ((L), (C)->mem + WIN_OFFSET(E))
  316. /*
  317.  *      Debug support
  318.  */
  319. #if FST_DEBUG
  320. static int fst_debug_mask = { FST_DEBUG };
  321. /* Most common debug activity is to print something if the corresponding bit
  322.  * is set in the debug mask. Note: this uses a non-ANSI extension in GCC to
  323.  * support variable numbers of macro parameters. The inverted if prevents us
  324.  * eating someone else's else clause.
  325.  */
  326. #define dbg(F,fmt,A...) if ( ! ( fst_debug_mask & (F))) 
  327.                                 ; 
  328.                         else 
  329.                                 printk ( KERN_DEBUG FST_NAME ": " fmt, ## A )
  330. #else
  331. # define dbg(X...)      /* NOP */
  332. #endif
  333. /*      Printing short cuts
  334.  */
  335. #define printk_err(fmt,A...)    printk ( KERN_ERR     FST_NAME ": " fmt, ## A )
  336. #define printk_warn(fmt,A...)   printk ( KERN_WARNING FST_NAME ": " fmt, ## A )
  337. #define printk_info(fmt,A...)   printk ( KERN_INFO    FST_NAME ": " fmt, ## A )
  338. /*
  339.  *      PCI ID lookup table
  340.  */
  341. static struct pci_device_id fst_pci_dev_id[] __devinitdata = {
  342.         { FSC_PCI_VENDOR_ID, T2P_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
  343.                                         FST_TYPE_T2P },
  344.         { FSC_PCI_VENDOR_ID, T4P_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
  345.                                         FST_TYPE_T4P },
  346.         { 0, }                          /* End */
  347. };
  348. MODULE_DEVICE_TABLE ( pci, fst_pci_dev_id );
  349. /*      Card control functions
  350.  *      ======================
  351.  */
  352. /*      Place the processor in reset state
  353.  *
  354.  * Used to be a simple write to card control space but a glitch in the latest
  355.  * AMD Am186CH processor means that we now have to do it by asserting and de-
  356.  * asserting the PLX chip PCI Adapter Software Reset. Bit 30 in CNTRL register
  357.  * at offset 0x50.
  358.  */
  359. static inline void
  360. fst_cpureset ( struct fst_card_info *card )
  361. {
  362.         unsigned int regval;
  363.         regval = inl ( card->pci_conf + 0x50 );
  364.         outl ( regval |  0x40000000, card->pci_conf + 0x50 );
  365.         outl ( regval & ~0x40000000, card->pci_conf + 0x50 );
  366. }
  367. /*      Release the processor from reset
  368.  */
  369. static inline void
  370. fst_cpurelease ( struct fst_card_info *card )
  371. {
  372.         (void) readb ( card->ctlmem );
  373. }
  374. /*      Clear the cards interrupt flag
  375.  */
  376. static inline void
  377. fst_clear_intr ( struct fst_card_info *card )
  378. {
  379.         /* Poke the appropriate PLX chip register (same as enabling interrupts)
  380.          */
  381.         outw ( 0x0543, card->pci_conf + 0x4C );
  382. }
  383. /*      Disable card interrupts
  384.  */
  385. static inline void
  386. fst_disable_intr ( struct fst_card_info *card )
  387. {
  388.         outw ( 0x0000, card->pci_conf + 0x4C );
  389. }
  390. /*      Issue a Mailbox command for a port.
  391.  *      Note we issue them on a fire and forget basis, not expecting to see an
  392.  *      error and not waiting for completion.
  393.  */
  394. static void
  395. fst_issue_cmd ( struct fst_port_info *port, unsigned short cmd )
  396. {
  397.         struct fst_card_info *card;
  398.         unsigned short mbval;
  399.         unsigned long flags;
  400.         int safety;
  401.         card = port->card;
  402.         spin_lock_irqsave ( &card->card_lock, flags );
  403.         mbval = FST_RDW ( card, portMailbox[port->index][0]);
  404.         safety = 0;
  405.         /* Wait for any previous command to complete */
  406.         while ( mbval > NAK )
  407.         {
  408.                 spin_unlock_irqrestore ( &card->card_lock, flags );
  409.                 schedule_timeout ( 1 );
  410.                 spin_lock_irqsave ( &card->card_lock, flags );
  411.                 if ( ++safety > 1000 )
  412.                 {
  413.                         printk_err ("Mailbox safety timeoutn");
  414.                         break;
  415.                 }
  416.                 mbval = FST_RDW ( card, portMailbox[port->index][0]);
  417.         }
  418.         if ( safety > 0 )
  419.         {
  420.                 dbg ( DBG_CMD,"Mailbox clear after %d jiffiesn", safety );
  421.         }
  422.         if ( mbval == NAK )
  423.         {
  424.                 dbg ( DBG_CMD,"issue_cmd: previous command was NAK'dn");
  425.         }
  426.         FST_WRW ( card, portMailbox[port->index][0], cmd );
  427.         if ( cmd == ABORTTX || cmd == STARTPORT )
  428.         {
  429.                 port->txpos  = 0;
  430.                 port->txipos = 0;
  431.                 port->txcnt  = 0;
  432.         }
  433.         spin_unlock_irqrestore ( &card->card_lock, flags );
  434. }
  435. /*      Port output signals control
  436.  */
  437. static inline void
  438. fst_op_raise ( struct fst_port_info *port, unsigned int outputs )
  439. {
  440.         outputs |= FST_RDL ( port->card, v24OpSts[port->index]);
  441.         FST_WRL ( port->card, v24OpSts[port->index], outputs );
  442.         if ( port->run )
  443.                 fst_issue_cmd ( port, SETV24O );
  444. }
  445. static inline void
  446. fst_op_lower ( struct fst_port_info *port, unsigned int outputs )
  447. {
  448.         outputs = ~outputs & FST_RDL ( port->card, v24OpSts[port->index]);
  449.         FST_WRL ( port->card, v24OpSts[port->index], outputs );
  450.         if ( port->run )
  451.                 fst_issue_cmd ( port, SETV24O );
  452. }
  453. /*
  454.  *      Setup port Rx buffers
  455.  */
  456. static void
  457. fst_rx_config ( struct fst_port_info *port )
  458. {
  459.         int i;
  460.         int pi;
  461.         unsigned int offset;
  462.         unsigned long flags;
  463.         struct fst_card_info *card;
  464.         pi   = port->index;
  465.         card = port->card;
  466.         spin_lock_irqsave ( &card->card_lock, flags );
  467.         for ( i = 0 ; i < NUM_RX_BUFFER ; i++ )
  468.         {
  469.                 offset = BUF_OFFSET ( rxBuffer[pi][i][0]);
  470.                 FST_WRW ( card, rxDescrRing[pi][i].ladr, (u16) offset );
  471.                 FST_WRB ( card, rxDescrRing[pi][i].hadr, (u8)( offset >> 16 ));
  472.                 FST_WRW ( card, rxDescrRing[pi][i].bcnt,
  473.                                         cnv_bcnt ( LEN_RX_BUFFER ));
  474.                 FST_WRW ( card, rxDescrRing[pi][i].mcnt, 0 );
  475.                 FST_WRB ( card, rxDescrRing[pi][i].bits, DMA_OWN );
  476.         }
  477.         port->rxpos  = 0;
  478.         spin_unlock_irqrestore ( &card->card_lock, flags );
  479. }
  480. /*
  481.  *      Setup port Tx buffers
  482.  */
  483. static void
  484. fst_tx_config ( struct fst_port_info *port )
  485. {
  486.         int i;
  487.         int pi;
  488.         unsigned int offset;
  489.         unsigned long flags;
  490.         struct fst_card_info *card;
  491.         pi   = port->index;
  492.         card = port->card;
  493.         spin_lock_irqsave ( &card->card_lock, flags );
  494.         for ( i = 0 ; i < NUM_TX_BUFFER ; i++ )
  495.         {
  496.                 offset = BUF_OFFSET ( txBuffer[pi][i][0]);
  497.                 FST_WRW ( card, txDescrRing[pi][i].ladr, (u16) offset );
  498.                 FST_WRB ( card, txDescrRing[pi][i].hadr, (u8)( offset >> 16 ));
  499.                 FST_WRW ( card, txDescrRing[pi][i].bcnt, 0 );
  500.                 FST_WRB ( card, txDescrRing[pi][i].bits, 0 );
  501.         }
  502.         port->txpos  = 0;
  503.         port->txipos = 0;
  504.         port->txcnt  = 0;
  505.         spin_unlock_irqrestore ( &card->card_lock, flags );
  506. }
  507. /*      Control signal change interrupt event
  508.  */
  509. static void
  510. fst_intr_ctlchg ( struct fst_card_info *card, struct fst_port_info *port )
  511. {
  512.         int signals;
  513.         signals = FST_RDL ( card, v24DebouncedSts[port->index]);
  514.         if ( signals & (( port->hwif == X21 ) ? IPSTS_INDICATE : IPSTS_DCD ))
  515.         {
  516.                 if ( ! netif_carrier_ok ( port->dev ))
  517.                 {
  518.                         dbg ( DBG_INTR,"DCD activen");
  519.                         /* Poke sPPP to renegotiate */
  520.                         if ( port->proto == FST_HDLC || port->proto == FST_PPP )
  521.                         {
  522.                                 sppp_reopen ( port->dev );
  523.                         }
  524.                         netif_carrier_on ( port->dev );
  525.                 }
  526.         }
  527.         else
  528.         {
  529.                 if ( netif_carrier_ok ( port->dev ))
  530.                 {
  531.                         dbg ( DBG_INTR,"DCD lostn");
  532.                         netif_carrier_off ( port->dev );
  533.                 }
  534.         }
  535. }
  536. /*      Rx complete interrupt
  537.  */
  538. static void
  539. fst_intr_rx ( struct fst_card_info *card, struct fst_port_info *port )
  540. {
  541.         unsigned char dmabits;
  542.         int pi;
  543.         int rxp;
  544.         unsigned short len;
  545.         struct sk_buff *skb;
  546.         int i;
  547.         /* Check we have a buffer to process */
  548.         pi  = port->index;
  549.         rxp = port->rxpos;
  550.         dmabits = FST_RDB ( card, rxDescrRing[pi][rxp].bits );
  551.         if ( dmabits & DMA_OWN )
  552.         {
  553.                 dbg ( DBG_RX | DBG_INTR,"intr_rx: No buffer port %d pos %dn",
  554.                                         pi, rxp );
  555.                 return;
  556.         }
  557.         /* Get buffer length */
  558.         len = FST_RDW ( card, rxDescrRing[pi][rxp].mcnt );
  559.         /* Discard the CRC */
  560.         len -= 2;
  561.         /* Check buffer length and for other errors. We insist on one packet
  562.          * in one buffer. This simplifies things greatly and since we've
  563.          * allocated 8K it shouldn't be a real world limitation
  564.          */
  565.         dbg ( DBG_RX,"intr_rx: %d,%d: flags %x len %dn", pi, rxp, dmabits,
  566.                                         len );
  567.         if ( dmabits != ( RX_STP | RX_ENP ) || len > LEN_RX_BUFFER - 2 )
  568.         {
  569.                 port->stats.rx_errors++;
  570.                 /* Update error stats and discard buffer */
  571.                 if ( dmabits & RX_OFLO )
  572.                 {
  573.                         port->stats.rx_fifo_errors++;
  574.                 }
  575.                 if ( dmabits & RX_CRC )
  576.                 {
  577.                         port->stats.rx_crc_errors++;
  578.                 }
  579.                 if ( dmabits & RX_FRAM )
  580.                 {
  581.                         port->stats.rx_frame_errors++;
  582.                 }
  583.                 if ( dmabits == ( RX_STP | RX_ENP ))
  584.                 {
  585.                         port->stats.rx_length_errors++;
  586.                 }
  587.                 /* Discard buffer descriptors until we see the end of packet
  588.                  * marker
  589.                  */
  590.                 i = 0;
  591.                 while (( dmabits & ( DMA_OWN | RX_ENP )) == 0 )
  592.                 {
  593.                         FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
  594.                         if ( ++rxp >= NUM_RX_BUFFER )
  595.                                 rxp = 0;
  596.                         if ( ++i > NUM_RX_BUFFER )
  597.                         {
  598.                                 dbg ( DBG_ASS,"intr_rx: Discarding more bufs"
  599.                                                 " than we haven");
  600.                                 break;
  601.                         }
  602.                         dmabits = FST_RDB ( card, rxDescrRing[pi][rxp].bits );
  603.                 }
  604.                 /* Discard the terminal buffer */
  605.                 if ( ! ( dmabits & DMA_OWN ))
  606.                 {
  607.                         FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
  608.                         if ( ++rxp >= NUM_RX_BUFFER )
  609.                                 rxp = 0;
  610.                 }
  611.                 port->rxpos = rxp;
  612.                 return;
  613.         }
  614.         /* Allocate SKB */
  615.         if (( skb = dev_alloc_skb ( len )) == NULL )
  616.         {
  617.                 dbg ( DBG_RX,"intr_rx: can't allocate buffern");
  618.                 port->stats.rx_dropped++;
  619.                 /* Return descriptor to card */
  620.                 FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
  621.                 if ( ++rxp >= NUM_RX_BUFFER )
  622.                         port->rxpos = 0;
  623.                 else
  624.                         port->rxpos = rxp;
  625.                 return;
  626.         }
  627.         memcpy_fromio ( skb_put ( skb, len ),
  628.                                 card->mem + BUF_OFFSET ( rxBuffer[pi][rxp][0]),
  629.                                 len );
  630.         /* Reset buffer descriptor */
  631.         FST_WRB ( card, rxDescrRing[pi][rxp].bits, DMA_OWN );
  632.         if ( ++rxp >= NUM_RX_BUFFER )
  633.                 port->rxpos = 0;
  634.         else
  635.                 port->rxpos = rxp;
  636.         /* Update stats */
  637.         port->stats.rx_packets++;
  638.         port->stats.rx_bytes += len;
  639.         /* Push upstream */
  640.         if ( port->proto == FST_HDLC || port->proto == FST_PPP )
  641.         {
  642.                 /* Mark for further processing by sPPP module */
  643.                 skb->protocol = htons ( ETH_P_WAN_PPP );
  644.         }
  645.         else
  646.         {
  647.                 /* DEC customer specific protocol (since nothing defined for
  648.                  * marking raw data), at least one other driver uses this value
  649.                  * for this purpose.
  650.                  */
  651.                 skb->protocol = htons ( ETH_P_CUST );
  652.                 skb->pkt_type = PACKET_HOST;
  653.         }
  654.         skb->mac.raw = skb->data;
  655.         skb->dev = port->dev;
  656.         netif_rx ( skb );
  657.         port->dev->last_rx = jiffies;
  658. }
  659. /*
  660.  *      The interrupt service routine
  661.  *      Dev_id is our fst_card_info pointer
  662.  */
  663. static void
  664. fst_intr ( int irq, void *dev_id, struct pt_regs *regs )
  665. {
  666.         struct fst_card_info *card;
  667.         struct fst_port_info *port;
  668.         int rdidx;                      /* Event buffer indices */
  669.         int wridx;
  670.         int event;                      /* Actual event for processing */
  671.         int pi;
  672.         if (( card = dev_id ) == NULL )
  673.         {
  674.                 dbg ( DBG_INTR,"intr: spurious %dn", irq );
  675.                 return;
  676.         }
  677.         dbg ( DBG_INTR,"intr: %d %pn", irq, card );
  678.         spin_lock ( &card->card_lock );
  679.         /* Clear and reprime the interrupt source */
  680.         fst_clear_intr ( card );
  681.         /* Set the software acknowledge */
  682.         FST_WRB ( card, interruptHandshake, 0xEE );
  683.         /* Drain the event queue */
  684.         rdidx = FST_RDB ( card, interruptEvent.rdindex );
  685.         wridx = FST_RDB ( card, interruptEvent.wrindex );
  686.         while ( rdidx != wridx )
  687.         {
  688.                 event = FST_RDB ( card, interruptEvent.evntbuff[rdidx]);
  689.                 port = &card->ports[event & 0x03];
  690.                 dbg ( DBG_INTR,"intr: %xn", event );
  691.                 switch ( event )
  692.                 {
  693.                 case CTLA_CHG:
  694.                 case CTLB_CHG:
  695.                 case CTLC_CHG:
  696.                 case CTLD_CHG:
  697.                         if ( port->run && port->dev != NULL )
  698.                                 fst_intr_ctlchg ( card, port );
  699.                         break;
  700.                 case ABTA_SENT:
  701.                 case ABTB_SENT:
  702.                 case ABTC_SENT:
  703.                 case ABTD_SENT:
  704.                         dbg ( DBG_TX,"Abort complete port %dn", event & 0x03 );
  705.                         break;
  706.                 case TXA_UNDF:
  707.                 case TXB_UNDF:
  708.                 case TXC_UNDF:
  709.                 case TXD_UNDF:
  710.                         /* Difficult to see how we'd get this given that we
  711.                          * always load up the entire packet for DMA.
  712.                          */
  713.                         dbg ( DBG_TX,"Tx underflow port %dn", event & 0x03 );
  714.                         port->stats.tx_errors++;
  715.                         port->stats.tx_fifo_errors++;
  716.                         break;
  717.                 case INIT_CPLT:
  718.                         dbg ( DBG_INIT,"Card init OK intrn");
  719.                         break;
  720.                 case INIT_FAIL:
  721.                         dbg ( DBG_INIT,"Card init FAILED intrn");
  722.                         card->state = FST_IFAILED;
  723.                         break;
  724.                 default:
  725.                         printk_err ("intr: unknown card event code. ignoredn");
  726.                         break;
  727.                 }
  728.                 /* Bump and wrap the index */
  729.                 if ( ++rdidx >= MAX_CIRBUFF )
  730.                         rdidx = 0;
  731.         }
  732.         FST_WRB ( card, interruptEvent.rdindex, rdidx );
  733.         for ( pi = 0, port = card->ports ; pi < card->nports ; pi++, port++ )
  734.         {
  735.                 if ( port->dev == NULL || ! port->run )
  736.                         continue;
  737.                 /* Check for rx completions */
  738.                 while ( ! ( FST_RDB ( card, rxDescrRing[pi][port->rxpos].bits )
  739.                                                                 & DMA_OWN ))
  740.                 {
  741.                         fst_intr_rx ( card, port );
  742.                 }
  743.                 /* Check for Tx completions */
  744.                 while ( port->txcnt > 0 && ! ( FST_RDB ( card,
  745.                         txDescrRing[pi][port->txipos].bits ) & DMA_OWN ))
  746.                 {
  747.                         --port->txcnt;
  748.                         if ( ++port->txipos >= NUM_TX_BUFFER )
  749.                                 port->txipos = 0;
  750.                         netif_wake_queue ( port->dev );
  751.                 }
  752.         }
  753.         spin_unlock ( &card->card_lock );
  754. }
  755. /*      Check that the shared memory configuration is one that we can handle
  756.  *      and that some basic parameters are correct
  757.  */
  758. static void
  759. check_started_ok ( struct fst_card_info *card )
  760. {
  761.         int i;
  762.         /* Check structure version and end marker */
  763.         if ( FST_RDW ( card, smcVersion ) != SMC_VERSION )
  764.         {
  765.                 printk_err ("Bad shared memory version %d expected %dn",
  766.                                 FST_RDW ( card, smcVersion ), SMC_VERSION );
  767.                 card->state = FST_BADVERSION;
  768.                 return;
  769.         }
  770.         if ( FST_RDL ( card, endOfSmcSignature ) != END_SIG )
  771.         {
  772.                 printk_err ("Missing shared memory signaturen");
  773.                 card->state = FST_BADVERSION;
  774.                 return;
  775.         }
  776.         /* Firmware status flag, 0x00 = initialising, 0x01 = OK, 0xFF = fail */
  777.         if (( i = FST_RDB ( card, taskStatus )) == 0x01 )
  778.         {
  779.                 card->state = FST_RUNNING;
  780.         }
  781.         else if ( i == 0xFF )
  782.         {
  783.                 printk_err ("Firmware initialisation failed. Card haltedn");
  784.                 card->state = FST_HALTED;
  785.                 return;
  786.         }
  787.         else if ( i != 0x00 )
  788.         {
  789.                 printk_err ("Unknown firmware status 0x%xn", i );
  790.                 card->state = FST_HALTED;
  791.                 return;
  792.         }
  793.         /* Finally check the number of ports reported by firmware against the
  794.          * number we assumed at card detection. Should never happen with
  795.          * existing firmware etc so we just report it for the moment.
  796.          */
  797.         if ( FST_RDL ( card, numberOfPorts ) != card->nports )
  798.         {
  799.                 printk_warn ("Port count mismatch."
  800.                                 " Firmware thinks %d we say %dn",
  801.                                 FST_RDL ( card, numberOfPorts ), card->nports );
  802.         }
  803. }
  804. static int
  805. fst_change_mtu ( struct net_device *dev, int new_mtu )
  806. {
  807.         if ( new_mtu < 128 || new_mtu > FST_MAX_MTU )
  808.                 return -EINVAL;
  809.         dev->mtu = new_mtu;
  810.         return 0;
  811. }
  812. /* Sooner or later you can't avoid a forward declaration */
  813. static int fst_ioctl ( struct net_device *dev, struct ifreq *ifr, int cmd );
  814. static int
  815. switch_proto ( struct fst_port_info *port, int new_proto )
  816. {
  817.         int err;
  818.         int orig_mtu;
  819.         struct net_device *dev;
  820.         dev = port->dev;
  821.         /* Turn off sPPP module ? */
  822.         if (( new_proto != FST_HDLC && new_proto != FST_PPP )
  823.                 && ( port->proto == FST_HDLC || port->proto == FST_PPP ))
  824.         {
  825.                 sppp_close ( port->pppdev.dev );
  826.                 sppp_detach ( port->pppdev.dev );
  827.                 /* Reset some fields overwritten by sPPP */
  828.                 dev->hard_header     = NULL;
  829.                 dev->rebuild_header  = NULL;
  830.                 dev->tx_queue_len    = FST_TX_QUEUE_LEN;
  831.                 dev->type            = ARPHRD_MYTYPE;
  832.                 dev->addr_len        = 0;
  833.                 dev->hard_header_len = 0;
  834.                 dev->do_ioctl        = fst_ioctl;
  835.                 dev->change_mtu      = fst_change_mtu;
  836.                 dev->flags           = IFF_POINTOPOINT|IFF_NOARP;
  837.                 return 0;
  838.         }
  839.         /* Turn on sPPP ? */
  840.         if (( new_proto == FST_HDLC || new_proto == FST_PPP )
  841.                 && ( port->proto != FST_HDLC && port->proto != FST_PPP ))
  842.         {
  843.                 orig_mtu = dev->mtu;
  844.                 /* Attach to sync PPP module */
  845.                 port->pppdev.dev = dev;
  846.                 sppp_attach ( &port->pppdev );
  847.                 if ( orig_mtu < dev->mtu )
  848.                         dev->change_mtu ( dev, orig_mtu );
  849.                 /* Claw back the ioctl routine. We promise to be good and call
  850.                  * the sync PPP routines once we've eliminated our functions.
  851.                  */
  852.                 dev->do_ioctl = fst_ioctl;
  853.                 /* Set the mode */
  854.                 if ( new_proto == FST_HDLC )
  855.                 {
  856.                         err = sppp_do_ioctl ( port->pppdev.dev, NULL,
  857.                                                                 SPPPIOCCISCO );
  858.                 }
  859.                 else
  860.                 {
  861.                         err = sppp_do_ioctl ( port->pppdev.dev, NULL,
  862.                                                                 SPPPIOCPPP );
  863.                 }
  864.                 /* Open the device */
  865.                 if ( err == 0 )
  866.                 {
  867.                         (void) sppp_open ( port->dev );
  868.                 }
  869.                 return err;
  870.         }
  871.         /* Switch sPPP mode to that desired */
  872.         err = 0;
  873.         if ( new_proto == FST_HDLC && port->pppdev.dev != NULL )
  874.         {
  875.                 err = sppp_do_ioctl ( port->pppdev.dev, NULL, SPPPIOCCISCO );
  876.         }
  877.         else if ( new_proto == FST_PPP && port->pppdev.dev != NULL )
  878.         {
  879.                 err = sppp_do_ioctl ( port->pppdev.dev, NULL, SPPPIOCPPP );
  880.         }
  881.         /* Anything else is switching from one raw mode to another which is
  882.          * basically a NOP
  883.          */
  884.         return err;
  885. }
  886. static int
  887. set_conf_from_info ( struct fst_card_info *card, struct fst_port_info *port,
  888.                 struct fstioc_info *info )
  889. {
  890.         int err;
  891.         /* Set things according to the user set valid flags */
  892.         err = 0;
  893.         if ( info->valid & FSTVAL_PROTO )
  894.         {
  895.                 if ( port->proto != info->proto )
  896.                 {
  897.                         err = switch_proto ( port, info->proto );
  898.                         if ( err == 0 )
  899.                                 port->proto = info->proto;
  900.                 }
  901.         }
  902.         if ( info->valid & FSTVAL_CABLE )
  903.         {
  904.                 FST_WRB ( card, portConfig[port->index].lineInterface,
  905.                                         info->lineInterface );
  906.                 port->hwif = info->lineInterface;
  907.         }
  908.         if ( info->valid & FSTVAL_SPEED )
  909.         {
  910.                 FST_WRL ( card, portConfig[port->index].lineSpeed,
  911.                                         info->lineSpeed );
  912.                 FST_WRB ( card, portConfig[port->index].internalClock,
  913.                                         info->internalClock );
  914.         }
  915.         if ( info->valid & FSTVAL_MODE )
  916.         {
  917.                 FST_WRW ( card, cardMode, info->cardMode );
  918.         }
  919. #if FST_DEBUG
  920.         if ( info->valid & FSTVAL_DEBUG )
  921.         {
  922.                 fst_debug_mask = info->debug;
  923.         }
  924. #endif
  925.         return err;
  926. }
  927. static void
  928. gather_conf_info ( struct fst_card_info *card, struct fst_port_info *port,
  929.                 struct fstioc_info *info )
  930. {
  931.         int i;
  932.         memset ( info, 0, sizeof ( struct fstioc_info ));
  933.         i = port->index;
  934.         info->nports = card->nports;
  935.         info->type   = card->type;
  936.         info->state  = card->state;
  937.         info->proto  = port->proto;
  938.         info->index  = i;
  939. #if FST_DEBUG
  940.         info->debug  = fst_debug_mask;
  941. #endif
  942.         /* Only mark information as valid if card is running.
  943.          * Copy the data anyway in case it is useful for diagnostics
  944.          */
  945.         info->valid
  946.                 = (( card->state == FST_RUNNING ) ? FSTVAL_ALL : FSTVAL_CARD )
  947. #if FST_DEBUG
  948.                 | FSTVAL_DEBUG
  949. #endif
  950.                 ;
  951.         info->lineInterface = FST_RDW ( card, portConfig[i].lineInterface );
  952.         info->internalClock = FST_RDB ( card, portConfig[i].internalClock );
  953.         info->lineSpeed     = FST_RDL ( card, portConfig[i].lineSpeed );
  954.         info->v24IpSts      = FST_RDL ( card, v24IpSts[i] );
  955.         info->v24OpSts      = FST_RDL ( card, v24OpSts[i] );
  956.         info->clockStatus   = FST_RDW ( card, clockStatus[i] );
  957.         info->cableStatus   = FST_RDW ( card, cableStatus );
  958.         info->cardMode      = FST_RDW ( card, cardMode );
  959.         info->smcFirmwareVersion  = FST_RDL ( card, smcFirmwareVersion );
  960. }
  961. static int
  962. fst_ioctl ( struct net_device *dev, struct ifreq *ifr, int cmd )
  963. {
  964.         struct fst_card_info *card;
  965.         struct fst_port_info *port;
  966.         struct fstioc_write wrthdr;
  967.         struct fstioc_info info;
  968.         unsigned long flags;
  969.         dbg ( DBG_IOCTL,"ioctl: %x, %pn", cmd, ifr->ifr_data );
  970.         port = dev->priv;
  971.         card = port->card;
  972.         if ( !capable ( CAP_NET_ADMIN ))
  973.                 return -EPERM;
  974.         switch ( cmd )
  975.         {
  976.         case FSTCPURESET:
  977.                 fst_cpureset ( card );
  978.                 card->state = FST_RESET;
  979.                 return 0;
  980.         case FSTCPURELEASE:
  981.                 fst_cpurelease ( card );
  982.                 card->state = FST_STARTING;
  983.                 return 0;
  984.         case FSTWRITE:                  /* Code write (download) */
  985.                 /* First copy in the header with the length and offset of data
  986.                  * to write
  987.                  */
  988.                 if ( ifr->ifr_data == NULL )
  989.                 {
  990.                         return -EINVAL;
  991.                 }
  992.                 if ( copy_from_user ( &wrthdr, ifr->ifr_data,
  993.                                         sizeof ( struct fstioc_write )))
  994.                 {
  995.                         return -EFAULT;
  996.                 }
  997.                 /* Sanity check the parameters. We don't support partial writes
  998.                  * when going over the top
  999.                  */
  1000.                 if ( wrthdr.size > FST_MEMSIZE || wrthdr.offset > FST_MEMSIZE
  1001.                                 || wrthdr.size + wrthdr.offset > FST_MEMSIZE )
  1002.                 {
  1003.                         return -ENXIO;
  1004.                 }
  1005.                 /* Now copy the data to the card.
  1006.                  * This will probably break on some architectures.
  1007.                  * I'll fix it when I have something to test on.
  1008.                  */
  1009.                 if ( copy_from_user ( card->mem + wrthdr.offset,
  1010.                                 ifr->ifr_data + sizeof ( struct fstioc_write ),
  1011.                                 wrthdr.size ))
  1012.                 {
  1013.                         return -EFAULT;
  1014.                 }
  1015.                 /* Writes to the memory of a card in the reset state constitute
  1016.                  * a download
  1017.                  */
  1018.                 if ( card->state == FST_RESET )
  1019.                 {
  1020.                         card->state = FST_DOWNLOAD;
  1021.                 }
  1022.                 return 0;
  1023.         case FSTGETCONF:
  1024.                 /* If card has just been started check the shared memory config
  1025.                  * version and marker
  1026.                  */
  1027.                 if ( card->state == FST_STARTING )
  1028.                 {
  1029.                         check_started_ok ( card );
  1030.                         /* If everything checked out enable card interrupts */
  1031.                         if ( card->state == FST_RUNNING )
  1032.                         {
  1033.                                 spin_lock_irqsave ( &card->card_lock, flags );
  1034.                                 fst_clear_intr ( card );
  1035.                                 FST_WRB ( card, interruptHandshake, 0xEE );
  1036.                                 spin_unlock_irqrestore ( &card->card_lock,
  1037.                                                                 flags );
  1038.                         }
  1039.                 }
  1040.                 if ( ifr->ifr_data == NULL )
  1041.                 {
  1042.                         return -EINVAL;
  1043.                 }
  1044.                 gather_conf_info ( card, port, &info );
  1045.                 if ( copy_to_user ( ifr->ifr_data, &info, sizeof ( info )))
  1046.                 {
  1047.                         return -EFAULT;
  1048.                 }
  1049.                 return 0;
  1050.         case FSTSETCONF:
  1051.                 if ( copy_from_user ( &info,  ifr->ifr_data, sizeof ( info )))
  1052.                 {
  1053.                         return -EFAULT;
  1054.                 }
  1055.                 return set_conf_from_info ( card, port, &info );
  1056.         default:
  1057.                 /* Not one of ours. Pass it through to sPPP package */
  1058.                 if ( port->proto == FST_HDLC || port->proto == FST_PPP )
  1059.                         return sppp_do_ioctl ( dev, ifr, cmd );
  1060.                 else
  1061.                         return -EINVAL;
  1062.         }
  1063. }
  1064. static void
  1065. fst_openport ( struct fst_port_info *port )
  1066. {
  1067.         int signals;
  1068.         /* Only init things if card is actually running. This allows open to
  1069.          * succeed for downloads etc.
  1070.          */
  1071.         if ( port->card->state == FST_RUNNING )
  1072.         {
  1073.                 if ( port->run )
  1074.                 {
  1075.                         dbg ( DBG_OPEN,"open: found port already runningn");
  1076.                         fst_issue_cmd ( port, STOPPORT );
  1077.                         port->run = 0;
  1078.                 }
  1079.                 fst_rx_config ( port );
  1080.                 fst_tx_config ( port );
  1081.                 fst_op_raise ( port, OPSTS_RTS | OPSTS_DTR );
  1082.                 fst_issue_cmd ( port, STARTPORT );
  1083.                 port->run = 1;
  1084.                 signals = FST_RDL ( port->card, v24DebouncedSts[port->index]);
  1085.                 if ( signals & (( port->hwif == X21 ) ? IPSTS_INDICATE
  1086.                                                       : IPSTS_DCD ))
  1087.                         netif_carrier_on ( port->dev );
  1088.                 else
  1089.                         netif_carrier_off ( port->dev );
  1090.         }
  1091. }
  1092. static void
  1093. fst_closeport ( struct fst_port_info *port )
  1094. {
  1095.         if ( port->card->state == FST_RUNNING )
  1096.         {
  1097.                 if ( port->run )
  1098.                 {
  1099.                         port->run = 0;
  1100.                         fst_op_lower ( port, OPSTS_RTS | OPSTS_DTR );
  1101.                         fst_issue_cmd ( port, STOPPORT );
  1102.                 }
  1103.                 else
  1104.                 {
  1105.                         dbg ( DBG_OPEN,"close: port not runningn");
  1106.                 }
  1107.         }
  1108. }
  1109. static int
  1110. fst_open ( struct net_device *dev )
  1111. {
  1112.         struct fst_card_info *card;
  1113.         struct fst_port_info *port;
  1114.         int orig_mtu;
  1115.         int err;
  1116.         MOD_INC_USE_COUNT;
  1117.         port = dev->priv;
  1118.         card = port->card;
  1119.         switch ( port->proto )
  1120.         {
  1121.         case FST_HDLC:
  1122.         case FST_PPP:
  1123.                 orig_mtu = dev->mtu;
  1124.                 /* Attach to sync PPP module */
  1125.                 port->pppdev.dev = dev;
  1126.                 sppp_attach ( &port->pppdev );
  1127.                 if ( orig_mtu < dev->mtu )
  1128.                         dev->change_mtu ( dev, orig_mtu );
  1129.                 /* Claw back the ioctl routine. We promise to be good and call
  1130.                  * the sync PPP routines once we've eliminated our functions.
  1131.                  */
  1132.                 dev->do_ioctl = fst_ioctl;
  1133.                 err = sppp_do_ioctl ( dev, NULL, port->proto == FST_HDLC
  1134.                                                 ? SPPPIOCCISCO : SPPPIOCPPP );
  1135.                 if ( err )
  1136. {
  1137. sppp_detach ( dev );
  1138. MOD_DEC_USE_COUNT;
  1139. return err;
  1140. }
  1141.                 err = sppp_open ( dev );
  1142.                 if ( err )
  1143. {
  1144. sppp_detach ( dev );
  1145. MOD_DEC_USE_COUNT;
  1146. return err;
  1147. }
  1148.                 break;
  1149.         case FST_MONITOR:
  1150.         case FST_RAW:
  1151.                 break;
  1152.         default:
  1153.                 dbg ( DBG_OPEN,"open: Unknown proto %dn", port->proto );
  1154.                 break;
  1155.         }
  1156.         fst_openport ( port );
  1157.         netif_wake_queue ( dev );
  1158.         return 0;
  1159. }
  1160. static int
  1161. fst_close ( struct net_device *dev )
  1162. {
  1163.         struct fst_port_info *port;
  1164.         port = dev->priv;
  1165.         netif_stop_queue ( dev );
  1166.         switch ( port->proto )
  1167.         {
  1168.         case FST_HDLC:
  1169.         case FST_PPP:
  1170.                 sppp_close ( dev );
  1171.                 sppp_detach ( dev );
  1172.                 break;
  1173.         case FST_MONITOR:
  1174.         case FST_RAW:
  1175.                 break;
  1176.         default:
  1177.                 dbg ( DBG_OPEN,"close: Unknown proto %dn", port->proto );
  1178.                 break;
  1179.         }
  1180.         fst_closeport ( port );
  1181.         MOD_DEC_USE_COUNT;
  1182.         return 0;
  1183. }
  1184. static void
  1185. fst_tx_timeout ( struct net_device *dev )
  1186. {
  1187.         struct fst_port_info *port;
  1188.         dbg ( DBG_INTR | DBG_TX,"tx_timeoutn");
  1189.         port = dev->priv;
  1190.         port->stats.tx_errors++;
  1191.         port->stats.tx_aborted_errors++;
  1192.         if ( port->txcnt > 0 )
  1193.                 fst_issue_cmd ( port, ABORTTX );
  1194.         dev->trans_start = jiffies;
  1195.         netif_wake_queue ( dev );
  1196. }
  1197. static int
  1198. fst_start_xmit ( struct sk_buff *skb, struct net_device *dev )
  1199. {
  1200.         struct fst_card_info *card;
  1201.         struct fst_port_info *port;
  1202.         unsigned char dmabits;
  1203.         unsigned long flags;
  1204.         int pi;
  1205.         int txp;
  1206.         port = dev->priv;
  1207.         card = port->card;
  1208.         /* Drop packet if in monitor (rx only) mode */
  1209.         if ( port->proto == FST_MONITOR )
  1210.         {
  1211.                 dev_kfree_skb ( skb );
  1212.                 return 0;
  1213.         }
  1214.         /* Drop packet with error if we don't have carrier */
  1215.         if ( ! netif_carrier_ok ( dev ))
  1216.         {
  1217.                 dev_kfree_skb ( skb );
  1218.                 port->stats.tx_errors++;
  1219.                 port->stats.tx_carrier_errors++;
  1220.                 return 0;
  1221.         }
  1222.         /* Drop it if it's too big! MTU failure ? */
  1223.         if ( skb->len > LEN_TX_BUFFER )
  1224.         {
  1225.                 dbg ( DBG_TX,"Packet too large %d vs %dn", skb->len,
  1226.                                                 LEN_TX_BUFFER );
  1227.                 dev_kfree_skb ( skb );
  1228.                 port->stats.tx_errors++;
  1229.                 return 0;
  1230.         }
  1231.         /* Check we have a buffer */
  1232.         pi = port->index;
  1233.         spin_lock_irqsave ( &card->card_lock, flags );
  1234.         txp = port->txpos;
  1235.         dmabits = FST_RDB ( card, txDescrRing[pi][txp].bits );
  1236.         if ( dmabits & DMA_OWN )
  1237.         {
  1238.                 spin_unlock_irqrestore ( &card->card_lock, flags );
  1239.                 dbg ( DBG_TX,"Out of Tx buffersn");
  1240.                 dev_kfree_skb ( skb );
  1241.                 port->stats.tx_errors++;
  1242.                 return 0;
  1243.         }
  1244.         if ( ++port->txpos >= NUM_TX_BUFFER )
  1245.                 port->txpos = 0;
  1246.         if ( ++port->txcnt >= NUM_TX_BUFFER )
  1247.                 netif_stop_queue ( dev );
  1248.         /* Release the card lock before we copy the data as we now have
  1249.          * exclusive access to the buffer.
  1250.          */
  1251.         spin_unlock_irqrestore ( &card->card_lock, flags );
  1252.         /* Enqueue the packet */
  1253.         memcpy_toio ( card->mem + BUF_OFFSET ( txBuffer[pi][txp][0]),
  1254.                                                 skb->data, skb->len );
  1255.         FST_WRW ( card, txDescrRing[pi][txp].bcnt, cnv_bcnt ( skb->len ));
  1256.         FST_WRB ( card, txDescrRing[pi][txp].bits, DMA_OWN | TX_STP | TX_ENP );
  1257.         port->stats.tx_packets++;
  1258.         port->stats.tx_bytes += skb->len;
  1259.         dev_kfree_skb ( skb );
  1260.         dev->trans_start = jiffies;
  1261.         return 0;
  1262. }
  1263. static struct net_device_stats *
  1264. fst_get_stats ( struct net_device *dev )
  1265. {
  1266.         struct fst_port_info *port;
  1267.         if (( port = dev->priv ) != NULL )
  1268.                 return &port->stats;
  1269.         else
  1270.                 return NULL;
  1271. }
  1272. /*
  1273.  *      Card setup having checked hardware resources.
  1274.  *      Should be pretty bizarre if we get an error here (kernel memory
  1275.  *      exhaustion is one possibility). If we do see a problem we report it
  1276.  *      via a printk and leave the corresponding interface and all that follow
  1277.  *      disabled.
  1278.  */
  1279. static char *type_strings[] __devinitdata = {
  1280.         "no hardware",                  /* Should never be seen */
  1281.         "FarSync T2P",
  1282.         "FarSync T4P"
  1283. };
  1284. static void __devinit
  1285. fst_init_card ( struct fst_card_info *card )
  1286. {
  1287.         int i;
  1288.         int err;
  1289.         struct net_device *dev;
  1290.         /* We're working on a number of ports based on the card ID. If the
  1291.          * firmware detects something different later (should never happen)
  1292.          * we'll have to revise it in some way then.
  1293.          */
  1294.         for ( i = 0 ; i < card->nports ; i++ )
  1295.         {
  1296.                 card->ports[i].if_ptr = &card->ports[i].pppdev;
  1297.                 card->ports[i].card   = card;
  1298.                 card->ports[i].index  = i;
  1299.                 card->ports[i].proto  = FST_HDLC;
  1300.                 card->ports[i].run    = 0;
  1301.                 dev = kmalloc ( sizeof ( struct net_device ), GFP_KERNEL );
  1302.                 if ( dev == NULL )
  1303.                 {
  1304.                         printk_err ("Cannot allocate net_device for port %dn",
  1305.                                         i );
  1306.                         /* No point going any further */
  1307.                         card->nports = i;
  1308.                         break;
  1309.                 }
  1310.                 memset ( dev, 0, sizeof ( struct net_device ));
  1311.                 card->ports[i].dev = dev;
  1312.                 if ( dev_alloc_name ( dev, FST_NDEV_NAME "%d") < 0 )
  1313.                 {
  1314.                         printk_err ("Cannot allocate i/f name for port %dn",
  1315.                                         i );
  1316.                         kfree ( dev );
  1317.                         card->nports = i;
  1318.                         break;
  1319.                 }
  1320.                 /* Fill in remainder of the net device info */
  1321.                                 /* Since this is a PCI setup this is purely
  1322.                                  * informational. Give them the buffer addresses
  1323.                                  * and basic card I/O.
  1324.                                  */
  1325.                 dev->mem_start   = card->phys_mem
  1326.                                  + BUF_OFFSET ( txBuffer[i][0][0]);
  1327.                 dev->mem_end     = card->phys_mem
  1328.                                  + BUF_OFFSET ( txBuffer[i][NUM_TX_BUFFER][0]);
  1329.                 dev->rmem_start  = card->phys_mem
  1330.                                  + BUF_OFFSET ( rxBuffer[i][0][0]);
  1331.                 dev->rmem_end    = card->phys_mem
  1332.                                  + BUF_OFFSET ( rxBuffer[i][NUM_RX_BUFFER][0]);
  1333.                 dev->base_addr   = card->pci_conf;
  1334.                 dev->irq         = card->irq;
  1335.                 dev->get_stats          = fst_get_stats;
  1336.                 dev->mtu                = FST_DEF_MTU;
  1337.                 dev->change_mtu         = fst_change_mtu;
  1338.                 dev->priv               = &card->ports[i];
  1339.                 dev->tx_queue_len       = FST_TX_QUEUE_LEN;
  1340.                 dev->type               = ARPHRD_MYTYPE;
  1341.                 dev->addr_len           = 0;
  1342.                 dev->open               = fst_open;
  1343.                 dev->stop               = fst_close;
  1344.                 dev->hard_start_xmit    = fst_start_xmit;
  1345.                 dev->do_ioctl           = fst_ioctl;
  1346.                 dev->watchdog_timeo     = FST_TX_TIMEOUT;
  1347.                 dev->tx_timeout         = fst_tx_timeout;
  1348.                 dev->flags              = IFF_POINTOPOINT|IFF_NOARP;
  1349.                 if (( err = register_netdev ( dev )) < 0 )
  1350.                 {
  1351.                         printk_err ("Cannot register %s (errno %d)n",
  1352.                                         dev->name, -err );
  1353.                         kfree ( dev );
  1354.                         card->nports = i;
  1355.                         break;
  1356.                 }
  1357.         }
  1358.         spin_lock_init ( &card->card_lock );
  1359.         printk ( KERN_INFO "%s-%s: %s IRQ%d, %d portsn",
  1360.                         card->ports[0].dev->name,
  1361.                         card->ports[card->nports-1].dev->name,
  1362.                         type_strings[card->type], card->irq, card->nports );
  1363. }
  1364. /*
  1365.  *      Initialise card when detected.
  1366.  *      Returns 0 to indicate success, or errno otherwise.
  1367.  */
  1368. static int __devinit
  1369. fst_add_one ( struct pci_dev *pdev, const struct pci_device_id *ent )
  1370. {
  1371.         static int firsttime_done = 0;
  1372.         struct fst_card_info *card;
  1373.         int err = 0;
  1374.         if ( ! firsttime_done )
  1375.         {
  1376.                 printk ( KERN_INFO "FarSync X21 driver " FST_USER_VERSION
  1377.                                 " (c) 2001 FarSite Communications Ltd.n");
  1378.                 firsttime_done = 1;
  1379.         }
  1380.         /* Allocate driver private data */
  1381.         card = kmalloc ( sizeof ( struct fst_card_info ),  GFP_KERNEL);
  1382.         if (card == NULL)
  1383.         {
  1384.                 printk_err ("FarSync card found but insufficient memory for"
  1385.                                 " driver storagen");
  1386.                 return -ENOMEM;
  1387.         }
  1388.         memset ( card, 0, sizeof ( struct fst_card_info ));
  1389.         /* Record info we need*/
  1390.         card->irq         = pdev->irq;
  1391.         card->pci_conf    = pci_resource_start ( pdev, 1 );
  1392.         card->phys_mem    = pci_resource_start ( pdev, 2 );
  1393.         card->phys_ctlmem = pci_resource_start ( pdev, 3 );
  1394.         card->type        = ent->driver_data;
  1395.         card->nports      = ( ent->driver_data == FST_TYPE_T2P ) ? 2 : 4;
  1396.         card->state       = FST_UNINIT;
  1397.         dbg ( DBG_PCI,"type %d nports %d irq %dn", card->type,
  1398.                         card->nports, card->irq );
  1399.         dbg ( DBG_PCI,"conf %04x mem %08x ctlmem %08xn",
  1400.                         card->pci_conf, card->phys_mem, card->phys_ctlmem );
  1401.         /* Check we can get access to the memory and I/O regions */
  1402.         if ( ! request_region ( card->pci_conf, 0x80,"PLX config regs"))
  1403.         {
  1404.                 printk_err ("Unable to get config I/O @ 0x%04Xn",
  1405.                                                 card->pci_conf );
  1406.                 err = -ENODEV;
  1407.                 goto error_free_card;
  1408.         }
  1409.         if ( ! request_mem_region ( card->phys_mem, FST_MEMSIZE,"Shared RAM"))
  1410.         {
  1411.                 printk_err ("Unable to get main memory @ 0x%08Xn",
  1412.                                                 card->phys_mem );
  1413.                 err = -ENODEV;
  1414.                 goto error_release_io;
  1415.         }
  1416.         if ( ! request_mem_region ( card->phys_ctlmem, 0x10,"Control memory"))
  1417.         {
  1418.                 printk_err ("Unable to get control memory @ 0x%08Xn",
  1419.                                                 card->phys_ctlmem );
  1420.                 err = -ENODEV;
  1421.                 goto error_release_mem;
  1422.         }
  1423.         /* Try to enable the device */
  1424.         if (( err = pci_enable_device ( pdev )) != 0 )
  1425.         {
  1426.                 printk_err ("Failed to enable card. Err %dn", -err );
  1427.                 goto error_release_ctlmem;
  1428.         }
  1429.         /* Get virtual addresses of memory regions */
  1430.         if (( card->mem = ioremap ( card->phys_mem, FST_MEMSIZE )) == NULL )
  1431.         {
  1432.                 printk_err ("Physical memory remap failedn");
  1433.                 err = -ENODEV;
  1434.                 goto error_release_ctlmem;
  1435.         }
  1436.         if (( card->ctlmem = ioremap ( card->phys_ctlmem, 0x10 )) == NULL )
  1437.         {
  1438.                 printk_err ("Control memory remap failedn");
  1439.                 err = -ENODEV;
  1440.                 goto error_unmap_mem;
  1441.         }
  1442.         dbg ( DBG_PCI,"kernel mem %p, ctlmem %pn", card->mem, card->ctlmem);
  1443.         /* Reset the card's processor */
  1444.         fst_cpureset ( card );
  1445.         card->state = FST_RESET;
  1446.         /* Register the interrupt handler */
  1447.         if ( request_irq ( card->irq, fst_intr, SA_SHIRQ, FST_DEV_NAME, card ))
  1448.         {
  1449.                 printk_err ("Unable to register interrupt %dn", card->irq );
  1450.                 err = -ENODEV;
  1451.                 goto error_unmap_ctlmem;
  1452.         }
  1453.         /* Record driver data for later use */
  1454.         pci_set_drvdata(pdev, card);
  1455.         /* Remainder of card setup */
  1456.         fst_init_card ( card );
  1457.         return 0;                       /* Success */
  1458.                                         /* Failure. Release resources */
  1459. error_unmap_ctlmem:
  1460.         iounmap ( card->ctlmem );
  1461. error_unmap_mem:
  1462.         iounmap ( card->mem );
  1463. error_release_ctlmem:
  1464.         release_mem_region ( card->phys_ctlmem, 0x10 );
  1465. error_release_mem:
  1466.         release_mem_region ( card->phys_mem, FST_MEMSIZE );
  1467. error_release_io:
  1468.         release_region ( card->pci_conf, 0x80 );
  1469. error_free_card:
  1470.         kfree ( card );
  1471.         return err;
  1472. }
  1473. /*
  1474.  *      Cleanup and close down a card
  1475.  */
  1476. static void __devexit
  1477. fst_remove_one ( struct pci_dev *pdev )
  1478. {
  1479.         struct fst_card_info *card;
  1480.         int i;
  1481.         card = pci_get_drvdata(pdev);
  1482.         for ( i = 0 ; i < card->nports ; i++ )
  1483.         {
  1484.                 unregister_netdev ( card->ports[i].dev );
  1485.                 kfree ( card->ports[i].dev );
  1486.         }
  1487.         fst_disable_intr ( card );
  1488.         free_irq ( card->irq, card );
  1489.         iounmap ( card->ctlmem );
  1490.         iounmap ( card->mem );
  1491.         release_mem_region ( card->phys_ctlmem, 0x10 );
  1492.         release_mem_region ( card->phys_mem, FST_MEMSIZE );
  1493.         release_region ( card->pci_conf, 0x80 );
  1494.         kfree ( card );
  1495. }
  1496. static struct pci_driver fst_driver = {
  1497.         name:           FST_NAME,
  1498.         id_table:       fst_pci_dev_id,
  1499.         probe:          fst_add_one,
  1500.         remove:         __devexit_p(fst_remove_one),
  1501.         suspend:        NULL,
  1502.         resume:         NULL,
  1503. };
  1504. static int __init
  1505. fst_init(void)
  1506. {
  1507.         return pci_module_init ( &fst_driver );
  1508. }
  1509. static void __exit
  1510. fst_cleanup_module(void)
  1511. {
  1512.         pci_unregister_driver ( &fst_driver );
  1513. }
  1514. module_init ( fst_init );
  1515. module_exit ( fst_cleanup_module );
  1516. MODULE_LICENSE("GPL");