Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1#define	USE_PCI_CLOCK
   2static const char rcsid[] =
   3"Revision: 3.4.5 Date: 2002/03/07 ";
   4
   5/*
   6 * pc300.c	Cyclades-PC300(tm) Driver.
   7 *
   8 * Author:	Ivan Passos <ivan@cyclades.com>
   9 * Maintainer:	PC300 Maintainer <pc300@cyclades.com>
  10 *
  11 * Copyright:	(c) 1999-2003 Cyclades Corp.
  12 *
  13 *	This program is free software; you can redistribute it and/or
  14 *	modify it under the terms of the GNU General Public License
  15 *	as published by the Free Software Foundation; either version
  16 *	2 of the License, or (at your option) any later version.
  17 *	
  18 *	Using tabstop = 4.
  19 * 
  20 * $Log: pc300_drv.c,v $
  21 * Revision 3.23  2002/03/20 13:58:40  henrique
  22 * Fixed ortographic mistakes
  23 *
  24 * Revision 3.22  2002/03/13 16:56:56  henrique
  25 * Take out the debug messages
  26 *
  27 * Revision 3.21  2002/03/07 14:17:09  henrique
  28 * License data fixed
  29 *
  30 * Revision 3.20  2002/01/17 17:58:52  ivan
  31 * Support for PC300-TE/M (PMC).
  32 *
  33 * Revision 3.19  2002/01/03 17:08:47  daniela
  34 * Enables DMA reception when the SCA-II disables it improperly.
  35 *
  36 * Revision 3.18  2001/12/03 18:47:50  daniela
  37 * Esthetic changes.
  38 *
  39 * Revision 3.17  2001/10/19 16:50:13  henrique
  40 * Patch to kernel 2.4.12 and new generic hdlc.
  41 *
  42 * Revision 3.16  2001/10/16 15:12:31  regina
  43 * clear statistics
  44 *
  45 * Revision 3.11 to 3.15  2001/10/11 20:26:04  daniela
  46 * More DMA fixes for noisy lines.
  47 * Return the size of bad frames in dma_get_rx_frame_size, so that the Rx buffer
  48 * descriptors can be cleaned by dma_buf_read (called in cpc_net_rx).
  49 * Renamed dma_start routine to rx_dma_start. Improved Rx statistics.
  50 * Fixed BOF interrupt treatment. Created dma_start routine.
  51 * Changed min and max to cpc_min and cpc_max.
  52 *
  53 * Revision 3.10  2001/08/06 12:01:51  regina
  54 * Fixed problem in DSR_DE bit.
  55 *
  56 * Revision 3.9  2001/07/18 19:27:26  daniela
  57 * Added some history comments.
  58 *
  59 * Revision 3.8  2001/07/12 13:11:19  regina
  60 * bug fix - DCD-OFF in pc300 tty driver
  61 *
  62 * Revision 3.3 to 3.7  2001/07/06 15:00:20  daniela
  63 * Removing kernel 2.4.3 and previous support.
  64 * DMA transmission bug fix.
  65 * MTU check in cpc_net_rx fixed.
  66 * Boot messages reviewed.
  67 * New configuration parameters (line code, CRC calculation and clock).
  68 *
  69 * Revision 3.2 2001/06/22 13:13:02  regina
  70 * MLPPP implementation. Changed the header of message trace to include
  71 * the device name. New format : "hdlcX[R/T]: ".
  72 * Default configuration changed.
  73 *
  74 * Revision 3.1 2001/06/15 regina
  75 * in cpc_queue_xmit, netif_stop_queue is called if don't have free descriptor
  76 * upping major version number
  77 *
  78 * Revision 1.1.1.1  2001/06/13 20:25:04  daniela
  79 * PC300 initial CVS version (3.4.0-pre1)
  80 *
  81 * Revision 3.0.1.2 2001/06/08 daniela
  82 * Did some changes in the DMA programming implementation to avoid the 
  83 * occurrence of a SCA-II bug when CDA is accessed during a DMA transfer.
  84 *
  85 * Revision 3.0.1.1 2001/05/02 daniela
  86 * Added kernel 2.4.3 support.
  87 * 
  88 * Revision 3.0.1.0 2001/03/13 daniela, henrique
  89 * Added Frame Relay Support.
  90 * Driver now uses HDLC generic driver to provide protocol support.
  91 * 
  92 * Revision 3.0.0.8 2001/03/02 daniela
  93 * Fixed ram size detection. 
  94 * Changed SIOCGPC300CONF ioctl, to give hw information to pc300util.
  95 * 
  96 * Revision 3.0.0.7 2001/02/23 daniela
  97 * netif_stop_queue called before the SCA-II transmition commands in 
  98 * cpc_queue_xmit, and with interrupts disabled to avoid race conditions with 
  99 * transmition interrupts.
 100 * Fixed falc_check_status for Unframed E1.
 101 * 
 102 * Revision 3.0.0.6 2000/12/13 daniela
 103 * Implemented pc300util support: trace, statistics, status and loopback
 104 * tests for the PC300 TE boards.
 105 * 
 106 * Revision 3.0.0.5 2000/12/12 ivan
 107 * Added support for Unframed E1.
 108 * Implemented monitor mode.
 109 * Fixed DCD sensitivity on the second channel.
 110 * Driver now complies with new PCI kernel architecture.
 111 *
 112 * Revision 3.0.0.4 2000/09/28 ivan
 113 * Implemented DCD sensitivity.
 114 * Moved hardware-specific open to the end of cpc_open, to avoid race
 115 * conditions with early reception interrupts.
 116 * Included code for [request|release]_mem_region().
 117 * Changed location of pc300.h .
 118 * Minor code revision (contrib. of Jeff Garzik).
 119 *
 120 * Revision 3.0.0.3 2000/07/03 ivan
 121 * Previous bugfix for the framing errors with external clock made X21
 122 * boards stop working. This version fixes it.
 123 *
 124 * Revision 3.0.0.2 2000/06/23 ivan
 125 * Revisited cpc_queue_xmit to prevent race conditions on Tx DMA buffer
 126 * handling when Tx timeouts occur.
 127 * Revisited Rx statistics.
 128 * Fixed a bug in the SCA-II programming that would cause framing errors
 129 * when external clock was configured.
 130 *
 131 * Revision 3.0.0.1 2000/05/26 ivan
 132 * Added logic in the SCA interrupt handler so that no board can monopolize
 133 * the driver.
 134 * Request PLX I/O region, although driver doesn't use it, to avoid
 135 * problems with other drivers accessing it.
 136 *
 137 * Revision 3.0.0.0 2000/05/15 ivan
 138 * Did some changes in the DMA programming implementation to avoid the
 139 * occurrence of a SCA-II bug in the second channel.
 140 * Implemented workaround for PLX9050 bug that would cause a system lockup
 141 * in certain systems, depending on the MMIO addresses allocated to the
 142 * board.
 143 * Fixed the FALC chip programming to avoid synchronization problems in the
 144 * second channel (TE only).
 145 * Implemented a cleaner and faster Tx DMA descriptor cleanup procedure in
 146 * cpc_queue_xmit().
 147 * Changed the built-in driver implementation so that the driver can use the
 148 * general 'hdlcN' naming convention instead of proprietary device names.
 149 * Driver load messages are now device-centric, instead of board-centric.
 150 * Dynamic allocation of net_device structures.
 151 * Code is now compliant with the new module interface (module_[init|exit]).
 152 * Make use of the PCI helper functions to access PCI resources.
 153 *
 154 * Revision 2.0.0.0 2000/04/15 ivan
 155 * Added support for the PC300/TE boards (T1/FT1/E1/FE1).
 156 *
 157 * Revision 1.1.0.0 2000/02/28 ivan
 158 * Major changes in the driver architecture.
 159 * Softnet compliancy implemented.
 160 * Driver now reports physical instead of virtual memory addresses.
 161 * Added cpc_change_mtu function.
 162 *
 163 * Revision 1.0.0.0 1999/12/16 ivan
 164 * First official release.
 165 * Support for 1- and 2-channel boards (which use distinct PCI Device ID's).
 166 * Support for monolythic installation (i.e., drv built into the kernel).
 167 * X.25 additional checking when lapb_[dis]connect_request returns an error.
 168 * SCA programming now covers X.21 as well.
 169 *
 170 * Revision 0.3.1.0 1999/11/18 ivan
 171 * Made X.25 support configuration-dependent (as it depends on external 
 172 * modules to work).
 173 * Changed X.25-specific function names to comply with adopted convention.
 174 * Fixed typos in X.25 functions that would cause compile errors (Daniela).
 175 * Fixed bug in ch_config that would disable interrupts on a previously 
 176 * enabled channel if the other channel on the same board was enabled later.
 177 *
 178 * Revision 0.3.0.0 1999/11/16 daniela
 179 * X.25 support.
 180 *
 181 * Revision 0.2.3.0 1999/11/15 ivan
 182 * Function cpc_ch_status now provides more detailed information.
 183 * Added support for X.21 clock configuration.
 184 * Changed TNR1 setting in order to prevent Tx FIFO overaccesses by the SCA.
 185 * Now using PCI clock instead of internal oscillator clock for the SCA.
 186 *
 187 * Revision 0.2.2.0 1999/11/10 ivan
 188 * Changed the *_dma_buf_check functions so that they would print only 
 189 * the useful info instead of the whole buffer descriptor bank.
 190 * Fixed bug in cpc_queue_xmit that would eventually crash the system 
 191 * in case of a packet drop.
 192 * Implemented TX underrun handling.
 193 * Improved SCA fine tuning to boost up its performance.
 194 *
 195 * Revision 0.2.1.0 1999/11/03 ivan
 196 * Added functions *dma_buf_pt_init to allow independent initialization 
 197 * of the next-descr. and DMA buffer pointers on the DMA descriptors.
 198 * Kernel buffer release and tbusy clearing is now done in the interrupt 
 199 * handler.
 200 * Fixed bug in cpc_open that would cause an interface reopen to fail.
 201 * Added a protocol-specific code section in cpc_net_rx.
 202 * Removed printk level defs (they might be added back after the beta phase).
 203 *
 204 * Revision 0.2.0.0 1999/10/28 ivan
 205 * Revisited the code so that new protocols can be easily added / supported. 
 206 *
 207 * Revision 0.1.0.1 1999/10/20 ivan
 208 * Mostly "esthetic" changes.
 209 *
 210 * Revision 0.1.0.0 1999/10/11 ivan
 211 * Initial version.
 212 *
 213 */
 214
 215#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 216
 217#include <linux/module.h>
 218#include <linux/kernel.h>
 219#include <linux/mm.h>
 220#include <linux/ioport.h>
 221#include <linux/pci.h>
 222#include <linux/errno.h>
 223#include <linux/string.h>
 224#include <linux/init.h>
 225#include <linux/delay.h>
 226#include <linux/net.h>
 227#include <linux/skbuff.h>
 228#include <linux/if_arp.h>
 229#include <linux/netdevice.h>
 230#include <linux/etherdevice.h>
 231#include <linux/spinlock.h>
 232#include <linux/if.h>
 233#include <linux/slab.h>
 234#include <net/arp.h>
 235
 236#include <asm/io.h>
 237#include <asm/uaccess.h>
 238
 239#include "pc300.h"
 240
 241#define	CPC_LOCK(card,flags)		\
 242		do {						\
 243		spin_lock_irqsave(&card->card_lock, flags);	\
 244		} while (0)
 245
 246#define CPC_UNLOCK(card,flags)			\
 247		do {							\
 248		spin_unlock_irqrestore(&card->card_lock, flags);	\
 249		} while (0)
 250
 251#undef	PC300_DEBUG_PCI
 252#undef	PC300_DEBUG_INTR
 253#undef	PC300_DEBUG_TX
 254#undef	PC300_DEBUG_RX
 255#undef	PC300_DEBUG_OTHER
 256
 257static DEFINE_PCI_DEVICE_TABLE(cpc_pci_dev_id) = {
 258	/* PC300/RSV or PC300/X21, 2 chan */
 259	{0x120e, 0x300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x300},
 260	/* PC300/RSV or PC300/X21, 1 chan */
 261	{0x120e, 0x301, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x301},
 262	/* PC300/TE, 2 chan */
 263	{0x120e, 0x310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x310},
 264	/* PC300/TE, 1 chan */
 265	{0x120e, 0x311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x311},
 266	/* PC300/TE-M, 2 chan */
 267	{0x120e, 0x320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x320},
 268	/* PC300/TE-M, 1 chan */
 269	{0x120e, 0x321, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x321},
 270	/* End of table */
 271	{0,},
 272};
 273MODULE_DEVICE_TABLE(pci, cpc_pci_dev_id);
 274
 275#ifndef cpc_min
 276#define	cpc_min(a,b)	(((a)<(b))?(a):(b))
 277#endif
 278#ifndef cpc_max
 279#define	cpc_max(a,b)	(((a)>(b))?(a):(b))
 280#endif
 281
 282/* prototypes */
 283static void tx_dma_buf_pt_init(pc300_t *, int);
 284static void tx_dma_buf_init(pc300_t *, int);
 285static void rx_dma_buf_pt_init(pc300_t *, int);
 286static void rx_dma_buf_init(pc300_t *, int);
 287static void tx_dma_buf_check(pc300_t *, int);
 288static void rx_dma_buf_check(pc300_t *, int);
 289static irqreturn_t cpc_intr(int, void *);
 290static int clock_rate_calc(u32, u32, int *);
 291static u32 detect_ram(pc300_t *);
 292static void plx_init(pc300_t *);
 293static void cpc_trace(struct net_device *, struct sk_buff *, char);
 294static int cpc_attach(struct net_device *, unsigned short, unsigned short);
 295static int cpc_close(struct net_device *dev);
 296
 297#ifdef CONFIG_PC300_MLPPP
 298void cpc_tty_init(pc300dev_t * dev);
 299void cpc_tty_unregister_service(pc300dev_t * pc300dev);
 300void cpc_tty_receive(pc300dev_t * pc300dev);
 301void cpc_tty_trigger_poll(pc300dev_t * pc300dev);
 302void cpc_tty_reset_var(void);
 303#endif
 304
 305/************************/
 306/***   DMA Routines   ***/
 307/************************/
 308static void tx_dma_buf_pt_init(pc300_t * card, int ch)
 309{
 310	int i;
 311	int ch_factor = ch * N_DMA_TX_BUF;
 312	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
 313			               + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
 314
 315	for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) {
 316		cpc_writel(&ptdescr->next, (u32)(DMA_TX_BD_BASE +
 317			(ch_factor + ((i + 1) & (N_DMA_TX_BUF - 1))) * sizeof(pcsca_bd_t)));
 318		cpc_writel(&ptdescr->ptbuf,
 319			   (u32)(DMA_TX_BASE + (ch_factor + i) * BD_DEF_LEN));
 320	}
 321}
 322
 323static void tx_dma_buf_init(pc300_t * card, int ch)
 324{
 325	int i;
 326	int ch_factor = ch * N_DMA_TX_BUF;
 327	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
 328			       + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
 329
 330	for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) {
 331		memset_io(ptdescr, 0, sizeof(pcsca_bd_t));
 332		cpc_writew(&ptdescr->len, 0);
 333		cpc_writeb(&ptdescr->status, DST_OSB);
 334	}
 335	tx_dma_buf_pt_init(card, ch);
 336}
 337
 338static void rx_dma_buf_pt_init(pc300_t * card, int ch)
 339{
 340	int i;
 341	int ch_factor = ch * N_DMA_RX_BUF;
 342	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
 343				       + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
 344
 345	for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) {
 346		cpc_writel(&ptdescr->next, (u32)(DMA_RX_BD_BASE +
 347			(ch_factor + ((i + 1) & (N_DMA_RX_BUF - 1))) * sizeof(pcsca_bd_t)));
 348		cpc_writel(&ptdescr->ptbuf,
 349			   (u32)(DMA_RX_BASE + (ch_factor + i) * BD_DEF_LEN));
 350	}
 351}
 352
 353static void rx_dma_buf_init(pc300_t * card, int ch)
 354{
 355	int i;
 356	int ch_factor = ch * N_DMA_RX_BUF;
 357	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase
 358				       + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
 359
 360	for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) {
 361		memset_io(ptdescr, 0, sizeof(pcsca_bd_t));
 362		cpc_writew(&ptdescr->len, 0);
 363		cpc_writeb(&ptdescr->status, 0);
 364	}
 365	rx_dma_buf_pt_init(card, ch);
 366}
 367
 368static void tx_dma_buf_check(pc300_t * card, int ch)
 369{
 370	volatile pcsca_bd_t __iomem *ptdescr;
 371	int i;
 372	u16 first_bd = card->chan[ch].tx_first_bd;
 373	u16 next_bd = card->chan[ch].tx_next_bd;
 374
 375	printk("#CH%d: f_bd = %d(0x%08zx), n_bd = %d(0x%08zx)\n", ch,
 376	       first_bd, TX_BD_ADDR(ch, first_bd),
 377	       next_bd, TX_BD_ADDR(ch, next_bd));
 378	for (i = first_bd,
 379	     ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, first_bd));
 380	     i != ((next_bd + 1) & (N_DMA_TX_BUF - 1));
 381	     i = (i + 1) & (N_DMA_TX_BUF - 1), 
 382		 ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i))) {
 383		printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
 384		       ch, i, cpc_readl(&ptdescr->next),
 385		       cpc_readl(&ptdescr->ptbuf),
 386		       cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len));
 387	}
 388	printk("\n");
 389}
 390
 391#ifdef	PC300_DEBUG_OTHER
 392/* Show all TX buffer descriptors */
 393static void tx1_dma_buf_check(pc300_t * card, int ch)
 394{
 395	volatile pcsca_bd_t __iomem *ptdescr;
 396	int i;
 397	u16 first_bd = card->chan[ch].tx_first_bd;
 398	u16 next_bd = card->chan[ch].tx_next_bd;
 399	u32 scabase = card->hw.scabase;
 400
 401	printk ("\nnfree_tx_bd = %d\n", card->chan[ch].nfree_tx_bd);
 402	printk("#CH%d: f_bd = %d(0x%08x), n_bd = %d(0x%08x)\n", ch,
 403	       first_bd, TX_BD_ADDR(ch, first_bd),
 404	       next_bd, TX_BD_ADDR(ch, next_bd));
 405	printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n",
 406	       cpc_readl(scabase + DTX_REG(CDAL, ch)),
 407	       cpc_readl(scabase + DTX_REG(EDAL, ch)));
 408	for (i = 0; i < N_DMA_TX_BUF; i++) {
 409		ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i));
 410		printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
 411		       ch, i, cpc_readl(&ptdescr->next),
 412		       cpc_readl(&ptdescr->ptbuf),
 413		       cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len));
 414	}
 415	printk("\n");
 416}
 417#endif
 418
 419static void rx_dma_buf_check(pc300_t * card, int ch)
 420{
 421	volatile pcsca_bd_t __iomem *ptdescr;
 422	int i;
 423	u16 first_bd = card->chan[ch].rx_first_bd;
 424	u16 last_bd = card->chan[ch].rx_last_bd;
 425	int ch_factor;
 426
 427	ch_factor = ch * N_DMA_RX_BUF;
 428	printk("#CH%d: f_bd = %d, l_bd = %d\n", ch, first_bd, last_bd);
 429	for (i = 0, ptdescr = (card->hw.rambase +
 430					      DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t));
 431	     i < N_DMA_RX_BUF; i++, ptdescr++) {
 432		if (cpc_readb(&ptdescr->status) & DST_OSB)
 433			printk ("\n CH%d RX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d",
 434				 ch, i, cpc_readl(&ptdescr->next),
 435				 cpc_readl(&ptdescr->ptbuf),
 436				 cpc_readb(&ptdescr->status),
 437				 cpc_readw(&ptdescr->len));
 438	}
 439	printk("\n");
 440}
 441
 442static int dma_get_rx_frame_size(pc300_t * card, int ch)
 443{
 444	volatile pcsca_bd_t __iomem *ptdescr;
 445	u16 first_bd = card->chan[ch].rx_first_bd;
 446	int rcvd = 0;
 447	volatile u8 status;
 448
 449	ptdescr = (card->hw.rambase + RX_BD_ADDR(ch, first_bd));
 450	while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
 451		rcvd += cpc_readw(&ptdescr->len);
 452		first_bd = (first_bd + 1) & (N_DMA_RX_BUF - 1);
 453		if ((status & DST_EOM) || (first_bd == card->chan[ch].rx_last_bd)) {
 454			/* Return the size of a good frame or incomplete bad frame 
 455			* (dma_buf_read will clean the buffer descriptors in this case). */
 456			return rcvd;
 457		}
 458		ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next));
 459	}
 460	return -1;
 461}
 462
 463/*
 464 * dma_buf_write: writes a frame to the Tx DMA buffers
 465 * NOTE: this function writes one frame at a time.
 466 */
 467static int dma_buf_write(pc300_t *card, int ch, u8 *ptdata, int len)
 468{
 469	int i, nchar;
 470	volatile pcsca_bd_t __iomem *ptdescr;
 471	int tosend = len;
 472	u8 nbuf = ((len - 1) / BD_DEF_LEN) + 1;
 473
 474	if (nbuf >= card->chan[ch].nfree_tx_bd) {
 475		return -ENOMEM;
 476	}
 477
 478	for (i = 0; i < nbuf; i++) {
 479		ptdescr = (card->hw.rambase +
 480					  TX_BD_ADDR(ch, card->chan[ch].tx_next_bd));
 481		nchar = cpc_min(BD_DEF_LEN, tosend);
 482		if (cpc_readb(&ptdescr->status) & DST_OSB) {
 483			memcpy_toio((card->hw.rambase + cpc_readl(&ptdescr->ptbuf)),
 484				    &ptdata[len - tosend], nchar);
 485			cpc_writew(&ptdescr->len, nchar);
 486			card->chan[ch].nfree_tx_bd--;
 487			if ((i + 1) == nbuf) {
 488				/* This must be the last BD to be used */
 489				cpc_writeb(&ptdescr->status, DST_EOM);
 490			} else {
 491				cpc_writeb(&ptdescr->status, 0);
 492			}
 493		} else {
 494			return -ENOMEM;
 495		}
 496		tosend -= nchar;
 497		card->chan[ch].tx_next_bd =
 498			(card->chan[ch].tx_next_bd + 1) & (N_DMA_TX_BUF - 1);
 499	}
 500	/* If it gets to here, it means we have sent the whole frame */
 501	return 0;
 502}
 503
 504/*
 505 * dma_buf_read: reads a frame from the Rx DMA buffers
 506 * NOTE: this function reads one frame at a time.
 507 */
 508static int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb)
 509{
 510	int nchar;
 511	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 512	volatile pcsca_bd_t __iomem *ptdescr;
 513	int rcvd = 0;
 514	volatile u8 status;
 515
 516	ptdescr = (card->hw.rambase +
 517				  RX_BD_ADDR(ch, chan->rx_first_bd));
 518	while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) {
 519		nchar = cpc_readw(&ptdescr->len);
 520		if ((status & (DST_OVR | DST_CRC | DST_RBIT | DST_SHRT | DST_ABT)) ||
 521		    (nchar > BD_DEF_LEN)) {
 522
 523			if (nchar > BD_DEF_LEN)
 524				status |= DST_RBIT;
 525			rcvd = -status;
 526			/* Discard remaining descriptors used by the bad frame */
 527			while (chan->rx_first_bd != chan->rx_last_bd) {
 528				cpc_writeb(&ptdescr->status, 0);
 529				chan->rx_first_bd = (chan->rx_first_bd+1) & (N_DMA_RX_BUF-1);
 530				if (status & DST_EOM)
 531					break;
 532				ptdescr = (card->hw.rambase +
 533							  cpc_readl(&ptdescr->next));
 534				status = cpc_readb(&ptdescr->status);
 535			}
 536			break;
 537		}
 538		if (nchar != 0) {
 539			if (skb) {
 540				memcpy_fromio(skb_put(skb, nchar),
 541				 (card->hw.rambase+cpc_readl(&ptdescr->ptbuf)),nchar);
 542			}
 543			rcvd += nchar;
 544		}
 545		cpc_writeb(&ptdescr->status, 0);
 546		cpc_writeb(&ptdescr->len, 0);
 547		chan->rx_first_bd = (chan->rx_first_bd + 1) & (N_DMA_RX_BUF - 1);
 548
 549		if (status & DST_EOM)
 550			break;
 551
 552		ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next));
 553	}
 554
 555	if (rcvd != 0) {
 556		/* Update pointer */
 557		chan->rx_last_bd = (chan->rx_first_bd - 1) & (N_DMA_RX_BUF - 1);
 558		/* Update EDA */
 559		cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch),
 560			   RX_BD_ADDR(ch, chan->rx_last_bd));
 561	}
 562	return rcvd;
 563}
 564
 565static void tx_dma_stop(pc300_t * card, int ch)
 566{
 567	void __iomem *scabase = card->hw.scabase;
 568	u8 drr_ena_bit = 1 << (5 + 2 * ch);
 569	u8 drr_rst_bit = 1 << (1 + 2 * ch);
 570
 571	/* Disable DMA */
 572	cpc_writeb(scabase + DRR, drr_ena_bit);
 573	cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
 574}
 575
 576static void rx_dma_stop(pc300_t * card, int ch)
 577{
 578	void __iomem *scabase = card->hw.scabase;
 579	u8 drr_ena_bit = 1 << (4 + 2 * ch);
 580	u8 drr_rst_bit = 1 << (2 * ch);
 581
 582	/* Disable DMA */
 583	cpc_writeb(scabase + DRR, drr_ena_bit);
 584	cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit);
 585}
 586
 587static void rx_dma_start(pc300_t * card, int ch)
 588{
 589	void __iomem *scabase = card->hw.scabase;
 590	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 591	
 592	/* Start DMA */
 593	cpc_writel(scabase + DRX_REG(CDAL, ch),
 594		   RX_BD_ADDR(ch, chan->rx_first_bd));
 595	if (cpc_readl(scabase + DRX_REG(CDAL,ch)) !=
 596				  RX_BD_ADDR(ch, chan->rx_first_bd)) {
 597		cpc_writel(scabase + DRX_REG(CDAL, ch),
 598				   RX_BD_ADDR(ch, chan->rx_first_bd));
 599	}
 600	cpc_writel(scabase + DRX_REG(EDAL, ch),
 601		   RX_BD_ADDR(ch, chan->rx_last_bd));
 602	cpc_writew(scabase + DRX_REG(BFLL, ch), BD_DEF_LEN);
 603	cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
 604	if (!(cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
 605	cpc_writeb(scabase + DSR_RX(ch), DSR_DE);
 606	}
 607}
 608
 609/*************************/
 610/***   FALC Routines   ***/
 611/*************************/
 612static void falc_issue_cmd(pc300_t *card, int ch, u8 cmd)
 613{
 614	void __iomem *falcbase = card->hw.falcbase;
 615	unsigned long i = 0;
 616
 617	while (cpc_readb(falcbase + F_REG(SIS, ch)) & SIS_CEC) {
 618		if (i++ >= PC300_FALC_MAXLOOP) {
 619			printk("%s: FALC command locked(cmd=0x%x).\n",
 620			       card->chan[ch].d.name, cmd);
 621			break;
 622		}
 623	}
 624	cpc_writeb(falcbase + F_REG(CMDR, ch), cmd);
 625}
 626
 627static void falc_intr_enable(pc300_t * card, int ch)
 628{
 629	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 630	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
 631	falc_t *pfalc = (falc_t *) & chan->falc;
 632	void __iomem *falcbase = card->hw.falcbase;
 633
 634	/* Interrupt pins are open-drain */
 635	cpc_writeb(falcbase + F_REG(IPC, ch),
 636		   cpc_readb(falcbase + F_REG(IPC, ch)) & ~IPC_IC0);
 637	/* Conters updated each second */
 638	cpc_writeb(falcbase + F_REG(FMR1, ch),
 639		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_ECM);
 640	/* Enable SEC and ES interrupts  */
 641	cpc_writeb(falcbase + F_REG(IMR3, ch),
 642		   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~(IMR3_SEC | IMR3_ES));
 643	if (conf->fr_mode == PC300_FR_UNFRAMED) {
 644		cpc_writeb(falcbase + F_REG(IMR4, ch),
 645			   cpc_readb(falcbase + F_REG(IMR4, ch)) & ~(IMR4_LOS));
 646	} else {
 647		cpc_writeb(falcbase + F_REG(IMR4, ch),
 648			   cpc_readb(falcbase + F_REG(IMR4, ch)) &
 649			   ~(IMR4_LFA | IMR4_AIS | IMR4_LOS | IMR4_SLIP));
 650	}
 651	if (conf->media == IF_IFACE_T1) {
 652		cpc_writeb(falcbase + F_REG(IMR3, ch),
 653			   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
 654	} else {
 655		cpc_writeb(falcbase + F_REG(IPC, ch),
 656			   cpc_readb(falcbase + F_REG(IPC, ch)) | IPC_SCI);
 657		if (conf->fr_mode == PC300_FR_UNFRAMED) {
 658			cpc_writeb(falcbase + F_REG(IMR2, ch),
 659				   cpc_readb(falcbase + F_REG(IMR2, ch)) & ~(IMR2_LOS));
 660		} else {
 661			cpc_writeb(falcbase + F_REG(IMR2, ch),
 662				   cpc_readb(falcbase + F_REG(IMR2, ch)) &
 663				   ~(IMR2_FAR | IMR2_LFA | IMR2_AIS | IMR2_LOS));
 664			if (pfalc->multiframe_mode) {
 665				cpc_writeb(falcbase + F_REG(IMR2, ch),
 666					   cpc_readb(falcbase + F_REG(IMR2, ch)) & 
 667					   ~(IMR2_T400MS | IMR2_MFAR));
 668			} else {
 669				cpc_writeb(falcbase + F_REG(IMR2, ch),
 670					   cpc_readb(falcbase + F_REG(IMR2, ch)) | 
 671					   IMR2_T400MS | IMR2_MFAR);
 672			}
 673		}
 674	}
 675}
 676
 677static void falc_open_timeslot(pc300_t * card, int ch, int timeslot)
 678{
 679	void __iomem *falcbase = card->hw.falcbase;
 680	u8 tshf = card->chan[ch].falc.offset;
 681
 682	cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch),
 683		   cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) & 
 684		   	~(0x80 >> ((timeslot - tshf) & 0x07)));
 685	cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch),
 686		   cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) | 
 687   			(0x80 >> (timeslot & 0x07)));
 688	cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch),
 689		   cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) | 
 690			(0x80 >> (timeslot & 0x07)));
 691}
 692
 693static void falc_close_timeslot(pc300_t * card, int ch, int timeslot)
 694{
 695	void __iomem *falcbase = card->hw.falcbase;
 696	u8 tshf = card->chan[ch].falc.offset;
 697
 698	cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch),
 699		   cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) | 
 700		   (0x80 >> ((timeslot - tshf) & 0x07)));
 701	cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch),
 702		   cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) & 
 703		   ~(0x80 >> (timeslot & 0x07)));
 704	cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch),
 705		   cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) & 
 706		   ~(0x80 >> (timeslot & 0x07)));
 707}
 708
 709static void falc_close_all_timeslots(pc300_t * card, int ch)
 710{
 711	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 712	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
 713	void __iomem *falcbase = card->hw.falcbase;
 714
 715	cpc_writeb(falcbase + F_REG(ICB1, ch), 0xff);
 716	cpc_writeb(falcbase + F_REG(TTR1, ch), 0);
 717	cpc_writeb(falcbase + F_REG(RTR1, ch), 0);
 718	cpc_writeb(falcbase + F_REG(ICB2, ch), 0xff);
 719	cpc_writeb(falcbase + F_REG(TTR2, ch), 0);
 720	cpc_writeb(falcbase + F_REG(RTR2, ch), 0);
 721	cpc_writeb(falcbase + F_REG(ICB3, ch), 0xff);
 722	cpc_writeb(falcbase + F_REG(TTR3, ch), 0);
 723	cpc_writeb(falcbase + F_REG(RTR3, ch), 0);
 724	if (conf->media == IF_IFACE_E1) {
 725		cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
 726		cpc_writeb(falcbase + F_REG(TTR4, ch), 0);
 727		cpc_writeb(falcbase + F_REG(RTR4, ch), 0);
 728	}
 729}
 730
 731static void falc_open_all_timeslots(pc300_t * card, int ch)
 732{
 733	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 734	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
 735	void __iomem *falcbase = card->hw.falcbase;
 736
 737	cpc_writeb(falcbase + F_REG(ICB1, ch), 0);
 738	if (conf->fr_mode == PC300_FR_UNFRAMED) {
 739		cpc_writeb(falcbase + F_REG(TTR1, ch), 0xff);
 740		cpc_writeb(falcbase + F_REG(RTR1, ch), 0xff);
 741	} else {
 742		/* Timeslot 0 is never enabled */
 743		cpc_writeb(falcbase + F_REG(TTR1, ch), 0x7f);
 744		cpc_writeb(falcbase + F_REG(RTR1, ch), 0x7f);
 745	}
 746	cpc_writeb(falcbase + F_REG(ICB2, ch), 0);
 747	cpc_writeb(falcbase + F_REG(TTR2, ch), 0xff);
 748	cpc_writeb(falcbase + F_REG(RTR2, ch), 0xff);
 749	cpc_writeb(falcbase + F_REG(ICB3, ch), 0);
 750	cpc_writeb(falcbase + F_REG(TTR3, ch), 0xff);
 751	cpc_writeb(falcbase + F_REG(RTR3, ch), 0xff);
 752	if (conf->media == IF_IFACE_E1) {
 753		cpc_writeb(falcbase + F_REG(ICB4, ch), 0);
 754		cpc_writeb(falcbase + F_REG(TTR4, ch), 0xff);
 755		cpc_writeb(falcbase + F_REG(RTR4, ch), 0xff);
 756	} else {
 757		cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff);
 758		cpc_writeb(falcbase + F_REG(TTR4, ch), 0x80);
 759		cpc_writeb(falcbase + F_REG(RTR4, ch), 0x80);
 760	}
 761}
 762
 763static void falc_init_timeslot(pc300_t * card, int ch)
 764{
 765	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 766	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
 767	falc_t *pfalc = (falc_t *) & chan->falc;
 768	int tslot;
 769
 770	for (tslot = 0; tslot < pfalc->num_channels; tslot++) {
 771		if (conf->tslot_bitmap & (1 << tslot)) {
 772			// Channel enabled
 773			falc_open_timeslot(card, ch, tslot + 1);
 774		} else {
 775			// Channel disabled
 776			falc_close_timeslot(card, ch, tslot + 1);
 777		}
 778	}
 779}
 780
 781static void falc_enable_comm(pc300_t * card, int ch)
 782{
 783	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 784	falc_t *pfalc = (falc_t *) & chan->falc;
 785
 786	if (pfalc->full_bandwidth) {
 787		falc_open_all_timeslots(card, ch);
 788	} else {
 789		falc_init_timeslot(card, ch);
 790	}
 791	// CTS/DCD ON
 792	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
 793		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
 794		   ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch)));
 795}
 796
 797static void falc_disable_comm(pc300_t * card, int ch)
 798{
 799	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 800	falc_t *pfalc = (falc_t *) & chan->falc;
 801
 802	if (pfalc->loop_active != 2) {
 803		falc_close_all_timeslots(card, ch);
 804	}
 805	// CTS/DCD OFF
 806	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
 807		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
 808		   ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch)));
 809}
 810
 811static void falc_init_t1(pc300_t * card, int ch)
 812{
 813	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 814	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
 815	falc_t *pfalc = (falc_t *) & chan->falc;
 816	void __iomem *falcbase = card->hw.falcbase;
 817	u8 dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0);
 818
 819	/* Switch to T1 mode (PCM 24) */
 820	cpc_writeb(falcbase + F_REG(FMR1, ch), FMR1_PMOD);
 821
 822	/* Wait 20 us for setup */
 823	udelay(20);
 824
 825	/* Transmit Buffer Size (1 frame) */
 826	cpc_writeb(falcbase + F_REG(SIC1, ch), SIC1_XBS0);
 827
 828	/* Clock mode */
 829	if (conf->phys_settings.clock_type == CLOCK_INT) { /* Master mode */
 830		cpc_writeb(falcbase + F_REG(LIM0, ch),
 831			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS);
 832	} else { /* Slave mode */
 833		cpc_writeb(falcbase + F_REG(LIM0, ch),
 834			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS);
 835		cpc_writeb(falcbase + F_REG(LOOP, ch),
 836			   cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_RTM);
 837	}
 838
 839	cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
 840	cpc_writeb(falcbase + F_REG(FMR0, ch),
 841		   cpc_readb(falcbase + F_REG(FMR0, ch)) &
 842		   ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
 843
 844	switch (conf->lcode) {
 845		case PC300_LC_AMI:
 846			cpc_writeb(falcbase + F_REG(FMR0, ch),
 847				   cpc_readb(falcbase + F_REG(FMR0, ch)) |
 848				   FMR0_XC1 | FMR0_RC1);
 849			/* Clear Channel register to ON for all channels */
 850			cpc_writeb(falcbase + F_REG(CCB1, ch), 0xff);
 851			cpc_writeb(falcbase + F_REG(CCB2, ch), 0xff);
 852			cpc_writeb(falcbase + F_REG(CCB3, ch), 0xff);
 853			break;
 854
 855		case PC300_LC_B8ZS:
 856			cpc_writeb(falcbase + F_REG(FMR0, ch),
 857				   cpc_readb(falcbase + F_REG(FMR0, ch)) |
 858				   FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
 859			break;
 860
 861		case PC300_LC_NRZ:
 862			cpc_writeb(falcbase + F_REG(FMR0, ch),
 863				   cpc_readb(falcbase + F_REG(FMR0, ch)) | 0x00);
 864			break;
 865	}
 866
 867	cpc_writeb(falcbase + F_REG(LIM0, ch),
 868		   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_ELOS);
 869	cpc_writeb(falcbase + F_REG(LIM0, ch),
 870		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0));
 871	/* Set interface mode to 2 MBPS */
 872	cpc_writeb(falcbase + F_REG(FMR1, ch),
 873		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD);
 874
 875	switch (conf->fr_mode) {
 876		case PC300_FR_ESF:
 877			pfalc->multiframe_mode = 0;
 878			cpc_writeb(falcbase + F_REG(FMR4, ch),
 879				   cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_FM1);
 880			cpc_writeb(falcbase + F_REG(FMR1, ch),
 881				   cpc_readb(falcbase + F_REG(FMR1, ch)) | 
 882				   FMR1_CRC | FMR1_EDL);
 883			cpc_writeb(falcbase + F_REG(XDL1, ch), 0);
 884			cpc_writeb(falcbase + F_REG(XDL2, ch), 0);
 885			cpc_writeb(falcbase + F_REG(XDL3, ch), 0);
 886			cpc_writeb(falcbase + F_REG(FMR0, ch),
 887				   cpc_readb(falcbase + F_REG(FMR0, ch)) & ~FMR0_SRAF);
 888			cpc_writeb(falcbase + F_REG(FMR2, ch),
 889				   cpc_readb(falcbase + F_REG(FMR2,ch)) | FMR2_MCSP | FMR2_SSP);
 890			break;
 891
 892		case PC300_FR_D4:
 893			pfalc->multiframe_mode = 1;
 894			cpc_writeb(falcbase + F_REG(FMR4, ch),
 895				   cpc_readb(falcbase + F_REG(FMR4, ch)) &
 896				   ~(FMR4_FM1 | FMR4_FM0));
 897			cpc_writeb(falcbase + F_REG(FMR0, ch),
 898				   cpc_readb(falcbase + F_REG(FMR0, ch)) | FMR0_SRAF);
 899			cpc_writeb(falcbase + F_REG(FMR2, ch),
 900				   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_SSP);
 901			break;
 902	}
 903
 904	/* Enable Automatic Resynchronization */
 905	cpc_writeb(falcbase + F_REG(FMR4, ch),
 906		   cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_AUTO);
 907
 908	/* Transmit Automatic Remote Alarm */
 909	cpc_writeb(falcbase + F_REG(FMR2, ch),
 910		   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
 911
 912	/* Channel translation mode 1 : one to one */
 913	cpc_writeb(falcbase + F_REG(FMR1, ch),
 914		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_CTM);
 915
 916	/* No signaling */
 917	cpc_writeb(falcbase + F_REG(FMR1, ch),
 918		   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_SIGM);
 919	cpc_writeb(falcbase + F_REG(FMR5, ch),
 920		   cpc_readb(falcbase + F_REG(FMR5, ch)) &
 921		   ~(FMR5_EIBR | FMR5_SRS));
 922	cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
 923
 924	cpc_writeb(falcbase + F_REG(LIM1, ch),
 925		   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1);
 926
 927	switch (conf->lbo) {
 928			/* Provides proper Line Build Out */
 929		case PC300_LBO_0_DB:
 930			cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
 931			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x5a);
 932			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x8f);
 933			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
 934			break;
 935		case PC300_LBO_7_5_DB:
 936			cpc_writeb(falcbase + F_REG(LIM2, ch), (0x40 | LIM2_LOS1 | dja));
 937			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x11);
 938			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x02);
 939			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
 940			break;
 941		case PC300_LBO_15_DB:
 942			cpc_writeb(falcbase + F_REG(LIM2, ch), (0x80 | LIM2_LOS1 | dja));
 943			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x8e);
 944			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
 945			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
 946			break;
 947		case PC300_LBO_22_5_DB:
 948			cpc_writeb(falcbase + F_REG(LIM2, ch), (0xc0 | LIM2_LOS1 | dja));
 949			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x09);
 950			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01);
 951			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20);
 952			break;
 953	}
 954
 955	/* Transmit Clock-Slot Offset */
 956	cpc_writeb(falcbase + F_REG(XC0, ch),
 957		   cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01);
 958	/* Transmit Time-slot Offset */
 959	cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
 960	/* Receive  Clock-Slot offset */
 961	cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
 962	/* Receive  Time-slot offset */
 963	cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
 964
 965	/* LOS Detection after 176 consecutive 0s */
 966	cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
 967	/* LOS Recovery after 22 ones in the time window of PCD */
 968	cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
 969
 970	cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
 971
 972	if (conf->fr_mode == PC300_FR_ESF_JAPAN) {
 973		cpc_writeb(falcbase + F_REG(RC1, ch),
 974			   cpc_readb(falcbase + F_REG(RC1, ch)) | 0x80);
 975	}
 976
 977	falc_close_all_timeslots(card, ch);
 978}
 979
 980static void falc_init_e1(pc300_t * card, int ch)
 981{
 982	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
 983	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
 984	falc_t *pfalc = (falc_t *) & chan->falc;
 985	void __iomem *falcbase = card->hw.falcbase;
 986	u8 dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0);
 987
 988	/* Switch to E1 mode (PCM 30) */
 989	cpc_writeb(falcbase + F_REG(FMR1, ch),
 990		   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_PMOD);
 991
 992	/* Clock mode */
 993	if (conf->phys_settings.clock_type == CLOCK_INT) { /* Master mode */
 994		cpc_writeb(falcbase + F_REG(LIM0, ch),
 995			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS);
 996	} else { /* Slave mode */
 997		cpc_writeb(falcbase + F_REG(LIM0, ch),
 998			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS);
 999	}
1000	cpc_writeb(falcbase + F_REG(LOOP, ch),
1001		   cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_SFM);
1002
1003	cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI);
1004	cpc_writeb(falcbase + F_REG(FMR0, ch),
1005		   cpc_readb(falcbase + F_REG(FMR0, ch)) &
1006		   ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1));
1007
1008	switch (conf->lcode) {
1009		case PC300_LC_AMI:
1010			cpc_writeb(falcbase + F_REG(FMR0, ch),
1011				   cpc_readb(falcbase + F_REG(FMR0, ch)) |
1012				   FMR0_XC1 | FMR0_RC1);
1013			break;
1014
1015		case PC300_LC_HDB3:
1016			cpc_writeb(falcbase + F_REG(FMR0, ch),
1017				   cpc_readb(falcbase + F_REG(FMR0, ch)) |
1018				   FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1);
1019			break;
1020
1021		case PC300_LC_NRZ:
1022			break;
1023	}
1024
1025	cpc_writeb(falcbase + F_REG(LIM0, ch),
1026		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0));
1027	/* Set interface mode to 2 MBPS */
1028	cpc_writeb(falcbase + F_REG(FMR1, ch),
1029		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD);
1030
1031	cpc_writeb(falcbase + F_REG(XPM0, ch), 0x18);
1032	cpc_writeb(falcbase + F_REG(XPM1, ch), 0x03);
1033	cpc_writeb(falcbase + F_REG(XPM2, ch), 0x00);
1034
1035	switch (conf->fr_mode) {
1036		case PC300_FR_MF_CRC4:
1037			pfalc->multiframe_mode = 1;
1038			cpc_writeb(falcbase + F_REG(FMR1, ch),
1039				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_XFS);
1040			cpc_writeb(falcbase + F_REG(FMR2, ch),
1041				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_RFS1);
1042			cpc_writeb(falcbase + F_REG(FMR2, ch),
1043				   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS0);
1044			cpc_writeb(falcbase + F_REG(FMR3, ch),
1045				   cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_EXTIW);
1046
1047			/* MultiFrame Resynchronization */
1048			cpc_writeb(falcbase + F_REG(FMR1, ch),
1049				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_MFCS);
1050
1051			/* Automatic Loss of Multiframe > 914 CRC errors */
1052			cpc_writeb(falcbase + F_REG(FMR2, ch),
1053				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_ALMF);
1054
1055			/* S1 and SI1/SI2 spare Bits set to 1 */
1056			cpc_writeb(falcbase + F_REG(XSP, ch),
1057				   cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_AXS);
1058			cpc_writeb(falcbase + F_REG(XSP, ch),
1059				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_EBP);
1060			cpc_writeb(falcbase + F_REG(XSP, ch),
1061				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XS13 | XSP_XS15);
1062
1063			/* Automatic Force Resynchronization */
1064			cpc_writeb(falcbase + F_REG(FMR1, ch),
1065				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
1066
1067			/* Transmit Automatic Remote Alarm */
1068			cpc_writeb(falcbase + F_REG(FMR2, ch),
1069				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
1070
1071			/* Transmit Spare Bits for National Use (Y, Sn, Sa) */
1072			cpc_writeb(falcbase + F_REG(XSW, ch),
1073				   cpc_readb(falcbase + F_REG(XSW, ch)) |
1074				   XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
1075			break;
1076
1077		case PC300_FR_MF_NON_CRC4:
1078		case PC300_FR_D4:
1079			pfalc->multiframe_mode = 0;
1080			cpc_writeb(falcbase + F_REG(FMR1, ch),
1081				   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
1082			cpc_writeb(falcbase + F_REG(FMR2, ch),
1083				   cpc_readb(falcbase + F_REG(FMR2, ch)) & 
1084				   ~(FMR2_RFS1 | FMR2_RFS0));
1085			cpc_writeb(falcbase + F_REG(XSW, ch),
1086				   cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XSIS);
1087			cpc_writeb(falcbase + F_REG(XSP, ch),
1088				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XSIF);
1089
1090			/* Automatic Force Resynchronization */
1091			cpc_writeb(falcbase + F_REG(FMR1, ch),
1092				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR);
1093
1094			/* Transmit Automatic Remote Alarm */
1095			cpc_writeb(falcbase + F_REG(FMR2, ch),
1096				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA);
1097
1098			/* Transmit Spare Bits for National Use (Y, Sn, Sa) */
1099			cpc_writeb(falcbase + F_REG(XSW, ch),
1100				   cpc_readb(falcbase + F_REG(XSW, ch)) |
1101				   XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4);
1102			break;
1103
1104		case PC300_FR_UNFRAMED:
1105			pfalc->multiframe_mode = 0;
1106			cpc_writeb(falcbase + F_REG(FMR1, ch),
1107				   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS);
1108			cpc_writeb(falcbase + F_REG(FMR2, ch),
1109				   cpc_readb(falcbase + F_REG(FMR2, ch)) & 
1110				   ~(FMR2_RFS1 | FMR2_RFS0));
1111			cpc_writeb(falcbase + F_REG(XSP, ch),
1112				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_TT0);
1113			cpc_writeb(falcbase + F_REG(XSW, ch),
1114				   cpc_readb(falcbase + F_REG(XSW, ch)) & 
1115				   ~(XSW_XTM|XSW_XY0|XSW_XY1|XSW_XY2|XSW_XY3|XSW_XY4));
1116			cpc_writeb(falcbase + F_REG(TSWM, ch), 0xff);
1117			cpc_writeb(falcbase + F_REG(FMR2, ch),
1118				   cpc_readb(falcbase + F_REG(FMR2, ch)) |
1119				   (FMR2_RTM | FMR2_DAIS));
1120			cpc_writeb(falcbase + F_REG(FMR2, ch),
1121				   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_AXRA);
1122			cpc_writeb(falcbase + F_REG(FMR1, ch),
1123				   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_AFR);
1124			pfalc->sync = 1;
1125			cpc_writeb(falcbase + card->hw.cpld_reg2,
1126				   cpc_readb(falcbase + card->hw.cpld_reg2) |
1127				   (CPLD_REG2_FALC_LED2 << (2 * ch)));
1128			break;
1129	}
1130
1131	/* No signaling */
1132	cpc_writeb(falcbase + F_REG(XSP, ch),
1133		   cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_CASEN);
1134	cpc_writeb(falcbase + F_REG(CCR1, ch), 0);
1135
1136	cpc_writeb(falcbase + F_REG(LIM1, ch),
1137		   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1);
1138	cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja));
1139
1140	/* Transmit Clock-Slot Offset */
1141	cpc_writeb(falcbase + F_REG(XC0, ch),
1142		   cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01);
1143	/* Transmit Time-slot Offset */
1144	cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e);
1145	/* Receive  Clock-Slot offset */
1146	cpc_writeb(falcbase + F_REG(RC0, ch), 0x05);
1147	/* Receive  Time-slot offset */
1148	cpc_writeb(falcbase + F_REG(RC1, ch), 0x00);
1149
1150	/* LOS Detection after 176 consecutive 0s */
1151	cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a);
1152	/* LOS Recovery after 22 ones in the time window of PCD */
1153	cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15);
1154
1155	cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f);
1156
1157	falc_close_all_timeslots(card, ch);
1158}
1159
1160static void falc_init_hdlc(pc300_t * card, int ch)
1161{
1162	void __iomem *falcbase = card->hw.falcbase;
1163	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1164	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1165
1166	/* Enable transparent data transfer */
1167	if (conf->fr_mode == PC300_FR_UNFRAMED) {
1168		cpc_writeb(falcbase + F_REG(MODE, ch), 0);
1169	} else {
1170		cpc_writeb(falcbase + F_REG(MODE, ch),
1171			   cpc_readb(falcbase + F_REG(MODE, ch)) |
1172			   (MODE_HRAC | MODE_MDS2));
1173		cpc_writeb(falcbase + F_REG(RAH2, ch), 0xff);
1174		cpc_writeb(falcbase + F_REG(RAH1, ch), 0xff);
1175		cpc_writeb(falcbase + F_REG(RAL2, ch), 0xff);
1176		cpc_writeb(falcbase + F_REG(RAL1, ch), 0xff);
1177	}
1178
1179	/* Tx/Rx reset  */
1180	falc_issue_cmd(card, ch, CMDR_RRES | CMDR_XRES | CMDR_SRES);
1181
1182	/* Enable interrupt sources */
1183	falc_intr_enable(card, ch);
1184}
1185
1186static void te_config(pc300_t * card, int ch)
1187{
1188	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1189	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1190	falc_t *pfalc = (falc_t *) & chan->falc;
1191	void __iomem *falcbase = card->hw.falcbase;
1192	u8 dummy;
1193	unsigned long flags;
1194
1195	memset(pfalc, 0, sizeof(falc_t));
1196	switch (conf->media) {
1197		case IF_IFACE_T1:
1198			pfalc->num_channels = NUM_OF_T1_CHANNELS;
1199			pfalc->offset = 1;
1200			break;
1201		case IF_IFACE_E1:
1202			pfalc->num_channels = NUM_OF_E1_CHANNELS;
1203			pfalc->offset = 0;
1204			break;
1205	}
1206	if (conf->tslot_bitmap == 0xffffffffUL)
1207		pfalc->full_bandwidth = 1;
1208	else
1209		pfalc->full_bandwidth = 0;
1210
1211	CPC_LOCK(card, flags);
1212	/* Reset the FALC chip */
1213	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
1214		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
1215		   (CPLD_REG1_FALC_RESET << (2 * ch)));
1216	udelay(10000);
1217	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
1218		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
1219		   ~(CPLD_REG1_FALC_RESET << (2 * ch)));
1220
1221	if (conf->media == IF_IFACE_T1) {
1222		falc_init_t1(card, ch);
1223	} else {
1224		falc_init_e1(card, ch);
1225	}
1226	falc_init_hdlc(card, ch);
1227	if (conf->rx_sens == PC300_RX_SENS_SH) {
1228		cpc_writeb(falcbase + F_REG(LIM0, ch),
1229			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_EQON);
1230	} else {
1231		cpc_writeb(falcbase + F_REG(LIM0, ch),
1232			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_EQON);
1233	}
1234	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1235		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) |
1236		   ((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK) << (2 * ch)));
1237
1238	/* Clear all interrupt registers */
1239	dummy = cpc_readb(falcbase + F_REG(FISR0, ch)) +
1240		cpc_readb(falcbase + F_REG(FISR1, ch)) +
1241		cpc_readb(falcbase + F_REG(FISR2, ch)) +
1242		cpc_readb(falcbase + F_REG(FISR3, ch));
1243	CPC_UNLOCK(card, flags);
1244}
1245
1246static void falc_check_status(pc300_t * card, int ch, unsigned char frs0)
1247{
1248	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1249	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1250	falc_t *pfalc = (falc_t *) & chan->falc;
1251	void __iomem *falcbase = card->hw.falcbase;
1252
1253	/* Verify LOS */
1254	if (frs0 & FRS0_LOS) {
1255		if (!pfalc->red_alarm) {
1256			pfalc->red_alarm = 1;
1257			pfalc->los++;
1258			if (!pfalc->blue_alarm) {
1259				// EVENT_FALC_ABNORMAL
1260				if (conf->media == IF_IFACE_T1) {
1261					/* Disable this interrupt as it may otherwise interfere 
1262					 * with other working boards. */
1263					cpc_writeb(falcbase + F_REG(IMR0, ch), 
1264						   cpc_readb(falcbase + F_REG(IMR0, ch))
1265						   | IMR0_PDEN);
1266				}
1267				falc_disable_comm(card, ch);
1268				// EVENT_FALC_ABNORMAL
1269			}
1270		}
1271	} else {
1272		if (pfalc->red_alarm) {
1273			pfalc->red_alarm = 0;
1274			pfalc->losr++;
1275		}
1276	}
1277
1278	if (conf->fr_mode != PC300_FR_UNFRAMED) {
1279		/* Verify AIS alarm */
1280		if (frs0 & FRS0_AIS) {
1281			if (!pfalc->blue_alarm) {
1282				pfalc->blue_alarm = 1;
1283				pfalc->ais++;
1284				// EVENT_AIS
1285				if (conf->media == IF_IFACE_T1) {
1286					/* Disable this interrupt as it may otherwise interfere with                       other working boards. */
1287					cpc_writeb(falcbase + F_REG(IMR0, ch),
1288						   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1289				}
1290				falc_disable_comm(card, ch);
1291				// EVENT_AIS
1292			}
1293		} else {
1294			pfalc->blue_alarm = 0;
1295		}
1296
1297		/* Verify LFA */
1298		if (frs0 & FRS0_LFA) {
1299			if (!pfalc->loss_fa) {
1300				pfalc->loss_fa = 1;
1301				pfalc->lfa++;
1302				if (!pfalc->blue_alarm && !pfalc->red_alarm) {
1303					// EVENT_FALC_ABNORMAL
1304					if (conf->media == IF_IFACE_T1) {
1305						/* Disable this interrupt as it may otherwise 
1306						 * interfere with other working boards. */
1307						cpc_writeb(falcbase + F_REG(IMR0, ch),
1308							   cpc_readb(falcbase + F_REG(IMR0, ch))
1309							   | IMR0_PDEN);
1310					}
1311					falc_disable_comm(card, ch);
1312					// EVENT_FALC_ABNORMAL
1313				}
1314			}
1315		} else {
1316			if (pfalc->loss_fa) {
1317				pfalc->loss_fa = 0;
1318				pfalc->farec++;
1319			}
1320		}
1321
1322		/* Verify LMFA */
1323		if (pfalc->multiframe_mode && (frs0 & FRS0_LMFA)) {
1324			/* D4 or CRC4 frame mode */
1325			if (!pfalc->loss_mfa) {
1326				pfalc->loss_mfa = 1;
1327				pfalc->lmfa++;
1328				if (!pfalc->blue_alarm && !pfalc->red_alarm &&
1329				    !pfalc->loss_fa) {
1330					// EVENT_FALC_ABNORMAL
1331					if (conf->media == IF_IFACE_T1) {
1332						/* Disable this interrupt as it may otherwise 
1333						 * interfere with other working boards. */
1334						cpc_writeb(falcbase + F_REG(IMR0, ch),
1335							   cpc_readb(falcbase + F_REG(IMR0, ch))
1336							   | IMR0_PDEN);
1337					}
1338					falc_disable_comm(card, ch);
1339					// EVENT_FALC_ABNORMAL
1340				}
1341			}
1342		} else {
1343			pfalc->loss_mfa = 0;
1344		}
1345
1346		/* Verify Remote Alarm */
1347		if (frs0 & FRS0_RRA) {
1348			if (!pfalc->yellow_alarm) {
1349				pfalc->yellow_alarm = 1;
1350				pfalc->rai++;
1351				if (pfalc->sync) {
1352					// EVENT_RAI
1353					falc_disable_comm(card, ch);
1354					// EVENT_RAI
1355				}
1356			}
1357		} else {
1358			pfalc->yellow_alarm = 0;
1359		}
1360	} /* if !PC300_UNFRAMED */
1361
1362	if (pfalc->red_alarm || pfalc->loss_fa ||
1363	    pfalc->loss_mfa || pfalc->blue_alarm) {
1364		if (pfalc->sync) {
1365			pfalc->sync = 0;
1366			chan->d.line_off++;
1367			cpc_writeb(falcbase + card->hw.cpld_reg2,
1368				   cpc_readb(falcbase + card->hw.cpld_reg2) &
1369				   ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1370		}
1371	} else {
1372		if (!pfalc->sync) {
1373			pfalc->sync = 1;
1374			chan->d.line_on++;
1375			cpc_writeb(falcbase + card->hw.cpld_reg2,
1376				   cpc_readb(falcbase + card->hw.cpld_reg2) |
1377				   (CPLD_REG2_FALC_LED2 << (2 * ch)));
1378		}
1379	}
1380
1381	if (pfalc->sync && !pfalc->yellow_alarm) {
1382		if (!pfalc->active) {
1383			// EVENT_FALC_NORMAL
1384			if (pfalc->loop_active) {
1385				return;
1386			}
1387			if (conf->media == IF_IFACE_T1) {
1388				cpc_writeb(falcbase + F_REG(IMR0, ch),
1389					   cpc_readb(falcbase + F_REG(IMR0, ch)) & ~IMR0_PDEN);
1390			}
1391			falc_enable_comm(card, ch);
1392			// EVENT_FALC_NORMAL
1393			pfalc->active = 1;
1394		}
1395	} else {
1396		if (pfalc->active) {
1397			pfalc->active = 0;
1398		}
1399	}
1400}
1401
1402static void falc_update_stats(pc300_t * card, int ch)
1403{
1404	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1405	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1406	falc_t *pfalc = (falc_t *) & chan->falc;
1407	void __iomem *falcbase = card->hw.falcbase;
1408	u16 counter;
1409
1410	counter = cpc_readb(falcbase + F_REG(FECL, ch));
1411	counter |= cpc_readb(falcbase + F_REG(FECH, ch)) << 8;
1412	pfalc->fec += counter;
1413
1414	counter = cpc_readb(falcbase + F_REG(CVCL, ch));
1415	counter |= cpc_readb(falcbase + F_REG(CVCH, ch)) << 8;
1416	pfalc->cvc += counter;
1417
1418	counter = cpc_readb(falcbase + F_REG(CECL, ch));
1419	counter |= cpc_readb(falcbase + F_REG(CECH, ch)) << 8;
1420	pfalc->cec += counter;
1421
1422	counter = cpc_readb(falcbase + F_REG(EBCL, ch));
1423	counter |= cpc_readb(falcbase + F_REG(EBCH, ch)) << 8;
1424	pfalc->ebc += counter;
1425
1426	if (cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) {
1427		mdelay(10);
1428		counter = cpc_readb(falcbase + F_REG(BECL, ch));
1429		counter |= cpc_readb(falcbase + F_REG(BECH, ch)) << 8;
1430		pfalc->bec += counter;
1431
1432		if (((conf->media == IF_IFACE_T1) &&
1433		     (cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_LLBAD) &&
1434		     (!(cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_PDEN))) ||
1435		    ((conf->media == IF_IFACE_E1) &&
1436		     (cpc_readb(falcbase + F_REG(RSP, ch)) & RSP_LLBAD))) {
1437			pfalc->prbs = 2;
1438		} else {
1439			pfalc->prbs = 1;
1440		}
1441	}
1442}
1443
1444/*----------------------------------------------------------------------------
1445 * falc_remote_loop
1446 *----------------------------------------------------------------------------
1447 * Description:	In the remote loopback mode the clock and data recovered
1448 *		from the line inputs RL1/2 or RDIP/RDIN are routed back
1449 *		to the line outputs XL1/2 or XDOP/XDON via the analog
1450 *		transmitter. As in normal mode they are processed by
1451 *		the synchronizer and then sent to the system interface.
1452 *----------------------------------------------------------------------------
1453 */
1454static void falc_remote_loop(pc300_t * card, int ch, int loop_on)
1455{
1456	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1457	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1458	falc_t *pfalc = (falc_t *) & chan->falc;
1459	void __iomem *falcbase = card->hw.falcbase;
1460
1461	if (loop_on) {
1462		// EVENT_FALC_ABNORMAL
1463		if (conf->media == IF_IFACE_T1) {
1464			/* Disable this interrupt as it may otherwise interfere with 
1465			 * other working boards. */
1466			cpc_writeb(falcbase + F_REG(IMR0, ch),
1467				   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1468		}
1469		falc_disable_comm(card, ch);
1470		// EVENT_FALC_ABNORMAL
1471		cpc_writeb(falcbase + F_REG(LIM1, ch),
1472			   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RL);
1473		pfalc->loop_active = 1;
1474	} else {
1475		cpc_writeb(falcbase + F_REG(LIM1, ch),
1476			   cpc_readb(falcbase + F_REG(LIM1, ch)) & ~LIM1_RL);
1477		pfalc->sync = 0;
1478		cpc_writeb(falcbase + card->hw.cpld_reg2,
1479			   cpc_readb(falcbase + card->hw.cpld_reg2) &
1480			   ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1481		pfalc->active = 0;
1482		falc_issue_cmd(card, ch, CMDR_XRES);
1483		pfalc->loop_active = 0;
1484	}
1485}
1486
1487/*----------------------------------------------------------------------------
1488 * falc_local_loop
1489 *----------------------------------------------------------------------------
1490 * Description: The local loopback mode disconnects the receive lines 
1491 *		RL1/RL2 resp. RDIP/RDIN from the receiver. Instead of the
1492 *		signals coming from the line the data provided by system
1493 *		interface are routed through the analog receiver back to
1494 *		the system interface. The unipolar bit stream will be
1495 *		undisturbed transmitted on the line. Receiver and transmitter
1496 *		coding must be identical.
1497 *----------------------------------------------------------------------------
1498 */
1499static void falc_local_loop(pc300_t * card, int ch, int loop_on)
1500{
1501	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1502	falc_t *pfalc = (falc_t *) & chan->falc;
1503	void __iomem *falcbase = card->hw.falcbase;
1504
1505	if (loop_on) {
1506		cpc_writeb(falcbase + F_REG(LIM0, ch),
1507			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_LL);
1508		pfalc->loop_active = 1;
1509	} else {
1510		cpc_writeb(falcbase + F_REG(LIM0, ch),
1511			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_LL);
1512		pfalc->loop_active = 0;
1513	}
1514}
1515
1516/*----------------------------------------------------------------------------
1517 * falc_payload_loop
1518 *----------------------------------------------------------------------------
1519 * Description: This routine allows to enable/disable payload loopback.
1520 *		When the payload loop is activated, the received 192 bits
1521 *		of payload data will be looped back to the transmit
1522 *		direction. The framing bits, CRC6 and DL bits are not 
1523 *		looped. They are originated by the FALC-LH transmitter.
1524 *----------------------------------------------------------------------------
1525 */
1526static void falc_payload_loop(pc300_t * card, int ch, int loop_on)
1527{
1528	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1529	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1530	falc_t *pfalc = (falc_t *) & chan->falc;
1531	void __iomem *falcbase = card->hw.falcbase;
1532
1533	if (loop_on) {
1534		// EVENT_FALC_ABNORMAL
1535		if (conf->media == IF_IFACE_T1) {
1536			/* Disable this interrupt as it may otherwise interfere with 
1537			 * other working boards. */
1538			cpc_writeb(falcbase + F_REG(IMR0, ch),
1539				   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1540		}
1541		falc_disable_comm(card, ch);
1542		// EVENT_FALC_ABNORMAL
1543		cpc_writeb(falcbase + F_REG(FMR2, ch),
1544			   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_PLB);
1545		if (conf->media == IF_IFACE_T1) {
1546			cpc_writeb(falcbase + F_REG(FMR4, ch),
1547				   cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_TM);
1548		} else {
1549			cpc_writeb(falcbase + F_REG(FMR5, ch),
1550				   cpc_readb(falcbase + F_REG(FMR5, ch)) | XSP_TT0);
1551		}
1552		falc_open_all_timeslots(card, ch);
1553		pfalc->loop_active = 2;
1554	} else {
1555		cpc_writeb(falcbase + F_REG(FMR2, ch),
1556			   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_PLB);
1557		if (conf->media == IF_IFACE_T1) {
1558			cpc_writeb(falcbase + F_REG(FMR4, ch),
1559				   cpc_readb(falcbase + F_REG(FMR4, ch)) & ~FMR4_TM);
1560		} else {
1561			cpc_writeb(falcbase + F_REG(FMR5, ch),
1562				   cpc_readb(falcbase + F_REG(FMR5, ch)) & ~XSP_TT0);
1563		}
1564		pfalc->sync = 0;
1565		cpc_writeb(falcbase + card->hw.cpld_reg2,
1566			   cpc_readb(falcbase + card->hw.cpld_reg2) &
1567			   ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1568		pfalc->active = 0;
1569		falc_issue_cmd(card, ch, CMDR_XRES);
1570		pfalc->loop_active = 0;
1571	}
1572}
1573
1574/*----------------------------------------------------------------------------
1575 * turn_off_xlu
1576 *----------------------------------------------------------------------------
1577 * Description:	Turns XLU bit off in the proper register
1578 *----------------------------------------------------------------------------
1579 */
1580static void turn_off_xlu(pc300_t * card, int ch)
1581{
1582	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1583	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1584	void __iomem *falcbase = card->hw.falcbase;
1585
1586	if (conf->media == IF_IFACE_T1) {
1587		cpc_writeb(falcbase + F_REG(FMR5, ch),
1588			   cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLU);
1589	} else {
1590		cpc_writeb(falcbase + F_REG(FMR3, ch),
1591			   cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLU);
1592	}
1593}
1594
1595/*----------------------------------------------------------------------------
1596 * turn_off_xld
1597 *----------------------------------------------------------------------------
1598 * Description: Turns XLD bit off in the proper register
1599 *----------------------------------------------------------------------------
1600 */
1601static void turn_off_xld(pc300_t * card, int ch)
1602{
1603	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1604	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1605	void __iomem *falcbase = card->hw.falcbase;
1606
1607	if (conf->media == IF_IFACE_T1) {
1608		cpc_writeb(falcbase + F_REG(FMR5, ch),
1609			   cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLD);
1610	} else {
1611		cpc_writeb(falcbase + F_REG(FMR3, ch),
1612			   cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLD);
1613	}
1614}
1615
1616/*----------------------------------------------------------------------------
1617 * falc_generate_loop_up_code
1618 *----------------------------------------------------------------------------
1619 * Description:	This routine writes the proper FALC chip register in order
1620 *		to generate a LOOP activation code over a T1/E1 line.
1621 *----------------------------------------------------------------------------
1622 */
1623static void falc_generate_loop_up_code(pc300_t * card, int ch)
1624{
1625	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1626	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1627	falc_t *pfalc = (falc_t *) & chan->falc;
1628	void __iomem *falcbase = card->hw.falcbase;
1629
1630	if (conf->media == IF_IFACE_T1) {
1631		cpc_writeb(falcbase + F_REG(FMR5, ch),
1632			   cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLU);
1633	} else {
1634		cpc_writeb(falcbase + F_REG(FMR3, ch),
1635			   cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLU);
1636	}
1637	// EVENT_FALC_ABNORMAL
1638	if (conf->media == IF_IFACE_T1) {
1639		/* Disable this interrupt as it may otherwise interfere with 
1640		 * other working boards. */
1641		cpc_writeb(falcbase + F_REG(IMR0, ch),
1642			   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN);
1643	}
1644	falc_disable_comm(card, ch);
1645	// EVENT_FALC_ABNORMAL
1646	pfalc->loop_gen = 1;
1647}
1648
1649/*----------------------------------------------------------------------------
1650 * falc_generate_loop_down_code
1651 *----------------------------------------------------------------------------
1652 * Description:	This routine writes the proper FALC chip register in order
1653 *		to generate a LOOP deactivation code over a T1/E1 line.
1654 *----------------------------------------------------------------------------
1655 */
1656static void falc_generate_loop_down_code(pc300_t * card, int ch)
1657{
1658	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1659	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1660	falc_t *pfalc = (falc_t *) & chan->falc;
1661	void __iomem *falcbase = card->hw.falcbase;
1662
1663	if (conf->media == IF_IFACE_T1) {
1664		cpc_writeb(falcbase + F_REG(FMR5, ch),
1665			   cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLD);
1666	} else {
1667		cpc_writeb(falcbase + F_REG(FMR3, ch),
1668			   cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLD);
1669	}
1670	pfalc->sync = 0;
1671	cpc_writeb(falcbase + card->hw.cpld_reg2,
1672		   cpc_readb(falcbase + card->hw.cpld_reg2) &
1673		   ~(CPLD_REG2_FALC_LED2 << (2 * ch)));
1674	pfalc->active = 0;
1675//?    falc_issue_cmd(card, ch, CMDR_XRES);
1676	pfalc->loop_gen = 0;
1677}
1678
1679/*----------------------------------------------------------------------------
1680 * falc_pattern_test
1681 *----------------------------------------------------------------------------
1682 * Description:	This routine generates a pattern code and checks
1683 *		it on the reception side.
1684 *----------------------------------------------------------------------------
1685 */
1686static void falc_pattern_test(pc300_t * card, int ch, unsigned int activate)
1687{
1688	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1689	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
1690	falc_t *pfalc = (falc_t *) & chan->falc;
1691	void __iomem *falcbase = card->hw.falcbase;
1692
1693	if (activate) {
1694		pfalc->prbs = 1;
1695		pfalc->bec = 0;
1696		if (conf->media == IF_IFACE_T1) {
1697			/* Disable local loop activation/deactivation detect */
1698			cpc_writeb(falcbase + F_REG(IMR3, ch),
1699				   cpc_readb(falcbase + F_REG(IMR3, ch)) | IMR3_LLBSC);
1700		} else {
1701			/* Disable local loop activation/deactivation detect */
1702			cpc_writeb(falcbase + F_REG(IMR1, ch),
1703				   cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_LLBSC);
1704		}
1705		/* Activates generation and monitoring of PRBS 
1706		 * (Pseudo Random Bit Sequence) */
1707		cpc_writeb(falcbase + F_REG(LCR1, ch),
1708			   cpc_readb(falcbase + F_REG(LCR1, ch)) | LCR1_EPRM | LCR1_XPRBS);
1709	} else {
1710		pfalc->prbs = 0;
1711		/* Deactivates generation and monitoring of PRBS 
1712		 * (Pseudo Random Bit Sequence) */
1713		cpc_writeb(falcbase + F_REG(LCR1, ch),
1714			   cpc_readb(falcbase+F_REG(LCR1,ch)) & ~(LCR1_EPRM | LCR1_XPRBS));
1715		if (conf->media == IF_IFACE_T1) {
1716			/* Enable local loop activation/deactivation detect */
1717			cpc_writeb(falcbase + F_REG(IMR3, ch),
1718				   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC);
1719		} else {
1720			/* Enable local loop activation/deactivation detect */
1721			cpc_writeb(falcbase + F_REG(IMR1, ch),
1722				   cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_LLBSC);
1723		}
1724	}
1725}
1726
1727/*----------------------------------------------------------------------------
1728 * falc_pattern_test_error
1729 *----------------------------------------------------------------------------
1730 * Description:	This routine returns the bit error counter value
1731 *----------------------------------------------------------------------------
1732 */
1733static u16 falc_pattern_test_error(pc300_t * card, int ch)
1734{
1735	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
1736	falc_t *pfalc = (falc_t *) & chan->falc;
1737
1738	return pfalc->bec;
1739}
1740
1741/**********************************/
1742/***   Net Interface Routines   ***/
1743/**********************************/
1744
1745static void
1746cpc_trace(struct net_device *dev, struct sk_buff *skb_main, char rx_tx)
1747{
1748	struct sk_buff *skb;
1749
1750	if ((skb = dev_alloc_skb(10 + skb_main->len)) == NULL) {
1751		printk("%s: out of memory\n", dev->name);
1752		return;
1753	}
1754	skb_put(skb, 10 + skb_main->len);
1755
1756	skb->dev = dev;
1757	skb->protocol = htons(ETH_P_CUST);
1758	skb_reset_mac_header(skb);
1759	skb->pkt_type = PACKET_HOST;
1760	skb->len = 10 + skb_main->len;
1761
1762	skb_copy_to_linear_data(skb, dev->name, 5);
1763	skb->data[5] = '[';
1764	skb->data[6] = rx_tx;
1765	skb->data[7] = ']';
1766	skb->data[8] = ':';
1767	skb->data[9] = ' ';
1768	skb_copy_from_linear_data(skb_main, &skb->data[10], skb_main->len);
1769
1770	netif_rx(skb);
1771}
1772
1773static void cpc_tx_timeout(struct net_device *dev)
1774{
1775	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
1776	pc300ch_t *chan = (pc300ch_t *) d->chan;
1777	pc300_t *card = (pc300_t *) chan->card;
1778	int ch = chan->channel;
1779	unsigned long flags;
1780	u8 ilar;
1781
1782	dev->stats.tx_errors++;
1783	dev->stats.tx_aborted_errors++;
1784	CPC_LOCK(card, flags);
1785	if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) {
1786		printk("%s: ILAR=0x%x\n", dev->name, ilar);
1787		cpc_writeb(card->hw.scabase + ILAR, ilar);
1788		cpc_writeb(card->hw.scabase + DMER, 0x80);
1789	}
1790	if (card->hw.type == PC300_TE) {
1791		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1792			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
1793			   ~(CPLD_REG2_FALC_LED1 << (2 * ch)));
1794	}
1795	dev->trans_start = jiffies; /* prevent tx timeout */
1796	CPC_UNLOCK(card, flags);
1797	netif_wake_queue(dev);
1798}
1799
1800static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev)
1801{
1802	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
1803	pc300ch_t *chan = (pc300ch_t *) d->chan;
1804	pc300_t *card = (pc300_t *) chan->card;
1805	int ch = chan->channel;
1806	unsigned long flags;
1807#ifdef PC300_DEBUG_TX
1808	int i;
1809#endif
1810
1811	if (!netif_carrier_ok(dev)) {
1812		/* DCD must be OFF: drop packet */
1813		dev_kfree_skb(skb);
1814		dev->stats.tx_errors++;
1815		dev->stats.tx_carrier_errors++;
1816		return 0;
1817	} else if (cpc_readb(card->hw.scabase + M_REG(ST3, ch)) & ST3_DCD) {
1818		printk("%s: DCD is OFF. Going administrative down.\n", dev->name);
1819		dev->stats.tx_errors++;
1820		dev->stats.tx_carrier_errors++;
1821		dev_kfree_skb(skb);
1822		netif_carrier_off(dev);
1823		CPC_LOCK(card, flags);
1824		cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_BUF_CLR);
1825		if (card->hw.type == PC300_TE) {
1826			cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1827				   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) & 
1828				   			~(CPLD_REG2_FALC_LED1 << (2 * ch)));
1829		}
1830		CPC_UNLOCK(card, flags);
1831		netif_wake_queue(dev);
1832		return 0;
1833	}
1834
1835	/* Write buffer to DMA buffers */
1836	if (dma_buf_write(card, ch, (u8 *)skb->data, skb->len) != 0) {
1837//		printk("%s: write error. Dropping TX packet.\n", dev->name);
1838		netif_stop_queue(dev);
1839		dev_kfree_skb(skb);
1840		dev->stats.tx_errors++;
1841		dev->stats.tx_dropped++;
1842		return 0;
1843	}
1844#ifdef PC300_DEBUG_TX
1845	printk("%s T:", dev->name);
1846	for (i = 0; i < skb->len; i++)
1847		printk(" %02x", *(skb->data + i));
1848	printk("\n");
1849#endif
1850
1851	if (d->trace_on) {
1852		cpc_trace(dev, skb, 'T');
1853	}
1854
1855	/* Start transmission */
1856	CPC_LOCK(card, flags);
1857	/* verify if it has more than one free descriptor */
1858	if (card->chan[ch].nfree_tx_bd <= 1) {
1859		/* don't have so stop the queue */
1860		netif_stop_queue(dev);
1861	}
1862	cpc_writel(card->hw.scabase + DTX_REG(EDAL, ch),
1863		   TX_BD_ADDR(ch, chan->tx_next_bd));
1864	cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_ENA);
1865	cpc_writeb(card->hw.scabase + DSR_TX(ch), DSR_DE);
1866	if (card->hw.type == PC300_TE) {
1867		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
1868			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) |
1869			   (CPLD_REG2_FALC_LED1 << (2 * ch)));
1870	}
1871	CPC_UNLOCK(card, flags);
1872	dev_kfree_skb(skb);
1873
1874	return 0;
1875}
1876
1877static void cpc_net_rx(struct net_device *dev)
1878{
1879	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
1880	pc300ch_t *chan = (pc300ch_t *) d->chan;
1881	pc300_t *card = (pc300_t *) chan->card;
1882	int ch = chan->channel;
1883#ifdef PC300_DEBUG_RX
1884	int i;
1885#endif
1886	int rxb;
1887	struct sk_buff *skb;
1888
1889	while (1) {
1890		if ((rxb = dma_get_rx_frame_size(card, ch)) == -1)
1891			return;
1892
1893		if (!netif_carrier_ok(dev)) {
1894			/* DCD must be OFF: drop packet */
1895		    printk("%s : DCD is OFF - drop %d rx bytes\n", dev->name, rxb); 
1896			skb = NULL;
1897		} else {
1898			if (rxb > (dev->mtu + 40)) { /* add headers */
1899				printk("%s : MTU exceeded %d\n", dev->name, rxb); 
1900				skb = NULL;
1901			} else {
1902				skb = dev_alloc_skb(rxb);
1903				if (skb == NULL) {
1904					printk("%s: Memory squeeze!!\n", dev->name);
1905					return;
1906				}
1907				skb->dev = dev;
1908			}
1909		}
1910
1911		if (((rxb = dma_buf_read(card, ch, skb)) <= 0) || (skb == NULL)) {
1912#ifdef PC300_DEBUG_RX
1913			printk("%s: rxb = %x\n", dev->name, rxb);
1914#endif
1915			if ((skb == NULL) && (rxb > 0)) {
1916				/* rxb > dev->mtu */
1917				dev->stats.rx_errors++;
1918				dev->stats.rx_length_errors++;
1919				continue;
1920			}
1921
1922			if (rxb < 0) {	/* Invalid frame */
1923				rxb = -rxb;
1924				if (rxb & DST_OVR) {
1925					dev->stats.rx_errors++;
1926					dev->stats.rx_fifo_errors++;
1927				}
1928				if (rxb & DST_CRC) {
1929					dev->stats.rx_errors++;
1930					dev->stats.rx_crc_errors++;
1931				}
1932				if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) {
1933					dev->stats.rx_errors++;
1934					dev->stats.rx_frame_errors++;
1935				}
1936			}
1937			if (skb) {
1938				dev_kfree_skb_irq(skb);
1939			}
1940			continue;
1941		}
1942
1943		dev->stats.rx_bytes += rxb;
1944
1945#ifdef PC300_DEBUG_RX
1946		printk("%s R:", dev->name);
1947		for (i = 0; i < skb->len; i++)
1948			printk(" %02x", *(skb->data + i));
1949		printk("\n");
1950#endif
1951		if (d->trace_on) {
1952			cpc_trace(dev, skb, 'R');
1953		}
1954		dev->stats.rx_packets++;
1955		skb->protocol = hdlc_type_trans(skb, dev);
1956		netif_rx(skb);
1957	}
1958}
1959
1960/************************************/
1961/***   PC300 Interrupt Routines   ***/
1962/************************************/
1963static void sca_tx_intr(pc300dev_t *dev)
1964{
1965	pc300ch_t *chan = (pc300ch_t *)dev->chan; 
1966	pc300_t *card = (pc300_t *)chan->card; 
1967	int ch = chan->channel; 
1968	volatile pcsca_bd_t __iomem * ptdescr; 
1969
1970    /* Clean up descriptors from previous transmission */
1971	ptdescr = (card->hw.rambase +
1972						TX_BD_ADDR(ch,chan->tx_first_bd));
1973	while ((cpc_readl(card->hw.scabase + DTX_REG(CDAL,ch)) !=
1974		TX_BD_ADDR(ch,chan->tx_first_bd)) &&
1975	       (cpc_readb(&ptdescr->status) & DST_OSB)) {
1976		dev->dev->stats.tx_packets++;
1977		dev->dev->stats.tx_bytes += cpc_readw(&ptdescr->len);
1978		cpc_writeb(&ptdescr->status, DST_OSB);
1979		cpc_writew(&ptdescr->len, 0);
1980		chan->nfree_tx_bd++;
1981		chan->tx_first_bd = (chan->tx_first_bd + 1) & (N_DMA_TX_BUF - 1);
1982		ptdescr = (card->hw.rambase + TX_BD_ADDR(ch,chan->tx_first_bd));
1983    }
1984
1985#ifdef CONFIG_PC300_MLPPP
1986	if (chan->conf.proto == PC300_PROTO_MLPPP) {
1987			cpc_tty_trigger_poll(dev);
1988	} else {
1989#endif
1990	/* Tell the upper layer we are ready to transmit more packets */
1991		netif_wake_queue(dev->dev);
1992#ifdef CONFIG_PC300_MLPPP
1993	}
1994#endif
1995}
1996
1997static void sca_intr(pc300_t * card)
1998{
1999	void __iomem *scabase = card->hw.scabase;
2000	volatile u32 status;
2001	int ch;
2002	int intr_count = 0;
2003	unsigned char dsr_rx;
2004
2005	while ((status = cpc_readl(scabase + ISR0)) != 0) {
2006		for (ch = 0; ch < card->hw.nchan; ch++) {
2007			pc300ch_t *chan = &card->chan[ch];
2008			pc300dev_t *d = &chan->d;
2009			struct net_device *dev = d->dev;
2010
2011			spin_lock(&card->card_lock);
2012
2013	    /**** Reception ****/
2014			if (status & IR0_DRX((IR0_DMIA | IR0_DMIB), ch)) {
2015				u8 drx_stat = cpc_readb(scabase + DSR_RX(ch));
2016
2017				/* Clear RX interrupts */
2018				cpc_writeb(scabase + DSR_RX(ch), drx_stat | DSR_DWE);
2019
2020#ifdef PC300_DEBUG_INTR
2021				printk ("sca_intr: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n",
2022					 ch, status, drx_stat);
2023#endif
2024				if (status & IR0_DRX(IR0_DMIA, ch)) {
2025					if (drx_stat & DSR_BOF) {
2026#ifdef CONFIG_PC300_MLPPP
2027						if (chan->conf.proto == PC300_PROTO_MLPPP) {
2028							/* verify if driver is TTY */
2029							if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
2030								rx_dma_stop(card, ch);
2031							}
2032							cpc_tty_receive(d);
2033							rx_dma_start(card, ch);
2034						} else 
2035#endif
2036						{
2037							if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
2038								rx_dma_stop(card, ch);
2039							}
2040							cpc_net_rx(dev);
2041							/* Discard invalid frames */
2042							dev->stats.rx_errors++;
2043							dev->stats.rx_over_errors++;
2044							chan->rx_first_bd = 0;
2045							chan->rx_last_bd = N_DMA_RX_BUF - 1;
2046							rx_dma_start(card, ch);
2047						}
2048					}
2049				}
2050				if (status & IR0_DRX(IR0_DMIB, ch)) {
2051					if (drx_stat & DSR_EOM) {
2052						if (card->hw.type == PC300_TE) {
2053							cpc_writeb(card->hw.falcbase +
2054								   card->hw.cpld_reg2,
2055								   cpc_readb (card->hw.falcbase +
2056								    	card->hw.cpld_reg2) |
2057								   (CPLD_REG2_FALC_LED1 << (2 * ch)));
2058						}
2059#ifdef CONFIG_PC300_MLPPP
2060						if (chan->conf.proto == PC300_PROTO_MLPPP) {
2061							/* verify if driver is TTY */
2062							cpc_tty_receive(d);
2063						} else {
2064							cpc_net_rx(dev);
2065						}
2066#else
2067						cpc_net_rx(dev);
2068#endif
2069						if (card->hw.type == PC300_TE) {
2070							cpc_writeb(card->hw.falcbase +
2071								   card->hw.cpld_reg2,
2072								   cpc_readb (card->hw.falcbase +
2073								    		card->hw.cpld_reg2) &
2074								   ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2075						}
2076					}
2077				}
2078				if (!(dsr_rx = cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) {
2079#ifdef PC300_DEBUG_INTR
2080		printk("%s: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x, dsr2=0x%02x)\n",
2081			dev->name, ch, status, drx_stat, dsr_rx);
2082#endif
2083					cpc_writeb(scabase + DSR_RX(ch), (dsr_rx | DSR_DE) & 0xfe);
2084				}
2085			}
2086
2087	    /**** Transmission ****/
2088			if (status & IR0_DTX((IR0_EFT | IR0_DMIA | IR0_DMIB), ch)) {
2089				u8 dtx_stat = cpc_readb(scabase + DSR_TX(ch));
2090
2091				/* Clear TX interrupts */
2092				cpc_writeb(scabase + DSR_TX(ch), dtx_stat | DSR_DWE);
2093
2094#ifdef PC300_DEBUG_INTR
2095				printk ("sca_intr: TX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n",
2096					 ch, status, dtx_stat);
2097#endif
2098				if (status & IR0_DTX(IR0_EFT, ch)) {
2099					if (dtx_stat & DSR_UDRF) {
2100						if (cpc_readb (scabase + M_REG(TBN, ch)) != 0) {
2101							cpc_writeb(scabase + M_REG(CMD,ch), CMD_TX_BUF_CLR);
2102						}
2103						if (card->hw.type == PC300_TE) {
2104							cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
2105								   cpc_readb (card->hw.falcbase + 
2106										   card->hw.cpld_reg2) &
2107								   ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2108						}
2109						dev->stats.tx_errors++;
2110						dev->stats.tx_fifo_errors++;
2111						sca_tx_intr(d);
2112					}
2113				}
2114				if (status & IR0_DTX(IR0_DMIA, ch)) {
2115					if (dtx_stat & DSR_BOF) {
2116					}
2117				}
2118				if (status & IR0_DTX(IR0_DMIB, ch)) {
2119					if (dtx_stat & DSR_EOM) {
2120						if (card->hw.type == PC300_TE) {
2121							cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
2122								   cpc_readb (card->hw.falcbase +
2123								    			card->hw.cpld_reg2) &
2124								   ~ (CPLD_REG2_FALC_LED1 << (2 * ch)));
2125						}
2126						sca_tx_intr(d);
2127					}
2128				}
2129			}
2130
2131	    /**** MSCI ****/
2132			if (status & IR0_M(IR0_RXINTA, ch)) {
2133				u8 st1 = cpc_readb(scabase + M_REG(ST1, ch));
2134
2135				/* Clear MSCI interrupts */
2136				cpc_writeb(scabase + M_REG(ST1, ch), st1);
2137
2138#ifdef PC300_DEBUG_INTR
2139				printk("sca_intr: MSCI intr chan[%d] (st=0x%08lx, st1=0x%02x)\n",
2140					 ch, status, st1);
2141#endif
2142				if (st1 & ST1_CDCD) {	/* DCD changed */
2143					if (cpc_readb(scabase + M_REG(ST3, ch)) & ST3_DCD) {
2144						printk ("%s: DCD is OFF. Going administrative down.\n",
2145							 dev->name);
2146#ifdef CONFIG_PC300_MLPPP
2147						if (chan->conf.proto != PC300_PROTO_MLPPP) {
2148							netif_carrier_off(dev);
2149						}
2150#else
2151						netif_carrier_off(dev);
2152
2153#endif
2154						card->chan[ch].d.line_off++;
2155					} else {	/* DCD = 1 */
2156						printk ("%s: DCD is ON. Going administrative up.\n",
2157							 dev->name);
2158#ifdef CONFIG_PC300_MLPPP
2159						if (chan->conf.proto != PC300_PROTO_MLPPP)
2160							/* verify if driver is not TTY */
2161#endif
2162							netif_carrier_on(dev);
2163						card->chan[ch].d.line_on++;
2164					}
2165				}
2166			}
2167			spin_unlock(&card->card_lock);
2168		}
2169		if (++intr_count == 10)
2170			/* Too much work at this board. Force exit */
2171			break;
2172	}
2173}
2174
2175static void falc_t1_loop_detection(pc300_t *card, int ch, u8 frs1)
2176{
2177	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2178	falc_t *pfalc = (falc_t *) & chan->falc;
2179	void __iomem *falcbase = card->hw.falcbase;
2180
2181	if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) &&
2182	    !pfalc->loop_gen) {
2183		if (frs1 & FRS1_LLBDD) {
2184			// A Line Loop Back Deactivation signal detected
2185			if (pfalc->loop_active) {
2186				falc_remote_loop(card, ch, 0);
2187			}
2188		} else {
2189			if ((frs1 & FRS1_LLBAD) &&
2190			    ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
2191				// A Line Loop Back Activation signal detected  
2192				if (!pfalc->loop_active) {
2193					falc_remote_loop(card, ch, 1);
2194				}
2195			}
2196		}
2197	}
2198}
2199
2200static void falc_e1_loop_detection(pc300_t *card, int ch, u8 rsp)
2201{
2202	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2203	falc_t *pfalc = (falc_t *) & chan->falc;
2204	void __iomem *falcbase = card->hw.falcbase;
2205
2206	if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) &&
2207	    !pfalc->loop_gen) {
2208		if (rsp & RSP_LLBDD) {
2209			// A Line Loop Back Deactivation signal detected
2210			if (pfalc->loop_active) {
2211				falc_remote_loop(card, ch, 0);
2212			}
2213		} else {
2214			if ((rsp & RSP_LLBAD) &&
2215			    ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) {
2216				// A Line Loop Back Activation signal detected  
2217				if (!pfalc->loop_active) {
2218					falc_remote_loop(card, ch, 1);
2219				}
2220			}
2221		}
2222	}
2223}
2224
2225static void falc_t1_intr(pc300_t * card, int ch)
2226{
2227	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2228	falc_t *pfalc = (falc_t *) & chan->falc;
2229	void __iomem *falcbase = card->hw.falcbase;
2230	u8 isr0, isr3, gis;
2231	u8 dummy;
2232
2233	while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
2234		if (gis & GIS_ISR0) {
2235			isr0 = cpc_readb(falcbase + F_REG(FISR0, ch));
2236			if (isr0 & FISR0_PDEN) {
2237				/* Read the bit to clear the situation */
2238				if (cpc_readb(falcbase + F_REG(FRS1, ch)) &
2239				    FRS1_PDEN) {
2240					pfalc->pden++;
2241				}
2242			}
2243		}
2244
2245		if (gis & GIS_ISR1) {
2246			dummy = cpc_readb(falcbase + F_REG(FISR1, ch));
2247		}
2248
2249		if (gis & GIS_ISR2) {
2250			dummy = cpc_readb(falcbase + F_REG(FISR2, ch));
2251		}
2252
2253		if (gis & GIS_ISR3) {
2254			isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
2255			if (isr3 & FISR3_SEC) {
2256				pfalc->sec++;
2257				falc_update_stats(card, ch);
2258				falc_check_status(card, ch,
2259						  cpc_readb(falcbase + F_REG(FRS0, ch)));
2260			}
2261			if (isr3 & FISR3_ES) {
2262				pfalc->es++;
2263			}
2264			if (isr3 & FISR3_LLBSC) {
2265				falc_t1_loop_detection(card, ch,
2266						       cpc_readb(falcbase + F_REG(FRS1, ch)));
2267			}
2268		}
2269	}
2270}
2271
2272static void falc_e1_intr(pc300_t * card, int ch)
2273{
2274	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch];
2275	falc_t *pfalc = (falc_t *) & chan->falc;
2276	void __iomem *falcbase = card->hw.falcbase;
2277	u8 isr1, isr2, isr3, gis, rsp;
2278	u8 dummy;
2279
2280	while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) {
2281		rsp = cpc_readb(falcbase + F_REG(RSP, ch));
2282
2283		if (gis & GIS_ISR0) {
2284			dummy = cpc_readb(falcbase + F_REG(FISR0, ch));
2285		}
2286		if (gis & GIS_ISR1) {
2287			isr1 = cpc_readb(falcbase + F_REG(FISR1, ch));
2288			if (isr1 & FISR1_XMB) {
2289				if ((pfalc->xmb_cause & 2) &&
2290				    pfalc->multiframe_mode) {
2291					if (cpc_readb (falcbase + F_REG(FRS0, ch)) & 
2292									(FRS0_LOS | FRS0_AIS | FRS0_LFA)) {
2293						cpc_writeb(falcbase + F_REG(XSP, ch),
2294							   cpc_readb(falcbase + F_REG(XSP, ch))
2295							   & ~XSP_AXS);
2296					} else {
2297						cpc_writeb(falcbase + F_REG(XSP, ch),
2298							   cpc_readb(falcbase + F_REG(XSP, ch))
2299							   | XSP_AXS);
2300					}
2301				}
2302				pfalc->xmb_cause = 0;
2303				cpc_writeb(falcbase + F_REG(IMR1, ch),
2304					   cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_XMB);
2305			}
2306			if (isr1 & FISR1_LLBSC) {
2307				falc_e1_loop_detection(card, ch, rsp);
2308			}
2309		}
2310		if (gis & GIS_ISR2) {
2311			isr2 = cpc_readb(falcbase + F_REG(FISR2, ch));
2312			if (isr2 & FISR2_T400MS) {
2313				cpc_writeb(falcbase + F_REG(XSW, ch),
2314					   cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XRA);
2315			}
2316			if (isr2 & FISR2_MFAR) {
2317				cpc_writeb(falcbase + F_REG(XSW, ch),
2318					   cpc_readb(falcbase + F_REG(XSW, ch)) & ~XSW_XRA);
2319			}
2320			if (isr2 & (FISR2_FAR | FISR2_LFA | FISR2_AIS | FISR2_LOS)) {
2321				pfalc->xmb_cause |= 2;
2322				cpc_writeb(falcbase + F_REG(IMR1, ch),
2323					   cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_XMB);
2324			}
2325		}
2326		if (gis & GIS_ISR3) {
2327			isr3 = cpc_readb(falcbase + F_REG(FISR3, ch));
2328			if (isr3 & FISR3_SEC) {
2329				pfalc->sec++;
2330				falc_update_stats(card, ch);
2331				falc_check_status(card, ch,
2332						  cpc_readb(falcbase + F_REG(FRS0, ch)));
2333			}
2334			if (isr3 & FISR3_ES) {
2335				pfalc->es++;
2336			}
2337		}
2338	}
2339}
2340
2341static void falc_intr(pc300_t * card)
2342{
2343	int ch;
2344
2345	for (ch = 0; ch < card->hw.nchan; ch++) {
2346		pc300ch_t *chan = &card->chan[ch];
2347		pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
2348
2349		if (conf->media == IF_IFACE_T1) {
2350			falc_t1_intr(card, ch);
2351		} else {
2352			falc_e1_intr(card, ch);
2353		}
2354	}
2355}
2356
2357static irqreturn_t cpc_intr(int irq, void *dev_id)
2358{
2359	pc300_t *card = dev_id;
2360	volatile u8 plx_status;
2361
2362	if (!card) {
2363#ifdef PC300_DEBUG_INTR
2364		printk("cpc_intr: spurious intr %d\n", irq);
2365#endif
2366		return IRQ_NONE;		/* spurious intr */
2367	}
2368
2369	if (!card->hw.rambase) {
2370#ifdef PC300_DEBUG_INTR
2371		printk("cpc_intr: spurious intr2 %d\n", irq);
2372#endif
2373		return IRQ_NONE;		/* spurious intr */
2374	}
2375
2376	switch (card->hw.type) {
2377		case PC300_RSV:
2378		case PC300_X21:
2379			sca_intr(card);
2380			break;
2381
2382		case PC300_TE:
2383			while ( (plx_status = (cpc_readb(card->hw.plxbase + card->hw.intctl_reg) &
2384				 (PLX_9050_LINT1_STATUS | PLX_9050_LINT2_STATUS))) != 0) {
2385				if (plx_status & PLX_9050_LINT1_STATUS) {	/* SCA Interrupt */
2386					sca_intr(card);
2387				}
2388				if (plx_status & PLX_9050_LINT2_STATUS) {	/* FALC Interrupt */
2389					falc_intr(card);
2390				}
2391			}
2392			break;
2393	}
2394	return IRQ_HANDLED;
2395}
2396
2397static void cpc_sca_status(pc300_t * card, int ch)
2398{
2399	u8 ilar;
2400	void __iomem *scabase = card->hw.scabase;
2401	unsigned long flags;
2402
2403	tx_dma_buf_check(card, ch);
2404	rx_dma_buf_check(card, ch);
2405	ilar = cpc_readb(scabase + ILAR);
2406	printk ("ILAR=0x%02x, WCRL=0x%02x, PCR=0x%02x, BTCR=0x%02x, BOLR=0x%02x\n",
2407		 ilar, cpc_readb(scabase + WCRL), cpc_readb(scabase + PCR),
2408		 cpc_readb(scabase + BTCR), cpc_readb(scabase + BOLR));
2409	printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n",
2410	       cpc_readl(scabase + DTX_REG(CDAL, ch)),
2411	       cpc_readl(scabase + DTX_REG(EDAL, ch)));
2412	printk("RX_CDA=0x%08x, RX_EDA=0x%08x, BFL=0x%04x\n",
2413	       cpc_readl(scabase + DRX_REG(CDAL, ch)),
2414	       cpc_readl(scabase + DRX_REG(EDAL, ch)),
2415	       cpc_readw(scabase + DRX_REG(BFLL, ch)));
2416	printk("DMER=0x%02x, DSR_TX=0x%02x, DSR_RX=0x%02x\n",
2417	       cpc_readb(scabase + DMER), cpc_readb(scabase + DSR_TX(ch)),
2418	       cpc_readb(scabase + DSR_RX(ch)));
2419	printk("DMR_TX=0x%02x, DMR_RX=0x%02x, DIR_TX=0x%02x, DIR_RX=0x%02x\n",
2420	       cpc_readb(scabase + DMR_TX(ch)), cpc_readb(scabase + DMR_RX(ch)),
2421	       cpc_readb(scabase + DIR_TX(ch)),
2422	       cpc_readb(scabase + DIR_RX(ch)));
2423	printk("DCR_TX=0x%02x, DCR_RX=0x%02x, FCT_TX=0x%02x, FCT_RX=0x%02x\n",
2424	       cpc_readb(scabase + DCR_TX(ch)), cpc_readb(scabase + DCR_RX(ch)),
2425	       cpc_readb(scabase + FCT_TX(ch)),
2426	       cpc_readb(scabase + FCT_RX(ch)));
2427	printk("MD0=0x%02x, MD1=0x%02x, MD2=0x%02x, MD3=0x%02x, IDL=0x%02x\n",
2428	       cpc_readb(scabase + M_REG(MD0, ch)),
2429	       cpc_readb(scabase + M_REG(MD1, ch)),
2430	       cpc_readb(scabase + M_REG(MD2, ch)),
2431	       cpc_readb(scabase + M_REG(MD3, ch)),
2432	       cpc_readb(scabase + M_REG(IDL, ch)));
2433	printk("CMD=0x%02x, SA0=0x%02x, SA1=0x%02x, TFN=0x%02x, CTL=0x%02x\n",
2434	       cpc_readb(scabase + M_REG(CMD, ch)),
2435	       cpc_readb(scabase + M_REG(SA0, ch)),
2436	       cpc_readb(scabase + M_REG(SA1, ch)),
2437	       cpc_readb(scabase + M_REG(TFN, ch)),
2438	       cpc_readb(scabase + M_REG(CTL, ch)));
2439	printk("ST0=0x%02x, ST1=0x%02x, ST2=0x%02x, ST3=0x%02x, ST4=0x%02x\n",
2440	       cpc_readb(scabase + M_REG(ST0, ch)),
2441	       cpc_readb(scabase + M_REG(ST1, ch)),
2442	       cpc_readb(scabase + M_REG(ST2, ch)),
2443	       cpc_readb(scabase + M_REG(ST3, ch)),
2444	       cpc_readb(scabase + M_REG(ST4, ch)));
2445	printk ("CST0=0x%02x, CST1=0x%02x, CST2=0x%02x, CST3=0x%02x, FST=0x%02x\n",
2446		 cpc_readb(scabase + M_REG(CST0, ch)),
2447		 cpc_readb(scabase + M_REG(CST1, ch)),
2448		 cpc_readb(scabase + M_REG(CST2, ch)),
2449		 cpc_readb(scabase + M_REG(CST3, ch)),
2450		 cpc_readb(scabase + M_REG(FST, ch)));
2451	printk("TRC0=0x%02x, TRC1=0x%02x, RRC=0x%02x, TBN=0x%02x, RBN=0x%02x\n",
2452	       cpc_readb(scabase + M_REG(TRC0, ch)),
2453	       cpc_readb(scabase + M_REG(TRC1, ch)),
2454	       cpc_readb(scabase + M_REG(RRC, ch)),
2455	       cpc_readb(scabase + M_REG(TBN, ch)),
2456	       cpc_readb(scabase + M_REG(RBN, ch)));
2457	printk("TFS=0x%02x, TNR0=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
2458	       cpc_readb(scabase + M_REG(TFS, ch)),
2459	       cpc_readb(scabase + M_REG(TNR0, ch)),
2460	       cpc_readb(scabase + M_REG(TNR1, ch)),
2461	       cpc_readb(scabase + M_REG(RNR, ch)));
2462	printk("TCR=0x%02x, RCR=0x%02x, TNR1=0x%02x, RNR=0x%02x\n",
2463	       cpc_readb(scabase + M_REG(TCR, ch)),
2464	       cpc_readb(scabase + M_REG(RCR, ch)),
2465	       cpc_readb(scabase + M_REG(TNR1, ch)),
2466	       cpc_readb(scabase + M_REG(RNR, ch)));
2467	printk("TXS=0x%02x, RXS=0x%02x, EXS=0x%02x, TMCT=0x%02x, TMCR=0x%02x\n",
2468	       cpc_readb(scabase + M_REG(TXS, ch)),
2469	       cpc_readb(scabase + M_REG(RXS, ch)),
2470	       cpc_readb(scabase + M_REG(EXS, ch)),
2471	       cpc_readb(scabase + M_REG(TMCT, ch)),
2472	       cpc_readb(scabase + M_REG(TMCR, ch)));
2473	printk("IE0=0x%02x, IE1=0x%02x, IE2=0x%02x, IE4=0x%02x, FIE=0x%02x\n",
2474	       cpc_readb(scabase + M_REG(IE0, ch)),
2475	       cpc_readb(scabase + M_REG(IE1, ch)),
2476	       cpc_readb(scabase + M_REG(IE2, ch)),
2477	       cpc_readb(scabase + M_REG(IE4, ch)),
2478	       cpc_readb(scabase + M_REG(FIE, ch)));
2479	printk("IER0=0x%08x\n", cpc_readl(scabase + IER0));
2480
2481	if (ilar != 0) {
2482		CPC_LOCK(card, flags);
2483		cpc_writeb(scabase + ILAR, ilar);
2484		cpc_writeb(scabase + DMER, 0x80);
2485		CPC_UNLOCK(card, flags);
2486	}
2487}
2488
2489static void cpc_falc_status(pc300_t * card, int ch)
2490{
2491	pc300ch_t *chan = &card->chan[ch];
2492	falc_t *pfalc = (falc_t *) & chan->falc;
2493	unsigned long flags;
2494
2495	CPC_LOCK(card, flags);
2496	printk("CH%d:   %s %s  %d channels\n",
2497	       ch, (pfalc->sync ? "SYNC" : ""), (pfalc->active ? "ACTIVE" : ""),
2498	       pfalc->num_channels);
2499
2500	printk("        pden=%d,  los=%d,  losr=%d,  lfa=%d,  farec=%d\n",
2501	       pfalc->pden, pfalc->los, pfalc->losr, pfalc->lfa, pfalc->farec);
2502	printk("        lmfa=%d,  ais=%d,  sec=%d,  es=%d,  rai=%d\n",
2503	       pfalc->lmfa, pfalc->ais, pfalc->sec, pfalc->es, pfalc->rai);
2504	printk("        bec=%d,  fec=%d,  cvc=%d,  cec=%d,  ebc=%d\n",
2505	       pfalc->bec, pfalc->fec, pfalc->cvc, pfalc->cec, pfalc->ebc);
2506
2507	printk("\n");
2508	printk("        STATUS: %s  %s  %s  %s  %s  %s\n",
2509	       (pfalc->red_alarm ? "RED" : ""),
2510	       (pfalc->blue_alarm ? "BLU" : ""),
2511	       (pfalc->yellow_alarm ? "YEL" : ""),
2512	       (pfalc->loss_fa ? "LFA" : ""),
2513	       (pfalc->loss_mfa ? "LMF" : ""), (pfalc->prbs ? "PRB" : ""));
2514	CPC_UNLOCK(card, flags);
2515}
2516
2517static int cpc_change_mtu(struct net_device *dev, int new_mtu)
2518{
2519	if ((new_mtu < 128) || (new_mtu > PC300_DEF_MTU))
2520		return -EINVAL;
2521	dev->mtu = new_mtu;
2522	return 0;
2523}
2524
2525static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2526{
2527	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
2528	pc300ch_t *chan = (pc300ch_t *) d->chan;
2529	pc300_t *card = (pc300_t *) chan->card;
2530	pc300conf_t conf_aux;
2531	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
2532	int ch = chan->channel;
2533	void __user *arg = ifr->ifr_data;
2534	struct if_settings *settings = &ifr->ifr_settings;
2535	void __iomem *scabase = card->hw.scabase;
2536
2537	if (!capable(CAP_NET_ADMIN))
2538		return -EPERM;
2539
2540	switch (cmd) {
2541		case SIOCGPC300CONF:
2542#ifdef CONFIG_PC300_MLPPP
2543			if (conf->proto != PC300_PROTO_MLPPP) {
2544				conf->proto = /* FIXME hdlc->proto.id */ 0;
2545			}
2546#else
2547			conf->proto = /* FIXME hdlc->proto.id */ 0;
2548#endif
2549			memcpy(&conf_aux.conf, conf, sizeof(pc300chconf_t));
2550			memcpy(&conf_aux.hw, &card->hw, sizeof(pc300hw_t));
2551			if (!arg || 
2552				copy_to_user(arg, &conf_aux, sizeof(pc300conf_t))) 
2553				return -EINVAL;
2554			return 0;
2555		case SIOCSPC300CONF:
2556			if (!capable(CAP_NET_ADMIN))
2557				return -EPERM;
2558			if (!arg || 
2559				copy_from_user(&conf_aux.conf, arg, sizeof(pc300chconf_t)))
2560				return -EINVAL;
2561			if (card->hw.cpld_id < 0x02 &&
2562			    conf_aux.conf.fr_mode == PC300_FR_UNFRAMED) {
2563				/* CPLD_ID < 0x02 doesn't support Unframed E1 */
2564				return -EINVAL;
2565			}
2566#ifdef CONFIG_PC300_MLPPP
2567			if (conf_aux.conf.proto == PC300_PROTO_MLPPP) {
2568				if (conf->proto != PC300_PROTO_MLPPP) {
2569					memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
2570					cpc_tty_init(d);	/* init TTY driver */
2571				}
2572			} else {
2573				if (conf_aux.conf.proto == 0xffff) {
2574					if (conf->proto == PC300_PROTO_MLPPP){ 
2575						/* ifdown interface */
2576						cpc_close(dev);
2577					}
2578				} else {
2579					memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
2580					/* FIXME hdlc->proto.id = conf->proto; */
2581				}
2582			}
2583#else
2584			memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t));
2585			/* FIXME hdlc->proto.id = conf->proto; */
2586#endif
2587			return 0;
2588		case SIOCGPC300STATUS:
2589			cpc_sca_status(card, ch);
2590			return 0;
2591		case SIOCGPC300FALCSTATUS:
2592			cpc_falc_status(card, ch);
2593			return 0;
2594
2595		case SIOCGPC300UTILSTATS:
2596			{
2597				if (!arg) {	/* clear statistics */
2598					memset(&dev->stats, 0, sizeof(dev->stats));
2599					if (card->hw.type == PC300_TE) {
2600						memset(&chan->falc, 0, sizeof(falc_t));
2601					}
2602				} else {
2603					pc300stats_t pc300stats;
2604
2605					memset(&pc300stats, 0, sizeof(pc300stats_t));
2606					pc300stats.hw_type = card->hw.type;
2607					pc300stats.line_on = card->chan[ch].d.line_on;
2608					pc300stats.line_off = card->chan[ch].d.line_off;
2609					memcpy(&pc300stats.gen_stats, &dev->stats,
2610					       sizeof(dev->stats));
2611					if (card->hw.type == PC300_TE)
2612						memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t));
2613				    	if (copy_to_user(arg, &pc300stats, sizeof(pc300stats_t)))
2614						return -EFAULT;
2615				}
2616				return 0;
2617			}
2618
2619		case SIOCGPC300UTILSTATUS:
2620			{
2621				struct pc300status pc300status;
2622
2623				pc300status.hw_type = card->hw.type;
2624				if (card->hw.type == PC300_TE) {
2625					pc300status.te_status.sync = chan->falc.sync;
2626					pc300status.te_status.red_alarm = chan->falc.red_alarm;
2627					pc300status.te_status.blue_alarm = chan->falc.blue_alarm;
2628					pc300status.te_status.loss_fa = chan->falc.loss_fa;
2629					pc300status.te_status.yellow_alarm =chan->falc.yellow_alarm;
2630					pc300status.te_status.loss_mfa = chan->falc.loss_mfa;
2631					pc300status.te_status.prbs = chan->falc.prbs;
2632				} else {
2633					pc300status.gen_status.dcd =
2634						!(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_DCD);
2635					pc300status.gen_status.cts =
2636						!(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_CTS);
2637					pc300status.gen_status.rts =
2638						!(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_RTS);
2639					pc300status.gen_status.dtr =
2640						!(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_DTR);
2641					/* There is no DSR in HD64572 */
2642				}
2643				if (!arg ||
2644				    copy_to_user(arg, &pc300status, sizeof(pc300status_t)))
2645					return -EINVAL;
2646				return 0;
2647			}
2648
2649		case SIOCSPC300TRACE:
2650			/* Sets/resets a trace_flag for the respective device */
2651			if (!arg || copy_from_user(&d->trace_on, arg,sizeof(unsigned char)))
2652					return -EINVAL;
2653			return 0;
2654
2655		case SIOCSPC300LOOPBACK:
2656			{
2657				struct pc300loopback pc300loop;
2658
2659				/* TE boards only */
2660				if (card->hw.type != PC300_TE)
2661					return -EINVAL;
2662
2663				if (!arg || 
2664					copy_from_user(&pc300loop, arg, sizeof(pc300loopback_t)))
2665						return -EINVAL;
2666				switch (pc300loop.loop_type) {
2667					case PC300LOCLOOP:	/* Turn the local loop on/off */
2668						falc_local_loop(card, ch, pc300loop.loop_on);
2669						return 0;
2670
2671					case PC300REMLOOP:	/* Turn the remote loop on/off */
2672						falc_remote_loop(card, ch, pc300loop.loop_on);
2673						return 0;
2674
2675					case PC300PAYLOADLOOP:	/* Turn the payload loop on/off */
2676						falc_payload_loop(card, ch, pc300loop.loop_on);
2677						return 0;
2678
2679					case PC300GENLOOPUP:	/* Generate loop UP */
2680						if (pc300loop.loop_on) {
2681							falc_generate_loop_up_code (card, ch);
2682						} else {
2683							turn_off_xlu(card, ch);
2684						}
2685						return 0;
2686
2687					case PC300GENLOOPDOWN:	/* Generate loop DOWN */
2688						if (pc300loop.loop_on) {
2689							falc_generate_loop_down_code (card, ch);
2690						} else {
2691							turn_off_xld(card, ch);
2692						}
2693						return 0;
2694
2695					default:
2696						return -EINVAL;
2697				}
2698			}
2699
2700		case SIOCSPC300PATTERNTEST:
2701			/* Turn the pattern test on/off and show the errors counter */
2702			{
2703				struct pc300patterntst pc300patrntst;
2704
2705				/* TE boards only */
2706				if (card->hw.type != PC300_TE)
2707					return -EINVAL;
2708
2709				if (card->hw.cpld_id < 0x02) {
2710					/* CPLD_ID < 0x02 doesn't support pattern test */
2711					return -EINVAL;
2712				}
2713
2714				if (!arg || 
2715					copy_from_user(&pc300patrntst,arg,sizeof(pc300patterntst_t)))
2716						return -EINVAL;
2717				if (pc300patrntst.patrntst_on == 2) {
2718					if (chan->falc.prbs == 0) {
2719						falc_pattern_test(card, ch, 1);
2720					}
2721					pc300patrntst.num_errors =
2722						falc_pattern_test_error(card, ch);
2723					if (copy_to_user(arg, &pc300patrntst,
2724							 sizeof(pc300patterntst_t)))
2725							return -EINVAL;
2726				} else {
2727					falc_pattern_test(card, ch, pc300patrntst.patrntst_on);
2728				}
2729				return 0;
2730			}
2731
2732		case SIOCWANDEV:
2733			switch (ifr->ifr_settings.type) {
2734				case IF_GET_IFACE:
2735				{
2736					const size_t size = sizeof(sync_serial_settings);
2737					ifr->ifr_settings.type = conf->media;
2738					if (ifr->ifr_settings.size < size) {
2739						/* data size wanted */
2740						ifr->ifr_settings.size = size;
2741						return -ENOBUFS;
2742					}
2743	
2744					if (copy_to_user(settings->ifs_ifsu.sync,
2745							 &conf->phys_settings, size)) {
2746						return -EFAULT;
2747					}
2748					return 0;
2749				}
2750
2751				case IF_IFACE_V35:
2752				case IF_IFACE_V24:
2753				case IF_IFACE_X21:
2754				{
2755					const size_t size = sizeof(sync_serial_settings);
2756
2757					if (!capable(CAP_NET_ADMIN)) {
2758						return -EPERM;
2759					}
2760					/* incorrect data len? */
2761					if (ifr->ifr_settings.size != size) {
2762						return -ENOBUFS;
2763					}
2764
2765					if (copy_from_user(&conf->phys_settings, 
2766							   settings->ifs_ifsu.sync, size)) {
2767						return -EFAULT;
2768					}
2769
2770					if (conf->phys_settings.loopback) {
2771						cpc_writeb(card->hw.scabase + M_REG(MD2, ch),
2772							cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | 
2773							MD2_LOOP_MIR);
2774					}
2775					conf->media = ifr->ifr_settings.type;
2776					return 0;
2777				}
2778
2779				case IF_IFACE_T1:
2780				case IF_IFACE_E1:
2781				{
2782					const size_t te_size = sizeof(te1_settings);
2783					const size_t size = sizeof(sync_serial_settings);
2784
2785					if (!capable(CAP_NET_ADMIN)) {
2786						return -EPERM;
2787					}
2788
2789					/* incorrect data len? */
2790					if (ifr->ifr_settings.size != te_size) {
2791						return -ENOBUFS;
2792					}
2793
2794					if (copy_from_user(&conf->phys_settings, 
2795							   settings->ifs_ifsu.te1, size)) {
2796						return -EFAULT;
2797					}/* Ignoring HDLC slot_map for a while */
2798					
2799					if (conf->phys_settings.loopback) {
2800						cpc_writeb(card->hw.scabase + M_REG(MD2, ch),
2801							cpc_readb(card->hw.scabase + M_REG(MD2, ch)) | 
2802							MD2_LOOP_MIR);
2803					}
2804					conf->media = ifr->ifr_settings.type;
2805					return 0;
2806				}
2807				default:
2808					return hdlc_ioctl(dev, ifr, cmd);
2809			}
2810
2811		default:
2812			return hdlc_ioctl(dev, ifr, cmd);
2813	}
2814}
2815
2816static int clock_rate_calc(u32 rate, u32 clock, int *br_io)
2817{
2818	int br, tc;
2819	int br_pwr, error;
2820
2821	*br_io = 0;
2822
2823	if (rate == 0)
2824		return 0;
2825
2826	for (br = 0, br_pwr = 1; br <= 9; br++, br_pwr <<= 1) {
2827		if ((tc = clock / br_pwr / rate) <= 0xff) {
2828			*br_io = br;
2829			break;
2830		}
2831	}
2832
2833	if (tc <= 0xff) {
2834		error = ((rate - (clock / br_pwr / rate)) / rate) * 1000;
2835		/* Errors bigger than +/- 1% won't be tolerated */
2836		if (error < -10 || error > 10)
2837			return -1;
2838		else
2839			return tc;
2840	} else {
2841		return -1;
2842	}
2843}
2844
2845static int ch_config(pc300dev_t * d)
2846{
2847	pc300ch_t *chan = (pc300ch_t *) d->chan;
2848	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf;
2849	pc300_t *card = (pc300_t *) chan->card;
2850	void __iomem *scabase = card->hw.scabase;
2851	void __iomem *plxbase = card->hw.plxbase;
2852	int ch = chan->channel;
2853	u32 clkrate = chan->conf.phys_settings.clock_rate;
2854	u32 clktype = chan->conf.phys_settings.clock_type;
2855	u16 encoding = chan->conf.proto_settings.encoding;
2856	u16 parity = chan->conf.proto_settings.parity;
2857	u8 md0, md2;
2858
2859	/* Reset the channel */
2860	cpc_writeb(scabase + M_REG(CMD, ch), CMD_CH_RST);
2861
2862	/* Configure the SCA registers */
2863	switch (parity) {
2864		case PARITY_NONE:
2865			md0 = MD0_BIT_SYNC;
2866			break;
2867		case PARITY_CRC16_PR0:
2868			md0 = MD0_CRC16_0|MD0_CRCC0|MD0_BIT_SYNC;
2869			break;
2870		case PARITY_CRC16_PR1:
2871			md0 = MD0_CRC16_1|MD0_CRCC0|MD0_BIT_SYNC;
2872			break;
2873		case PARITY_CRC32_PR1_CCITT:
2874			md0 = MD0_CRC32|MD0_CRCC0|MD0_BIT_SYNC;
2875			break;
2876		case PARITY_CRC16_PR1_CCITT:
2877		default:
2878			md0 = MD0_CRC_CCITT|MD0_CRCC0|MD0_BIT_SYNC;
2879			break;
2880	}
2881	switch (encoding) {
2882		case ENCODING_NRZI:
2883			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZI;
2884			break;
2885		case ENCODING_FM_MARK:	/* FM1 */
2886			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM1;
2887			break;
2888		case ENCODING_FM_SPACE:	/* FM0 */
2889			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM0;
2890			break;
2891		case ENCODING_MANCHESTER: /* It's not working... */
2892			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_MANCH;
2893			break;
2894		case ENCODING_NRZ:
2895		default:
2896			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZ;
2897			break;
2898	}
2899	cpc_writeb(scabase + M_REG(MD0, ch), md0);
2900	cpc_writeb(scabase + M_REG(MD1, ch), 0);
2901	cpc_writeb(scabase + M_REG(MD2, ch), md2);
2902 	cpc_writeb(scabase + M_REG(IDL, ch), 0x7e);
2903	cpc_writeb(scabase + M_REG(CTL, ch), CTL_URSKP | CTL_IDLC);
2904
2905	/* Configure HW media */
2906	switch (card->hw.type) {
2907		case PC300_RSV:
2908			if (conf->media == IF_IFACE_V35) {
2909				cpc_writel((plxbase + card->hw.gpioc_reg),
2910					   cpc_readl(plxbase + card->hw.gpioc_reg) | PC300_CHMEDIA_MASK(ch));
2911			} else {
2912				cpc_writel((plxbase + card->hw.gpioc_reg),
2913					   cpc_readl(plxbase + card->hw.gpioc_reg) & ~PC300_CHMEDIA_MASK(ch));
2914			}
2915			break;
2916
2917		case PC300_X21:
2918			break;
2919
2920		case PC300_TE:
2921			te_config(card, ch);
2922			break;
2923	}
2924
2925	switch (card->hw.type) {
2926		case PC300_RSV:
2927		case PC300_X21:
2928			if (clktype == CLOCK_INT || clktype == CLOCK_TXINT) {
2929				int tmc, br;
2930
2931				/* Calculate the clkrate parameters */
2932				tmc = clock_rate_calc(clkrate, card->hw.clock, &br);
2933				if (tmc < 0)
2934					return -EIO;
2935				cpc_writeb(scabase + M_REG(TMCT, ch), tmc);
2936				cpc_writeb(scabase + M_REG(TXS, ch),
2937					   (TXS_DTRXC | TXS_IBRG | br));
2938				if (clktype == CLOCK_INT) {
2939					cpc_writeb(scabase + M_REG(TMCR, ch), tmc);
2940					cpc_writeb(scabase + M_REG(RXS, ch), 
2941						   (RXS_IBRG | br));
2942				} else {
2943					cpc_writeb(scabase + M_REG(TMCR, ch), 1);
2944					cpc_writeb(scabase + M_REG(RXS, ch), 0);
2945				}
2946	    			if (card->hw.type == PC300_X21) {
2947					cpc_writeb(scabase + M_REG(GPO, ch), 1);
2948					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1);
2949				} else {
2950					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
2951				}
2952			} else {
2953				cpc_writeb(scabase + M_REG(TMCT, ch), 1);
2954				if (clktype == CLOCK_EXT) {
2955					cpc_writeb(scabase + M_REG(TXS, ch), 
2956						   TXS_DTRXC);
2957				} else {
2958					cpc_writeb(scabase + M_REG(TXS, ch), 
2959						   TXS_DTRXC|TXS_RCLK);
2960				}
2961	    			cpc_writeb(scabase + M_REG(TMCR, ch), 1);
2962				cpc_writeb(scabase + M_REG(RXS, ch), 0);
2963				if (card->hw.type == PC300_X21) {
2964					cpc_writeb(scabase + M_REG(GPO, ch), 0);
2965					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1);
2966				} else {
2967					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1);
2968				}
2969			}
2970			break;
2971
2972		case PC300_TE:
2973			/* SCA always receives clock from the FALC chip */
2974			cpc_writeb(scabase + M_REG(TMCT, ch), 1);
2975			cpc_writeb(scabase + M_REG(TXS, ch), 0);
2976			cpc_writeb(scabase + M_REG(TMCR, ch), 1);
2977			cpc_writeb(scabase + M_REG(RXS, ch), 0);
2978			cpc_writeb(scabase + M_REG(EXS, ch), 0);
2979			break;
2980	}
2981
2982	/* Enable Interrupts */
2983	cpc_writel(scabase + IER0,
2984		   cpc_readl(scabase + IER0) |
2985		   IR0_M(IR0_RXINTA, ch) |
2986		   IR0_DRX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch) |
2987		   IR0_DTX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch));
2988	cpc_writeb(scabase + M_REG(IE0, ch),
2989		   cpc_readl(scabase + M_REG(IE0, ch)) | IE0_RXINTA);
2990	cpc_writeb(scabase + M_REG(IE1, ch),
2991		   cpc_readl(scabase + M_REG(IE1, ch)) | IE1_CDCD);
2992
2993	return 0;
2994}
2995
2996static int rx_config(pc300dev_t * d)
2997{
2998	pc300ch_t *chan = (pc300ch_t *) d->chan;
2999	pc300_t *card = (pc300_t *) chan->card;
3000	void __iomem *scabase = card->hw.scabase;
3001	int ch = chan->channel;
3002
3003	cpc_writeb(scabase + DSR_RX(ch), 0);
3004
3005	/* General RX settings */
3006	cpc_writeb(scabase + M_REG(RRC, ch), 0);
3007	cpc_writeb(scabase + M_REG(RNR, ch), 16);
3008
3009	/* Enable reception */
3010	cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_CRC_INIT);
3011	cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_ENA);
3012
3013	/* Initialize DMA stuff */
3014	chan->rx_first_bd = 0;
3015	chan->rx_last_bd = N_DMA_RX_BUF - 1;
3016	rx_dma_buf_init(card, ch);
3017	cpc_writeb(scabase + DCR_RX(ch), DCR_FCT_CLR);
3018	cpc_writeb(scabase + DMR_RX(ch), (DMR_TMOD | DMR_NF));
3019	cpc_writeb(scabase + DIR_RX(ch), (DIR_EOM | DIR_BOF));
3020
3021	/* Start DMA */
3022	rx_dma_start(card, ch);
3023
3024	return 0;
3025}
3026
3027static int tx_config(pc300dev_t * d)
3028{
3029	pc300ch_t *chan = (pc300ch_t *) d->chan;
3030	pc300_t *card = (pc300_t *) chan->card;
3031	void __iomem *scabase = card->hw.scabase;
3032	int ch = chan->channel;
3033
3034	cpc_writeb(scabase + DSR_TX(ch), 0);
3035
3036	/* General TX settings */
3037	cpc_writeb(scabase + M_REG(TRC0, ch), 0);
3038	cpc_writeb(scabase + M_REG(TFS, ch), 32);
3039	cpc_writeb(scabase + M_REG(TNR0, ch), 20);
3040	cpc_writeb(scabase + M_REG(TNR1, ch), 48);
3041	cpc_writeb(scabase + M_REG(TCR, ch), 8);
3042
3043	/* Enable transmission */
3044	cpc_writeb(scabase + M_REG(CMD, ch), CMD_TX_CRC_INIT);
3045
3046	/* Initialize DMA stuff */
3047	chan->tx_first_bd = 0;
3048	chan->tx_next_bd = 0;
3049	tx_dma_buf_init(card, ch);
3050	cpc_writeb(scabase + DCR_TX(ch), DCR_FCT_CLR);
3051	cpc_writeb(scabase + DMR_TX(ch), (DMR_TMOD | DMR_NF));
3052	cpc_writeb(scabase + DIR_TX(ch), (DIR_EOM | DIR_BOF | DIR_UDRF));
3053	cpc_writel(scabase + DTX_REG(CDAL, ch), TX_BD_ADDR(ch, chan->tx_first_bd));
3054	cpc_writel(scabase + DTX_REG(EDAL, ch), TX_BD_ADDR(ch, chan->tx_next_bd));
3055
3056	return 0;
3057}
3058
3059static int cpc_attach(struct net_device *dev, unsigned short encoding,
3060		      unsigned short parity)
3061{
3062	pc300dev_t *d = (pc300dev_t *)dev_to_hdlc(dev)->priv;
3063	pc300ch_t *chan = (pc300ch_t *)d->chan;
3064	pc300_t *card = (pc300_t *)chan->card;
3065	pc300chconf_t *conf = (pc300chconf_t *)&chan->conf;
3066
3067	if (card->hw.type == PC300_TE) {
3068		if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI) {
3069			return -EINVAL;
3070		}
3071	} else {
3072		if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI &&
3073		    encoding != ENCODING_FM_MARK && encoding != ENCODING_FM_SPACE) {
3074			/* Driver doesn't support ENCODING_MANCHESTER yet */
3075			return -EINVAL;
3076		}
3077	}
3078
3079	if (parity != PARITY_NONE && parity != PARITY_CRC16_PR0 &&
3080	    parity != PARITY_CRC16_PR1 && parity != PARITY_CRC32_PR1_CCITT &&
3081	    parity != PARITY_CRC16_PR1_CCITT) {
3082		return -EINVAL;
3083	}
3084
3085	conf->proto_settings.encoding = encoding;
3086	conf->proto_settings.parity = parity;
3087	return 0;
3088}
3089
3090static int cpc_opench(pc300dev_t * d)
3091{
3092	pc300ch_t *chan = (pc300ch_t *) d->chan;
3093	pc300_t *card = (pc300_t *) chan->card;
3094	int ch = chan->channel, rc;
3095	void __iomem *scabase = card->hw.scabase;
3096
3097	rc = ch_config(d);
3098	if (rc)
3099		return rc;
3100
3101	rx_config(d);
3102
3103	tx_config(d);
3104
3105	/* Assert RTS and DTR */
3106	cpc_writeb(scabase + M_REG(CTL, ch),
3107		   cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR));
3108
3109	return 0;
3110}
3111
3112static void cpc_closech(pc300dev_t * d)
3113{
3114	pc300ch_t *chan = (pc300ch_t *) d->chan;
3115	pc300_t *card = (pc300_t *) chan->card;
3116	falc_t *pfalc = (falc_t *) & chan->falc;
3117	int ch = chan->channel;
3118
3119	cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_CH_RST);
3120	rx_dma_stop(card, ch);
3121	tx_dma_stop(card, ch);
3122
3123	if (card->hw.type == PC300_TE) {
3124		memset(pfalc, 0, sizeof(falc_t));
3125		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,
3126			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &
3127			   ~((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK |
3128			      CPLD_REG2_FALC_LED2) << (2 * ch)));
3129		/* Reset the FALC chip */
3130		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
3131			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
3132			   (CPLD_REG1_FALC_RESET << (2 * ch)));
3133		udelay(10000);
3134		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
3135			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) &
3136			   ~(CPLD_REG1_FALC_RESET << (2 * ch)));
3137	}
3138}
3139
3140int cpc_open(struct net_device *dev)
3141{
3142	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
3143	struct ifreq ifr;
3144	int result;
3145
3146#ifdef	PC300_DEBUG_OTHER
3147	printk("pc300: cpc_open");
3148#endif
3149
3150	result = hdlc_open(dev);
3151
3152	if (result)
3153		return result;
3154
3155	sprintf(ifr.ifr_name, "%s", dev->name);
3156	result = cpc_opench(d);
3157	if (result)
3158		goto err_out;
3159
3160	netif_start_queue(dev);
3161	return 0;
3162
3163err_out:
3164	hdlc_close(dev);
3165	return result;
3166}
3167
3168static int cpc_close(struct net_device *dev)
3169{
3170	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv;
3171	pc300ch_t *chan = (pc300ch_t *) d->chan;
3172	pc300_t *card = (pc300_t *) chan->card;
3173	unsigned long flags;
3174
3175#ifdef	PC300_DEBUG_OTHER
3176	printk("pc300: cpc_close");
3177#endif
3178
3179	netif_stop_queue(dev);
3180
3181	CPC_LOCK(card, flags);
3182	cpc_closech(d);
3183	CPC_UNLOCK(card, flags);
3184
3185	hdlc_close(dev);
3186
3187#ifdef CONFIG_PC300_MLPPP
3188	if (chan->conf.proto == PC300_PROTO_MLPPP) {
3189		cpc_tty_unregister_service(d);
3190		chan->conf.proto = 0xffff;
3191	}
3192#endif
3193
3194	return 0;
3195}
3196
3197static u32 detect_ram(pc300_t * card)
3198{
3199	u32 i;
3200	u8 data;
3201	void __iomem *rambase = card->hw.rambase;
3202
3203	card->hw.ramsize = PC300_RAMSIZE;
3204	/* Let's find out how much RAM is present on this board */
3205	for (i = 0; i < card->hw.ramsize; i++) {
3206		data = (u8)(i & 0xff);
3207		cpc_writeb(rambase + i, data);
3208		if (cpc_readb(rambase + i) != data) {
3209			break;
3210		}
3211	}
3212	return i;
3213}
3214
3215static void plx_init(pc300_t * card)
3216{
3217	struct RUNTIME_9050 __iomem *plx_ctl = card->hw.plxbase;
3218
3219	/* Reset PLX */
3220	cpc_writel(&plx_ctl->init_ctrl,
3221		   cpc_readl(&plx_ctl->init_ctrl) | 0x40000000);
3222	udelay(10000L);
3223	cpc_writel(&plx_ctl->init_ctrl,
3224		   cpc_readl(&plx_ctl->init_ctrl) & ~0x40000000);
3225
3226	/* Reload Config. Registers from EEPROM */
3227	cpc_writel(&plx_ctl->init_ctrl,
3228		   cpc_readl(&plx_ctl->init_ctrl) | 0x20000000);
3229	udelay(10000L);
3230	cpc_writel(&plx_ctl->init_ctrl,
3231		   cpc_readl(&plx_ctl->init_ctrl) & ~0x20000000);
3232
3233}
3234
3235static inline void show_version(void)
3236{
3237	char *rcsvers, *rcsdate, *tmp;
3238
3239	rcsvers = strchr(rcsid, ' ');
3240	rcsvers++;
3241	tmp = strchr(rcsvers, ' ');
3242	*tmp++ = '\0';
3243	rcsdate = strchr(tmp, ' ');
3244	rcsdate++;
3245	tmp = strrchr(rcsdate, ' ');
3246	*tmp = '\0';
3247	pr_info("Cyclades-PC300 driver %s %s\n", rcsvers, rcsdate);
3248}				/* show_version */
3249
3250static const struct net_device_ops cpc_netdev_ops = {
3251	.ndo_open		= cpc_open,
3252	.ndo_stop		= cpc_close,
3253	.ndo_tx_timeout		= cpc_tx_timeout,
3254	.ndo_set_mac_address	= NULL,
3255	.ndo_change_mtu		= cpc_change_mtu,
3256	.ndo_do_ioctl		= cpc_ioctl,
3257	.ndo_validate_addr	= eth_validate_addr,
3258};
3259
3260static void cpc_init_card(pc300_t * card)
3261{
3262	int i, devcount = 0;
3263	static int board_nbr = 1;
3264
3265	/* Enable interrupts on the PCI bridge */
3266	plx_init(card);
3267	cpc_writew(card->hw.plxbase + card->hw.intctl_reg,
3268		   cpc_readw(card->hw.plxbase + card->hw.intctl_reg) | 0x0040);
3269
3270#ifdef USE_PCI_CLOCK
3271	/* Set board clock to PCI clock */
3272	cpc_writel(card->hw.plxbase + card->hw.gpioc_reg,
3273		   cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) | 0x00000004UL);
3274	card->hw.clock = PC300_PCI_CLOCK;
3275#else
3276	/* Set board clock to internal oscillator clock */
3277	cpc_writel(card->hw.plxbase + card->hw.gpioc_reg,
3278		   cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & ~0x00000004UL);
3279	card->hw.clock = PC300_OSC_CLOCK;
3280#endif
3281
3282	/* Detect actual on-board RAM size */
3283	card->hw.ramsize = detect_ram(card);
3284
3285	/* Set Global SCA-II registers */
3286	cpc_writeb(card->hw.scabase + PCR, PCR_PR2);
3287	cpc_writeb(card->hw.scabase + BTCR, 0x10);
3288	cpc_writeb(card->hw.scabase + WCRL, 0);
3289	cpc_writeb(card->hw.scabase + DMER, 0x80);
3290
3291	if (card->hw.type == PC300_TE) {
3292		u8 reg1;
3293
3294		/* Check CPLD version */
3295		reg1 = cpc_readb(card->hw.falcbase + CPLD_REG1);
3296		cpc_writeb(card->hw.falcbase + CPLD_REG1, (reg1 + 0x5a));
3297		if (cpc_readb(card->hw.falcbase + CPLD_REG1) == reg1) {
3298			/* New CPLD */
3299			card->hw.cpld_id = cpc_readb(card->hw.falcbase + CPLD_ID_REG);
3300			card->hw.cpld_reg1 = CPLD_V2_REG1;
3301			card->hw.cpld_reg2 = CPLD_V2_REG2;
3302		} else {
3303			/* old CPLD */
3304			card->hw.cpld_id = 0;
3305			card->hw.cpld_reg1 = CPLD_REG1;
3306			card->hw.cpld_reg2 = CPLD_REG2;
3307			cpc_writeb(card->hw.falcbase + CPLD_REG1, reg1);
3308		}
3309
3310		/* Enable the board's global clock */
3311		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1,
3312			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) |
3313			   CPLD_REG1_GLOBAL_CLK);
3314
3315	}
3316
3317	for (i = 0; i < card->hw.nchan; i++) {
3318		pc300ch_t *chan = &card->chan[i];
3319		pc300dev_t *d = &chan->d;
3320		hdlc_device *hdlc;
3321		struct net_device *dev;
3322
3323		chan->card = card;
3324		chan->channel = i;
3325		chan->conf.phys_settings.clock_rate = 0;
3326		chan->conf.phys_settings.clock_type = CLOCK_EXT;
3327		chan->conf.proto_settings.encoding = ENCODING_NRZ;
3328		chan->conf.proto_settings.parity = PARITY_CRC16_PR1_CCITT;
3329		switch (card->hw.type) {
3330			case PC300_TE:
3331				chan->conf.media = IF_IFACE_T1;
3332				chan->conf.lcode = PC300_LC_B8ZS;
3333				chan->conf.fr_mode = PC300_FR_ESF;
3334				chan->conf.lbo = PC300_LBO_0_DB;
3335				chan->conf.rx_sens = PC300_RX_SENS_SH;
3336				chan->conf.tslot_bitmap = 0xffffffffUL;
3337				break;
3338
3339			case PC300_X21:
3340				chan->conf.media = IF_IFACE_X21;
3341				break;
3342
3343			case PC300_RSV:
3344			default:
3345				chan->conf.media = IF_IFACE_V35;
3346				break;
3347		}
3348		chan->conf.proto = IF_PROTO_PPP;
3349		chan->tx_first_bd = 0;
3350		chan->tx_next_bd = 0;
3351		chan->rx_first_bd = 0;
3352		chan->rx_last_bd = N_DMA_RX_BUF - 1;
3353		chan->nfree_tx_bd = N_DMA_TX_BUF;
3354
3355		d->chan = chan;
3356		d->trace_on = 0;
3357		d->line_on = 0;
3358		d->line_off = 0;
3359
3360		dev = alloc_hdlcdev(d);
3361		if (dev == NULL)
3362			continue;
3363
3364		hdlc = dev_to_hdlc(dev);
3365		hdlc->xmit = cpc_queue_xmit;
3366		hdlc->attach = cpc_attach;
3367		d->dev = dev;
3368		dev->mem_start = card->hw.ramphys;
3369		dev->mem_end = card->hw.ramphys + card->hw.ramsize - 1;
3370		dev->irq = card->hw.irq;
3371		dev->tx_queue_len = PC300_TX_QUEUE_LEN;
3372		dev->mtu = PC300_DEF_MTU;
3373
3374		dev->netdev_ops = &cpc_netdev_ops;
3375		dev->watchdog_timeo = PC300_TX_TIMEOUT;
3376
3377		if (register_hdlc_device(dev) == 0) {
3378			printk("%s: Cyclades-PC300/", dev->name);
3379			switch (card->hw.type) {
3380				case PC300_TE:
3381					if (card->hw.bus == PC300_PMC) {
3382						printk("TE-M");
3383					} else {
3384						printk("TE  ");
3385					}
3386					break;
3387
3388				case PC300_X21:
3389					printk("X21 ");
3390					break;
3391
3392				case PC300_RSV:
3393				default:
3394					printk("RSV ");
3395					break;
3396			}
3397			printk (" #%d, %dKB of RAM at 0x%08x, IRQ%d, channel %d.\n",
3398				 board_nbr, card->hw.ramsize / 1024,
3399				 card->hw.ramphys, card->hw.irq, i + 1);
3400			devcount++;
3401		} else {
3402			printk ("Dev%d on card(0x%08x): unable to allocate i/f name.\n",
3403				 i + 1, card->hw.ramphys);
3404			free_netdev(dev);
3405			continue;
3406		}
3407	}
3408	spin_lock_init(&card->card_lock);
3409
3410	board_nbr++;
3411}
3412
3413static int __devinit
3414cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
3415{
3416	static int first_time = 1;
3417	int err, eeprom_outdated = 0;
3418	u16 device_id;
3419	pc300_t *card;
3420
3421	if (first_time) {
3422		first_time = 0;
3423		show_version();
3424#ifdef CONFIG_PC300_MLPPP
3425		cpc_tty_reset_var();
3426#endif
3427	}
3428
3429	if ((err = pci_enable_device(pdev)) < 0)
3430		return err;
3431
3432	card = kzalloc(sizeof(pc300_t), GFP_KERNEL);
3433	if (card == NULL) {
3434		printk("PC300 found at RAM 0x%016llx, "
3435		       "but could not allocate card structure.\n",
3436		       (unsigned long long)pci_resource_start(pdev, 3));
3437		err = -ENOMEM;
3438		goto err_disable_dev;
3439	}
3440
3441	err = -ENODEV;
3442
3443	/* read PCI configuration area */
3444	device_id = ent->device;
3445	card->hw.irq = pdev->irq;
3446	card->hw.iophys = pci_resource_start(pdev, 1);
3447	card->hw.iosize = pci_resource_len(pdev, 1);
3448	card->hw.scaphys = pci_resource_start(pdev, 2);
3449	card->hw.scasize = pci_resource_len(pdev, 2);
3450	card->hw.ramphys = pci_resource_start(pdev, 3);
3451	card->hw.alloc_ramsize = pci_resource_len(pdev, 3);
3452	card->hw.falcphys = pci_resource_start(pdev, 4);
3453	card->hw.falcsize = pci_resource_len(pdev, 4);
3454	card->hw.plxphys = pci_resource_start(pdev, 5);
3455	card->hw.plxsize = pci_resource_len(pdev, 5);
3456
3457	switch (device_id) {
3458		case PCI_DEVICE_ID_PC300_RX_1:
3459		case PCI_DEVICE_ID_PC300_TE_1:
3460		case PCI_DEVICE_ID_PC300_TE_M_1:
3461			card->hw.nchan = 1;
3462			break;
3463
3464		case PCI_DEVICE_ID_PC300_RX_2:
3465		case PCI_DEVICE_ID_PC300_TE_2:
3466		case PCI_DEVICE_ID_PC300_TE_M_2:
3467		default:
3468			card->hw.nchan = PC300_MAXCHAN;
3469			break;
3470	}
3471#ifdef PC300_DEBUG_PCI
3472	printk("cpc (bus=0x0%x,pci_id=0x%x,", pdev->bus->number, pdev->devfn);
3473	printk("rev_id=%d) IRQ%d\n", pdev->revision, card->hw.irq);
3474	printk("cpc:found  ramaddr=0x%08lx plxaddr=0x%08lx "
3475	       "ctladdr=0x%08lx falcaddr=0x%08lx\n",
3476	       card->hw.ramphys, card->hw.plxphys, card->hw.scaphys,
3477	       card->hw.falcphys);
3478#endif
3479	/* Although we don't use this I/O region, we should
3480	 * request it from the kernel anyway, to avoid problems
3481	 * with other drivers accessing it. */
3482	if (!request_region(card->hw.iophys, card->hw.iosize, "PLX Registers")) {
3483		/* In case we can't allocate it, warn user */
3484		printk("WARNING: couldn't allocate I/O region for PC300 board "
3485		       "at 0x%08x!\n", card->hw.ramphys);
3486	}
3487
3488	if (card->hw.plxphys) {
3489		pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, card->hw.plxphys);
3490	} else {
3491		eeprom_outdated = 1;
3492		card->hw.plxphys = pci_resource_start(pdev, 0);
3493		card->hw.plxsize = pci_resource_len(pdev, 0);
3494	}
3495
3496	if (!request_mem_region(card->hw.plxphys, card->hw.plxsize,
3497				"PLX Registers")) {
3498		printk("PC300 found at RAM 0x%08x, "
3499		       "but could not allocate PLX mem region.\n",
3500		       card->hw.ramphys);
3501		goto err_release_io;
3502	}
3503	if (!request_mem_region(card->hw.ramphys, card->hw.alloc_ramsize,
3504				"On-board RAM")) {
3505		printk("PC300 found at RAM 0x%08x, "
3506		       "but could not allocate RAM mem region.\n",
3507		       card->hw.ramphys);
3508		goto err_release_plx;
3509	}
3510	if (!request_mem_region(card->hw.scaphys, card->hw.scasize,
3511				"SCA-II Registers")) {
3512		printk("PC300 found at RAM 0x%08x, "
3513		       "but could not allocate SCA mem region.\n",
3514		       card->hw.ramphys);
3515		goto err_release_ram;
3516	}
3517
3518	card->hw.plxbase = ioremap(card->hw.plxphys, card->hw.plxsize);
3519	card->hw.rambase = ioremap(card->hw.ramphys, card->hw.alloc_ramsize);
3520	card->hw.scabase = ioremap(card->hw.scaphys, card->hw.scasize);
3521	switch (device_id) {
3522		case PCI_DEVICE_ID_PC300_TE_1:
3523		case PCI_DEVICE_ID_PC300_TE_2:
3524		case PCI_DEVICE_ID_PC300_TE_M_1:
3525		case PCI_DEVICE_ID_PC300_TE_M_2:
3526			request_mem_region(card->hw.falcphys, card->hw.falcsize,
3527					   "FALC Registers");
3528			card->hw.falcbase = ioremap(card->hw.falcphys, card->hw.falcsize);
3529			break;
3530
3531		case PCI_DEVICE_ID_PC300_RX_1:
3532		case PCI_DEVICE_ID_PC300_RX_2:
3533		default:
3534			card->hw.falcbase = NULL;
3535			break;
3536	}
3537
3538#ifdef PC300_DEBUG_PCI
3539	printk("cpc: relocate ramaddr=0x%08lx plxaddr=0x%08lx "
3540	       "ctladdr=0x%08lx falcaddr=0x%08lx\n",
3541	       card->hw.rambase, card->hw.plxbase, card->hw.scabase,
3542	       card->hw.falcbase);
3543#endif
3544
3545	/* Set PCI drv pointer to the card structure */
3546	pci_set_drvdata(pdev, card);
3547
3548	/* Set board type */
3549	switch (device_id) {
3550		case PCI_DEVICE_ID_PC300_TE_1:
3551		case PCI_DEVICE_ID_PC300_TE_2:
3552		case PCI_DEVICE_ID_PC300_TE_M_1:
3553		case PCI_DEVICE_ID_PC300_TE_M_2:
3554			card->hw.type = PC300_TE;
3555
3556			if ((device_id == PCI_DEVICE_ID_PC300_TE_M_1) ||
3557			    (device_id == PCI_DEVICE_ID_PC300_TE_M_2)) {
3558				card->hw.bus = PC300_PMC;
3559				/* Set PLX register offsets */
3560				card->hw.gpioc_reg = 0x54;
3561				card->hw.intctl_reg = 0x4c;
3562			} else {
3563				card->hw.bus = PC300_PCI;
3564				/* Set PLX register offsets */
3565				card->hw.gpioc_reg = 0x50;
3566				card->hw.intctl_reg = 0x4c;
3567			}
3568			break;
3569
3570		case PCI_DEVICE_ID_PC300_RX_1:
3571		case PCI_DEVICE_ID_PC300_RX_2:
3572		default:
3573			card->hw.bus = PC300_PCI;
3574			/* Set PLX register offsets */
3575			card->hw.gpioc_reg = 0x50;
3576			card->hw.intctl_reg = 0x4c;
3577
3578			if ((cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & PC300_CTYPE_MASK)) {
3579				card->hw.type = PC300_X21;
3580			} else {
3581				card->hw.type = PC300_RSV;
3582			}
3583			break;
3584	}
3585
3586	/* Allocate IRQ */
3587	if (request_irq(card->hw.irq, cpc_intr, IRQF_SHARED, "Cyclades-PC300", card)) {
3588		printk ("PC300 found at RAM 0x%08x, but could not allocate IRQ%d.\n",
3589			 card->hw.ramphys, card->hw.irq);
3590		goto err_io_unmap;
3591	}
3592
3593	cpc_init_card(card);
3594
3595	if (eeprom_outdated)
3596		printk("WARNING: PC300 with outdated EEPROM.\n");
3597	return 0;
3598
3599err_io_unmap:
3600	iounmap(card->hw.plxbase);
3601	iounmap(card->hw.scabase);
3602	iounmap(card->hw.rambase);
3603	if (card->hw.type == PC300_TE) {
3604		iounmap(card->hw.falcbase);
3605		release_mem_region(card->hw.falcphys, card->hw.falcsize);
3606	}
3607	release_mem_region(card->hw.scaphys, card->hw.scasize);
3608err_release_ram:
3609	release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
3610err_release_plx:
3611	release_mem_region(card->hw.plxphys, card->hw.plxsize);
3612err_release_io:
3613	release_region(card->hw.iophys, card->hw.iosize);
3614	kfree(card);
3615err_disable_dev:
3616	pci_disable_device(pdev);
3617	return err;
3618}
3619
3620static void __devexit cpc_remove_one(struct pci_dev *pdev)
3621{
3622	pc300_t *card = pci_get_drvdata(pdev);
3623
3624	if (card->hw.rambase) {
3625		int i;
3626
3627		/* Disable interrupts on the PCI bridge */
3628		cpc_writew(card->hw.plxbase + card->hw.intctl_reg,
3629			   cpc_readw(card->hw.plxbase + card->hw.intctl_reg) & ~(0x0040));
3630
3631		for (i = 0; i < card->hw.nchan; i++) {
3632			unregister_hdlc_device(card->chan[i].d.dev);
3633		}
3634		iounmap(card->hw.plxbase);
3635		iounmap(card->hw.scabase);
3636		iounmap(card->hw.rambase);
3637		release_mem_region(card->hw.plxphys, card->hw.plxsize);
3638		release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize);
3639		release_mem_region(card->hw.scaphys, card->hw.scasize);
3640		release_region(card->hw.iophys, card->hw.iosize);
3641		if (card->hw.type == PC300_TE) {
3642			iounmap(card->hw.falcbase);
3643			release_mem_region(card->hw.falcphys, card->hw.falcsize);
3644		}
3645		for (i = 0; i < card->hw.nchan; i++)
3646			if (card->chan[i].d.dev)
3647				free_netdev(card->chan[i].d.dev);
3648		if (card->hw.irq)
3649			free_irq(card->hw.irq, card);
3650		kfree(card);
3651		pci_disable_device(pdev);
3652	}
3653}
3654
3655static struct pci_driver cpc_driver = {
3656	.name           = "pc300",
3657	.id_table       = cpc_pci_dev_id,
3658	.probe          = cpc_init_one,
3659	.remove         = __devexit_p(cpc_remove_one),
3660};
3661
3662static int __init cpc_init(void)
3663{
3664	return pci_register_driver(&cpc_driver);
3665}
3666
3667static void __exit cpc_cleanup_module(void)
3668{
3669	pci_unregister_driver(&cpc_driver);
3670}
3671
3672module_init(cpc_init);
3673module_exit(cpc_cleanup_module);
3674
3675MODULE_DESCRIPTION("Cyclades-PC300 cards driver");
3676MODULE_AUTHOR(  "Author: Ivan Passos <ivan@cyclades.com>\r\n"
3677                "Maintainer: PC300 Maintainer <pc300@cyclades.com");
3678MODULE_LICENSE("GPL");
3679