diff options
Diffstat (limited to 'drivers/net/wan')
42 files changed, 718 insertions, 9986 deletions
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 423eb26386c..94e234975c6 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig @@ -203,37 +203,6 @@ config WANXL_BUILD_FIRMWARE  	  You should never need this option, say N. -config PC300 -	tristate "Cyclades-PC300 support (RS-232/V.35, X.21, T1/E1 boards)" -	depends on HDLC && PCI && BROKEN -	---help--- -	  This driver is broken because of struct tty_driver change. - -	  Driver for the Cyclades-PC300 synchronous communication boards. - -	  These boards provide synchronous serial interfaces to your -	  Linux box (interfaces currently available are RS-232/V.35, X.21 and -	  T1/E1). If you wish to support Multilink PPP, please select the -	  option later and read the file README.mlppp provided by PC300 -	  package. - -	  To compile this as a module, choose M here: the module -	  will be called pc300. - -	  If unsure, say N. - -config PC300_MLPPP -	bool "Cyclades-PC300 MLPPP support" -	depends on PC300 && PPP_MULTILINK && PPP_SYNC_TTY && HDLC_PPP -	help -	  Multilink PPP over the PC300 synchronous communication boards. - -comment "Cyclades-PC300 MLPPP support is disabled." -	depends on HDLC && PC300 && (PPP=n || !PPP_MULTILINK || PPP_SYNC_TTY=n || !HDLC_PPP) - -comment "Refer to the file README.mlppp, provided by PC300 package." -	depends on HDLC && PC300 && (PPP=n || !PPP_MULTILINK || PPP_SYNC_TTY=n || !HDLC_PPP) -  config PC300TOO  	tristate "Cyclades PC300 RSV/X21 alternative support"  	depends on HDLC && PCI @@ -290,8 +259,8 @@ config FARSYNC  	  Frame Relay or X.25/LAPB.  	  If you want the module to be automatically loaded when the interface -	  is referenced then you should add "alias hdlcX farsync" to -	  /etc/modprobe.conf for each interface, where X is 0, 1, 2, ..., or +	  is referenced then you should add "alias hdlcX farsync" to a file +	  in /etc/modprobe.d/ for each interface, where X is 0, 1, 2, ..., or  	  simply use "alias hdlc* farsync" to indicate all of them.  	  To compile this driver as a module, choose M here: the @@ -387,63 +356,9 @@ config SDLA  	  To compile this driver as a module, choose M here: the  	  module will be called sdla. -# Wan router core. -config WAN_ROUTER_DRIVERS -	tristate "WAN router drivers" -	depends on WAN_ROUTER -	---help--- -	  Connect LAN to WAN via Linux box. - -	  Select driver your card and remember to say Y to "Wan Router." -	  You will need the wan-tools package which is available from -	  <ftp://ftp.sangoma.com/>. - -	  Note that the answer to this question won't directly affect the -	  kernel except for how subordinate drivers may be built: -	  saying N will just cause the configurator to skip all -	  the questions about WAN router drivers. - -	  If unsure, say N. - -config CYCLADES_SYNC -	tristate "Cyclom 2X(tm) cards (EXPERIMENTAL)" -	depends on WAN_ROUTER_DRIVERS && (PCI || ISA) -	---help--- -	  Cyclom 2X from Cyclades Corporation <http://www.avocent.com/> is an -	  intelligent multiprotocol WAN adapter with data transfer rates up to -	  512 Kbps. These cards support the X.25 and SNA related protocols. - -	  While no documentation is available at this time please grab the -	  wanconfig tarball in -	  <http://www.conectiva.com.br/~acme/cycsyn-devel/> (with minor changes -	  to make it compile with the current wanrouter include files; efforts -	  are being made to use the original package available at -	  <ftp://ftp.sangoma.com/>). - -	  Feel free to contact me or the cycsyn-devel mailing list at -	  <acme@conectiva.com.br> and <cycsyn-devel@bazar.conectiva.com.br> for -	  additional details, I hope to have documentation available as soon as -	  possible. (Cyclades Brazil is writing the Documentation). - -	  The next questions will ask you about the protocols you want the -	  driver to support (for now only X.25 is supported). - -	  If you have one or more of these cards, say Y to this option. - -	  To compile this driver as a module, choose M here: the -	  module will be called cyclomx. - -config CYCLOMX_X25 -	bool "Cyclom 2X X.25 support (EXPERIMENTAL)" -	depends on CYCLADES_SYNC -	help -	  Connect a Cyclom 2X card to an X.25 network. - -	  Enabling X.25 support will enlarge your kernel by about 11 kB. -  # X.25 network drivers  config LAPBETHER -	tristate "LAPB over Ethernet driver (EXPERIMENTAL)" +	tristate "LAPB over Ethernet driver"  	depends on LAPB && X25  	---help---  	  Driver for a pseudo device (typically called /dev/lapb0) which allows @@ -459,8 +374,8 @@ config LAPBETHER  	  If unsure, say N.  config X25_ASY -	tristate "X.25 async driver (EXPERIMENTAL)" -	depends on LAPB && X25 +	tristate "X.25 async driver" +	depends on LAPB && X25 && TTY  	---help---  	  Send and receive X.25 frames over regular asynchronous serial  	  lines such as telephone lines equipped with ordinary modems. diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile index 19d14bc2835..c135ef47cbc 100644 --- a/drivers/net/wan/Makefile +++ b/drivers/net/wan/Makefile @@ -5,10 +5,6 @@  # Rewritten to use lists instead of if-statements.  # -cyclomx-y                       := cycx_main.o -cyclomx-$(CONFIG_CYCLOMX_X25)	+= cycx_x25.o -cyclomx-objs			:= $(cyclomx-y)   -  obj-$(CONFIG_HDLC)		+= hdlc.o  obj-$(CONFIG_HDLC_RAW)		+= hdlc_raw.o  obj-$(CONFIG_HDLC_RAW_ETH)	+= hdlc_raw_eth.o @@ -17,10 +13,6 @@ obj-$(CONFIG_HDLC_FR)		+= hdlc_fr.o  obj-$(CONFIG_HDLC_PPP)		+= hdlc_ppp.o  obj-$(CONFIG_HDLC_X25)		+= hdlc_x25.o -pc300-y				:= pc300_drv.o -pc300-$(CONFIG_PC300_MLPPP)	+= pc300_tty.o -pc300-objs			:= $(pc300-y) -  obj-$(CONFIG_HOSTESS_SV11)	+= z85230.o	hostess_sv11.o  obj-$(CONFIG_SEALEVEL_4021)	+= z85230.o	sealevel.o  obj-$(CONFIG_COSA)		+= cosa.o @@ -32,10 +24,8 @@ obj-$(CONFIG_LANMEDIA)		+= lmc/  obj-$(CONFIG_DLCI)		+= dlci.o   obj-$(CONFIG_SDLA)		+= sdla.o -obj-$(CONFIG_CYCLADES_SYNC)	+= cycx_drv.o cyclomx.o  obj-$(CONFIG_LAPBETHER)		+= lapbether.o  obj-$(CONFIG_SBNI)		+= sbni.o -obj-$(CONFIG_PC300)		+= pc300.o  obj-$(CONFIG_N2)		+= n2.o  obj-$(CONFIG_C101)		+= c101.o  obj-$(CONFIG_WANXL)		+= wanxl.o @@ -57,9 +47,9 @@ endif  quiet_cmd_build_wanxlfw = BLD FW  $@        cmd_build_wanxlfw = \ -	$(CPP) -Wp,-MD,$(depfile) -I$(srctree)/include $< | $(AS68K) -m68360 -o $(obj)/wanxlfw.o; \ +	$(CPP) -D__ASSEMBLY__ -Wp,-MD,$(depfile) -I$(srctree)/include/uapi $< | $(AS68K) -m68360 -o $(obj)/wanxlfw.o; \  	$(LD68K) --oformat binary -Ttext 0x1000 $(obj)/wanxlfw.o -o $(obj)/wanxlfw.bin; \ -	hexdump -ve '"\n" 16/1 "0x%02X,"' $(obj)/wanxlfw.bin | sed 's/0x  ,//g;1s/^/static u8 firmware[]={/;$$s/,$$/\n};\n/' >$(obj)/wanxlfw.inc; \ +	hexdump -ve '"\n" 16/1 "0x%02X,"' $(obj)/wanxlfw.bin | sed 's/0x  ,//g;1s/^/static const u8 firmware[]={/;$$s/,$$/\n};\n/' >$(obj)/wanxlfw.inc; \  	rm -f $(obj)/wanxlfw.bin $(obj)/wanxlfw.o  $(obj)/wanxlfw.inc:	$(src)/wanxlfw.S diff --git a/drivers/net/wan/c101.c b/drivers/net/wan/c101.c index 4ac85a09c5a..09a50751763 100644 --- a/drivers/net/wan/c101.c +++ b/drivers/net/wan/c101.c @@ -14,6 +14,8 @@   *    Moxa C101 User's Manual   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/capability.h> @@ -313,44 +315,42 @@ static int __init c101_run(unsigned long irq, unsigned long winbase)  	int result;  	if (irq<3 || irq>15 || irq == 6) /* FIXME */ { -		printk(KERN_ERR "c101: invalid IRQ value\n"); +		pr_err("invalid IRQ value\n");  		return -ENODEV;  	}  	if (winbase < 0xC0000 || winbase > 0xDFFFF || (winbase & 0x3FFF) !=0) { -		printk(KERN_ERR "c101: invalid RAM value\n"); +		pr_err("invalid RAM value\n");  		return -ENODEV;  	}  	card = kzalloc(sizeof(card_t), GFP_KERNEL); -	if (card == NULL) { -		printk(KERN_ERR "c101: unable to allocate memory\n"); +	if (card == NULL)  		return -ENOBUFS; -	}  	card->dev = alloc_hdlcdev(card);  	if (!card->dev) { -		printk(KERN_ERR "c101: unable to allocate memory\n"); +		pr_err("unable to allocate memory\n");  		kfree(card);  		return -ENOBUFS;  	}  	if (request_irq(irq, sca_intr, 0, devname, card)) { -		printk(KERN_ERR "c101: could not allocate IRQ\n"); +		pr_err("could not allocate IRQ\n");  		c101_destroy_card(card);  		return -EBUSY;  	}  	card->irq = irq;  	if (!request_mem_region(winbase, C101_MAPPED_RAM_SIZE, devname)) { -		printk(KERN_ERR "c101: could not request RAM window\n"); +		pr_err("could not request RAM window\n");  		c101_destroy_card(card);  		return -EBUSY;  	}  	card->phy_winbase = winbase;  	card->win0base = ioremap(winbase, C101_MAPPED_RAM_SIZE);  	if (!card->win0base) { -		printk(KERN_ERR "c101: could not map I/O address\n"); +		pr_err("could not map I/O address\n");  		c101_destroy_card(card);  		return -EFAULT;  	} @@ -381,7 +381,7 @@ static int __init c101_run(unsigned long irq, unsigned long winbase)  	result = register_hdlc_device(dev);  	if (result) { -		printk(KERN_WARNING "c101: unable to register hdlc device\n"); +		pr_warn("unable to register hdlc device\n");  		c101_destroy_card(card);  		return result;  	} @@ -389,10 +389,8 @@ static int __init c101_run(unsigned long irq, unsigned long winbase)  	sca_init_port(card); /* Set up C101 memory */  	set_carrier(card); -	printk(KERN_INFO "%s: Moxa C101 on IRQ%u," -	       " using %u TX + %u RX packets rings\n", -	       dev->name, card->irq, -	       card->tx_ring_buffers, card->rx_ring_buffers); +	netdev_info(dev, "Moxa C101 on IRQ%u, using %u TX + %u RX packets rings\n", +		    card->irq, card->tx_ring_buffers, card->rx_ring_buffers);  	*new_card = card;  	new_card = &card->next_card; @@ -405,12 +403,12 @@ static int __init c101_init(void)  {  	if (hw == NULL) {  #ifdef MODULE -		printk(KERN_INFO "c101: no card initialized\n"); +		pr_info("no card initialized\n");  #endif  		return -EINVAL;	/* no parameters specified, abort */  	} -	printk(KERN_INFO "%s\n", version); +	pr_info("%s\n", version);  	do {  		unsigned long irq, ram; @@ -428,7 +426,7 @@ static int __init c101_init(void)  			return first_card ? 0 : -EINVAL;  	}while(*hw++ == ':'); -	printk(KERN_ERR "c101: invalid hardware parameters\n"); +	pr_err("invalid hardware parameters\n");  	return first_card ? 0 : -EINVAL;  } diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 10bafd59f9c..83c39e2858b 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c @@ -74,6 +74,8 @@   * The Sync PPP/Cisco HDLC layer (syncppp.c) ported to Linux by Alan Cox   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/sched.h> @@ -329,7 +331,7 @@ static int startmicrocode(struct cosa_data *cosa, int address);  static int readmem(struct cosa_data *cosa, char __user *data, int addr, int len);  static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id); -/* Auxilliary functions */ +/* Auxiliary functions */  static int get_wait_data(struct cosa_data *cosa);  static int put_wait_data(struct cosa_data *cosa, int data);  static int puthexnumber(struct cosa_data *cosa, int number); @@ -361,14 +363,13 @@ static int __init cosa_init(void)  	if (cosa_major > 0) {  		if (register_chrdev(cosa_major, "cosa", &cosa_fops)) { -			printk(KERN_WARNING "cosa: unable to get major %d\n", -				cosa_major); +			pr_warn("unable to get major %d\n", cosa_major);  			err = -EIO;  			goto out;  		}  	} else {  		if (!(cosa_major=register_chrdev(0, "cosa", &cosa_fops))) { -			printk(KERN_WARNING "cosa: unable to register chardev\n"); +			pr_warn("unable to register chardev\n");  			err = -EIO;  			goto out;  		} @@ -378,7 +379,7 @@ static int __init cosa_init(void)  	for (i=0; io[i] != 0 && i < MAX_CARDS; i++)  		cosa_probe(io[i], irq[i], dma[i]);  	if (!nr_cards) { -		printk(KERN_WARNING "cosa: no devices found.\n"); +		pr_warn("no devices found\n");  		unregister_chrdev(cosa_major, "cosa");  		err = -ENODEV;  		goto out; @@ -447,26 +448,25 @@ static int cosa_probe(int base, int irq, int dma)  	/* Checking validity of parameters: */  	/* IRQ should be 2-7 or 10-15; negative IRQ means autoprobe */  	if ((irq >= 0  && irq < 2) || irq > 15 || (irq < 10 && irq > 7)) { -		printk (KERN_INFO "cosa_probe: invalid IRQ %d\n", irq); +		pr_info("invalid IRQ %d\n", irq);  		return -1;  	}  	/* I/O address should be between 0x100 and 0x3ff and should be  	 * multiple of 8. */  	if (base < 0x100 || base > 0x3ff || base & 0x7) { -		printk (KERN_INFO "cosa_probe: invalid I/O address 0x%x\n", -			base); +		pr_info("invalid I/O address 0x%x\n", base);  		return -1;  	}  	/* DMA should be 0,1 or 3-7 */  	if (dma < 0 || dma == 4 || dma > 7) { -		printk (KERN_INFO "cosa_probe: invalid DMA %d\n", dma); +		pr_info("invalid DMA %d\n", dma);  		return -1;  	}  	/* and finally, on 16-bit COSA DMA should be 4-7 and   	 * I/O base should not be multiple of 0x10 */  	if (((base & 0x8) && dma < 4) || (!(base & 0x8) && dma > 3)) { -		printk (KERN_INFO "cosa_probe: 8/16 bit base and DMA mismatch" -			" (base=0x%x, dma=%d)\n", base, dma); +		pr_info("8/16 bit base and DMA mismatch (base=0x%x, dma=%d)\n", +			base, dma);  		return -1;  	} @@ -479,7 +479,7 @@ static int cosa_probe(int base, int irq, int dma)  		return -1;  	if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) { -		printk(KERN_DEBUG "cosa: probe at 0x%x failed.\n", base); +		printk(KERN_DEBUG "probe at 0x%x failed.\n", base);  		err = -1;  		goto err_out;  	} @@ -492,8 +492,7 @@ static int cosa_probe(int base, int irq, int dma)  	else {  /* Print a warning only if we are not autoprobing */  #ifndef COSA_ISA_AUTOPROBE -		printk(KERN_INFO "cosa: valid signature not found at 0x%x.\n", -			base); +		pr_info("valid signature not found at 0x%x\n", base);  #endif  		err = -1;  		goto err_out; @@ -501,14 +500,14 @@ static int cosa_probe(int base, int irq, int dma)  	/* Update the name of the region now we know the type of card */   	release_region(base, is_8bit(cosa)?2:4);  	if (!request_region(base, is_8bit(cosa)?2:4, cosa->type)) { -		printk(KERN_DEBUG "cosa: changing name at 0x%x failed.\n", base); +		printk(KERN_DEBUG "changing name at 0x%x failed.\n", base);  		return -1;  	}  	/* Now do IRQ autoprobe */  	if (irq < 0) {  		unsigned long irqs; -/*		printk(KERN_INFO "IRQ autoprobe\n"); */ +/*		pr_info("IRQ autoprobe\n"); */  		irqs = probe_irq_on();  		/*   		 * Enable interrupt on tx buffer empty (it sure is)  @@ -526,13 +525,13 @@ static int cosa_probe(int base, int irq, int dma)  		cosa_getdata8(cosa);  		if (irq < 0) { -			printk (KERN_INFO "cosa IRQ autoprobe: multiple interrupts obtained (%d, board at 0x%x)\n", +			pr_info("multiple interrupts obtained (%d, board at 0x%x)\n",  				irq, cosa->datareg);  			err = -1;  			goto err_out;  		}  		if (irq == 0) { -			printk (KERN_INFO "cosa IRQ autoprobe: no interrupt obtained (board at 0x%x)\n", +			pr_info("no interrupt obtained (board at 0x%x)\n",  				cosa->datareg);  		/*	return -1; */  		} @@ -579,8 +578,7 @@ static int cosa_probe(int base, int irq, int dma)  		/* Register the network interface */  		if (!(chan->netdev = alloc_hdlcdev(chan))) { -			printk(KERN_WARNING "%s: alloc_hdlcdev failed.\n", -			       chan->name); +			pr_warn("%s: alloc_hdlcdev failed\n", chan->name);  			goto err_hdlcdev;  		}  		dev_to_hdlc(chan->netdev)->attach = cosa_net_attach; @@ -591,14 +589,14 @@ static int cosa_probe(int base, int irq, int dma)  		chan->netdev->irq = chan->cosa->irq;  		chan->netdev->dma = chan->cosa->dma;  		if (register_hdlc_device(chan->netdev)) { -			printk(KERN_WARNING "%s: register_hdlc_device()" -			       " failed.\n", chan->netdev->name); +			netdev_warn(chan->netdev, +				    "register_hdlc_device() failed\n");  			free_netdev(chan->netdev);  			goto err_hdlcdev;  		}  	} -	printk (KERN_INFO "cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n", +	pr_info("cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n",  		cosa->num, cosa->id_string, cosa->type,  		cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels); @@ -618,8 +616,7 @@ err_out1:  	free_irq(cosa->irq, cosa);  err_out:  	release_region(cosa->datareg,is_8bit(cosa)?2:4); -	printk(KERN_NOTICE "cosa%d: allocating resources failed\n", -	       cosa->num); +	pr_notice("cosa%d: allocating resources failed\n", cosa->num);  	return err;  } @@ -641,14 +638,14 @@ static int cosa_net_open(struct net_device *dev)  	unsigned long flags;  	if (!(chan->cosa->firmware_status & COSA_FW_START)) { -		printk(KERN_NOTICE "%s: start the firmware first (status %d)\n", -			chan->cosa->name, chan->cosa->firmware_status); +		pr_notice("%s: start the firmware first (status %d)\n", +			  chan->cosa->name, chan->cosa->firmware_status);  		return -EPERM;  	}  	spin_lock_irqsave(&chan->cosa->lock, flags);  	if (chan->usage != 0) { -		printk(KERN_WARNING "%s: cosa_net_open called with usage count" -		       " %d\n", chan->name, chan->usage); +		pr_warn("%s: cosa_net_open called with usage count %d\n", +			chan->name, chan->usage);  		spin_unlock_irqrestore(&chan->cosa->lock, flags);  		return -EBUSY;  	} @@ -736,8 +733,7 @@ static char *cosa_net_setup_rx(struct channel_data *chan, int size)  	kfree_skb(chan->rx_skb);  	chan->rx_skb = dev_alloc_skb(size);  	if (chan->rx_skb == NULL) { -		printk(KERN_NOTICE "%s: Memory squeeze, dropping packet\n", -			chan->name); +		pr_notice("%s: Memory squeeze, dropping packet\n", chan->name);  		chan->netdev->stats.rx_dropped++;  		return NULL;  	} @@ -748,8 +744,7 @@ static char *cosa_net_setup_rx(struct channel_data *chan, int size)  static int cosa_net_rx_done(struct channel_data *chan)  {  	if (!chan->rx_skb) { -		printk(KERN_WARNING "%s: rx_done with empty skb!\n", -			chan->name); +		pr_warn("%s: rx_done with empty skb!\n", chan->name);  		chan->netdev->stats.rx_errors++;  		chan->netdev->stats.rx_frame_errors++;  		return 0; @@ -768,8 +763,7 @@ static int cosa_net_rx_done(struct channel_data *chan)  static int cosa_net_tx_done(struct channel_data *chan, int size)  {  	if (!chan->tx_skb) { -		printk(KERN_WARNING "%s: tx_done with empty skb!\n", -			chan->name); +		pr_warn("%s: tx_done with empty skb!\n", chan->name);  		chan->netdev->stats.tx_errors++;  		chan->netdev->stats.tx_aborted_errors++;  		return 1; @@ -794,15 +788,15 @@ static ssize_t cosa_read(struct file *file,  	char *kbuf;  	if (!(cosa->firmware_status & COSA_FW_START)) { -		printk(KERN_NOTICE "%s: start the firmware first (status %d)\n", -			cosa->name, cosa->firmware_status); +		pr_notice("%s: start the firmware first (status %d)\n", +			  cosa->name, cosa->firmware_status);  		return -EPERM;  	}  	if (mutex_lock_interruptible(&chan->rlock))  		return -ERESTARTSYS; -	if ((chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL)) == NULL) { -		printk(KERN_INFO "%s: cosa_read() - OOM\n", cosa->name); +	chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL); +	if (chan->rxdata == NULL) {  		mutex_unlock(&chan->rlock);  		return -ENOMEM;  	} @@ -869,8 +863,8 @@ static ssize_t cosa_write(struct file *file,  	char *kbuf;  	if (!(cosa->firmware_status & COSA_FW_START)) { -		printk(KERN_NOTICE "%s: start the firmware first (status %d)\n", -			cosa->name, cosa->firmware_status); +		pr_notice("%s: start the firmware first (status %d)\n", +			  cosa->name, cosa->firmware_status);  		return -EPERM;  	}  	if (down_interruptible(&chan->wsem)) @@ -880,9 +874,8 @@ static ssize_t cosa_write(struct file *file,  		count = COSA_MTU;  	/* Allocate the buffer */ -	if ((kbuf = kmalloc(count, GFP_KERNEL|GFP_DMA)) == NULL) { -		printk(KERN_NOTICE "%s: cosa_write() OOM - dropping packet\n", -			cosa->name); +	kbuf = kmalloc(count, GFP_KERNEL|GFP_DMA); +	if (kbuf == NULL) {  		up(&chan->wsem);  		return -ENOMEM;  	} @@ -932,7 +925,7 @@ static int chrdev_tx_done(struct channel_data *chan, int size)  static unsigned int cosa_poll(struct file *file, poll_table *poll)  { -	printk(KERN_INFO "cosa_poll is here\n"); +	pr_info("cosa_poll is here\n");  	return 0;  } @@ -945,14 +938,14 @@ static int cosa_open(struct inode *inode, struct file *file)  	int ret = 0;  	mutex_lock(&cosa_chardev_mutex); -	if ((n=iminor(file->f_path.dentry->d_inode)>>CARD_MINOR_BITS) +	if ((n=iminor(file_inode(file))>>CARD_MINOR_BITS)  		>= nr_cards) {  		ret = -ENODEV;  		goto out;  	}  	cosa = cosa_cards+n; -	if ((n=iminor(file->f_path.dentry->d_inode) +	if ((n=iminor(file_inode(file))  		& ((1<<CARD_MINOR_BITS)-1)) >= cosa->nchannels) {  		ret = -ENODEV;  		goto out; @@ -1017,15 +1010,14 @@ static inline int cosa_reset(struct cosa_data *cosa)  {  	char idstring[COSA_MAX_ID_STRING];  	if (cosa->usage > 1) -		printk(KERN_INFO "cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n", +		pr_info("cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n",  			cosa->num, cosa->usage);  	cosa->firmware_status &= ~(COSA_FW_RESET|COSA_FW_START);  	if (cosa_reset_and_read_id(cosa, idstring) < 0) { -		printk(KERN_NOTICE "cosa%d: reset failed\n", cosa->num); +		pr_notice("cosa%d: reset failed\n", cosa->num);  		return -EIO;  	} -	printk(KERN_INFO "cosa%d: resetting device: %s\n", cosa->num, -		idstring); +	pr_info("cosa%d: resetting device: %s\n", cosa->num, idstring);  	cosa->firmware_status |= COSA_FW_RESET;  	return 0;  } @@ -1037,11 +1029,11 @@ static inline int cosa_download(struct cosa_data *cosa, void __user *arg)  	int i;  	if (cosa->usage > 1) -		printk(KERN_INFO "%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", +		pr_info("%s: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",  			cosa->name, cosa->usage);  	if (!(cosa->firmware_status & COSA_FW_RESET)) { -		printk(KERN_NOTICE "%s: reset the card first (status %d).\n", -			cosa->name, cosa->firmware_status); +		pr_notice("%s: reset the card first (status %d)\n", +			  cosa->name, cosa->firmware_status);  		return -EPERM;  	} @@ -1059,11 +1051,11 @@ static inline int cosa_download(struct cosa_data *cosa, void __user *arg)  	i = download(cosa, d.code, d.len, d.addr);  	if (i < 0) { -		printk(KERN_NOTICE "cosa%d: microcode download failed: %d\n", -			cosa->num, i); +		pr_notice("cosa%d: microcode download failed: %d\n", +			  cosa->num, i);  		return -EIO;  	} -	printk(KERN_INFO "cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n", +	pr_info("cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n",  		cosa->num, d.len, d.addr);  	cosa->firmware_status |= COSA_FW_RESET|COSA_FW_DOWNLOAD;  	return 0; @@ -1076,12 +1068,11 @@ static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg)  	int i;  	if (cosa->usage > 1) -		printk(KERN_INFO "cosa%d: WARNING: readmem requested with " -			"cosa->usage > 1 (%d). Odd things may happen.\n", +		pr_info("cosa%d: WARNING: readmem requested with cosa->usage > 1 (%d). Odd things may happen.\n",  			cosa->num, cosa->usage);  	if (!(cosa->firmware_status & COSA_FW_RESET)) { -		printk(KERN_NOTICE "%s: reset the card first (status %d).\n", -			cosa->name, cosa->firmware_status); +		pr_notice("%s: reset the card first (status %d)\n", +			  cosa->name, cosa->firmware_status);  		return -EPERM;  	} @@ -1093,11 +1084,10 @@ static inline int cosa_readmem(struct cosa_data *cosa, void __user *arg)  	i = readmem(cosa, d.code, d.len, d.addr);  	if (i < 0) { -		printk(KERN_NOTICE "cosa%d: reading memory failed: %d\n", -			cosa->num, i); +		pr_notice("cosa%d: reading memory failed: %d\n", cosa->num, i);  		return -EIO;  	} -	printk(KERN_INFO "cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n", +	pr_info("cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n",  		cosa->num, d.len, d.addr);  	cosa->firmware_status |= COSA_FW_RESET;  	return 0; @@ -1109,23 +1099,22 @@ static inline int cosa_start(struct cosa_data *cosa, int address)  	int i;  	if (cosa->usage > 1) -		printk(KERN_INFO "cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n", +		pr_info("cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",  			cosa->num, cosa->usage);  	if ((cosa->firmware_status & (COSA_FW_RESET|COSA_FW_DOWNLOAD))  		!= (COSA_FW_RESET|COSA_FW_DOWNLOAD)) { -		printk(KERN_NOTICE "%s: download the microcode and/or reset the card first (status %d).\n", -			cosa->name, cosa->firmware_status); +		pr_notice("%s: download the microcode and/or reset the card first (status %d)\n", +			  cosa->name, cosa->firmware_status);  		return -EPERM;  	}  	cosa->firmware_status &= ~COSA_FW_RESET;  	if ((i=startmicrocode(cosa, address)) < 0) { -		printk(KERN_NOTICE "cosa%d: start microcode at 0x%04x failed: %d\n", -			cosa->num, address, i); +		pr_notice("cosa%d: start microcode at 0x%04x failed: %d\n", +			  cosa->num, address, i);  		return -EIO;  	} -	printk(KERN_INFO "cosa%d: starting microcode at 0x%04x\n", -		cosa->num, address); +	pr_info("cosa%d: starting microcode at 0x%04x\n", cosa->num, address);  	cosa->startaddr = address;  	cosa->firmware_status |= COSA_FW_START;  	return 0; @@ -1255,11 +1244,11 @@ static int cosa_start_tx(struct channel_data *chan, char *buf, int len)  #ifdef DEBUG_DATA  	int i; -	printk(KERN_INFO "cosa%dc%d: starting tx(0x%x)", chan->cosa->num, -		chan->num, len); +	pr_info("cosa%dc%d: starting tx(0x%x)", +		chan->cosa->num, chan->num, len);  	for (i=0; i<len; i++) -		printk(" %02x", buf[i]&0xff); -	printk("\n"); +		pr_cont(" %02x", buf[i]&0xff); +	pr_cont("\n");  #endif  	spin_lock_irqsave(&cosa->lock, flags);  	chan->txbuf = buf; @@ -1353,7 +1342,7 @@ static void cosa_kick(struct cosa_data *cosa)  	if (test_bit(TXBIT, &cosa->rxtx))  		s = "TX DMA"; -	printk(KERN_INFO "%s: %s timeout - restarting.\n", cosa->name, s);  +	pr_info("%s: %s timeout - restarting\n", cosa->name, s);  	spin_lock_irqsave(&cosa->lock, flags);  	cosa->rxtx = 0; @@ -1387,7 +1376,7 @@ static int cosa_dma_able(struct channel_data *chan, char *buf, int len)  		return 0;  	if ((b^ (b+len)) & 0x10000) {  		if (count++ < 5) -			printk(KERN_INFO "%s: packet spanning a 64k boundary\n", +			pr_info("%s: packet spanning a 64k boundary\n",  				chan->name);  		return 0;  	} @@ -1498,8 +1487,7 @@ static int readmem(struct cosa_data *cosa, char __user *microcode, int length, i  		char c;  		int i;  		if ((i=get_wait_data(cosa)) == -1) { -			printk (KERN_INFO "cosa: 0x%04x bytes remaining\n", -				length); +			pr_info("0x%04x bytes remaining\n", length);  			return -11;  		}  		c=i; @@ -1533,11 +1521,7 @@ static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring)  	cosa_putstatus(cosa, 0);  	cosa_getdata8(cosa);  	cosa_putstatus(cosa, SR_RST); -#ifdef MODULE  	msleep(500); -#else -	udelay(5*100000); -#endif  	/* Disable all IRQs from the card */  	cosa_putstatus(cosa, 0); @@ -1582,14 +1566,15 @@ static int get_wait_data(struct cosa_data *cosa)  			short r;  			r = cosa_getdata8(cosa);  #if 0 -			printk(KERN_INFO "cosa: get_wait_data returning after %d retries\n", 999-retries); +			pr_info("get_wait_data returning after %d retries\n", +				999-retries);  #endif  			return r;  		}  		/* sleep if not ready to read */  		schedule_timeout_interruptible(1);  	} -	printk(KERN_INFO "cosa: timeout in get_wait_data (status 0x%x)\n", +	pr_info("timeout in get_wait_data (status 0x%x)\n",  		cosa_getstatus(cosa));  	return -1;  } @@ -1607,7 +1592,7 @@ static int put_wait_data(struct cosa_data *cosa, int data)  		if (cosa_getstatus(cosa) & SR_TX_RDY) {  			cosa_putdata8(cosa, data);  #if 0 -			printk(KERN_INFO "Putdata: %d retries\n", 999-retries); +			pr_info("Putdata: %d retries\n", 999-retries);  #endif  			return 0;  		} @@ -1616,7 +1601,7 @@ static int put_wait_data(struct cosa_data *cosa, int data)  		schedule_timeout_interruptible(1);  #endif  	} -	printk(KERN_INFO "cosa%d: timeout in put_wait_data (status 0x%x)\n", +	pr_info("cosa%d: timeout in put_wait_data (status 0x%x)\n",  		cosa->num, cosa_getstatus(cosa));  	return -1;  } @@ -1636,13 +1621,13 @@ static int puthexnumber(struct cosa_data *cosa, int number)  	sprintf(temp, "%04X", number);  	for (i=0; i<4; i++) {  		if (put_wait_data(cosa, temp[i]) == -1) { -			printk(KERN_NOTICE "cosa%d: puthexnumber failed to write byte %d\n", -				cosa->num, i); +			pr_notice("cosa%d: puthexnumber failed to write byte %d\n", +				  cosa->num, i);  			return -1-2*i;  		}  		if (get_wait_data(cosa) != temp[i]) { -			printk(KERN_NOTICE "cosa%d: puthexhumber failed to read echo of byte %d\n", -				cosa->num, i); +			pr_notice("cosa%d: puthexhumber failed to read echo of byte %d\n", +				  cosa->num, i);  			return -2-2*i;  		}  	} @@ -1687,8 +1672,7 @@ static inline void tx_interrupt(struct cosa_data *cosa, int status)  {  	unsigned long flags, flags1;  #ifdef DEBUG_IRQS -	printk(KERN_INFO "cosa%d: SR_DOWN_REQUEST status=0x%04x\n", -		cosa->num, status); +	pr_info("cosa%d: SR_DOWN_REQUEST status=0x%04x\n", cosa->num, status);  #endif  	spin_lock_irqsave(&cosa->lock, flags);  	set_bit(TXBIT, &cosa->rxtx); @@ -1696,8 +1680,7 @@ static inline void tx_interrupt(struct cosa_data *cosa, int status)  		/* flow control, see the comment above */  		int i=0;  		if (!cosa->txbitmap) { -			printk(KERN_WARNING "%s: No channel wants data " -				"in TX IRQ. Expect DMA timeout.", +			pr_warn("%s: No channel wants data in TX IRQ. Expect DMA timeout.\n",  				cosa->name);  			put_driver_status_nolock(cosa);  			clear_bit(TXBIT, &cosa->rxtx); @@ -1780,14 +1763,14 @@ static inline void tx_interrupt(struct cosa_data *cosa, int status)  	if (cosa->busmaster) {  		unsigned long addr = virt_to_bus(cosa->txbuf);  		int count=0; -		printk(KERN_INFO "busmaster IRQ\n"); +		pr_info("busmaster IRQ\n");  		while (!(cosa_getstatus(cosa)&SR_TX_RDY)) {  			count++;  			udelay(10);  			if (count > 1000) break;  		} -		printk(KERN_INFO "status %x\n", cosa_getstatus(cosa)); -		printk(KERN_INFO "ready after %d loops\n", count); +		pr_info("status %x\n", cosa_getstatus(cosa)); +		pr_info("ready after %d loops\n", count);  		cosa_putdata16(cosa, (addr >> 16)&0xffff);  		count = 0; @@ -1796,7 +1779,7 @@ static inline void tx_interrupt(struct cosa_data *cosa, int status)  			if (count > 1000) break;  			udelay(10);  		} -		printk(KERN_INFO "ready after %d loops\n", count); +		pr_info("ready after %d loops\n", count);  		cosa_putdata16(cosa, addr &0xffff);  		flags1 = claim_dma_lock();  		set_dma_mode(cosa->dma, DMA_MODE_CASCADE); @@ -1824,7 +1807,7 @@ static inline void rx_interrupt(struct cosa_data *cosa, int status)  {  	unsigned long flags;  #ifdef DEBUG_IRQS -	printk(KERN_INFO "cosa%d: SR_UP_REQUEST\n", cosa->num); +	pr_info("cosa%d: SR_UP_REQUEST\n", cosa->num);  #endif  	spin_lock_irqsave(&cosa->lock, flags); @@ -1847,7 +1830,7 @@ static inline void rx_interrupt(struct cosa_data *cosa, int status)  			debug_data_in(cosa, cosa->rxsize & 0xff);  #endif  #if 0 -			printk(KERN_INFO "cosa%d: receive rxsize = (0x%04x).\n", +			pr_info("cosa%d: receive rxsize = (0x%04x)\n",  				cosa->num, cosa->rxsize);  #endif  		} @@ -1857,12 +1840,12 @@ static inline void rx_interrupt(struct cosa_data *cosa, int status)  		debug_data_in(cosa, cosa->rxsize);  #endif  #if 0 -		printk(KERN_INFO "cosa%d: receive rxsize = (0x%04x).\n", +		pr_info("cosa%d: receive rxsize = (0x%04x)\n",  			cosa->num, cosa->rxsize);  #endif  	}  	if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) { -		printk(KERN_WARNING "%s: rx for unknown channel (0x%04x)\n", +		pr_warn("%s: rx for unknown channel (0x%04x)\n",  			cosa->name, cosa->rxsize);  		spin_unlock_irqrestore(&cosa->lock, flags);  		goto reject; @@ -1877,7 +1860,7 @@ static inline void rx_interrupt(struct cosa_data *cosa, int status)  	if (!cosa->rxbuf) {  reject:		/* Reject the packet */ -		printk(KERN_INFO "cosa%d: rejecting packet on channel %d\n", +		pr_info("cosa%d: rejecting packet on channel %d\n",  			cosa->num, cosa->rxchan->num);  		cosa->rxbuf = cosa->bouncebuf;  	} @@ -1924,11 +1907,11 @@ static inline void eot_interrupt(struct cosa_data *cosa, int status)  #ifdef DEBUG_DATA  	{  		int i; -		printk(KERN_INFO "cosa%dc%d: done rx(0x%x)", cosa->num,  -			cosa->rxchan->num, cosa->rxsize); +		pr_info("cosa%dc%d: done rx(0x%x)", +			cosa->num, cosa->rxchan->num, cosa->rxsize);  		for (i=0; i<cosa->rxsize; i++) -			printk (" %02x", cosa->rxbuf[i]&0xff); -		printk("\n"); +			pr_cont(" %02x", cosa->rxbuf[i]&0xff); +		pr_cont("\n");  	}  #endif  		/* Packet for unknown channel? */ @@ -1940,8 +1923,7 @@ static inline void eot_interrupt(struct cosa_data *cosa, int status)  			if (cosa->rxchan->rx_done(cosa->rxchan))  				clear_bit(cosa->rxchan->num, &cosa->rxbitmap);  	} else { -		printk(KERN_NOTICE "cosa%d: unexpected EOT interrupt\n", -			cosa->num); +		pr_notice("cosa%d: unexpected EOT interrupt\n", cosa->num);  	}  	/*  	 * Clear the RXBIT, TXBIT and IRQBIT (the latest should be @@ -1963,8 +1945,7 @@ static irqreturn_t cosa_interrupt(int irq, void *cosa_)  again:  	status = cosa_getstatus(cosa);  #ifdef DEBUG_IRQS -	printk(KERN_INFO "cosa%d: got IRQ, status 0x%02x\n", cosa->num, -		status & 0xff); +	pr_info("cosa%d: got IRQ, status 0x%02x\n", cosa->num, status & 0xff);  #endif  #ifdef DEBUG_IO  	debug_status_in(cosa, status); @@ -1985,15 +1966,15 @@ again:  			udelay(100);  			goto again;  		} -		printk(KERN_INFO "cosa%d: unknown status 0x%02x in IRQ after %d retries\n", +		pr_info("cosa%d: unknown status 0x%02x in IRQ after %d retries\n",  			cosa->num, status & 0xff, count);  	}  #ifdef DEBUG_IRQS  	if (count) -		printk(KERN_INFO "%s: %d-times got unknown status in IRQ\n", +		pr_info("%s: %d-times got unknown status in IRQ\n",  			cosa->name, count);  	else -		printk(KERN_INFO "%s: returning from IRQ\n", cosa->name); +		pr_info("%s: returning from IRQ\n", cosa->name);  #endif  	return IRQ_HANDLED;  } @@ -2024,41 +2005,41 @@ static void debug_status_in(struct cosa_data *cosa, int status)  		s = "NO_REQ";  		break;  	} -	printk(KERN_INFO "%s: IO: status -> 0x%02x (%s%s%s%s)\n", +	pr_info("%s: IO: status -> 0x%02x (%s%s%s%s)\n",  		cosa->name,  		status, -		status & SR_USR_RQ ? "USR_RQ|":"", -		status & SR_TX_RDY ? "TX_RDY|":"", -		status & SR_RX_RDY ? "RX_RDY|":"", +		status & SR_USR_RQ ? "USR_RQ|" : "", +		status & SR_TX_RDY ? "TX_RDY|" : "", +		status & SR_RX_RDY ? "RX_RDY|" : "",  		s);  }  static void debug_status_out(struct cosa_data *cosa, int status)  { -	printk(KERN_INFO "%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n", +	pr_info("%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n",  		cosa->name,  		status, -		status & SR_RX_DMA_ENA  ? "RXDMA|":"!rxdma|", -		status & SR_TX_DMA_ENA  ? "TXDMA|":"!txdma|", -		status & SR_RST         ? "RESET|":"", -		status & SR_USR_INT_ENA ? "USRINT|":"!usrint|", -		status & SR_TX_INT_ENA  ? "TXINT|":"!txint|", -		status & SR_RX_INT_ENA  ? "RXINT":"!rxint"); +		status & SR_RX_DMA_ENA  ? "RXDMA|"  : "!rxdma|", +		status & SR_TX_DMA_ENA  ? "TXDMA|"  : "!txdma|", +		status & SR_RST         ? "RESET|"  : "", +		status & SR_USR_INT_ENA ? "USRINT|" : "!usrint|", +		status & SR_TX_INT_ENA  ? "TXINT|"  : "!txint|", +		status & SR_RX_INT_ENA  ? "RXINT"   : "!rxint");  }  static void debug_data_in(struct cosa_data *cosa, int data)  { -	printk(KERN_INFO "%s: IO: data -> 0x%04x\n", cosa->name, data); +	pr_info("%s: IO: data -> 0x%04x\n", cosa->name, data);  }  static void debug_data_out(struct cosa_data *cosa, int data)  { -	printk(KERN_INFO "%s: IO: data <- 0x%04x\n", cosa->name, data); +	pr_info("%s: IO: data <- 0x%04x\n", cosa->name, data);  }  static void debug_data_cmd(struct cosa_data *cosa, int data)  { -	printk(KERN_INFO "%s: IO: data <- 0x%04x (%s|%s)\n", +	pr_info("%s: IO: data <- 0x%04x (%s|%s)\n",  		cosa->name, data,  		data & SR_RDY_RCV ? "RX_RDY" : "!rx_rdy",  		data & SR_RDY_SND ? "TX_RDY" : "!tx_rdy"); diff --git a/drivers/net/wan/cycx_drv.c b/drivers/net/wan/cycx_drv.c deleted file mode 100644 index 164c3624ba8..00000000000 --- a/drivers/net/wan/cycx_drv.c +++ /dev/null @@ -1,576 +0,0 @@ -/* -* cycx_drv.c	Cyclom 2X Support Module. -* -*		This module is a library of common hardware specific -*		functions used by the Cyclades Cyclom 2X sync card. -* -* Author:	Arnaldo Carvalho de Melo <acme@conectiva.com.br> -* -* Copyright:	(c) 1998-2003 Arnaldo Carvalho de Melo -* -* Based on sdladrv.c by Gene Kozin <genek@compuserve.com> -* -*		This program is free software; you can redistribute it and/or -*		modify it under the terms of the GNU General Public License -*		as published by the Free Software Foundation; either version -*		2 of the License, or (at your option) any later version. -* ============================================================================ -* 1999/11/11	acme		set_current_state(TASK_INTERRUPTIBLE), code -*				cleanup -* 1999/11/08	acme		init_cyc2x deleted, doing nothing -* 1999/11/06	acme		back to read[bw], write[bw] and memcpy_to and -*				fromio to use dpmbase ioremaped -* 1999/10/26	acme		use isa_read[bw], isa_write[bw] & isa_memcpy_to -*				& fromio -* 1999/10/23	acme		cleanup to only supports cyclom2x: all the other -*				boards are no longer manufactured by cyclades, -*				if someone wants to support them... be my guest! -* 1999/05/28    acme		cycx_intack & cycx_intde gone for good -* 1999/05/18	acme		lots of unlogged work, submitting to Linus... -* 1999/01/03	acme		more judicious use of data types -* 1999/01/03	acme		judicious use of data types :> -*				cycx_inten trying to reset pending interrupts -*				from cyclom 2x - I think this isn't the way to -*				go, but for now... -* 1999/01/02	acme		cycx_intack ok, I think there's nothing to do -*				to ack an int in cycx_drv.c, only handle it in -*				cyx_isr (or in the other protocols: cyp_isr, -*				cyf_isr, when they get implemented. -* Dec 31, 1998	acme		cycx_data_boot & cycx_code_boot fixed, crossing -*				fingers to see x25_configure in cycx_x25.c -*				work... :) -* Dec 26, 1998	acme		load implementation fixed, seems to work! :) -*				cycx_2x_dpmbase_options with all the possible -*				DPM addresses (20). -*				cycx_intr implemented (test this!) -*				general code cleanup -* Dec  8, 1998	Ivan Passos	Cyclom-2X firmware load implementation. -* Aug  8, 1998	acme		Initial version. -*/ - -#include <linux/init.h>		/* __init */ -#include <linux/module.h> -#include <linux/kernel.h>	/* printk(), and other useful stuff */ -#include <linux/stddef.h>	/* offsetof(), etc. */ -#include <linux/errno.h>	/* return codes */ -#include <linux/cycx_drv.h>	/* API definitions */ -#include <linux/cycx_cfm.h>	/* CYCX firmware module definitions */ -#include <linux/delay.h>	/* udelay, msleep_interruptible */ -#include <asm/io.h>		/* read[wl], write[wl], ioremap, iounmap */ - -#define	MOD_VERSION	0 -#define	MOD_RELEASE	6 - -MODULE_AUTHOR("Arnaldo Carvalho de Melo"); -MODULE_DESCRIPTION("Cyclom 2x Sync Card Driver"); -MODULE_LICENSE("GPL"); - -/* Hardware-specific functions */ -static int load_cyc2x(struct cycx_hw *hw, struct cycx_firmware *cfm, u32 len); -static void cycx_bootcfg(struct cycx_hw *hw); - -static int reset_cyc2x(void __iomem *addr); -static int detect_cyc2x(void __iomem *addr); - -/* Miscellaneous functions */ -static int get_option_index(const long *optlist, long optval); -static u16 checksum(u8 *buf, u32 len); - -#define wait_cyc(addr) cycx_exec(addr + CMD_OFFSET) - -/* Global Data */ - -/* private data */ -static const char modname[] = "cycx_drv"; -static const char fullname[] = "Cyclom 2X Support Module"; -static const char copyright[] = "(c) 1998-2003 Arnaldo Carvalho de Melo " -			  "<acme@conectiva.com.br>"; - -/* Hardware configuration options. - * These are arrays of configuration options used by verification routines. - * The first element of each array is its size (i.e. number of options). - */ -static const long cyc2x_dpmbase_options[] = { -	20, -	0xA0000, 0xA4000, 0xA8000, 0xAC000, 0xB0000, 0xB4000, 0xB8000, -	0xBC000, 0xC0000, 0xC4000, 0xC8000, 0xCC000, 0xD0000, 0xD4000, -	0xD8000, 0xDC000, 0xE0000, 0xE4000, 0xE8000, 0xEC000 -}; - -static const long cycx_2x_irq_options[]  = { 7, 3, 5, 9, 10, 11, 12, 15 }; - -/* Kernel Loadable Module Entry Points */ -/* Module 'insert' entry point. - * o print announcement - * o initialize static data - * - * Return:	0	Ok - *		< 0	error. - * Context:	process */ - -static int __init cycx_drv_init(void) -{ -	printk(KERN_INFO "%s v%u.%u %s\n", fullname, MOD_VERSION, MOD_RELEASE, -			 copyright); - -	return 0; -} - -/* Module 'remove' entry point. - * o release all remaining system resources */ -static void cycx_drv_cleanup(void) -{ -} - -/* Kernel APIs */ -/* Set up adapter. - * o detect adapter type - * o verify hardware configuration options - * o check for hardware conflicts - * o set up adapter shared memory - * o test adapter memory - * o load firmware - * Return:	0	ok. - *		< 0	error */ -EXPORT_SYMBOL(cycx_setup); -int cycx_setup(struct cycx_hw *hw, void *cfm, u32 len, unsigned long dpmbase) -{ -	int err; - -	/* Verify IRQ configuration options */ -	if (!get_option_index(cycx_2x_irq_options, hw->irq)) { -		printk(KERN_ERR "%s: IRQ %d is invalid!\n", modname, hw->irq); -		return -EINVAL; -	} - -	/* Setup adapter dual-port memory window and test memory */ -	if (!dpmbase) { -		printk(KERN_ERR "%s: you must specify the dpm address!\n", -				modname); - 		return -EINVAL; -	} else if (!get_option_index(cyc2x_dpmbase_options, dpmbase)) { -		printk(KERN_ERR "%s: memory address 0x%lX is invalid!\n", -				modname, dpmbase); -		return -EINVAL; -	} - -	hw->dpmbase = ioremap(dpmbase, CYCX_WINDOWSIZE); -	hw->dpmsize = CYCX_WINDOWSIZE; - -	if (!detect_cyc2x(hw->dpmbase)) { -		printk(KERN_ERR "%s: adapter Cyclom 2X not found at " -				"address 0x%lX!\n", modname, dpmbase); -		return -EINVAL; -	} - -	printk(KERN_INFO "%s: found Cyclom 2X card at address 0x%lX.\n", -			 modname, dpmbase); - -	/* Load firmware. If loader fails then shut down adapter */ -	err = load_cyc2x(hw, cfm, len); - -	if (err) -		cycx_down(hw);         /* shutdown adapter */ - -	return err; -} - -EXPORT_SYMBOL(cycx_down); -int cycx_down(struct cycx_hw *hw) -{ -	iounmap(hw->dpmbase); -	return 0; -} - -/* Enable interrupt generation.  */ -static void cycx_inten(struct cycx_hw *hw) -{ -	writeb(0, hw->dpmbase); -} - -/* Generate an interrupt to adapter's CPU. */ -EXPORT_SYMBOL(cycx_intr); -void cycx_intr(struct cycx_hw *hw) -{ -	writew(0, hw->dpmbase + GEN_CYCX_INTR); -} - -/* Execute Adapter Command. - * o Set exec flag. - * o Busy-wait until flag is reset. */ -EXPORT_SYMBOL(cycx_exec); -int cycx_exec(void __iomem *addr) -{ -	u16 i = 0; -	/* wait till addr content is zeroed */ - -	while (readw(addr)) { -		udelay(1000); - -		if (++i > 50) -			return -1; -	} - -	return 0; -} - -/* Read absolute adapter memory. - * Transfer data from adapter's memory to data buffer. */ -EXPORT_SYMBOL(cycx_peek); -int cycx_peek(struct cycx_hw *hw, u32 addr, void *buf, u32 len) -{ -	if (len == 1) -		*(u8*)buf = readb(hw->dpmbase + addr); -	else -		memcpy_fromio(buf, hw->dpmbase + addr, len); - -	return 0; -} - -/* Write Absolute Adapter Memory. - * Transfer data from data buffer to adapter's memory. */ -EXPORT_SYMBOL(cycx_poke); -int cycx_poke(struct cycx_hw *hw, u32 addr, void *buf, u32 len) -{ -	if (len == 1) -		writeb(*(u8*)buf, hw->dpmbase + addr); -	else -		memcpy_toio(hw->dpmbase + addr, buf, len); - -	return 0; -} - -/* Hardware-Specific Functions */ - -/* Load Aux Routines */ -/* Reset board hardware. -   return 1 if memory exists at addr and 0 if not. */ -static int memory_exists(void __iomem *addr) -{ -	int tries = 0; - -	for (; tries < 3 ; tries++) { -		writew(TEST_PATTERN, addr + 0x10); - -		if (readw(addr + 0x10) == TEST_PATTERN) -			if (readw(addr + 0x10) == TEST_PATTERN) -				return 1; - -		msleep_interruptible(1 * 1000); -	} - -	return 0; -} - -/* Load reset code. */ -static void reset_load(void __iomem *addr, u8 *buffer, u32 cnt) -{ -	void __iomem *pt_code = addr + RESET_OFFSET; -	u16 i; /*, j; */ - -	for (i = 0 ; i < cnt ; i++) { -/*		for (j = 0 ; j < 50 ; j++); Delay - FIXME busy waiting... */ -		writeb(*buffer++, pt_code++); -	} -} - -/* Load buffer using boot interface. - * o copy data from buffer to Cyclom-X memory - * o wait for reset code to copy it to right portion of memory */ -static int buffer_load(void __iomem *addr, u8 *buffer, u32 cnt) -{ -	memcpy_toio(addr + DATA_OFFSET, buffer, cnt); -	writew(GEN_BOOT_DAT, addr + CMD_OFFSET); - -	return wait_cyc(addr); -} - -/* Set up entry point and kick start Cyclom-X CPU. */ -static void cycx_start(void __iomem *addr) -{ -	/* put in 0x30 offset the jump instruction to the code entry point */ -	writeb(0xea, addr + 0x30); -	writeb(0x00, addr + 0x31); -	writeb(0xc4, addr + 0x32); -	writeb(0x00, addr + 0x33); -	writeb(0x00, addr + 0x34); - -	/* cmd to start executing code */ -	writew(GEN_START, addr + CMD_OFFSET); -} - -/* Load and boot reset code. */ -static void cycx_reset_boot(void __iomem *addr, u8 *code, u32 len) -{ -	void __iomem *pt_start = addr + START_OFFSET; - -	writeb(0xea, pt_start++); /* jmp to f000:3f00 */ -	writeb(0x00, pt_start++); -	writeb(0xfc, pt_start++); -	writeb(0x00, pt_start++); -	writeb(0xf0, pt_start); -	reset_load(addr, code, len); - -	/* 80186 was in hold, go */ -	writeb(0, addr + START_CPU); -	msleep_interruptible(1 * 1000); -} - -/* Load data.bin file through boot (reset) interface. */ -static int cycx_data_boot(void __iomem *addr, u8 *code, u32 len) -{ -	void __iomem *pt_boot_cmd = addr + CMD_OFFSET; -	u32 i; - -	/* boot buffer length */ -	writew(CFM_LOAD_BUFSZ, pt_boot_cmd + sizeof(u16)); -	writew(GEN_DEFPAR, pt_boot_cmd); - -	if (wait_cyc(addr) < 0) -		return -1; - -	writew(0, pt_boot_cmd + sizeof(u16)); -	writew(0x4000, pt_boot_cmd + 2 * sizeof(u16)); -	writew(GEN_SET_SEG, pt_boot_cmd); - -	if (wait_cyc(addr) < 0) -		return -1; - -	for (i = 0 ; i < len ; i += CFM_LOAD_BUFSZ) -		if (buffer_load(addr, code + i, -				min_t(u32, CFM_LOAD_BUFSZ, (len - i))) < 0) { -			printk(KERN_ERR "%s: Error !!\n", modname); -			return -1; -		} - -	return 0; -} - - -/* Load code.bin file through boot (reset) interface. */ -static int cycx_code_boot(void __iomem *addr, u8 *code, u32 len) -{ -	void __iomem *pt_boot_cmd = addr + CMD_OFFSET; -	u32 i; - -	/* boot buffer length */ -	writew(CFM_LOAD_BUFSZ, pt_boot_cmd + sizeof(u16)); -	writew(GEN_DEFPAR, pt_boot_cmd); - -	if (wait_cyc(addr) < 0) -		return -1; - -	writew(0x0000, pt_boot_cmd + sizeof(u16)); -	writew(0xc400, pt_boot_cmd + 2 * sizeof(u16)); -	writew(GEN_SET_SEG, pt_boot_cmd); - -	if (wait_cyc(addr) < 0) -		return -1; - -	for (i = 0 ; i < len ; i += CFM_LOAD_BUFSZ) -		if (buffer_load(addr, code + i, -				min_t(u32, CFM_LOAD_BUFSZ, (len - i)))) { -			printk(KERN_ERR "%s: Error !!\n", modname); -			return -1; -		} - -	return 0; -} - -/* Load adapter from the memory image of the CYCX firmware module. - * o verify firmware integrity and compatibility - * o start adapter up */ -static int load_cyc2x(struct cycx_hw *hw, struct cycx_firmware *cfm, u32 len) -{ -	int i, j; -	struct cycx_fw_header *img_hdr; -	u8 *reset_image, -	   *data_image, -	   *code_image; -	void __iomem *pt_cycld = hw->dpmbase + 0x400; -	u16 cksum; - -	/* Announce */ -	printk(KERN_INFO "%s: firmware signature=\"%s\"\n", modname, -							    cfm->signature); - -	/* Verify firmware signature */ -	if (strcmp(cfm->signature, CFM_SIGNATURE)) { -		printk(KERN_ERR "%s:load_cyc2x: not Cyclom-2X firmware!\n", -				modname); -		return -EINVAL; -	} - -	printk(KERN_INFO "%s: firmware version=%u\n", modname, cfm->version); - -	/* Verify firmware module format version */ -	if (cfm->version != CFM_VERSION) { -		printk(KERN_ERR "%s:%s: firmware format %u rejected! " -				"Expecting %u.\n", -				modname, __func__, cfm->version, CFM_VERSION); -		return -EINVAL; -	} - -	/* Verify firmware module length and checksum */ -	cksum = checksum((u8*)&cfm->info, sizeof(struct cycx_fw_info) + -					  cfm->info.codesize); -/* -	FIXME cfm->info.codesize is off by 2 -	if (((len - sizeof(struct cycx_firmware) - 1) != cfm->info.codesize) || -*/ -	if (cksum != cfm->checksum) { -		printk(KERN_ERR "%s:%s: firmware corrupted!\n", -				modname, __func__); -		printk(KERN_ERR " cdsize = 0x%x (expected 0x%lx)\n", -				len - (int)sizeof(struct cycx_firmware) - 1, -				cfm->info.codesize); -		printk(KERN_ERR " chksum = 0x%x (expected 0x%x)\n", -				cksum, cfm->checksum); -		return -EINVAL; -	} - -	/* If everything is ok, set reset, data and code pointers */ -	img_hdr = (struct cycx_fw_header *)&cfm->image; -#ifdef FIRMWARE_DEBUG -	printk(KERN_INFO "%s:%s: image sizes\n", __func__, modname); -	printk(KERN_INFO " reset=%lu\n", img_hdr->reset_size); -	printk(KERN_INFO "  data=%lu\n", img_hdr->data_size); -	printk(KERN_INFO "  code=%lu\n", img_hdr->code_size); -#endif -	reset_image = ((u8 *)img_hdr) + sizeof(struct cycx_fw_header); -	data_image = reset_image + img_hdr->reset_size; -	code_image = data_image + img_hdr->data_size; - -	/*---- Start load ----*/ -	/* Announce */ -	printk(KERN_INFO "%s: loading firmware %s (ID=%u)...\n", modname, -			 cfm->descr[0] ? cfm->descr : "unknown firmware", -			 cfm->info.codeid); - -	for (i = 0 ; i < 5 ; i++) { -		/* Reset Cyclom hardware */ -		if (!reset_cyc2x(hw->dpmbase)) { -			printk(KERN_ERR "%s: dpm problem or board not found\n", -					modname); -			return -EINVAL; -		} - -		/* Load reset.bin */ -		cycx_reset_boot(hw->dpmbase, reset_image, img_hdr->reset_size); -		/* reset is waiting for boot */ -		writew(GEN_POWER_ON, pt_cycld); -		msleep_interruptible(1 * 1000); - -		for (j = 0 ; j < 3 ; j++) -			if (!readw(pt_cycld)) -				goto reset_loaded; -			else -				msleep_interruptible(1 * 1000); -	} - -	printk(KERN_ERR "%s: reset not started.\n", modname); -	return -EINVAL; - -reset_loaded: -	/* Load data.bin */ -	if (cycx_data_boot(hw->dpmbase, data_image, img_hdr->data_size)) { -		printk(KERN_ERR "%s: cannot load data file.\n", modname); -		return -EINVAL; -	} - -	/* Load code.bin */ -	if (cycx_code_boot(hw->dpmbase, code_image, img_hdr->code_size)) { -		printk(KERN_ERR "%s: cannot load code file.\n", modname); -		return -EINVAL; -	} - -	/* Prepare boot-time configuration data */ -	cycx_bootcfg(hw); - -	/* kick-off CPU */ -	cycx_start(hw->dpmbase); - -	/* Arthur Ganzert's tip: wait a while after the firmware loading... -	   seg abr 26 17:17:12 EST 1999 - acme */ -	msleep_interruptible(7 * 1000); -	printk(KERN_INFO "%s: firmware loaded!\n", modname); - -	/* enable interrupts */ -	cycx_inten(hw); - -	return 0; -} - -/* Prepare boot-time firmware configuration data. - * o initialize configuration data area -   From async.doc - V_3.4.0 - 07/18/1994 -   - As of now, only static buffers are available to the user. -     So, the bit VD_RXDIRC must be set in 'valid'. That means that user -     wants to use the static transmission and reception buffers. */ -static void cycx_bootcfg(struct cycx_hw *hw) -{ -	/* use fixed buffers */ -	writeb(FIXED_BUFFERS, hw->dpmbase + CONF_OFFSET); -} - -/* Detect Cyclom 2x adapter. - *	Following tests are used to detect Cyclom 2x adapter: - *       to be completed based on the tests done below - *	Return 1 if detected o.k. or 0 if failed. - *	Note:	This test is destructive! Adapter will be left in shutdown - *		state after the test. */ -static int detect_cyc2x(void __iomem *addr) -{ -	reset_cyc2x(addr); - -	return memory_exists(addr); -} - -/* Miscellaneous */ -/* Get option's index into the options list. - *	Return option's index (1 .. N) or zero if option is invalid. */ -static int get_option_index(const long *optlist, long optval) -{ -	int i = 1; - -	for (; i <= optlist[0]; ++i) -		if (optlist[i] == optval) -			return i; - -	return 0; -} - -/* Reset adapter's CPU. */ -static int reset_cyc2x(void __iomem *addr) -{ -	writeb(0, addr + RST_ENABLE); -	msleep_interruptible(2 * 1000); -	writeb(0, addr + RST_DISABLE); -	msleep_interruptible(2 * 1000); - -	return memory_exists(addr); -} - -/* Calculate 16-bit CRC using CCITT polynomial. */ -static u16 checksum(u8 *buf, u32 len) -{ -	u16 crc = 0; -	u16 mask, flag; - -	for (; len; --len, ++buf) -		for (mask = 0x80; mask; mask >>= 1) { -			flag = (crc & 0x8000); -			crc <<= 1; -			crc |= ((*buf & mask) ? 1 : 0); - -			if (flag) -				crc ^= 0x1021; -		} - -	return crc; -} - -module_init(cycx_drv_init); -module_exit(cycx_drv_cleanup); - -/* End */ diff --git a/drivers/net/wan/cycx_main.c b/drivers/net/wan/cycx_main.c deleted file mode 100644 index 859dba9b972..00000000000 --- a/drivers/net/wan/cycx_main.c +++ /dev/null @@ -1,348 +0,0 @@ -/* -* cycx_main.c	Cyclades Cyclom 2X WAN Link Driver. Main module. -* -* Author:	Arnaldo Carvalho de Melo <acme@conectiva.com.br> -* -* Copyright:	(c) 1998-2003 Arnaldo Carvalho de Melo -* -* Based on sdlamain.c by Gene Kozin <genek@compuserve.com> & -*			 Jaspreet Singh	<jaspreet@sangoma.com> -* -*		This program is free software; you can redistribute it and/or -*		modify it under the terms of the GNU General Public License -*		as published by the Free Software Foundation; either version -*		2 of the License, or (at your option) any later version. -* ============================================================================ -* Please look at the bitkeeper changelog (or any other scm tool that ends up -* importing bitkeeper changelog or that replaces bitkeeper in the future as -* main tool for linux development). -*  -* 2001/05/09	acme		Fix MODULE_DESC for debug, .bss nitpicks, -* 				some cleanups -* 2000/07/13	acme		remove useless #ifdef MODULE and crap -*				#if KERNEL_VERSION > blah -* 2000/07/06	acme		__exit at cyclomx_cleanup -* 2000/04/02	acme		dprintk and cycx_debug -* 				module_init/module_exit -* 2000/01/21	acme		rename cyclomx_open to cyclomx_mod_inc_use_count -*				and cyclomx_close to cyclomx_mod_dec_use_count -* 2000/01/08	acme		cleanup -* 1999/11/06	acme		cycx_down back to life (it needs to be -*				called to iounmap the dpmbase) -* 1999/08/09	acme		removed references to enable_tx_int -*				use spinlocks instead of cli/sti in -*				cyclomx_set_state -* 1999/05/19	acme		works directly linked into the kernel -*				init_waitqueue_head for 2.3.* kernel -* 1999/05/18	acme		major cleanup (polling not needed), etc -* 1998/08/28	acme		minor cleanup (ioctls for firmware deleted) -*				queue_task activated -* 1998/08/08	acme		Initial version. -*/ - -#include <linux/stddef.h>	/* offsetof(), etc. */ -#include <linux/errno.h>	/* return codes */ -#include <linux/string.h>	/* inline memset(), etc. */ -#include <linux/slab.h>		/* kmalloc(), kfree() */ -#include <linux/kernel.h>	/* printk(), and other useful stuff */ -#include <linux/module.h>	/* support for loadable modules */ -#include <linux/ioport.h>	/* request_region(), release_region() */ -#include <linux/wanrouter.h>	/* WAN router definitions */ -#include <linux/cyclomx.h>	/* cyclomx common user API definitions */ -#include <linux/init.h>         /* __init (when not using as a module) */ - -unsigned int cycx_debug; - -MODULE_AUTHOR("Arnaldo Carvalho de Melo"); -MODULE_DESCRIPTION("Cyclom 2X Sync Card Driver."); -MODULE_LICENSE("GPL"); -module_param(cycx_debug, int, 0); -MODULE_PARM_DESC(cycx_debug, "cyclomx debug level"); - -/* Defines & Macros */ - -#define	CYCX_DRV_VERSION	0	/* version number */ -#define	CYCX_DRV_RELEASE	11	/* release (minor version) number */ -#define	CYCX_MAX_CARDS		1	/* max number of adapters */ - -#define	CONFIG_CYCX_CARDS 1 - -/* Function Prototypes */ - -/* WAN link driver entry points */ -static int cycx_wan_setup(struct wan_device *wandev, wandev_conf_t *conf); -static int cycx_wan_shutdown(struct wan_device *wandev); - -/* Miscellaneous functions */ -static irqreturn_t cycx_isr(int irq, void *dev_id); - -/* Global Data - * Note: All data must be explicitly initialized!!! - */ - -/* private data */ -static const char cycx_drvname[] = "cyclomx"; -static const char cycx_fullname[] = "CYCLOM 2X(tm) Sync Card Driver"; -static const char cycx_copyright[] = "(c) 1998-2003 Arnaldo Carvalho de Melo " -			  "<acme@conectiva.com.br>"; -static int cycx_ncards = CONFIG_CYCX_CARDS; -static struct cycx_device *cycx_card_array;	/* adapter data space */ - -/* Kernel Loadable Module Entry Points */ - -/* - * Module 'insert' entry point. - * o print announcement - * o allocate adapter data space - * o initialize static data - * o register all cards with WAN router - * o calibrate Cyclom 2X shared memory access delay. - * - * Return:	0	Ok - *		< 0	error. - * Context:	process - */ -static int __init cycx_init(void) -{ -	int cnt, err = -ENOMEM; - -	printk(KERN_INFO "%s v%u.%u %s\n", -		cycx_fullname, CYCX_DRV_VERSION, CYCX_DRV_RELEASE, -		cycx_copyright); - -	/* Verify number of cards and allocate adapter data space */ -	cycx_ncards = min_t(int, cycx_ncards, CYCX_MAX_CARDS); -	cycx_ncards = max_t(int, cycx_ncards, 1); -	cycx_card_array = kcalloc(cycx_ncards, sizeof(struct cycx_device), GFP_KERNEL); -	if (!cycx_card_array) -		goto out; - - -	/* Register adapters with WAN router */ -	for (cnt = 0; cnt < cycx_ncards; ++cnt) { -		struct cycx_device *card = &cycx_card_array[cnt]; -		struct wan_device *wandev = &card->wandev; - -		sprintf(card->devname, "%s%d", cycx_drvname, cnt + 1); -		wandev->magic    = ROUTER_MAGIC; -		wandev->name     = card->devname; -		wandev->private  = card; -		wandev->setup    = cycx_wan_setup; -		wandev->shutdown = cycx_wan_shutdown; -		err = register_wan_device(wandev); - -		if (err) { -			printk(KERN_ERR "%s: %s registration failed with " -					"error %d!\n", -					cycx_drvname, card->devname, err); -			break; -		} -	} - -	err = -ENODEV; -	if (!cnt) { -		kfree(cycx_card_array); -		goto out; -	} -	err = 0; -	cycx_ncards = cnt;	/* adjust actual number of cards */ -out:	return err; -} - -/* - * Module 'remove' entry point. - * o unregister all adapters from the WAN router - * o release all remaining system resources - */ -static void __exit cycx_exit(void) -{ -	int i = 0; - -	for (; i < cycx_ncards; ++i) { -		struct cycx_device *card = &cycx_card_array[i]; -		unregister_wan_device(card->devname); -	} - -	kfree(cycx_card_array); -} - -/* WAN Device Driver Entry Points */ -/* - * Setup/configure WAN link driver. - * o check adapter state - * o make sure firmware is present in configuration - * o allocate interrupt vector - * o setup Cyclom 2X hardware - * o call appropriate routine to perform protocol-specific initialization - * - * This function is called when router handles ROUTER_SETUP IOCTL. The - * configuration structure is in kernel memory (including extended data, if - * any). - */ -static int cycx_wan_setup(struct wan_device *wandev, wandev_conf_t *conf) -{ -	int rc = -EFAULT; -	struct cycx_device *card; -	int irq; - -	/* Sanity checks */ - -	if (!wandev || !wandev->private || !conf) -		goto out; - -	card = wandev->private; -	rc = -EBUSY; -	if (wandev->state != WAN_UNCONFIGURED) -		goto out; - -	rc = -EINVAL; -	if (!conf->data_size || !conf->data) { -		printk(KERN_ERR "%s: firmware not found in configuration " -				"data!\n", wandev->name); -		goto out; -	} - -	if (conf->irq <= 0) { -		printk(KERN_ERR "%s: can't configure without IRQ!\n", -				wandev->name); -		goto out; -	} - -	/* Allocate IRQ */ -	irq = conf->irq == 2 ? 9 : conf->irq;	/* IRQ2 -> IRQ9 */ - -	if (request_irq(irq, cycx_isr, 0, wandev->name, card)) { -		printk(KERN_ERR "%s: can't reserve IRQ %d!\n", -				wandev->name, irq); -		goto out; -	} - -	/* Configure hardware, load firmware, etc. */ -	memset(&card->hw, 0, sizeof(card->hw)); -	card->hw.irq	 = irq; -	card->hw.dpmsize = CYCX_WINDOWSIZE; -	card->hw.fwid	 = CFID_X25_2X; -	spin_lock_init(&card->lock); -	init_waitqueue_head(&card->wait_stats); - -	rc = cycx_setup(&card->hw, conf->data, conf->data_size, conf->maddr); -	if (rc) -		goto out_irq; - -	/* Initialize WAN device data space */ -	wandev->irq       = irq; -	wandev->dma       = wandev->ioport = 0; -	wandev->maddr     = (unsigned long)card->hw.dpmbase; -	wandev->msize     = card->hw.dpmsize; -	wandev->hw_opt[2] = 0; -	wandev->hw_opt[3] = card->hw.fwid; - -	/* Protocol-specific initialization */ -	switch (card->hw.fwid) { -#ifdef CONFIG_CYCLOMX_X25 -	case CFID_X25_2X: -		rc = cycx_x25_wan_init(card, conf); -		break; -#endif -	default: -		printk(KERN_ERR "%s: this firmware is not supported!\n", -				wandev->name); -		rc = -EINVAL; -	} - -	if (rc) { -		cycx_down(&card->hw); -		goto out_irq; -	} - -	rc = 0; -out: -	return rc; -out_irq: -	free_irq(irq, card); -	goto out; -} - -/* - * Shut down WAN link driver. - * o shut down adapter hardware - * o release system resources. - * - * This function is called by the router when device is being unregistered or - * when it handles ROUTER_DOWN IOCTL. - */ -static int cycx_wan_shutdown(struct wan_device *wandev) -{ -	int ret = -EFAULT; -	struct cycx_device *card; - -	/* sanity checks */ -	if (!wandev || !wandev->private) -		goto out; - -	ret = 0; -	if (wandev->state == WAN_UNCONFIGURED) -		goto out; - -	card = wandev->private; -	wandev->state = WAN_UNCONFIGURED; -	cycx_down(&card->hw); -	printk(KERN_INFO "%s: irq %d being freed!\n", wandev->name, -			wandev->irq); -	free_irq(wandev->irq, card); -out:	return ret; -} - -/* Miscellaneous */ -/* - * Cyclom 2X Interrupt Service Routine. - * o acknowledge Cyclom 2X hardware interrupt. - * o call protocol-specific interrupt service routine, if any. - */ -static irqreturn_t cycx_isr(int irq, void *dev_id) -{ -	struct cycx_device *card = dev_id; - -	if (card->wandev.state == WAN_UNCONFIGURED) -		goto out; - -	if (card->in_isr) { -		printk(KERN_WARNING "%s: interrupt re-entrancy on IRQ %d!\n", -				    card->devname, card->wandev.irq); -		goto out; -	} - -	if (card->isr) -		card->isr(card); -	return IRQ_HANDLED; -out: -	return IRQ_NONE; -} - -/* Set WAN device state.  */ -void cycx_set_state(struct cycx_device *card, int state) -{ -	unsigned long flags; -	char *string_state = NULL; - -	spin_lock_irqsave(&card->lock, flags); - -	if (card->wandev.state != state) { -		switch (state) { -		case WAN_CONNECTED: -			string_state = "connected!"; -			break; -		case WAN_DISCONNECTED: -			string_state = "disconnected!"; -			break; -		} -		printk(KERN_INFO "%s: link %s\n", card->devname, string_state); -		card->wandev.state = state; -	} - -	card->state_tick = jiffies; -	spin_unlock_irqrestore(&card->lock, flags); -} - -module_init(cycx_init); -module_exit(cycx_exit); diff --git a/drivers/net/wan/cycx_x25.c b/drivers/net/wan/cycx_x25.c deleted file mode 100644 index cf9e15fd8d9..00000000000 --- a/drivers/net/wan/cycx_x25.c +++ /dev/null @@ -1,1615 +0,0 @@ -/* -* cycx_x25.c	Cyclom 2X WAN Link Driver.  X.25 module. -* -* Author:	Arnaldo Carvalho de Melo <acme@conectiva.com.br> -* -* Copyright:	(c) 1998-2003 Arnaldo Carvalho de Melo -* -* Based on sdla_x25.c by Gene Kozin <genek@compuserve.com> -* -*		This program is free software; you can redistribute it and/or -*		modify it under the terms of the GNU General Public License -*		as published by the Free Software Foundation; either version -*		2 of the License, or (at your option) any later version. -* ============================================================================ -* 2001/01/12	acme		use dev_kfree_skb_irq on interrupt context -* 2000/04/02	acme		dprintk, cycx_debug -* 				fixed the bug introduced in get_dev_by_lcn and -* 				get_dev_by_dte_addr by the anonymous hacker -* 				that converted this driver to softnet -* 2000/01/08	acme		cleanup -* 1999/10/27	acme		use ARPHRD_HWX25 so that the X.25 stack know -*				that we have a X.25 stack implemented in -*				firmware onboard -* 1999/10/18	acme		support for X.25 sockets in if_send, -*				beware: socket(AF_X25...) IS WORK IN PROGRESS, -*				TCP/IP over X.25 via wanrouter not affected, -*				working. -* 1999/10/09	acme		chan_disc renamed to chan_disconnect, -* 				began adding support for X.25 sockets: -* 				conf->protocol in new_if -* 1999/10/05	acme		fixed return E... to return -E... -* 1999/08/10	acme		serialized access to the card thru a spinlock -*				in x25_exec -* 1999/08/09	acme		removed per channel spinlocks -*				removed references to enable_tx_int -* 1999/05/28	acme		fixed nibble_to_byte, ackvc now properly treated -*				if_send simplified -* 1999/05/25	acme		fixed t1, t2, t21 & t23 configuration -*				use spinlocks instead of cli/sti in some points -* 1999/05/24	acme		finished the x25_get_stat function -* 1999/05/23	acme		dev->type = ARPHRD_X25 (tcpdump only works, -*				AFAIT, with ARPHRD_ETHER). This seems to be -*				needed to use socket(AF_X25)... -*				Now the config file must specify a peer media -*				address for svc channels over a crossover cable. -*				Removed hold_timeout from x25_channel_t, -*				not used. -*				A little enhancement in the DEBUG processing -* 1999/05/22	acme		go to DISCONNECTED in disconnect_confirm_intr, -*				instead of chan_disc. -* 1999/05/16	marcelo		fixed timer initialization in SVCs -* 1999/01/05	acme		x25_configure now get (most of) all -*				parameters... -* 1999/01/05	acme		pktlen now (correctly) uses log2 (value -*				configured) -* 1999/01/03	acme		judicious use of data types (u8, u16, u32, etc) -* 1999/01/03	acme		cyx_isr: reset dpmbase to acknowledge -*				indication (interrupt from cyclom 2x) -* 1999/01/02	acme		cyx_isr: first hackings... -* 1999/01/0203  acme 		when initializing an array don't give less -*				elements than declared... -* 				example: char send_cmd[6] = "?\xFF\x10"; -*          			you'll gonna lose a couple hours, 'cause your -*				brain won't admit that there's an error in the -*				above declaration...  the side effect is that -*				memset is put into the unresolved symbols -*				instead of using the inline memset functions... -* 1999/01/02    acme 		began chan_connect, chan_send, x25_send -* 1998/12/31	acme		x25_configure -*				this code can be compiled as non module -* 1998/12/27	acme		code cleanup -*				IPX code wiped out! let's decrease code -*				complexity for now, remember: I'm learning! :) -*                               bps_to_speed_code OK -* 1998/12/26	acme		Minimal debug code cleanup -* 1998/08/08	acme		Initial version. -*/ - -#define CYCLOMX_X25_DEBUG 1 - -#include <linux/ctype.h>	/* isdigit() */ -#include <linux/errno.h>	/* return codes */ -#include <linux/if_arp.h>       /* ARPHRD_HWX25 */ -#include <linux/kernel.h>	/* printk(), and other useful stuff */ -#include <linux/module.h> -#include <linux/string.h>	/* inline memset(), etc. */ -#include <linux/sched.h> -#include <linux/slab.h>		/* kmalloc(), kfree() */ -#include <linux/stddef.h>	/* offsetof(), etc. */ -#include <linux/wanrouter.h>	/* WAN router definitions */ - -#include <asm/byteorder.h>	/* htons(), etc. */ - -#include <linux/cyclomx.h>	/* Cyclom 2X common user API definitions */ -#include <linux/cycx_x25.h>	/* X.25 firmware API definitions */ - -#include <net/x25device.h> - -/* Defines & Macros */ -#define CYCX_X25_MAX_CMD_RETRY 5 -#define CYCX_X25_CHAN_MTU 2048	/* unfragmented logical channel MTU */ - -/* Data Structures */ -/* This is an extension of the 'struct net_device' we create for each network -   interface to keep the rest of X.25 channel-specific data. */ -struct cycx_x25_channel { -	/* This member must be first. */ -	struct net_device *slave;	/* WAN slave */ - -	char name[WAN_IFNAME_SZ+1];	/* interface name, ASCIIZ */ -	char addr[WAN_ADDRESS_SZ+1];	/* media address, ASCIIZ */ -	char *local_addr;		/* local media address, ASCIIZ - -					   svc thru crossover cable */ -	s16 lcn;			/* logical channel number/conn.req.key*/ -	u8 link; -	struct timer_list timer;	/* timer used for svc channel disc. */ -	u16 protocol;			/* ethertype, 0 - multiplexed */ -	u8 svc;				/* 0 - permanent, 1 - switched */ -	u8 state;			/* channel state */ -	u8 drop_sequence;		/* mark sequence for dropping */ -	u32 idle_tmout;			/* sec, before disconnecting */ -	struct sk_buff *rx_skb;		/* receive socket buffer */ -	struct cycx_device *card;	/* -> owner */ -	struct net_device_stats ifstats;/* interface statistics */ -}; - -/* Function Prototypes */ -/* WAN link driver entry points. These are called by the WAN router module. */ -static int cycx_wan_update(struct wan_device *wandev), -	   cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev, -			   wanif_conf_t *conf), -	   cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev); - -/* Network device interface */ -static int cycx_netdevice_init(struct net_device *dev); -static int cycx_netdevice_open(struct net_device *dev); -static int cycx_netdevice_stop(struct net_device *dev); -static int cycx_netdevice_hard_header(struct sk_buff *skb, -				      struct net_device *dev, u16 type, -				      const void *daddr, const void *saddr, -				      unsigned len); -static int cycx_netdevice_rebuild_header(struct sk_buff *skb); -static netdev_tx_t cycx_netdevice_hard_start_xmit(struct sk_buff *skb, -							struct net_device *dev); - -static struct net_device_stats * -			cycx_netdevice_get_stats(struct net_device *dev); - -/* Interrupt handlers */ -static void cycx_x25_irq_handler(struct cycx_device *card), -	    cycx_x25_irq_tx(struct cycx_device *card, struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_rx(struct cycx_device *card, struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_log(struct cycx_device *card, -			     struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_stat(struct cycx_device *card, -			      struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_connect_confirm(struct cycx_device *card, -					 struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_disconnect_confirm(struct cycx_device *card, -					    struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_connect(struct cycx_device *card, -				 struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_disconnect(struct cycx_device *card, -				    struct cycx_x25_cmd *cmd), -	    cycx_x25_irq_spurious(struct cycx_device *card, -				  struct cycx_x25_cmd *cmd); - -/* X.25 firmware interface functions */ -static int cycx_x25_configure(struct cycx_device *card, -			      struct cycx_x25_config *conf), -	   cycx_x25_get_stats(struct cycx_device *card), -	   cycx_x25_send(struct cycx_device *card, u8 link, u8 lcn, u8 bitm, -			 int len, void *buf), -	   cycx_x25_connect_response(struct cycx_device *card, -				struct cycx_x25_channel *chan), -	   cycx_x25_disconnect_response(struct cycx_device *card, u8 link, -			   		u8 lcn); - -/* channel functions */ -static int cycx_x25_chan_connect(struct net_device *dev), -	   cycx_x25_chan_send(struct net_device *dev, struct sk_buff *skb); - -static void cycx_x25_chan_disconnect(struct net_device *dev), -	    cycx_x25_chan_send_event(struct net_device *dev, u8 event); - -/* Miscellaneous functions */ -static void cycx_x25_set_chan_state(struct net_device *dev, u8 state), -	    cycx_x25_chan_timer(unsigned long d); - -static void nibble_to_byte(u8 *s, u8 *d, u8 len, u8 nibble), -	    reset_timer(struct net_device *dev); - -static u8 bps_to_speed_code(u32 bps); -static u8 cycx_log2(u32 n); - -static unsigned dec_to_uint(u8 *str, int len); - -static struct net_device *cycx_x25_get_dev_by_lcn(struct wan_device *wandev, -						  s16 lcn); -static struct net_device * -	cycx_x25_get_dev_by_dte_addr(struct wan_device *wandev, char *dte); - -static void cycx_x25_chan_setup(struct net_device *dev); - -#ifdef CYCLOMX_X25_DEBUG -static void hex_dump(char *msg, unsigned char *p, int len); -static void cycx_x25_dump_config(struct cycx_x25_config *conf); -static void cycx_x25_dump_stats(struct cycx_x25_stats *stats); -static void cycx_x25_dump_devs(struct wan_device *wandev); -#else -#define hex_dump(msg, p, len) -#define cycx_x25_dump_config(conf) -#define cycx_x25_dump_stats(stats) -#define cycx_x25_dump_devs(wandev) -#endif -/* Public Functions */ - -/* X.25 Protocol Initialization routine. - * - * This routine is called by the main Cyclom 2X module during setup.  At this - * point adapter is completely initialized and X.25 firmware is running. - *  o configure adapter - *  o initialize protocol-specific fields of the adapter data space. - * - * Return:	0	o.k. - *		< 0	failure.  */ -int cycx_x25_wan_init(struct cycx_device *card, wandev_conf_t *conf) -{ -	struct cycx_x25_config cfg; - -	/* Verify configuration ID */ -	if (conf->config_id != WANCONFIG_X25) { -		printk(KERN_INFO "%s: invalid configuration ID %u!\n", -				 card->devname, conf->config_id); -		return -EINVAL; -	} - -	/* Initialize protocol-specific fields */ -	card->mbox  = card->hw.dpmbase + X25_MBOX_OFFS; -	card->u.x.connection_keys = 0; -	spin_lock_init(&card->u.x.lock); - -	/* Configure adapter. Here we set reasonable defaults, then parse -	 * device configuration structure and set configuration options. -	 * Most configuration options are verified and corrected (if -	 * necessary) since we can't rely on the adapter to do so and don't -	 * want it to fail either. */ -	memset(&cfg, 0, sizeof(cfg)); -	cfg.link = 0; -	cfg.clock = conf->clocking == WANOPT_EXTERNAL ? 8 : 55; -	cfg.speed = bps_to_speed_code(conf->bps); -	cfg.n3win = 7; -	cfg.n2win = 2; -	cfg.n2 = 5; -	cfg.nvc = 1; -	cfg.npvc = 1; -	cfg.flags = 0x02; /* default = V35 */ -	cfg.t1 = 10;   /* line carrier timeout */ -	cfg.t2 = 29;   /* tx timeout */ -	cfg.t21 = 180; /* CALL timeout */ -	cfg.t23 = 180; /* CLEAR timeout */ - -	/* adjust MTU */ -	if (!conf->mtu || conf->mtu >= 512) -		card->wandev.mtu = 512; -	else if (conf->mtu >= 256) -		card->wandev.mtu = 256; -	else if (conf->mtu >= 128) -		card->wandev.mtu = 128; -	else -		card->wandev.mtu = 64; - -	cfg.pktlen = cycx_log2(card->wandev.mtu); - -	if (conf->station == WANOPT_DTE) { -		cfg.locaddr = 3; /* DTE */ -		cfg.remaddr = 1; /* DCE */ -	} else { -		cfg.locaddr = 1; /* DCE */ -		cfg.remaddr = 3; /* DTE */ -	} - -	if (conf->interface == WANOPT_RS232) -	        cfg.flags = 0;      /* FIXME just reset the 2nd bit */ - -	if (conf->u.x25.hi_pvc) { -		card->u.x.hi_pvc = min_t(unsigned int, conf->u.x25.hi_pvc, 4095); -		card->u.x.lo_pvc = min_t(unsigned int, conf->u.x25.lo_pvc, card->u.x.hi_pvc); -	} - -	if (conf->u.x25.hi_svc) { -		card->u.x.hi_svc = min_t(unsigned int, conf->u.x25.hi_svc, 4095); -		card->u.x.lo_svc = min_t(unsigned int, conf->u.x25.lo_svc, card->u.x.hi_svc); -	} - -	if (card->u.x.lo_pvc == 255) -		cfg.npvc = 0; -	else -		cfg.npvc = card->u.x.hi_pvc - card->u.x.lo_pvc + 1; - -	cfg.nvc = card->u.x.hi_svc - card->u.x.lo_svc + 1 + cfg.npvc; - -	if (conf->u.x25.hdlc_window) -		cfg.n2win = min_t(unsigned int, conf->u.x25.hdlc_window, 7); - -	if (conf->u.x25.pkt_window) -		cfg.n3win = min_t(unsigned int, conf->u.x25.pkt_window, 7); - -	if (conf->u.x25.t1) -		cfg.t1 = min_t(unsigned int, conf->u.x25.t1, 30); - -	if (conf->u.x25.t2) -		cfg.t2 = min_t(unsigned int, conf->u.x25.t2, 30); - -	if (conf->u.x25.t11_t21) -		cfg.t21 = min_t(unsigned int, conf->u.x25.t11_t21, 30); - -	if (conf->u.x25.t13_t23) -		cfg.t23 = min_t(unsigned int, conf->u.x25.t13_t23, 30); - -	if (conf->u.x25.n2) -		cfg.n2 = min_t(unsigned int, conf->u.x25.n2, 30); - -	/* initialize adapter */ -	if (cycx_x25_configure(card, &cfg)) -		return -EIO; - -	/* Initialize protocol-specific fields of adapter data space */ -	card->wandev.bps	= conf->bps; -	card->wandev.interface	= conf->interface; -	card->wandev.clocking	= conf->clocking; -	card->wandev.station	= conf->station; -	card->isr		= cycx_x25_irq_handler; -	card->exec		= NULL; -	card->wandev.update	= cycx_wan_update; -	card->wandev.new_if	= cycx_wan_new_if; -	card->wandev.del_if	= cycx_wan_del_if; -	card->wandev.state	= WAN_DISCONNECTED; - -	return 0; -} - -/* WAN Device Driver Entry Points */ -/* Update device status & statistics. */ -static int cycx_wan_update(struct wan_device *wandev) -{ -	/* sanity checks */ -	if (!wandev || !wandev->private) -		return -EFAULT; - -	if (wandev->state == WAN_UNCONFIGURED) -		return -ENODEV; - -	cycx_x25_get_stats(wandev->private); - -	return 0; -} - -/* Create new logical channel. - * This routine is called by the router when ROUTER_IFNEW IOCTL is being - * handled. - * o parse media- and hardware-specific configuration - * o make sure that a new channel can be created - * o allocate resources, if necessary - * o prepare network device structure for registration. - * - * Return:	0	o.k. - *		< 0	failure (channel will not be created) */ -static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev, -			   wanif_conf_t *conf) -{ -	struct cycx_device *card = wandev->private; -	struct cycx_x25_channel *chan; -	int err = 0; - -	if (!conf->name[0] || strlen(conf->name) > WAN_IFNAME_SZ) { -		printk(KERN_INFO "%s: invalid interface name!\n", -		       card->devname); -		return -EINVAL; -	} - -	dev = alloc_netdev(sizeof(struct cycx_x25_channel), conf->name, -			     cycx_x25_chan_setup); -	if (!dev) -		return -ENOMEM; - -	chan = netdev_priv(dev); -	strcpy(chan->name, conf->name); -	chan->card = card; -	chan->link = conf->port; -	chan->protocol = conf->protocol ? ETH_P_X25 : ETH_P_IP; -	chan->rx_skb = NULL; -	/* only used in svc connected thru crossover cable */ -	chan->local_addr = NULL; - -	if (conf->addr[0] == '@') {	/* SVC */ -		int len = strlen(conf->local_addr); - -		if (len) { -			if (len > WAN_ADDRESS_SZ) { -				printk(KERN_ERR "%s: %s local addr too long!\n", -						wandev->name, chan->name); -				err = -EINVAL; -				goto error; -			} else { -				chan->local_addr = kmalloc(len + 1, GFP_KERNEL); - -				if (!chan->local_addr) { -					err = -ENOMEM; -					goto error; -				} -			} - -			strncpy(chan->local_addr, conf->local_addr, -				WAN_ADDRESS_SZ); -		} - -		chan->svc = 1; -		strncpy(chan->addr, &conf->addr[1], WAN_ADDRESS_SZ); -		init_timer(&chan->timer); -		chan->timer.function	= cycx_x25_chan_timer; -		chan->timer.data	= (unsigned long)dev; - -		/* Set channel timeouts (default if not specified) */ -		chan->idle_tmout = conf->idle_timeout ? conf->idle_timeout : 90; -	} else if (isdigit(conf->addr[0])) {	/* PVC */ -		s16 lcn = dec_to_uint(conf->addr, 0); - -		if (lcn >= card->u.x.lo_pvc && lcn <= card->u.x.hi_pvc) -			chan->lcn = lcn; -		else { -			printk(KERN_ERR -				"%s: PVC %u is out of range on interface %s!\n", -				wandev->name, lcn, chan->name); -			err = -EINVAL; -			goto error; -		} -	} else { -		printk(KERN_ERR "%s: invalid media address on interface %s!\n", -				wandev->name, chan->name); -		err = -EINVAL; -		goto error; -	} - -	return 0; - -error: -	free_netdev(dev); -	return err; -} - -/* Delete logical channel. */ -static int cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); - -	if (chan->svc) { -		kfree(chan->local_addr); -		if (chan->state == WAN_CONNECTED) -			del_timer(&chan->timer); -	} - -	return 0; -} - - -/* Network Device Interface */ - -static const struct header_ops cycx_header_ops = { -	.create = cycx_netdevice_hard_header, -	.rebuild = cycx_netdevice_rebuild_header, -}; - -static const struct net_device_ops cycx_netdev_ops = { -	.ndo_init	= cycx_netdevice_init, -	.ndo_open	= cycx_netdevice_open, -	.ndo_stop	= cycx_netdevice_stop, -	.ndo_start_xmit	= cycx_netdevice_hard_start_xmit, -	.ndo_get_stats	= cycx_netdevice_get_stats, -}; - -static void cycx_x25_chan_setup(struct net_device *dev) -{ -	/* Initialize device driver entry points */ -	dev->netdev_ops		= &cycx_netdev_ops; -	dev->header_ops		= &cycx_header_ops; - -	/* Initialize media-specific parameters */ -	dev->mtu		= CYCX_X25_CHAN_MTU; -	dev->type		= ARPHRD_HWX25;	/* ARP h/w type */ -	dev->hard_header_len	= 0;		/* media header length */ -	dev->addr_len		= 0;		/* hardware address length */ -} - -/* Initialize Linux network interface. - * - * This routine is called only once for each interface, during Linux network - * interface registration.  Returning anything but zero will fail interface - * registration. */ -static int cycx_netdevice_init(struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); -	struct cycx_device *card = chan->card; -	struct wan_device *wandev = &card->wandev; - -	if (!chan->svc) -		*(__be16*)dev->dev_addr = htons(chan->lcn); - -	/* Initialize hardware parameters (just for reference) */ -	dev->irq		= wandev->irq; -	dev->dma		= wandev->dma; -	dev->base_addr		= wandev->ioport; -	dev->mem_start		= (unsigned long)wandev->maddr; -	dev->mem_end		= (unsigned long)(wandev->maddr + -						  wandev->msize - 1); -	dev->flags		|= IFF_NOARP; - -	/* Set transmit buffer queue length */ -	dev->tx_queue_len	= 10; - -	/* Initialize socket buffers */ -	cycx_x25_set_chan_state(dev, WAN_DISCONNECTED); - -	return 0; -} - -/* Open network interface. - * o prevent module from unloading by incrementing use count - * o if link is disconnected then initiate connection - * - * Return 0 if O.k. or errno.  */ -static int cycx_netdevice_open(struct net_device *dev) -{ -	if (netif_running(dev)) -		return -EBUSY; /* only one open is allowed */ - -	netif_start_queue(dev); -	return 0; -} - -/* Close network interface. - * o reset flags. - * o if there's no more open channels then disconnect physical link. */ -static int cycx_netdevice_stop(struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); - -	netif_stop_queue(dev); - -	if (chan->state == WAN_CONNECTED || chan->state == WAN_CONNECTING) -		cycx_x25_chan_disconnect(dev); - -	return 0; -} - -/* Build media header. - * o encapsulate packet according to encapsulation type. - * - * The trick here is to put packet type (Ethertype) into 'protocol' field of - * the socket buffer, so that we don't forget it.  If encapsulation fails, - * set skb->protocol to 0 and discard packet later. - * - * Return:	media header length. */ -static int cycx_netdevice_hard_header(struct sk_buff *skb, -				      struct net_device *dev, u16 type, -				      const void *daddr, const void *saddr, -				      unsigned len) -{ -	skb->protocol = htons(type); - -	return dev->hard_header_len; -} - -/* * Re-build media header. - * Return:	1	physical address resolved. - *		0	physical address not resolved */ -static int cycx_netdevice_rebuild_header(struct sk_buff *skb) -{ -	return 1; -} - -/* Send a packet on a network interface. - * o set busy flag (marks start of the transmission). - * o check link state. If link is not up, then drop the packet. - * o check channel status. If it's down then initiate a call. - * o pass a packet to corresponding WAN device. - * o free socket buffer - * - * Return:	0	complete (socket buffer must be freed) - *		non-0	packet may be re-transmitted (tbusy must be set) - * - * Notes: - * 1. This routine is called either by the protocol stack or by the "net - *    bottom half" (with interrupts enabled). - * 2. Setting tbusy flag will inhibit further transmit requests from the - *    protocol stack and can be used for flow control with protocol layer. */ -static netdev_tx_t cycx_netdevice_hard_start_xmit(struct sk_buff *skb, -							struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); -	struct cycx_device *card = chan->card; - -	if (!chan->svc) -		chan->protocol = ntohs(skb->protocol); - -	if (card->wandev.state != WAN_CONNECTED) -		++chan->ifstats.tx_dropped; -	else if (chan->svc && chan->protocol && -		 chan->protocol != ntohs(skb->protocol)) { -		printk(KERN_INFO -		       "%s: unsupported Ethertype 0x%04X on interface %s!\n", -		       card->devname, ntohs(skb->protocol), dev->name); -		++chan->ifstats.tx_errors; -	} else if (chan->protocol == ETH_P_IP) { -		switch (chan->state) { -		case WAN_DISCONNECTED: -			if (cycx_x25_chan_connect(dev)) { -				netif_stop_queue(dev); -				return NETDEV_TX_BUSY; -			} -			/* fall thru */ -		case WAN_CONNECTED: -			reset_timer(dev); -			dev->trans_start = jiffies; -			netif_stop_queue(dev); - -			if (cycx_x25_chan_send(dev, skb)) -				return NETDEV_TX_BUSY; - -			break; -		default: -			++chan->ifstats.tx_dropped; -			++card->wandev.stats.tx_dropped; -	} -	} else { /* chan->protocol == ETH_P_X25 */ -		switch (skb->data[0]) { -		case X25_IFACE_DATA: -			break; -		case X25_IFACE_CONNECT: -			cycx_x25_chan_connect(dev); -			goto free_packet; -		case X25_IFACE_DISCONNECT: -			cycx_x25_chan_disconnect(dev); -			goto free_packet; -	        default: -			printk(KERN_INFO -			       "%s: unknown %d x25-iface request on %s!\n", -			       card->devname, skb->data[0], dev->name); -			++chan->ifstats.tx_errors; -			goto free_packet; -		} - -		skb_pull(skb, 1); /* Remove control byte */ -		reset_timer(dev); -		dev->trans_start = jiffies; -		netif_stop_queue(dev); - -		if (cycx_x25_chan_send(dev, skb)) { -			/* prepare for future retransmissions */ -			skb_push(skb, 1); -			return NETDEV_TX_BUSY; -		} -	} - -free_packet: -	dev_kfree_skb(skb); - -	return NETDEV_TX_OK; -} - -/* Get Ethernet-style interface statistics. - * Return a pointer to struct net_device_stats */ -static struct net_device_stats *cycx_netdevice_get_stats(struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); - -	return chan ? &chan->ifstats : NULL; -} - -/* Interrupt Handlers */ -/* X.25 Interrupt Service Routine. */ -static void cycx_x25_irq_handler(struct cycx_device *card) -{ -	struct cycx_x25_cmd cmd; -	u16 z = 0; - -	card->in_isr = 1; -	card->buff_int_mode_unbusy = 0; -	cycx_peek(&card->hw, X25_RXMBOX_OFFS, &cmd, sizeof(cmd)); - -	switch (cmd.command) { -	case X25_DATA_INDICATION: -		cycx_x25_irq_rx(card, &cmd); -		break; -	case X25_ACK_FROM_VC: -		cycx_x25_irq_tx(card, &cmd); -		break; -	case X25_LOG: -		cycx_x25_irq_log(card, &cmd); -		break; -	case X25_STATISTIC: -		cycx_x25_irq_stat(card, &cmd); -		break; -	case X25_CONNECT_CONFIRM: -		cycx_x25_irq_connect_confirm(card, &cmd); -		break; -	case X25_CONNECT_INDICATION: -		cycx_x25_irq_connect(card, &cmd); -		break; -	case X25_DISCONNECT_INDICATION: -		cycx_x25_irq_disconnect(card, &cmd); -		break; -	case X25_DISCONNECT_CONFIRM: -		cycx_x25_irq_disconnect_confirm(card, &cmd); -		break; -	case X25_LINE_ON: -		cycx_set_state(card, WAN_CONNECTED); -		break; -	case X25_LINE_OFF: -		cycx_set_state(card, WAN_DISCONNECTED); -		break; -	default: -		cycx_x25_irq_spurious(card, &cmd); -		break; -	} - -	cycx_poke(&card->hw, 0, &z, sizeof(z)); -	cycx_poke(&card->hw, X25_RXMBOX_OFFS, &z, sizeof(z)); -	card->in_isr = 0; -} - -/* Transmit interrupt handler. - *	o Release socket buffer - *	o Clear 'tbusy' flag */ -static void cycx_x25_irq_tx(struct cycx_device *card, struct cycx_x25_cmd *cmd) -{ -	struct net_device *dev; -	struct wan_device *wandev = &card->wandev; -	u8 lcn; - -	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn)); - -	/* unbusy device and then dev_tint(); */ -	dev = cycx_x25_get_dev_by_lcn(wandev, lcn); -	if (dev) { -		card->buff_int_mode_unbusy = 1; -		netif_wake_queue(dev); -	} else -		printk(KERN_ERR "%s:ackvc for inexistent lcn %d\n", -				 card->devname, lcn); -} - -/* Receive interrupt handler. - * This routine handles fragmented IP packets using M-bit according to the - * RFC1356. - * o map logical channel number to network interface. - * o allocate socket buffer or append received packet to the existing one. - * o if M-bit is reset (i.e. it's the last packet in a sequence) then - *   decapsulate packet and pass socket buffer to the protocol stack. - * - * Notes: - * 1. When allocating a socket buffer, if M-bit is set then more data is - *    coming and we have to allocate buffer for the maximum IP packet size - *    expected on this channel. - * 2. If something goes wrong and X.25 packet has to be dropped (e.g. no - *    socket buffers available) the whole packet sequence must be discarded. */ -static void cycx_x25_irq_rx(struct cycx_device *card, struct cycx_x25_cmd *cmd) -{ -	struct wan_device *wandev = &card->wandev; -	struct net_device *dev; -	struct cycx_x25_channel *chan; -	struct sk_buff *skb; -	u8 bitm, lcn; -	int pktlen = cmd->len - 5; - -	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn)); -	cycx_peek(&card->hw, cmd->buf + 4, &bitm, sizeof(bitm)); -	bitm &= 0x10; - -	dev = cycx_x25_get_dev_by_lcn(wandev, lcn); -	if (!dev) { -		/* Invalid channel, discard packet */ -		printk(KERN_INFO "%s: receiving on orphaned LCN %d!\n", -				 card->devname, lcn); -		return; -	} - -	chan = netdev_priv(dev); -	reset_timer(dev); - -	if (chan->drop_sequence) { -		if (!bitm) -			chan->drop_sequence = 0; -		else -			return; -	} - -	if ((skb = chan->rx_skb) == NULL) { -		/* Allocate new socket buffer */ -		int bufsize = bitm ? dev->mtu : pktlen; - -		if ((skb = dev_alloc_skb((chan->protocol == ETH_P_X25 ? 1 : 0) + -					 bufsize + -					 dev->hard_header_len)) == NULL) { -			printk(KERN_INFO "%s: no socket buffers available!\n", -					 card->devname); -			chan->drop_sequence = 1; -			++chan->ifstats.rx_dropped; -			return; -		} - -		if (chan->protocol == ETH_P_X25) /* X.25 socket layer control */ -			/* 0 = data packet (dev_alloc_skb zeroed skb->data) */ -			skb_put(skb, 1); - -		skb->dev = dev; -		skb->protocol = htons(chan->protocol); -		chan->rx_skb = skb; -	} - -	if (skb_tailroom(skb) < pktlen) { -		/* No room for the packet. Call off the whole thing! */ -		dev_kfree_skb_irq(skb); -		chan->rx_skb = NULL; - -		if (bitm) -			chan->drop_sequence = 1; - -		printk(KERN_INFO "%s: unexpectedly long packet sequence " -			"on interface %s!\n", card->devname, dev->name); -		++chan->ifstats.rx_length_errors; -		return; -	} - -	/* Append packet to the socket buffer  */ -	cycx_peek(&card->hw, cmd->buf + 5, skb_put(skb, pktlen), pktlen); - -	if (bitm) -		return; /* more data is coming */ - -	chan->rx_skb = NULL;		/* dequeue packet */ - -	++chan->ifstats.rx_packets; -	chan->ifstats.rx_bytes += pktlen; - -	skb_reset_mac_header(skb); -	netif_rx(skb); -} - -/* Connect interrupt handler. */ -static void cycx_x25_irq_connect(struct cycx_device *card, -				 struct cycx_x25_cmd *cmd) -{ -	struct wan_device *wandev = &card->wandev; -	struct net_device *dev = NULL; -	struct cycx_x25_channel *chan; -	u8 d[32], -	   loc[24], -	   rem[24]; -	u8 lcn, sizeloc, sizerem; - -	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn)); -	cycx_peek(&card->hw, cmd->buf + 5, &sizeloc, sizeof(sizeloc)); -	cycx_peek(&card->hw, cmd->buf + 6, d, cmd->len - 6); - -	sizerem = sizeloc >> 4; -	sizeloc &= 0x0F; - -	loc[0] = rem[0] = '\0'; - -	if (sizeloc) -		nibble_to_byte(d, loc, sizeloc, 0); - -	if (sizerem) -		nibble_to_byte(d + (sizeloc >> 1), rem, sizerem, sizeloc & 1); - -	dprintk(1, KERN_INFO "%s:lcn=%d, local=%s, remote=%s\n", -			  __func__, lcn, loc, rem); - -	dev = cycx_x25_get_dev_by_dte_addr(wandev, rem); -	if (!dev) { -		/* Invalid channel, discard packet */ -		printk(KERN_INFO "%s: connect not expected: remote %s!\n", -				 card->devname, rem); -		return; -	} - -	chan = netdev_priv(dev); -	chan->lcn = lcn; -	cycx_x25_connect_response(card, chan); -	cycx_x25_set_chan_state(dev, WAN_CONNECTED); -} - -/* Connect confirm interrupt handler. */ -static void cycx_x25_irq_connect_confirm(struct cycx_device *card, -					 struct cycx_x25_cmd *cmd) -{ -	struct wan_device *wandev = &card->wandev; -	struct net_device *dev; -	struct cycx_x25_channel *chan; -	u8 lcn, key; - -	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn)); -	cycx_peek(&card->hw, cmd->buf + 1, &key, sizeof(key)); -	dprintk(1, KERN_INFO "%s: %s:lcn=%d, key=%d\n", -			  card->devname, __func__, lcn, key); - -	dev = cycx_x25_get_dev_by_lcn(wandev, -key); -	if (!dev) { -		/* Invalid channel, discard packet */ -		clear_bit(--key, (void*)&card->u.x.connection_keys); -		printk(KERN_INFO "%s: connect confirm not expected: lcn %d, " -				 "key=%d!\n", card->devname, lcn, key); -		return; -	} - -	clear_bit(--key, (void*)&card->u.x.connection_keys); -	chan = netdev_priv(dev); -	chan->lcn = lcn; -	cycx_x25_set_chan_state(dev, WAN_CONNECTED); -} - -/* Disconnect confirm interrupt handler. */ -static void cycx_x25_irq_disconnect_confirm(struct cycx_device *card, -					    struct cycx_x25_cmd *cmd) -{ -	struct wan_device *wandev = &card->wandev; -	struct net_device *dev; -	u8 lcn; - -	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn)); -	dprintk(1, KERN_INFO "%s: %s:lcn=%d\n", -			  card->devname, __func__, lcn); -	dev = cycx_x25_get_dev_by_lcn(wandev, lcn); -	if (!dev) { -		/* Invalid channel, discard packet */ -		printk(KERN_INFO "%s:disconnect confirm not expected!:lcn %d\n", -				 card->devname, lcn); -		return; -	} - -	cycx_x25_set_chan_state(dev, WAN_DISCONNECTED); -} - -/* disconnect interrupt handler. */ -static void cycx_x25_irq_disconnect(struct cycx_device *card, -				    struct cycx_x25_cmd *cmd) -{ -	struct wan_device *wandev = &card->wandev; -	struct net_device *dev; -	u8 lcn; - -	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn)); -	dprintk(1, KERN_INFO "%s:lcn=%d\n", __func__, lcn); - -	dev = cycx_x25_get_dev_by_lcn(wandev, lcn); -	if (dev) { -		struct cycx_x25_channel *chan = netdev_priv(dev); - -		cycx_x25_disconnect_response(card, chan->link, lcn); -		cycx_x25_set_chan_state(dev, WAN_DISCONNECTED); -	} else -		cycx_x25_disconnect_response(card, 0, lcn); -} - -/* LOG interrupt handler. */ -static void cycx_x25_irq_log(struct cycx_device *card, struct cycx_x25_cmd *cmd) -{ -#if CYCLOMX_X25_DEBUG -	char bf[20]; -	u16 size, toread, link, msg_code; -	u8 code, routine; - -	cycx_peek(&card->hw, cmd->buf, &msg_code, sizeof(msg_code)); -	cycx_peek(&card->hw, cmd->buf + 2, &link, sizeof(link)); -	cycx_peek(&card->hw, cmd->buf + 4, &size, sizeof(size)); -	/* at most 20 bytes are available... thanks to Daniela :) */ -	toread = size < 20 ? size : 20; -	cycx_peek(&card->hw, cmd->buf + 10, &bf, toread); -	cycx_peek(&card->hw, cmd->buf + 10 + toread, &code, 1); -	cycx_peek(&card->hw, cmd->buf + 10 + toread + 1, &routine, 1); - -	printk(KERN_INFO "cycx_x25_irq_handler: X25_LOG (0x4500) indic.:\n"); -	printk(KERN_INFO "cmd->buf=0x%X\n", cmd->buf); -	printk(KERN_INFO "Log message code=0x%X\n", msg_code); -	printk(KERN_INFO "Link=%d\n", link); -	printk(KERN_INFO "log code=0x%X\n", code); -	printk(KERN_INFO "log routine=0x%X\n", routine); -	printk(KERN_INFO "Message size=%d\n", size); -	hex_dump("Message", bf, toread); -#endif -} - -/* STATISTIC interrupt handler. */ -static void cycx_x25_irq_stat(struct cycx_device *card, -			      struct cycx_x25_cmd *cmd) -{ -	cycx_peek(&card->hw, cmd->buf, &card->u.x.stats, -		  sizeof(card->u.x.stats)); -	hex_dump("cycx_x25_irq_stat", (unsigned char*)&card->u.x.stats, -		 sizeof(card->u.x.stats)); -	cycx_x25_dump_stats(&card->u.x.stats); -	wake_up_interruptible(&card->wait_stats); -} - -/* Spurious interrupt handler. - * o print a warning - * If number of spurious interrupts exceeded some limit, then ??? */ -static void cycx_x25_irq_spurious(struct cycx_device *card, -				  struct cycx_x25_cmd *cmd) -{ -	printk(KERN_INFO "%s: spurious interrupt (0x%X)!\n", -			 card->devname, cmd->command); -} -#ifdef CYCLOMX_X25_DEBUG -static void hex_dump(char *msg, unsigned char *p, int len) -{ -	unsigned char hex[1024], -	    	* phex = hex; - -	if (len >= (sizeof(hex) / 2)) -		len = (sizeof(hex) / 2) - 1; - -	while (len--) { -		sprintf(phex, "%02x", *p++); -		phex += 2; -	} - -	printk(KERN_INFO "%s: %s\n", msg, hex); -} -#endif - -/* Cyclom 2X Firmware-Specific Functions */ -/* Exec X.25 command. */ -static int x25_exec(struct cycx_device *card, int command, int link, -		    void *d1, int len1, void *d2, int len2) -{ -	struct cycx_x25_cmd c; -	unsigned long flags; -	u32 addr = 0x1200 + 0x2E0 * link + 0x1E2; -	u8 retry = CYCX_X25_MAX_CMD_RETRY; -	int err = 0; - -	c.command = command; -	c.link = link; -	c.len = len1 + len2; - -	spin_lock_irqsave(&card->u.x.lock, flags); - -	/* write command */ -	cycx_poke(&card->hw, X25_MBOX_OFFS, &c, sizeof(c) - sizeof(c.buf)); - -	/* write X.25 data */ -	if (d1) { -		cycx_poke(&card->hw, addr, d1, len1); - -		if (d2) { -			if (len2 > 254) { -				u32 addr1 = 0xA00 + 0x400 * link; - -				cycx_poke(&card->hw, addr + len1, d2, 249); -				cycx_poke(&card->hw, addr1, ((u8*)d2) + 249, -					  len2 - 249); -			} else -				cycx_poke(&card->hw, addr + len1, d2, len2); -		} -	} - -	/* generate interruption, executing command */ -	cycx_intr(&card->hw); - -	/* wait till card->mbox == 0 */ -	do { -		err = cycx_exec(card->mbox); -	} while (retry-- && err); - -	spin_unlock_irqrestore(&card->u.x.lock, flags); - -	return err; -} - -/* Configure adapter. */ -static int cycx_x25_configure(struct cycx_device *card, -			      struct cycx_x25_config *conf) -{ -	struct { -		u16 nlinks; -		struct cycx_x25_config conf[2]; -	} x25_cmd_conf; - -	memset(&x25_cmd_conf, 0, sizeof(x25_cmd_conf)); -	x25_cmd_conf.nlinks = 2; -	x25_cmd_conf.conf[0] = *conf; -	/* FIXME: we need to find a way in the wanrouter framework -		  to configure the second link, for now lets use it -		  with the same config from the first link, fixing -		  the interface type to RS232, the speed in 38400 and -		  the clock to external */ -	x25_cmd_conf.conf[1] = *conf; -	x25_cmd_conf.conf[1].link = 1; -	x25_cmd_conf.conf[1].speed = 5; /* 38400 */ -	x25_cmd_conf.conf[1].clock = 8; -	x25_cmd_conf.conf[1].flags = 0; /* default = RS232 */ - -	cycx_x25_dump_config(&x25_cmd_conf.conf[0]); -	cycx_x25_dump_config(&x25_cmd_conf.conf[1]); - -	return x25_exec(card, X25_CONFIG, 0, -			&x25_cmd_conf, sizeof(x25_cmd_conf), NULL, 0); -} - -/* Get protocol statistics. */ -static int cycx_x25_get_stats(struct cycx_device *card) -{ -	/* the firmware expects 20 in the size field!!! -	   thanks to Daniela */ -	int err = x25_exec(card, X25_STATISTIC, 0, NULL, 20, NULL, 0); - -	if (err) -		return err; - -	interruptible_sleep_on(&card->wait_stats); - -	if (signal_pending(current)) -		return -EINTR; - -	card->wandev.stats.rx_packets = card->u.x.stats.n2_rx_frames; -	card->wandev.stats.rx_over_errors = card->u.x.stats.rx_over_errors; -	card->wandev.stats.rx_crc_errors = card->u.x.stats.rx_crc_errors; -	card->wandev.stats.rx_length_errors = 0; /* not available from fw */ -	card->wandev.stats.rx_frame_errors = 0; /* not available from fw */ -	card->wandev.stats.rx_missed_errors = card->u.x.stats.rx_aborts; -	card->wandev.stats.rx_dropped = 0; /* not available from fw */ -	card->wandev.stats.rx_errors = 0; /* not available from fw */ -	card->wandev.stats.tx_packets = card->u.x.stats.n2_tx_frames; -	card->wandev.stats.tx_aborted_errors = card->u.x.stats.tx_aborts; -	card->wandev.stats.tx_dropped = 0; /* not available from fw */ -	card->wandev.stats.collisions = 0; /* not available from fw */ -	card->wandev.stats.tx_errors = 0; /* not available from fw */ - -	cycx_x25_dump_devs(&card->wandev); - -	return 0; -} - -/* return the number of nibbles */ -static int byte_to_nibble(u8 *s, u8 *d, char *nibble) -{ -	int i = 0; - -	if (*nibble && *s) { -		d[i] |= *s++ - '0'; -		*nibble = 0; -		++i; -	} - -	while (*s) { -		d[i] = (*s - '0') << 4; -		if (*(s + 1)) -			d[i] |= *(s + 1) - '0'; -		else { -			*nibble = 1; -			break; -		} -		++i; -		s += 2; -	} - -	return i; -} - -static void nibble_to_byte(u8 *s, u8 *d, u8 len, u8 nibble) -{ -	if (nibble) { -		*d++ = '0' + (*s++ & 0x0F); -		--len; -	} - -	while (len) { -		*d++ = '0' + (*s >> 4); - -		if (--len) { -			*d++ = '0' + (*s & 0x0F); -			--len; -		} else break; - -		++s; -	} - -	*d = '\0'; -} - -/* Place X.25 call. */ -static int x25_place_call(struct cycx_device *card, -			  struct cycx_x25_channel *chan) -{ -	int err = 0, -	    len; -	char d[64], -	     nibble = 0, -	     mylen = chan->local_addr ? strlen(chan->local_addr) : 0, -	     remotelen = strlen(chan->addr); -	u8 key; - -	if (card->u.x.connection_keys == ~0U) { -		printk(KERN_INFO "%s: too many simultaneous connection " -				 "requests!\n", card->devname); -		return -EAGAIN; -	} - -	key = ffz(card->u.x.connection_keys); -	set_bit(key, (void*)&card->u.x.connection_keys); -	++key; -	dprintk(1, KERN_INFO "%s:x25_place_call:key=%d\n", card->devname, key); -	memset(d, 0, sizeof(d)); -	d[1] = key; /* user key */ -	d[2] = 0x10; -	d[4] = 0x0B; - -	len = byte_to_nibble(chan->addr, d + 6, &nibble); - -	if (chan->local_addr) -		len += byte_to_nibble(chan->local_addr, d + 6 + len, &nibble); - -	if (nibble) -		++len; - -	d[5] = mylen << 4 | remotelen; -	d[6 + len + 1] = 0xCC; /* TCP/IP over X.25, thanks to Daniela :) */ - -	if ((err = x25_exec(card, X25_CONNECT_REQUEST, chan->link, -			    &d, 7 + len + 1, NULL, 0)) != 0) -		clear_bit(--key, (void*)&card->u.x.connection_keys); -	else -		chan->lcn = -key; - -	return err; -} - -/* Place X.25 CONNECT RESPONSE. */ -static int cycx_x25_connect_response(struct cycx_device *card, -				     struct cycx_x25_channel *chan) -{ -	u8 d[8]; - -	memset(d, 0, sizeof(d)); -	d[0] = d[3] = chan->lcn; -	d[2] = 0x10; -	d[4] = 0x0F; -	d[7] = 0xCC; /* TCP/IP over X.25, thanks Daniela */ - -	return x25_exec(card, X25_CONNECT_RESPONSE, chan->link, &d, 8, NULL, 0); -} - -/* Place X.25 DISCONNECT RESPONSE.  */ -static int cycx_x25_disconnect_response(struct cycx_device *card, u8 link, -					u8 lcn) -{ -	char d[5]; - -	memset(d, 0, sizeof(d)); -	d[0] = d[3] = lcn; -	d[2] = 0x10; -	d[4] = 0x17; - -	return x25_exec(card, X25_DISCONNECT_RESPONSE, link, &d, 5, NULL, 0); -} - -/* Clear X.25 call.  */ -static int x25_clear_call(struct cycx_device *card, u8 link, u8 lcn, u8 cause, -			  u8 diagn) -{ -	u8 d[7]; - -	memset(d, 0, sizeof(d)); -	d[0] = d[3] = lcn; -	d[2] = 0x10; -	d[4] = 0x13; -	d[5] = cause; -	d[6] = diagn; - -	return x25_exec(card, X25_DISCONNECT_REQUEST, link, d, 7, NULL, 0); -} - -/* Send X.25 data packet. */ -static int cycx_x25_send(struct cycx_device *card, u8 link, u8 lcn, u8 bitm, -			 int len, void *buf) -{ -	u8 d[] = "?\xFF\x10??"; - -	d[0] = d[3] = lcn; -	d[4] = bitm; - -	return x25_exec(card, X25_DATA_REQUEST, link, &d, 5, buf, len); -} - -/* Miscellaneous */ -/* Find network device by its channel number.  */ -static struct net_device *cycx_x25_get_dev_by_lcn(struct wan_device *wandev, -						  s16 lcn) -{ -	struct net_device *dev = wandev->dev; -	struct cycx_x25_channel *chan; - -	while (dev) { -		chan = netdev_priv(dev); - -		if (chan->lcn == lcn) -			break; -		dev = chan->slave; -	} -	return dev; -} - -/* Find network device by its remote dte address. */ -static struct net_device * -	cycx_x25_get_dev_by_dte_addr(struct wan_device *wandev, char *dte) -{ -	struct net_device *dev = wandev->dev; -	struct cycx_x25_channel *chan; - -	while (dev) { -		chan = netdev_priv(dev); - -		if (!strcmp(chan->addr, dte)) -			break; -		dev = chan->slave; -	} -	return dev; -} - -/* Initiate connection on the logical channel. - * o for PVC we just get channel configuration - * o for SVCs place an X.25 call - * - * Return:	0	connected - *		>0	connection in progress - *		<0	failure */ -static int cycx_x25_chan_connect(struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); -	struct cycx_device *card = chan->card; - -	if (chan->svc) { -		if (!chan->addr[0]) -			return -EINVAL; /* no destination address */ - -		dprintk(1, KERN_INFO "%s: placing X.25 call to %s...\n", -				  card->devname, chan->addr); - -		if (x25_place_call(card, chan)) -			return -EIO; - -		cycx_x25_set_chan_state(dev, WAN_CONNECTING); -		return 1; -	} else -		cycx_x25_set_chan_state(dev, WAN_CONNECTED); - -	return 0; -} - -/* Disconnect logical channel. - * o if SVC then clear X.25 call */ -static void cycx_x25_chan_disconnect(struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); - -	if (chan->svc) { -		x25_clear_call(chan->card, chan->link, chan->lcn, 0, 0); -		cycx_x25_set_chan_state(dev, WAN_DISCONNECTING); -	} else -		cycx_x25_set_chan_state(dev, WAN_DISCONNECTED); -} - -/* Called by kernel timer */ -static void cycx_x25_chan_timer(unsigned long d) -{ -	struct net_device *dev = (struct net_device *)d; -	struct cycx_x25_channel *chan = netdev_priv(dev); - -	if (chan->state == WAN_CONNECTED) -		cycx_x25_chan_disconnect(dev); -	else -		printk(KERN_ERR "%s: %s for svc (%s) not connected!\n", -				chan->card->devname, __func__, dev->name); -} - -/* Set logical channel state. */ -static void cycx_x25_set_chan_state(struct net_device *dev, u8 state) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); -	struct cycx_device *card = chan->card; -	unsigned long flags; -	char *string_state = NULL; - -	spin_lock_irqsave(&card->lock, flags); - -	if (chan->state != state) { -		if (chan->svc && chan->state == WAN_CONNECTED) -			del_timer(&chan->timer); - -		switch (state) { -		case WAN_CONNECTED: -			string_state = "connected!"; -			*(__be16*)dev->dev_addr = htons(chan->lcn); -			netif_wake_queue(dev); -			reset_timer(dev); - -			if (chan->protocol == ETH_P_X25) -				cycx_x25_chan_send_event(dev, -					X25_IFACE_CONNECT); - -			break; -		case WAN_CONNECTING: -			string_state = "connecting..."; -			break; -		case WAN_DISCONNECTING: -			string_state = "disconnecting..."; -			break; -		case WAN_DISCONNECTED: -			string_state = "disconnected!"; - -			if (chan->svc) { -				*(unsigned short*)dev->dev_addr = 0; -				chan->lcn = 0; -			} - -			if (chan->protocol == ETH_P_X25) -				cycx_x25_chan_send_event(dev, -					X25_IFACE_DISCONNECT); - -			netif_wake_queue(dev); -			break; -		} - -		printk(KERN_INFO "%s: interface %s %s\n", card->devname, -				  dev->name, string_state); -		chan->state = state; -	} - -	spin_unlock_irqrestore(&card->lock, flags); -} - -/* Send packet on a logical channel. - *	When this function is called, tx_skb field of the channel data space - *	points to the transmit socket buffer.  When transmission is complete, - *	release socket buffer and reset 'tbusy' flag. - * - * Return:	0	- transmission complete - *		1	- busy - * - * Notes: - * 1. If packet length is greater than MTU for this channel, we'll fragment - *    the packet into 'complete sequence' using M-bit. - * 2. When transmission is complete, an event notification should be issued - *    to the router.  */ -static int cycx_x25_chan_send(struct net_device *dev, struct sk_buff *skb) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); -	struct cycx_device *card = chan->card; -	int bitm = 0;		/* final packet */ -	unsigned len = skb->len; - -	if (skb->len > card->wandev.mtu) { -		len = card->wandev.mtu; -		bitm = 0x10;		/* set M-bit (more data) */ -	} - -	if (cycx_x25_send(card, chan->link, chan->lcn, bitm, len, skb->data)) -		return 1; - -	if (bitm) { -		skb_pull(skb, len); -		return 1; -	} - -	++chan->ifstats.tx_packets; -	chan->ifstats.tx_bytes += len; - -	return 0; -} - -/* Send event (connection, disconnection, etc) to X.25 socket layer */ - -static void cycx_x25_chan_send_event(struct net_device *dev, u8 event) -{ -	struct sk_buff *skb; -	unsigned char *ptr; - -	if ((skb = dev_alloc_skb(1)) == NULL) { -		printk(KERN_ERR "%s: out of memory\n", __func__); -		return; -	} - -	ptr  = skb_put(skb, 1); -	*ptr = event; - -	skb->protocol = x25_type_trans(skb, dev); -	netif_rx(skb); -} - -/* Convert line speed in bps to a number used by cyclom 2x code. */ -static u8 bps_to_speed_code(u32 bps) -{ -	u8 number = 0; /* defaults to the lowest (1200) speed ;> */ - -	     if (bps >= 512000) number = 8; -	else if (bps >= 256000) number = 7; -	else if (bps >= 64000)  number = 6; -	else if (bps >= 38400)  number = 5; -	else if (bps >= 19200)  number = 4; -	else if (bps >= 9600)   number = 3; -	else if (bps >= 4800)   number = 2; -	else if (bps >= 2400)   number = 1; - -	return number; -} - -/* log base 2 */ -static u8 cycx_log2(u32 n) -{ -	u8 log = 0; - -	if (!n) -		return 0; - -	while (n > 1) { -		n >>= 1; -		++log; -	} - -	return log; -} - -/* Convert decimal string to unsigned integer. - * If len != 0 then only 'len' characters of the string are converted. */ -static unsigned dec_to_uint(u8 *str, int len) -{ -	unsigned val = 0; - -	if (!len) -		len = strlen(str); - -	for (; len && isdigit(*str); ++str, --len) -		val = (val * 10) + (*str - (unsigned) '0'); - -	return val; -} - -static void reset_timer(struct net_device *dev) -{ -	struct cycx_x25_channel *chan = netdev_priv(dev); - -	if (chan->svc) -		mod_timer(&chan->timer, jiffies+chan->idle_tmout*HZ); -} -#ifdef CYCLOMX_X25_DEBUG -static void cycx_x25_dump_config(struct cycx_x25_config *conf) -{ -	printk(KERN_INFO "X.25 configuration\n"); -	printk(KERN_INFO "-----------------\n"); -	printk(KERN_INFO "link number=%d\n", conf->link); -	printk(KERN_INFO "line speed=%d\n", conf->speed); -	printk(KERN_INFO "clock=%sternal\n", conf->clock == 8 ? "Ex" : "In"); -	printk(KERN_INFO "# level 2 retransm.=%d\n", conf->n2); -	printk(KERN_INFO "level 2 window=%d\n", conf->n2win); -	printk(KERN_INFO "level 3 window=%d\n", conf->n3win); -	printk(KERN_INFO "# logical channels=%d\n", conf->nvc); -	printk(KERN_INFO "level 3 pkt len=%d\n", conf->pktlen); -	printk(KERN_INFO "my address=%d\n", conf->locaddr); -	printk(KERN_INFO "remote address=%d\n", conf->remaddr); -	printk(KERN_INFO "t1=%d seconds\n", conf->t1); -	printk(KERN_INFO "t2=%d seconds\n", conf->t2); -	printk(KERN_INFO "t21=%d seconds\n", conf->t21); -	printk(KERN_INFO "# PVCs=%d\n", conf->npvc); -	printk(KERN_INFO "t23=%d seconds\n", conf->t23); -	printk(KERN_INFO "flags=0x%x\n", conf->flags); -} - -static void cycx_x25_dump_stats(struct cycx_x25_stats *stats) -{ -	printk(KERN_INFO "X.25 statistics\n"); -	printk(KERN_INFO "--------------\n"); -	printk(KERN_INFO "rx_crc_errors=%d\n", stats->rx_crc_errors); -	printk(KERN_INFO "rx_over_errors=%d\n", stats->rx_over_errors); -	printk(KERN_INFO "n2_tx_frames=%d\n", stats->n2_tx_frames); -	printk(KERN_INFO "n2_rx_frames=%d\n", stats->n2_rx_frames); -	printk(KERN_INFO "tx_timeouts=%d\n", stats->tx_timeouts); -	printk(KERN_INFO "rx_timeouts=%d\n", stats->rx_timeouts); -	printk(KERN_INFO "n3_tx_packets=%d\n", stats->n3_tx_packets); -	printk(KERN_INFO "n3_rx_packets=%d\n", stats->n3_rx_packets); -	printk(KERN_INFO "tx_aborts=%d\n", stats->tx_aborts); -	printk(KERN_INFO "rx_aborts=%d\n", stats->rx_aborts); -} - -static void cycx_x25_dump_devs(struct wan_device *wandev) -{ -	struct net_device *dev = wandev->dev; - -	printk(KERN_INFO "X.25 dev states\n"); -	printk(KERN_INFO "name: addr:           txoff:  protocol:\n"); -	printk(KERN_INFO "---------------------------------------\n"); - -	while(dev) { -		struct cycx_x25_channel *chan = netdev_priv(dev); - -		printk(KERN_INFO "%-5.5s %-15.15s   %d     ETH_P_%s\n", -				 chan->name, chan->addr, netif_queue_stopped(dev), -				 chan->protocol == ETH_P_IP ? "IP" : "X25"); -		dev = chan->slave; -	} -} - -#endif /* CYCLOMX_X25_DEBUG */ -/* End */ diff --git a/drivers/net/wan/dlci.c b/drivers/net/wan/dlci.c index 1481a446fef..19f7cb2cdef 100644 --- a/drivers/net/wan/dlci.c +++ b/drivers/net/wan/dlci.c @@ -28,6 +28,8 @@   *		2 of the License, or (at your option) any later version.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/types.h> @@ -48,7 +50,6 @@  #include <net/sock.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/dma.h>  #include <asm/uaccess.h> @@ -70,12 +71,9 @@ static int dlci_header(struct sk_buff *skb, struct net_device *dev,  		       const void *saddr, unsigned len)  {  	struct frhdr		hdr; -	struct dlci_local	*dlp;  	unsigned int		hlen;  	char			*dest; -	dlp = netdev_priv(dev); -  	hdr.control = FRAD_I_UI;  	switch (type)  	{ @@ -106,14 +104,11 @@ static int dlci_header(struct sk_buff *skb, struct net_device *dev,  static void dlci_receive(struct sk_buff *skb, struct net_device *dev)  { -	struct dlci_local *dlp;  	struct frhdr		*hdr;  	int					process, header; -	dlp = netdev_priv(dev);  	if (!pskb_may_pull(skb, sizeof(*hdr))) { -		printk(KERN_NOTICE "%s: invalid data no header\n", -		       dev->name); +		netdev_notice(dev, "invalid data no header\n");  		dev->stats.rx_errors++;  		kfree_skb(skb);  		return; @@ -126,7 +121,8 @@ static void dlci_receive(struct sk_buff *skb, struct net_device *dev)  	if (hdr->control != FRAD_I_UI)  	{ -		printk(KERN_NOTICE "%s: Invalid header flag 0x%02X.\n", dev->name, hdr->control); +		netdev_notice(dev, "Invalid header flag 0x%02X\n", +			      hdr->control);  		dev->stats.rx_errors++;  	}  	else @@ -135,14 +131,18 @@ static void dlci_receive(struct sk_buff *skb, struct net_device *dev)  			case FRAD_P_PADDING:  				if (hdr->NLPID != FRAD_P_SNAP)  				{ -					printk(KERN_NOTICE "%s: Unsupported NLPID 0x%02X.\n", dev->name, hdr->NLPID); +					netdev_notice(dev, "Unsupported NLPID 0x%02X\n", +						      hdr->NLPID);  					dev->stats.rx_errors++;  					break;  				}  				if (hdr->OUI[0] + hdr->OUI[1] + hdr->OUI[2] != 0)  				{ -					printk(KERN_NOTICE "%s: Unsupported organizationally unique identifier 0x%02X-%02X-%02X.\n", dev->name, hdr->OUI[0], hdr->OUI[1], hdr->OUI[2]); +					netdev_notice(dev, "Unsupported organizationally unique identifier 0x%02X-%02X-%02X\n", +						      hdr->OUI[0], +						      hdr->OUI[1], +						      hdr->OUI[2]);  					dev->stats.rx_errors++;  					break;  				} @@ -163,12 +163,14 @@ static void dlci_receive(struct sk_buff *skb, struct net_device *dev)  			case FRAD_P_SNAP:  			case FRAD_P_Q933:  			case FRAD_P_CLNP: -				printk(KERN_NOTICE "%s: Unsupported NLPID 0x%02X.\n", dev->name, hdr->pad); +				netdev_notice(dev, "Unsupported NLPID 0x%02X\n", +					      hdr->pad);  				dev->stats.rx_errors++;  				break;  			default: -				printk(KERN_NOTICE "%s: Invalid pad byte 0x%02X.\n", dev->name, hdr->pad); +				netdev_notice(dev, "Invalid pad byte 0x%02X\n", +					      hdr->pad);  				dev->stats.rx_errors++;  				break;				  		} @@ -341,10 +343,6 @@ static int dlci_add(struct dlci_add *dlci)  		}  	} -	err = dev_alloc_name(master, master->name); -	if (err < 0) -		goto err2; -  	*(short *)(master->dev_addr) = dlci->dlci;  	dlp = netdev_priv(master); @@ -381,21 +379,37 @@ static int dlci_del(struct dlci_add *dlci)  	struct frad_local	*flp;  	struct net_device	*master, *slave;  	int			err; +	bool			found = false; + +	rtnl_lock();  	/* validate slave device */  	master = __dev_get_by_name(&init_net, dlci->devname); -	if (!master) -		return -ENODEV; +	if (!master) { +		err = -ENODEV; +		goto out; +	} + +	list_for_each_entry(dlp, &dlci_devs, list) { +		if (dlp->master == master) { +			found = true; +			break; +		} +	} +	if (!found) { +		err = -ENODEV; +		goto out; +	}  	if (netif_running(master)) { -		return -EBUSY; +		err = -EBUSY; +		goto out;  	}  	dlp = netdev_priv(master);  	slave = dlp->slave;  	flp = netdev_priv(slave); -	rtnl_lock();  	err = (*flp->deassoc)(slave, master);  	if (!err) {  		list_del(&dlp->list); @@ -404,8 +418,8 @@ static int dlci_del(struct dlci_add *dlci)  		dev_put(slave);  	} +out:  	rtnl_unlock(); -  	return err;  } @@ -474,7 +488,7 @@ static void dlci_setup(struct net_device *dev)  static int dlci_dev_event(struct notifier_block *unused,  			  unsigned long event, void *ptr)  { -	struct net_device *dev = (struct net_device *) ptr; +	struct net_device *dev = netdev_notifier_info_to_dev(ptr);  	if (dev_net(dev) != &init_net)  		return NOTIFY_DONE; diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c index d45b08d1dbc..288610df205 100644 --- a/drivers/net/wan/dscc4.c +++ b/drivers/net/wan/dscc4.c @@ -56,7 +56,7 @@   * IV. Notes   * The current error (XDU, RFO) recovery code is untested.   * So far, RDO takes his RX channel down and the right sequence to enable it - * again is still a mistery. If RDO happens, plan a reboot. More details + * again is still a mystery. If RDO happens, plan a reboot. More details   * in the code (NB: as this happens, TX still works).   * Don't mess the cables during operation, especially on DTE ports. I don't   * suggest it for DCE either but at least one can get some messages instead @@ -80,6 +80,8 @@   * - misc crapectomy.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/sched.h>  #include <linux/types.h> @@ -91,7 +93,6 @@  #include <linux/mm.h>  #include <linux/slab.h> -#include <asm/system.h>  #include <asm/cache.h>  #include <asm/byteorder.h>  #include <asm/uaccess.h> @@ -99,6 +100,7 @@  #include <asm/irq.h>  #include <linux/init.h> +#include <linux/interrupt.h>  #include <linux/string.h>  #include <linux/if_arp.h> @@ -125,7 +127,7 @@ static u32 dscc4_pci_config_store[16];  /* Module parameters */  MODULE_AUTHOR("Maintainer: Francois Romieu <romieu@cogenit.fr>"); -MODULE_DESCRIPTION("Siemens PEB20534 PCI Controler"); +MODULE_DESCRIPTION("Siemens PEB20534 PCI Controller");  MODULE_LICENSE("GPL");  module_param(debug, int, 0);  MODULE_PARM_DESC(debug,"Enable/disable extra messages"); @@ -552,7 +554,7 @@ static int dscc4_wait_ack_cec(struct dscc4_dev_priv *dpriv,  		schedule_timeout_uninterruptible(10);  		rmb();  	} while (++i > 0); -	printk(KERN_ERR "%s: %s timeout\n", dev->name, msg); +	netdev_err(dev, "%s timeout\n", msg);  done:  	return (i >= 0) ? i : -EAGAIN;  } @@ -568,18 +570,18 @@ static int dscc4_do_action(struct net_device *dev, char *msg)  		u32 state = readl(ioaddr);  		if (state & ArAck) { -			printk(KERN_DEBUG "%s: %s ack\n", dev->name, msg); +			netdev_dbg(dev, "%s ack\n", msg);  			writel(ArAck, ioaddr);  			goto done;  		} else if (state & Arf) { -			printk(KERN_ERR "%s: %s failed\n", dev->name, msg); +			netdev_err(dev, "%s failed\n", msg);  			writel(Arf, ioaddr);  			i = -1;  			goto done;  	}  		rmb();  	} while (++i > 0); -	printk(KERN_ERR "%s: %s timeout\n", dev->name, msg); +	netdev_err(dev, "%s timeout\n", msg);  done:  	return i;  } @@ -635,7 +637,7 @@ static void dscc4_tx_reset(struct dscc4_dev_priv *dpriv, struct net_device *dev)  	writel(MTFi|Rdt, dpriv->base_addr + dpriv->dev_id*0x0c + CH0CFG);  	if (dscc4_do_action(dev, "Rdt") < 0) -		printk(KERN_ERR "%s: Tx reset failed\n", dev->name); +		netdev_err(dev, "Tx reset failed\n");  }  #endif @@ -697,16 +699,13 @@ static void dscc4_free1(struct pci_dev *pdev)  	for (i = 0; i < dev_per_card; i++)  		unregister_hdlc_device(dscc4_to_dev(root + i)); -	pci_set_drvdata(pdev, NULL); -  	for (i = 0; i < dev_per_card; i++)  		free_netdev(root[i].dev);  	kfree(root);  	kfree(ppriv);  } -static int __devinit dscc4_init_one(struct pci_dev *pdev, -				  const struct pci_device_id *ent) +static int dscc4_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	struct dscc4_pci_priv *priv;  	struct dscc4_dev_priv *dpriv; @@ -721,22 +720,20 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,  	rc = pci_request_region(pdev, 0, "registers");  	if (rc < 0) { -	        printk(KERN_ERR "%s: can't reserve MMIO region (regs)\n", -			DRV_NAME); +		pr_err("can't reserve MMIO region (regs)\n");  	        goto err_disable_0;  	}  	rc = pci_request_region(pdev, 1, "LBI interface");  	if (rc < 0) { -	        printk(KERN_ERR "%s: can't reserve MMIO region (lbi)\n", -			DRV_NAME); +		pr_err("can't reserve MMIO region (lbi)\n");  	        goto err_free_mmio_region_1;  	}  	ioaddr = pci_ioremap_bar(pdev, 0);  	if (!ioaddr) { -		printk(KERN_ERR "%s: cannot remap MMIO region %llx @ %llx\n", -			DRV_NAME, (unsigned long long)pci_resource_len(pdev, 0), -			(unsigned long long)pci_resource_start(pdev, 0)); +		pr_err("cannot remap MMIO region %llx @ %llx\n", +		       (unsigned long long)pci_resource_len(pdev, 0), +		       (unsigned long long)pci_resource_start(pdev, 0));  		rc = -EIO;  		goto err_free_mmio_regions_2;  	} @@ -756,7 +753,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,  	rc = request_irq(pdev->irq, dscc4_irq, IRQF_SHARED, DRV_NAME, priv->root);  	if (rc < 0) { -		printk(KERN_WARNING "%s: IRQ %d busy\n", DRV_NAME, pdev->irq); +		pr_warn("IRQ %d busy\n", pdev->irq);  		goto err_release_4;  	} @@ -774,14 +771,15 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,  	}  	/* Global interrupt queue */  	writel((u32)(((IRQ_RING_SIZE >> 5) - 1) << 20), ioaddr + IQLENR1); + +	rc = -ENOMEM; +  	priv->iqcfg = (__le32 *) pci_alloc_consistent(pdev,  		IRQ_RING_SIZE*sizeof(__le32), &priv->iqcfg_dma);  	if (!priv->iqcfg)  		goto err_free_irq_5;  	writel(priv->iqcfg_dma, ioaddr + IQCFG); -	rc = -ENOMEM; -  	/*  	 * SCC 0-3 private rx/tx irq structures  	 * IQRX/TXi needs to be set soon. Learned it the hard way... @@ -902,10 +900,8 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)  	int i, ret = -ENOMEM;  	root = kcalloc(dev_per_card, sizeof(*root), GFP_KERNEL); -	if (!root) { -		printk(KERN_ERR "%s: can't allocate data\n", DRV_NAME); +	if (!root)  		goto err_out; -	}  	for (i = 0; i < dev_per_card; i++) {  		root[i].dev = alloc_hdlcdev(root + i); @@ -914,10 +910,8 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)  	}  	ppriv = kzalloc(sizeof(*ppriv), GFP_KERNEL); -	if (!ppriv) { -		printk(KERN_ERR "%s: can't allocate private data\n", DRV_NAME); +	if (!ppriv)  		goto err_free_dev; -	}  	ppriv->root = root;  	spin_lock_init(&ppriv->lock); @@ -951,7 +945,7 @@ static int dscc4_found1(struct pci_dev *pdev, void __iomem *ioaddr)  		ret = register_hdlc_device(d);  		if (ret < 0) { -			printk(KERN_ERR "%s: unable to register\n", DRV_NAME); +			pr_err("unable to register\n");  			dscc4_release_ring(dpriv);  			goto err_unregister;  	        } @@ -1004,7 +998,7 @@ static int dscc4_loopback_check(struct dscc4_dev_priv *dpriv)  	if (settings->loopback && (settings->clock_type != CLOCK_INT)) {  		struct net_device *dev = dscc4_to_dev(dpriv); -		printk(KERN_INFO "%s: loopback requires clock\n", dev->name); +		netdev_info(dev, "loopback requires clock\n");  		return -1;  	}  	return 0; @@ -1065,7 +1059,7 @@ static int dscc4_open(struct net_device *dev)  	/*  	 * Due to various bugs, there is no way to reliably reset a -	 * specific port (manufacturer's dependant special PCI #RST wiring +	 * specific port (manufacturer's dependent special PCI #RST wiring  	 * apart: it affects all ports). Thus the device goes in the best  	 * silent mode possible at dscc4_close() time and simply claims to  	 * be up if it's opened again. It still isn't possible to change @@ -1077,7 +1071,7 @@ static int dscc4_open(struct net_device *dev)  		scc_patchl(0, PowerUp, dpriv, dev, CCR0);  		scc_patchl(0, 0x00050000, dpriv, dev, CCR2);  		scc_writel(EventsMask, dpriv, dev, IMR); -		printk(KERN_INFO "%s: up again.\n", dev->name); +		netdev_info(dev, "up again\n");  		goto done;  	} @@ -1094,11 +1088,11 @@ static int dscc4_open(struct net_device *dev)  	 * situations.  	 */  	if (scc_readl_star(dpriv, dev) & SccBusy) { -		printk(KERN_ERR "%s busy. Try later\n", dev->name); +		netdev_err(dev, "busy - try later\n");  		ret = -EAGAIN;  		goto err_out;  	} else -		printk(KERN_INFO "%s: available. Good\n", dev->name); +		netdev_info(dev, "available - good\n");  	scc_writel(EventsMask, dpriv, dev, IMR); @@ -1116,7 +1110,7 @@ static int dscc4_open(struct net_device *dev)  	 * reset is needed. Suggestions anyone ?  	 */  	if ((ret = dscc4_xpr_ack(dpriv)) < 0) { -		printk(KERN_ERR "%s: %s timeout\n", DRV_NAME, "XPR"); +		pr_err("XPR timeout\n");  		goto err_disable_scc_events;  	} @@ -1230,9 +1224,9 @@ static inline int dscc4_check_clock_ability(int port)   *   scaling. Of course some rounding may take place.   * - no high speed mode (40Mb/s). May be trivial to do but I don't have an   *   appropriate external clocking device for testing. - * - no time-slot/clock mode 5: shameless lazyness. + * - no time-slot/clock mode 5: shameless laziness.   * - * The clock signals wiring can be (is ?) manufacturer dependant. Good luck. + * The clock signals wiring can be (is ?) manufacturer dependent. Good luck.   *   * BIG FAT WARNING: if the device isn't provided enough clocking signal, it   * won't pass the init sequence. For example, straight back-to-back DTE without @@ -1341,8 +1335,7 @@ static int dscc4_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  			return -EPERM;  		if (dpriv->flags & FakeReset) { -			printk(KERN_INFO "%s: please reset the device" -			       " before this command\n", dev->name); +			netdev_info(dev, "please reset the device before this command\n");  			return -EPERM;  		}  		if (copy_from_user(&dpriv->settings, line, size)) @@ -1358,7 +1351,7 @@ static int dscc4_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  	return ret;  } -static int dscc4_match(struct thingie *p, int value) +static int dscc4_match(const struct thingie *p, int value)  {  	int i; @@ -1403,7 +1396,7 @@ done:  static int dscc4_encoding_setting(struct dscc4_dev_priv *dpriv,  				  struct net_device *dev)  { -	struct thingie encoding[] = { +	static const struct thingie encoding[] = {  		{ ENCODING_NRZ,		0x00000000 },  		{ ENCODING_NRZI,	0x00200000 },  		{ ENCODING_FM_MARK,	0x00400000 }, @@ -1442,7 +1435,7 @@ static int dscc4_loopback_setting(struct dscc4_dev_priv *dpriv,  static int dscc4_crc_setting(struct dscc4_dev_priv *dpriv,  			     struct net_device *dev)  { -	struct thingie crc[] = { +	static const struct thingie crc[] = {  		{ PARITY_CRC16_PR0_CCITT,	0x00000010 },  		{ PARITY_CRC16_PR1_CCITT,	0x00000000 },  		{ PARITY_CRC32_PR0_CCITT,	0x00000011 }, @@ -1505,8 +1498,7 @@ static irqreturn_t dscc4_irq(int irq, void *token)  	writel(state, ioaddr + GSTAR);  	if (state & Arf) { -		printk(KERN_ERR "%s: failure (Arf). Harass the maintener\n", -		       dev->name); +		netdev_err(dev, "failure (Arf). Harass the maintainer\n");  		goto out;  	}  	state &= ~ArAck; @@ -1514,7 +1506,7 @@ static irqreturn_t dscc4_irq(int irq, void *token)  		if (debug > 0)  			printk(KERN_DEBUG "%s: CfgIV\n", DRV_NAME);  		if (priv->iqcfg[priv->cfg_cur++%IRQ_RING_SIZE] & cpu_to_le32(Arf)) -			printk(KERN_ERR "%s: %s failed\n", dev->name, "CFG"); +			netdev_err(dev, "CFG failed\n");  		if (!(state &= ~Cfg))  			goto out;  	} @@ -1595,8 +1587,8 @@ try:  				++dpriv->tx_dirty;  			} else {  				if (debug > 1) -					printk(KERN_ERR "%s Tx: NULL skb %d\n", -						dev->name, cur); +					netdev_err(dev, "Tx: NULL skb %d\n", +						   cur);  			}  			/*  			 * If the driver ends sending crap on the wire, it @@ -1615,7 +1607,7 @@ try:  		 * Transmit Data Underrun  		 */  		if (state & Xdu) { -			printk(KERN_ERR "%s: XDU. Ask maintainer\n", DRV_NAME); +			netdev_err(dev, "Tx Data Underrun. Ask maintainer\n");  			dpriv->flags = NeedIDT;  			/* Tx reset */  			writel(MTFi | Rdt, @@ -1624,13 +1616,13 @@ try:  			return;  		}  		if (state & Cts) { -			printk(KERN_INFO "%s: CTS transition\n", dev->name); +			netdev_info(dev, "CTS transition\n");  			if (!(state &= ~Cts)) /* DEBUG */  				goto try;  		}  		if (state & Xmr) {  			/* Frame needs to be sent again - FIXME */ -			printk(KERN_ERR "%s: Xmr. Ask maintainer\n", DRV_NAME); +			netdev_err(dev, "Tx ReTx. Ask maintainer\n");  			if (!(state &= ~Xmr)) /* DEBUG */  				goto try;  		} @@ -1648,7 +1640,7 @@ try:  					break;  			}  			if (!i) -				printk(KERN_INFO "%s busy in irq\n", dev->name); +				netdev_info(dev, "busy in irq\n");  			scc_addr = dpriv->base_addr + 0x0c*dpriv->dev_id;  			/* Keep this order: IDT before IDR */ @@ -1685,7 +1677,7 @@ try:  		}  		if (state & Cd) {  			if (debug > 0) -				printk(KERN_INFO "%s: CD transition\n", dev->name); +				netdev_info(dev, "CD transition\n");  			if (!(state &= ~Cd)) /* DEBUG */  				goto try;  		} @@ -1694,11 +1686,11 @@ try:  #ifdef DSCC4_POLLING  			while (!dscc4_tx_poll(dpriv, dev));  #endif -			printk(KERN_INFO "%s: Tx Hi\n", dev->name); +			netdev_info(dev, "Tx Hi\n");  			state &= ~Hi;  		}  		if (state & Err) { -			printk(KERN_INFO "%s: Tx ERR\n", dev->name); +			netdev_info(dev, "Tx ERR\n");  			dev->stats.tx_errors++;  			state &= ~Err;  		} @@ -1768,7 +1760,7 @@ try:  			goto try;  		}  		if (state & Hi ) { /* HI bit */ -			printk(KERN_INFO "%s: Rx Hi\n", dev->name); +			netdev_info(dev, "Rx Hi\n");  			state &= ~Hi;  			goto try;  		} @@ -1799,7 +1791,7 @@ try:  				goto try;  		}  		if (state & Cts) { -			printk(KERN_INFO "%s: CTS transition\n", dev->name); +			netdev_info(dev, "CTS transition\n");  			if (!(state &= ~Cts)) /* DEBUG */  				goto try;  		} @@ -1858,14 +1850,12 @@ try:  			       sizeof(struct RxFD), scc_addr + CH0BRDA);  			writel(MTFi|Rdr|Idr, scc_addr + CH0CFG);  			if (dscc4_do_action(dev, "RDR") < 0) { -				printk(KERN_ERR "%s: RDO recovery failed(%s)\n", -				       dev->name, "RDR"); +				netdev_err(dev, "RDO recovery failed(RDR)\n");  				goto rdo_end;  			}  			writel(MTFi|Idr, scc_addr + CH0CFG);  			if (dscc4_do_action(dev, "IDR") < 0) { -				printk(KERN_ERR "%s: RDO recovery failed(%s)\n", -				       dev->name, "IDR"); +				netdev_err(dev, "RDO recovery failed(IDR)\n");  				goto rdo_end;  			}  		rdo_end: @@ -1874,7 +1864,7 @@ try:  			goto try;  		}  		if (state & Cd) { -			printk(KERN_INFO "%s: CD transition\n", dev->name); +			netdev_info(dev, "CD transition\n");  			if (!(state &= ~Cd)) /* DEBUG */  				goto try;  		} @@ -1975,7 +1965,7 @@ err_out:  	return -ENOMEM;  } -static void __devexit dscc4_remove_one(struct pci_dev *pdev) +static void dscc4_remove_one(struct pci_dev *pdev)  {  	struct dscc4_pci_priv *ppriv;  	struct dscc4_dev_priv *root; @@ -2060,18 +2050,7 @@ static struct pci_driver dscc4_driver = {  	.name		= DRV_NAME,  	.id_table	= dscc4_pci_tbl,  	.probe		= dscc4_init_one, -	.remove		= __devexit_p(dscc4_remove_one), +	.remove		= dscc4_remove_one,  }; -static int __init dscc4_init_module(void) -{ -	return pci_register_driver(&dscc4_driver); -} - -static void __exit dscc4_cleanup_module(void) -{ -	pci_unregister_driver(&dscc4_driver); -} - -module_init(dscc4_init_module); -module_exit(dscc4_cleanup_module); +module_pci_driver(dscc4_driver); diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index e050bd65e03..1f041271f7f 100644 --- a/drivers/net/wan/farsync.c +++ b/drivers/net/wan/farsync.c @@ -25,6 +25,8 @@  #include <linux/slab.h>  #include <linux/ioport.h>  #include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/delay.h>  #include <linux/if.h>  #include <linux/hdlc.h>  #include <asm/io.h> @@ -596,7 +598,7 @@ fst_q_work_item(u64 * queue, int card_index)  	 * bottom half for the card.  Note the limitation of 64 cards.  	 * That ought to be enough  	 */ -	mask = 1 << card_index; +	mask = (u64)1 << card_index;  	*queue |= mask;  	spin_unlock_irqrestore(&fst_work_q_lock, flags);  } @@ -677,7 +679,6 @@ static inline void  fst_cpureset(struct fst_card_info *card)  {  	unsigned char interrupt_line_register; -	unsigned long j = jiffies + 1;  	unsigned int regval;  	if (card->family == FST_FAMILY_TXU) { @@ -695,16 +696,12 @@ fst_cpureset(struct fst_card_info *card)  		/*  		 * We are delaying here to allow the 9054 to reset itself  		 */ -		j = jiffies + 1; -		while (jiffies < j) -			/* Do nothing */ ; +		usleep_range(10, 20);  		outw(0x240f, card->pci_conf + CNTRL_9054 + 2);  		/*  		 * We are delaying here to allow the 9054 to reload its eeprom  		 */ -		j = jiffies + 1; -		while (jiffies < j) -			/* Do nothing */ ; +		usleep_range(10, 20);  		outw(0x040f, card->pci_conf + CNTRL_9054 + 2);  		if (pci_write_config_byte @@ -885,20 +882,18 @@ fst_rx_dma_complete(struct fst_card_info *card, struct fst_port_info *port,   *      Receive a frame through the DMA   */  static inline void -fst_rx_dma(struct fst_card_info *card, dma_addr_t skb, -	   dma_addr_t mem, int len) +fst_rx_dma(struct fst_card_info *card, dma_addr_t dma, u32 mem, int len)  {  	/*  	 * This routine will setup the DMA and start it  	 */ -	dbg(DBG_RX, "In fst_rx_dma %lx %lx %d\n", -	    (unsigned long) skb, (unsigned long) mem, len); +	dbg(DBG_RX, "In fst_rx_dma %x %x %d\n", (u32)dma, mem, len);  	if (card->dmarx_in_progress) {  		dbg(DBG_ASS, "In fst_rx_dma while dma in progress\n");  	} -	outl(skb, card->pci_conf + DMAPADR0);	/* Copy to here */ +	outl(dma, card->pci_conf + DMAPADR0);	/* Copy to here */  	outl(mem, card->pci_conf + DMALADR0);	/* from here */  	outl(len, card->pci_conf + DMASIZ0);	/* for this length */  	outl(0x00000000c, card->pci_conf + DMADPR0);	/* In this direction */ @@ -914,20 +909,19 @@ fst_rx_dma(struct fst_card_info *card, dma_addr_t skb,   *      Send a frame through the DMA   */  static inline void -fst_tx_dma(struct fst_card_info *card, unsigned char *skb, -	   unsigned char *mem, int len) +fst_tx_dma(struct fst_card_info *card, dma_addr_t dma, u32 mem, int len)  {  	/*  	 * This routine will setup the DMA and start it.  	 */ -	dbg(DBG_TX, "In fst_tx_dma %p %p %d\n", skb, mem, len); +	dbg(DBG_TX, "In fst_tx_dma %x %x %d\n", (u32)dma, mem, len);  	if (card->dmatx_in_progress) {  		dbg(DBG_ASS, "In fst_tx_dma while dma in progress\n");  	} -	outl((unsigned long) skb, card->pci_conf + DMAPADR1);	/* Copy from here */ -	outl((unsigned long) mem, card->pci_conf + DMALADR1);	/* to here */ +	outl(dma, card->pci_conf + DMAPADR1);	/* Copy from here */ +	outl(mem, card->pci_conf + DMALADR1);	/* to here */  	outl(len, card->pci_conf + DMASIZ1);	/* for this length */  	outl(0x000000004, card->pci_conf + DMADPR1);	/* In this direction */ @@ -1404,9 +1398,7 @@ do_bottom_half_tx(struct fst_card_info *card)  					card->dma_len_tx = skb->len;  					card->dma_txpos = port->txpos;  					fst_tx_dma(card, -						   (char *) card-> -						   tx_dma_handle_card, -						   (char *) +						   card->tx_dma_handle_card,  						   BUF_OFFSET(txBuffer[pi]  							      [port->txpos][0]),  						   skb->len); @@ -1664,10 +1656,9 @@ check_started_ok(struct fst_card_info *card)  	 * existing firmware etc so we just report it for the moment.  	 */  	if (FST_RDL(card, numberOfPorts) != card->nports) { -		pr_warning("Port count mismatch on card %d. " -			   "Firmware thinks %d we say %d\n", -			   card->card_no, -			   FST_RDL(card, numberOfPorts), card->nports); +		pr_warn("Port count mismatch on card %d.  Firmware thinks %d we say %d\n", +			card->card_no, +			FST_RDL(card, numberOfPorts), card->nports);  	}  } @@ -1972,6 +1963,7 @@ fst_get_iface(struct fst_card_info *card, struct fst_port_info *port,  	}  	i = port->index; +	memset(&sync, 0, sizeof(sync));  	sync.clock_rate = FST_RDL(card, portConfig[i].lineSpeed);  	/* Lucky card and linux use same encoding here */  	sync.clock_type = FST_RDB(card, portConfig[i].internalClock) == @@ -2203,8 +2195,10 @@ fst_open(struct net_device *dev)  	if (port->mode != FST_RAW) {  		err = hdlc_open(dev); -		if (err) +		if (err) { +			module_put(THIS_MODULE);  			return err; +		}  	}  	fst_openport(port); @@ -2359,7 +2353,7 @@ fst_start_xmit(struct sk_buff *skb, struct net_device *dev)   *      via a printk and leave the corresponding interface and all that follow   *      disabled.   */ -static char *type_strings[] __devinitdata = { +static char *type_strings[] = {  	"no hardware",		/* Should never be seen */  	"FarSync T2P",  	"FarSync T4P", @@ -2369,7 +2363,7 @@ static char *type_strings[] __devinitdata = {  	"FarSync TE1"  }; -static void __devinit +static int  fst_init_card(struct fst_card_info *card)  {  	int i; @@ -2380,24 +2374,21 @@ fst_init_card(struct fst_card_info *card)  	 * we'll have to revise it in some way then.  	 */  	for (i = 0; i < card->nports; i++) { -                err = register_hdlc_device(card->ports[i].dev); -                if (err < 0) { -			int j; +		err = register_hdlc_device(card->ports[i].dev); +		if (err < 0) {  			pr_err("Cannot register HDLC device for port %d (errno %d)\n", -			       i, -err); -			for (j = i; j < card->nports; j++) { -				free_netdev(card->ports[j].dev); -				card->ports[j].dev = NULL; -			} -                        card->nports = i; -                        break; -                } +				i, -err); +			while (i--) +				unregister_hdlc_device(card->ports[i].dev); +			return err; +		}  	}  	pr_info("%s-%s: %s IRQ%d, %d ports\n",  		port_to_dev(&card->ports[0])->name,  		port_to_dev(&card->ports[card->nports - 1])->name,  		type_strings[card->type], card->irq, card->nports); +	return 0;  }  static const struct net_device_ops fst_ops = { @@ -2413,7 +2404,7 @@ static const struct net_device_ops fst_ops = {   *      Initialise card when detected.   *      Returns 0 to indicate success, or errno otherwise.   */ -static int __devinit +static int  fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	static int no_of_cards_added = 0; @@ -2446,24 +2437,19 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	}  	/* Allocate driver private data */ -	card = kzalloc(sizeof (struct fst_card_info), GFP_KERNEL); -	if (card == NULL) { -		pr_err("FarSync card found but insufficient memory for driver storage\n"); +	card = kzalloc(sizeof(struct fst_card_info), GFP_KERNEL); +	if (card == NULL)  		return -ENOMEM; -	}  	/* Try to enable the device */  	if ((err = pci_enable_device(pdev)) != 0) {  		pr_err("Failed to enable card. Err %d\n", -err); -		kfree(card); -		return err; +		goto enable_fail;  	}  	if ((err = pci_request_regions(pdev, "FarSync")) !=0) {  		pr_err("Failed to allocate regions. Err %d\n", -err); -		pci_disable_device(pdev); -		kfree(card); -	        return err; +		goto regions_fail;  	}  	/* Get virtual addresses of memory regions */ @@ -2472,29 +2458,21 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	card->phys_ctlmem = pci_resource_start(pdev, 3);  	if ((card->mem = ioremap(card->phys_mem, FST_MEMSIZE)) == NULL) {  		pr_err("Physical memory remap failed\n"); -		pci_release_regions(pdev); -		pci_disable_device(pdev); -		kfree(card); -		return -ENODEV; +		err = -ENODEV; +		goto ioremap_physmem_fail;  	}  	if ((card->ctlmem = ioremap(card->phys_ctlmem, 0x10)) == NULL) {  		pr_err("Control memory remap failed\n"); -		pci_release_regions(pdev); -		pci_disable_device(pdev); -		kfree(card); -		return -ENODEV; +		err = -ENODEV; +		goto ioremap_ctlmem_fail;  	}  	dbg(DBG_PCI, "kernel mem %p, ctlmem %p\n", card->mem, card->ctlmem);  	/* Register the interrupt handler */  	if (request_irq(pdev->irq, fst_intr, IRQF_SHARED, FST_DEV_NAME, card)) {  		pr_err("Unable to register interrupt %d\n", card->irq); -		pci_release_regions(pdev); -		pci_disable_device(pdev); -		iounmap(card->ctlmem); -		iounmap(card->mem); -		kfree(card); -		return -ENODEV; +		err = -ENODEV; +		goto irq_fail;  	}  	/* Record info we need */ @@ -2520,13 +2498,8 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)  			while (i--)  				free_netdev(card->ports[i].dev);  			pr_err("FarSync: out of memory\n"); -                        free_irq(card->irq, card); -                        pci_release_regions(pdev); -                        pci_disable_device(pdev); -                        iounmap(card->ctlmem); -                        iounmap(card->mem); -                        kfree(card); -                        return -ENODEV; +			err = -ENOMEM; +			goto hdlcdev_fail;  		}  		card->ports[i].dev    = dev;                  card->ports[i].card   = card; @@ -2572,9 +2545,16 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	pci_set_drvdata(pdev, card);  	/* Remainder of card setup */ +	if (no_of_cards_added >= FST_MAX_CARDS) { +		pr_err("FarSync: too many cards\n"); +		err = -ENOMEM; +		goto card_array_fail; +	}  	fst_card_array[no_of_cards_added] = card;  	card->card_no = no_of_cards_added++;	/* Record instance and bump it */ -	fst_init_card(card); +	err = fst_init_card(card); +	if (err) +		goto init_card_fail;  	if (card->family == FST_FAMILY_TXU) {  		/*  		 * Allocate a dma buffer for transmit and receives @@ -2584,35 +2564,52 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent)  					 &card->rx_dma_handle_card);  		if (card->rx_dma_handle_host == NULL) {  			pr_err("Could not allocate rx dma buffer\n"); -			fst_disable_intr(card); -			pci_release_regions(pdev); -			pci_disable_device(pdev); -			iounmap(card->ctlmem); -			iounmap(card->mem); -			kfree(card); -			return -ENOMEM; +			err = -ENOMEM; +			goto rx_dma_fail;  		}  		card->tx_dma_handle_host =  		    pci_alloc_consistent(card->device, FST_MAX_MTU,  					 &card->tx_dma_handle_card);  		if (card->tx_dma_handle_host == NULL) {  			pr_err("Could not allocate tx dma buffer\n"); -			fst_disable_intr(card); -			pci_release_regions(pdev); -			pci_disable_device(pdev); -			iounmap(card->ctlmem); -			iounmap(card->mem); -			kfree(card); -			return -ENOMEM; +			err = -ENOMEM; +			goto tx_dma_fail;  		}  	}  	return 0;		/* Success */ + +tx_dma_fail: +	pci_free_consistent(card->device, FST_MAX_MTU, +			    card->rx_dma_handle_host, +			    card->rx_dma_handle_card); +rx_dma_fail: +	fst_disable_intr(card); +	for (i = 0 ; i < card->nports ; i++) +		unregister_hdlc_device(card->ports[i].dev); +init_card_fail: +	fst_card_array[card->card_no] = NULL; +card_array_fail: +	for (i = 0 ; i < card->nports ; i++) +		free_netdev(card->ports[i].dev); +hdlcdev_fail: +	free_irq(card->irq, card); +irq_fail: +	iounmap(card->ctlmem); +ioremap_ctlmem_fail: +	iounmap(card->mem); +ioremap_physmem_fail: +	pci_release_regions(pdev); +regions_fail: +	pci_disable_device(pdev); +enable_fail: +	kfree(card); +	return err;  }  /*   *      Cleanup and close down a card   */ -static void __devexit +static void  fst_remove_one(struct pci_dev *pdev)  {  	struct fst_card_info *card; @@ -2649,7 +2646,7 @@ static struct pci_driver fst_driver = {          .name		= FST_NAME,          .id_table	= fst_pci_dev_id,          .probe		= fst_add_one, -        .remove	= __devexit_p(fst_remove_one), +        .remove	= fst_remove_one,          .suspend	= NULL,          .resume	= NULL,  }; diff --git a/drivers/net/wan/hd64570.c b/drivers/net/wan/hd64570.c index a3ea27ce04f..dc334c85d96 100644 --- a/drivers/net/wan/hd64570.c +++ b/drivers/net/wan/hd64570.c @@ -29,7 +29,6 @@  #include <linux/fcntl.h>  #include <linux/hdlc.h>  #include <linux/in.h> -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/jiffies.h> @@ -40,7 +39,6 @@  #include <linux/string.h>  #include <linux/types.h>  #include <asm/io.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include "hd64570.h" @@ -582,8 +580,8 @@ static void sca_dump_rings(struct net_device *dev)  	       sca_in(DSR_RX(phy_node(port)), card), port->rxin,  	       sca_in(DSR_RX(phy_node(port)), card) & DSR_DE ? "" : "in");  	for (cnt = 0; cnt < port_to_card(port)->rx_ring_buffers; cnt++) -		printk(" %02X", readb(&(desc_address(port, cnt, 0)->stat))); -	printk(KERN_CONT "\n"); +		pr_cont(" %02X", readb(&(desc_address(port, cnt, 0)->stat))); +	pr_cont("\n");  	printk(KERN_DEBUG "TX ring: CDA=%u EDA=%u DSR=%02X in=%u "  	       "last=%u %sactive", @@ -593,8 +591,8 @@ static void sca_dump_rings(struct net_device *dev)  	       sca_in(DSR_TX(phy_node(port)), card) & DSR_DE ? "" : "in");  	for (cnt = 0; cnt < port_to_card(port)->tx_ring_buffers; cnt++) -		printk(" %02X", readb(&(desc_address(port, cnt, 1)->stat))); -	printk("\n"); +		pr_cont(" %02X", readb(&(desc_address(port, cnt, 1)->stat))); +	pr_cont("\n");  	printk(KERN_DEBUG "MSCI: MD: %02x %02x %02x, ST: %02x %02x %02x %02x,"  	       " FST: %02x CST: %02x %02x\n", @@ -677,8 +675,7 @@ static netdev_tx_t sca_xmit(struct sk_buff *skb, struct net_device *dev)  #ifdef NEED_DETECT_RAM -static u32 __devinit sca_detect_ram(card_t *card, u8 __iomem *rambase, -				    u32 ramsize) +static u32 sca_detect_ram(card_t *card, u8 __iomem *rambase, u32 ramsize)  {  	/* Round RAM size to 32 bits, fill from end to start */  	u32 i = ramsize &= ~3; @@ -706,7 +703,7 @@ static u32 __devinit sca_detect_ram(card_t *card, u8 __iomem *rambase,  #endif /* NEED_DETECT_RAM */ -static void __devinit sca_init(card_t *card, int wait_states) +static void sca_init(card_t *card, int wait_states)  {  	sca_out(wait_states, WCRL, card); /* Wait Control */  	sca_out(wait_states, WCRM, card); diff --git a/drivers/net/wan/hd64570.h b/drivers/net/wan/hd64570.h index e4f539ad071..10963e8f4b3 100644 --- a/drivers/net/wan/hd64570.h +++ b/drivers/net/wan/hd64570.h @@ -159,7 +159,7 @@ typedef struct {  /* Packet Descriptor Status bits */  #define ST_TX_EOM     0x80	/* End of frame */ -#define ST_TX_EOT     0x01	/* End of transmition */ +#define ST_TX_EOT     0x01	/* End of transmission */  #define ST_RX_EOM     0x80	/* End of frame */  #define ST_RX_SHORT   0x40	/* Short frame */ @@ -211,7 +211,7 @@ typedef struct {  #define CTL_NORTS     0x01  #define CTL_IDLE      0x10	/* Transmit an idle pattern */ -#define CTL_UDRNC     0x20	/* Idle after CRC or FCS+flag transmition */ +#define CTL_UDRNC     0x20	/* Idle after CRC or FCS+flag transmission */  #define ST0_TXRDY     0x02	/* TX ready */  #define ST0_RXRDY     0x01	/* RX ready */ diff --git a/drivers/net/wan/hd64572.c b/drivers/net/wan/hd64572.c index ea476cbd38b..e92ecf1d331 100644 --- a/drivers/net/wan/hd64572.c +++ b/drivers/net/wan/hd64572.c @@ -29,7 +29,6 @@  #include <linux/fcntl.h>  #include <linux/hdlc.h>  #include <linux/in.h> -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/jiffies.h> @@ -40,7 +39,6 @@  #include <linux/string.h>  #include <linux/types.h>  #include <asm/io.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include "hd64572.h" @@ -293,6 +291,7 @@ static inline void sca_tx_done(port_t *port)  	struct net_device *dev = port->netdev;  	card_t* card = port->card;  	u8 stat; +	unsigned count = 0;  	spin_lock(&port->lock); @@ -316,10 +315,12 @@ static inline void sca_tx_done(port_t *port)  			dev->stats.tx_bytes += readw(&desc->len);  		}  		writeb(0, &desc->stat);	/* Free descriptor */ +		count++;  		port->txlast = (port->txlast + 1) % card->tx_ring_buffers;  	} -	netif_wake_queue(dev); +	if (count) +		netif_wake_queue(dev);  	spin_unlock(&port->lock);  } @@ -527,8 +528,8 @@ static void sca_dump_rings(struct net_device *dev)  	       sca_in(DSR_RX(port->chan), card), port->rxin,  	       sca_in(DSR_RX(port->chan), card) & DSR_DE ? "" : "in");  	for (cnt = 0; cnt < port->card->rx_ring_buffers; cnt++) -		printk(" %02X", readb(&(desc_address(port, cnt, 0)->stat))); -	printk(KERN_CONT "\n"); +		pr_cont(" %02X", readb(&(desc_address(port, cnt, 0)->stat))); +	pr_cont("\n");  	printk(KERN_DEBUG "TX ring: CDA=%u EDA=%u DSR=%02X in=%u "  	       "last=%u %sactive", @@ -538,8 +539,8 @@ static void sca_dump_rings(struct net_device *dev)  	       sca_in(DSR_TX(port->chan), card) & DSR_DE ? "" : "in");  	for (cnt = 0; cnt < port->card->tx_ring_buffers; cnt++) -		printk(" %02X", readb(&(desc_address(port, cnt, 1)->stat))); -	printk("\n"); +		pr_cont(" %02X", readb(&(desc_address(port, cnt, 1)->stat))); +	pr_cont("\n");  	printk(KERN_DEBUG "MSCI: MD: %02x %02x %02x,"  	       " ST: %02x %02x %02x %02x %02x, FST: %02x CST: %02x %02x\n", @@ -603,8 +604,7 @@ static netdev_tx_t sca_xmit(struct sk_buff *skb, struct net_device *dev)  } -static u32 __devinit sca_detect_ram(card_t *card, u8 __iomem *rambase, -				    u32 ramsize) +static u32 sca_detect_ram(card_t *card, u8 __iomem *rambase, u32 ramsize)  {  	/* Round RAM size to 32 bits, fill from end to start */  	u32 i = ramsize &= ~3; @@ -623,7 +623,7 @@ static u32 __devinit sca_detect_ram(card_t *card, u8 __iomem *rambase,  } -static void __devinit sca_init(card_t *card, int wait_states) +static void sca_init(card_t *card, int wait_states)  {  	sca_out(wait_states, WCRL, card); /* Wait Control */  	sca_out(wait_states, WCRM, card); diff --git a/drivers/net/wan/hd64572.h b/drivers/net/wan/hd64572.h index 96567c2dc4d..22137ee669c 100644 --- a/drivers/net/wan/hd64572.h +++ b/drivers/net/wan/hd64572.h @@ -218,7 +218,7 @@ typedef struct {  #define ST_TX_EOM     0x80	/* End of frame */  #define ST_TX_UNDRRUN 0x08  #define ST_TX_OWNRSHP 0x02 -#define ST_TX_EOT     0x01	/* End of transmition */ +#define ST_TX_EOT     0x01	/* End of transmission */  #define ST_RX_EOM     0x80	/* End of frame */  #define ST_RX_SHORT   0x40	/* Short frame */ diff --git a/drivers/net/wan/hdlc.c b/drivers/net/wan/hdlc.c index 5d4bb615ccc..9c33ca918e1 100644 --- a/drivers/net/wan/hdlc.c +++ b/drivers/net/wan/hdlc.c @@ -22,6 +22,8 @@   * - proto->start() and stop() are called with spin_lock_irq held.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/errno.h>  #include <linux/hdlc.h>  #include <linux/if_arp.h> @@ -97,7 +99,7 @@ static inline void hdlc_proto_stop(struct net_device *dev)  static int hdlc_device_event(struct notifier_block *this, unsigned long event,  			     void *ptr)  { -	struct net_device *dev = ptr; +	struct net_device *dev = netdev_notifier_info_to_dev(ptr);  	hdlc_device *hdlc;  	unsigned long flags;  	int on; @@ -130,10 +132,10 @@ static int hdlc_device_event(struct notifier_block *this, unsigned long event,  		goto carrier_exit;  	if (hdlc->carrier) { -		printk(KERN_INFO "%s: Carrier detected\n", dev->name); +		netdev_info(dev, "Carrier detected\n");  		hdlc_proto_start(dev);  	} else { -		printk(KERN_INFO "%s: Carrier lost\n", dev->name); +		netdev_info(dev, "Carrier lost\n");  		hdlc_proto_stop(dev);  	} @@ -165,10 +167,10 @@ int hdlc_open(struct net_device *dev)  	spin_lock_irq(&hdlc->state_lock);  	if (hdlc->carrier) { -		printk(KERN_INFO "%s: Carrier detected\n", dev->name); +		netdev_info(dev, "Carrier detected\n");  		hdlc_proto_start(dev);  	} else -		printk(KERN_INFO "%s: No carrier\n", dev->name); +		netdev_info(dev, "No carrier\n");  	hdlc->open = 1; @@ -278,14 +280,13 @@ int attach_hdlc_protocol(struct net_device *dev, struct hdlc_proto *proto,  	if (!try_module_get(proto->module))  		return -ENOSYS; -	if (size) -		if ((dev_to_hdlc(dev)->state = kmalloc(size, -						       GFP_KERNEL)) == NULL) { -			printk(KERN_WARNING "Memory squeeze on" -			       " hdlc_proto_attach()\n"); +	if (size) { +		dev_to_hdlc(dev)->state = kmalloc(size, GFP_KERNEL); +		if (dev_to_hdlc(dev)->state == NULL) {  			module_put(proto->module);  			return -ENOBUFS;  		} +	}  	dev_to_hdlc(dev)->proto = proto;  	return 0;  } @@ -363,7 +364,7 @@ static int __init hdlc_module_init(void)  {  	int result; -	printk(KERN_INFO "%s\n", version); +	pr_info("%s\n", version);  	if ((result = register_netdevice_notifier(&hdlc_notifier)) != 0)  		return result;  	dev_add_pack(&hdlc_packet_type); diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index b1e5e5b69c2..3f20808b5ff 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c @@ -103,9 +103,7 @@ static void cisco_keepalive_send(struct net_device *dev, u32 type,  	skb = dev_alloc_skb(sizeof(struct hdlc_header) +  			    sizeof(struct cisco_packet));  	if (!skb) { -		printk(KERN_WARNING -		       "%s: Memory squeeze on cisco_keepalive_send()\n", -		       dev->name); +		netdev_warn(dev, "Memory squeeze on cisco_keepalive_send()\n");  		return;  	}  	skb_reserve(skb, 4); @@ -181,8 +179,8 @@ static int cisco_rx(struct sk_buff *skb)  		     CISCO_PACKET_LEN) &&  		    (skb->len != sizeof(struct hdlc_header) +  		     CISCO_BIG_PACKET_LEN)) { -			printk(KERN_INFO "%s: Invalid length of Cisco control" -			       " packet (%d bytes)\n", dev->name, skb->len); +			netdev_info(dev, "Invalid length of Cisco control packet (%d bytes)\n", +				    skb->len);  			goto rx_error;  		} @@ -217,8 +215,7 @@ static int cisco_rx(struct sk_buff *skb)  			return NET_RX_SUCCESS;  		case CISCO_ADDR_REPLY: -			printk(KERN_INFO "%s: Unexpected Cisco IP address " -			       "reply\n", dev->name); +			netdev_info(dev, "Unexpected Cisco IP address reply\n");  			goto rx_error;  		case CISCO_KEEPALIVE_REQ: @@ -235,9 +232,8 @@ static int cisco_rx(struct sk_buff *skb)  					min = sec / 60; sec -= min * 60;  					hrs = min / 60; min -= hrs * 60;  					days = hrs / 24; hrs -= days * 24; -					printk(KERN_INFO "%s: Link up (peer " -					       "uptime %ud%uh%um%us)\n", -					       dev->name, days, hrs, min, sec); +					netdev_info(dev, "Link up (peer uptime %ud%uh%um%us)\n", +						    days, hrs, min, sec);  					netif_dormant_off(dev);  					st->up = 1;  				} @@ -249,8 +245,7 @@ static int cisco_rx(struct sk_buff *skb)  		} /* switch (keepalive type) */  	} /* switch (protocol) */ -	printk(KERN_INFO "%s: Unsupported protocol %x\n", dev->name, -	       ntohs(data->protocol)); +	netdev_info(dev, "Unsupported protocol %x\n", ntohs(data->protocol));  	dev_kfree_skb_any(skb);  	return NET_RX_DROP; @@ -272,7 +267,7 @@ static void cisco_timer(unsigned long arg)  	if (st->up &&  	    time_after(jiffies, st->last_poll + st->settings.timeout * HZ)) {  		st->up = 0; -		printk(KERN_INFO "%s: Link down\n", dev->name); +		netdev_info(dev, "Link down\n");  		netif_dormant_on(dev);  	} diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index 0edb535bb2b..7c6cb4f3179 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c @@ -446,15 +446,14 @@ static netdev_tx_t pvc_xmit(struct sk_buff *skb, struct net_device *dev)  static inline void fr_log_dlci_active(pvc_device *pvc)  { -	printk(KERN_INFO "%s: DLCI %d [%s%s%s]%s %s\n", -	       pvc->frad->name, -	       pvc->dlci, -	       pvc->main ? pvc->main->name : "", -	       pvc->main && pvc->ether ? " " : "", -	       pvc->ether ? pvc->ether->name : "", -	       pvc->state.new ? " new" : "", -	       !pvc->state.exist ? "deleted" : -	       pvc->state.active ? "active" : "inactive"); +	netdev_info(pvc->frad, "DLCI %d [%s%s%s]%s %s\n", +		    pvc->dlci, +		    pvc->main ? pvc->main->name : "", +		    pvc->main && pvc->ether ? " " : "", +		    pvc->ether ? pvc->ether->name : "", +		    pvc->state.new ? " new" : "", +		    !pvc->state.exist ? "deleted" : +		    pvc->state.active ? "active" : "inactive");  } @@ -481,16 +480,14 @@ static void fr_lmi_send(struct net_device *dev, int fullrep)  	if (dce && fullrep) {  		len += state(hdlc)->dce_pvc_count * (2 + stat_len);  		if (len > HDLC_MAX_MRU) { -			printk(KERN_WARNING "%s: Too many PVCs while sending " -			       "LMI full report\n", dev->name); +			netdev_warn(dev, "Too many PVCs while sending LMI full report\n");  			return;  		}  	}  	skb = dev_alloc_skb(len);  	if (!skb) { -		printk(KERN_WARNING "%s: Memory squeeze on fr_lmi_send()\n", -		       dev->name); +		netdev_warn(dev, "Memory squeeze on fr_lmi_send()\n");  		return;  	}  	memset(skb->data, 0, len); @@ -615,8 +612,7 @@ static void fr_timer(unsigned long arg)  		state(hdlc)->last_errors <<= 1; /* Shift the list */  		if (state(hdlc)->request) {  			if (state(hdlc)->reliable) -				printk(KERN_INFO "%s: No LMI status reply " -				       "received\n", dev->name); +				netdev_info(dev, "No LMI status reply received\n");  			state(hdlc)->last_errors |= 1;  		} @@ -628,8 +624,7 @@ static void fr_timer(unsigned long arg)  	}  	if (state(hdlc)->reliable != reliable) { -		printk(KERN_INFO "%s: Link %sreliable\n", dev->name, -		       reliable ? "" : "un"); +		netdev_info(dev, "Link %sreliable\n", reliable ? "" : "un");  		fr_set_link_state(reliable, dev);  	} @@ -665,33 +660,32 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)  	if (skb->len < (lmi == LMI_ANSI ? LMI_ANSI_LENGTH :  			LMI_CCITT_CISCO_LENGTH)) { -		printk(KERN_INFO "%s: Short LMI frame\n", dev->name); +		netdev_info(dev, "Short LMI frame\n");  		return 1;  	}  	if (skb->data[3] != (lmi == LMI_CISCO ? NLPID_CISCO_LMI :  			     NLPID_CCITT_ANSI_LMI)) { -		printk(KERN_INFO "%s: Received non-LMI frame with LMI DLCI\n", -		       dev->name); +		netdev_info(dev, "Received non-LMI frame with LMI DLCI\n");  		return 1;  	}  	if (skb->data[4] != LMI_CALLREF) { -		printk(KERN_INFO "%s: Invalid LMI Call reference (0x%02X)\n", -		       dev->name, skb->data[4]); +		netdev_info(dev, "Invalid LMI Call reference (0x%02X)\n", +			    skb->data[4]);  		return 1;  	}  	if (skb->data[5] != (dce ? LMI_STATUS_ENQUIRY : LMI_STATUS)) { -		printk(KERN_INFO "%s: Invalid LMI Message type (0x%02X)\n", -		       dev->name, skb->data[5]); +		netdev_info(dev, "Invalid LMI Message type (0x%02X)\n", +			    skb->data[5]);  		return 1;  	}  	if (lmi == LMI_ANSI) {  		if (skb->data[6] != LMI_ANSI_LOCKSHIFT) { -			printk(KERN_INFO "%s: Not ANSI locking shift in LMI" -			       " message (0x%02X)\n", dev->name, skb->data[6]); +			netdev_info(dev, "Not ANSI locking shift in LMI message (0x%02X)\n", +				    skb->data[6]);  			return 1;  		}  		i = 7; @@ -700,34 +694,34 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)  	if (skb->data[i] != (lmi == LMI_CCITT ? LMI_CCITT_REPTYPE :  			     LMI_ANSI_CISCO_REPTYPE)) { -		printk(KERN_INFO "%s: Not an LMI Report type IE (0x%02X)\n", -		       dev->name, skb->data[i]); +		netdev_info(dev, "Not an LMI Report type IE (0x%02X)\n", +			    skb->data[i]);  		return 1;  	}  	if (skb->data[++i] != LMI_REPT_LEN) { -		printk(KERN_INFO "%s: Invalid LMI Report type IE length" -		       " (%u)\n", dev->name, skb->data[i]); +		netdev_info(dev, "Invalid LMI Report type IE length (%u)\n", +			    skb->data[i]);  		return 1;  	}  	reptype = skb->data[++i];  	if (reptype != LMI_INTEGRITY && reptype != LMI_FULLREP) { -		printk(KERN_INFO "%s: Unsupported LMI Report type (0x%02X)\n", -		       dev->name, reptype); +		netdev_info(dev, "Unsupported LMI Report type (0x%02X)\n", +			    reptype);  		return 1;  	}  	if (skb->data[++i] != (lmi == LMI_CCITT ? LMI_CCITT_ALIVE :  			       LMI_ANSI_CISCO_ALIVE)) { -		printk(KERN_INFO "%s: Not an LMI Link integrity verification" -		       " IE (0x%02X)\n", dev->name, skb->data[i]); +		netdev_info(dev, "Not an LMI Link integrity verification IE (0x%02X)\n", +			    skb->data[i]);  		return 1;  	}  	if (skb->data[++i] != LMI_INTEG_LEN) { -		printk(KERN_INFO "%s: Invalid LMI Link integrity verification" -		       " IE length (%u)\n", dev->name, skb->data[i]); +		netdev_info(dev, "Invalid LMI Link integrity verification IE length (%u)\n", +			    skb->data[i]);  		return 1;  	}  	i++; @@ -801,14 +795,14 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)  		if (skb->data[i] != (lmi == LMI_CCITT ? LMI_CCITT_PVCSTAT :  				       LMI_ANSI_CISCO_PVCSTAT)) { -			printk(KERN_INFO "%s: Not an LMI PVC status IE" -			       " (0x%02X)\n", dev->name, skb->data[i]); +			netdev_info(dev, "Not an LMI PVC status IE (0x%02X)\n", +				    skb->data[i]);  			return 1;  		}  		if (skb->data[++i] != stat_len) { -			printk(KERN_INFO "%s: Invalid LMI PVC status IE length" -			       " (%u)\n", dev->name, skb->data[i]); +			netdev_info(dev, "Invalid LMI PVC status IE length (%u)\n", +				    skb->data[i]);  			return 1;  		}  		i++; @@ -829,9 +823,7 @@ static int fr_lmi_recv(struct net_device *dev, struct sk_buff *skb)  		pvc = add_pvc(dev, dlci);  		if (!pvc && !no_ram) { -			printk(KERN_WARNING -			       "%s: Memory squeeze on fr_lmi_recv()\n", -			       dev->name); +			netdev_warn(dev, "Memory squeeze on fr_lmi_recv()\n");  			no_ram = 1;  		} @@ -902,8 +894,8 @@ static int fr_rx(struct sk_buff *skb)  	pvc = find_pvc(hdlc, dlci);  	if (!pvc) {  #ifdef DEBUG_PKT -		printk(KERN_INFO "%s: No PVC for received frame's DLCI %d\n", -		       frad->name, dlci); +		netdev_info(frad, "No PVC for received frame's DLCI %d\n", +			    dlci);  #endif  		dev_kfree_skb_any(skb);  		return NET_RX_DROP; @@ -962,14 +954,14 @@ static int fr_rx(struct sk_buff *skb)  			break;  		default: -			printk(KERN_INFO "%s: Unsupported protocol, OUI=%x " -			       "PID=%x\n", frad->name, oui, pid); +			netdev_info(frad, "Unsupported protocol, OUI=%x PID=%x\n", +				    oui, pid);  			dev_kfree_skb_any(skb);  			return NET_RX_DROP;  		}  	} else { -		printk(KERN_INFO "%s: Unsupported protocol, NLPID=%x " -		       "length = %i\n", frad->name, data[3], skb->len); +		netdev_info(frad, "Unsupported protocol, NLPID=%x length=%i\n", +			    data[3], skb->len);  		dev_kfree_skb_any(skb);  		return NET_RX_DROP;  	} @@ -1070,11 +1062,10 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)  	hdlc_device *hdlc = dev_to_hdlc(frad);  	pvc_device *pvc;  	struct net_device *dev; -	int result, used; +	int used;  	if ((pvc = add_pvc(frad, dlci)) == NULL) { -		printk(KERN_WARNING "%s: Memory squeeze on fr_add_pvc()\n", -		       frad->name); +		netdev_warn(frad, "Memory squeeze on fr_add_pvc()\n");  		return -ENOBUFS;  	} @@ -1083,20 +1074,20 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)  	used = pvc_is_used(pvc); -	if (type == ARPHRD_ETHER) +	if (type == ARPHRD_ETHER) {  		dev = alloc_netdev(0, "pvceth%d", ether_setup); -	else +		dev->priv_flags &= ~IFF_TX_SKB_SHARING; +	} else  		dev = alloc_netdev(0, "pvc%d", pvc_setup);  	if (!dev) { -		printk(KERN_WARNING "%s: Memory squeeze on fr_pvc()\n", -		       frad->name); +		netdev_warn(frad, "Memory squeeze on fr_pvc()\n");  		delete_unused_pvcs(hdlc);  		return -ENOBUFS;  	}  	if (type == ARPHRD_ETHER) -		random_ether_addr(dev->dev_addr); +		eth_hw_addr_random(dev);  	else {  		*(__be16*)dev->dev_addr = htons(dlci);  		dlci_to_q922(dev->broadcast, dlci); @@ -1106,13 +1097,6 @@ static int fr_add_pvc(struct net_device *frad, unsigned int dlci, int type)  	dev->tx_queue_len = 0;  	dev->ml_priv = pvc; -	result = dev_alloc_name(dev, dev->name); -	if (result < 0) { -		free_netdev(dev); -		delete_unused_pvcs(hdlc); -		return result; -	} -  	if (register_netdevice(dev) != 0) {  		free_netdev(dev);  		delete_unused_pvcs(hdlc); diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index 941f053e650..0d7645581f9 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c @@ -223,8 +223,7 @@ static void ppp_tx_cp(struct net_device *dev, u16 pid, u8 code,  	skb = dev_alloc_skb(sizeof(struct hdlc_header) +  			    sizeof(struct cp_header) + magic_len + len);  	if (!skb) { -		printk(KERN_WARNING "%s: out of memory in ppp_tx_cp()\n", -		       dev->name); +		netdev_warn(dev, "out of memory in ppp_tx_cp()\n");  		return;  	}  	skb_reserve(skb, sizeof(struct hdlc_header)); @@ -345,7 +344,7 @@ static void ppp_cp_event(struct net_device *dev, u16 pid, u16 event, u8 code,  		ppp_tx_cp(dev, pid, CP_CODE_REJ, ++ppp->seq, len, data);  	if (old_state != OPENED && proto->state == OPENED) { -		printk(KERN_INFO "%s: %s up\n", dev->name, proto_name(pid)); +		netdev_info(dev, "%s up\n", proto_name(pid));  		if (pid == PID_LCP) {  			netif_dormant_off(dev);  			ppp_cp_event(dev, PID_IPCP, START, 0, 0, 0, NULL); @@ -356,7 +355,7 @@ static void ppp_cp_event(struct net_device *dev, u16 pid, u16 event, u8 code,  		}  	}  	if (old_state == OPENED && proto->state != OPENED) { -		printk(KERN_INFO "%s: %s down\n", dev->name, proto_name(pid)); +		netdev_info(dev, "%s down\n", proto_name(pid));  		if (pid == PID_LCP) {  			netif_dormant_on(dev);  			ppp_cp_event(dev, PID_IPCP, STOP, 0, 0, 0, NULL); @@ -516,37 +515,37 @@ static int ppp_rx(struct sk_buff *skb)  	switch (cp->code) {  	case CP_CONF_REQ:  		ppp_cp_parse_cr(dev, pid, cp->id, len, skb->data); -		goto out; +		break;  	case CP_CONF_ACK:  		if (cp->id == proto->cr_id)  			ppp_cp_event(dev, pid, RCA, 0, 0, 0, NULL); -		goto out; +		break;  	case CP_CONF_REJ:  	case CP_CONF_NAK:  		if (cp->id == proto->cr_id)  			ppp_cp_event(dev, pid, RCN, 0, 0, 0, NULL); -		goto out; +		break;  	case CP_TERM_REQ:  		ppp_cp_event(dev, pid, RTR, 0, cp->id, 0, NULL); -		goto out; +		break;  	case CP_TERM_ACK:  		ppp_cp_event(dev, pid, RTA, 0, 0, 0, NULL); -		goto out; +		break;  	case CP_CODE_REJ:  		ppp_cp_event(dev, pid, RXJ_BAD, 0, 0, 0, NULL); -		goto out; +		break;  	default:  		len += sizeof(struct cp_header);  		if (len > dev->mtu)  			len = dev->mtu;  		ppp_cp_event(dev, pid, RUC, 0, 0, len, cp); -		goto out; +		break;  	}  	goto out; @@ -585,7 +584,7 @@ static void ppp_timer(unsigned long arg)  			break;  		if (time_after(jiffies, ppp->last_pong +  			       ppp->keepalive_timeout * HZ)) { -			printk(KERN_INFO "%s: Link down\n", proto->dev->name); +			netdev_info(proto->dev, "Link down\n");  			ppp_cp_event(proto->dev, PID_LCP, STOP, 0, 0, 0, NULL);  			ppp_cp_event(proto->dev, PID_LCP, START, 0, 0, 0, NULL);  		} else {	/* send keep-alive packet */ diff --git a/drivers/net/wan/hdlc_raw_eth.c b/drivers/net/wan/hdlc_raw_eth.c index 05c9b0b9623..3ab72b3082d 100644 --- a/drivers/net/wan/hdlc_raw_eth.c +++ b/drivers/net/wan/hdlc_raw_eth.c @@ -101,7 +101,7 @@ static int raw_eth_ioctl(struct net_device *dev, struct ifreq *ifr)  		old_qlen = dev->tx_queue_len;  		ether_setup(dev);  		dev->tx_queue_len = old_qlen; -		random_ether_addr(dev->dev_addr); +		eth_hw_addr_random(dev);  		netif_dormant_off(dev);  		return 0;  	} diff --git a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c index 70527e5a54a..a49aec5efd2 100644 --- a/drivers/net/wan/hdlc_x25.c +++ b/drivers/net/wan/hdlc_x25.c @@ -34,7 +34,7 @@ static void x25_connect_disconnect(struct net_device *dev, int reason, int code)  	unsigned char *ptr;  	if ((skb = dev_alloc_skb(1)) == NULL) { -		printk(KERN_ERR "%s: out of memory\n", dev->name); +		netdev_err(dev, "out of memory\n");  		return;  	} @@ -106,9 +106,8 @@ static netdev_tx_t x25_xmit(struct sk_buff *skb, struct net_device *dev)  				/* Send connect confirm. msg to level 3 */  				x25_connected(dev, 0);  			else -				printk(KERN_ERR "%s: LAPB connect request " -				       "failed, error code = %i\n", -				       dev->name, result); +				netdev_err(dev, "LAPB connect request failed, error code = %i\n", +					   result);  		}  		break; @@ -118,9 +117,8 @@ static netdev_tx_t x25_xmit(struct sk_buff *skb, struct net_device *dev)  				/* Send disconnect confirm. msg to level 3 */  				x25_disconnected(dev, 0);  			else -				printk(KERN_ERR "%s: LAPB disconnect request " -				       "failed, error code = %i\n", -				       dev->name, result); +				netdev_err(dev, "LAPB disconnect request failed, error code = %i\n", +					   result);  		}  		break; @@ -136,15 +134,15 @@ static netdev_tx_t x25_xmit(struct sk_buff *skb, struct net_device *dev)  static int x25_open(struct net_device *dev)  { -	struct lapb_register_struct cb;  	int result; - -	cb.connect_confirmation = x25_connected; -	cb.connect_indication = x25_connected; -	cb.disconnect_confirmation = x25_disconnected; -	cb.disconnect_indication = x25_disconnected; -	cb.data_indication = x25_data_indication; -	cb.data_transmit = x25_data_transmit; +	static const struct lapb_register_struct cb = { +		.connect_confirmation = x25_connected, +		.connect_indication = x25_connected, +		.disconnect_confirmation = x25_disconnected, +		.disconnect_indication = x25_disconnected, +		.data_indication = x25_data_indication, +		.data_transmit = x25_data_transmit, +	};  	result = lapb_register(dev, &cb);  	if (result != LAPB_OK) diff --git a/drivers/net/wan/hostess_sv11.c b/drivers/net/wan/hostess_sv11.c index 48edc5f4dac..3d741663fd6 100644 --- a/drivers/net/wan/hostess_sv11.c +++ b/drivers/net/wan/hostess_sv11.c @@ -15,11 +15,13 @@   *	The hardware does the bus handling to avoid the need for delays between   *	touching control registers.   * - *	Port B isnt wired (why - beats me) + *	Port B isn't wired (why - beats me)   *   *	Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/mm.h> @@ -192,8 +194,7 @@ static struct z8530_dev *sv11_init(int iobase, int irq)  	 */  	if (!request_region(iobase, 8, "Comtrol SV11")) { -		printk(KERN_WARNING "hostess: I/O 0x%X already in use.\n", -		       iobase); +		pr_warn("I/O 0x%X already in use\n", iobase);  		return NULL;  	} @@ -219,9 +220,9 @@ static struct z8530_dev *sv11_init(int iobase, int irq)  	/* We want a fast IRQ for this device. Actually we'd like an even faster  	   IRQ ;) - This is one driver RtLinux is made for */ -	if (request_irq(irq, z8530_interrupt, IRQF_DISABLED, +	if (request_irq(irq, z8530_interrupt, 0,  			"Hostess SV11", sv) < 0) { -		printk(KERN_WARNING "hostess: IRQ %d already in use.\n", irq); +		pr_warn("IRQ %d already in use\n", irq);  		goto err_irq;  	} @@ -255,7 +256,7 @@ static struct z8530_dev *sv11_init(int iobase, int irq)  	 */  	if (z8530_init(sv)) { -		printk(KERN_ERR "Z8530 series device not found.\n"); +		pr_err("Z8530 series device not found\n");  		enable_irq(irq);  		goto free_dma;  	} @@ -282,7 +283,7 @@ static struct z8530_dev *sv11_init(int iobase, int irq)  	netdev->irq = irq;  	if (register_hdlc_device(netdev)) { -		printk(KERN_ERR "hostess: unable to register HDLC device.\n"); +		pr_err("unable to register HDLC device\n");  		free_netdev(netdev);  		goto free_dma;  	} diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c index 6c571e19883..e7bbdb7af53 100644 --- a/drivers/net/wan/ixp4xx_hss.c +++ b/drivers/net/wan/ixp4xx_hss.c @@ -8,6 +8,9 @@   * as published by the Free Software Foundation.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include <linux/module.h>  #include <linux/bitops.h>  #include <linux/cdev.h>  #include <linux/dma-mapping.h> @@ -178,7 +181,7 @@   *   * The resulting average clock frequency (assuming 33.333 MHz oscillator) is:   * freq = 66.666 MHz / (A + (B + 1) / (C + 1)) - * minumum freq = 66.666 MHz / (A + 1) + * minimum freq = 66.666 MHz / (A + 1)   * maximum freq = 66.666 MHz / A   *   * Example: A = 2, B = 2, C = 7, CLOCK_CR register = 2 << 22 | 2 << 12 | 7 @@ -230,7 +233,7 @@  #define PKT_PIPE_MODE_WRITE		0x57  /* HDLC packet status values - desc->status */ -#define ERR_SHUTDOWN		1 /* stop or shutdown occurrance */ +#define ERR_SHUTDOWN		1 /* stop or shutdown occurrence */  #define ERR_HDLC_ALIGN		2 /* HDLC alignment error */  #define ERR_HDLC_FCS		3 /* HDLC Frame Check Sum error */  #define ERR_RXFREE_Q_EMPTY	4 /* RX-free queue became empty while receiving @@ -358,9 +361,8 @@ static void hss_npe_send(struct port *port, struct msg *msg, const char* what)  {  	u32 *val = (u32*)msg;  	if (npe_send_message(port->npe, msg, what)) { -		printk(KERN_CRIT "HSS-%i: unable to send command [%08X:%08X]" -		       " to %s\n", port->id, val[0], val[1], -		       npe_name(port->npe)); +		pr_crit("HSS-%i: unable to send command [%08X:%08X] to %s\n", +			port->id, val[0], val[1], npe_name(port->npe));  		BUG();  	}  } @@ -447,8 +449,7 @@ static void hss_config(struct port *port)  	if (npe_recv_message(port->npe, &msg, "HSS_LOAD_CONFIG") ||  	    /* HSS_LOAD_CONFIG for port #1 returns port_id = #4 */  	    msg.cmd != PORT_CONFIG_LOAD || msg.data32) { -		printk(KERN_CRIT "HSS-%i: HSS_LOAD_CONFIG failed\n", -		       port->id); +		pr_crit("HSS-%i: HSS_LOAD_CONFIG failed\n", port->id);  		BUG();  	} @@ -477,8 +478,7 @@ static u32 hss_get_status(struct port *port)  	msg.hss_port = port->id;  	hss_npe_send(port, &msg, "PORT_ERROR_READ");  	if (npe_recv_message(port->npe, &msg, "PORT_ERROR_READ")) { -		printk(KERN_CRIT "HSS-%i: unable to read HSS status\n", -		       port->id); +		pr_crit("HSS-%i: unable to read HSS status\n", port->id);  		BUG();  	} @@ -736,9 +736,8 @@ static int hss_hdlc_poll(struct napi_struct *napi, int budget)  			dev->stats.rx_errors++;  			break;  		default:	/* FIXME - remove printk */ -			printk(KERN_ERR "%s: hss_hdlc_poll: status 0x%02X" -			       " errors %u\n", dev->name, desc->status, -			       desc->error_count); +			netdev_err(dev, "hss_hdlc_poll: status 0x%02X errors %u\n", +				   desc->status, desc->error_count);  			dev->stats.rx_errors++;  		} @@ -970,10 +969,12 @@ static int init_hdlc_queues(struct port *port)  {  	int i; -	if (!ports_open) -		if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, -						 POOL_ALLOC_SIZE, 32, 0))) +	if (!ports_open) { +		dma_pool = dma_pool_create(DRV_NAME, &port->netdev->dev, +					   POOL_ALLOC_SIZE, 32, 0); +		if (!dma_pool)  			return -ENOMEM; +	}  	if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL,  					      &port->desc_tab_phys))) @@ -1127,8 +1128,8 @@ static int hss_hdlc_close(struct net_device *dev)  		buffs--;  	if (buffs) -		printk(KERN_CRIT "%s: unable to drain RX queue, %i buffer(s)" -		       " left in NPE\n", dev->name, buffs); +		netdev_crit(dev, "unable to drain RX queue, %i buffer(s) left in NPE\n", +			    buffs);  	buffs = TX_DESCS;  	while (queue_get_desc(queue_ids[port->id].tx, port, 1) >= 0) @@ -1143,8 +1144,8 @@ static int hss_hdlc_close(struct net_device *dev)  	} while (++i < MAX_CLOSE_WAIT);  	if (buffs) -		printk(KERN_CRIT "%s: unable to drain TX queue, %i buffer(s) " -		       "left in NPE\n", dev->name, buffs); +		netdev_crit(dev, "unable to drain TX queue, %i buffer(s) left in NPE\n", +			    buffs);  #if DEBUG_CLOSE  	if (!buffs)  		printk(KERN_DEBUG "Draining TX queues took %i cycles\n", i); @@ -1325,7 +1326,7 @@ static const struct net_device_ops hss_hdlc_ops = {  	.ndo_do_ioctl   = hss_hdlc_ioctl,  }; -static int __devinit hss_init_one(struct platform_device *pdev) +static int hss_init_one(struct platform_device *pdev)  {  	struct port *port;  	struct net_device *dev; @@ -1364,7 +1365,7 @@ static int __devinit hss_init_one(struct platform_device *pdev)  	platform_set_drvdata(pdev, port); -	printk(KERN_INFO "%s: HSS-%i\n", dev->name, port->id); +	netdev_info(dev, "initialized\n");  	return 0;  err_free_netdev: @@ -1376,14 +1377,13 @@ err_free:  	return err;  } -static int __devexit hss_remove_one(struct platform_device *pdev) +static int hss_remove_one(struct platform_device *pdev)  {  	struct port *port = platform_get_drvdata(pdev);  	unregister_hdlc_device(port->netdev);  	free_netdev(port->netdev);  	npe_release(port->npe); -	platform_set_drvdata(pdev, NULL);  	kfree(port);  	return 0;  } diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c index 7f5bb913c8b..a33a46fa88d 100644 --- a/drivers/net/wan/lapbether.c +++ b/drivers/net/wan/lapbether.c @@ -20,6 +20,8 @@   *	2000-11-14	Henner Eisen	dev_hold/put, NETDEV_GOING_DOWN support   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/errno.h>  #include <linux/types.h>  #include <linux/socket.h> @@ -33,7 +35,6 @@  #include <linux/if_arp.h>  #include <linux/skbuff.h>  #include <net/sock.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include <linux/mm.h>  #include <linux/interrupt.h> @@ -165,13 +166,11 @@ static netdev_tx_t lapbeth_xmit(struct sk_buff *skb,  		break;  	case X25_IFACE_CONNECT:  		if ((err = lapb_connect_request(dev)) != LAPB_OK) -			printk(KERN_ERR "lapbeth: lapb_connect_request " -			       "error: %d\n", err); +			pr_err("lapb_connect_request error: %d\n", err);  		goto drop;  	case X25_IFACE_DISCONNECT:  		if ((err = lapb_disconnect_request(dev)) != LAPB_OK) -			printk(KERN_ERR "lapbeth: lapb_disconnect_request " -			       "err: %d\n", err); +			pr_err("lapb_disconnect_request err: %d\n", err);  		/* Fall thru */  	default:  		goto drop; @@ -180,7 +179,7 @@ static netdev_tx_t lapbeth_xmit(struct sk_buff *skb,  	skb_pull(skb, 1);  	if ((err = lapb_data_request(dev, skb)) != LAPB_OK) { -		printk(KERN_ERR "lapbeth: lapb_data_request error - %d\n", err); +		pr_err("lapb_data_request error - %d\n", err);  		goto drop;  	}  out: @@ -220,7 +219,7 @@ static void lapbeth_connected(struct net_device *dev, int reason)  	struct sk_buff *skb = dev_alloc_skb(1);  	if (!skb) { -		printk(KERN_ERR "lapbeth: out of memory\n"); +		pr_err("out of memory\n");  		return;  	} @@ -237,7 +236,7 @@ static void lapbeth_disconnected(struct net_device *dev, int reason)  	struct sk_buff *skb = dev_alloc_skb(1);  	if (!skb) { -		printk(KERN_ERR "lapbeth: out of memory\n"); +		pr_err("out of memory\n");  		return;  	} @@ -259,14 +258,13 @@ static int lapbeth_set_mac_address(struct net_device *dev, void *addr)  } -static struct lapb_register_struct lapbeth_callbacks = { +static const struct lapb_register_struct lapbeth_callbacks = {  	.connect_confirmation    = lapbeth_connected,  	.connect_indication      = lapbeth_connected,  	.disconnect_confirmation = lapbeth_disconnected,  	.disconnect_indication   = lapbeth_disconnected,  	.data_indication         = lapbeth_data_indication,  	.data_transmit           = lapbeth_data_transmit, -  };  /* @@ -277,7 +275,7 @@ static int lapbeth_open(struct net_device *dev)  	int err;  	if ((err = lapb_register(dev, &lapbeth_callbacks)) != LAPB_OK) { -		printk(KERN_ERR "lapbeth: lapb_register error - %d\n", err); +		pr_err("lapb_register error: %d\n", err);  		return -ENODEV;  	} @@ -292,7 +290,7 @@ static int lapbeth_close(struct net_device *dev)  	netif_stop_queue(dev);  	if ((err = lapb_unregister(dev)) != LAPB_OK) -		printk(KERN_ERR "lapbeth: lapb_unregister error - %d\n", err); +		pr_err("lapb_unregister error: %d\n", err);  	return 0;  } @@ -338,10 +336,6 @@ static int lapbeth_new_device(struct net_device *dev)  	dev_hold(dev);  	lapbeth->ethdev = dev; -	rc = dev_alloc_name(ndev, ndev->name); -	if (rc < 0)  -		goto fail; -  	rc = -EIO;  	if (register_netdevice(ndev))  		goto fail; @@ -376,7 +370,7 @@ static int lapbeth_device_event(struct notifier_block *this,  				unsigned long event, void *ptr)  {  	struct lapbethdev *lapbeth; -	struct net_device *dev = ptr; +	struct net_device *dev = netdev_notifier_info_to_dev(ptr);  	if (dev_net(dev) != &init_net)  		return NOTIFY_DONE; diff --git a/drivers/net/wan/lmc/Makefile b/drivers/net/wan/lmc/Makefile index dabdcfed4ef..609710d64eb 100644 --- a/drivers/net/wan/lmc/Makefile +++ b/drivers/net/wan/lmc/Makefile @@ -14,4 +14,4 @@ lmc-objs := lmc_debug.o lmc_media.o lmc_main.o lmc_proto.o  # -DDEBUG \  # -DLMC_PACKET_LOG -EXTRA_CFLAGS += -I. $(DBGDEF) +ccflags-y := -I. $(DBGDEF) diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c index 70feb84df67..b2fe9bb8963 100644 --- a/drivers/net/wan/lmc/lmc_main.c +++ b/drivers/net/wan/lmc/lmc_main.c @@ -24,7 +24,7 @@    *    * Linux driver notes:    * Linux uses the device struct lmc_private to pass private information -  * arround. +  * around.    *    * The initialization portion of this driver (the lmc_reset() and the    * lmc_dec_reset() functions, as well as the led controls and the @@ -49,7 +49,6 @@  #include <linux/pci.h>  #include <linux/delay.h>  #include <linux/hdlc.h> -#include <linux/init.h>  #include <linux/in.h>  #include <linux/if_arp.h>  #include <linux/netdevice.h> @@ -497,7 +496,6 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/                      data = kmalloc(xc.len, GFP_KERNEL);                      if (!data) { -                            printk(KERN_WARNING "%s: Failed to allocate memory for copy\n", dev->name);                              ret = -ENOMEM;                              break;                      } @@ -817,8 +815,7 @@ static const struct net_device_ops lmc_ops = {  	.ndo_get_stats  = lmc_get_stats,  }; -static int __devinit lmc_init_one(struct pci_dev *pdev, -				  const struct pci_device_id *ent) +static int lmc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	lmc_softc_t *sc;  	struct net_device *dev; @@ -975,7 +972,6 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,      return 0;  err_hdlcdev: -	pci_set_drvdata(pdev, NULL);  	kfree(sc);  err_kzalloc:  	pci_release_regions(pdev); @@ -987,7 +983,7 @@ err_req_io:  /*   * Called from pci when removing module.   */ -static void __devexit lmc_remove_one(struct pci_dev *pdev) +static void lmc_remove_one(struct pci_dev *pdev)  {  	struct net_device *dev = pci_get_drvdata(pdev); @@ -997,7 +993,6 @@ static void __devexit lmc_remove_one(struct pci_dev *pdev)  		free_netdev(dev);  		pci_release_regions(pdev);  		pci_disable_device(pdev); -		pci_set_drvdata(pdev, NULL);  	}  } @@ -1121,7 +1116,7 @@ static void lmc_running_reset (struct net_device *dev) /*fold00*/  {      lmc_softc_t *sc = dev_to_sc(dev); -    lmc_trace(dev, "lmc_runnig_reset in"); +    lmc_trace(dev, "lmc_running_reset in");      /* stop interrupts */      /* Clear the interrupt mask */ @@ -1734,21 +1729,10 @@ static struct pci_driver lmc_driver = {  	.name		= "lmc",  	.id_table	= lmc_pci_tbl,  	.probe		= lmc_init_one, -	.remove		= __devexit_p(lmc_remove_one), +	.remove		= lmc_remove_one,  }; -static int __init init_lmc(void) -{ -    return pci_register_driver(&lmc_driver); -} - -static void __exit exit_lmc(void) -{ -    pci_unregister_driver(&lmc_driver); -} - -module_init(init_lmc); -module_exit(exit_lmc); +module_pci_driver(lmc_driver);  unsigned lmc_mii_readreg (lmc_softc_t * const sc, unsigned devaddr, unsigned regno) /*fold00*/  { @@ -2139,7 +2123,7 @@ bug_out:      spin_unlock_irqrestore(&sc->lmc_lock, flags); -    lmc_trace(dev, "lmc_driver_timout out"); +    lmc_trace(dev, "lmc_driver_timeout out");  } diff --git a/drivers/net/wan/lmc/lmc_var.h b/drivers/net/wan/lmc/lmc_var.h index 65d01978e78..a1d202d8ad6 100644 --- a/drivers/net/wan/lmc/lmc_var.h +++ b/drivers/net/wan/lmc/lmc_var.h @@ -180,7 +180,7 @@ struct lmc___ctl {  /* - * Carefull, look at the data sheet, there's more to this + * Careful, look at the data sheet, there's more to this   * structure than meets the eye.  It should probably be:   *   * struct tulip_desc_t { @@ -380,7 +380,7 @@ struct lmc___softc {  /* CSR6 settings */  #define OPERATION_MODE  0x00000200 /* Full Duplex      */  #define PROMISC_MODE    0x00000040 /* Promiscuous Mode */ -#define RECIEVE_ALL     0x40000000 /* Recieve All      */ +#define RECEIVE_ALL     0x40000000 /* Receive All      */  #define PASS_BAD_FRAMES 0x00000008 /* Pass Bad Frames  */  /* Dec control registers  CSR6 as well */ @@ -398,7 +398,7 @@ struct lmc___softc {  #define TULIP_CMD_RECEIVEALL    0x40000000L /* (RW)  Receivel all frames? */  #define TULIP_CMD_MUSTBEONE     0x02000000L /* (RW)  Must Be One (21140) */  #define TULIP_CMD_TXTHRSHLDCTL  0x00400000L /* (RW)  Transmit Threshold Mode (21140) */ -#define TULIP_CMD_STOREFWD      0x00200000L /* (RW)  Store and Foward (21140) */ +#define TULIP_CMD_STOREFWD      0x00200000L /* (RW)  Store and Forward (21140) */  #define TULIP_CMD_NOHEARTBEAT   0x00080000L /* (RW)  No Heartbeat (21140) */  #define TULIP_CMD_PORTSELECT    0x00040000L /* (RW)  Post Select (100Mb) (21140) */  #define TULIP_CMD_FULLDUPLEX    0x00000200L /* (RW)  Full Duplex Mode */ diff --git a/drivers/net/wan/n2.c b/drivers/net/wan/n2.c index 17d408fe693..315bf09d6a2 100644 --- a/drivers/net/wan/n2.c +++ b/drivers/net/wan/n2.c @@ -16,6 +16,8 @@   *    SDL Inc. PPP/HDLC/CISCO driver   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/capability.h> @@ -341,57 +343,55 @@ static int __init n2_run(unsigned long io, unsigned long irq,  	int i;  	if (io < 0x200 || io > 0x3FF || (io % N2_IOPORTS) != 0) { -		printk(KERN_ERR "n2: invalid I/O port value\n"); +		pr_err("invalid I/O port value\n");  		return -ENODEV;  	}  	if (irq < 3 || irq > 15 || irq == 6) /* FIXME */ { -		printk(KERN_ERR "n2: invalid IRQ value\n"); +		pr_err("invalid IRQ value\n");  		return -ENODEV;  	}  	if (winbase < 0xA0000 || winbase > 0xFFFFF || (winbase & 0xFFF) != 0) { -		printk(KERN_ERR "n2: invalid RAM value\n"); +		pr_err("invalid RAM value\n");  		return -ENODEV;  	}  	card = kzalloc(sizeof(card_t), GFP_KERNEL); -	if (card == NULL) { -		printk(KERN_ERR "n2: unable to allocate memory\n"); +	if (card == NULL)  		return -ENOBUFS; -	}  	card->ports[0].dev = alloc_hdlcdev(&card->ports[0]);  	card->ports[1].dev = alloc_hdlcdev(&card->ports[1]);  	if (!card->ports[0].dev || !card->ports[1].dev) { -		printk(KERN_ERR "n2: unable to allocate memory\n"); +		pr_err("unable to allocate memory\n");  		n2_destroy_card(card);  		return -ENOMEM;  	}  	if (!request_region(io, N2_IOPORTS, devname)) { -		printk(KERN_ERR "n2: I/O port region in use\n"); +		pr_err("I/O port region in use\n");  		n2_destroy_card(card);  		return -EBUSY;  	}  	card->io = io;  	if (request_irq(irq, sca_intr, 0, devname, card)) { -		printk(KERN_ERR "n2: could not allocate IRQ\n"); +		pr_err("could not allocate IRQ\n");  		n2_destroy_card(card);  		return -EBUSY;  	}  	card->irq = irq;  	if (!request_mem_region(winbase, USE_WINDOWSIZE, devname)) { -		printk(KERN_ERR "n2: could not request RAM window\n"); +		pr_err("could not request RAM window\n");  		n2_destroy_card(card);  		return -EBUSY;  	}  	card->phy_winbase = winbase;  	card->winbase = ioremap(winbase, USE_WINDOWSIZE);  	if (!card->winbase) { -		printk(KERN_ERR "n2: ioremap() failed\n"); +		pr_err("ioremap() failed\n");  		n2_destroy_card(card);  		return -EFAULT;  	} @@ -413,7 +413,7 @@ static int __init n2_run(unsigned long io, unsigned long irq,  		break;  	default: -		printk(KERN_ERR "n2: invalid window size\n"); +		pr_err("invalid window size\n");  		n2_destroy_card(card);  		return -ENODEV;  	} @@ -433,12 +433,12 @@ static int __init n2_run(unsigned long io, unsigned long irq,  	card->buff_offset = (valid0 + valid1) * sizeof(pkt_desc) *  		(card->tx_ring_buffers + card->rx_ring_buffers); -	printk(KERN_INFO "n2: RISCom/N2 %u KB RAM, IRQ%u, " -	       "using %u TX + %u RX packets rings\n", card->ram_size / 1024, -	       card->irq, card->tx_ring_buffers, card->rx_ring_buffers); +	pr_info("RISCom/N2 %u KB RAM, IRQ%u, using %u TX + %u RX packets rings\n", +		card->ram_size / 1024, card->irq, +		card->tx_ring_buffers, card->rx_ring_buffers);  	if (card->tx_ring_buffers < 1) { -		printk(KERN_ERR "n2: RAM test failed\n"); +		pr_err("RAM test failed\n");  		n2_destroy_card(card);  		return -EIO;  	} @@ -474,16 +474,14 @@ static int __init n2_run(unsigned long io, unsigned long irq,  		port->card = card;  		if (register_hdlc_device(dev)) { -			printk(KERN_WARNING "n2: unable to register hdlc " -			       "device\n"); +			pr_warn("unable to register hdlc device\n");  			port->card = NULL;  			n2_destroy_card(card);  			return -ENOBUFS;  		}  		sca_init_port(port); /* Set up SCA memory */ -		printk(KERN_INFO "%s: RISCom/N2 node %d\n", -		       dev->name, port->phy_node); +		netdev_info(dev, "RISCom/N2 node %d\n", port->phy_node);  	}  	*new_card = card; @@ -498,12 +496,12 @@ static int __init n2_init(void)  {  	if (hw==NULL) {  #ifdef MODULE -		printk(KERN_INFO "n2: no card initialized\n"); +		pr_info("no card initialized\n");  #endif  		return -EINVAL;	/* no parameters specified, abort */  	} -	printk(KERN_INFO "%s\n", version); +	pr_info("%s\n", version);  	do {  		unsigned long io, irq, ram; @@ -541,7 +539,7 @@ static int __init n2_init(void)  			return first_card ? 0 : -EINVAL;  	}while(*hw++ == ':'); -	printk(KERN_ERR "n2: invalid hardware parameters\n"); +	pr_err("invalid hardware parameters\n");  	return first_card ? 0 : -EINVAL;  } diff --git a/drivers/net/wan/pc300-falc-lh.h b/drivers/net/wan/pc300-falc-lh.h deleted file mode 100644 index 01ed23ca76c..00000000000 --- a/drivers/net/wan/pc300-falc-lh.h +++ /dev/null @@ -1,1238 +0,0 @@ -/* - * falc.h	Description of the Siemens FALC T1/E1 framer. - * - * Author:	Ivan Passos <ivan@cyclades.com> - * - * Copyright:	(c) 2000-2001 Cyclades Corp. - * - *	This program is free software; you can redistribute it and/or - *	modify it under the terms of the GNU General Public License - *	as published by the Free Software Foundation; either version - *	2 of the License, or (at your option) any later version. - * - * $Log: falc-lh.h,v $ - * Revision 3.1  2001/06/15 12:41:10  regina - * upping major version number - * - * Revision 1.1.1.1  2001/06/13 20:24:47  daniela - * PC300 initial CVS version (3.4.0-pre1) - * - * Revision 1.1 2000/05/15 ivan - * Included DJA bits for the LIM2 register. - * - * Revision 1.0 2000/02/22 ivan - * Initial version. - * - */ - -#ifndef _FALC_LH_H -#define _FALC_LH_H - -#define NUM_OF_T1_CHANNELS	24 -#define NUM_OF_E1_CHANNELS	32 - -/*>>>>>>>>>>>>>>>>>  FALC Register Bits (Transmit Mode)  <<<<<<<<<<<<<<<<<<< */ - -/* CMDR (Command Register) -   ---------------- E1 & T1 ------------------------------ */ -#define CMDR_RMC	0x80 -#define CMDR_RRES	0x40 -#define CMDR_XREP	0x20 -#define CMDR_XRES	0x10 -#define CMDR_XHF	0x08 -#define CMDR_XTF	0x04 -#define CMDR_XME	0x02 -#define CMDR_SRES	0x01 - -/* MODE (Mode Register) -   ----------------- E1 & T1 ----------------------------- */ -#define MODE_MDS2	0x80 -#define MODE_MDS1	0x40 -#define MODE_MDS0	0x20 -#define MODE_BRAC	0x10 -#define MODE_HRAC	0x08 - -/* IPC (Interrupt Port Configuration) -   ----------------- E1 & T1 ----------------------------- */ -#define IPC_VIS		0x80 -#define IPC_SCI		0x04 -#define IPC_IC1		0x02 -#define IPC_IC0		0x01 - -/* CCR1 (Common Configuration Register 1) -   ----------------- E1 & T1 ----------------------------- */ -#define CCR1_SFLG       0x80 -#define CCR1_XTS16RA    0x40 -#define CCR1_BRM        0x40 -#define CCR1_CASSYM     0x20 -#define CCR1_EDLX       0x20 -#define CCR1_EITS       0x10 -#define CCR1_ITF        0x08 -#define CCR1_RFT1       0x02 -#define CCR1_RFT0       0x01 - -/* CCR3 (Common Configuration Register 3) -   ---------------- E1 & T1 ------------------------------ */ - -#define CCR3_PRE1       0x80 -#define CCR3_PRE0       0x40 -#define CCR3_EPT        0x20 -#define CCR3_RADD       0x10 -#define CCR3_RCRC       0x04 -#define CCR3_XCRC       0x02 - - -/* RTR1-4 (Receive Timeslot Register 1-4) -   ---------------- E1 & T1 ------------------------------ */ - -#define RTR1_TS0        0x80 -#define RTR1_TS1        0x40 -#define RTR1_TS2        0x20 -#define RTR1_TS3        0x10 -#define RTR1_TS4        0x08 -#define RTR1_TS5        0x04 -#define RTR1_TS6        0x02 -#define RTR1_TS7        0x01 - -#define RTR2_TS8        0x80 -#define RTR2_TS9        0x40 -#define RTR2_TS10       0x20 -#define RTR2_TS11       0x10 -#define RTR2_TS12       0x08 -#define RTR2_TS13       0x04 -#define RTR2_TS14       0x02 -#define RTR2_TS15       0x01 - -#define RTR3_TS16       0x80 -#define RTR3_TS17       0x40 -#define RTR3_TS18       0x20 -#define RTR3_TS19       0x10 -#define RTR3_TS20       0x08 -#define RTR3_TS21       0x04 -#define RTR3_TS22       0x02 -#define RTR3_TS23       0x01 - -#define RTR4_TS24       0x80 -#define RTR4_TS25       0x40 -#define RTR4_TS26       0x20 -#define RTR4_TS27       0x10 -#define RTR4_TS28       0x08 -#define RTR4_TS29       0x04 -#define RTR4_TS30       0x02 -#define RTR4_TS31       0x01 - - -/* TTR1-4 (Transmit Timeslot Register 1-4) -   ---------------- E1 & T1 ------------------------------ */ - -#define TTR1_TS0        0x80 -#define TTR1_TS1        0x40 -#define TTR1_TS2        0x20 -#define TTR1_TS3        0x10 -#define TTR1_TS4        0x08 -#define TTR1_TS5        0x04 -#define TTR1_TS6        0x02 -#define TTR1_TS7        0x01 - -#define TTR2_TS8        0x80 -#define TTR2_TS9        0x40 -#define TTR2_TS10       0x20 -#define TTR2_TS11       0x10 -#define TTR2_TS12       0x08 -#define TTR2_TS13       0x04 -#define TTR2_TS14       0x02 -#define TTR2_TS15       0x01 - -#define TTR3_TS16       0x80 -#define TTR3_TS17       0x40 -#define TTR3_TS18       0x20 -#define TTR3_TS19       0x10 -#define TTR3_TS20       0x08 -#define TTR3_TS21       0x04 -#define TTR3_TS22       0x02 -#define TTR3_TS23       0x01 - -#define TTR4_TS24       0x80 -#define TTR4_TS25       0x40 -#define TTR4_TS26       0x20 -#define TTR4_TS27       0x10 -#define TTR4_TS28       0x08 -#define TTR4_TS29       0x04 -#define TTR4_TS30       0x02 -#define TTR4_TS31       0x01 - - - -/* IMR0-4 (Interrupt Mask Register 0-4) - -   ----------------- E1 & T1 ----------------------------- */ - -#define IMR0_RME        0x80 -#define IMR0_RFS        0x40 -#define IMR0_T8MS       0x20 -#define IMR0_ISF        0x20 -#define IMR0_RMB        0x10 -#define IMR0_CASC       0x08 -#define IMR0_RSC        0x08 -#define IMR0_CRC6       0x04 -#define IMR0_CRC4       0x04 -#define IMR0_PDEN	0x02 -#define IMR0_RPF        0x01 - -#define IMR1_CASE       0x80 -#define IMR1_RDO        0x40 -#define IMR1_ALLS       0x20 -#define IMR1_XDU        0x10 -#define IMR1_XMB        0x08 -#define IMR1_XLSC       0x02 -#define IMR1_XPR        0x01 -#define IMR1_LLBSC	0x80 - -#define IMR2_FAR        0x80 -#define IMR2_LFA        0x40 -#define IMR2_MFAR       0x20 -#define IMR2_T400MS     0x10 -#define IMR2_LMFA       0x10 -#define IMR2_AIS        0x08 -#define IMR2_LOS        0x04 -#define IMR2_RAR        0x02 -#define IMR2_RA         0x01 - -#define IMR3_ES         0x80 -#define IMR3_SEC        0x40 -#define IMR3_LMFA16     0x20 -#define IMR3_AIS16      0x10 -#define IMR3_RA16       0x08 -#define IMR3_API        0x04 -#define IMR3_XSLP       0x20 -#define IMR3_XSLN       0x10 -#define IMR3_LLBSC      0x08 -#define IMR3_XRS        0x04 -#define IMR3_SLN        0x02 -#define IMR3_SLP        0x01 - -#define IMR4_LFA        0x80 -#define IMR4_FER        0x40 -#define IMR4_CER        0x20 -#define IMR4_AIS        0x10 -#define IMR4_LOS        0x08 -#define IMR4_CVE        0x04 -#define IMR4_SLIP       0x02 -#define IMR4_EBE        0x01 - -/* FMR0-5 for E1 and T1  (Framer Mode Register ) */ - -#define FMR0_XC1        0x80 -#define FMR0_XC0        0x40 -#define FMR0_RC1        0x20 -#define FMR0_RC0        0x10 -#define FMR0_EXTD       0x08 -#define FMR0_ALM        0x04 -#define E1_FMR0_FRS     0x02 -#define T1_FMR0_FRS     0x08 -#define FMR0_SRAF       0x04 -#define FMR0_EXLS       0x02 -#define FMR0_SIM        0x01 - -#define FMR1_MFCS       0x80 -#define FMR1_AFR        0x40 -#define FMR1_ENSA       0x20 -#define FMR1_CTM        0x80 -#define FMR1_SIGM       0x40 -#define FMR1_EDL        0x20 -#define FMR1_PMOD       0x10 -#define FMR1_XFS        0x08 -#define FMR1_CRC        0x08 -#define FMR1_ECM        0x04 -#define FMR1_IMOD       0x02 -#define FMR1_XAIS       0x01 - -#define FMR2_RFS1       0x80 -#define FMR2_RFS0       0x40 -#define FMR2_MCSP	0x40 -#define FMR2_RTM        0x20 -#define FMR2_SSP        0x20 -#define FMR2_DAIS       0x10 -#define FMR2_SAIS       0x08 -#define FMR2_PLB        0x04 -#define FMR2_AXRA       0x02 -#define FMR2_ALMF       0x01 -#define FMR2_EXZE       0x01 - -#define LOOP_RTM	0x40 -#define LOOP_SFM	0x40 -#define LOOP_ECLB	0x20 -#define LOOP_CLA	0x1f - -/*--------------------- E1 ----------------------------*/ -#define FMR3_XLD	0x20 -#define FMR3_XLU	0x10 - -/*--------------------- T1 ----------------------------*/ -#define FMR4_AIS3       0x80 -#define FMR4_TM         0x40 -#define FMR4_XRA        0x20 -#define FMR4_SSC1       0x10 -#define FMR4_SSC0       0x08 -#define FMR4_AUTO       0x04 -#define FMR4_FM1        0x02 -#define FMR4_FM0        0x01 - -#define FMR5_SRS        0x80 -#define FMR5_EIBR       0x40 -#define FMR5_XLD        0x20 -#define FMR5_XLU        0x10 - - -/* LOOP (Channel Loop Back) - -   ------------------ E1 & T1 ---------------------------- */ - -#define LOOP_SFM        0x40 -#define LOOP_ECLB       0x20 -#define LOOP_CLA4       0x10 -#define LOOP_CLA3       0x08 -#define LOOP_CLA2       0x04 -#define LOOP_CLA1       0x02 -#define LOOP_CLA0       0x01 - - - -/* XSW (Transmit Service Word Pulseframe) - -   ------------------- E1 --------------------------- */ - -#define XSW_XSIS        0x80 -#define XSW_XTM         0x40 -#define XSW_XRA         0x20 -#define XSW_XY0         0x10 -#define XSW_XY1         0x08 -#define XSW_XY2         0x04 -#define XSW_XY3         0x02 -#define XSW_XY4         0x01 - - -/* XSP (Transmit Spare Bits) - -   ------------------- E1 --------------------------- */ - -#define XSP_XAP         0x80 -#define XSP_CASEN       0x40 -#define XSP_TT0         0x20 -#define XSP_EBP         0x10 -#define XSP_AXS         0x08 -#define XSP_XSIF        0x04 -#define XSP_XS13        0x02 -#define XSP_XS15        0x01 - - -/* XC0/1 (Transmit Control 0/1) -   ------------------ E1 & T1 ---------------------------- */ - -#define XC0_SA8E        0x80 -#define XC0_SA7E        0x40 -#define XC0_SA6E        0x20 -#define XC0_SA5E        0x10 -#define XC0_SA4E        0x08 -#define XC0_BRM         0x80 -#define XC0_MFBS        0x40 -#define XC0_SFRZ        0x10 -#define XC0_XCO2        0x04 -#define XC0_XCO1        0x02 -#define XC0_XCO0        0x01 - -#define XC1_XTO5        0x20 -#define XC1_XTO4        0x10 -#define XC1_XTO3        0x08 -#define XC1_XTO2        0x04 -#define XC1_XTO1        0x02 -#define XC1_XTO0        0x01 - - -/* RC0/1 (Receive Control 0/1) -   ------------------ E1 & T1 ---------------------------- */ - -#define RC0_SICS        0x40 -#define RC0_CRCI        0x20 -#define RC0_XCRCI       0x10 -#define RC0_RDIS        0x08 -#define RC0_RCO2        0x04 -#define RC0_RCO1        0x02 -#define RC0_RCO0        0x01 - -#define RC1_SWD         0x80 -#define RC1_ASY4        0x40 -#define RC1_RRAM        0x40 -#define RC1_RTO5        0x20 -#define RC1_RTO4        0x10 -#define RC1_RTO3        0x08 -#define RC1_RTO2        0x04 -#define RC1_RTO1        0x02 -#define RC1_RTO0        0x01 - - - -/* XPM0-2 (Transmit Pulse Mask 0-2) -   --------------------- E1 & T1 ------------------------- */ - -#define XPM0_XP12       0x80 -#define XPM0_XP11       0x40 -#define XPM0_XP10       0x20 -#define XPM0_XP04       0x10 -#define XPM0_XP03       0x08 -#define XPM0_XP02       0x04 -#define XPM0_XP01       0x02 -#define XPM0_XP00       0x01 - -#define XPM1_XP30       0x80 -#define XPM1_XP24       0x40 -#define XPM1_XP23       0x20 -#define XPM1_XP22       0x10 -#define XPM1_XP21       0x08 -#define XPM1_XP20       0x04 -#define XPM1_XP14       0x02 -#define XPM1_XP13       0x01 - -#define XPM2_XLHP       0x80 -#define XPM2_XLT        0x40 -#define XPM2_DAXLT      0x20 -#define XPM2_XP34       0x08 -#define XPM2_XP33       0x04 -#define XPM2_XP32       0x02 -#define XPM2_XP31       0x01 - - -/* TSWM (Transparent Service Word Mask) -   ------------------ E1 ---------------------------- */ - -#define TSWM_TSIS       0x80 -#define TSWM_TSIF       0x40 -#define TSWM_TRA        0x20 -#define TSWM_TSA4       0x10 -#define TSWM_TSA5       0x08 -#define TSWM_TSA6       0x04 -#define TSWM_TSA7       0x02 -#define TSWM_TSA8       0x01 - -/* IDLE <Idle Channel Code Register> - -   ------------------ E1 & T1 ----------------------- */ - -#define IDLE_IDL7       0x80 -#define IDLE_IDL6       0x40 -#define IDLE_IDL5       0x20 -#define IDLE_IDL4       0x10 -#define IDLE_IDL3       0x08 -#define IDLE_IDL2       0x04 -#define IDLE_IDL1       0x02 -#define IDLE_IDL0       0x01 - - -/* XSA4-8 <Transmit SA4-8 Register(Read/Write) > -   -------------------E1 ----------------------------- */ - -#define XSA4_XS47       0x80 -#define XSA4_XS46       0x40 -#define XSA4_XS45       0x20 -#define XSA4_XS44       0x10 -#define XSA4_XS43       0x08 -#define XSA4_XS42       0x04 -#define XSA4_XS41       0x02 -#define XSA4_XS40       0x01 - -#define XSA5_XS57       0x80 -#define XSA5_XS56       0x40 -#define XSA5_XS55       0x20 -#define XSA5_XS54       0x10 -#define XSA5_XS53       0x08 -#define XSA5_XS52       0x04 -#define XSA5_XS51       0x02 -#define XSA5_XS50       0x01 - -#define XSA6_XS67       0x80 -#define XSA6_XS66       0x40 -#define XSA6_XS65       0x20 -#define XSA6_XS64       0x10 -#define XSA6_XS63       0x08 -#define XSA6_XS62       0x04 -#define XSA6_XS61       0x02 -#define XSA6_XS60       0x01 - -#define XSA7_XS77       0x80 -#define XSA7_XS76       0x40 -#define XSA7_XS75       0x20 -#define XSA7_XS74       0x10 -#define XSA7_XS73       0x08 -#define XSA7_XS72       0x04 -#define XSA7_XS71       0x02 -#define XSA7_XS70       0x01 - -#define XSA8_XS87       0x80 -#define XSA8_XS86       0x40 -#define XSA8_XS85       0x20 -#define XSA8_XS84       0x10 -#define XSA8_XS83       0x08 -#define XSA8_XS82       0x04 -#define XSA8_XS81       0x02 -#define XSA8_XS80       0x01 - - -/* XDL1-3 (Transmit DL-Bit Register1-3 (read/write)) -   ----------------------- T1 --------------------- */ - -#define XDL1_XDL17      0x80 -#define XDL1_XDL16      0x40 -#define XDL1_XDL15      0x20 -#define XDL1_XDL14      0x10 -#define XDL1_XDL13      0x08 -#define XDL1_XDL12      0x04 -#define XDL1_XDL11      0x02 -#define XDL1_XDL10      0x01 - -#define XDL2_XDL27      0x80 -#define XDL2_XDL26      0x40 -#define XDL2_XDL25      0x20 -#define XDL2_XDL24      0x10 -#define XDL2_XDL23      0x08 -#define XDL2_XDL22      0x04 -#define XDL2_XDL21      0x02 -#define XDL2_XDL20      0x01 - -#define XDL3_XDL37      0x80 -#define XDL3_XDL36      0x40 -#define XDL3_XDL35      0x20 -#define XDL3_XDL34      0x10 -#define XDL3_XDL33      0x08 -#define XDL3_XDL32      0x04 -#define XDL3_XDL31      0x02 -#define XDL3_XDL30      0x01 - - -/* ICB1-4 (Idle Channel Register 1-4) -   ------------------ E1 ---------------------------- */ - -#define E1_ICB1_IC0	0x80 -#define E1_ICB1_IC1	0x40 -#define E1_ICB1_IC2	0x20 -#define E1_ICB1_IC3	0x10 -#define E1_ICB1_IC4	0x08 -#define E1_ICB1_IC5	0x04 -#define E1_ICB1_IC6	0x02 -#define E1_ICB1_IC7	0x01 - -#define E1_ICB2_IC8	0x80 -#define E1_ICB2_IC9	0x40 -#define E1_ICB2_IC10	0x20 -#define E1_ICB2_IC11	0x10 -#define E1_ICB2_IC12	0x08 -#define E1_ICB2_IC13	0x04 -#define E1_ICB2_IC14	0x02 -#define E1_ICB2_IC15	0x01 - -#define E1_ICB3_IC16	0x80 -#define E1_ICB3_IC17	0x40 -#define E1_ICB3_IC18	0x20 -#define E1_ICB3_IC19	0x10 -#define E1_ICB3_IC20	0x08 -#define E1_ICB3_IC21	0x04 -#define E1_ICB3_IC22	0x02 -#define E1_ICB3_IC23	0x01 - -#define E1_ICB4_IC24	0x80 -#define E1_ICB4_IC25	0x40 -#define E1_ICB4_IC26	0x20 -#define E1_ICB4_IC27	0x10 -#define E1_ICB4_IC28	0x08 -#define E1_ICB4_IC29	0x04 -#define E1_ICB4_IC30	0x02 -#define E1_ICB4_IC31	0x01 - -/* ICB1-4 (Idle Channel Register 1-4) -   ------------------ T1 ---------------------------- */ - -#define T1_ICB1_IC1	0x80 -#define T1_ICB1_IC2	0x40 -#define T1_ICB1_IC3	0x20 -#define T1_ICB1_IC4	0x10 -#define T1_ICB1_IC5	0x08 -#define T1_ICB1_IC6	0x04 -#define T1_ICB1_IC7	0x02 -#define T1_ICB1_IC8	0x01 - -#define T1_ICB2_IC9	0x80 -#define T1_ICB2_IC10	0x40 -#define T1_ICB2_IC11	0x20 -#define T1_ICB2_IC12	0x10 -#define T1_ICB2_IC13	0x08 -#define T1_ICB2_IC14	0x04 -#define T1_ICB2_IC15	0x02 -#define T1_ICB2_IC16	0x01 - -#define T1_ICB3_IC17	0x80 -#define T1_ICB3_IC18	0x40 -#define T1_ICB3_IC19	0x20 -#define T1_ICB3_IC20	0x10 -#define T1_ICB3_IC21	0x08 -#define T1_ICB3_IC22	0x04 -#define T1_ICB3_IC23	0x02 -#define T1_ICB3_IC24	0x01 - -/* FMR3 (Framer Mode Register 3) -   --------------------E1------------------------ */ - -#define FMR3_CMI        0x08 -#define FMR3_SYNSA      0x04 -#define FMR3_CFRZ       0x02 -#define FMR3_EXTIW      0x01 - - - -/* CCB1-3 (Clear Channel Register) -   ------------------- T1 ----------------------- */ - -#define CCB1_CH1        0x80 -#define CCB1_CH2        0x40 -#define CCB1_CH3        0x20 -#define CCB1_CH4        0x10 -#define CCB1_CH5        0x08 -#define CCB1_CH6        0x04 -#define CCB1_CH7        0x02 -#define CCB1_CH8        0x01 - -#define CCB2_CH9        0x80 -#define CCB2_CH10       0x40 -#define CCB2_CH11       0x20 -#define CCB2_CH12       0x10 -#define CCB2_CH13       0x08 -#define CCB2_CH14       0x04 -#define CCB2_CH15       0x02 -#define CCB2_CH16       0x01 - -#define CCB3_CH17       0x80 -#define CCB3_CH18       0x40 -#define CCB3_CH19       0x20 -#define CCB3_CH20       0x10 -#define CCB3_CH21       0x08 -#define CCB3_CH22       0x04 -#define CCB3_CH23       0x02 -#define CCB3_CH24       0x01 - - -/* LIM0/1 (Line Interface Mode 0/1) -   ------------------- E1 & T1 --------------------------- */ - -#define LIM0_XFB        0x80 -#define LIM0_XDOS       0x40 -#define LIM0_SCL1       0x20 -#define LIM0_SCL0       0x10 -#define LIM0_EQON       0x08 -#define LIM0_ELOS       0x04 -#define LIM0_LL         0x02 -#define LIM0_MAS        0x01 - -#define LIM1_EFSC       0x80 -#define LIM1_RIL2       0x40 -#define LIM1_RIL1       0x20 -#define LIM1_RIL0       0x10 -#define LIM1_DCOC       0x08 -#define LIM1_JATT       0x04 -#define LIM1_RL         0x02 -#define LIM1_DRS        0x01 - - -/* PCDR (Pulse Count Detection Register(Read/Write)) -   ------------------ E1 & T1 ------------------------- */ - -#define PCDR_PCD7	0x80 -#define PCDR_PCD6	0x40 -#define PCDR_PCD5	0x20 -#define PCDR_PCD4	0x10 -#define PCDR_PCD3	0x08 -#define PCDR_PCD2	0x04 -#define PCDR_PCD1	0x02 -#define PCDR_PCD0	0x01 - -#define PCRR_PCR7	0x80 -#define PCRR_PCR6	0x40 -#define PCRR_PCR5	0x20 -#define PCRR_PCR4	0x10 -#define PCRR_PCR3	0x08 -#define PCRR_PCR2	0x04 -#define PCRR_PCR1	0x02 -#define PCRR_PCR0	0x01 - - -/* LIM2 (Line Interface Mode 2) - -   ------------------ E1 & T1 ---------------------------- */ - -#define LIM2_DJA2	0x20 -#define LIM2_DJA1	0x10 -#define LIM2_LOS2	0x02 -#define LIM2_LOS1	0x01 - -/* LCR1 (Loop Code Register 1) */ - -#define LCR1_EPRM	0x80 -#define	LCR1_XPRBS	0x40 - -/* SIC1 (System Interface Control 1) */ -#define SIC1_SRSC	0x80 -#define SIC1_RBS1	0x20 -#define SIC1_RBS0	0x10 -#define SIC1_SXSC	0x08 -#define SIC1_XBS1	0x02 -#define SIC1_XBS0	0x01 - -/* DEC (Disable Error Counter) -   ------------------ E1 & T1 ---------------------------- */ - -#define DEC_DCEC3       0x20 -#define DEC_DBEC        0x10 -#define DEC_DCEC1       0x08 -#define DEC_DCEC        0x08 -#define DEC_DEBC        0x04 -#define DEC_DCVC        0x02 -#define DEC_DFEC        0x01 - - -/* FALC Register Bits (Receive Mode) -   ---------------------------------------------------------------------------- */ - - -/* FRS0/1 (Framer Receive Status Register 0/1) -   ----------------- E1 & T1 ---------------------------------- */ - -#define FRS0_LOS        0x80 -#define FRS0_AIS        0x40 -#define FRS0_LFA        0x20 -#define FRS0_RRA        0x10 -#define FRS0_API        0x08 -#define FRS0_NMF        0x04 -#define FRS0_LMFA       0x02 -#define FRS0_FSRF       0x01 - -#define FRS1_TS16RA     0x40 -#define FRS1_TS16LOS    0x20 -#define FRS1_TS16AIS    0x10 -#define FRS1_TS16LFA    0x08 -#define FRS1_EXZD       0x80 -#define FRS1_LLBDD      0x10 -#define FRS1_LLBAD      0x08 -#define FRS1_XLS        0x02 -#define FRS1_XLO        0x01 -#define FRS1_PDEN	0x40 - -/* FRS2/3 (Framer Receive Status Register 2/3) -   ----------------- T1 ---------------------------------- */ - -#define FRS2_ESC2       0x80 -#define FRS2_ESC1       0x40 -#define FRS2_ESC0       0x20 - -#define FRS3_FEH5       0x20 -#define FRS3_FEH4       0x10 -#define FRS3_FEH3       0x08 -#define FRS3_FEH2       0x04 -#define FRS3_FEH1       0x02 -#define FRS3_FEH0       0x01 - - -/* RSW (Receive Service Word Pulseframe) -   ----------------- E1 ------------------------------ */ - -#define RSW_RSI         0x80 -#define RSW_RRA         0x20 -#define RSW_RYO         0x10 -#define RSW_RY1         0x08 -#define RSW_RY2         0x04 -#define RSW_RY3         0x02 -#define RSW_RY4         0x01 - - -/* RSP (Receive Spare Bits / Additional Status) -   ---------------- E1 ------------------------------- */ - -#define RSP_SI1         0x80 -#define RSP_SI2         0x40 -#define RSP_LLBDD	0x10 -#define RSP_LLBAD	0x08 -#define RSP_RSIF        0x04 -#define RSP_RS13        0x02 -#define RSP_RS15        0x01 - - -/* FECL (Framing Error Counter) -   ---------------- E1 & T1 -------------------------- */ - -#define FECL_FE7        0x80 -#define FECL_FE6        0x40 -#define FECL_FE5        0x20 -#define FECL_FE4        0x10 -#define FECL_FE3        0x08 -#define FECL_FE2        0x04 -#define FECL_FE1        0x02 -#define FECL_FE0        0x01 - -#define FECH_FE15       0x80 -#define FECH_FE14       0x40 -#define FECH_FE13       0x20 -#define FECH_FE12       0x10 -#define FECH_FE11       0x08 -#define FECH_FE10       0x04 -#define FECH_FE9        0x02 -#define FECH_FE8        0x01 - - -/* CVCl (Code Violation Counter) -   ----------------- E1 ------------------------- */ - -#define CVCL_CV7        0x80 -#define CVCL_CV6        0x40 -#define CVCL_CV5        0x20 -#define CVCL_CV4        0x10 -#define CVCL_CV3        0x08 -#define CVCL_CV2        0x04 -#define CVCL_CV1        0x02 -#define CVCL_CV0        0x01 - -#define CVCH_CV15       0x80 -#define CVCH_CV14       0x40 -#define CVCH_CV13       0x20 -#define CVCH_CV12       0x10 -#define CVCH_CV11       0x08 -#define CVCH_CV10       0x04 -#define CVCH_CV9        0x02 -#define CVCH_CV8        0x01 - - -/* CEC1-3L (CRC Error Counter) -   ------------------ E1 ----------------------------- */ - -#define CEC1L_CR7       0x80 -#define CEC1L_CR6       0x40 -#define CEC1L_CR5       0x20 -#define CEC1L_CR4       0x10 -#define CEC1L_CR3       0x08 -#define CEC1L_CR2       0x04 -#define CEC1L_CR1       0x02 -#define CEC1L_CR0       0x01 - -#define CEC1H_CR15      0x80 -#define CEC1H_CR14      0x40 -#define CEC1H_CR13      0x20 -#define CEC1H_CR12      0x10 -#define CEC1H_CR11      0x08 -#define CEC1H_CR10      0x04 -#define CEC1H_CR9       0x02 -#define CEC1H_CR8       0x01 - -#define CEC2L_CR7       0x80 -#define CEC2L_CR6       0x40 -#define CEC2L_CR5       0x20 -#define CEC2L_CR4       0x10 -#define CEC2L_CR3       0x08 -#define CEC2L_CR2       0x04 -#define CEC2L_CR1       0x02 -#define CEC2L_CR0       0x01 - -#define CEC2H_CR15      0x80 -#define CEC2H_CR14      0x40 -#define CEC2H_CR13      0x20 -#define CEC2H_CR12      0x10 -#define CEC2H_CR11      0x08 -#define CEC2H_CR10      0x04 -#define CEC2H_CR9       0x02 -#define CEC2H_CR8       0x01 - -#define CEC3L_CR7       0x80 -#define CEC3L_CR6       0x40 -#define CEC3L_CR5       0x20 -#define CEC3L_CR4       0x10 -#define CEC3L_CR3       0x08 -#define CEC3L_CR2       0x04 -#define CEC3L_CR1       0x02 -#define CEC3L_CR0       0x01 - -#define CEC3H_CR15      0x80 -#define CEC3H_CR14      0x40 -#define CEC3H_CR13      0x20 -#define CEC3H_CR12      0x10 -#define CEC3H_CR11      0x08 -#define CEC3H_CR10      0x04 -#define CEC3H_CR9       0x02 -#define CEC3H_CR8       0x01 - - -/* CECL (CRC Error Counter) - -   ------------------ T1 ----------------------------- */ - -#define CECL_CR7        0x80 -#define CECL_CR6        0x40 -#define CECL_CR5        0x20 -#define CECL_CR4        0x10 -#define CECL_CR3        0x08 -#define CECL_CR2        0x04 -#define CECL_CR1        0x02 -#define CECL_CR0        0x01 - -#define CECH_CR15       0x80 -#define CECH_CR14       0x40 -#define CECH_CR13       0x20 -#define CECH_CR12       0x10 -#define CECH_CR11       0x08 -#define CECH_CR10       0x04 -#define CECH_CR9        0x02 -#define CECH_CR8        0x01 - -/* EBCL (E Bit Error Counter) -   ------------------- E1 & T1 ------------------------- */ - -#define EBCL_EB7        0x80 -#define EBCL_EB6        0x40 -#define EBCL_EB5        0x20 -#define EBCL_EB4        0x10 -#define EBCL_EB3        0x08 -#define EBCL_EB2        0x04 -#define EBCL_EB1        0x02 -#define EBCL_EB0        0x01 - -#define EBCH_EB15       0x80 -#define EBCH_EB14       0x40 -#define EBCH_EB13       0x20 -#define EBCH_EB12       0x10 -#define EBCH_EB11       0x08 -#define EBCH_EB10       0x04 -#define EBCH_EB9        0x02 -#define EBCH_EB8        0x01 - - -/* RSA4-8 (Receive Sa4-8-Bit Register) -   -------------------- E1 --------------------------- */ - -#define RSA4_RS47       0x80 -#define RSA4_RS46       0x40 -#define RSA4_RS45       0x20 -#define RSA4_RS44       0x10 -#define RSA4_RS43       0x08 -#define RSA4_RS42       0x04 -#define RSA4_RS41       0x02 -#define RSA4_RS40       0x01 - -#define RSA5_RS57       0x80 -#define RSA5_RS56       0x40 -#define RSA5_RS55       0x20 -#define RSA5_RS54       0x10 -#define RSA5_RS53       0x08 -#define RSA5_RS52       0x04 -#define RSA5_RS51       0x02 -#define RSA5_RS50       0x01 - -#define RSA6_RS67       0x80 -#define RSA6_RS66       0x40 -#define RSA6_RS65       0x20 -#define RSA6_RS64       0x10 -#define RSA6_RS63       0x08 -#define RSA6_RS62       0x04 -#define RSA6_RS61       0x02 -#define RSA6_RS60       0x01 - -#define RSA7_RS77       0x80 -#define RSA7_RS76       0x40 -#define RSA7_RS75       0x20 -#define RSA7_RS74       0x10 -#define RSA7_RS73       0x08 -#define RSA7_RS72       0x04 -#define RSA7_RS71       0x02 -#define RSA7_RS70       0x01 - -#define RSA8_RS87       0x80 -#define RSA8_RS86       0x40 -#define RSA8_RS85       0x20 -#define RSA8_RS84       0x10 -#define RSA8_RS83       0x08 -#define RSA8_RS82       0x04 -#define RSA8_RS81       0x02 -#define RSA8_RS80       0x01 - -/* RSA6S (Receive Sa6 Bit Status Register) -   ------------------------ T1 ------------------------- */ - -#define RSA6S_SX        0x20 -#define RSA6S_SF        0x10 -#define RSA6S_SE        0x08 -#define RSA6S_SC        0x04 -#define RSA6S_SA        0x02 -#define RSA6S_S8        0x01 - - -/* RDL1-3 Receive DL-Bit Register1-3) -   ------------------------ T1 ------------------------- */ - -#define RDL1_RDL17      0x80 -#define RDL1_RDL16      0x40 -#define RDL1_RDL15      0x20 -#define RDL1_RDL14      0x10 -#define RDL1_RDL13      0x08 -#define RDL1_RDL12      0x04 -#define RDL1_RDL11      0x02 -#define RDL1_RDL10      0x01 - -#define RDL2_RDL27      0x80 -#define RDL2_RDL26      0x40 -#define RDL2_RDL25      0x20 -#define RDL2_RDL24      0x10 -#define RDL2_RDL23      0x08 -#define RDL2_RDL22      0x04 -#define RDL2_RDL21      0x02 -#define RDL2_RDL20      0x01 - -#define RDL3_RDL37      0x80 -#define RDL3_RDL36      0x40 -#define RDL3_RDL35      0x20 -#define RDL3_RDL34      0x10 -#define RDL3_RDL33      0x08 -#define RDL3_RDL32      0x04 -#define RDL3_RDL31      0x02 -#define RDL3_RDL30      0x01 - - -/* SIS (Signaling Status Register) - -   -------------------- E1 & T1 -------------------------- */ - -#define SIS_XDOV        0x80 -#define SIS_XFW         0x40 -#define SIS_XREP        0x20 -#define SIS_RLI         0x08 -#define SIS_CEC         0x04 -#define SIS_BOM         0x01 - - -/* RSIS (Receive Signaling Status Register) - -   -------------------- E1 & T1 --------------------------- */ - -#define RSIS_VFR        0x80 -#define RSIS_RDO        0x40 -#define RSIS_CRC16      0x20 -#define RSIS_RAB        0x10 -#define RSIS_HA1        0x08 -#define RSIS_HA0        0x04 -#define RSIS_HFR        0x02 -#define RSIS_LA         0x01 - - -/* RBCL/H (Receive Byte Count Low/High) - -   ------------------- E1 & T1 ----------------------- */ - -#define RBCL_RBC7       0x80 -#define RBCL_RBC6       0x40 -#define RBCL_RBC5       0x20 -#define RBCL_RBC4       0x10 -#define RBCL_RBC3       0x08 -#define RBCL_RBC2       0x04 -#define RBCL_RBC1       0x02 -#define RBCL_RBC0       0x01 - -#define RBCH_OV         0x10 -#define RBCH_RBC11      0x08 -#define RBCH_RBC10      0x04 -#define RBCH_RBC9       0x02 -#define RBCH_RBC8       0x01 - - -/* ISR1-3  (Interrupt Status Register 1-3) - -   ------------------ E1 & T1 ------------------------------ */ - -#define  FISR0_RME	0x80 -#define  FISR0_RFS	0x40 -#define  FISR0_T8MS	0x20 -#define  FISR0_ISF	0x20 -#define  FISR0_RMB	0x10 -#define  FISR0_CASC	0x08 -#define  FISR0_RSC	0x08 -#define  FISR0_CRC6	0x04 -#define  FISR0_CRC4	0x04 -#define  FISR0_PDEN	0x02 -#define  FISR0_RPF	0x01 - -#define  FISR1_CASE	0x80 -#define  FISR1_LLBSC	0x80 -#define  FISR1_RDO	0x40 -#define  FISR1_ALLS	0x20 -#define  FISR1_XDU	0x10 -#define  FISR1_XMB	0x08 -#define  FISR1_XLSC	0x02 -#define  FISR1_XPR	0x01 - -#define  FISR2_FAR	0x80 -#define  FISR2_LFA	0x40 -#define  FISR2_MFAR	0x20 -#define  FISR2_T400MS	0x10 -#define  FISR2_LMFA	0x10 -#define  FISR2_AIS	0x08 -#define  FISR2_LOS	0x04 -#define  FISR2_RAR	0x02 -#define  FISR2_RA	0x01 - -#define  FISR3_ES	0x80 -#define  FISR3_SEC	0x40 -#define  FISR3_LMFA16	0x20 -#define  FISR3_AIS16	0x10 -#define  FISR3_RA16	0x08 -#define  FISR3_API	0x04 -#define  FISR3_XSLP	0x20 -#define  FISR3_XSLN	0x10 -#define  FISR3_LLBSC	0x08 -#define  FISR3_XRS	0x04 -#define  FISR3_SLN	0x02 -#define  FISR3_SLP	0x01 - - -/* GIS  (Global Interrupt Status Register) - -   --------------------- E1 & T1 --------------------- */ - -#define  GIS_ISR3	0x08 -#define  GIS_ISR2	0x04 -#define  GIS_ISR1	0x02 -#define  GIS_ISR0	0x01 - - -/* VSTR  (Version Status Register) - -   --------------------- E1 & T1 --------------------- */ - -#define  VSTR_VN3	0x08 -#define  VSTR_VN2	0x04 -#define  VSTR_VN1	0x02 -#define  VSTR_VN0	0x01 - - -/*>>>>>>>>>>>>>>>>>>>>>  Local Control Structures  <<<<<<<<<<<<<<<<<<<<<<<<< */ - -/* Write-only Registers (E1/T1 control mode write registers) */ -#define XFIFOH	0x00		/* Tx FIFO High Byte */ -#define XFIFOL	0x01		/* Tx FIFO Low Byte */ -#define CMDR	0x02		/* Command Reg */ -#define DEC	0x60		/* Disable Error Counter */ -#define TEST2	0x62		/* Manuf. Test Reg 2 */ -#define XS(nbr)	(0x70 + (nbr))	/* Tx CAS Reg (0 to 15) */ - -/* Read-write Registers (E1/T1 status mode read registers) */ -#define MODE	0x03	/* Mode Reg */ -#define RAH1	0x04	/* Receive Address High 1 */ -#define RAH2	0x05	/* Receive Address High 2 */ -#define RAL1	0x06	/* Receive Address Low 1 */ -#define RAL2	0x07	/* Receive Address Low 2 */ -#define IPC	0x08	/* Interrupt Port Configuration */ -#define CCR1	0x09	/* Common Configuration Reg 1 */ -#define CCR3	0x0A	/* Common Configuration Reg 3 */ -#define PRE	0x0B	/* Preamble Reg */ -#define RTR1	0x0C	/* Receive Timeslot Reg 1 */ -#define RTR2	0x0D	/* Receive Timeslot Reg 2 */ -#define RTR3	0x0E	/* Receive Timeslot Reg 3 */ -#define RTR4	0x0F	/* Receive Timeslot Reg 4 */ -#define TTR1	0x10	/* Transmit Timeslot Reg 1 */ -#define TTR2	0x11	/* Transmit Timeslot Reg 2 */ -#define TTR3	0x12	/* Transmit Timeslot Reg 3 */ -#define TTR4	0x13	/* Transmit Timeslot Reg 4 */ -#define IMR0	0x14	/* Interrupt Mask Reg 0 */ -#define IMR1	0x15	/* Interrupt Mask Reg 1 */ -#define IMR2	0x16	/* Interrupt Mask Reg 2 */ -#define IMR3	0x17	/* Interrupt Mask Reg 3 */ -#define IMR4	0x18	/* Interrupt Mask Reg 4 */ -#define IMR5	0x19	/* Interrupt Mask Reg 5 */ -#define FMR0	0x1A	/* Framer Mode Reigster 0 */ -#define FMR1	0x1B	/* Framer Mode Reigster 1 */ -#define FMR2	0x1C	/* Framer Mode Reigster 2 */ -#define LOOP	0x1D	/* Channel Loop Back */ -#define XSW	0x1E	/* Transmit Service Word */ -#define FMR4	0x1E	/* Framer Mode Reg 4 */ -#define XSP	0x1F	/* Transmit Spare Bits */ -#define FMR5	0x1F	/* Framer Mode Reg 5 */ -#define XC0	0x20	/* Transmit Control 0 */ -#define XC1	0x21	/* Transmit Control 1 */ -#define RC0	0x22	/* Receive Control 0 */ -#define RC1	0x23	/* Receive Control 1 */ -#define XPM0	0x24	/* Transmit Pulse Mask 0 */ -#define XPM1	0x25	/* Transmit Pulse Mask 1 */ -#define XPM2	0x26	/* Transmit Pulse Mask 2 */ -#define TSWM	0x27	/* Transparent Service Word Mask */ -#define TEST1	0x28	/* Manuf. Test Reg 1 */ -#define IDLE	0x29	/* Idle Channel Code */ -#define XSA4    0x2A	/* Transmit SA4 Bit Reg */ -#define XDL1	0x2A	/* Transmit DL-Bit Reg 2 */ -#define XSA5    0x2B	/* Transmit SA4 Bit Reg */ -#define XDL2	0x2B	/* Transmit DL-Bit Reg 2 */ -#define XSA6    0x2C	/* Transmit SA4 Bit Reg */ -#define XDL3	0x2C	/* Transmit DL-Bit Reg 2 */ -#define XSA7    0x2D	/* Transmit SA4 Bit Reg */ -#define CCB1	0x2D	/* Clear Channel Reg 1 */ -#define XSA8    0x2E	/* Transmit SA4 Bit Reg */ -#define CCB2	0x2E	/* Clear Channel Reg 2 */ -#define FMR3	0x2F	/* Framer Mode Reg. 3 */ -#define CCB3	0x2F	/* Clear Channel Reg 3 */ -#define ICB1	0x30	/* Idle Channel Reg 1 */ -#define ICB2	0x31	/* Idle Channel Reg 2 */ -#define ICB3	0x32	/* Idle Channel Reg 3 */ -#define ICB4	0x33	/* Idle Channel Reg 4 */ -#define LIM0	0x34	/* Line Interface Mode 0 */ -#define LIM1	0x35	/* Line Interface Mode 1 */ -#define PCDR	0x36	/* Pulse Count Detection */ -#define PCRR	0x37	/* Pulse Count Recovery */ -#define LIM2	0x38	/* Line Interface Mode Reg 2 */ -#define LCR1	0x39	/* Loop Code Reg 1 */ -#define LCR2	0x3A	/* Loop Code Reg 2 */ -#define LCR3	0x3B	/* Loop Code Reg 3 */ -#define SIC1	0x3C	/* System Interface Control 1 */ - -/* Read-only Registers (E1/T1 control mode read registers) */ -#define RFIFOH	0x00		/* Receive FIFO */ -#define RFIFOL	0x01		/* Receive FIFO */ -#define FRS0	0x4C		/* Framer Receive Status 0 */ -#define FRS1	0x4D		/* Framer Receive Status 1 */ -#define RSW	0x4E		/* Receive Service Word */ -#define FRS2	0x4E		/* Framer Receive Status 2 */ -#define RSP	0x4F		/* Receive Spare Bits */ -#define FRS3	0x4F		/* Framer Receive Status 3 */ -#define FECL	0x50		/* Framing Error Counter */ -#define FECH	0x51		/* Framing Error Counter */ -#define CVCL	0x52		/* Code Violation Counter */ -#define CVCH	0x53		/* Code Violation Counter */ -#define CECL	0x54		/* CRC Error Counter 1 */ -#define CECH	0x55		/* CRC Error Counter 1 */ -#define EBCL	0x56		/* E-Bit Error Counter */ -#define EBCH	0x57		/* E-Bit Error Counter */ -#define BECL	0x58		/* Bit Error Counter Low */ -#define BECH	0x59		/* Bit Error Counter Low */ -#define CEC3	0x5A		/* CRC Error Counter 3 (16-bit) */ -#define RSA4	0x5C		/* Receive SA4 Bit Reg */ -#define RDL1	0x5C		/* Receive DL-Bit Reg 1 */ -#define RSA5	0x5D		/* Receive SA5 Bit Reg */ -#define RDL2	0x5D		/* Receive DL-Bit Reg 2 */ -#define RSA6	0x5E		/* Receive SA6 Bit Reg */ -#define RDL3	0x5E		/* Receive DL-Bit Reg 3 */ -#define RSA7	0x5F		/* Receive SA7 Bit Reg */ -#define RSA8	0x60		/* Receive SA8 Bit Reg */ -#define RSA6S	0x61		/* Receive SA6 Bit Status Reg */ -#define TSR0	0x62		/* Manuf. Test Reg 0 */ -#define TSR1	0x63		/* Manuf. Test Reg 1 */ -#define SIS	0x64		/* Signaling Status Reg */ -#define RSIS	0x65		/* Receive Signaling Status Reg */ -#define RBCL	0x66		/* Receive Byte Control */ -#define RBCH	0x67		/* Receive Byte Control */ -#define FISR0	0x68		/* Interrupt Status Reg 0 */ -#define FISR1	0x69		/* Interrupt Status Reg 1 */ -#define FISR2	0x6A		/* Interrupt Status Reg 2 */ -#define FISR3	0x6B		/* Interrupt Status Reg 3 */ -#define GIS	0x6E		/* Global Interrupt Status */ -#define VSTR	0x6F		/* Version Status */ -#define RS(nbr)	(0x70 + (nbr))	/* Rx CAS Reg (0 to 15) */ - -#endif	/* _FALC_LH_H */ - diff --git a/drivers/net/wan/pc300.h b/drivers/net/wan/pc300.h deleted file mode 100644 index 2e4f84f6cad..00000000000 --- a/drivers/net/wan/pc300.h +++ /dev/null @@ -1,436 +0,0 @@ -/* - * pc300.h	Cyclades-PC300(tm) Kernel API Definitions. - * - * Author:	Ivan Passos <ivan@cyclades.com> - * - * Copyright:	(c) 1999-2002 Cyclades Corp. - * - *	This program is free software; you can redistribute it and/or - *	modify it under the terms of the GNU General Public License - *	as published by the Free Software Foundation; either version - *	2 of the License, or (at your option) any later version. - * - * $Log: pc300.h,v $ - * Revision 3.12  2002/03/07 14:17:09  henrique - * License data fixed - * - * Revision 3.11  2002/01/28 21:09:39  daniela - * Included ';' after pc300hw.bus. - * - * Revision 3.10  2002/01/17 17:58:52  ivan - * Support for PC300-TE/M (PMC). - * - * Revision 3.9  2001/09/28 13:30:53  daniela - * Renamed dma_start routine to rx_dma_start. - * - * Revision 3.8  2001/09/24 13:03:45  daniela - * Fixed BOF interrupt treatment. Created dma_start routine. - * - * Revision 3.7  2001/08/10 17:19:58  daniela - * Fixed IOCTLs defines. - * - * Revision 3.6  2001/07/18 19:24:42  daniela - * Included kernel version. - * - * Revision 3.5  2001/07/05 18:38:08  daniela - * DMA transmission bug fix. - * - * Revision 3.4  2001/06/26 17:10:40  daniela - * New configuration parameters (line code, CRC calculation and clock). - * - * Revision 3.3  2001/06/22 13:13:02  regina - * MLPPP implementation - * - * Revision 3.2  2001/06/18 17:56:09  daniela - * Increased DEF_MTU and TX_QUEUE_LEN. - * - * Revision 3.1  2001/06/15 12:41:10  regina - * upping major version number - * - * Revision 1.1.1.1  2001/06/13 20:25:06  daniela - * PC300 initial CVS version (3.4.0-pre1) - * - * Revision 2.3 2001/03/05 daniela - * Created struct pc300conf, to provide the hardware information to pc300util. - * Inclusion of 'alloc_ramsize' field on structure 'pc300hw'. - *  - * Revision 2.2 2000/12/22 daniela - * Structures and defines to support pc300util: statistics, status,  - * loopback tests, trace. - *  - * Revision 2.1 2000/09/28 ivan - * Inclusion of 'iophys' and 'iosize' fields on structure 'pc300hw', to  - * allow release of I/O region at module unload. - * Changed location of include files. - * - * Revision 2.0 2000/03/27 ivan - * Added support for the PC300/TE cards. - * - * Revision 1.1 2000/01/31 ivan - * Replaced 'pc300[drv|sca].h' former PC300 driver include files. - * - * Revision 1.0 1999/12/16 ivan - * First official release. - * Inclusion of 'nchan' field on structure 'pc300hw', to allow variable  - * number of ports per card. - * Inclusion of 'if_ptr' field on structure 'pc300dev'. - * - * Revision 0.6 1999/11/17 ivan - * Changed X.25-specific function names to comply with adopted convention. - * - * Revision 0.5 1999/11/16 Daniela Squassoni - * X.25 support. - * - * Revision 0.4 1999/11/15 ivan - * Inclusion of 'clock' field on structure 'pc300hw'. - * - * Revision 0.3 1999/11/10 ivan - * IOCTL name changing. - * Inclusion of driver function prototypes. - * - * Revision 0.2 1999/11/03 ivan - * Inclusion of 'tx_skb' and union 'ifu' on structure 'pc300dev'. - * - * Revision 0.1 1999/01/15 ivan - * Initial version. - * - */ - -#ifndef	_PC300_H -#define	_PC300_H - -#include <linux/hdlc.h> -#include "hd64572.h" -#include "pc300-falc-lh.h" - -#define PC300_PROTO_MLPPP 1 - -#define	PC300_MAXCHAN	2	/* Number of channels per card */ - -#define	PC300_RAMSIZE	0x40000 /* RAM window size (256Kb) */ -#define	PC300_FALCSIZE	0x400	/* FALC window size (1Kb) */ - -#define PC300_OSC_CLOCK	24576000 -#define PC300_PCI_CLOCK	33000000 - -#define BD_DEF_LEN	0x0800	/* DMA buffer length (2KB) */ -#define DMA_TX_MEMSZ	0x8000	/* Total DMA Tx memory size (32KB/ch) */ -#define DMA_RX_MEMSZ	0x10000	/* Total DMA Rx memory size (64KB/ch) */ - -#define N_DMA_TX_BUF	(DMA_TX_MEMSZ / BD_DEF_LEN)	/* DMA Tx buffers */ -#define N_DMA_RX_BUF	(DMA_RX_MEMSZ / BD_DEF_LEN)	/* DMA Rx buffers */ - -/* DMA Buffer Offsets */ -#define DMA_TX_BASE	((N_DMA_TX_BUF + N_DMA_RX_BUF) *	\ -			 PC300_MAXCHAN * sizeof(pcsca_bd_t)) -#define DMA_RX_BASE	(DMA_TX_BASE + PC300_MAXCHAN*DMA_TX_MEMSZ) - -/* DMA Descriptor Offsets */ -#define DMA_TX_BD_BASE	0x0000 -#define DMA_RX_BD_BASE	(DMA_TX_BD_BASE + ((PC300_MAXCHAN*DMA_TX_MEMSZ / \ -				BD_DEF_LEN) * sizeof(pcsca_bd_t))) - -/* DMA Descriptor Macros */ -#define TX_BD_ADDR(chan, n)	(DMA_TX_BD_BASE + \ -				 ((N_DMA_TX_BUF*chan) + n) * sizeof(pcsca_bd_t)) -#define RX_BD_ADDR(chan, n)	(DMA_RX_BD_BASE + \ -				 ((N_DMA_RX_BUF*chan) + n) * sizeof(pcsca_bd_t)) - -/* Macro to access the FALC registers (TE only) */ -#define F_REG(reg, chan)	(0x200*(chan) + ((reg)<<2)) - -/*************************************** - * Memory access functions/macros      * - * (required to support Alpha systems) * - ***************************************/ -#define cpc_writeb(port,val)	{writeb((u8)(val),(port)); mb();} -#define cpc_writew(port,val)	{writew((ushort)(val),(port)); mb();} -#define cpc_writel(port,val)	{writel((u32)(val),(port)); mb();} - -#define cpc_readb(port)		readb(port) -#define cpc_readw(port)		readw(port) -#define cpc_readl(port)		readl(port) - -/****** Data Structures *****************************************************/ - -/* - *      RUNTIME_9050 - PLX PCI9050-1 local configuration and shared runtime - *      registers. This structure can be used to access the 9050 registers - *      (memory mapped). - */ -struct RUNTIME_9050 { -	u32 loc_addr_range[4];	/* 00-0Ch : Local Address Ranges */ -	u32 loc_rom_range;	/* 10h : Local ROM Range */ -	u32 loc_addr_base[4];	/* 14-20h : Local Address Base Addrs */ -	u32 loc_rom_base;	/* 24h : Local ROM Base */ -	u32 loc_bus_descr[4];	/* 28-34h : Local Bus Descriptors */ -	u32 rom_bus_descr;	/* 38h : ROM Bus Descriptor */ -	u32 cs_base[4];		/* 3C-48h : Chip Select Base Addrs */ -	u32 intr_ctrl_stat;	/* 4Ch : Interrupt Control/Status */ -	u32 init_ctrl;		/* 50h : EEPROM ctrl, Init Ctrl, etc */ -}; - -#define PLX_9050_LINT1_ENABLE	0x01 -#define PLX_9050_LINT1_POL	0x02 -#define PLX_9050_LINT1_STATUS	0x04 -#define PLX_9050_LINT2_ENABLE	0x08 -#define PLX_9050_LINT2_POL	0x10 -#define PLX_9050_LINT2_STATUS	0x20 -#define PLX_9050_INTR_ENABLE	0x40 -#define PLX_9050_SW_INTR	0x80 - -/* Masks to access the init_ctrl PLX register */ -#define	PC300_CLKSEL_MASK		(0x00000004UL) -#define	PC300_CHMEDIA_MASK(chan)	(0x00000020UL<<(chan*3)) -#define	PC300_CTYPE_MASK		(0x00000800UL) - -/* CPLD Registers (base addr = falcbase, TE only) */ -/* CPLD v. 0 */ -#define CPLD_REG1	0x140	/* Chip resets, DCD/CTS status */ -#define CPLD_REG2	0x144	/* Clock enable , LED control */ -/* CPLD v. 2 or higher */ -#define CPLD_V2_REG1	0x100	/* Chip resets, DCD/CTS status */ -#define CPLD_V2_REG2	0x104	/* Clock enable , LED control */ -#define CPLD_ID_REG	0x108	/* CPLD version */ - -/* CPLD Register bit description: for the FALC bits, they should always be  -   set based on the channel (use (bit<<(2*ch)) to access the correct bit for  -   that channel) */ -#define CPLD_REG1_FALC_RESET	0x01 -#define CPLD_REG1_SCA_RESET	0x02 -#define CPLD_REG1_GLOBAL_CLK	0x08 -#define CPLD_REG1_FALC_DCD	0x10 -#define CPLD_REG1_FALC_CTS	0x20 - -#define CPLD_REG2_FALC_TX_CLK	0x01 -#define CPLD_REG2_FALC_RX_CLK	0x02 -#define CPLD_REG2_FALC_LED1	0x10 -#define CPLD_REG2_FALC_LED2	0x20 - -/* Structure with FALC-related fields (TE only) */ -#define PC300_FALC_MAXLOOP	0x0000ffff	/* for falc_issue_cmd() */ - -typedef struct falc { -	u8 sync;	/* If true FALC is synchronized */ -	u8 active;	/* if TRUE then already active */ -	u8 loop_active;	/* if TRUE a line loopback UP was received */ -	u8 loop_gen;	/* if TRUE a line loopback UP was issued */ - -	u8 num_channels; -	u8 offset;	/* 1 for T1, 0 for E1 */ -	u8 full_bandwidth; - -	u8 xmb_cause; -	u8 multiframe_mode; - -	/* Statistics */ -	u16 pden;	/* Pulse Density violation count */ -	u16 los;	/* Loss of Signal count */ -	u16 losr;	/* Loss of Signal recovery count */ -	u16 lfa;	/* Loss of frame alignment count */ -	u16 farec;	/* Frame Alignment Recovery count */ -	u16 lmfa;	/* Loss of multiframe alignment count */ -	u16 ais;	/* Remote Alarm indication Signal count */ -	u16 sec;	/* One-second timer */ -	u16 es;		/* Errored second */ -	u16 rai;	/* remote alarm received */ -	u16 bec; -	u16 fec; -	u16 cvc; -	u16 cec; -	u16 ebc; - -	/* Status */ -	u8 red_alarm; -	u8 blue_alarm; -	u8 loss_fa; -	u8 yellow_alarm; -	u8 loss_mfa; -	u8 prbs; -} falc_t; - -typedef struct falc_status { -	u8 sync;	/* If true FALC is synchronized */ -	u8 red_alarm; -	u8 blue_alarm; -	u8 loss_fa; -	u8 yellow_alarm; -	u8 loss_mfa; -	u8 prbs; -} falc_status_t; - -typedef struct rsv_x21_status { -	u8 dcd; -	u8 dsr; -	u8 cts; -	u8 rts; -	u8 dtr; -} rsv_x21_status_t; - -typedef struct pc300stats { -	int hw_type; -	u32 line_on; -	u32 line_off; -	struct net_device_stats gen_stats; -	falc_t te_stats; -} pc300stats_t; - -typedef struct pc300status { -	int hw_type; -	rsv_x21_status_t gen_status; -	falc_status_t te_status; -} pc300status_t; - -typedef struct pc300loopback { -	char loop_type; -	char loop_on; -} pc300loopback_t; - -typedef struct pc300patterntst { -	char patrntst_on;       /* 0 - off; 1 - on; 2 - read num_errors */ -	u16 num_errors; -} pc300patterntst_t; - -typedef struct pc300dev { -	struct pc300ch *chan; -	u8 trace_on; -	u32 line_on;		/* DCD(X.21, RSV) / sync(TE) change counters */ -	u32 line_off; -	char name[16]; -	struct net_device *dev; -#ifdef CONFIG_PC300_MLPPP -	void *cpc_tty;	/* information to PC300 TTY driver */ -#endif -}pc300dev_t; - -typedef struct pc300hw { -	int type;		/* RSV, X21, etc. */ -	int bus;		/* Bus (PCI, PMC, etc.) */ -	int nchan;		/* number of channels */ -	int irq;		/* interrupt request level */ -	u32 clock;		/* Board clock */ -	u8 cpld_id;		/* CPLD ID (TE only) */ -	u16 cpld_reg1;		/* CPLD reg 1 (TE only) */ -	u16 cpld_reg2;		/* CPLD reg 2 (TE only) */ -	u16 gpioc_reg;		/* PLX GPIOC reg */ -	u16 intctl_reg;		/* PLX Int Ctrl/Status reg */ -	u32 iophys;		/* PLX registers I/O base */ -	u32 iosize;		/* PLX registers I/O size */ -	u32 plxphys;		/* PLX registers MMIO base (physical) */ -	void __iomem * plxbase;	/* PLX registers MMIO base (virtual) */ -	u32 plxsize;		/* PLX registers MMIO size */ -	u32 scaphys;		/* SCA registers MMIO base (physical) */ -	void __iomem * scabase;	/* SCA registers MMIO base (virtual) */ -	u32 scasize;		/* SCA registers MMIO size */ -	u32 ramphys;		/* On-board RAM MMIO base (physical) */ -	void __iomem * rambase;	/* On-board RAM MMIO base (virtual) */ -	u32 alloc_ramsize;	/* RAM MMIO size allocated by the PCI bridge */ -	u32 ramsize;		/* On-board RAM MMIO size */ -	u32 falcphys;		/* FALC registers MMIO base (physical) */ -	void __iomem * falcbase;/* FALC registers MMIO base (virtual) */ -	u32 falcsize;		/* FALC registers MMIO size */ -} pc300hw_t; - -typedef struct pc300chconf { -	sync_serial_settings	phys_settings;	/* Clock type/rate (in bps), -						   loopback mode */ -	raw_hdlc_proto		proto_settings;	/* Encoding, parity (CRC) */ -	u32 media;		/* HW media (RS232, V.35, etc.) */ -	u32 proto;		/* Protocol (PPP, X.25, etc.) */ - -	/* TE-specific parameters */ -	u8 lcode;		/* Line Code (AMI, B8ZS, etc.) */ -	u8 fr_mode;		/* Frame Mode (ESF, D4, etc.) */ -	u8 lbo;			/* Line Build Out */ -	u8 rx_sens;		/* Rx Sensitivity (long- or short-haul) */ -	u32 tslot_bitmap;	/* bit[i]=1  =>  timeslot _i_ is active */ -} pc300chconf_t; - -typedef struct pc300ch { -	struct pc300 *card; -	int channel; -	pc300dev_t d; -	pc300chconf_t conf; -	u8 tx_first_bd;	/* First TX DMA block descr. w/ data */ -	u8 tx_next_bd;	/* Next free TX DMA block descriptor */ -	u8 rx_first_bd;	/* First free RX DMA block descriptor */ -	u8 rx_last_bd;	/* Last free RX DMA block descriptor */ -	u8 nfree_tx_bd;	/* Number of free TX DMA block descriptors */ -	falc_t falc;	/* FALC structure (TE only) */ -} pc300ch_t; - -typedef struct pc300 { -	pc300hw_t hw;			/* hardware config. */ -	pc300ch_t chan[PC300_MAXCHAN]; -	spinlock_t card_lock; -} pc300_t; - -typedef struct pc300conf { -	pc300hw_t hw; -	pc300chconf_t conf; -} pc300conf_t; - -/* DEV ioctl() commands */ -#define	N_SPPP_IOCTLS	2 - -enum pc300_ioctl_cmds { -	SIOCCPCRESERVED = (SIOCDEVPRIVATE + N_SPPP_IOCTLS), -	SIOCGPC300CONF, -	SIOCSPC300CONF, -	SIOCGPC300STATUS, -	SIOCGPC300FALCSTATUS, -	SIOCGPC300UTILSTATS, -	SIOCGPC300UTILSTATUS, -	SIOCSPC300TRACE, -	SIOCSPC300LOOPBACK, -	SIOCSPC300PATTERNTEST, -}; - -/* Loopback types - PC300/TE boards */ -enum pc300_loopback_cmds { -	PC300LOCLOOP = 1, -	PC300REMLOOP, -	PC300PAYLOADLOOP, -	PC300GENLOOPUP, -	PC300GENLOOPDOWN, -}; - -/* Control Constant Definitions */ -#define	PC300_RSV	0x01 -#define	PC300_X21	0x02 -#define	PC300_TE	0x03 - -#define	PC300_PCI	0x00 -#define	PC300_PMC	0x01 - -#define PC300_LC_AMI	0x01 -#define PC300_LC_B8ZS	0x02 -#define PC300_LC_NRZ	0x03 -#define PC300_LC_HDB3	0x04 - -/* Framing (T1) */ -#define PC300_FR_ESF		0x01 -#define PC300_FR_D4		0x02 -#define PC300_FR_ESF_JAPAN	0x03 - -/* Framing (E1) */ -#define PC300_FR_MF_CRC4	0x04 -#define PC300_FR_MF_NON_CRC4	0x05 -#define PC300_FR_UNFRAMED	0x06 - -#define PC300_LBO_0_DB		0x00 -#define PC300_LBO_7_5_DB	0x01 -#define PC300_LBO_15_DB		0x02 -#define PC300_LBO_22_5_DB	0x03 - -#define PC300_RX_SENS_SH	0x01 -#define PC300_RX_SENS_LH	0x02 - -#define PC300_TX_TIMEOUT	(2*HZ) -#define PC300_TX_QUEUE_LEN	100 -#define	PC300_DEF_MTU		1600 - -/* Function Prototypes */ -int cpc_open(struct net_device *dev); - -#endif	/* _PC300_H */ diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c deleted file mode 100644 index f875cfae309..00000000000 --- a/drivers/net/wan/pc300_drv.c +++ /dev/null @@ -1,3678 +0,0 @@ -#define	USE_PCI_CLOCK -static const char rcsid[] = -"Revision: 3.4.5 Date: 2002/03/07 "; - -/* - * pc300.c	Cyclades-PC300(tm) Driver. - * - * Author:	Ivan Passos <ivan@cyclades.com> - * Maintainer:	PC300 Maintainer <pc300@cyclades.com> - * - * Copyright:	(c) 1999-2003 Cyclades Corp. - * - *	This program is free software; you can redistribute it and/or - *	modify it under the terms of the GNU General Public License - *	as published by the Free Software Foundation; either version - *	2 of the License, or (at your option) any later version. - *	 - *	Using tabstop = 4. - *  - * $Log: pc300_drv.c,v $ - * Revision 3.23  2002/03/20 13:58:40  henrique - * Fixed ortographic mistakes - * - * Revision 3.22  2002/03/13 16:56:56  henrique - * Take out the debug messages - * - * Revision 3.21  2002/03/07 14:17:09  henrique - * License data fixed - * - * Revision 3.20  2002/01/17 17:58:52  ivan - * Support for PC300-TE/M (PMC). - * - * Revision 3.19  2002/01/03 17:08:47  daniela - * Enables DMA reception when the SCA-II disables it improperly. - * - * Revision 3.18  2001/12/03 18:47:50  daniela - * Esthetic changes. - * - * Revision 3.17  2001/10/19 16:50:13  henrique - * Patch to kernel 2.4.12 and new generic hdlc. - * - * Revision 3.16  2001/10/16 15:12:31  regina - * clear statistics - * - * Revision 3.11 to 3.15  2001/10/11 20:26:04  daniela - * More DMA fixes for noisy lines. - * Return the size of bad frames in dma_get_rx_frame_size, so that the Rx buffer - * descriptors can be cleaned by dma_buf_read (called in cpc_net_rx). - * Renamed dma_start routine to rx_dma_start. Improved Rx statistics. - * Fixed BOF interrupt treatment. Created dma_start routine. - * Changed min and max to cpc_min and cpc_max. - * - * Revision 3.10  2001/08/06 12:01:51  regina - * Fixed problem in DSR_DE bit. - * - * Revision 3.9  2001/07/18 19:27:26  daniela - * Added some history comments. - * - * Revision 3.8  2001/07/12 13:11:19  regina - * bug fix - DCD-OFF in pc300 tty driver - * - * Revision 3.3 to 3.7  2001/07/06 15:00:20  daniela - * Removing kernel 2.4.3 and previous support. - * DMA transmission bug fix. - * MTU check in cpc_net_rx fixed. - * Boot messages reviewed. - * New configuration parameters (line code, CRC calculation and clock). - * - * Revision 3.2 2001/06/22 13:13:02  regina - * MLPPP implementation. Changed the header of message trace to include - * the device name. New format : "hdlcX[R/T]: ". - * Default configuration changed. - * - * Revision 3.1 2001/06/15 regina - * in cpc_queue_xmit, netif_stop_queue is called if don't have free descriptor - * upping major version number - * - * Revision 1.1.1.1  2001/06/13 20:25:04  daniela - * PC300 initial CVS version (3.4.0-pre1) - * - * Revision 3.0.1.2 2001/06/08 daniela - * Did some changes in the DMA programming implementation to avoid the  - * occurrence of a SCA-II bug when CDA is accessed during a DMA transfer. - * - * Revision 3.0.1.1 2001/05/02 daniela - * Added kernel 2.4.3 support. - *  - * Revision 3.0.1.0 2001/03/13 daniela, henrique - * Added Frame Relay Support. - * Driver now uses HDLC generic driver to provide protocol support. - *  - * Revision 3.0.0.8 2001/03/02 daniela - * Fixed ram size detection.  - * Changed SIOCGPC300CONF ioctl, to give hw information to pc300util. - *  - * Revision 3.0.0.7 2001/02/23 daniela - * netif_stop_queue called before the SCA-II transmition commands in  - * cpc_queue_xmit, and with interrupts disabled to avoid race conditions with  - * transmition interrupts. - * Fixed falc_check_status for Unframed E1. - *  - * Revision 3.0.0.6 2000/12/13 daniela - * Implemented pc300util support: trace, statistics, status and loopback - * tests for the PC300 TE boards. - *  - * Revision 3.0.0.5 2000/12/12 ivan - * Added support for Unframed E1. - * Implemented monitor mode. - * Fixed DCD sensitivity on the second channel. - * Driver now complies with new PCI kernel architecture. - * - * Revision 3.0.0.4 2000/09/28 ivan - * Implemented DCD sensitivity. - * Moved hardware-specific open to the end of cpc_open, to avoid race - * conditions with early reception interrupts. - * Included code for [request|release]_mem_region(). - * Changed location of pc300.h . - * Minor code revision (contrib. of Jeff Garzik). - * - * Revision 3.0.0.3 2000/07/03 ivan - * Previous bugfix for the framing errors with external clock made X21 - * boards stop working. This version fixes it. - * - * Revision 3.0.0.2 2000/06/23 ivan - * Revisited cpc_queue_xmit to prevent race conditions on Tx DMA buffer - * handling when Tx timeouts occur. - * Revisited Rx statistics. - * Fixed a bug in the SCA-II programming that would cause framing errors - * when external clock was configured. - * - * Revision 3.0.0.1 2000/05/26 ivan - * Added logic in the SCA interrupt handler so that no board can monopolize - * the driver. - * Request PLX I/O region, although driver doesn't use it, to avoid - * problems with other drivers accessing it. - * - * Revision 3.0.0.0 2000/05/15 ivan - * Did some changes in the DMA programming implementation to avoid the - * occurrence of a SCA-II bug in the second channel. - * Implemented workaround for PLX9050 bug that would cause a system lockup - * in certain systems, depending on the MMIO addresses allocated to the - * board. - * Fixed the FALC chip programming to avoid synchronization problems in the - * second channel (TE only). - * Implemented a cleaner and faster Tx DMA descriptor cleanup procedure in - * cpc_queue_xmit(). - * Changed the built-in driver implementation so that the driver can use the - * general 'hdlcN' naming convention instead of proprietary device names. - * Driver load messages are now device-centric, instead of board-centric. - * Dynamic allocation of net_device structures. - * Code is now compliant with the new module interface (module_[init|exit]). - * Make use of the PCI helper functions to access PCI resources. - * - * Revision 2.0.0.0 2000/04/15 ivan - * Added support for the PC300/TE boards (T1/FT1/E1/FE1). - * - * Revision 1.1.0.0 2000/02/28 ivan - * Major changes in the driver architecture. - * Softnet compliancy implemented. - * Driver now reports physical instead of virtual memory addresses. - * Added cpc_change_mtu function. - * - * Revision 1.0.0.0 1999/12/16 ivan - * First official release. - * Support for 1- and 2-channel boards (which use distinct PCI Device ID's). - * Support for monolythic installation (i.e., drv built into the kernel). - * X.25 additional checking when lapb_[dis]connect_request returns an error. - * SCA programming now covers X.21 as well. - * - * Revision 0.3.1.0 1999/11/18 ivan - * Made X.25 support configuration-dependent (as it depends on external  - * modules to work). - * Changed X.25-specific function names to comply with adopted convention. - * Fixed typos in X.25 functions that would cause compile errors (Daniela). - * Fixed bug in ch_config that would disable interrupts on a previously  - * enabled channel if the other channel on the same board was enabled later. - * - * Revision 0.3.0.0 1999/11/16 daniela - * X.25 support. - * - * Revision 0.2.3.0 1999/11/15 ivan - * Function cpc_ch_status now provides more detailed information. - * Added support for X.21 clock configuration. - * Changed TNR1 setting in order to prevent Tx FIFO overaccesses by the SCA. - * Now using PCI clock instead of internal oscillator clock for the SCA. - * - * Revision 0.2.2.0 1999/11/10 ivan - * Changed the *_dma_buf_check functions so that they would print only  - * the useful info instead of the whole buffer descriptor bank. - * Fixed bug in cpc_queue_xmit that would eventually crash the system  - * in case of a packet drop. - * Implemented TX underrun handling. - * Improved SCA fine tuning to boost up its performance. - * - * Revision 0.2.1.0 1999/11/03 ivan - * Added functions *dma_buf_pt_init to allow independent initialization  - * of the next-descr. and DMA buffer pointers on the DMA descriptors. - * Kernel buffer release and tbusy clearing is now done in the interrupt  - * handler. - * Fixed bug in cpc_open that would cause an interface reopen to fail. - * Added a protocol-specific code section in cpc_net_rx. - * Removed printk level defs (they might be added back after the beta phase). - * - * Revision 0.2.0.0 1999/10/28 ivan - * Revisited the code so that new protocols can be easily added / supported.  - * - * Revision 0.1.0.1 1999/10/20 ivan - * Mostly "esthetic" changes. - * - * Revision 0.1.0.0 1999/10/11 ivan - * Initial version. - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/ioport.h> -#include <linux/pci.h> -#include <linux/errno.h> -#include <linux/string.h> -#include <linux/init.h> -#include <linux/delay.h> -#include <linux/net.h> -#include <linux/skbuff.h> -#include <linux/if_arp.h> -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/spinlock.h> -#include <linux/if.h> -#include <linux/slab.h> -#include <net/arp.h> - -#include <asm/io.h> -#include <asm/uaccess.h> - -#include "pc300.h" - -#define	CPC_LOCK(card,flags)		\ -		do {						\ -		spin_lock_irqsave(&card->card_lock, flags);	\ -		} while (0) - -#define CPC_UNLOCK(card,flags)			\ -		do {							\ -		spin_unlock_irqrestore(&card->card_lock, flags);	\ -		} while (0) - -#undef	PC300_DEBUG_PCI -#undef	PC300_DEBUG_INTR -#undef	PC300_DEBUG_TX -#undef	PC300_DEBUG_RX -#undef	PC300_DEBUG_OTHER - -static DEFINE_PCI_DEVICE_TABLE(cpc_pci_dev_id) = { -	/* PC300/RSV or PC300/X21, 2 chan */ -	{0x120e, 0x300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x300}, -	/* PC300/RSV or PC300/X21, 1 chan */ -	{0x120e, 0x301, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x301}, -	/* PC300/TE, 2 chan */ -	{0x120e, 0x310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x310}, -	/* PC300/TE, 1 chan */ -	{0x120e, 0x311, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x311}, -	/* PC300/TE-M, 2 chan */ -	{0x120e, 0x320, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x320}, -	/* PC300/TE-M, 1 chan */ -	{0x120e, 0x321, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0x321}, -	/* End of table */ -	{0,}, -}; -MODULE_DEVICE_TABLE(pci, cpc_pci_dev_id); - -#ifndef cpc_min -#define	cpc_min(a,b)	(((a)<(b))?(a):(b)) -#endif -#ifndef cpc_max -#define	cpc_max(a,b)	(((a)>(b))?(a):(b)) -#endif - -/* prototypes */ -static void tx_dma_buf_pt_init(pc300_t *, int); -static void tx_dma_buf_init(pc300_t *, int); -static void rx_dma_buf_pt_init(pc300_t *, int); -static void rx_dma_buf_init(pc300_t *, int); -static void tx_dma_buf_check(pc300_t *, int); -static void rx_dma_buf_check(pc300_t *, int); -static irqreturn_t cpc_intr(int, void *); -static int clock_rate_calc(u32, u32, int *); -static u32 detect_ram(pc300_t *); -static void plx_init(pc300_t *); -static void cpc_trace(struct net_device *, struct sk_buff *, char); -static int cpc_attach(struct net_device *, unsigned short, unsigned short); -static int cpc_close(struct net_device *dev); - -#ifdef CONFIG_PC300_MLPPP -void cpc_tty_init(pc300dev_t * dev); -void cpc_tty_unregister_service(pc300dev_t * pc300dev); -void cpc_tty_receive(pc300dev_t * pc300dev); -void cpc_tty_trigger_poll(pc300dev_t * pc300dev); -void cpc_tty_reset_var(void); -#endif - -/************************/ -/***   DMA Routines   ***/ -/************************/ -static void tx_dma_buf_pt_init(pc300_t * card, int ch) -{ -	int i; -	int ch_factor = ch * N_DMA_TX_BUF; -	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase -			               + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t)); - -	for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) { -		cpc_writel(&ptdescr->next, (u32)(DMA_TX_BD_BASE + -			(ch_factor + ((i + 1) & (N_DMA_TX_BUF - 1))) * sizeof(pcsca_bd_t))); -		cpc_writel(&ptdescr->ptbuf, -			   (u32)(DMA_TX_BASE + (ch_factor + i) * BD_DEF_LEN)); -	} -} - -static void tx_dma_buf_init(pc300_t * card, int ch) -{ -	int i; -	int ch_factor = ch * N_DMA_TX_BUF; -	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase -			       + DMA_TX_BD_BASE + ch_factor * sizeof(pcsca_bd_t)); - -	for (i = 0; i < N_DMA_TX_BUF; i++, ptdescr++) { -		memset_io(ptdescr, 0, sizeof(pcsca_bd_t)); -		cpc_writew(&ptdescr->len, 0); -		cpc_writeb(&ptdescr->status, DST_OSB); -	} -	tx_dma_buf_pt_init(card, ch); -} - -static void rx_dma_buf_pt_init(pc300_t * card, int ch) -{ -	int i; -	int ch_factor = ch * N_DMA_RX_BUF; -	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase -				       + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t)); - -	for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) { -		cpc_writel(&ptdescr->next, (u32)(DMA_RX_BD_BASE + -			(ch_factor + ((i + 1) & (N_DMA_RX_BUF - 1))) * sizeof(pcsca_bd_t))); -		cpc_writel(&ptdescr->ptbuf, -			   (u32)(DMA_RX_BASE + (ch_factor + i) * BD_DEF_LEN)); -	} -} - -static void rx_dma_buf_init(pc300_t * card, int ch) -{ -	int i; -	int ch_factor = ch * N_DMA_RX_BUF; -	volatile pcsca_bd_t __iomem *ptdescr = (card->hw.rambase -				       + DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t)); - -	for (i = 0; i < N_DMA_RX_BUF; i++, ptdescr++) { -		memset_io(ptdescr, 0, sizeof(pcsca_bd_t)); -		cpc_writew(&ptdescr->len, 0); -		cpc_writeb(&ptdescr->status, 0); -	} -	rx_dma_buf_pt_init(card, ch); -} - -static void tx_dma_buf_check(pc300_t * card, int ch) -{ -	volatile pcsca_bd_t __iomem *ptdescr; -	int i; -	u16 first_bd = card->chan[ch].tx_first_bd; -	u16 next_bd = card->chan[ch].tx_next_bd; - -	printk("#CH%d: f_bd = %d(0x%08zx), n_bd = %d(0x%08zx)\n", ch, -	       first_bd, TX_BD_ADDR(ch, first_bd), -	       next_bd, TX_BD_ADDR(ch, next_bd)); -	for (i = first_bd, -	     ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, first_bd)); -	     i != ((next_bd + 1) & (N_DMA_TX_BUF - 1)); -	     i = (i + 1) & (N_DMA_TX_BUF - 1),  -		 ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i))) { -		printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d", -		       ch, i, cpc_readl(&ptdescr->next), -		       cpc_readl(&ptdescr->ptbuf), -		       cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len)); -	} -	printk("\n"); -} - -#ifdef	PC300_DEBUG_OTHER -/* Show all TX buffer descriptors */ -static void tx1_dma_buf_check(pc300_t * card, int ch) -{ -	volatile pcsca_bd_t __iomem *ptdescr; -	int i; -	u16 first_bd = card->chan[ch].tx_first_bd; -	u16 next_bd = card->chan[ch].tx_next_bd; -	u32 scabase = card->hw.scabase; - -	printk ("\nnfree_tx_bd = %d\n", card->chan[ch].nfree_tx_bd); -	printk("#CH%d: f_bd = %d(0x%08x), n_bd = %d(0x%08x)\n", ch, -	       first_bd, TX_BD_ADDR(ch, first_bd), -	       next_bd, TX_BD_ADDR(ch, next_bd)); -	printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n", -	       cpc_readl(scabase + DTX_REG(CDAL, ch)), -	       cpc_readl(scabase + DTX_REG(EDAL, ch))); -	for (i = 0; i < N_DMA_TX_BUF; i++) { -		ptdescr = (card->hw.rambase + TX_BD_ADDR(ch, i)); -		printk("\n CH%d TX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d", -		       ch, i, cpc_readl(&ptdescr->next), -		       cpc_readl(&ptdescr->ptbuf), -		       cpc_readb(&ptdescr->status), cpc_readw(&ptdescr->len)); -	} -	printk("\n"); -} -#endif - -static void rx_dma_buf_check(pc300_t * card, int ch) -{ -	volatile pcsca_bd_t __iomem *ptdescr; -	int i; -	u16 first_bd = card->chan[ch].rx_first_bd; -	u16 last_bd = card->chan[ch].rx_last_bd; -	int ch_factor; - -	ch_factor = ch * N_DMA_RX_BUF; -	printk("#CH%d: f_bd = %d, l_bd = %d\n", ch, first_bd, last_bd); -	for (i = 0, ptdescr = (card->hw.rambase + -					      DMA_RX_BD_BASE + ch_factor * sizeof(pcsca_bd_t)); -	     i < N_DMA_RX_BUF; i++, ptdescr++) { -		if (cpc_readb(&ptdescr->status) & DST_OSB) -			printk ("\n CH%d RX%d: next=0x%x, ptbuf=0x%x, ST=0x%x, len=%d", -				 ch, i, cpc_readl(&ptdescr->next), -				 cpc_readl(&ptdescr->ptbuf), -				 cpc_readb(&ptdescr->status), -				 cpc_readw(&ptdescr->len)); -	} -	printk("\n"); -} - -static int dma_get_rx_frame_size(pc300_t * card, int ch) -{ -	volatile pcsca_bd_t __iomem *ptdescr; -	u16 first_bd = card->chan[ch].rx_first_bd; -	int rcvd = 0; -	volatile u8 status; - -	ptdescr = (card->hw.rambase + RX_BD_ADDR(ch, first_bd)); -	while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) { -		rcvd += cpc_readw(&ptdescr->len); -		first_bd = (first_bd + 1) & (N_DMA_RX_BUF - 1); -		if ((status & DST_EOM) || (first_bd == card->chan[ch].rx_last_bd)) { -			/* Return the size of a good frame or incomplete bad frame  -			* (dma_buf_read will clean the buffer descriptors in this case). */ -			return rcvd; -		} -		ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next)); -	} -	return -1; -} - -/* - * dma_buf_write: writes a frame to the Tx DMA buffers - * NOTE: this function writes one frame at a time. - */ -static int dma_buf_write(pc300_t *card, int ch, u8 *ptdata, int len) -{ -	int i, nchar; -	volatile pcsca_bd_t __iomem *ptdescr; -	int tosend = len; -	u8 nbuf = ((len - 1) / BD_DEF_LEN) + 1; - -	if (nbuf >= card->chan[ch].nfree_tx_bd) { -		return -ENOMEM; -	} - -	for (i = 0; i < nbuf; i++) { -		ptdescr = (card->hw.rambase + -					  TX_BD_ADDR(ch, card->chan[ch].tx_next_bd)); -		nchar = cpc_min(BD_DEF_LEN, tosend); -		if (cpc_readb(&ptdescr->status) & DST_OSB) { -			memcpy_toio((card->hw.rambase + cpc_readl(&ptdescr->ptbuf)), -				    &ptdata[len - tosend], nchar); -			cpc_writew(&ptdescr->len, nchar); -			card->chan[ch].nfree_tx_bd--; -			if ((i + 1) == nbuf) { -				/* This must be the last BD to be used */ -				cpc_writeb(&ptdescr->status, DST_EOM); -			} else { -				cpc_writeb(&ptdescr->status, 0); -			} -		} else { -			return -ENOMEM; -		} -		tosend -= nchar; -		card->chan[ch].tx_next_bd = -			(card->chan[ch].tx_next_bd + 1) & (N_DMA_TX_BUF - 1); -	} -	/* If it gets to here, it means we have sent the whole frame */ -	return 0; -} - -/* - * dma_buf_read: reads a frame from the Rx DMA buffers - * NOTE: this function reads one frame at a time. - */ -static int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb) -{ -	int nchar; -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	volatile pcsca_bd_t __iomem *ptdescr; -	int rcvd = 0; -	volatile u8 status; - -	ptdescr = (card->hw.rambase + -				  RX_BD_ADDR(ch, chan->rx_first_bd)); -	while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) { -		nchar = cpc_readw(&ptdescr->len); -		if ((status & (DST_OVR | DST_CRC | DST_RBIT | DST_SHRT | DST_ABT)) || -		    (nchar > BD_DEF_LEN)) { - -			if (nchar > BD_DEF_LEN) -				status |= DST_RBIT; -			rcvd = -status; -			/* Discard remaining descriptors used by the bad frame */ -			while (chan->rx_first_bd != chan->rx_last_bd) { -				cpc_writeb(&ptdescr->status, 0); -				chan->rx_first_bd = (chan->rx_first_bd+1) & (N_DMA_RX_BUF-1); -				if (status & DST_EOM) -					break; -				ptdescr = (card->hw.rambase + -							  cpc_readl(&ptdescr->next)); -				status = cpc_readb(&ptdescr->status); -			} -			break; -		} -		if (nchar != 0) { -			if (skb) { -				memcpy_fromio(skb_put(skb, nchar), -				 (card->hw.rambase+cpc_readl(&ptdescr->ptbuf)),nchar); -			} -			rcvd += nchar; -		} -		cpc_writeb(&ptdescr->status, 0); -		cpc_writeb(&ptdescr->len, 0); -		chan->rx_first_bd = (chan->rx_first_bd + 1) & (N_DMA_RX_BUF - 1); - -		if (status & DST_EOM) -			break; - -		ptdescr = (card->hw.rambase + cpc_readl(&ptdescr->next)); -	} - -	if (rcvd != 0) { -		/* Update pointer */ -		chan->rx_last_bd = (chan->rx_first_bd - 1) & (N_DMA_RX_BUF - 1); -		/* Update EDA */ -		cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch), -			   RX_BD_ADDR(ch, chan->rx_last_bd)); -	} -	return rcvd; -} - -static void tx_dma_stop(pc300_t * card, int ch) -{ -	void __iomem *scabase = card->hw.scabase; -	u8 drr_ena_bit = 1 << (5 + 2 * ch); -	u8 drr_rst_bit = 1 << (1 + 2 * ch); - -	/* Disable DMA */ -	cpc_writeb(scabase + DRR, drr_ena_bit); -	cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit); -} - -static void rx_dma_stop(pc300_t * card, int ch) -{ -	void __iomem *scabase = card->hw.scabase; -	u8 drr_ena_bit = 1 << (4 + 2 * ch); -	u8 drr_rst_bit = 1 << (2 * ch); - -	/* Disable DMA */ -	cpc_writeb(scabase + DRR, drr_ena_bit); -	cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit); -} - -static void rx_dma_start(pc300_t * card, int ch) -{ -	void __iomem *scabase = card->hw.scabase; -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	 -	/* Start DMA */ -	cpc_writel(scabase + DRX_REG(CDAL, ch), -		   RX_BD_ADDR(ch, chan->rx_first_bd)); -	if (cpc_readl(scabase + DRX_REG(CDAL,ch)) != -				  RX_BD_ADDR(ch, chan->rx_first_bd)) { -		cpc_writel(scabase + DRX_REG(CDAL, ch), -				   RX_BD_ADDR(ch, chan->rx_first_bd)); -	} -	cpc_writel(scabase + DRX_REG(EDAL, ch), -		   RX_BD_ADDR(ch, chan->rx_last_bd)); -	cpc_writew(scabase + DRX_REG(BFLL, ch), BD_DEF_LEN); -	cpc_writeb(scabase + DSR_RX(ch), DSR_DE); -	if (!(cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) { -	cpc_writeb(scabase + DSR_RX(ch), DSR_DE); -	} -} - -/*************************/ -/***   FALC Routines   ***/ -/*************************/ -static void falc_issue_cmd(pc300_t *card, int ch, u8 cmd) -{ -	void __iomem *falcbase = card->hw.falcbase; -	unsigned long i = 0; - -	while (cpc_readb(falcbase + F_REG(SIS, ch)) & SIS_CEC) { -		if (i++ >= PC300_FALC_MAXLOOP) { -			printk("%s: FALC command locked(cmd=0x%x).\n", -			       card->chan[ch].d.name, cmd); -			break; -		} -	} -	cpc_writeb(falcbase + F_REG(CMDR, ch), cmd); -} - -static void falc_intr_enable(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	/* Interrupt pins are open-drain */ -	cpc_writeb(falcbase + F_REG(IPC, ch), -		   cpc_readb(falcbase + F_REG(IPC, ch)) & ~IPC_IC0); -	/* Conters updated each second */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), -		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_ECM); -	/* Enable SEC and ES interrupts  */ -	cpc_writeb(falcbase + F_REG(IMR3, ch), -		   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~(IMR3_SEC | IMR3_ES)); -	if (conf->fr_mode == PC300_FR_UNFRAMED) { -		cpc_writeb(falcbase + F_REG(IMR4, ch), -			   cpc_readb(falcbase + F_REG(IMR4, ch)) & ~(IMR4_LOS)); -	} else { -		cpc_writeb(falcbase + F_REG(IMR4, ch), -			   cpc_readb(falcbase + F_REG(IMR4, ch)) & -			   ~(IMR4_LFA | IMR4_AIS | IMR4_LOS | IMR4_SLIP)); -	} -	if (conf->media == IF_IFACE_T1) { -		cpc_writeb(falcbase + F_REG(IMR3, ch), -			   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC); -	} else { -		cpc_writeb(falcbase + F_REG(IPC, ch), -			   cpc_readb(falcbase + F_REG(IPC, ch)) | IPC_SCI); -		if (conf->fr_mode == PC300_FR_UNFRAMED) { -			cpc_writeb(falcbase + F_REG(IMR2, ch), -				   cpc_readb(falcbase + F_REG(IMR2, ch)) & ~(IMR2_LOS)); -		} else { -			cpc_writeb(falcbase + F_REG(IMR2, ch), -				   cpc_readb(falcbase + F_REG(IMR2, ch)) & -				   ~(IMR2_FAR | IMR2_LFA | IMR2_AIS | IMR2_LOS)); -			if (pfalc->multiframe_mode) { -				cpc_writeb(falcbase + F_REG(IMR2, ch), -					   cpc_readb(falcbase + F_REG(IMR2, ch)) &  -					   ~(IMR2_T400MS | IMR2_MFAR)); -			} else { -				cpc_writeb(falcbase + F_REG(IMR2, ch), -					   cpc_readb(falcbase + F_REG(IMR2, ch)) |  -					   IMR2_T400MS | IMR2_MFAR); -			} -		} -	} -} - -static void falc_open_timeslot(pc300_t * card, int ch, int timeslot) -{ -	void __iomem *falcbase = card->hw.falcbase; -	u8 tshf = card->chan[ch].falc.offset; - -	cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch), -		   cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) &  -		   	~(0x80 >> ((timeslot - tshf) & 0x07))); -	cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch), -		   cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) |  -   			(0x80 >> (timeslot & 0x07))); -	cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch), -		   cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) |  -			(0x80 >> (timeslot & 0x07))); -} - -static void falc_close_timeslot(pc300_t * card, int ch, int timeslot) -{ -	void __iomem *falcbase = card->hw.falcbase; -	u8 tshf = card->chan[ch].falc.offset; - -	cpc_writeb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch), -		   cpc_readb(falcbase + F_REG((ICB1 + (timeslot - tshf) / 8), ch)) |  -		   (0x80 >> ((timeslot - tshf) & 0x07))); -	cpc_writeb(falcbase + F_REG((TTR1 + timeslot / 8), ch), -		   cpc_readb(falcbase + F_REG((TTR1 + timeslot / 8), ch)) &  -		   ~(0x80 >> (timeslot & 0x07))); -	cpc_writeb(falcbase + F_REG((RTR1 + timeslot / 8), ch), -		   cpc_readb(falcbase + F_REG((RTR1 + timeslot / 8), ch)) &  -		   ~(0x80 >> (timeslot & 0x07))); -} - -static void falc_close_all_timeslots(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	void __iomem *falcbase = card->hw.falcbase; - -	cpc_writeb(falcbase + F_REG(ICB1, ch), 0xff); -	cpc_writeb(falcbase + F_REG(TTR1, ch), 0); -	cpc_writeb(falcbase + F_REG(RTR1, ch), 0); -	cpc_writeb(falcbase + F_REG(ICB2, ch), 0xff); -	cpc_writeb(falcbase + F_REG(TTR2, ch), 0); -	cpc_writeb(falcbase + F_REG(RTR2, ch), 0); -	cpc_writeb(falcbase + F_REG(ICB3, ch), 0xff); -	cpc_writeb(falcbase + F_REG(TTR3, ch), 0); -	cpc_writeb(falcbase + F_REG(RTR3, ch), 0); -	if (conf->media == IF_IFACE_E1) { -		cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff); -		cpc_writeb(falcbase + F_REG(TTR4, ch), 0); -		cpc_writeb(falcbase + F_REG(RTR4, ch), 0); -	} -} - -static void falc_open_all_timeslots(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	void __iomem *falcbase = card->hw.falcbase; - -	cpc_writeb(falcbase + F_REG(ICB1, ch), 0); -	if (conf->fr_mode == PC300_FR_UNFRAMED) { -		cpc_writeb(falcbase + F_REG(TTR1, ch), 0xff); -		cpc_writeb(falcbase + F_REG(RTR1, ch), 0xff); -	} else { -		/* Timeslot 0 is never enabled */ -		cpc_writeb(falcbase + F_REG(TTR1, ch), 0x7f); -		cpc_writeb(falcbase + F_REG(RTR1, ch), 0x7f); -	} -	cpc_writeb(falcbase + F_REG(ICB2, ch), 0); -	cpc_writeb(falcbase + F_REG(TTR2, ch), 0xff); -	cpc_writeb(falcbase + F_REG(RTR2, ch), 0xff); -	cpc_writeb(falcbase + F_REG(ICB3, ch), 0); -	cpc_writeb(falcbase + F_REG(TTR3, ch), 0xff); -	cpc_writeb(falcbase + F_REG(RTR3, ch), 0xff); -	if (conf->media == IF_IFACE_E1) { -		cpc_writeb(falcbase + F_REG(ICB4, ch), 0); -		cpc_writeb(falcbase + F_REG(TTR4, ch), 0xff); -		cpc_writeb(falcbase + F_REG(RTR4, ch), 0xff); -	} else { -		cpc_writeb(falcbase + F_REG(ICB4, ch), 0xff); -		cpc_writeb(falcbase + F_REG(TTR4, ch), 0x80); -		cpc_writeb(falcbase + F_REG(RTR4, ch), 0x80); -	} -} - -static void falc_init_timeslot(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	int tslot; - -	for (tslot = 0; tslot < pfalc->num_channels; tslot++) { -		if (conf->tslot_bitmap & (1 << tslot)) { -			// Channel enabled -			falc_open_timeslot(card, ch, tslot + 1); -		} else { -			// Channel disabled -			falc_close_timeslot(card, ch, tslot + 1); -		} -	} -} - -static void falc_enable_comm(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; - -	if (pfalc->full_bandwidth) { -		falc_open_all_timeslots(card, ch); -	} else { -		falc_init_timeslot(card, ch); -	} -	// CTS/DCD ON -	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) & -		   ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch))); -} - -static void falc_disable_comm(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; - -	if (pfalc->loop_active != 2) { -		falc_close_all_timeslots(card, ch); -	} -	// CTS/DCD OFF -	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) | -		   ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch))); -} - -static void falc_init_t1(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; -	u8 dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0); - -	/* Switch to T1 mode (PCM 24) */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), FMR1_PMOD); - -	/* Wait 20 us for setup */ -	udelay(20); - -	/* Transmit Buffer Size (1 frame) */ -	cpc_writeb(falcbase + F_REG(SIC1, ch), SIC1_XBS0); - -	/* Clock mode */ -	if (conf->phys_settings.clock_type == CLOCK_INT) { /* Master mode */ -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS); -	} else { /* Slave mode */ -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS); -		cpc_writeb(falcbase + F_REG(LOOP, ch), -			   cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_RTM); -	} - -	cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI); -	cpc_writeb(falcbase + F_REG(FMR0, ch), -		   cpc_readb(falcbase + F_REG(FMR0, ch)) & -		   ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1)); - -	switch (conf->lcode) { -		case PC300_LC_AMI: -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) | -				   FMR0_XC1 | FMR0_RC1); -			/* Clear Channel register to ON for all channels */ -			cpc_writeb(falcbase + F_REG(CCB1, ch), 0xff); -			cpc_writeb(falcbase + F_REG(CCB2, ch), 0xff); -			cpc_writeb(falcbase + F_REG(CCB3, ch), 0xff); -			break; - -		case PC300_LC_B8ZS: -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) | -				   FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1); -			break; - -		case PC300_LC_NRZ: -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) | 0x00); -			break; -	} - -	cpc_writeb(falcbase + F_REG(LIM0, ch), -		   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_ELOS); -	cpc_writeb(falcbase + F_REG(LIM0, ch), -		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0)); -	/* Set interface mode to 2 MBPS */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), -		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD); - -	switch (conf->fr_mode) { -		case PC300_FR_ESF: -			pfalc->multiframe_mode = 0; -			cpc_writeb(falcbase + F_REG(FMR4, ch), -				   cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_FM1); -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) |  -				   FMR1_CRC | FMR1_EDL); -			cpc_writeb(falcbase + F_REG(XDL1, ch), 0); -			cpc_writeb(falcbase + F_REG(XDL2, ch), 0); -			cpc_writeb(falcbase + F_REG(XDL3, ch), 0); -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) & ~FMR0_SRAF); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2,ch)) | FMR2_MCSP | FMR2_SSP); -			break; - -		case PC300_FR_D4: -			pfalc->multiframe_mode = 1; -			cpc_writeb(falcbase + F_REG(FMR4, ch), -				   cpc_readb(falcbase + F_REG(FMR4, ch)) & -				   ~(FMR4_FM1 | FMR4_FM0)); -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) | FMR0_SRAF); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_SSP); -			break; -	} - -	/* Enable Automatic Resynchronization */ -	cpc_writeb(falcbase + F_REG(FMR4, ch), -		   cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_AUTO); - -	/* Transmit Automatic Remote Alarm */ -	cpc_writeb(falcbase + F_REG(FMR2, ch), -		   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA); - -	/* Channel translation mode 1 : one to one */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), -		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_CTM); - -	/* No signaling */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), -		   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_SIGM); -	cpc_writeb(falcbase + F_REG(FMR5, ch), -		   cpc_readb(falcbase + F_REG(FMR5, ch)) & -		   ~(FMR5_EIBR | FMR5_SRS)); -	cpc_writeb(falcbase + F_REG(CCR1, ch), 0); - -	cpc_writeb(falcbase + F_REG(LIM1, ch), -		   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1); - -	switch (conf->lbo) { -			/* Provides proper Line Build Out */ -		case PC300_LBO_0_DB: -			cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja)); -			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x5a); -			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x8f); -			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20); -			break; -		case PC300_LBO_7_5_DB: -			cpc_writeb(falcbase + F_REG(LIM2, ch), (0x40 | LIM2_LOS1 | dja)); -			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x11); -			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x02); -			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20); -			break; -		case PC300_LBO_15_DB: -			cpc_writeb(falcbase + F_REG(LIM2, ch), (0x80 | LIM2_LOS1 | dja)); -			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x8e); -			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01); -			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20); -			break; -		case PC300_LBO_22_5_DB: -			cpc_writeb(falcbase + F_REG(LIM2, ch), (0xc0 | LIM2_LOS1 | dja)); -			cpc_writeb(falcbase + F_REG(XPM0, ch), 0x09); -			cpc_writeb(falcbase + F_REG(XPM1, ch), 0x01); -			cpc_writeb(falcbase + F_REG(XPM2, ch), 0x20); -			break; -	} - -	/* Transmit Clock-Slot Offset */ -	cpc_writeb(falcbase + F_REG(XC0, ch), -		   cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01); -	/* Transmit Time-slot Offset */ -	cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e); -	/* Receive  Clock-Slot offset */ -	cpc_writeb(falcbase + F_REG(RC0, ch), 0x05); -	/* Receive  Time-slot offset */ -	cpc_writeb(falcbase + F_REG(RC1, ch), 0x00); - -	/* LOS Detection after 176 consecutive 0s */ -	cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a); -	/* LOS Recovery after 22 ones in the time window of PCD */ -	cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15); - -	cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f); - -	if (conf->fr_mode == PC300_FR_ESF_JAPAN) { -		cpc_writeb(falcbase + F_REG(RC1, ch), -			   cpc_readb(falcbase + F_REG(RC1, ch)) | 0x80); -	} - -	falc_close_all_timeslots(card, ch); -} - -static void falc_init_e1(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; -	u8 dja = (ch ? (LIM2_DJA2 | LIM2_DJA1) : 0); - -	/* Switch to E1 mode (PCM 30) */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), -		   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_PMOD); - -	/* Clock mode */ -	if (conf->phys_settings.clock_type == CLOCK_INT) { /* Master mode */ -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_MAS); -	} else { /* Slave mode */ -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_MAS); -	} -	cpc_writeb(falcbase + F_REG(LOOP, ch), -		   cpc_readb(falcbase + F_REG(LOOP, ch)) & ~LOOP_SFM); - -	cpc_writeb(falcbase + F_REG(IPC, ch), IPC_SCI); -	cpc_writeb(falcbase + F_REG(FMR0, ch), -		   cpc_readb(falcbase + F_REG(FMR0, ch)) & -		   ~(FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1)); - -	switch (conf->lcode) { -		case PC300_LC_AMI: -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) | -				   FMR0_XC1 | FMR0_RC1); -			break; - -		case PC300_LC_HDB3: -			cpc_writeb(falcbase + F_REG(FMR0, ch), -				   cpc_readb(falcbase + F_REG(FMR0, ch)) | -				   FMR0_XC0 | FMR0_XC1 | FMR0_RC0 | FMR0_RC1); -			break; - -		case PC300_LC_NRZ: -			break; -	} - -	cpc_writeb(falcbase + F_REG(LIM0, ch), -		   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~(LIM0_SCL1 | LIM0_SCL0)); -	/* Set interface mode to 2 MBPS */ -	cpc_writeb(falcbase + F_REG(FMR1, ch), -		   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_IMOD); - -	cpc_writeb(falcbase + F_REG(XPM0, ch), 0x18); -	cpc_writeb(falcbase + F_REG(XPM1, ch), 0x03); -	cpc_writeb(falcbase + F_REG(XPM2, ch), 0x00); - -	switch (conf->fr_mode) { -		case PC300_FR_MF_CRC4: -			pfalc->multiframe_mode = 1; -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_XFS); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_RFS1); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_RFS0); -			cpc_writeb(falcbase + F_REG(FMR3, ch), -				   cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_EXTIW); - -			/* MultiFrame Resynchronization */ -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_MFCS); - -			/* Automatic Loss of Multiframe > 914 CRC errors */ -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_ALMF); - -			/* S1 and SI1/SI2 spare Bits set to 1 */ -			cpc_writeb(falcbase + F_REG(XSP, ch), -				   cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_AXS); -			cpc_writeb(falcbase + F_REG(XSP, ch), -				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_EBP); -			cpc_writeb(falcbase + F_REG(XSP, ch), -				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XS13 | XSP_XS15); - -			/* Automatic Force Resynchronization */ -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR); - -			/* Transmit Automatic Remote Alarm */ -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA); - -			/* Transmit Spare Bits for National Use (Y, Sn, Sa) */ -			cpc_writeb(falcbase + F_REG(XSW, ch), -				   cpc_readb(falcbase + F_REG(XSW, ch)) | -				   XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4); -			break; - -		case PC300_FR_MF_NON_CRC4: -		case PC300_FR_D4: -			pfalc->multiframe_mode = 0; -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) &  -				   ~(FMR2_RFS1 | FMR2_RFS0)); -			cpc_writeb(falcbase + F_REG(XSW, ch), -				   cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XSIS); -			cpc_writeb(falcbase + F_REG(XSP, ch), -				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_XSIF); - -			/* Automatic Force Resynchronization */ -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) | FMR1_AFR); - -			/* Transmit Automatic Remote Alarm */ -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_AXRA); - -			/* Transmit Spare Bits for National Use (Y, Sn, Sa) */ -			cpc_writeb(falcbase + F_REG(XSW, ch), -				   cpc_readb(falcbase + F_REG(XSW, ch)) | -				   XSW_XY0 | XSW_XY1 | XSW_XY2 | XSW_XY3 | XSW_XY4); -			break; - -		case PC300_FR_UNFRAMED: -			pfalc->multiframe_mode = 0; -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_XFS); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) &  -				   ~(FMR2_RFS1 | FMR2_RFS0)); -			cpc_writeb(falcbase + F_REG(XSP, ch), -				   cpc_readb(falcbase + F_REG(XSP, ch)) | XSP_TT0); -			cpc_writeb(falcbase + F_REG(XSW, ch), -				   cpc_readb(falcbase + F_REG(XSW, ch)) &  -				   ~(XSW_XTM|XSW_XY0|XSW_XY1|XSW_XY2|XSW_XY3|XSW_XY4)); -			cpc_writeb(falcbase + F_REG(TSWM, ch), 0xff); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) | -				   (FMR2_RTM | FMR2_DAIS)); -			cpc_writeb(falcbase + F_REG(FMR2, ch), -				   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_AXRA); -			cpc_writeb(falcbase + F_REG(FMR1, ch), -				   cpc_readb(falcbase + F_REG(FMR1, ch)) & ~FMR1_AFR); -			pfalc->sync = 1; -			cpc_writeb(falcbase + card->hw.cpld_reg2, -				   cpc_readb(falcbase + card->hw.cpld_reg2) | -				   (CPLD_REG2_FALC_LED2 << (2 * ch))); -			break; -	} - -	/* No signaling */ -	cpc_writeb(falcbase + F_REG(XSP, ch), -		   cpc_readb(falcbase + F_REG(XSP, ch)) & ~XSP_CASEN); -	cpc_writeb(falcbase + F_REG(CCR1, ch), 0); - -	cpc_writeb(falcbase + F_REG(LIM1, ch), -		   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RIL0 | LIM1_RIL1); -	cpc_writeb(falcbase + F_REG(LIM2, ch), (LIM2_LOS1 | dja)); - -	/* Transmit Clock-Slot Offset */ -	cpc_writeb(falcbase + F_REG(XC0, ch), -		   cpc_readb(falcbase + F_REG(XC0, ch)) | 0x01); -	/* Transmit Time-slot Offset */ -	cpc_writeb(falcbase + F_REG(XC1, ch), 0x3e); -	/* Receive  Clock-Slot offset */ -	cpc_writeb(falcbase + F_REG(RC0, ch), 0x05); -	/* Receive  Time-slot offset */ -	cpc_writeb(falcbase + F_REG(RC1, ch), 0x00); - -	/* LOS Detection after 176 consecutive 0s */ -	cpc_writeb(falcbase + F_REG(PCDR, ch), 0x0a); -	/* LOS Recovery after 22 ones in the time window of PCD */ -	cpc_writeb(falcbase + F_REG(PCRR, ch), 0x15); - -	cpc_writeb(falcbase + F_REG(IDLE, ch), 0x7f); - -	falc_close_all_timeslots(card, ch); -} - -static void falc_init_hdlc(pc300_t * card, int ch) -{ -	void __iomem *falcbase = card->hw.falcbase; -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; - -	/* Enable transparent data transfer */ -	if (conf->fr_mode == PC300_FR_UNFRAMED) { -		cpc_writeb(falcbase + F_REG(MODE, ch), 0); -	} else { -		cpc_writeb(falcbase + F_REG(MODE, ch), -			   cpc_readb(falcbase + F_REG(MODE, ch)) | -			   (MODE_HRAC | MODE_MDS2)); -		cpc_writeb(falcbase + F_REG(RAH2, ch), 0xff); -		cpc_writeb(falcbase + F_REG(RAH1, ch), 0xff); -		cpc_writeb(falcbase + F_REG(RAL2, ch), 0xff); -		cpc_writeb(falcbase + F_REG(RAL1, ch), 0xff); -	} - -	/* Tx/Rx reset  */ -	falc_issue_cmd(card, ch, CMDR_RRES | CMDR_XRES | CMDR_SRES); - -	/* Enable interrupt sources */ -	falc_intr_enable(card, ch); -} - -static void te_config(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; -	u8 dummy; -	unsigned long flags; - -	memset(pfalc, 0, sizeof(falc_t)); -	switch (conf->media) { -		case IF_IFACE_T1: -			pfalc->num_channels = NUM_OF_T1_CHANNELS; -			pfalc->offset = 1; -			break; -		case IF_IFACE_E1: -			pfalc->num_channels = NUM_OF_E1_CHANNELS; -			pfalc->offset = 0; -			break; -	} -	if (conf->tslot_bitmap == 0xffffffffUL) -		pfalc->full_bandwidth = 1; -	else -		pfalc->full_bandwidth = 0; - -	CPC_LOCK(card, flags); -	/* Reset the FALC chip */ -	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) | -		   (CPLD_REG1_FALC_RESET << (2 * ch))); -	udelay(10000); -	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) & -		   ~(CPLD_REG1_FALC_RESET << (2 * ch))); - -	if (conf->media == IF_IFACE_T1) { -		falc_init_t1(card, ch); -	} else { -		falc_init_e1(card, ch); -	} -	falc_init_hdlc(card, ch); -	if (conf->rx_sens == PC300_RX_SENS_SH) { -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_EQON); -	} else { -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_EQON); -	} -	cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -		   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) | -		   ((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK) << (2 * ch))); - -	/* Clear all interrupt registers */ -	dummy = cpc_readb(falcbase + F_REG(FISR0, ch)) + -		cpc_readb(falcbase + F_REG(FISR1, ch)) + -		cpc_readb(falcbase + F_REG(FISR2, ch)) + -		cpc_readb(falcbase + F_REG(FISR3, ch)); -	CPC_UNLOCK(card, flags); -} - -static void falc_check_status(pc300_t * card, int ch, unsigned char frs0) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	/* Verify LOS */ -	if (frs0 & FRS0_LOS) { -		if (!pfalc->red_alarm) { -			pfalc->red_alarm = 1; -			pfalc->los++; -			if (!pfalc->blue_alarm) { -				// EVENT_FALC_ABNORMAL -				if (conf->media == IF_IFACE_T1) { -					/* Disable this interrupt as it may otherwise interfere  -					 * with other working boards. */ -					cpc_writeb(falcbase + F_REG(IMR0, ch),  -						   cpc_readb(falcbase + F_REG(IMR0, ch)) -						   | IMR0_PDEN); -				} -				falc_disable_comm(card, ch); -				// EVENT_FALC_ABNORMAL -			} -		} -	} else { -		if (pfalc->red_alarm) { -			pfalc->red_alarm = 0; -			pfalc->losr++; -		} -	} - -	if (conf->fr_mode != PC300_FR_UNFRAMED) { -		/* Verify AIS alarm */ -		if (frs0 & FRS0_AIS) { -			if (!pfalc->blue_alarm) { -				pfalc->blue_alarm = 1; -				pfalc->ais++; -				// EVENT_AIS -				if (conf->media == IF_IFACE_T1) { -					/* Disable this interrupt as it may otherwise interfere with                       other working boards. */ -					cpc_writeb(falcbase + F_REG(IMR0, ch), -						   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN); -				} -				falc_disable_comm(card, ch); -				// EVENT_AIS -			} -		} else { -			pfalc->blue_alarm = 0; -		} - -		/* Verify LFA */ -		if (frs0 & FRS0_LFA) { -			if (!pfalc->loss_fa) { -				pfalc->loss_fa = 1; -				pfalc->lfa++; -				if (!pfalc->blue_alarm && !pfalc->red_alarm) { -					// EVENT_FALC_ABNORMAL -					if (conf->media == IF_IFACE_T1) { -						/* Disable this interrupt as it may otherwise  -						 * interfere with other working boards. */ -						cpc_writeb(falcbase + F_REG(IMR0, ch), -							   cpc_readb(falcbase + F_REG(IMR0, ch)) -							   | IMR0_PDEN); -					} -					falc_disable_comm(card, ch); -					// EVENT_FALC_ABNORMAL -				} -			} -		} else { -			if (pfalc->loss_fa) { -				pfalc->loss_fa = 0; -				pfalc->farec++; -			} -		} - -		/* Verify LMFA */ -		if (pfalc->multiframe_mode && (frs0 & FRS0_LMFA)) { -			/* D4 or CRC4 frame mode */ -			if (!pfalc->loss_mfa) { -				pfalc->loss_mfa = 1; -				pfalc->lmfa++; -				if (!pfalc->blue_alarm && !pfalc->red_alarm && -				    !pfalc->loss_fa) { -					// EVENT_FALC_ABNORMAL -					if (conf->media == IF_IFACE_T1) { -						/* Disable this interrupt as it may otherwise  -						 * interfere with other working boards. */ -						cpc_writeb(falcbase + F_REG(IMR0, ch), -							   cpc_readb(falcbase + F_REG(IMR0, ch)) -							   | IMR0_PDEN); -					} -					falc_disable_comm(card, ch); -					// EVENT_FALC_ABNORMAL -				} -			} -		} else { -			pfalc->loss_mfa = 0; -		} - -		/* Verify Remote Alarm */ -		if (frs0 & FRS0_RRA) { -			if (!pfalc->yellow_alarm) { -				pfalc->yellow_alarm = 1; -				pfalc->rai++; -				if (pfalc->sync) { -					// EVENT_RAI -					falc_disable_comm(card, ch); -					// EVENT_RAI -				} -			} -		} else { -			pfalc->yellow_alarm = 0; -		} -	} /* if !PC300_UNFRAMED */ - -	if (pfalc->red_alarm || pfalc->loss_fa || -	    pfalc->loss_mfa || pfalc->blue_alarm) { -		if (pfalc->sync) { -			pfalc->sync = 0; -			chan->d.line_off++; -			cpc_writeb(falcbase + card->hw.cpld_reg2, -				   cpc_readb(falcbase + card->hw.cpld_reg2) & -				   ~(CPLD_REG2_FALC_LED2 << (2 * ch))); -		} -	} else { -		if (!pfalc->sync) { -			pfalc->sync = 1; -			chan->d.line_on++; -			cpc_writeb(falcbase + card->hw.cpld_reg2, -				   cpc_readb(falcbase + card->hw.cpld_reg2) | -				   (CPLD_REG2_FALC_LED2 << (2 * ch))); -		} -	} - -	if (pfalc->sync && !pfalc->yellow_alarm) { -		if (!pfalc->active) { -			// EVENT_FALC_NORMAL -			if (pfalc->loop_active) { -				return; -			} -			if (conf->media == IF_IFACE_T1) { -				cpc_writeb(falcbase + F_REG(IMR0, ch), -					   cpc_readb(falcbase + F_REG(IMR0, ch)) & ~IMR0_PDEN); -			} -			falc_enable_comm(card, ch); -			// EVENT_FALC_NORMAL -			pfalc->active = 1; -		} -	} else { -		if (pfalc->active) { -			pfalc->active = 0; -		} -	} -} - -static void falc_update_stats(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; -	u16 counter; - -	counter = cpc_readb(falcbase + F_REG(FECL, ch)); -	counter |= cpc_readb(falcbase + F_REG(FECH, ch)) << 8; -	pfalc->fec += counter; - -	counter = cpc_readb(falcbase + F_REG(CVCL, ch)); -	counter |= cpc_readb(falcbase + F_REG(CVCH, ch)) << 8; -	pfalc->cvc += counter; - -	counter = cpc_readb(falcbase + F_REG(CECL, ch)); -	counter |= cpc_readb(falcbase + F_REG(CECH, ch)) << 8; -	pfalc->cec += counter; - -	counter = cpc_readb(falcbase + F_REG(EBCL, ch)); -	counter |= cpc_readb(falcbase + F_REG(EBCH, ch)) << 8; -	pfalc->ebc += counter; - -	if (cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) { -		mdelay(10); -		counter = cpc_readb(falcbase + F_REG(BECL, ch)); -		counter |= cpc_readb(falcbase + F_REG(BECH, ch)) << 8; -		pfalc->bec += counter; - -		if (((conf->media == IF_IFACE_T1) && -		     (cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_LLBAD) && -		     (!(cpc_readb(falcbase + F_REG(FRS1, ch)) & FRS1_PDEN))) || -		    ((conf->media == IF_IFACE_E1) && -		     (cpc_readb(falcbase + F_REG(RSP, ch)) & RSP_LLBAD))) { -			pfalc->prbs = 2; -		} else { -			pfalc->prbs = 1; -		} -	} -} - -/*---------------------------------------------------------------------------- - * falc_remote_loop - *---------------------------------------------------------------------------- - * Description:	In the remote loopback mode the clock and data recovered - *		from the line inputs RL1/2 or RDIP/RDIN are routed back - *		to the line outputs XL1/2 or XDOP/XDON via the analog - *		transmitter. As in normal mode they are processsed by - *		the synchronizer and then sent to the system interface. - *---------------------------------------------------------------------------- - */ -static void falc_remote_loop(pc300_t * card, int ch, int loop_on) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (loop_on) { -		// EVENT_FALC_ABNORMAL -		if (conf->media == IF_IFACE_T1) { -			/* Disable this interrupt as it may otherwise interfere with  -			 * other working boards. */ -			cpc_writeb(falcbase + F_REG(IMR0, ch), -				   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN); -		} -		falc_disable_comm(card, ch); -		// EVENT_FALC_ABNORMAL -		cpc_writeb(falcbase + F_REG(LIM1, ch), -			   cpc_readb(falcbase + F_REG(LIM1, ch)) | LIM1_RL); -		pfalc->loop_active = 1; -	} else { -		cpc_writeb(falcbase + F_REG(LIM1, ch), -			   cpc_readb(falcbase + F_REG(LIM1, ch)) & ~LIM1_RL); -		pfalc->sync = 0; -		cpc_writeb(falcbase + card->hw.cpld_reg2, -			   cpc_readb(falcbase + card->hw.cpld_reg2) & -			   ~(CPLD_REG2_FALC_LED2 << (2 * ch))); -		pfalc->active = 0; -		falc_issue_cmd(card, ch, CMDR_XRES); -		pfalc->loop_active = 0; -	} -} - -/*---------------------------------------------------------------------------- - * falc_local_loop - *---------------------------------------------------------------------------- - * Description: The local loopback mode disconnects the receive lines  - *		RL1/RL2 resp. RDIP/RDIN from the receiver. Instead of the - *		signals coming from the line the data provided by system - *		interface are routed through the analog receiver back to - *		the system interface. The unipolar bit stream will be - *		undisturbed transmitted on the line. Receiver and transmitter - *		coding must be identical. - *---------------------------------------------------------------------------- - */ -static void falc_local_loop(pc300_t * card, int ch, int loop_on) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (loop_on) { -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) | LIM0_LL); -		pfalc->loop_active = 1; -	} else { -		cpc_writeb(falcbase + F_REG(LIM0, ch), -			   cpc_readb(falcbase + F_REG(LIM0, ch)) & ~LIM0_LL); -		pfalc->loop_active = 0; -	} -} - -/*---------------------------------------------------------------------------- - * falc_payload_loop - *---------------------------------------------------------------------------- - * Description: This routine allows to enable/disable payload loopback. - *		When the payload loop is activated, the received 192 bits - *		of payload data will be looped back to the transmit - *		direction. The framing bits, CRC6 and DL bits are not  - *		looped. They are originated by the FALC-LH transmitter. - *---------------------------------------------------------------------------- - */ -static void falc_payload_loop(pc300_t * card, int ch, int loop_on) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (loop_on) { -		// EVENT_FALC_ABNORMAL -		if (conf->media == IF_IFACE_T1) { -			/* Disable this interrupt as it may otherwise interfere with  -			 * other working boards. */ -			cpc_writeb(falcbase + F_REG(IMR0, ch), -				   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN); -		} -		falc_disable_comm(card, ch); -		// EVENT_FALC_ABNORMAL -		cpc_writeb(falcbase + F_REG(FMR2, ch), -			   cpc_readb(falcbase + F_REG(FMR2, ch)) | FMR2_PLB); -		if (conf->media == IF_IFACE_T1) { -			cpc_writeb(falcbase + F_REG(FMR4, ch), -				   cpc_readb(falcbase + F_REG(FMR4, ch)) | FMR4_TM); -		} else { -			cpc_writeb(falcbase + F_REG(FMR5, ch), -				   cpc_readb(falcbase + F_REG(FMR5, ch)) | XSP_TT0); -		} -		falc_open_all_timeslots(card, ch); -		pfalc->loop_active = 2; -	} else { -		cpc_writeb(falcbase + F_REG(FMR2, ch), -			   cpc_readb(falcbase + F_REG(FMR2, ch)) & ~FMR2_PLB); -		if (conf->media == IF_IFACE_T1) { -			cpc_writeb(falcbase + F_REG(FMR4, ch), -				   cpc_readb(falcbase + F_REG(FMR4, ch)) & ~FMR4_TM); -		} else { -			cpc_writeb(falcbase + F_REG(FMR5, ch), -				   cpc_readb(falcbase + F_REG(FMR5, ch)) & ~XSP_TT0); -		} -		pfalc->sync = 0; -		cpc_writeb(falcbase + card->hw.cpld_reg2, -			   cpc_readb(falcbase + card->hw.cpld_reg2) & -			   ~(CPLD_REG2_FALC_LED2 << (2 * ch))); -		pfalc->active = 0; -		falc_issue_cmd(card, ch, CMDR_XRES); -		pfalc->loop_active = 0; -	} -} - -/*---------------------------------------------------------------------------- - * turn_off_xlu - *---------------------------------------------------------------------------- - * Description:	Turns XLU bit off in the proper register - *---------------------------------------------------------------------------- - */ -static void turn_off_xlu(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	void __iomem *falcbase = card->hw.falcbase; - -	if (conf->media == IF_IFACE_T1) { -		cpc_writeb(falcbase + F_REG(FMR5, ch), -			   cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLU); -	} else { -		cpc_writeb(falcbase + F_REG(FMR3, ch), -			   cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLU); -	} -} - -/*---------------------------------------------------------------------------- - * turn_off_xld - *---------------------------------------------------------------------------- - * Description: Turns XLD bit off in the proper register - *---------------------------------------------------------------------------- - */ -static void turn_off_xld(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	void __iomem *falcbase = card->hw.falcbase; - -	if (conf->media == IF_IFACE_T1) { -		cpc_writeb(falcbase + F_REG(FMR5, ch), -			   cpc_readb(falcbase + F_REG(FMR5, ch)) & ~FMR5_XLD); -	} else { -		cpc_writeb(falcbase + F_REG(FMR3, ch), -			   cpc_readb(falcbase + F_REG(FMR3, ch)) & ~FMR3_XLD); -	} -} - -/*---------------------------------------------------------------------------- - * falc_generate_loop_up_code - *---------------------------------------------------------------------------- - * Description:	This routine writes the proper FALC chip register in order - *		to generate a LOOP activation code over a T1/E1 line. - *---------------------------------------------------------------------------- - */ -static void falc_generate_loop_up_code(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (conf->media == IF_IFACE_T1) { -		cpc_writeb(falcbase + F_REG(FMR5, ch), -			   cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLU); -	} else { -		cpc_writeb(falcbase + F_REG(FMR3, ch), -			   cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLU); -	} -	// EVENT_FALC_ABNORMAL -	if (conf->media == IF_IFACE_T1) { -		/* Disable this interrupt as it may otherwise interfere with  -		 * other working boards. */ -		cpc_writeb(falcbase + F_REG(IMR0, ch), -			   cpc_readb(falcbase + F_REG(IMR0, ch)) | IMR0_PDEN); -	} -	falc_disable_comm(card, ch); -	// EVENT_FALC_ABNORMAL -	pfalc->loop_gen = 1; -} - -/*---------------------------------------------------------------------------- - * falc_generate_loop_down_code - *---------------------------------------------------------------------------- - * Description:	This routine writes the proper FALC chip register in order - *		to generate a LOOP deactivation code over a T1/E1 line. - *---------------------------------------------------------------------------- - */ -static void falc_generate_loop_down_code(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (conf->media == IF_IFACE_T1) { -		cpc_writeb(falcbase + F_REG(FMR5, ch), -			   cpc_readb(falcbase + F_REG(FMR5, ch)) | FMR5_XLD); -	} else { -		cpc_writeb(falcbase + F_REG(FMR3, ch), -			   cpc_readb(falcbase + F_REG(FMR3, ch)) | FMR3_XLD); -	} -	pfalc->sync = 0; -	cpc_writeb(falcbase + card->hw.cpld_reg2, -		   cpc_readb(falcbase + card->hw.cpld_reg2) & -		   ~(CPLD_REG2_FALC_LED2 << (2 * ch))); -	pfalc->active = 0; -//?    falc_issue_cmd(card, ch, CMDR_XRES); -	pfalc->loop_gen = 0; -} - -/*---------------------------------------------------------------------------- - * falc_pattern_test - *---------------------------------------------------------------------------- - * Description:	This routine generates a pattern code and checks - *		it on the reception side. - *---------------------------------------------------------------------------- - */ -static void falc_pattern_test(pc300_t * card, int ch, unsigned int activate) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (activate) { -		pfalc->prbs = 1; -		pfalc->bec = 0; -		if (conf->media == IF_IFACE_T1) { -			/* Disable local loop activation/deactivation detect */ -			cpc_writeb(falcbase + F_REG(IMR3, ch), -				   cpc_readb(falcbase + F_REG(IMR3, ch)) | IMR3_LLBSC); -		} else { -			/* Disable local loop activation/deactivation detect */ -			cpc_writeb(falcbase + F_REG(IMR1, ch), -				   cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_LLBSC); -		} -		/* Activates generation and monitoring of PRBS  -		 * (Pseudo Random Bit Sequence) */ -		cpc_writeb(falcbase + F_REG(LCR1, ch), -			   cpc_readb(falcbase + F_REG(LCR1, ch)) | LCR1_EPRM | LCR1_XPRBS); -	} else { -		pfalc->prbs = 0; -		/* Deactivates generation and monitoring of PRBS  -		 * (Pseudo Random Bit Sequence) */ -		cpc_writeb(falcbase + F_REG(LCR1, ch), -			   cpc_readb(falcbase+F_REG(LCR1,ch)) & ~(LCR1_EPRM | LCR1_XPRBS)); -		if (conf->media == IF_IFACE_T1) { -			/* Enable local loop activation/deactivation detect */ -			cpc_writeb(falcbase + F_REG(IMR3, ch), -				   cpc_readb(falcbase + F_REG(IMR3, ch)) & ~IMR3_LLBSC); -		} else { -			/* Enable local loop activation/deactivation detect */ -			cpc_writeb(falcbase + F_REG(IMR1, ch), -				   cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_LLBSC); -		} -	} -} - -/*---------------------------------------------------------------------------- - * falc_pattern_test_error - *---------------------------------------------------------------------------- - * Description:	This routine returns the bit error counter value - *---------------------------------------------------------------------------- - */ -static u16 falc_pattern_test_error(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; - -	return pfalc->bec; -} - -/**********************************/ -/***   Net Interface Routines   ***/ -/**********************************/ - -static void -cpc_trace(struct net_device *dev, struct sk_buff *skb_main, char rx_tx) -{ -	struct sk_buff *skb; - -	if ((skb = dev_alloc_skb(10 + skb_main->len)) == NULL) { -		printk("%s: out of memory\n", dev->name); -		return; -	} -	skb_put(skb, 10 + skb_main->len); - -	skb->dev = dev; -	skb->protocol = htons(ETH_P_CUST); -	skb_reset_mac_header(skb); -	skb->pkt_type = PACKET_HOST; -	skb->len = 10 + skb_main->len; - -	skb_copy_to_linear_data(skb, dev->name, 5); -	skb->data[5] = '['; -	skb->data[6] = rx_tx; -	skb->data[7] = ']'; -	skb->data[8] = ':'; -	skb->data[9] = ' '; -	skb_copy_from_linear_data(skb_main, &skb->data[10], skb_main->len); - -	netif_rx(skb); -} - -static void cpc_tx_timeout(struct net_device *dev) -{ -	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv; -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	int ch = chan->channel; -	unsigned long flags; -	u8 ilar; - -	dev->stats.tx_errors++; -	dev->stats.tx_aborted_errors++; -	CPC_LOCK(card, flags); -	if ((ilar = cpc_readb(card->hw.scabase + ILAR)) != 0) { -		printk("%s: ILAR=0x%x\n", dev->name, ilar); -		cpc_writeb(card->hw.scabase + ILAR, ilar); -		cpc_writeb(card->hw.scabase + DMER, 0x80); -	} -	if (card->hw.type == PC300_TE) { -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) & -			   ~(CPLD_REG2_FALC_LED1 << (2 * ch))); -	} -	dev->trans_start = jiffies; /* prevent tx timeout */ -	CPC_UNLOCK(card, flags); -	netif_wake_queue(dev); -} - -static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev) -{ -	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv; -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	int ch = chan->channel; -	unsigned long flags; -#ifdef PC300_DEBUG_TX -	int i; -#endif - -	if (!netif_carrier_ok(dev)) { -		/* DCD must be OFF: drop packet */ -		dev_kfree_skb(skb); -		dev->stats.tx_errors++; -		dev->stats.tx_carrier_errors++; -		return 0; -	} else if (cpc_readb(card->hw.scabase + M_REG(ST3, ch)) & ST3_DCD) { -		printk("%s: DCD is OFF. Going administrative down.\n", dev->name); -		dev->stats.tx_errors++; -		dev->stats.tx_carrier_errors++; -		dev_kfree_skb(skb); -		netif_carrier_off(dev); -		CPC_LOCK(card, flags); -		cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_BUF_CLR); -		if (card->hw.type == PC300_TE) { -			cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -				   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &  -				   			~(CPLD_REG2_FALC_LED1 << (2 * ch))); -		} -		CPC_UNLOCK(card, flags); -		netif_wake_queue(dev); -		return 0; -	} - -	/* Write buffer to DMA buffers */ -	if (dma_buf_write(card, ch, (u8 *)skb->data, skb->len) != 0) { -//		printk("%s: write error. Dropping TX packet.\n", dev->name); -		netif_stop_queue(dev); -		dev_kfree_skb(skb); -		dev->stats.tx_errors++; -		dev->stats.tx_dropped++; -		return 0; -	} -#ifdef PC300_DEBUG_TX -	printk("%s T:", dev->name); -	for (i = 0; i < skb->len; i++) -		printk(" %02x", *(skb->data + i)); -	printk("\n"); -#endif - -	if (d->trace_on) { -		cpc_trace(dev, skb, 'T'); -	} - -	/* Start transmission */ -	CPC_LOCK(card, flags); -	/* verify if it has more than one free descriptor */ -	if (card->chan[ch].nfree_tx_bd <= 1) { -		/* don't have so stop the queue */ -		netif_stop_queue(dev); -	} -	cpc_writel(card->hw.scabase + DTX_REG(EDAL, ch), -		   TX_BD_ADDR(ch, chan->tx_next_bd)); -	cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_ENA); -	cpc_writeb(card->hw.scabase + DSR_TX(ch), DSR_DE); -	if (card->hw.type == PC300_TE) { -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) | -			   (CPLD_REG2_FALC_LED1 << (2 * ch))); -	} -	CPC_UNLOCK(card, flags); -	dev_kfree_skb(skb); - -	return 0; -} - -static void cpc_net_rx(struct net_device *dev) -{ -	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv; -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	int ch = chan->channel; -#ifdef PC300_DEBUG_RX -	int i; -#endif -	int rxb; -	struct sk_buff *skb; - -	while (1) { -		if ((rxb = dma_get_rx_frame_size(card, ch)) == -1) -			return; - -		if (!netif_carrier_ok(dev)) { -			/* DCD must be OFF: drop packet */ -		    printk("%s : DCD is OFF - drop %d rx bytes\n", dev->name, rxb);  -			skb = NULL; -		} else { -			if (rxb > (dev->mtu + 40)) { /* add headers */ -				printk("%s : MTU exceeded %d\n", dev->name, rxb);  -				skb = NULL; -			} else { -				skb = dev_alloc_skb(rxb); -				if (skb == NULL) { -					printk("%s: Memory squeeze!!\n", dev->name); -					return; -				} -				skb->dev = dev; -			} -		} - -		if (((rxb = dma_buf_read(card, ch, skb)) <= 0) || (skb == NULL)) { -#ifdef PC300_DEBUG_RX -			printk("%s: rxb = %x\n", dev->name, rxb); -#endif -			if ((skb == NULL) && (rxb > 0)) { -				/* rxb > dev->mtu */ -				dev->stats.rx_errors++; -				dev->stats.rx_length_errors++; -				continue; -			} - -			if (rxb < 0) {	/* Invalid frame */ -				rxb = -rxb; -				if (rxb & DST_OVR) { -					dev->stats.rx_errors++; -					dev->stats.rx_fifo_errors++; -				} -				if (rxb & DST_CRC) { -					dev->stats.rx_errors++; -					dev->stats.rx_crc_errors++; -				} -				if (rxb & (DST_RBIT | DST_SHRT | DST_ABT)) { -					dev->stats.rx_errors++; -					dev->stats.rx_frame_errors++; -				} -			} -			if (skb) { -				dev_kfree_skb_irq(skb); -			} -			continue; -		} - -		dev->stats.rx_bytes += rxb; - -#ifdef PC300_DEBUG_RX -		printk("%s R:", dev->name); -		for (i = 0; i < skb->len; i++) -			printk(" %02x", *(skb->data + i)); -		printk("\n"); -#endif -		if (d->trace_on) { -			cpc_trace(dev, skb, 'R'); -		} -		dev->stats.rx_packets++; -		skb->protocol = hdlc_type_trans(skb, dev); -		netif_rx(skb); -	} -} - -/************************************/ -/***   PC300 Interrupt Routines   ***/ -/************************************/ -static void sca_tx_intr(pc300dev_t *dev) -{ -	pc300ch_t *chan = (pc300ch_t *)dev->chan;  -	pc300_t *card = (pc300_t *)chan->card;  -	int ch = chan->channel;  -	volatile pcsca_bd_t __iomem * ptdescr;  - -    /* Clean up descriptors from previous transmission */ -	ptdescr = (card->hw.rambase + -						TX_BD_ADDR(ch,chan->tx_first_bd)); -	while ((cpc_readl(card->hw.scabase + DTX_REG(CDAL,ch)) != -		TX_BD_ADDR(ch,chan->tx_first_bd)) && -	       (cpc_readb(&ptdescr->status) & DST_OSB)) { -		dev->dev->stats.tx_packets++; -		dev->dev->stats.tx_bytes += cpc_readw(&ptdescr->len); -		cpc_writeb(&ptdescr->status, DST_OSB); -		cpc_writew(&ptdescr->len, 0); -		chan->nfree_tx_bd++; -		chan->tx_first_bd = (chan->tx_first_bd + 1) & (N_DMA_TX_BUF - 1); -		ptdescr = (card->hw.rambase + TX_BD_ADDR(ch,chan->tx_first_bd)); -    } - -#ifdef CONFIG_PC300_MLPPP -	if (chan->conf.proto == PC300_PROTO_MLPPP) { -			cpc_tty_trigger_poll(dev); -	} else { -#endif -	/* Tell the upper layer we are ready to transmit more packets */ -		netif_wake_queue(dev->dev); -#ifdef CONFIG_PC300_MLPPP -	} -#endif -} - -static void sca_intr(pc300_t * card) -{ -	void __iomem *scabase = card->hw.scabase; -	volatile u32 status; -	int ch; -	int intr_count = 0; -	unsigned char dsr_rx; - -	while ((status = cpc_readl(scabase + ISR0)) != 0) { -		for (ch = 0; ch < card->hw.nchan; ch++) { -			pc300ch_t *chan = &card->chan[ch]; -			pc300dev_t *d = &chan->d; -			struct net_device *dev = d->dev; - -			spin_lock(&card->card_lock); - -	    /**** Reception ****/ -			if (status & IR0_DRX((IR0_DMIA | IR0_DMIB), ch)) { -				u8 drx_stat = cpc_readb(scabase + DSR_RX(ch)); - -				/* Clear RX interrupts */ -				cpc_writeb(scabase + DSR_RX(ch), drx_stat | DSR_DWE); - -#ifdef PC300_DEBUG_INTR -				printk ("sca_intr: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n", -					 ch, status, drx_stat); -#endif -				if (status & IR0_DRX(IR0_DMIA, ch)) { -					if (drx_stat & DSR_BOF) { -#ifdef CONFIG_PC300_MLPPP -						if (chan->conf.proto == PC300_PROTO_MLPPP) { -							/* verify if driver is TTY */ -							if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) { -								rx_dma_stop(card, ch); -							} -							cpc_tty_receive(d); -							rx_dma_start(card, ch); -						} else  -#endif -						{ -							if ((cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) { -								rx_dma_stop(card, ch); -							} -							cpc_net_rx(dev); -							/* Discard invalid frames */ -							dev->stats.rx_errors++; -							dev->stats.rx_over_errors++; -							chan->rx_first_bd = 0; -							chan->rx_last_bd = N_DMA_RX_BUF - 1; -							rx_dma_start(card, ch); -						} -					} -				} -				if (status & IR0_DRX(IR0_DMIB, ch)) { -					if (drx_stat & DSR_EOM) { -						if (card->hw.type == PC300_TE) { -							cpc_writeb(card->hw.falcbase + -								   card->hw.cpld_reg2, -								   cpc_readb (card->hw.falcbase + -								    	card->hw.cpld_reg2) | -								   (CPLD_REG2_FALC_LED1 << (2 * ch))); -						} -#ifdef CONFIG_PC300_MLPPP -						if (chan->conf.proto == PC300_PROTO_MLPPP) { -							/* verify if driver is TTY */ -							cpc_tty_receive(d); -						} else { -							cpc_net_rx(dev); -						} -#else -						cpc_net_rx(dev); -#endif -						if (card->hw.type == PC300_TE) { -							cpc_writeb(card->hw.falcbase + -								   card->hw.cpld_reg2, -								   cpc_readb (card->hw.falcbase + -								    		card->hw.cpld_reg2) & -								   ~ (CPLD_REG2_FALC_LED1 << (2 * ch))); -						} -					} -				} -				if (!(dsr_rx = cpc_readb(scabase + DSR_RX(ch)) & DSR_DE)) { -#ifdef PC300_DEBUG_INTR -		printk("%s: RX intr chan[%d] (st=0x%08lx, dsr=0x%02x, dsr2=0x%02x)\n", -			dev->name, ch, status, drx_stat, dsr_rx); -#endif -					cpc_writeb(scabase + DSR_RX(ch), (dsr_rx | DSR_DE) & 0xfe); -				} -			} - -	    /**** Transmission ****/ -			if (status & IR0_DTX((IR0_EFT | IR0_DMIA | IR0_DMIB), ch)) { -				u8 dtx_stat = cpc_readb(scabase + DSR_TX(ch)); - -				/* Clear TX interrupts */ -				cpc_writeb(scabase + DSR_TX(ch), dtx_stat | DSR_DWE); - -#ifdef PC300_DEBUG_INTR -				printk ("sca_intr: TX intr chan[%d] (st=0x%08lx, dsr=0x%02x)\n", -					 ch, status, dtx_stat); -#endif -				if (status & IR0_DTX(IR0_EFT, ch)) { -					if (dtx_stat & DSR_UDRF) { -						if (cpc_readb (scabase + M_REG(TBN, ch)) != 0) { -							cpc_writeb(scabase + M_REG(CMD,ch), CMD_TX_BUF_CLR); -						} -						if (card->hw.type == PC300_TE) { -							cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -								   cpc_readb (card->hw.falcbase +  -										   card->hw.cpld_reg2) & -								   ~ (CPLD_REG2_FALC_LED1 << (2 * ch))); -						} -						dev->stats.tx_errors++; -						dev->stats.tx_fifo_errors++; -						sca_tx_intr(d); -					} -				} -				if (status & IR0_DTX(IR0_DMIA, ch)) { -					if (dtx_stat & DSR_BOF) { -					} -				} -				if (status & IR0_DTX(IR0_DMIB, ch)) { -					if (dtx_stat & DSR_EOM) { -						if (card->hw.type == PC300_TE) { -							cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -								   cpc_readb (card->hw.falcbase + -								    			card->hw.cpld_reg2) & -								   ~ (CPLD_REG2_FALC_LED1 << (2 * ch))); -						} -						sca_tx_intr(d); -					} -				} -			} - -	    /**** MSCI ****/ -			if (status & IR0_M(IR0_RXINTA, ch)) { -				u8 st1 = cpc_readb(scabase + M_REG(ST1, ch)); - -				/* Clear MSCI interrupts */ -				cpc_writeb(scabase + M_REG(ST1, ch), st1); - -#ifdef PC300_DEBUG_INTR -				printk("sca_intr: MSCI intr chan[%d] (st=0x%08lx, st1=0x%02x)\n", -					 ch, status, st1); -#endif -				if (st1 & ST1_CDCD) {	/* DCD changed */ -					if (cpc_readb(scabase + M_REG(ST3, ch)) & ST3_DCD) { -						printk ("%s: DCD is OFF. Going administrative down.\n", -							 dev->name); -#ifdef CONFIG_PC300_MLPPP -						if (chan->conf.proto != PC300_PROTO_MLPPP) { -							netif_carrier_off(dev); -						} -#else -						netif_carrier_off(dev); - -#endif -						card->chan[ch].d.line_off++; -					} else {	/* DCD = 1 */ -						printk ("%s: DCD is ON. Going administrative up.\n", -							 dev->name); -#ifdef CONFIG_PC300_MLPPP -						if (chan->conf.proto != PC300_PROTO_MLPPP) -							/* verify if driver is not TTY */ -#endif -							netif_carrier_on(dev); -						card->chan[ch].d.line_on++; -					} -				} -			} -			spin_unlock(&card->card_lock); -		} -		if (++intr_count == 10) -			/* Too much work at this board. Force exit */ -			break; -	} -} - -static void falc_t1_loop_detection(pc300_t *card, int ch, u8 frs1) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) && -	    !pfalc->loop_gen) { -		if (frs1 & FRS1_LLBDD) { -			// A Line Loop Back Deactivation signal detected -			if (pfalc->loop_active) { -				falc_remote_loop(card, ch, 0); -			} -		} else { -			if ((frs1 & FRS1_LLBAD) && -			    ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) { -				// A Line Loop Back Activation signal detected   -				if (!pfalc->loop_active) { -					falc_remote_loop(card, ch, 1); -				} -			} -		} -	} -} - -static void falc_e1_loop_detection(pc300_t *card, int ch, u8 rsp) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; - -	if (((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_XPRBS) == 0) && -	    !pfalc->loop_gen) { -		if (rsp & RSP_LLBDD) { -			// A Line Loop Back Deactivation signal detected -			if (pfalc->loop_active) { -				falc_remote_loop(card, ch, 0); -			} -		} else { -			if ((rsp & RSP_LLBAD) && -			    ((cpc_readb(falcbase + F_REG(LCR1, ch)) & LCR1_EPRM) == 0)) { -				// A Line Loop Back Activation signal detected   -				if (!pfalc->loop_active) { -					falc_remote_loop(card, ch, 1); -				} -			} -		} -	} -} - -static void falc_t1_intr(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; -	u8 isr0, isr3, gis; -	u8 dummy; - -	while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) { -		if (gis & GIS_ISR0) { -			isr0 = cpc_readb(falcbase + F_REG(FISR0, ch)); -			if (isr0 & FISR0_PDEN) { -				/* Read the bit to clear the situation */ -				if (cpc_readb(falcbase + F_REG(FRS1, ch)) & -				    FRS1_PDEN) { -					pfalc->pden++; -				} -			} -		} - -		if (gis & GIS_ISR1) { -			dummy = cpc_readb(falcbase + F_REG(FISR1, ch)); -		} - -		if (gis & GIS_ISR2) { -			dummy = cpc_readb(falcbase + F_REG(FISR2, ch)); -		} - -		if (gis & GIS_ISR3) { -			isr3 = cpc_readb(falcbase + F_REG(FISR3, ch)); -			if (isr3 & FISR3_SEC) { -				pfalc->sec++; -				falc_update_stats(card, ch); -				falc_check_status(card, ch, -						  cpc_readb(falcbase + F_REG(FRS0, ch))); -			} -			if (isr3 & FISR3_ES) { -				pfalc->es++; -			} -			if (isr3 & FISR3_LLBSC) { -				falc_t1_loop_detection(card, ch, -						       cpc_readb(falcbase + F_REG(FRS1, ch))); -			} -		} -	} -} - -static void falc_e1_intr(pc300_t * card, int ch) -{ -	pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; -	void __iomem *falcbase = card->hw.falcbase; -	u8 isr1, isr2, isr3, gis, rsp; -	u8 dummy; - -	while ((gis = cpc_readb(falcbase + F_REG(GIS, ch))) != 0) { -		rsp = cpc_readb(falcbase + F_REG(RSP, ch)); - -		if (gis & GIS_ISR0) { -			dummy = cpc_readb(falcbase + F_REG(FISR0, ch)); -		} -		if (gis & GIS_ISR1) { -			isr1 = cpc_readb(falcbase + F_REG(FISR1, ch)); -			if (isr1 & FISR1_XMB) { -				if ((pfalc->xmb_cause & 2) && -				    pfalc->multiframe_mode) { -					if (cpc_readb (falcbase + F_REG(FRS0, ch)) &  -									(FRS0_LOS | FRS0_AIS | FRS0_LFA)) { -						cpc_writeb(falcbase + F_REG(XSP, ch), -							   cpc_readb(falcbase + F_REG(XSP, ch)) -							   & ~XSP_AXS); -					} else { -						cpc_writeb(falcbase + F_REG(XSP, ch), -							   cpc_readb(falcbase + F_REG(XSP, ch)) -							   | XSP_AXS); -					} -				} -				pfalc->xmb_cause = 0; -				cpc_writeb(falcbase + F_REG(IMR1, ch), -					   cpc_readb(falcbase + F_REG(IMR1, ch)) | IMR1_XMB); -			} -			if (isr1 & FISR1_LLBSC) { -				falc_e1_loop_detection(card, ch, rsp); -			} -		} -		if (gis & GIS_ISR2) { -			isr2 = cpc_readb(falcbase + F_REG(FISR2, ch)); -			if (isr2 & FISR2_T400MS) { -				cpc_writeb(falcbase + F_REG(XSW, ch), -					   cpc_readb(falcbase + F_REG(XSW, ch)) | XSW_XRA); -			} -			if (isr2 & FISR2_MFAR) { -				cpc_writeb(falcbase + F_REG(XSW, ch), -					   cpc_readb(falcbase + F_REG(XSW, ch)) & ~XSW_XRA); -			} -			if (isr2 & (FISR2_FAR | FISR2_LFA | FISR2_AIS | FISR2_LOS)) { -				pfalc->xmb_cause |= 2; -				cpc_writeb(falcbase + F_REG(IMR1, ch), -					   cpc_readb(falcbase + F_REG(IMR1, ch)) & ~IMR1_XMB); -			} -		} -		if (gis & GIS_ISR3) { -			isr3 = cpc_readb(falcbase + F_REG(FISR3, ch)); -			if (isr3 & FISR3_SEC) { -				pfalc->sec++; -				falc_update_stats(card, ch); -				falc_check_status(card, ch, -						  cpc_readb(falcbase + F_REG(FRS0, ch))); -			} -			if (isr3 & FISR3_ES) { -				pfalc->es++; -			} -		} -	} -} - -static void falc_intr(pc300_t * card) -{ -	int ch; - -	for (ch = 0; ch < card->hw.nchan; ch++) { -		pc300ch_t *chan = &card->chan[ch]; -		pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; - -		if (conf->media == IF_IFACE_T1) { -			falc_t1_intr(card, ch); -		} else { -			falc_e1_intr(card, ch); -		} -	} -} - -static irqreturn_t cpc_intr(int irq, void *dev_id) -{ -	pc300_t *card = dev_id; -	volatile u8 plx_status; - -	if (!card) { -#ifdef PC300_DEBUG_INTR -		printk("cpc_intr: spurious intr %d\n", irq); -#endif -		return IRQ_NONE;		/* spurious intr */ -	} - -	if (!card->hw.rambase) { -#ifdef PC300_DEBUG_INTR -		printk("cpc_intr: spurious intr2 %d\n", irq); -#endif -		return IRQ_NONE;		/* spurious intr */ -	} - -	switch (card->hw.type) { -		case PC300_RSV: -		case PC300_X21: -			sca_intr(card); -			break; - -		case PC300_TE: -			while ( (plx_status = (cpc_readb(card->hw.plxbase + card->hw.intctl_reg) & -				 (PLX_9050_LINT1_STATUS | PLX_9050_LINT2_STATUS))) != 0) { -				if (plx_status & PLX_9050_LINT1_STATUS) {	/* SCA Interrupt */ -					sca_intr(card); -				} -				if (plx_status & PLX_9050_LINT2_STATUS) {	/* FALC Interrupt */ -					falc_intr(card); -				} -			} -			break; -	} -	return IRQ_HANDLED; -} - -static void cpc_sca_status(pc300_t * card, int ch) -{ -	u8 ilar; -	void __iomem *scabase = card->hw.scabase; -	unsigned long flags; - -	tx_dma_buf_check(card, ch); -	rx_dma_buf_check(card, ch); -	ilar = cpc_readb(scabase + ILAR); -	printk ("ILAR=0x%02x, WCRL=0x%02x, PCR=0x%02x, BTCR=0x%02x, BOLR=0x%02x\n", -		 ilar, cpc_readb(scabase + WCRL), cpc_readb(scabase + PCR), -		 cpc_readb(scabase + BTCR), cpc_readb(scabase + BOLR)); -	printk("TX_CDA=0x%08x, TX_EDA=0x%08x\n", -	       cpc_readl(scabase + DTX_REG(CDAL, ch)), -	       cpc_readl(scabase + DTX_REG(EDAL, ch))); -	printk("RX_CDA=0x%08x, RX_EDA=0x%08x, BFL=0x%04x\n", -	       cpc_readl(scabase + DRX_REG(CDAL, ch)), -	       cpc_readl(scabase + DRX_REG(EDAL, ch)), -	       cpc_readw(scabase + DRX_REG(BFLL, ch))); -	printk("DMER=0x%02x, DSR_TX=0x%02x, DSR_RX=0x%02x\n", -	       cpc_readb(scabase + DMER), cpc_readb(scabase + DSR_TX(ch)), -	       cpc_readb(scabase + DSR_RX(ch))); -	printk("DMR_TX=0x%02x, DMR_RX=0x%02x, DIR_TX=0x%02x, DIR_RX=0x%02x\n", -	       cpc_readb(scabase + DMR_TX(ch)), cpc_readb(scabase + DMR_RX(ch)), -	       cpc_readb(scabase + DIR_TX(ch)), -	       cpc_readb(scabase + DIR_RX(ch))); -	printk("DCR_TX=0x%02x, DCR_RX=0x%02x, FCT_TX=0x%02x, FCT_RX=0x%02x\n", -	       cpc_readb(scabase + DCR_TX(ch)), cpc_readb(scabase + DCR_RX(ch)), -	       cpc_readb(scabase + FCT_TX(ch)), -	       cpc_readb(scabase + FCT_RX(ch))); -	printk("MD0=0x%02x, MD1=0x%02x, MD2=0x%02x, MD3=0x%02x, IDL=0x%02x\n", -	       cpc_readb(scabase + M_REG(MD0, ch)), -	       cpc_readb(scabase + M_REG(MD1, ch)), -	       cpc_readb(scabase + M_REG(MD2, ch)), -	       cpc_readb(scabase + M_REG(MD3, ch)), -	       cpc_readb(scabase + M_REG(IDL, ch))); -	printk("CMD=0x%02x, SA0=0x%02x, SA1=0x%02x, TFN=0x%02x, CTL=0x%02x\n", -	       cpc_readb(scabase + M_REG(CMD, ch)), -	       cpc_readb(scabase + M_REG(SA0, ch)), -	       cpc_readb(scabase + M_REG(SA1, ch)), -	       cpc_readb(scabase + M_REG(TFN, ch)), -	       cpc_readb(scabase + M_REG(CTL, ch))); -	printk("ST0=0x%02x, ST1=0x%02x, ST2=0x%02x, ST3=0x%02x, ST4=0x%02x\n", -	       cpc_readb(scabase + M_REG(ST0, ch)), -	       cpc_readb(scabase + M_REG(ST1, ch)), -	       cpc_readb(scabase + M_REG(ST2, ch)), -	       cpc_readb(scabase + M_REG(ST3, ch)), -	       cpc_readb(scabase + M_REG(ST4, ch))); -	printk ("CST0=0x%02x, CST1=0x%02x, CST2=0x%02x, CST3=0x%02x, FST=0x%02x\n", -		 cpc_readb(scabase + M_REG(CST0, ch)), -		 cpc_readb(scabase + M_REG(CST1, ch)), -		 cpc_readb(scabase + M_REG(CST2, ch)), -		 cpc_readb(scabase + M_REG(CST3, ch)), -		 cpc_readb(scabase + M_REG(FST, ch))); -	printk("TRC0=0x%02x, TRC1=0x%02x, RRC=0x%02x, TBN=0x%02x, RBN=0x%02x\n", -	       cpc_readb(scabase + M_REG(TRC0, ch)), -	       cpc_readb(scabase + M_REG(TRC1, ch)), -	       cpc_readb(scabase + M_REG(RRC, ch)), -	       cpc_readb(scabase + M_REG(TBN, ch)), -	       cpc_readb(scabase + M_REG(RBN, ch))); -	printk("TFS=0x%02x, TNR0=0x%02x, TNR1=0x%02x, RNR=0x%02x\n", -	       cpc_readb(scabase + M_REG(TFS, ch)), -	       cpc_readb(scabase + M_REG(TNR0, ch)), -	       cpc_readb(scabase + M_REG(TNR1, ch)), -	       cpc_readb(scabase + M_REG(RNR, ch))); -	printk("TCR=0x%02x, RCR=0x%02x, TNR1=0x%02x, RNR=0x%02x\n", -	       cpc_readb(scabase + M_REG(TCR, ch)), -	       cpc_readb(scabase + M_REG(RCR, ch)), -	       cpc_readb(scabase + M_REG(TNR1, ch)), -	       cpc_readb(scabase + M_REG(RNR, ch))); -	printk("TXS=0x%02x, RXS=0x%02x, EXS=0x%02x, TMCT=0x%02x, TMCR=0x%02x\n", -	       cpc_readb(scabase + M_REG(TXS, ch)), -	       cpc_readb(scabase + M_REG(RXS, ch)), -	       cpc_readb(scabase + M_REG(EXS, ch)), -	       cpc_readb(scabase + M_REG(TMCT, ch)), -	       cpc_readb(scabase + M_REG(TMCR, ch))); -	printk("IE0=0x%02x, IE1=0x%02x, IE2=0x%02x, IE4=0x%02x, FIE=0x%02x\n", -	       cpc_readb(scabase + M_REG(IE0, ch)), -	       cpc_readb(scabase + M_REG(IE1, ch)), -	       cpc_readb(scabase + M_REG(IE2, ch)), -	       cpc_readb(scabase + M_REG(IE4, ch)), -	       cpc_readb(scabase + M_REG(FIE, ch))); -	printk("IER0=0x%08x\n", cpc_readl(scabase + IER0)); - -	if (ilar != 0) { -		CPC_LOCK(card, flags); -		cpc_writeb(scabase + ILAR, ilar); -		cpc_writeb(scabase + DMER, 0x80); -		CPC_UNLOCK(card, flags); -	} -} - -static void cpc_falc_status(pc300_t * card, int ch) -{ -	pc300ch_t *chan = &card->chan[ch]; -	falc_t *pfalc = (falc_t *) & chan->falc; -	unsigned long flags; - -	CPC_LOCK(card, flags); -	printk("CH%d:   %s %s  %d channels\n", -	       ch, (pfalc->sync ? "SYNC" : ""), (pfalc->active ? "ACTIVE" : ""), -	       pfalc->num_channels); - -	printk("        pden=%d,  los=%d,  losr=%d,  lfa=%d,  farec=%d\n", -	       pfalc->pden, pfalc->los, pfalc->losr, pfalc->lfa, pfalc->farec); -	printk("        lmfa=%d,  ais=%d,  sec=%d,  es=%d,  rai=%d\n", -	       pfalc->lmfa, pfalc->ais, pfalc->sec, pfalc->es, pfalc->rai); -	printk("        bec=%d,  fec=%d,  cvc=%d,  cec=%d,  ebc=%d\n", -	       pfalc->bec, pfalc->fec, pfalc->cvc, pfalc->cec, pfalc->ebc); - -	printk("\n"); -	printk("        STATUS: %s  %s  %s  %s  %s  %s\n", -	       (pfalc->red_alarm ? "RED" : ""), -	       (pfalc->blue_alarm ? "BLU" : ""), -	       (pfalc->yellow_alarm ? "YEL" : ""), -	       (pfalc->loss_fa ? "LFA" : ""), -	       (pfalc->loss_mfa ? "LMF" : ""), (pfalc->prbs ? "PRB" : "")); -	CPC_UNLOCK(card, flags); -} - -static int cpc_change_mtu(struct net_device *dev, int new_mtu) -{ -	if ((new_mtu < 128) || (new_mtu > PC300_DEF_MTU)) -		return -EINVAL; -	dev->mtu = new_mtu; -	return 0; -} - -static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ -	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv; -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	pc300conf_t conf_aux; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	int ch = chan->channel; -	void __user *arg = ifr->ifr_data; -	struct if_settings *settings = &ifr->ifr_settings; -	void __iomem *scabase = card->hw.scabase; - -	if (!capable(CAP_NET_ADMIN)) -		return -EPERM; - -	switch (cmd) { -		case SIOCGPC300CONF: -#ifdef CONFIG_PC300_MLPPP -			if (conf->proto != PC300_PROTO_MLPPP) { -				conf->proto = /* FIXME hdlc->proto.id */ 0; -			} -#else -			conf->proto = /* FIXME hdlc->proto.id */ 0; -#endif -			memcpy(&conf_aux.conf, conf, sizeof(pc300chconf_t)); -			memcpy(&conf_aux.hw, &card->hw, sizeof(pc300hw_t)); -			if (!arg ||  -				copy_to_user(arg, &conf_aux, sizeof(pc300conf_t)))  -				return -EINVAL; -			return 0; -		case SIOCSPC300CONF: -			if (!capable(CAP_NET_ADMIN)) -				return -EPERM; -			if (!arg ||  -				copy_from_user(&conf_aux.conf, arg, sizeof(pc300chconf_t))) -				return -EINVAL; -			if (card->hw.cpld_id < 0x02 && -			    conf_aux.conf.fr_mode == PC300_FR_UNFRAMED) { -				/* CPLD_ID < 0x02 doesn't support Unframed E1 */ -				return -EINVAL; -			} -#ifdef CONFIG_PC300_MLPPP -			if (conf_aux.conf.proto == PC300_PROTO_MLPPP) { -				if (conf->proto != PC300_PROTO_MLPPP) { -					memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t)); -					cpc_tty_init(d);	/* init TTY driver */ -				} -			} else { -				if (conf_aux.conf.proto == 0xffff) { -					if (conf->proto == PC300_PROTO_MLPPP){  -						/* ifdown interface */ -						cpc_close(dev); -					} -				} else { -					memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t)); -					/* FIXME hdlc->proto.id = conf->proto; */ -				} -			} -#else -			memcpy(conf, &conf_aux.conf, sizeof(pc300chconf_t)); -			/* FIXME hdlc->proto.id = conf->proto; */ -#endif -			return 0; -		case SIOCGPC300STATUS: -			cpc_sca_status(card, ch); -			return 0; -		case SIOCGPC300FALCSTATUS: -			cpc_falc_status(card, ch); -			return 0; - -		case SIOCGPC300UTILSTATS: -			{ -				if (!arg) {	/* clear statistics */ -					memset(&dev->stats, 0, sizeof(dev->stats)); -					if (card->hw.type == PC300_TE) { -						memset(&chan->falc, 0, sizeof(falc_t)); -					} -				} else { -					pc300stats_t pc300stats; - -					memset(&pc300stats, 0, sizeof(pc300stats_t)); -					pc300stats.hw_type = card->hw.type; -					pc300stats.line_on = card->chan[ch].d.line_on; -					pc300stats.line_off = card->chan[ch].d.line_off; -					memcpy(&pc300stats.gen_stats, &dev->stats, -					       sizeof(dev->stats)); -					if (card->hw.type == PC300_TE) -						memcpy(&pc300stats.te_stats,&chan->falc,sizeof(falc_t)); -				    	if (copy_to_user(arg, &pc300stats, sizeof(pc300stats_t))) -						return -EFAULT; -				} -				return 0; -			} - -		case SIOCGPC300UTILSTATUS: -			{ -				struct pc300status pc300status; - -				pc300status.hw_type = card->hw.type; -				if (card->hw.type == PC300_TE) { -					pc300status.te_status.sync = chan->falc.sync; -					pc300status.te_status.red_alarm = chan->falc.red_alarm; -					pc300status.te_status.blue_alarm = chan->falc.blue_alarm; -					pc300status.te_status.loss_fa = chan->falc.loss_fa; -					pc300status.te_status.yellow_alarm =chan->falc.yellow_alarm; -					pc300status.te_status.loss_mfa = chan->falc.loss_mfa; -					pc300status.te_status.prbs = chan->falc.prbs; -				} else { -					pc300status.gen_status.dcd = -						!(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_DCD); -					pc300status.gen_status.cts = -						!(cpc_readb (scabase + M_REG(ST3, ch)) & ST3_CTS); -					pc300status.gen_status.rts = -						!(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_RTS); -					pc300status.gen_status.dtr = -						!(cpc_readb (scabase + M_REG(CTL, ch)) & CTL_DTR); -					/* There is no DSR in HD64572 */ -				} -				if (!arg || -				    copy_to_user(arg, &pc300status, sizeof(pc300status_t))) -					return -EINVAL; -				return 0; -			} - -		case SIOCSPC300TRACE: -			/* Sets/resets a trace_flag for the respective device */ -			if (!arg || copy_from_user(&d->trace_on, arg,sizeof(unsigned char))) -					return -EINVAL; -			return 0; - -		case SIOCSPC300LOOPBACK: -			{ -				struct pc300loopback pc300loop; - -				/* TE boards only */ -				if (card->hw.type != PC300_TE) -					return -EINVAL; - -				if (!arg ||  -					copy_from_user(&pc300loop, arg, sizeof(pc300loopback_t))) -						return -EINVAL; -				switch (pc300loop.loop_type) { -					case PC300LOCLOOP:	/* Turn the local loop on/off */ -						falc_local_loop(card, ch, pc300loop.loop_on); -						return 0; - -					case PC300REMLOOP:	/* Turn the remote loop on/off */ -						falc_remote_loop(card, ch, pc300loop.loop_on); -						return 0; - -					case PC300PAYLOADLOOP:	/* Turn the payload loop on/off */ -						falc_payload_loop(card, ch, pc300loop.loop_on); -						return 0; - -					case PC300GENLOOPUP:	/* Generate loop UP */ -						if (pc300loop.loop_on) { -							falc_generate_loop_up_code (card, ch); -						} else { -							turn_off_xlu(card, ch); -						} -						return 0; - -					case PC300GENLOOPDOWN:	/* Generate loop DOWN */ -						if (pc300loop.loop_on) { -							falc_generate_loop_down_code (card, ch); -						} else { -							turn_off_xld(card, ch); -						} -						return 0; - -					default: -						return -EINVAL; -				} -			} - -		case SIOCSPC300PATTERNTEST: -			/* Turn the pattern test on/off and show the errors counter */ -			{ -				struct pc300patterntst pc300patrntst; - -				/* TE boards only */ -				if (card->hw.type != PC300_TE) -					return -EINVAL; - -				if (card->hw.cpld_id < 0x02) { -					/* CPLD_ID < 0x02 doesn't support pattern test */ -					return -EINVAL; -				} - -				if (!arg ||  -					copy_from_user(&pc300patrntst,arg,sizeof(pc300patterntst_t))) -						return -EINVAL; -				if (pc300patrntst.patrntst_on == 2) { -					if (chan->falc.prbs == 0) { -						falc_pattern_test(card, ch, 1); -					} -					pc300patrntst.num_errors = -						falc_pattern_test_error(card, ch); -					if (copy_to_user(arg, &pc300patrntst, -							 sizeof(pc300patterntst_t))) -							return -EINVAL; -				} else { -					falc_pattern_test(card, ch, pc300patrntst.patrntst_on); -				} -				return 0; -			} - -		case SIOCWANDEV: -			switch (ifr->ifr_settings.type) { -				case IF_GET_IFACE: -				{ -					const size_t size = sizeof(sync_serial_settings); -					ifr->ifr_settings.type = conf->media; -					if (ifr->ifr_settings.size < size) { -						/* data size wanted */ -						ifr->ifr_settings.size = size; -						return -ENOBUFS; -					} -	 -					if (copy_to_user(settings->ifs_ifsu.sync, -							 &conf->phys_settings, size)) { -						return -EFAULT; -					} -					return 0; -				} - -				case IF_IFACE_V35: -				case IF_IFACE_V24: -				case IF_IFACE_X21: -				{ -					const size_t size = sizeof(sync_serial_settings); - -					if (!capable(CAP_NET_ADMIN)) { -						return -EPERM; -					} -					/* incorrect data len? */ -					if (ifr->ifr_settings.size != size) { -						return -ENOBUFS; -					} - -					if (copy_from_user(&conf->phys_settings,  -							   settings->ifs_ifsu.sync, size)) { -						return -EFAULT; -					} - -					if (conf->phys_settings.loopback) { -						cpc_writeb(card->hw.scabase + M_REG(MD2, ch), -							cpc_readb(card->hw.scabase + M_REG(MD2, ch)) |  -							MD2_LOOP_MIR); -					} -					conf->media = ifr->ifr_settings.type; -					return 0; -				} - -				case IF_IFACE_T1: -				case IF_IFACE_E1: -				{ -					const size_t te_size = sizeof(te1_settings); -					const size_t size = sizeof(sync_serial_settings); - -					if (!capable(CAP_NET_ADMIN)) { -						return -EPERM; -					} - -					/* incorrect data len? */ -					if (ifr->ifr_settings.size != te_size) { -						return -ENOBUFS; -					} - -					if (copy_from_user(&conf->phys_settings,  -							   settings->ifs_ifsu.te1, size)) { -						return -EFAULT; -					}/* Ignoring HDLC slot_map for a while */ -					 -					if (conf->phys_settings.loopback) { -						cpc_writeb(card->hw.scabase + M_REG(MD2, ch), -							cpc_readb(card->hw.scabase + M_REG(MD2, ch)) |  -							MD2_LOOP_MIR); -					} -					conf->media = ifr->ifr_settings.type; -					return 0; -				} -				default: -					return hdlc_ioctl(dev, ifr, cmd); -			} - -		default: -			return hdlc_ioctl(dev, ifr, cmd); -	} -} - -static int clock_rate_calc(u32 rate, u32 clock, int *br_io) -{ -	int br, tc; -	int br_pwr, error; - -	*br_io = 0; - -	if (rate == 0) -		return 0; - -	for (br = 0, br_pwr = 1; br <= 9; br++, br_pwr <<= 1) { -		if ((tc = clock / br_pwr / rate) <= 0xff) { -			*br_io = br; -			break; -		} -	} - -	if (tc <= 0xff) { -		error = ((rate - (clock / br_pwr / rate)) / rate) * 1000; -		/* Errors bigger than +/- 1% won't be tolerated */ -		if (error < -10 || error > 10) -			return -1; -		else -			return tc; -	} else { -		return -1; -	} -} - -static int ch_config(pc300dev_t * d) -{ -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; -	pc300_t *card = (pc300_t *) chan->card; -	void __iomem *scabase = card->hw.scabase; -	void __iomem *plxbase = card->hw.plxbase; -	int ch = chan->channel; -	u32 clkrate = chan->conf.phys_settings.clock_rate; -	u32 clktype = chan->conf.phys_settings.clock_type; -	u16 encoding = chan->conf.proto_settings.encoding; -	u16 parity = chan->conf.proto_settings.parity; -	u8 md0, md2; - -	/* Reset the channel */ -	cpc_writeb(scabase + M_REG(CMD, ch), CMD_CH_RST); - -	/* Configure the SCA registers */ -	switch (parity) { -		case PARITY_NONE: -			md0 = MD0_BIT_SYNC; -			break; -		case PARITY_CRC16_PR0: -			md0 = MD0_CRC16_0|MD0_CRCC0|MD0_BIT_SYNC; -			break; -		case PARITY_CRC16_PR1: -			md0 = MD0_CRC16_1|MD0_CRCC0|MD0_BIT_SYNC; -			break; -		case PARITY_CRC32_PR1_CCITT: -			md0 = MD0_CRC32|MD0_CRCC0|MD0_BIT_SYNC; -			break; -		case PARITY_CRC16_PR1_CCITT: -		default: -			md0 = MD0_CRC_CCITT|MD0_CRCC0|MD0_BIT_SYNC; -			break; -	} -	switch (encoding) { -		case ENCODING_NRZI: -			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZI; -			break; -		case ENCODING_FM_MARK:	/* FM1 */ -			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM1; -			break; -		case ENCODING_FM_SPACE:	/* FM0 */ -			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_FM0; -			break; -		case ENCODING_MANCHESTER: /* It's not working... */ -			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_FM|MD2_MANCH; -			break; -		case ENCODING_NRZ: -		default: -			md2 = MD2_F_DUPLEX|MD2_ADPLL_X8|MD2_NRZ; -			break; -	} -	cpc_writeb(scabase + M_REG(MD0, ch), md0); -	cpc_writeb(scabase + M_REG(MD1, ch), 0); -	cpc_writeb(scabase + M_REG(MD2, ch), md2); - 	cpc_writeb(scabase + M_REG(IDL, ch), 0x7e); -	cpc_writeb(scabase + M_REG(CTL, ch), CTL_URSKP | CTL_IDLC); - -	/* Configure HW media */ -	switch (card->hw.type) { -		case PC300_RSV: -			if (conf->media == IF_IFACE_V35) { -				cpc_writel((plxbase + card->hw.gpioc_reg), -					   cpc_readl(plxbase + card->hw.gpioc_reg) | PC300_CHMEDIA_MASK(ch)); -			} else { -				cpc_writel((plxbase + card->hw.gpioc_reg), -					   cpc_readl(plxbase + card->hw.gpioc_reg) & ~PC300_CHMEDIA_MASK(ch)); -			} -			break; - -		case PC300_X21: -			break; - -		case PC300_TE: -			te_config(card, ch); -			break; -	} - -	switch (card->hw.type) { -		case PC300_RSV: -		case PC300_X21: -			if (clktype == CLOCK_INT || clktype == CLOCK_TXINT) { -				int tmc, br; - -				/* Calculate the clkrate parameters */ -				tmc = clock_rate_calc(clkrate, card->hw.clock, &br); -				if (tmc < 0) -					return -EIO; -				cpc_writeb(scabase + M_REG(TMCT, ch), tmc); -				cpc_writeb(scabase + M_REG(TXS, ch), -					   (TXS_DTRXC | TXS_IBRG | br)); -				if (clktype == CLOCK_INT) { -					cpc_writeb(scabase + M_REG(TMCR, ch), tmc); -					cpc_writeb(scabase + M_REG(RXS, ch),  -						   (RXS_IBRG | br)); -				} else { -					cpc_writeb(scabase + M_REG(TMCR, ch), 1); -					cpc_writeb(scabase + M_REG(RXS, ch), 0); -				} -	    			if (card->hw.type == PC300_X21) { -					cpc_writeb(scabase + M_REG(GPO, ch), 1); -					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1); -				} else { -					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1); -				} -			} else { -				cpc_writeb(scabase + M_REG(TMCT, ch), 1); -				if (clktype == CLOCK_EXT) { -					cpc_writeb(scabase + M_REG(TXS, ch),  -						   TXS_DTRXC); -				} else { -					cpc_writeb(scabase + M_REG(TXS, ch),  -						   TXS_DTRXC|TXS_RCLK); -				} -	    			cpc_writeb(scabase + M_REG(TMCR, ch), 1); -				cpc_writeb(scabase + M_REG(RXS, ch), 0); -				if (card->hw.type == PC300_X21) { -					cpc_writeb(scabase + M_REG(GPO, ch), 0); -					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1 | EXS_RES1); -				} else { -					cpc_writeb(scabase + M_REG(EXS, ch), EXS_TES1); -				} -			} -			break; - -		case PC300_TE: -			/* SCA always receives clock from the FALC chip */ -			cpc_writeb(scabase + M_REG(TMCT, ch), 1); -			cpc_writeb(scabase + M_REG(TXS, ch), 0); -			cpc_writeb(scabase + M_REG(TMCR, ch), 1); -			cpc_writeb(scabase + M_REG(RXS, ch), 0); -			cpc_writeb(scabase + M_REG(EXS, ch), 0); -			break; -	} - -	/* Enable Interrupts */ -	cpc_writel(scabase + IER0, -		   cpc_readl(scabase + IER0) | -		   IR0_M(IR0_RXINTA, ch) | -		   IR0_DRX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch) | -		   IR0_DTX(IR0_EFT | IR0_DMIA | IR0_DMIB, ch)); -	cpc_writeb(scabase + M_REG(IE0, ch), -		   cpc_readl(scabase + M_REG(IE0, ch)) | IE0_RXINTA); -	cpc_writeb(scabase + M_REG(IE1, ch), -		   cpc_readl(scabase + M_REG(IE1, ch)) | IE1_CDCD); - -	return 0; -} - -static int rx_config(pc300dev_t * d) -{ -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	void __iomem *scabase = card->hw.scabase; -	int ch = chan->channel; - -	cpc_writeb(scabase + DSR_RX(ch), 0); - -	/* General RX settings */ -	cpc_writeb(scabase + M_REG(RRC, ch), 0); -	cpc_writeb(scabase + M_REG(RNR, ch), 16); - -	/* Enable reception */ -	cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_CRC_INIT); -	cpc_writeb(scabase + M_REG(CMD, ch), CMD_RX_ENA); - -	/* Initialize DMA stuff */ -	chan->rx_first_bd = 0; -	chan->rx_last_bd = N_DMA_RX_BUF - 1; -	rx_dma_buf_init(card, ch); -	cpc_writeb(scabase + DCR_RX(ch), DCR_FCT_CLR); -	cpc_writeb(scabase + DMR_RX(ch), (DMR_TMOD | DMR_NF)); -	cpc_writeb(scabase + DIR_RX(ch), (DIR_EOM | DIR_BOF)); - -	/* Start DMA */ -	rx_dma_start(card, ch); - -	return 0; -} - -static int tx_config(pc300dev_t * d) -{ -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	void __iomem *scabase = card->hw.scabase; -	int ch = chan->channel; - -	cpc_writeb(scabase + DSR_TX(ch), 0); - -	/* General TX settings */ -	cpc_writeb(scabase + M_REG(TRC0, ch), 0); -	cpc_writeb(scabase + M_REG(TFS, ch), 32); -	cpc_writeb(scabase + M_REG(TNR0, ch), 20); -	cpc_writeb(scabase + M_REG(TNR1, ch), 48); -	cpc_writeb(scabase + M_REG(TCR, ch), 8); - -	/* Enable transmission */ -	cpc_writeb(scabase + M_REG(CMD, ch), CMD_TX_CRC_INIT); - -	/* Initialize DMA stuff */ -	chan->tx_first_bd = 0; -	chan->tx_next_bd = 0; -	tx_dma_buf_init(card, ch); -	cpc_writeb(scabase + DCR_TX(ch), DCR_FCT_CLR); -	cpc_writeb(scabase + DMR_TX(ch), (DMR_TMOD | DMR_NF)); -	cpc_writeb(scabase + DIR_TX(ch), (DIR_EOM | DIR_BOF | DIR_UDRF)); -	cpc_writel(scabase + DTX_REG(CDAL, ch), TX_BD_ADDR(ch, chan->tx_first_bd)); -	cpc_writel(scabase + DTX_REG(EDAL, ch), TX_BD_ADDR(ch, chan->tx_next_bd)); - -	return 0; -} - -static int cpc_attach(struct net_device *dev, unsigned short encoding, -		      unsigned short parity) -{ -	pc300dev_t *d = (pc300dev_t *)dev_to_hdlc(dev)->priv; -	pc300ch_t *chan = (pc300ch_t *)d->chan; -	pc300_t *card = (pc300_t *)chan->card; -	pc300chconf_t *conf = (pc300chconf_t *)&chan->conf; - -	if (card->hw.type == PC300_TE) { -		if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI) { -			return -EINVAL; -		} -	} else { -		if (encoding != ENCODING_NRZ && encoding != ENCODING_NRZI && -		    encoding != ENCODING_FM_MARK && encoding != ENCODING_FM_SPACE) { -			/* Driver doesn't support ENCODING_MANCHESTER yet */ -			return -EINVAL; -		} -	} - -	if (parity != PARITY_NONE && parity != PARITY_CRC16_PR0 && -	    parity != PARITY_CRC16_PR1 && parity != PARITY_CRC32_PR1_CCITT && -	    parity != PARITY_CRC16_PR1_CCITT) { -		return -EINVAL; -	} - -	conf->proto_settings.encoding = encoding; -	conf->proto_settings.parity = parity; -	return 0; -} - -static int cpc_opench(pc300dev_t * d) -{ -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	int ch = chan->channel, rc; -	void __iomem *scabase = card->hw.scabase; - -	rc = ch_config(d); -	if (rc) -		return rc; - -	rx_config(d); - -	tx_config(d); - -	/* Assert RTS and DTR */ -	cpc_writeb(scabase + M_REG(CTL, ch), -		   cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR)); - -	return 0; -} - -static void cpc_closech(pc300dev_t * d) -{ -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	falc_t *pfalc = (falc_t *) & chan->falc; -	int ch = chan->channel; - -	cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_CH_RST); -	rx_dma_stop(card, ch); -	tx_dma_stop(card, ch); - -	if (card->hw.type == PC300_TE) { -		memset(pfalc, 0, sizeof(falc_t)); -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2, -			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) & -			   ~((CPLD_REG2_FALC_TX_CLK | CPLD_REG2_FALC_RX_CLK | -			      CPLD_REG2_FALC_LED2) << (2 * ch))); -		/* Reset the FALC chip */ -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) | -			   (CPLD_REG1_FALC_RESET << (2 * ch))); -		udelay(10000); -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) & -			   ~(CPLD_REG1_FALC_RESET << (2 * ch))); -	} -} - -int cpc_open(struct net_device *dev) -{ -	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv; -	struct ifreq ifr; -	int result; - -#ifdef	PC300_DEBUG_OTHER -	printk("pc300: cpc_open"); -#endif - -	result = hdlc_open(dev); - -	if (result) -		return result; - -	sprintf(ifr.ifr_name, "%s", dev->name); -	result = cpc_opench(d); -	if (result) -		goto err_out; - -	netif_start_queue(dev); -	return 0; - -err_out: -	hdlc_close(dev); -	return result; -} - -static int cpc_close(struct net_device *dev) -{ -	pc300dev_t *d = (pc300dev_t *) dev_to_hdlc(dev)->priv; -	pc300ch_t *chan = (pc300ch_t *) d->chan; -	pc300_t *card = (pc300_t *) chan->card; -	unsigned long flags; - -#ifdef	PC300_DEBUG_OTHER -	printk("pc300: cpc_close"); -#endif - -	netif_stop_queue(dev); - -	CPC_LOCK(card, flags); -	cpc_closech(d); -	CPC_UNLOCK(card, flags); - -	hdlc_close(dev); - -#ifdef CONFIG_PC300_MLPPP -	if (chan->conf.proto == PC300_PROTO_MLPPP) { -		cpc_tty_unregister_service(d); -		chan->conf.proto = 0xffff; -	} -#endif - -	return 0; -} - -static u32 detect_ram(pc300_t * card) -{ -	u32 i; -	u8 data; -	void __iomem *rambase = card->hw.rambase; - -	card->hw.ramsize = PC300_RAMSIZE; -	/* Let's find out how much RAM is present on this board */ -	for (i = 0; i < card->hw.ramsize; i++) { -		data = (u8)(i & 0xff); -		cpc_writeb(rambase + i, data); -		if (cpc_readb(rambase + i) != data) { -			break; -		} -	} -	return i; -} - -static void plx_init(pc300_t * card) -{ -	struct RUNTIME_9050 __iomem *plx_ctl = card->hw.plxbase; - -	/* Reset PLX */ -	cpc_writel(&plx_ctl->init_ctrl, -		   cpc_readl(&plx_ctl->init_ctrl) | 0x40000000); -	udelay(10000L); -	cpc_writel(&plx_ctl->init_ctrl, -		   cpc_readl(&plx_ctl->init_ctrl) & ~0x40000000); - -	/* Reload Config. Registers from EEPROM */ -	cpc_writel(&plx_ctl->init_ctrl, -		   cpc_readl(&plx_ctl->init_ctrl) | 0x20000000); -	udelay(10000L); -	cpc_writel(&plx_ctl->init_ctrl, -		   cpc_readl(&plx_ctl->init_ctrl) & ~0x20000000); - -} - -static inline void show_version(void) -{ -	char *rcsvers, *rcsdate, *tmp; - -	rcsvers = strchr(rcsid, ' '); -	rcsvers++; -	tmp = strchr(rcsvers, ' '); -	*tmp++ = '\0'; -	rcsdate = strchr(tmp, ' '); -	rcsdate++; -	tmp = strrchr(rcsdate, ' '); -	*tmp = '\0'; -	printk(KERN_INFO "Cyclades-PC300 driver %s %s (built %s %s)\n",  -		rcsvers, rcsdate, __DATE__, __TIME__); -}				/* show_version */ - -static const struct net_device_ops cpc_netdev_ops = { -	.ndo_open		= cpc_open, -	.ndo_stop		= cpc_close, -	.ndo_tx_timeout		= cpc_tx_timeout, -	.ndo_set_mac_address	= NULL, -	.ndo_change_mtu		= cpc_change_mtu, -	.ndo_do_ioctl		= cpc_ioctl, -	.ndo_validate_addr	= eth_validate_addr, -}; - -static void cpc_init_card(pc300_t * card) -{ -	int i, devcount = 0; -	static int board_nbr = 1; - -	/* Enable interrupts on the PCI bridge */ -	plx_init(card); -	cpc_writew(card->hw.plxbase + card->hw.intctl_reg, -		   cpc_readw(card->hw.plxbase + card->hw.intctl_reg) | 0x0040); - -#ifdef USE_PCI_CLOCK -	/* Set board clock to PCI clock */ -	cpc_writel(card->hw.plxbase + card->hw.gpioc_reg, -		   cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) | 0x00000004UL); -	card->hw.clock = PC300_PCI_CLOCK; -#else -	/* Set board clock to internal oscillator clock */ -	cpc_writel(card->hw.plxbase + card->hw.gpioc_reg, -		   cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & ~0x00000004UL); -	card->hw.clock = PC300_OSC_CLOCK; -#endif - -	/* Detect actual on-board RAM size */ -	card->hw.ramsize = detect_ram(card); - -	/* Set Global SCA-II registers */ -	cpc_writeb(card->hw.scabase + PCR, PCR_PR2); -	cpc_writeb(card->hw.scabase + BTCR, 0x10); -	cpc_writeb(card->hw.scabase + WCRL, 0); -	cpc_writeb(card->hw.scabase + DMER, 0x80); - -	if (card->hw.type == PC300_TE) { -		u8 reg1; - -		/* Check CPLD version */ -		reg1 = cpc_readb(card->hw.falcbase + CPLD_REG1); -		cpc_writeb(card->hw.falcbase + CPLD_REG1, (reg1 + 0x5a)); -		if (cpc_readb(card->hw.falcbase + CPLD_REG1) == reg1) { -			/* New CPLD */ -			card->hw.cpld_id = cpc_readb(card->hw.falcbase + CPLD_ID_REG); -			card->hw.cpld_reg1 = CPLD_V2_REG1; -			card->hw.cpld_reg2 = CPLD_V2_REG2; -		} else { -			/* old CPLD */ -			card->hw.cpld_id = 0; -			card->hw.cpld_reg1 = CPLD_REG1; -			card->hw.cpld_reg2 = CPLD_REG2; -			cpc_writeb(card->hw.falcbase + CPLD_REG1, reg1); -		} - -		/* Enable the board's global clock */ -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg1, -			   cpc_readb(card->hw.falcbase + card->hw.cpld_reg1) | -			   CPLD_REG1_GLOBAL_CLK); - -	} - -	for (i = 0; i < card->hw.nchan; i++) { -		pc300ch_t *chan = &card->chan[i]; -		pc300dev_t *d = &chan->d; -		hdlc_device *hdlc; -		struct net_device *dev; - -		chan->card = card; -		chan->channel = i; -		chan->conf.phys_settings.clock_rate = 0; -		chan->conf.phys_settings.clock_type = CLOCK_EXT; -		chan->conf.proto_settings.encoding = ENCODING_NRZ; -		chan->conf.proto_settings.parity = PARITY_CRC16_PR1_CCITT; -		switch (card->hw.type) { -			case PC300_TE: -				chan->conf.media = IF_IFACE_T1; -				chan->conf.lcode = PC300_LC_B8ZS; -				chan->conf.fr_mode = PC300_FR_ESF; -				chan->conf.lbo = PC300_LBO_0_DB; -				chan->conf.rx_sens = PC300_RX_SENS_SH; -				chan->conf.tslot_bitmap = 0xffffffffUL; -				break; - -			case PC300_X21: -				chan->conf.media = IF_IFACE_X21; -				break; - -			case PC300_RSV: -			default: -				chan->conf.media = IF_IFACE_V35; -				break; -		} -		chan->conf.proto = IF_PROTO_PPP; -		chan->tx_first_bd = 0; -		chan->tx_next_bd = 0; -		chan->rx_first_bd = 0; -		chan->rx_last_bd = N_DMA_RX_BUF - 1; -		chan->nfree_tx_bd = N_DMA_TX_BUF; - -		d->chan = chan; -		d->trace_on = 0; -		d->line_on = 0; -		d->line_off = 0; - -		dev = alloc_hdlcdev(d); -		if (dev == NULL) -			continue; - -		hdlc = dev_to_hdlc(dev); -		hdlc->xmit = cpc_queue_xmit; -		hdlc->attach = cpc_attach; -		d->dev = dev; -		dev->mem_start = card->hw.ramphys; -		dev->mem_end = card->hw.ramphys + card->hw.ramsize - 1; -		dev->irq = card->hw.irq; -		dev->tx_queue_len = PC300_TX_QUEUE_LEN; -		dev->mtu = PC300_DEF_MTU; - -		dev->netdev_ops = &cpc_netdev_ops; -		dev->watchdog_timeo = PC300_TX_TIMEOUT; - -		if (register_hdlc_device(dev) == 0) { -			printk("%s: Cyclades-PC300/", dev->name); -			switch (card->hw.type) { -				case PC300_TE: -					if (card->hw.bus == PC300_PMC) { -						printk("TE-M"); -					} else { -						printk("TE  "); -					} -					break; - -				case PC300_X21: -					printk("X21 "); -					break; - -				case PC300_RSV: -				default: -					printk("RSV "); -					break; -			} -			printk (" #%d, %dKB of RAM at 0x%08x, IRQ%d, channel %d.\n", -				 board_nbr, card->hw.ramsize / 1024, -				 card->hw.ramphys, card->hw.irq, i + 1); -			devcount++; -		} else { -			printk ("Dev%d on card(0x%08x): unable to allocate i/f name.\n", -				 i + 1, card->hw.ramphys); -			free_netdev(dev); -			continue; -		} -	} -	spin_lock_init(&card->card_lock); - -	board_nbr++; -} - -static int __devinit -cpc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) -{ -	static int first_time = 1; -	int err, eeprom_outdated = 0; -	u16 device_id; -	pc300_t *card; - -	if (first_time) { -		first_time = 0; -		show_version(); -#ifdef CONFIG_PC300_MLPPP -		cpc_tty_reset_var(); -#endif -	} - -	if ((err = pci_enable_device(pdev)) < 0) -		return err; - -	card = kzalloc(sizeof(pc300_t), GFP_KERNEL); -	if (card == NULL) { -		printk("PC300 found at RAM 0x%016llx, " -		       "but could not allocate card structure.\n", -		       (unsigned long long)pci_resource_start(pdev, 3)); -		err = -ENOMEM; -		goto err_disable_dev; -	} - -	err = -ENODEV; - -	/* read PCI configuration area */ -	device_id = ent->device; -	card->hw.irq = pdev->irq; -	card->hw.iophys = pci_resource_start(pdev, 1); -	card->hw.iosize = pci_resource_len(pdev, 1); -	card->hw.scaphys = pci_resource_start(pdev, 2); -	card->hw.scasize = pci_resource_len(pdev, 2); -	card->hw.ramphys = pci_resource_start(pdev, 3); -	card->hw.alloc_ramsize = pci_resource_len(pdev, 3); -	card->hw.falcphys = pci_resource_start(pdev, 4); -	card->hw.falcsize = pci_resource_len(pdev, 4); -	card->hw.plxphys = pci_resource_start(pdev, 5); -	card->hw.plxsize = pci_resource_len(pdev, 5); - -	switch (device_id) { -		case PCI_DEVICE_ID_PC300_RX_1: -		case PCI_DEVICE_ID_PC300_TE_1: -		case PCI_DEVICE_ID_PC300_TE_M_1: -			card->hw.nchan = 1; -			break; - -		case PCI_DEVICE_ID_PC300_RX_2: -		case PCI_DEVICE_ID_PC300_TE_2: -		case PCI_DEVICE_ID_PC300_TE_M_2: -		default: -			card->hw.nchan = PC300_MAXCHAN; -			break; -	} -#ifdef PC300_DEBUG_PCI -	printk("cpc (bus=0x0%x,pci_id=0x%x,", pdev->bus->number, pdev->devfn); -	printk("rev_id=%d) IRQ%d\n", pdev->revision, card->hw.irq); -	printk("cpc:found  ramaddr=0x%08lx plxaddr=0x%08lx " -	       "ctladdr=0x%08lx falcaddr=0x%08lx\n", -	       card->hw.ramphys, card->hw.plxphys, card->hw.scaphys, -	       card->hw.falcphys); -#endif -	/* Although we don't use this I/O region, we should -	 * request it from the kernel anyway, to avoid problems -	 * with other drivers accessing it. */ -	if (!request_region(card->hw.iophys, card->hw.iosize, "PLX Registers")) { -		/* In case we can't allocate it, warn user */ -		printk("WARNING: couldn't allocate I/O region for PC300 board " -		       "at 0x%08x!\n", card->hw.ramphys); -	} - -	if (card->hw.plxphys) { -		pci_write_config_dword(pdev, PCI_BASE_ADDRESS_0, card->hw.plxphys); -	} else { -		eeprom_outdated = 1; -		card->hw.plxphys = pci_resource_start(pdev, 0); -		card->hw.plxsize = pci_resource_len(pdev, 0); -	} - -	if (!request_mem_region(card->hw.plxphys, card->hw.plxsize, -				"PLX Registers")) { -		printk("PC300 found at RAM 0x%08x, " -		       "but could not allocate PLX mem region.\n", -		       card->hw.ramphys); -		goto err_release_io; -	} -	if (!request_mem_region(card->hw.ramphys, card->hw.alloc_ramsize, -				"On-board RAM")) { -		printk("PC300 found at RAM 0x%08x, " -		       "but could not allocate RAM mem region.\n", -		       card->hw.ramphys); -		goto err_release_plx; -	} -	if (!request_mem_region(card->hw.scaphys, card->hw.scasize, -				"SCA-II Registers")) { -		printk("PC300 found at RAM 0x%08x, " -		       "but could not allocate SCA mem region.\n", -		       card->hw.ramphys); -		goto err_release_ram; -	} - -	card->hw.plxbase = ioremap(card->hw.plxphys, card->hw.plxsize); -	card->hw.rambase = ioremap(card->hw.ramphys, card->hw.alloc_ramsize); -	card->hw.scabase = ioremap(card->hw.scaphys, card->hw.scasize); -	switch (device_id) { -		case PCI_DEVICE_ID_PC300_TE_1: -		case PCI_DEVICE_ID_PC300_TE_2: -		case PCI_DEVICE_ID_PC300_TE_M_1: -		case PCI_DEVICE_ID_PC300_TE_M_2: -			request_mem_region(card->hw.falcphys, card->hw.falcsize, -					   "FALC Registers"); -			card->hw.falcbase = ioremap(card->hw.falcphys, card->hw.falcsize); -			break; - -		case PCI_DEVICE_ID_PC300_RX_1: -		case PCI_DEVICE_ID_PC300_RX_2: -		default: -			card->hw.falcbase = NULL; -			break; -	} - -#ifdef PC300_DEBUG_PCI -	printk("cpc: relocate ramaddr=0x%08lx plxaddr=0x%08lx " -	       "ctladdr=0x%08lx falcaddr=0x%08lx\n", -	       card->hw.rambase, card->hw.plxbase, card->hw.scabase, -	       card->hw.falcbase); -#endif - -	/* Set PCI drv pointer to the card structure */ -	pci_set_drvdata(pdev, card); - -	/* Set board type */ -	switch (device_id) { -		case PCI_DEVICE_ID_PC300_TE_1: -		case PCI_DEVICE_ID_PC300_TE_2: -		case PCI_DEVICE_ID_PC300_TE_M_1: -		case PCI_DEVICE_ID_PC300_TE_M_2: -			card->hw.type = PC300_TE; - -			if ((device_id == PCI_DEVICE_ID_PC300_TE_M_1) || -			    (device_id == PCI_DEVICE_ID_PC300_TE_M_2)) { -				card->hw.bus = PC300_PMC; -				/* Set PLX register offsets */ -				card->hw.gpioc_reg = 0x54; -				card->hw.intctl_reg = 0x4c; -			} else { -				card->hw.bus = PC300_PCI; -				/* Set PLX register offsets */ -				card->hw.gpioc_reg = 0x50; -				card->hw.intctl_reg = 0x4c; -			} -			break; - -		case PCI_DEVICE_ID_PC300_RX_1: -		case PCI_DEVICE_ID_PC300_RX_2: -		default: -			card->hw.bus = PC300_PCI; -			/* Set PLX register offsets */ -			card->hw.gpioc_reg = 0x50; -			card->hw.intctl_reg = 0x4c; - -			if ((cpc_readl(card->hw.plxbase + card->hw.gpioc_reg) & PC300_CTYPE_MASK)) { -				card->hw.type = PC300_X21; -			} else { -				card->hw.type = PC300_RSV; -			} -			break; -	} - -	/* Allocate IRQ */ -	if (request_irq(card->hw.irq, cpc_intr, IRQF_SHARED, "Cyclades-PC300", card)) { -		printk ("PC300 found at RAM 0x%08x, but could not allocate IRQ%d.\n", -			 card->hw.ramphys, card->hw.irq); -		goto err_io_unmap; -	} - -	cpc_init_card(card); - -	if (eeprom_outdated) -		printk("WARNING: PC300 with outdated EEPROM.\n"); -	return 0; - -err_io_unmap: -	iounmap(card->hw.plxbase); -	iounmap(card->hw.scabase); -	iounmap(card->hw.rambase); -	if (card->hw.type == PC300_TE) { -		iounmap(card->hw.falcbase); -		release_mem_region(card->hw.falcphys, card->hw.falcsize); -	} -	release_mem_region(card->hw.scaphys, card->hw.scasize); -err_release_ram: -	release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize); -err_release_plx: -	release_mem_region(card->hw.plxphys, card->hw.plxsize); -err_release_io: -	release_region(card->hw.iophys, card->hw.iosize); -	kfree(card); -err_disable_dev: -	pci_disable_device(pdev); -	return err; -} - -static void __devexit cpc_remove_one(struct pci_dev *pdev) -{ -	pc300_t *card = pci_get_drvdata(pdev); - -	if (card->hw.rambase) { -		int i; - -		/* Disable interrupts on the PCI bridge */ -		cpc_writew(card->hw.plxbase + card->hw.intctl_reg, -			   cpc_readw(card->hw.plxbase + card->hw.intctl_reg) & ~(0x0040)); - -		for (i = 0; i < card->hw.nchan; i++) { -			unregister_hdlc_device(card->chan[i].d.dev); -		} -		iounmap(card->hw.plxbase); -		iounmap(card->hw.scabase); -		iounmap(card->hw.rambase); -		release_mem_region(card->hw.plxphys, card->hw.plxsize); -		release_mem_region(card->hw.ramphys, card->hw.alloc_ramsize); -		release_mem_region(card->hw.scaphys, card->hw.scasize); -		release_region(card->hw.iophys, card->hw.iosize); -		if (card->hw.type == PC300_TE) { -			iounmap(card->hw.falcbase); -			release_mem_region(card->hw.falcphys, card->hw.falcsize); -		} -		for (i = 0; i < card->hw.nchan; i++) -			if (card->chan[i].d.dev) -				free_netdev(card->chan[i].d.dev); -		if (card->hw.irq) -			free_irq(card->hw.irq, card); -		kfree(card); -		pci_disable_device(pdev); -	} -} - -static struct pci_driver cpc_driver = { -	.name           = "pc300", -	.id_table       = cpc_pci_dev_id, -	.probe          = cpc_init_one, -	.remove         = __devexit_p(cpc_remove_one), -}; - -static int __init cpc_init(void) -{ -	return pci_register_driver(&cpc_driver); -} - -static void __exit cpc_cleanup_module(void) -{ -	pci_unregister_driver(&cpc_driver); -} - -module_init(cpc_init); -module_exit(cpc_cleanup_module); - -MODULE_DESCRIPTION("Cyclades-PC300 cards driver"); -MODULE_AUTHOR(  "Author: Ivan Passos <ivan@cyclades.com>\r\n" -                "Maintainer: PC300 Maintainer <pc300@cyclades.com"); -MODULE_LICENSE("GPL"); - diff --git a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c deleted file mode 100644 index 515d9b8af01..00000000000 --- a/drivers/net/wan/pc300_tty.c +++ /dev/null @@ -1,1098 +0,0 @@ -/* - * pc300_tty.c	Cyclades-PC300(tm) TTY Driver. - * - * Author:	Regina Kodato <reginak@cyclades.com> - * - * Copyright:	(c) 1999-2002 Cyclades Corp. - * - *	This program is free software; you can redistribute it and/or - *  modify it under the terms of the GNU General Public License - *  as published by the Free Software Foundation; either version - *  2 of the License, or (at your option) any later version. - *    - *  $Log: pc300_tty.c,v $ - *  Revision 3.7  2002/03/07 14:17:09  henrique - *  License data fixed - * - *  Revision 3.6  2001/12/10 12:29:42  regina - *  Fix the MLPPP bug - * - *  Revision 3.5  2001/10/31 11:20:05  regina - *  automatic pppd starts - * - *  Revision 3.4  2001/08/06 12:01:51  regina - *  problem in DSR_DE bit - * - *  Revision 3.3  2001/07/26 22:58:41  regina - *  update EDA value - * - *  Revision 3.2  2001/07/12 13:11:20  regina - *  bug fix - DCD-OFF in pc300 tty driver - * - *	DMA transmission bug fix - *   - *  Revision 3.1  2001/06/22 13:13:02  regina - *  MLPPP implementation - * - */ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/errno.h> -#include <linux/string.h> -#include <linux/init.h> -#include <linux/netdevice.h> -#include <linux/spinlock.h> -#include <linux/slab.h> -#include <linux/if.h> -#include <linux/skbuff.h> -/* TTY includes */ -#include <linux/tty.h> -#include <linux/tty_flip.h> -#include <linux/serial.h> - -#include <asm/io.h> -#include <asm/uaccess.h> - -#include "pc300.h" - -/* defines and macros */ -/* TTY Global definitions */ -#define	CPC_TTY_NPORTS	8	/* maximum number of the sync tty connections */ -#define	CPC_TTY_MAJOR	CYCLADES_MAJOR	 -#define CPC_TTY_MINOR_START	240	/* minor of the first PC300 interface */ - -#define CPC_TTY_MAX_MTU	2000	 - -/* tty interface state */ -#define	CPC_TTY_ST_IDLE	0 -#define CPC_TTY_ST_INIT	1	/* configured with MLPPP and up */ -#define CPC_TTY_ST_OPEN	2	/* opened by application */ - -#define	CPC_TTY_LOCK(card,flags)\ -	do {\ -		spin_lock_irqsave(&card->card_lock, flags);	\ -	} while (0) - -#define CPC_TTY_UNLOCK(card,flags)	\ -	do {\ -		spin_unlock_irqrestore(&card->card_lock, flags);	\ -	} while (0) - -//#define	CPC_TTY_DBG(format,a...)	printk(format,##a) -#define	CPC_TTY_DBG(format,a...) - -/* data structures */ -typedef struct _st_cpc_rx_buf { -	struct _st_cpc_rx_buf	*next; -	int		size; -	unsigned char	data[1]; -} st_cpc_rx_buf; - -struct st_cpc_rx_list { -	st_cpc_rx_buf	*first; -	st_cpc_rx_buf	*last; -}; - -typedef	struct _st_cpc_tty_area { -	int		state;		/* state of the TTY interface */ -	int		num_open;	 -	unsigned int 	tty_minor;	/* minor this interface */ -	volatile struct st_cpc_rx_list buf_rx;	/* ptr. to reception buffer */ -	unsigned char*	buf_tx;		/* ptr. to transmission buffer */ -	pc300dev_t*	pc300dev;	/* ptr. to info struct in PC300 driver */ -	unsigned char	name[20];	/* interf. name + "-tty" */ -	struct tty_struct *tty;		 -	struct work_struct tty_tx_work; /* tx work - tx interrupt */ -	struct work_struct tty_rx_work; /* rx work - rx interrupt */ -	} st_cpc_tty_area; - -/* TTY data structures */ -static struct tty_driver serial_drv; - -/* local variables */ -static st_cpc_tty_area	cpc_tty_area[CPC_TTY_NPORTS]; - -static int cpc_tty_cnt = 0;	/* number of intrfaces configured with MLPPP */ -static int cpc_tty_unreg_flag = 0; - -/* TTY functions prototype */ -static int cpc_tty_open(struct tty_struct *tty, struct file *flip); -static void cpc_tty_close(struct tty_struct *tty, struct file *flip); -static int cpc_tty_write(struct tty_struct *tty, const unsigned char *buf, int count); -static int cpc_tty_write_room(struct tty_struct *tty); -static int cpc_tty_chars_in_buffer(struct tty_struct *tty); -static void cpc_tty_flush_buffer(struct tty_struct *tty); -static void cpc_tty_hangup(struct tty_struct *tty); -static void cpc_tty_rx_work(struct work_struct *work); -static void cpc_tty_tx_work(struct work_struct *work); -static int cpc_tty_send_to_card(pc300dev_t *dev,void *buf, int len); -static void cpc_tty_trace(pc300dev_t *dev, char* buf, int len, char rxtx); -static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char); -static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char); - -static int pc300_tiocmset(struct tty_struct *, struct file *, -			  unsigned int, unsigned int); -static int pc300_tiocmget(struct tty_struct *, struct file *); - -/* functions called by PC300 driver */ -void cpc_tty_init(pc300dev_t *dev); -void cpc_tty_unregister_service(pc300dev_t *pc300dev); -void cpc_tty_receive(pc300dev_t *pc300dev); -void cpc_tty_trigger_poll(pc300dev_t *pc300dev); -void cpc_tty_reset_var(void); - -/* - * PC300 TTY clear "signal" - */ -static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char signal) -{ -	pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan;  -	pc300_t *card = (pc300_t *) pc300chan->card;  -	int ch = pc300chan->channel;  -	unsigned long flags;  - -	CPC_TTY_DBG("%s-tty: Clear signal %x\n", -		pc300dev->dev->name, signal); -	CPC_TTY_LOCK(card, flags);  -	cpc_writeb(card->hw.scabase + M_REG(CTL,ch),  -		cpc_readb(card->hw.scabase+M_REG(CTL,ch))& signal); -	CPC_TTY_UNLOCK(card,flags);  -} - -/* - * PC300 TTY set "signal" to ON - */ -static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char signal) -{ -	pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan;  -	pc300_t *card = (pc300_t *) pc300chan->card;  -	int ch = pc300chan->channel;  -	unsigned long flags;  - -	CPC_TTY_DBG("%s-tty: Set signal %x\n", -		pc300dev->dev->name, signal); -	CPC_TTY_LOCK(card, flags);  -	cpc_writeb(card->hw.scabase + M_REG(CTL,ch),  -		cpc_readb(card->hw.scabase+M_REG(CTL,ch))& ~signal); -	CPC_TTY_UNLOCK(card,flags);  -} - - -static const struct tty_operations pc300_ops = { -	.open = cpc_tty_open, -	.close = cpc_tty_close, -	.write = cpc_tty_write, -	.write_room = cpc_tty_write_room, -	.chars_in_buffer = cpc_tty_chars_in_buffer, -	.tiocmset = pc300_tiocmset, -	.tiocmget = pc300_tiocmget, -	.flush_buffer = cpc_tty_flush_buffer, -	.hangup = cpc_tty_hangup, -}; - - -/* - * PC300 TTY initialization routine - * - * This routine is called by the PC300 driver during board configuration  - * (ioctl=SIOCSP300CONF). At this point the adapter is completely - * initialized. - * o verify kernel version (only 2.4.x) - * o register TTY driver - * o init cpc_tty_area struct - */ -void cpc_tty_init(pc300dev_t *pc300dev) -{ -	unsigned long port; -	int aux; -	st_cpc_tty_area * cpc_tty; - -	/* hdlcX - X=interface number */ -	port = pc300dev->dev->name[4] - '0'; -	if (port >= CPC_TTY_NPORTS) { -		printk("%s-tty: invalid interface selected (0-%i): %li", -			pc300dev->dev->name, -			CPC_TTY_NPORTS-1,port); -		return; -	} - -	if (cpc_tty_cnt == 0) { /* first TTY connection -> register driver */ -		CPC_TTY_DBG("%s-tty: driver init, major:%i, minor range:%i=%i\n", -			pc300dev->dev->name, -			CPC_TTY_MAJOR, CPC_TTY_MINOR_START, -			CPC_TTY_MINOR_START+CPC_TTY_NPORTS); -		/* initialize tty driver struct */ -		memset(&serial_drv,0,sizeof(struct tty_driver)); -		serial_drv.magic = TTY_DRIVER_MAGIC; -		serial_drv.owner = THIS_MODULE; -		serial_drv.driver_name = "pc300_tty"; -		serial_drv.name = "ttyCP"; -		serial_drv.major = CPC_TTY_MAJOR; -		serial_drv.minor_start = CPC_TTY_MINOR_START; -		serial_drv.num = CPC_TTY_NPORTS; -		serial_drv.type = TTY_DRIVER_TYPE_SERIAL; -		serial_drv.subtype = SERIAL_TYPE_NORMAL; - -		serial_drv.init_termios = tty_std_termios; -		serial_drv.init_termios.c_cflag = B9600|CS8|CREAD|HUPCL|CLOCAL; -		serial_drv.flags = TTY_DRIVER_REAL_RAW; - -		/* interface routines from the upper tty layer to the tty driver */ -		tty_set_operations(&serial_drv, &pc300_ops); - -		/* register the TTY driver */ -		if (tty_register_driver(&serial_drv)) {  -			printk("%s-tty: Failed to register serial driver! ", -				pc300dev->dev->name); -		   	return; -		}  - -		memset((void *)cpc_tty_area, 0, -								sizeof(st_cpc_tty_area) * CPC_TTY_NPORTS); -	} - -	cpc_tty = &cpc_tty_area[port]; -	 -	if (cpc_tty->state != CPC_TTY_ST_IDLE) { -		CPC_TTY_DBG("%s-tty: TTY port %i, already in use.\n", -				pc300dev->dev->name, port); -		return; -	} - -	cpc_tty_cnt++; -	cpc_tty->state = CPC_TTY_ST_INIT;  -	cpc_tty->num_open= 0; -	cpc_tty->tty_minor = port + CPC_TTY_MINOR_START; -	cpc_tty->pc300dev = pc300dev;  - -	INIT_WORK(&cpc_tty->tty_tx_work, cpc_tty_tx_work); -	INIT_WORK(&cpc_tty->tty_rx_work, cpc_tty_rx_work); -	 -	cpc_tty->buf_rx.first = cpc_tty->buf_rx.last = NULL; - -	pc300dev->cpc_tty = (void *)cpc_tty;  -	 -	aux = strlen(pc300dev->dev->name); -	memcpy(cpc_tty->name, pc300dev->dev->name, aux); -	memcpy(&cpc_tty->name[aux], "-tty", 5); -	 -	cpc_open(pc300dev->dev); -	cpc_tty_signal_off(pc300dev, CTL_DTR); - -	CPC_TTY_DBG("%s: Initializing TTY Sync Driver, tty major#%d minor#%i\n", -			cpc_tty->name,CPC_TTY_MAJOR,cpc_tty->tty_minor);  -	return;  -}  - -/* - * PC300 TTY OPEN routine - * - * This routine is called by the tty driver to open the interface  - * o verify minor - * o allocate buffer to Rx and Tx - */ -static int cpc_tty_open(struct tty_struct *tty, struct file *flip) -{ -	int port ; -	st_cpc_tty_area *cpc_tty; - -	if (!tty) {  -		return -ENODEV; -	}  - -	port = tty->index; - -	if ((port < 0) || (port >= CPC_TTY_NPORTS)){  -		CPC_TTY_DBG("pc300_tty: open invalid port %d\n", port); -		return -ENODEV; -	}  - -	cpc_tty = &cpc_tty_area[port]; -	 -	if (cpc_tty->state == CPC_TTY_ST_IDLE){ -		CPC_TTY_DBG("%s: open - invalid interface, port=%d\n", -					cpc_tty->name, tty->index); -		return -ENODEV; -	} - -	if (cpc_tty->num_open == 0) { /* first open of this tty */ -		if (!cpc_tty_area[port].buf_tx){ -			cpc_tty_area[port].buf_tx = kmalloc(CPC_TTY_MAX_MTU,GFP_KERNEL); -			if (!cpc_tty_area[port].buf_tx) { -				CPC_TTY_DBG("%s: error in memory allocation\n",cpc_tty->name); -				return -ENOMEM; -			} -		}  - -		if (cpc_tty_area[port].buf_rx.first) { -			unsigned char * aux; -			while (cpc_tty_area[port].buf_rx.first) { -				aux = (unsigned char *)cpc_tty_area[port].buf_rx.first; -				cpc_tty_area[port].buf_rx.first = cpc_tty_area[port].buf_rx.first->next; -				kfree(aux); -			} -			cpc_tty_area[port].buf_rx.first = NULL; -			cpc_tty_area[port].buf_rx.last = NULL; -		} - -		cpc_tty_area[port].state = CPC_TTY_ST_OPEN; -		cpc_tty_area[port].tty = tty; -		tty->driver_data = &cpc_tty_area[port]; - -		cpc_tty_signal_on(cpc_tty->pc300dev, CTL_DTR); -	}  - -	cpc_tty->num_open++; - -	CPC_TTY_DBG("%s: opening TTY driver\n", cpc_tty->name); -	 -	/* avisar driver PC300 */  -	return 0;  -} - -/* - * PC300 TTY CLOSE routine - * - * This routine is called by the tty driver to close the interface  - * o call close channel in PC300 driver (cpc_closech) - * o free Rx and Tx buffers - */ - -static void cpc_tty_close(struct tty_struct *tty, struct file *flip) -{ -	st_cpc_tty_area    *cpc_tty; -	unsigned long flags; -	int res; - -	if (!tty || !tty->driver_data ) { -		CPC_TTY_DBG("hdlx-tty: no TTY in close\n"); -		return; -	} - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data; - -	if ((cpc_tty->tty != tty)|| (cpc_tty->state != CPC_TTY_ST_OPEN)) { -		CPC_TTY_DBG("%s: TTY is not opened\n",cpc_tty->name); -		return; -	} -   	 -	if (!cpc_tty->num_open) { -		CPC_TTY_DBG("%s: TTY is closed\n",cpc_tty->name); -		return; -	} - -	if (--cpc_tty->num_open > 0) { -		CPC_TTY_DBG("%s: TTY closed\n",cpc_tty->name); -		return; -	} - -	cpc_tty_signal_off(cpc_tty->pc300dev, CTL_DTR); - -	CPC_TTY_LOCK(cpc_tty->pc300dev->chan->card, flags);  /* lock irq */  -	cpc_tty->tty = NULL; -	cpc_tty->state = CPC_TTY_ST_INIT; -	CPC_TTY_UNLOCK(cpc_tty->pc300dev->chan->card, flags); /* unlock irq */  -	 -	if (cpc_tty->buf_rx.first) { -		unsigned char * aux; -		while (cpc_tty->buf_rx.first) { -			aux = (unsigned char *)cpc_tty->buf_rx.first; -			cpc_tty->buf_rx.first = cpc_tty->buf_rx.first->next; -			kfree(aux); -		} -		cpc_tty->buf_rx.first = NULL; -		cpc_tty->buf_rx.last = NULL; -	} -	 -	kfree(cpc_tty->buf_tx); -	cpc_tty->buf_tx = NULL; - -	CPC_TTY_DBG("%s: TTY closed\n",cpc_tty->name); -	 -	if (!serial_drv.refcount && cpc_tty_unreg_flag) { -		cpc_tty_unreg_flag = 0; -		CPC_TTY_DBG("%s: unregister the tty driver\n", cpc_tty->name); -		if ((res=tty_unregister_driver(&serial_drv))) {  -			CPC_TTY_DBG("%s: ERROR ->unregister the tty driver error=%d\n", -							cpc_tty->name,res); -		} -	} -	return;  -}  - -/* - * PC300 TTY WRITE routine - * - * This routine is called by the tty driver to write a series of characters - * to the tty device. The characters may come from user or kernel space. - * o verify the DCD signal - * o send characters to board and start the transmission - */ -static int cpc_tty_write(struct tty_struct *tty, const unsigned char *buf, int count) -{ -	st_cpc_tty_area    *cpc_tty;  -	pc300ch_t *pc300chan;  -	pc300_t *card;  -	int ch;  -	unsigned long flags;  -	struct net_device_stats *stats;  - -	if (!tty || !tty->driver_data ) {  -		CPC_TTY_DBG("hdlcX-tty: no TTY in write\n"); -		return -ENODEV; -	}  - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data;  - -	if ((cpc_tty->tty != tty) ||  (cpc_tty->state != CPC_TTY_ST_OPEN)) {  -		CPC_TTY_DBG("%s: TTY is not opened\n", cpc_tty->name); -		return -ENODEV;  -	} - -	if (count > CPC_TTY_MAX_MTU) {  -		CPC_TTY_DBG("%s: count is invalid\n",cpc_tty->name); -		return -EINVAL;        /* frame too big */  -	} - -	CPC_TTY_DBG("%s: cpc_tty_write data len=%i\n",cpc_tty->name,count); -	 -	pc300chan = (pc300ch_t *)((pc300dev_t*)cpc_tty->pc300dev)->chan;  -	stats = &cpc_tty->pc300dev->dev->stats; -	card = (pc300_t *) pc300chan->card; -	ch = pc300chan->channel;  - -	/* verify DCD signal*/  -	if (cpc_readb(card->hw.scabase + M_REG(ST3,ch)) & ST3_DCD) {  -		/* DCD is OFF */  -		CPC_TTY_DBG("%s : DCD is OFF\n", cpc_tty->name); -		stats->tx_errors++; -		stats->tx_carrier_errors++; -		CPC_TTY_LOCK(card, flags);  -		cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_BUF_CLR);  -		 -		if (card->hw.type == PC300_TE) {  -			cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,  -				cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) &  -				~(CPLD_REG2_FALC_LED1 << (2 *ch)));  -		} - -		CPC_TTY_UNLOCK(card, flags);  - -		return -EINVAL;  -	} - -	if (cpc_tty_send_to_card(cpc_tty->pc300dev, (void*)buf, count)) {  -	   /* failed to send */ -	   CPC_TTY_DBG("%s: trasmition error\n", cpc_tty->name); -	   return 0; -	} -	return count;  -}  - -/* - * PC300 TTY Write Room routine - *  - * This routine returns the numbers of characteres the tty driver will accept - * for queuing to be written.  - * o return MTU - */ -static int cpc_tty_write_room(struct tty_struct *tty) -{ -	st_cpc_tty_area    *cpc_tty;  - -	if (!tty || !tty->driver_data ) {  -		CPC_TTY_DBG("hdlcX-tty: no TTY to write room\n"); -		return -ENODEV; -	} - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data;  - -	if ((cpc_tty->tty != tty) ||  (cpc_tty->state != CPC_TTY_ST_OPEN)) {  -		CPC_TTY_DBG("%s: TTY is not opened\n",cpc_tty->name); -		return -ENODEV;  -	} -   	 -	CPC_TTY_DBG("%s: write room\n",cpc_tty->name); -	 -	return CPC_TTY_MAX_MTU; -}  - -/* - * PC300 TTY chars in buffer routine - *  - * This routine returns the chars number in the transmission buffer  - * o returns 0 - */ -static int cpc_tty_chars_in_buffer(struct tty_struct *tty) -{ -	st_cpc_tty_area    *cpc_tty;  - -	if (!tty || !tty->driver_data ) { -		CPC_TTY_DBG("hdlcX-tty: no TTY to chars in buffer\n"); -		return -ENODEV;  -	} - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data;  - -	if ((cpc_tty->tty != tty) || (cpc_tty->state != CPC_TTY_ST_OPEN)) {  -		CPC_TTY_DBG("%s: TTY is not opened\n",cpc_tty->name); -		return -ENODEV;  -	} -    -	return 0; -}  - -static int pc300_tiocmset(struct tty_struct *tty, struct file *file, -			  unsigned int set, unsigned int clear) -{ -	st_cpc_tty_area    *cpc_tty;  - -	CPC_TTY_DBG("%s: set:%x clear:%x\n", __func__, set, clear); - -	if (!tty || !tty->driver_data ) { -	   	CPC_TTY_DBG("hdlcX-tty: no TTY to chars in buffer\n");	 -		return -ENODEV;  -	} - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data;  - -	if (set & TIOCM_RTS) -		cpc_tty_signal_on(cpc_tty->pc300dev, CTL_RTS); -	if (set & TIOCM_DTR) -		cpc_tty_signal_on(cpc_tty->pc300dev, CTL_DTR); - -	if (clear & TIOCM_RTS) -		cpc_tty_signal_off(cpc_tty->pc300dev, CTL_RTS); -	if (clear & TIOCM_DTR) -		cpc_tty_signal_off(cpc_tty->pc300dev, CTL_DTR); - -	return 0; -} - -static int pc300_tiocmget(struct tty_struct *tty, struct file *file) -{ -	unsigned int result; -	unsigned char status; -	unsigned long flags; -	st_cpc_tty_area  *cpc_tty = (st_cpc_tty_area *) tty->driver_data; -	pc300dev_t *pc300dev = cpc_tty->pc300dev; -	pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan; -	pc300_t *card = (pc300_t *) pc300chan->card; -	int ch = pc300chan->channel; - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data; - -	CPC_TTY_DBG("%s-tty: tiocmget\n", -		((struct net_device*)(pc300dev->hdlc))->name); - -	CPC_TTY_LOCK(card, flags); -	status = cpc_readb(card->hw.scabase+M_REG(CTL,ch)); -	CPC_TTY_UNLOCK(card,flags); - -	result = ((status & CTL_DTR) ? TIOCM_DTR : 0) | -		 ((status & CTL_RTS) ? TIOCM_RTS : 0); - -	return result; -} - -/* - * PC300 TTY Flush Buffer routine - * - * This routine resets the transmission buffer  - */ -static void cpc_tty_flush_buffer(struct tty_struct *tty) -{  -	st_cpc_tty_area    *cpc_tty;  -	 -	if (!tty || !tty->driver_data ) { -	   	CPC_TTY_DBG("hdlcX-tty: no TTY to flush buffer\n");	 -		return;  -	} - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data;  - -	if ((cpc_tty->tty != tty) ||  (cpc_tty->state != CPC_TTY_ST_OPEN)) {  -		CPC_TTY_DBG("%s: TTY is not opened\n",cpc_tty->name); -		return;  -	} - -	CPC_TTY_DBG("%s: call wake_up_interruptible\n",cpc_tty->name); - -	tty_wakeup(tty);	 -	return;  -}  - -/* - * PC300 TTY Hangup routine - * - * This routine is called by the tty driver to hangup the interface  - * o clear DTR signal - */ - -static void cpc_tty_hangup(struct tty_struct *tty) -{  -	st_cpc_tty_area    *cpc_tty;  -	int res; - -	if (!tty || !tty->driver_data ) { -		CPC_TTY_DBG("hdlcX-tty: no TTY to hangup\n");	 -		return ;  -	} - -	cpc_tty = (st_cpc_tty_area *) tty->driver_data;  - -	if ((cpc_tty->tty != tty) || (cpc_tty->state != CPC_TTY_ST_OPEN)) { -		CPC_TTY_DBG("%s: TTY is not opened\n",cpc_tty->name); -		return ; -	} -	if (!serial_drv.refcount && cpc_tty_unreg_flag) { -		cpc_tty_unreg_flag = 0; -		CPC_TTY_DBG("%s: unregister the tty driver\n", cpc_tty->name); -		if ((res=tty_unregister_driver(&serial_drv))) {  -			CPC_TTY_DBG("%s: ERROR ->unregister the tty driver error=%d\n", -							cpc_tty->name,res); -		} -	} -	cpc_tty_signal_off(cpc_tty->pc300dev, CTL_DTR); -} - -/* - * PC300 TTY RX work routine - * This routine treats RX work - * o verify read buffer - * o call the line disc. read - * o free memory - */ -static void cpc_tty_rx_work(struct work_struct *work) -{ -	st_cpc_tty_area *cpc_tty; -	unsigned long port; -	int i, j; -	volatile st_cpc_rx_buf *buf; -	char flags=0,flg_rx=1;  -	struct tty_ldisc *ld; - -	if (cpc_tty_cnt == 0) return; -	 -	for (i=0; (i < 4) && flg_rx ; i++) { -		flg_rx = 0; - -		cpc_tty = container_of(work, st_cpc_tty_area, tty_rx_work); -		port = cpc_tty - cpc_tty_area; - -		for (j=0; j < CPC_TTY_NPORTS; j++) { -			cpc_tty = &cpc_tty_area[port]; -		 -			if ((buf=cpc_tty->buf_rx.first) != NULL) { -				if (cpc_tty->tty) { -					ld = tty_ldisc_ref(cpc_tty->tty); -					if (ld) { -						if (ld->ops->receive_buf) { -							CPC_TTY_DBG("%s: call line disc. receive_buf\n",cpc_tty->name); -							ld->ops->receive_buf(cpc_tty->tty, (char *)(buf->data), &flags, buf->size); -						} -						tty_ldisc_deref(ld); -					} -				}	 -				cpc_tty->buf_rx.first = cpc_tty->buf_rx.first->next; -				kfree((void *)buf); -				buf = cpc_tty->buf_rx.first; -				flg_rx = 1; -			} -			if (++port == CPC_TTY_NPORTS) port = 0; -		} -	} -}  - -/* - * PC300 TTY RX work routine - * - * This routine treats RX interrupt.  - * o read all frames in card - * o verify the frame size - * o read the frame in rx buffer - */ -static void cpc_tty_rx_disc_frame(pc300ch_t *pc300chan) -{ -	volatile pcsca_bd_t __iomem * ptdescr;  -	volatile unsigned char status;  -	pc300_t *card = (pc300_t *)pc300chan->card;  -	int ch = pc300chan->channel;  - -	/* dma buf read */  -	ptdescr = (pcsca_bd_t __iomem *)(card->hw.rambase +  -				RX_BD_ADDR(ch, pc300chan->rx_first_bd));  -	while (pc300chan->rx_first_bd != pc300chan->rx_last_bd) {  -		status = cpc_readb(&ptdescr->status);  -		cpc_writeb(&ptdescr->status, 0);  -		cpc_writeb(&ptdescr->len, 0);  -		pc300chan->rx_first_bd = (pc300chan->rx_first_bd + 1) &  -					(N_DMA_RX_BUF - 1);  -		if (status & DST_EOM) {  -			break; /* end of message */ -		} -		ptdescr = (pcsca_bd_t __iomem *)(card->hw.rambase + cpc_readl(&ptdescr->next));  -	} -} - -void cpc_tty_receive(pc300dev_t *pc300dev) -{ -	st_cpc_tty_area *cpc_tty;  -	pc300ch_t *pc300chan = (pc300ch_t *)pc300dev->chan;  -	pc300_t *card = (pc300_t *)pc300chan->card;  -	int ch = pc300chan->channel;  -	volatile pcsca_bd_t  __iomem * ptdescr;  -	struct net_device_stats *stats = &pc300dev->dev->stats; -	int rx_len, rx_aux;  -	volatile unsigned char status;  -	unsigned short first_bd = pc300chan->rx_first_bd; -	st_cpc_rx_buf *new = NULL; -	unsigned char dsr_rx; - -	if (pc300dev->cpc_tty == NULL) {  -		return;  -	} - -	dsr_rx = cpc_readb(card->hw.scabase + DSR_RX(ch)); - -	cpc_tty = (st_cpc_tty_area *)pc300dev->cpc_tty;  - -	while (1) {  -		rx_len = 0; -		ptdescr = (pcsca_bd_t  __iomem *)(card->hw.rambase + RX_BD_ADDR(ch, first_bd)); -		while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) { -			rx_len += cpc_readw(&ptdescr->len); -			first_bd = (first_bd + 1) & (N_DMA_RX_BUF - 1); -			if (status & DST_EOM) { -				break; -			} -			ptdescr = (pcsca_bd_t __iomem *)(card->hw.rambase+cpc_readl(&ptdescr->next)); -		} -			 -		if (!rx_len) {  -			if (dsr_rx & DSR_BOF) { -				/* update EDA */  -				cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch),  -						RX_BD_ADDR(ch, pc300chan->rx_last_bd));  -			} -			kfree(new); -			return;  -		} -		 -		if (rx_len > CPC_TTY_MAX_MTU) {  -			/* Free RX descriptors */  -			CPC_TTY_DBG("%s: frame size is invalid.\n",cpc_tty->name); -			stats->rx_errors++;  -			stats->rx_frame_errors++;  -			cpc_tty_rx_disc_frame(pc300chan); -			continue; -		}  -		 -		new = kmalloc(rx_len + sizeof(st_cpc_rx_buf), GFP_ATOMIC); -		if (!new) { -			cpc_tty_rx_disc_frame(pc300chan); -			continue; -		} -		 -		/* dma buf read */  -		ptdescr = (pcsca_bd_t __iomem *)(card->hw.rambase +  -				RX_BD_ADDR(ch, pc300chan->rx_first_bd));  - -		rx_len = 0;	/* counter frame size */ -		 -		while ((status = cpc_readb(&ptdescr->status)) & DST_OSB) { -			rx_aux = cpc_readw(&ptdescr->len); -			if ((status & (DST_OVR | DST_CRC | DST_RBIT |  DST_SHRT | DST_ABT)) -				|| (rx_aux > BD_DEF_LEN)) { -				CPC_TTY_DBG("%s: reception error\n", cpc_tty->name); -				stats->rx_errors++;  -				if (status & DST_OVR) {  -					stats->rx_fifo_errors++;  -				} -				if (status & DST_CRC) {  -					stats->rx_crc_errors++;  -				} -				if ((status & (DST_RBIT | DST_SHRT | DST_ABT)) || -					(rx_aux > BD_DEF_LEN))	{  -					stats->rx_frame_errors++;  -				}  -				/* discard remainig descriptors used by the bad frame */  -				CPC_TTY_DBG("%s: reception error - discard descriptors", -						cpc_tty->name); -				cpc_tty_rx_disc_frame(pc300chan); -				rx_len = 0; -				kfree(new); -				new = NULL; -				break; /* read next frame - while(1) */ -			} - -			if (cpc_tty->state != CPC_TTY_ST_OPEN) { -				/* Free RX descriptors */  -				cpc_tty_rx_disc_frame(pc300chan); -				stats->rx_dropped++;  -				rx_len = 0;  -				kfree(new); -				new = NULL; -				break; /* read next frame - while(1) */ -			} - -			/* read the segment of the frame */ -			if (rx_aux != 0) { -				memcpy_fromio((new->data + rx_len),  -					(void __iomem *)(card->hw.rambase +  -					 cpc_readl(&ptdescr->ptbuf)), rx_aux); -				rx_len += rx_aux;  -			} -			cpc_writeb(&ptdescr->status,0);  -			cpc_writeb(&ptdescr->len, 0);  -			pc300chan->rx_first_bd = (pc300chan->rx_first_bd + 1) &  -					(N_DMA_RX_BUF -1);  -			if (status & DST_EOM)break; -			 -			ptdescr = (pcsca_bd_t __iomem *) (card->hw.rambase +  -					cpc_readl(&ptdescr->next));  -		} -		/* update pointer */  -		pc300chan->rx_last_bd = (pc300chan->rx_first_bd - 1) &  -					(N_DMA_RX_BUF - 1) ;  -		if (!(dsr_rx & DSR_BOF)) { -			/* update EDA */  -			cpc_writel(card->hw.scabase + DRX_REG(EDAL, ch),  -					RX_BD_ADDR(ch, pc300chan->rx_last_bd));  -		} -		if (rx_len != 0) {  -			stats->rx_bytes += rx_len;  -		 -			if (pc300dev->trace_on) {  -				cpc_tty_trace(pc300dev, new->data,rx_len, 'R');  -			}  -			new->size = rx_len; -			new->next = NULL; -			if (cpc_tty->buf_rx.first == NULL) { -				cpc_tty->buf_rx.first = new; -				cpc_tty->buf_rx.last = new; -			} else { -				cpc_tty->buf_rx.last->next = new; -				cpc_tty->buf_rx.last = new; -			} -			schedule_work(&(cpc_tty->tty_rx_work)); -			stats->rx_packets++; -		} -	}  -}  - -/* - * PC300 TTY TX work routine - *  - * This routine treats TX interrupt.  - * o if need call line discipline wakeup - * o call wake_up_interruptible - */ -static void cpc_tty_tx_work(struct work_struct *work) -{ -	st_cpc_tty_area *cpc_tty = -		container_of(work, st_cpc_tty_area, tty_tx_work); -	struct tty_struct *tty;  - -	CPC_TTY_DBG("%s: cpc_tty_tx_work init\n",cpc_tty->name); -	 -	if ((tty = cpc_tty->tty) == NULL) {  -		CPC_TTY_DBG("%s: the interface is not opened\n",cpc_tty->name); -		return;  -	} -	tty_wakeup(tty); -} - -/* - * PC300 TTY send to card routine - *  - * This routine send data to card.  - * o clear descriptors - * o write data to DMA buffers - * o start the transmission - */ -static int cpc_tty_send_to_card(pc300dev_t *dev,void* buf, int len) -{ -	pc300ch_t *chan = (pc300ch_t *)dev->chan;  -	pc300_t *card = (pc300_t *)chan->card;  -	int ch = chan->channel;  -	struct net_device_stats *stats = &dev->dev->stats; -	unsigned long flags;  -	volatile pcsca_bd_t __iomem *ptdescr;  -	int i, nchar; -	int tosend = len; -	int nbuf = ((len - 1)/BD_DEF_LEN) + 1; -	unsigned char *pdata=buf; - -	CPC_TTY_DBG("%s:cpc_tty_send_to_cars len=%i",  -			(st_cpc_tty_area *)dev->cpc_tty->name,len);	 - -	if (nbuf >= card->chan[ch].nfree_tx_bd) { -		return 1; -	} -	 -	/* write buffer to DMA buffers */  -	CPC_TTY_DBG("%s: call dma_buf_write\n", -			(st_cpc_tty_area *)dev->cpc_tty->name);	 -	for (i = 0 ; i < nbuf ; i++) { -		ptdescr = (pcsca_bd_t __iomem *)(card->hw.rambase +  -			TX_BD_ADDR(ch, card->chan[ch].tx_next_bd)); -		nchar = (BD_DEF_LEN > tosend) ? tosend : BD_DEF_LEN; -		if (cpc_readb(&ptdescr->status) & DST_OSB) { -			memcpy_toio((void __iomem *)(card->hw.rambase +  -				cpc_readl(&ptdescr->ptbuf)),  -				&pdata[len - tosend],  -				nchar); -			card->chan[ch].nfree_tx_bd--; -			if ((i + 1) == nbuf) { -				/* This must be the last BD to be used */ -				cpc_writeb(&ptdescr->status, DST_EOM); -			} else { -				cpc_writeb(&ptdescr->status, 0); -			} -			cpc_writew(&ptdescr->len, nchar); -		} else { -			CPC_TTY_DBG("%s: error in dma_buf_write\n", -					(st_cpc_tty_area *)dev->cpc_tty->name);	 -			stats->tx_dropped++; -			return 1;  -		} -		tosend -= nchar; -		card->chan[ch].tx_next_bd =  -			(card->chan[ch].tx_next_bd + 1) & (N_DMA_TX_BUF - 1); -	} - -	if (dev->trace_on) {  -		cpc_tty_trace(dev, buf, len,'T');  -	} - -	/* start transmission */  -	CPC_TTY_DBG("%s: start transmission\n", -		(st_cpc_tty_area *)dev->cpc_tty->name);	 -	 -	CPC_TTY_LOCK(card, flags);  -	cpc_writeb(card->hw.scabase + DTX_REG(EDAL, ch),  -			TX_BD_ADDR(ch, chan->tx_next_bd));  -	cpc_writeb(card->hw.scabase + M_REG(CMD, ch), CMD_TX_ENA);  -	cpc_writeb(card->hw.scabase + DSR_TX(ch), DSR_DE);  - -	if (card->hw.type == PC300_TE) {  -		cpc_writeb(card->hw.falcbase + card->hw.cpld_reg2,  -			cpc_readb(card->hw.falcbase + card->hw.cpld_reg2) | -			(CPLD_REG2_FALC_LED1 << (2 * ch)));  -	} -	CPC_TTY_UNLOCK(card, flags);  -	return 0;  -}  - -/* - *	PC300 TTY trace routine - * - *  This routine send trace of connection to application.  - *  o clear descriptors - *  o write data to DMA buffers - *  o start the transmission - */ - -static void cpc_tty_trace(pc300dev_t *dev, char* buf, int len, char rxtx) -{ -	struct sk_buff *skb;  - -	if ((skb = dev_alloc_skb(10 + len)) == NULL) {  -		/* out of memory */  -		CPC_TTY_DBG("%s: tty_trace - out of memory\n", dev->dev->name); -		return;  -	} - -	skb_put (skb, 10 + len);  -	skb->dev = dev->dev;  -	skb->protocol = htons(ETH_P_CUST);  -	skb_reset_mac_header(skb); -	skb->pkt_type = PACKET_HOST;  -	skb->len = 10 + len;  - -	skb_copy_to_linear_data(skb, dev->dev->name, 5); -	skb->data[5] = '[';  -	skb->data[6] = rxtx;  -	skb->data[7] = ']';  -	skb->data[8] = ':';  -	skb->data[9] = ' ';  -	skb_copy_to_linear_data_offset(skb, 10, buf, len); -	netif_rx(skb);  -} 	 - -/* - *	PC300 TTY unregister service routine - * - *	This routine unregister one interface.  - */ -void cpc_tty_unregister_service(pc300dev_t *pc300dev) -{ -	st_cpc_tty_area *cpc_tty;  -	ulong flags; -	int res; - -	if ((cpc_tty= (st_cpc_tty_area *) pc300dev->cpc_tty) == NULL) { -		CPC_TTY_DBG("%s: interface is not TTY\n", pc300dev->dev->name); -		return;  -	} -	CPC_TTY_DBG("%s: cpc_tty_unregister_service", cpc_tty->name); - -	if (cpc_tty->pc300dev != pc300dev) {  -		CPC_TTY_DBG("%s: invalid tty ptr=%s\n",  -		pc300dev->dev->name, cpc_tty->name); -		return;  -	} - -	if (--cpc_tty_cnt == 0) {  -		if (serial_drv.refcount) { -			CPC_TTY_DBG("%s: unregister is not possible, refcount=%d", -							cpc_tty->name, serial_drv.refcount); -			cpc_tty_cnt++; -			cpc_tty_unreg_flag = 1; -			return; -		} else {  -			CPC_TTY_DBG("%s: unregister the tty driver\n", cpc_tty->name); -			if ((res=tty_unregister_driver(&serial_drv))) {  -				CPC_TTY_DBG("%s: ERROR ->unregister the tty driver error=%d\n", -								cpc_tty->name,res); -			} -		} -	} -	CPC_TTY_LOCK(pc300dev->chan->card,flags); -	cpc_tty->tty = NULL;  -	CPC_TTY_UNLOCK(pc300dev->chan->card, flags); -	cpc_tty->tty_minor = 0;  -	cpc_tty->state = CPC_TTY_ST_IDLE;  -}  - -/* - * PC300 TTY trigger poll routine - * This routine is called by pc300driver to treats Tx interrupt.  - */ -void cpc_tty_trigger_poll(pc300dev_t *pc300dev) -{ -	st_cpc_tty_area *cpc_tty = (st_cpc_tty_area *)pc300dev->cpc_tty;  -	if (!cpc_tty) { -		return; -	} -	schedule_work(&(cpc_tty->tty_tx_work));  -}  - -/* - * PC300 TTY reset var routine - * This routine is called by pc300driver to init the TTY area.  - */ - -void cpc_tty_reset_var(void) -{ -	int i ;  - -	CPC_TTY_DBG("hdlcX-tty: reset variables\n"); -	/* reset  the tty_driver structure - serial_drv */  -	memset(&serial_drv, 0, sizeof(struct tty_driver)); -	for (i=0; i < CPC_TTY_NPORTS; i++){ -		memset(&cpc_tty_area[i],0, sizeof(st_cpc_tty_area));  -	} -} diff --git a/drivers/net/wan/pc300too.c b/drivers/net/wan/pc300too.c index c7ab3becd26..5b72f7f8c51 100644 --- a/drivers/net/wan/pc300too.c +++ b/drivers/net/wan/pc300too.c @@ -17,6 +17,8 @@   * PC300/X21 cards.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/slab.h> @@ -279,7 +281,6 @@ static void pc300_pci_remove_one(struct pci_dev *pdev)  	pci_release_regions(pdev);  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  	if (card->ports[0].netdev)  		free_netdev(card->ports[0].netdev);  	if (card->ports[1].netdev) @@ -295,8 +296,8 @@ static const struct net_device_ops pc300_ops = {  	.ndo_do_ioctl   = pc300_ioctl,  }; -static int __devinit pc300_pci_init_one(struct pci_dev *pdev, -					const struct pci_device_id *ent) +static int pc300_pci_init_one(struct pci_dev *pdev, +			      const struct pci_device_id *ent)  {  	card_t *card;  	u32 __iomem *p; @@ -318,7 +319,6 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  	card = kzalloc(sizeof(card_t), GFP_KERNEL);  	if (card == NULL) { -		printk(KERN_ERR "pc300: unable to allocate memory\n");  		pci_release_regions(pdev);  		pci_disable_device(pdev);  		return -ENOBUFS; @@ -328,7 +328,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  	if (pci_resource_len(pdev, 0) != PC300_PLX_SIZE ||  	    pci_resource_len(pdev, 2) != PC300_SCA_SIZE ||  	    pci_resource_len(pdev, 3) < 16384) { -		printk(KERN_ERR "pc300: invalid card EEPROM parameters\n"); +		pr_err("invalid card EEPROM parameters\n");  		pc300_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -345,7 +345,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  	if (card->plxbase == NULL ||  	    card->scabase == NULL ||  	    card->rambase == NULL) { -		printk(KERN_ERR "pc300: ioremap() failed\n"); +		pr_err("ioremap() failed\n");  		pc300_pci_remove_one(pdev);  	} @@ -370,7 +370,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  	for (i = 0; i < card->n_ports; i++)  		if (!(card->ports[i].netdev = alloc_hdlcdev(&card->ports[i]))) { -			printk(KERN_ERR "pc300: unable to allocate memory\n"); +			pr_err("unable to allocate memory\n");  			pc300_pci_remove_one(pdev);  			return -ENOMEM;  		} @@ -411,15 +411,14 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  	card->buff_offset = card->n_ports * sizeof(pkt_desc) *  		(card->tx_ring_buffers + card->rx_ring_buffers); -	printk(KERN_INFO "pc300: PC300/%s, %u KB RAM at 0x%x, IRQ%u, " -	       "using %u TX + %u RX packets rings\n", -	       card->type == PC300_X21 ? "X21" : -	       card->type == PC300_TE ? "TE" : "RSV", -	       ramsize / 1024, ramphys, pdev->irq, -	       card->tx_ring_buffers, card->rx_ring_buffers); +	pr_info("PC300/%s, %u KB RAM at 0x%x, IRQ%u, using %u TX + %u RX packets rings\n", +		card->type == PC300_X21 ? "X21" : +		card->type == PC300_TE ? "TE" : "RSV", +		ramsize / 1024, ramphys, pdev->irq, +		card->tx_ring_buffers, card->rx_ring_buffers);  	if (card->tx_ring_buffers < 1) { -		printk(KERN_ERR "pc300: RAM test failed\n"); +		pr_err("RAM test failed\n");  		pc300_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -429,8 +428,7 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  	/* Allocate IRQ */  	if (request_irq(pdev->irq, sca_intr, IRQF_SHARED, "pc300", card)) { -		printk(KERN_WARNING "pc300: could not allocate IRQ%d.\n", -		       pdev->irq); +		pr_warn("could not allocate IRQ%d\n", pdev->irq);  		pc300_pci_remove_one(pdev);  		return -EBUSY;  	} @@ -466,15 +464,13 @@ static int __devinit pc300_pci_init_one(struct pci_dev *pdev,  		sca_init_port(port);  		if (register_hdlc_device(dev)) { -			printk(KERN_ERR "pc300: unable to register hdlc " -			       "device\n"); +			pr_err("unable to register hdlc device\n");  			port->card = NULL;  			pc300_pci_remove_one(pdev);  			return -ENOBUFS;  		} -		printk(KERN_INFO "%s: PC300 channel %d\n", -		       dev->name, port->chan); +		netdev_info(dev, "PC300 channel %d\n", port->chan);  	}  	return 0;  } @@ -505,11 +501,11 @@ static struct pci_driver pc300_pci_driver = {  static int __init pc300_init_module(void)  {  	if (pci_clock_freq < 1000000 || pci_clock_freq > 80000000) { -		printk(KERN_ERR "pc300: Invalid PCI clock frequency\n"); +		pr_err("Invalid PCI clock frequency\n");  		return -EINVAL;  	}  	if (use_crystal_clock != 0 && use_crystal_clock != 1) { -		printk(KERN_ERR "pc300: Invalid 'use_crystal_clock' value\n"); +		pr_err("Invalid 'use_crystal_clock' value\n");  		return -EINVAL;  	} diff --git a/drivers/net/wan/pci200syn.c b/drivers/net/wan/pci200syn.c index fd7375955e4..fe4e3ece3c4 100644 --- a/drivers/net/wan/pci200syn.c +++ b/drivers/net/wan/pci200syn.c @@ -14,6 +14,8 @@   *    PLX Technology Inc. PCI9052 Data Book   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/capability.h> @@ -258,7 +260,6 @@ static void pci200_pci_remove_one(struct pci_dev *pdev)  	pci_release_regions(pdev);  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  	if (card->ports[0].netdev)  		free_netdev(card->ports[0].netdev);  	if (card->ports[1].netdev) @@ -274,8 +275,8 @@ static const struct net_device_ops pci200_ops = {  	.ndo_do_ioctl   = pci200_ioctl,  }; -static int __devinit pci200_pci_init_one(struct pci_dev *pdev, -					 const struct pci_device_id *ent) +static int pci200_pci_init_one(struct pci_dev *pdev, +			       const struct pci_device_id *ent)  {  	card_t *card;  	u32 __iomem *p; @@ -297,7 +298,6 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  	card = kzalloc(sizeof(card_t), GFP_KERNEL);  	if (card == NULL) { -		printk(KERN_ERR "pci200syn: unable to allocate memory\n");  		pci_release_regions(pdev);  		pci_disable_device(pdev);  		return -ENOBUFS; @@ -306,7 +306,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  	card->ports[0].netdev = alloc_hdlcdev(&card->ports[0]);  	card->ports[1].netdev = alloc_hdlcdev(&card->ports[1]);  	if (!card->ports[0].netdev || !card->ports[1].netdev) { -		printk(KERN_ERR "pci200syn: unable to allocate memory\n"); +		pr_err("unable to allocate memory\n");  		pci200_pci_remove_one(pdev);  		return -ENOMEM;  	} @@ -314,7 +314,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  	if (pci_resource_len(pdev, 0) != PCI200SYN_PLX_SIZE ||  	    pci_resource_len(pdev, 2) != PCI200SYN_SCA_SIZE ||  	    pci_resource_len(pdev, 3) < 16384) { -		printk(KERN_ERR "pci200syn: invalid card EEPROM parameters\n"); +		pr_err("invalid card EEPROM parameters\n");  		pci200_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -331,7 +331,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  	if (card->plxbase == NULL ||  	    card->scabase == NULL ||  	    card->rambase == NULL) { -		printk(KERN_ERR "pci200syn: ioremap() failed\n"); +		pr_err("ioremap() failed\n");  		pci200_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -357,12 +357,12 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  	card->buff_offset = 2 * sizeof(pkt_desc) * (card->tx_ring_buffers +  						    card->rx_ring_buffers); -	printk(KERN_INFO "pci200syn: %u KB RAM at 0x%x, IRQ%u, using %u TX +" -	       " %u RX packets rings\n", ramsize / 1024, ramphys, -	       pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers); +	pr_info("%u KB RAM at 0x%x, IRQ%u, using %u TX + %u RX packets rings\n", +		ramsize / 1024, ramphys, +		pdev->irq, card->tx_ring_buffers, card->rx_ring_buffers);  	if (card->tx_ring_buffers < 1) { -		printk(KERN_ERR "pci200syn: RAM test failed\n"); +		pr_err("RAM test failed\n");  		pci200_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -373,8 +373,7 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  	/* Allocate IRQ */  	if (request_irq(pdev->irq, sca_intr, IRQF_SHARED, "pci200syn", card)) { -		printk(KERN_WARNING "pci200syn: could not allocate IRQ%d.\n", -		       pdev->irq); +		pr_warn("could not allocate IRQ%d\n", pdev->irq);  		pci200_pci_remove_one(pdev);  		return -EBUSY;  	} @@ -400,15 +399,13 @@ static int __devinit pci200_pci_init_one(struct pci_dev *pdev,  		port->card = card;  		sca_init_port(port);  		if (register_hdlc_device(dev)) { -			printk(KERN_ERR "pci200syn: unable to register hdlc " -			       "device\n"); +			pr_err("unable to register hdlc device\n");  			port->card = NULL;  			pci200_pci_remove_one(pdev);  			return -ENOBUFS;  		} -		printk(KERN_INFO "%s: PCI200SYN channel %d\n", -		       dev->name, port->chan); +		netdev_info(dev, "PCI200SYN channel %d\n", port->chan);  	}  	sca_flush(card); @@ -435,7 +432,7 @@ static struct pci_driver pci200_pci_driver = {  static int __init pci200_init_module(void)  {  	if (pci_clock_freq < 1000000 || pci_clock_freq > 80000000) { -		printk(KERN_ERR "pci200syn: Invalid PCI clock frequency\n"); +		pr_err("Invalid PCI clock frequency\n");  		return -EINVAL;  	}  	return pci_register_driver(&pci200_pci_driver); diff --git a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c index cff13a9597c..1b89ecf0959 100644 --- a/drivers/net/wan/sbni.c +++ b/drivers/net/wan/sbni.c @@ -37,6 +37,8 @@   *	Known problem: this driver wasn't tested on multiprocessor machine.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/ptrace.h> @@ -55,6 +57,7 @@  #include <net/net_namespace.h>  #include <net/arp.h> +#include <net/Space.h>  #include <asm/io.h>  #include <asm/types.h> @@ -146,14 +149,10 @@ static int  enslave( struct net_device *, struct net_device * );  static int  emancipate( struct net_device * );  #endif -#ifdef __i386__ -#define ASM_CRC 1 -#endif -  static const char  version[] =  	"Granch SBNI12 driver ver 5.0.1  Jun 22 2001  Denis I.Timofeev.\n"; -static int  skip_pci_probe	__initdata = 0; +static bool skip_pci_probe	__initdata = false;  static int  scandone	__initdata = 0;  static int  num		__initdata = 0; @@ -174,7 +173,7 @@ static u32	mac[  SBNI_MAX_NUM_CARDS ] __initdata;  #ifndef MODULE  typedef u32  iarr[]; -static iarr __initdata *dest[5] = { &io, &irq, &baud, &rxl, &mac }; +static iarr *dest[5] __initdata = { &io, &irq, &baud, &rxl, &mac };  #endif  /* A zero-terminated list of I/O addresses to be probed on ISA bus */ @@ -200,8 +199,8 @@ sbni_isa_probe( struct net_device  *dev )  		return  0;  	else { -		printk( KERN_ERR "sbni: base address 0x%lx is busy, or adapter " -			"is malfunctional!\n", dev->base_addr ); +		pr_err("base address 0x%lx is busy, or adapter is malfunctional!\n", +		       dev->base_addr);  		return  -ENODEV;  	}  } @@ -210,7 +209,7 @@ static const struct net_device_ops sbni_netdev_ops = {  	.ndo_open		= sbni_open,  	.ndo_stop		= sbni_close,  	.ndo_start_xmit		= sbni_start_xmit, -	.ndo_set_multicast_list	= set_multicast_list, +	.ndo_set_rx_mode	= set_multicast_list,  	.ndo_do_ioctl		= sbni_ioctl,  	.ndo_change_mtu		= eth_change_mtu,  	.ndo_set_mac_address 	= eth_mac_addr, @@ -226,7 +225,6 @@ static void __init sbni_devsetup(struct net_device *dev)  int __init sbni_probe(int unit)  {  	struct net_device *dev; -	static unsigned  version_printed __initdata = 0;  	int err;  	dev = alloc_netdev(sizeof(struct net_local), "sbni", sbni_devsetup); @@ -250,8 +248,7 @@ int __init sbni_probe(int unit)  		free_netdev(dev);  		return err;  	} -	if( version_printed++ == 0 ) -		printk( KERN_INFO "%s", version ); +	pr_info_once("%s", version);  	return 0;  } @@ -303,7 +300,6 @@ sbni_pci_probe( struct net_device  *dev )  	       != NULL ) {  		int  pci_irq_line;  		unsigned long  pci_ioaddr; -		u16  subsys;  		if( pdev->vendor != SBNI_PCI_VENDOR &&  		    pdev->device != SBNI_PCI_DEVICE ) @@ -314,9 +310,7 @@ sbni_pci_probe( struct net_device  *dev )  		/* Avoid already found cards from previous calls */  		if( !request_region( pci_ioaddr, SBNI_IO_EXTENT, dev->name ) ) { -			pci_read_config_word( pdev, PCI_SUBSYSTEM_ID, &subsys ); - -			if (subsys != 2) +			if (pdev->subsystem_device != 2)  				continue;  			/* Dual adapter is present */ @@ -326,9 +320,9 @@ sbni_pci_probe( struct net_device  *dev )  		}  		if (pci_irq_line <= 0 || pci_irq_line >= nr_irqs) -			printk( KERN_WARNING -	"  WARNING: The PCI BIOS assigned this PCI card to IRQ %d, which is unlikely to work!.\n" -	" You should use the PCI BIOS setup to assign a valid IRQ line.\n", +			pr_warn( +"WARNING: The PCI BIOS assigned this PCI card to IRQ %d, which is unlikely to work!.\n" +"You should use the PCI BIOS setup to assign a valid IRQ line.\n",  				pci_irq_line );  		/* avoiding re-enable dual adapters */ @@ -372,8 +366,7 @@ sbni_probe1( struct net_device  *dev,  unsigned long  ioaddr,  int  irq )  		outb( 0, ioaddr + CSR0 );  		if( !irq ) { -			printk( KERN_ERR "%s: can't detect device irq!\n", -				dev->name ); +			pr_err("%s: can't detect device irq!\n", dev->name);  			release_region( ioaddr, SBNI_IO_EXTENT );  			return NULL;  		} @@ -386,7 +379,7 @@ sbni_probe1( struct net_device  *dev,  unsigned long  ioaddr,  int  irq )  	/* Fill in sbni-specific dev fields. */  	nl = netdev_priv(dev);  	if( !nl ) { -		printk( KERN_ERR "%s: unable to get memory!\n", dev->name ); +		pr_err("%s: unable to get memory!\n", dev->name);  		release_region( ioaddr, SBNI_IO_EXTENT );  		return NULL;  	} @@ -415,21 +408,21 @@ sbni_probe1( struct net_device  *dev,  unsigned long  ioaddr,  int  irq )  	if( inb( ioaddr + CSR0 ) & 0x01 )  		nl->state |= FL_SLOW_MODE; -	printk( KERN_NOTICE "%s: ioaddr %#lx, irq %d, " -		"MAC: 00:ff:01:%02x:%02x:%02x\n",  -		dev->name, dev->base_addr, dev->irq, -		((u8 *) dev->dev_addr) [3], -		((u8 *) dev->dev_addr) [4], -		((u8 *) dev->dev_addr) [5] ); +	pr_notice("%s: ioaddr %#lx, irq %d, MAC: 00:ff:01:%02x:%02x:%02x\n", +		  dev->name, dev->base_addr, dev->irq, +		  ((u8 *)dev->dev_addr)[3], +		  ((u8 *)dev->dev_addr)[4], +		  ((u8 *)dev->dev_addr)[5]); -	printk( KERN_NOTICE "%s: speed %d, receive level ", dev->name, -		( (nl->state & FL_SLOW_MODE)  ?  500000 : 2000000) -		/ (1 << nl->csr1.rate) ); +	pr_notice("%s: speed %d", +		  dev->name, +		  ((nl->state & FL_SLOW_MODE) ? 500000 : 2000000) +		  / (1 << nl->csr1.rate));  	if( nl->delta_rxl == 0 ) -		printk( "0x%x (fixed)\n", nl->cur_rxl_index );  +		pr_cont(", receive level 0x%x (fixed)\n", nl->cur_rxl_index);  	else -		printk( "(auto)\n"); +		pr_cont(", receive level (auto)\n");  #ifdef CONFIG_SBNI_MULTILINE  	nl->master = dev; @@ -568,7 +561,7 @@ handle_channel( struct net_device  *dev )  		 */  		csr0 = inb( ioaddr + CSR0 );  		if( !(csr0 & TR_RDY)  ||  (csr0 & RC_RDY) ) -			printk( KERN_ERR "%s: internal error!\n", dev->name ); +			netdev_err(dev, "internal error!\n");  		/* if state & FL_NEED_RESEND != 0 then tx_frameno != 0 */  		if( req_ans  ||  nl->tx_frameno != 0 ) @@ -851,7 +844,7 @@ prepare_to_send( struct sk_buff  *skb,  struct net_device  *dev )  	/* nl->tx_buf_p == NULL here! */  	if( nl->tx_buf_p ) -		printk( KERN_ERR "%s: memory leak!\n", dev->name ); +		netdev_err(dev, "memory leak!\n");  	nl->outpos = 0;  	nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND); @@ -1179,16 +1172,15 @@ sbni_open( struct net_device  *dev )  				((struct net_local *) (netdev_priv(*p)))  					->second = dev; -				printk( KERN_NOTICE "%s: using shared irq " -					"with %s\n", dev->name, (*p)->name ); +				netdev_notice(dev, "using shared irq with %s\n", +					      (*p)->name);  				nl->state |= FL_SECONDARY;  				goto  handler_attached;  			}  	}  	if( request_irq(dev->irq, sbni_interrupt, IRQF_SHARED, dev->name, dev) ) { -		printk( KERN_ERR "%s: unable to get IRQ %d.\n", -			dev->name, dev->irq ); +		netdev_err(dev, "unable to get IRQ %d\n", dev->irq);  		return  -EAGAIN;  	} @@ -1220,8 +1212,8 @@ sbni_close( struct net_device  *dev )  	struct net_local  *nl = netdev_priv(dev);  	if( nl->second  &&  nl->second->flags & IFF_UP ) { -		printk( KERN_NOTICE "Secondary channel (%s) is active!\n", -			nl->second->name ); +		netdev_notice(dev, "Secondary channel (%s) is active!\n", +			      nl->second->name);  		return  -EBUSY;  	} @@ -1363,8 +1355,8 @@ sbni_ioctl( struct net_device  *dev,  struct ifreq  *ifr,  int  cmd )  			return -EFAULT;  		slave_dev = dev_get_by_name(&init_net, slave_name );  		if( !slave_dev  ||  !(slave_dev->flags & IFF_UP) ) { -			printk( KERN_ERR "%s: trying to enslave non-active " -				"device %s\n", dev->name, slave_name ); +			netdev_err(dev, "trying to enslave non-active device %s\n", +				   slave_name);  			return  -EPERM;  		} @@ -1417,8 +1409,7 @@ enslave( struct net_device  *dev,  struct net_device  *slave_dev )  	spin_unlock( &snl->lock );  	spin_unlock( &nl->lock ); -	printk( KERN_NOTICE "%s: slave device (%s) attached.\n", -		dev->name, slave_dev->name ); +	netdev_notice(dev, "slave device (%s) attached\n", slave_dev->name);  	return  0;  } @@ -1547,7 +1538,7 @@ sbni_setup( char  *p )  				break;  	}  bad_param: -	printk( KERN_ERR "Error in sbni kernel parameter!\n" ); +	pr_err("Error in sbni kernel parameter!\n");  	return 0;  } @@ -1557,88 +1548,6 @@ __setup( "sbni=", sbni_setup );  /* -------------------------------------------------------------------------- */ -#ifdef ASM_CRC - -static u32 -calc_crc32( u32  crc,  u8  *p,  u32  len ) -{ -	register u32  _crc; -	_crc = crc; -	 -	__asm__ __volatile__ ( -		"xorl	%%ebx, %%ebx\n" -		"movl	%2, %%esi\n"  -		"movl	%3, %%ecx\n"  -		"movl	$crc32tab, %%edi\n" -		"shrl	$2, %%ecx\n" -		"jz	1f\n" - -		".align 4\n" -	"0:\n" -		"movb	%%al, %%bl\n" -		"movl	(%%esi), %%edx\n" -		"shrl	$8, %%eax\n" -		"xorb	%%dl, %%bl\n" -		"shrl	$8, %%edx\n" -		"xorl	(%%edi,%%ebx,4), %%eax\n" - -		"movb	%%al, %%bl\n" -		"shrl	$8, %%eax\n" -		"xorb	%%dl, %%bl\n" -		"shrl	$8, %%edx\n" -		"xorl	(%%edi,%%ebx,4), %%eax\n" - -		"movb	%%al, %%bl\n" -		"shrl	$8, %%eax\n" -		"xorb	%%dl, %%bl\n" -		"movb	%%dh, %%dl\n"  -		"xorl	(%%edi,%%ebx,4), %%eax\n" - -		"movb	%%al, %%bl\n" -		"shrl	$8, %%eax\n" -		"xorb	%%dl, %%bl\n" -		"addl	$4, %%esi\n" -		"xorl	(%%edi,%%ebx,4), %%eax\n" - -		"decl	%%ecx\n" -		"jnz	0b\n" - -	"1:\n" -		"movl	%3, %%ecx\n" -		"andl	$3, %%ecx\n" -		"jz	2f\n" - -		"movb	%%al, %%bl\n" -		"shrl	$8, %%eax\n" -		"xorb	(%%esi), %%bl\n" -		"xorl	(%%edi,%%ebx,4), %%eax\n" - -		"decl	%%ecx\n" -		"jz	2f\n" - -		"movb	%%al, %%bl\n" -		"shrl	$8, %%eax\n" -		"xorb	1(%%esi), %%bl\n" -		"xorl	(%%edi,%%ebx,4), %%eax\n" - -		"decl	%%ecx\n" -		"jz	2f\n" - -		"movb	%%al, %%bl\n" -		"shrl	$8, %%eax\n" -		"xorb	2(%%esi), %%bl\n" -		"xorl	(%%edi,%%ebx,4), %%eax\n" -	"2:\n" -		: "=a" (_crc) -		: "0" (_crc), "g" (p), "g" (len) -		: "bx", "cx", "dx", "si", "di" -	); - -	return  _crc; -} - -#else	/* ASM_CRC */ -  static u32  calc_crc32( u32  crc,  u8  *p,  u32  len )  { @@ -1648,9 +1557,6 @@ calc_crc32( u32  crc,  u8  *p,  u32  len )  	return  crc;  } -#endif	/* ASM_CRC */ - -  static u32  crc32tab[] __attribute__ ((aligned(8))) = {  	0xD202EF8D,  0xA505DF1B,  0x3C0C8EA1,  0x4B0BBE37,  	0xD56F2B94,  0xA2681B02,  0x3B614AB8,  0x4C667A2E, diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 3f4e2b5684d..cdd45fb8a1f 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c @@ -32,6 +32,8 @@   *		2 of the License, or (at your option) any later version.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/types.h> @@ -52,7 +54,6 @@  #include <linux/sdla.h>  #include <linux/bitops.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/dma.h>  #include <asm/uaccess.h> @@ -350,24 +351,24 @@ static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int  		case SDLA_RET_MODEM:  			state = data;  			if (*state & SDLA_MODEM_DCD_LOW) -				printk(KERN_INFO "%s: Modem DCD unexpectedly low!\n", dev->name); +				netdev_info(dev, "Modem DCD unexpectedly low!\n");  			if (*state & SDLA_MODEM_CTS_LOW) -				printk(KERN_INFO "%s: Modem CTS unexpectedly low!\n", dev->name); +				netdev_info(dev, "Modem CTS unexpectedly low!\n");  			/* I should probably do something about this! */  			break;  		case SDLA_RET_CHANNEL_OFF: -			printk(KERN_INFO "%s: Channel became inoperative!\n", dev->name); +			netdev_info(dev, "Channel became inoperative!\n");  			/* same here */  			break;  		case SDLA_RET_CHANNEL_ON: -			printk(KERN_INFO "%s: Channel became operative!\n", dev->name); +			netdev_info(dev, "Channel became operative!\n");  			/* same here */  			break;  		case SDLA_RET_DLCI_STATUS: -			printk(KERN_INFO "%s: Status change reported by Access Node.\n", dev->name); +			netdev_info(dev, "Status change reported by Access Node\n");  			len /= sizeof(struct _dlci_stat);  			for(pstatus = data, i=0;i < len;i++,pstatus++)  			{ @@ -382,29 +383,32 @@ static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int  					sprintf(line, "unknown status: %02X", pstatus->flags);  					state = line;  				} -				printk(KERN_INFO "%s: DLCI %i: %s.\n", dev->name, pstatus->dlci, state); +				netdev_info(dev, "DLCI %i: %s\n", +					    pstatus->dlci, state);  				/* same here */  			}  			break;  		case SDLA_RET_DLCI_UNKNOWN: -			printk(KERN_INFO "%s: Received unknown DLCIs:", dev->name); +			netdev_info(dev, "Received unknown DLCIs:");  			len /= sizeof(short);  			for(pdlci = data,i=0;i < len;i++,pdlci++) -				printk(" %i", *pdlci); -			printk("\n"); +				pr_cont(" %i", *pdlci); +			pr_cont("\n");  			break;  		case SDLA_RET_TIMEOUT: -			printk(KERN_ERR "%s: Command timed out!\n", dev->name); +			netdev_err(dev, "Command timed out!\n");  			break;  		case SDLA_RET_BUF_OVERSIZE: -			printk(KERN_INFO "%s: Bc/CIR overflow, acceptable size is %i\n", dev->name, len); +			netdev_info(dev, "Bc/CIR overflow, acceptable size is %i\n", +				    len);  			break;  		case SDLA_RET_BUF_TOO_BIG: -			printk(KERN_INFO "%s: Buffer size over specified max of %i\n", dev->name, len); +			netdev_info(dev, "Buffer size over specified max of %i\n", +				    len);  			break;  		case SDLA_RET_CHANNEL_INACTIVE: @@ -415,7 +419,8 @@ static void sdla_errors(struct net_device *dev, int cmd, int dlci, int ret, int  				break;  		default:  -			printk(KERN_DEBUG "%s: Cmd 0x%2.2X generated return code 0x%2.2X\n", dev->name, cmd, ret); +			netdev_dbg(dev, "Cmd 0x%02X generated return code 0x%02X\n", +				   cmd, ret);  			/* Further processing could be done here */  			break;  	} @@ -678,12 +683,14 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb,  		case ARPHRD_FRAD:  			if (skb->dev->type != ARPHRD_DLCI)  			{ -				printk(KERN_WARNING "%s: Non DLCI device, type %i, tried to send on FRAD module.\n", dev->name, skb->dev->type); +				netdev_warn(dev, "Non DLCI device, type %i, tried to send on FRAD module\n", +					    skb->dev->type);  				accept = 0;  			}  			break;  		default: -			printk(KERN_WARNING "%s: unknown firmware type 0x%4.4X\n", dev->name, dev->type); +			netdev_warn(dev, "unknown firmware type 0x%04X\n", +				    dev->type);  			accept = 0;  			break;  	} @@ -807,7 +814,8 @@ static void sdla_receive(struct net_device *dev)  		if (i == CONFIG_DLCI_MAX)  		{ -			printk(KERN_NOTICE "%s: Received packet from invalid DLCI %i, ignoring.", dev->name, dlci); +			netdev_notice(dev, "Received packet from invalid DLCI %i, ignoring\n", +				      dlci);  			dev->stats.rx_errors++;  			success = 0;  		} @@ -819,7 +827,7 @@ static void sdla_receive(struct net_device *dev)  		skb = dev_alloc_skb(len + sizeof(struct frhdr));  		if (skb == NULL)   		{ -			printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name); +			netdev_notice(dev, "Memory squeeze, dropping packet\n");  			dev->stats.rx_dropped++;  			success = 0;  		} @@ -880,8 +888,7 @@ static irqreturn_t sdla_isr(int dummy, void *dev_id)  	if (!flp->initialized)  	{ -		printk(KERN_WARNING "%s: irq %d for uninitialized device.\n", -		       dev->name, dev->irq); +		netdev_warn(dev, "irq %d for uninitialized device\n", dev->irq);  		return IRQ_NONE;  	} @@ -901,7 +908,7 @@ static irqreturn_t sdla_isr(int dummy, void *dev_id)  		case SDLA_INTR_TX:  		case SDLA_INTR_COMPLETE:  		case SDLA_INTR_TIMER: -			printk(KERN_WARNING "%s: invalid irq flag 0x%02X.\n", dev->name, byte); +			netdev_warn(dev, "invalid irq flag 0x%02X\n", byte);  			break;  	} @@ -1315,10 +1322,6 @@ NOTE:  This is rather a useless action right now, as the  static int sdla_change_mtu(struct net_device *dev, int new_mtu)  { -	struct frad_local *flp; - -	flp = netdev_priv(dev); -  	if (netif_running(dev))  		return -EBUSY; @@ -1347,7 +1350,7 @@ static int sdla_set_config(struct net_device *dev, struct ifmap *map)  		return -EINVAL;  	if (!request_region(map->base_addr, SDLA_IO_EXTENTS, dev->name)){ -		printk(KERN_WARNING "SDLA: io-port 0x%04lx in use\n", dev->base_addr); +		pr_warn("io-port 0x%04lx in use\n", dev->base_addr);  		return -EINVAL;  	}  	base = map->base_addr; @@ -1412,7 +1415,7 @@ static int sdla_set_config(struct net_device *dev, struct ifmap *map)  		}  	} -	printk(KERN_NOTICE "%s: Unknown card type\n", dev->name); +	netdev_notice(dev, "Unknown card type\n");  	err = -ENODEV;  	goto fail; diff --git a/drivers/net/wan/sealevel.c b/drivers/net/wan/sealevel.c index e91457d6023..27860b4f590 100644 --- a/drivers/net/wan/sealevel.c +++ b/drivers/net/wan/sealevel.c @@ -12,6 +12,8 @@   *   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/mm.h> @@ -190,7 +192,7 @@ static int slvl_setup(struct slvl_device *sv, int iobase, int irq)  	dev->irq = irq;  	if (register_hdlc_device(dev)) { -		printk(KERN_ERR "sealevel: unable to register HDLC device\n"); +		pr_err("unable to register HDLC device\n");  		free_netdev(dev);  		return -1;  	} @@ -215,8 +217,7 @@ static __init struct slvl_board *slvl_init(int iobase, int irq,  	 */  	if (!request_region(iobase, 8, "Sealevel 4021")) { -		printk(KERN_WARNING "sealevel: I/O 0x%X already in use.\n", -		       iobase); +		pr_warn("I/O 0x%X already in use\n", iobase);  		return NULL;  	} @@ -265,9 +266,9 @@ static __init struct slvl_board *slvl_init(int iobase, int irq,  	/* We want a fast IRQ for this device. Actually we'd like an even faster  	   IRQ ;) - This is one driver RtLinux is made for */ -	if (request_irq(irq, z8530_interrupt, IRQF_DISABLED, +	if (request_irq(irq, z8530_interrupt, 0,  			"SeaLevel", dev) < 0) { -		printk(KERN_WARNING "sealevel: IRQ %d already in use.\n", irq); +		pr_warn("IRQ %d already in use\n", irq);  		goto err_request_irq;  	} @@ -292,7 +293,7 @@ static __init struct slvl_board *slvl_init(int iobase, int irq,  	 */  	if (z8530_init(dev) != 0) { -		printk(KERN_ERR "Z8530 series device not found.\n"); +		pr_err("Z8530 series device not found\n");  		enable_irq(irq);  		goto free_hw;  	} @@ -361,7 +362,7 @@ static int io=0x238;  static int txdma=1;  static int rxdma=3;  static int irq=5; -static int slow=0; +static bool slow=false;  module_param(io, int, 0);  MODULE_PARM_DESC(io, "The I/O base of the Sealevel card"); diff --git a/drivers/net/wan/wanxl.c b/drivers/net/wan/wanxl.c index db73a7be199..f76aa908158 100644 --- a/drivers/net/wan/wanxl.c +++ b/drivers/net/wan/wanxl.c @@ -13,6 +13,8 @@   *   - wanXL100 will require minor driver modifications, no access to hw   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/slab.h> @@ -22,6 +24,7 @@  #include <linux/string.h>  #include <linux/errno.h>  #include <linux/init.h> +#include <linux/interrupt.h>  #include <linux/ioport.h>  #include <linux/netdevice.h>  #include <linux/hdlc.h> @@ -101,9 +104,8 @@ static inline dma_addr_t pci_map_single_debug(struct pci_dev *pdev, void *ptr,  {  	dma_addr_t addr = pci_map_single(pdev, ptr, size, direction);  	if (addr + size > 0x100000000LL) -		printk(KERN_CRIT "wanXL %s: pci_map_single() returned memory" -		       " at 0x%LX!\n", pci_name(pdev), -		       (unsigned long long)addr); +		pr_crit("%s: pci_map_single() returned memory at 0x%llx!\n", +			pci_name(pdev), (unsigned long long)addr);  	return addr;  } @@ -146,8 +148,8 @@ static inline void wanxl_cable_intr(port_t *port)  		}  		dte = (value & STATUS_CABLE_DCE) ? " DCE" : " DTE";  	} -	printk(KERN_INFO "%s: %s%s module, %s cable%s%s\n", -	       port->dev->name, pm, dte, cable, dsr, dcd); +	netdev_info(port->dev, "%s%s module, %s cable%s%s\n", +		    pm, dte, cable, dsr, dcd);  	if (value & STATUS_CABLE_DCD)  		netif_carrier_on(port->dev); @@ -197,8 +199,8 @@ static inline void wanxl_rx_intr(card_t *card)  	while (desc = &card->status->rx_descs[card->rx_in],  	       desc->stat != PACKET_EMPTY) {  		if ((desc->stat & PACKET_PORT_MASK) > card->n_ports) -			printk(KERN_CRIT "wanXL %s: received packet for" -			       " nonexistent port\n", pci_name(card->pdev)); +			pr_crit("%s: received packet for nonexistent port\n", +				pci_name(card->pdev));  		else {  			struct sk_buff *skb = card->rx_skbs[card->rx_in];  			port_t *port = &card->ports[desc->stat & @@ -282,7 +284,7 @@ static netdev_tx_t wanxl_xmit(struct sk_buff *skb, struct net_device *dev)                  printk(KERN_DEBUG "%s: transmitter buffer full\n", dev->name);  #endif  		netif_stop_queue(dev); -		spin_unlock_irq(&port->lock); +		spin_unlock(&port->lock);  		return NETDEV_TX_BUSY;       /* request packet to be queued */  	} @@ -353,6 +355,7 @@ static int wanxl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)  			ifr->ifr_settings.size = size; /* data size wanted */  			return -ENOBUFS;  		} +		memset(&line, 0, sizeof(line));  		line.clock_type = get_status(port)->clocking;  		line.clock_rate = 0;  		line.loopback = 0; @@ -396,7 +399,7 @@ static int wanxl_open(struct net_device *dev)  	int i;  	if (get_status(port)->open) { -		printk(KERN_ERR "%s: port already open\n", dev->name); +		netdev_err(dev, "port already open\n");  		return -EIO;  	}  	if ((i = hdlc_open(dev)) != 0) @@ -416,7 +419,7 @@ static int wanxl_open(struct net_device *dev)  		}  	} while (time_after(timeout, jiffies)); -	printk(KERN_ERR "%s: unable to open port\n", dev->name); +	netdev_err(dev, "unable to open port\n");  	/* ask the card to close the port, should it be still alive */  	writel(1 << (DOORBELL_TO_CARD_CLOSE_0 + port->node), dbr);  	return -EFAULT; @@ -442,7 +445,7 @@ static int wanxl_close(struct net_device *dev)  	} while (time_after(timeout, jiffies));  	if (get_status(port)->open) -		printk(KERN_ERR "%s: unable to close port\n", dev->name); +		netdev_err(dev, "unable to close port\n");  	netif_stop_queue(dev); @@ -539,7 +542,6 @@ static void wanxl_pci_remove_one(struct pci_dev *pdev)  	pci_release_regions(pdev);  	pci_disable_device(pdev); -	pci_set_drvdata(pdev, NULL);  	kfree(card);  } @@ -555,8 +557,8 @@ static const struct net_device_ops wanxl_ops = {  	.ndo_get_stats  = wanxl_get_stats,  }; -static int __devinit wanxl_pci_init_one(struct pci_dev *pdev, -					const struct pci_device_id *ent) +static int wanxl_pci_init_one(struct pci_dev *pdev, +			      const struct pci_device_id *ent)  {  	card_t *card;  	u32 ramsize, stat; @@ -567,11 +569,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	int i, ports, alloc_size;  #ifndef MODULE -	static int printed_version; -	if (!printed_version) { -		printed_version++; -		printk(KERN_INFO "%s\n", version); -	} +	pr_info_once("%s\n", version);  #endif  	i = pci_enable_device(pdev); @@ -587,7 +585,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	   work on most platforms */  	if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(28)) ||  	    pci_set_dma_mask(pdev, DMA_BIT_MASK(28))) { -		printk(KERN_ERR "wanXL: No usable DMA configuration\n"); +		pr_err("No usable DMA configuration\n");  		return -EIO;  	} @@ -606,8 +604,6 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	alloc_size = sizeof(card_t) + ports * sizeof(port_t);  	card = kzalloc(alloc_size, GFP_KERNEL);  	if (card == NULL) { -		printk(KERN_ERR "wanXL %s: unable to allocate memory\n", -		       pci_name(pdev));  		pci_release_regions(pdev);  		pci_disable_device(pdev);  		return -ENOBUFS; @@ -634,7 +630,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	   to indicate the card can do 32-bit DMA addressing */  	if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)) ||  	    pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { -		printk(KERN_ERR "wanXL: No usable DMA configuration\n"); +		pr_err("No usable DMA configuration\n");  		wanxl_pci_remove_one(pdev);  		return -EIO;  	} @@ -644,7 +640,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	card->plx = ioremap_nocache(plx_phy, 0x70);  	if (!card->plx) { -		printk(KERN_ERR "wanxl: ioremap() failed\n"); +		pr_err("ioremap() failed\n");   		wanxl_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -656,8 +652,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	timeout = jiffies + 20 * HZ;  	while ((stat = readl(card->plx + PLX_MAILBOX_0)) != 0) {  		if (time_before(timeout, jiffies)) { -			printk(KERN_WARNING "wanXL %s: timeout waiting for" -			       " PUTS to complete\n", pci_name(pdev)); +			pr_warn("%s: timeout waiting for PUTS to complete\n", +				pci_name(pdev));  			wanxl_pci_remove_one(pdev);  			return -ENODEV;  		} @@ -668,8 +664,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  			break;  		default: -			printk(KERN_WARNING "wanXL %s: PUTS test 0x%X" -			       " failed\n", pci_name(pdev), stat & 0x30); +			pr_warn("%s: PUTS test 0x%X failed\n", +				pci_name(pdev), stat & 0x30);  			wanxl_pci_remove_one(pdev);  			return -ENODEV;  		} @@ -687,17 +683,16 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	/* sanity check the board's reported memory size */  	if (ramsize < BUFFERS_ADDR +  	    (TX_BUFFERS + RX_BUFFERS) * BUFFER_LENGTH * ports) { -		printk(KERN_WARNING "wanXL %s: no enough on-board RAM" -		       " (%u bytes detected, %u bytes required)\n", -		       pci_name(pdev), ramsize, BUFFERS_ADDR + -		       (TX_BUFFERS + RX_BUFFERS) * BUFFER_LENGTH * ports); +		pr_warn("%s: no enough on-board RAM (%u bytes detected, %u bytes required)\n", +			pci_name(pdev), ramsize, +			BUFFERS_ADDR + +			(TX_BUFFERS + RX_BUFFERS) * BUFFER_LENGTH * ports);  		wanxl_pci_remove_one(pdev);  		return -ENODEV;  	}  	if (wanxl_puts_command(card, MBX1_CMD_BSWAP)) { -		printk(KERN_WARNING "wanXL %s: unable to Set Byte Swap" -		       " Mode\n", pci_name(pdev)); +		pr_warn("%s: unable to Set Byte Swap Mode\n", pci_name(pdev));  		wanxl_pci_remove_one(pdev);  		return -ENODEV;  	} @@ -714,7 +709,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	mem = ioremap_nocache(mem_phy, PDM_OFFSET + sizeof(firmware));  	if (!mem) { -		printk(KERN_ERR "wanxl: ioremap() failed\n"); +		pr_err("ioremap() failed\n");   		wanxl_pci_remove_one(pdev);  		return -EFAULT;  	} @@ -733,8 +728,7 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	writel(0, card->plx + PLX_MAILBOX_5);  	if (wanxl_puts_command(card, MBX1_CMD_ABORTJ)) { -		printk(KERN_WARNING "wanXL %s: unable to Abort and Jump\n", -		       pci_name(pdev)); +		pr_warn("%s: unable to Abort and Jump\n", pci_name(pdev));  		wanxl_pci_remove_one(pdev);  		return -ENODEV;  	} @@ -748,8 +742,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	}while (time_after(timeout, jiffies));  	if (!stat) { -		printk(KERN_WARNING "wanXL %s: timeout while initializing card " -		       "firmware\n", pci_name(pdev)); +		pr_warn("%s: timeout while initializing card firmware\n", +			pci_name(pdev));  		wanxl_pci_remove_one(pdev);  		return -ENODEV;  	} @@ -758,13 +752,13 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  	ramsize = stat;  #endif -	printk(KERN_INFO "wanXL %s: at 0x%X, %u KB of RAM at 0x%X, irq %u\n", -	       pci_name(pdev), plx_phy, ramsize / 1024, mem_phy, pdev->irq); +	pr_info("%s: at 0x%X, %u KB of RAM at 0x%X, irq %u\n", +		pci_name(pdev), plx_phy, ramsize / 1024, mem_phy, pdev->irq);  	/* Allocate IRQ */  	if (request_irq(pdev->irq, wanxl_intr, IRQF_SHARED, "wanXL", card)) { -		printk(KERN_WARNING "wanXL %s: could not allocate IRQ%i.\n", -		       pci_name(pdev), pdev->irq); +		pr_warn("%s: could not allocate IRQ%i\n", +			pci_name(pdev), pdev->irq);  		wanxl_pci_remove_one(pdev);  		return -EBUSY;  	} @@ -775,8 +769,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  		port_t *port = &card->ports[i];  		struct net_device *dev = alloc_hdlcdev(port);  		if (!dev) { -			printk(KERN_ERR "wanXL %s: unable to allocate" -			       " memory\n", pci_name(pdev)); +			pr_err("%s: unable to allocate memory\n", +			       pci_name(pdev));  			wanxl_pci_remove_one(pdev);  			return -ENOMEM;  		} @@ -792,8 +786,8 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  		port->node = i;  		get_status(port)->clocking = CLOCK_EXT;  		if (register_hdlc_device(dev)) { -			printk(KERN_ERR "wanXL %s: unable to register hdlc" -			       " device\n", pci_name(pdev)); +			pr_err("%s: unable to register hdlc device\n", +			       pci_name(pdev));  			free_netdev(dev);  			wanxl_pci_remove_one(pdev);  			return -ENOBUFS; @@ -801,11 +795,11 @@ static int __devinit wanxl_pci_init_one(struct pci_dev *pdev,  		card->n_ports++;  	} -	printk(KERN_INFO "wanXL %s: port", pci_name(pdev)); +	pr_info("%s: port", pci_name(pdev));  	for (i = 0; i < ports; i++) -		printk("%s #%i: %s", i ? "," : "", i, -		       card->ports[i].dev->name); -	printk("\n"); +		pr_cont("%s #%i: %s", +			i ? "," : "", i, card->ports[i].dev->name); +	pr_cont("\n");  	for (i = 0; i < ports; i++)  		wanxl_cable_intr(&card->ports[i]); /* get carrier status etc.*/ @@ -835,7 +829,7 @@ static struct pci_driver wanxl_pci_driver = {  static int __init wanxl_init_module(void)  {  #ifdef MODULE -	printk(KERN_INFO "%s\n", version); +	pr_info("%s\n", version);  #endif  	return pci_register_driver(&wanxl_pci_driver);  } diff --git a/drivers/net/wan/wanxlfw.S b/drivers/net/wan/wanxlfw.S index 73aae2bf2f1..21565d59ec7 100644 --- a/drivers/net/wan/wanxlfw.S +++ b/drivers/net/wan/wanxlfw.S @@ -35,6 +35,7 @@  */  #include <linux/hdlc.h> +#include <linux/hdlc/ioctl.h>  #include "wanxl.h"  /* memory addresses and offsets */ diff --git a/drivers/net/wan/x25_asy.c b/drivers/net/wan/x25_asy.c index d81ad839788..fa9fdfa128c 100644 --- a/drivers/net/wan/x25_asy.c +++ b/drivers/net/wan/x25_asy.c @@ -14,9 +14,10 @@   *	2000-10-29	Henner Eisen	lapb_data_indication() return status.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h> -#include <asm/system.h>  #include <linux/uaccess.h>  #include <linux/bitops.h>  #include <linux/string.h> @@ -96,7 +97,7 @@ static struct x25_asy *x25_asy_alloc(void)  			x25_asy_devs[i] = dev;  			return sl;  		} else { -			printk(KERN_WARNING "x25_asy_alloc() - register_netdev() failure.\n"); +			pr_warn("%s(): register_netdev() failure\n", __func__);  			free_netdev(dev);  		}  	} @@ -114,22 +115,23 @@ static void x25_asy_free(struct x25_asy *sl)  	sl->xbuff = NULL;  	if (!test_and_clear_bit(SLF_INUSE, &sl->flags)) -		printk(KERN_ERR "%s: x25_asy_free for already free unit.\n", -			sl->dev->name); +		netdev_err(sl->dev, "x25_asy_free for already free unit\n");  }  static int x25_asy_change_mtu(struct net_device *dev, int newmtu)  {  	struct x25_asy *sl = netdev_priv(dev);  	unsigned char *xbuff, *rbuff; -	int len = 2 * newmtu; +	int len; + +	if (newmtu > 65534) +		return -EINVAL; +	len = 2 * newmtu;  	xbuff = kmalloc(len + 4, GFP_ATOMIC);  	rbuff = kmalloc(len + 4, GFP_ATOMIC);  	if (xbuff == NULL || rbuff == NULL) { -		printk(KERN_WARNING "%s: unable to grow X.25 buffers, MTU change cancelled.\n", -		       dev->name);  		kfree(xbuff);  		kfree(rbuff);  		return -ENOMEM; @@ -198,8 +200,7 @@ static void x25_asy_bump(struct x25_asy *sl)  	skb = dev_alloc_skb(count+1);  	if (skb == NULL) { -		printk(KERN_WARNING "%s: memory squeeze, dropping packet.\n", -			sl->dev->name); +		netdev_warn(sl->dev, "memory squeeze, dropping packet\n");  		dev->stats.rx_dropped++;  		return;  	} @@ -233,7 +234,7 @@ static void x25_asy_encaps(struct x25_asy *sl, unsigned char *icp, int len)  	}  	p = icp; -	count = x25_asy_esc(p, (unsigned char *) sl->xbuff, len); +	count = x25_asy_esc(p, sl->xbuff, len);  	/* Order of next two lines is *very* important.  	 * When we are sending a little amount of data, @@ -287,9 +288,9 @@ static void x25_asy_timeout(struct net_device *dev)  		/* May be we must check transmitter timeout here ?  		 *      14 Oct 1994 Dmitry Gorodchanin.  		 */ -		printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name, -		       (tty_chars_in_buffer(sl->tty) || sl->xleft) ? -		       "bad line quality" : "driver error"); +		netdev_warn(dev, "transmit timed out, %s?\n", +			    (tty_chars_in_buffer(sl->tty) || sl->xleft) ? +			    "bad line quality" : "driver error");  		sl->xleft = 0;  		clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);  		x25_asy_unlock(sl); @@ -306,8 +307,7 @@ static netdev_tx_t x25_asy_xmit(struct sk_buff *skb,  	int err;  	if (!netif_running(sl->dev)) { -		printk(KERN_ERR "%s: xmit call when iface is down\n", -			dev->name); +		netdev_err(dev, "xmit call when iface is down\n");  		kfree_skb(skb);  		return NETDEV_TX_OK;  	} @@ -318,13 +318,15 @@ static netdev_tx_t x25_asy_xmit(struct sk_buff *skb,  	case X25_IFACE_CONNECT: /* Connection request .. do nothing */  		err = lapb_connect_request(dev);  		if (err != LAPB_OK) -			printk(KERN_ERR "x25_asy: lapb_connect_request error - %d\n", err); +			netdev_err(dev, "lapb_connect_request error: %d\n", +				   err);  		kfree_skb(skb);  		return NETDEV_TX_OK;  	case X25_IFACE_DISCONNECT: /* do nothing - hang up ?? */  		err = lapb_disconnect_request(dev);  		if (err != LAPB_OK) -			printk(KERN_ERR "x25_asy: lapb_disconnect_request error - %d\n", err); +			netdev_err(dev, "lapb_disconnect_request error: %d\n", +				   err);  	default:  		kfree_skb(skb);  		return NETDEV_TX_OK; @@ -343,7 +345,7 @@ static netdev_tx_t x25_asy_xmit(struct sk_buff *skb,  	err = lapb_data_request(dev, skb);  	if (err != LAPB_OK) { -		printk(KERN_ERR "x25_asy: lapb_data_request error - %d\n", err); +		netdev_err(dev, "lapb_data_request error: %d\n", err);  		kfree_skb(skb);  		return NETDEV_TX_OK;  	} @@ -378,7 +380,7 @@ static void x25_asy_data_transmit(struct net_device *dev, struct sk_buff *skb)  	spin_lock(&sl->lock);  	if (netif_queue_stopped(sl->dev) || sl->tty == NULL) {  		spin_unlock(&sl->lock); -		printk(KERN_ERR "x25_asy: tbusy drop\n"); +		netdev_err(dev, "tbusy drop\n");  		kfree_skb(skb);  		return;  	} @@ -404,7 +406,7 @@ static void x25_asy_connected(struct net_device *dev, int reason)  	skb = dev_alloc_skb(1);  	if (skb == NULL) { -		printk(KERN_ERR "x25_asy: out of memory\n"); +		netdev_err(dev, "out of memory\n");  		return;  	} @@ -423,7 +425,7 @@ static void x25_asy_disconnected(struct net_device *dev, int reason)  	skb = dev_alloc_skb(1);  	if (skb == NULL) { -		printk(KERN_ERR "x25_asy: out of memory\n"); +		netdev_err(dev, "out of memory\n");  		return;  	} @@ -434,14 +436,13 @@ static void x25_asy_disconnected(struct net_device *dev, int reason)  	netif_rx(skb);  } -static struct lapb_register_struct x25_asy_callbacks = { +static const struct lapb_register_struct x25_asy_callbacks = {  	.connect_confirmation = x25_asy_connected,  	.connect_indication = x25_asy_connected,  	.disconnect_confirmation = x25_asy_disconnected,  	.disconnect_indication = x25_asy_disconnected,  	.data_indication = x25_asy_data_indication,  	.data_transmit = x25_asy_data_transmit, -  }; @@ -498,7 +499,6 @@ norbuff:  static int x25_asy_close(struct net_device *dev)  {  	struct x25_asy *sl = netdev_priv(dev); -	int err;  	spin_lock(&sl->lock);  	if (sl->tty) @@ -507,10 +507,6 @@ static int x25_asy_close(struct net_device *dev)  	netif_stop_queue(dev);  	sl->rcount = 0;  	sl->xleft  = 0; -	err = lapb_unregister(dev); -	if (err != LAPB_OK) -		printk(KERN_ERR "x25_asy_close: lapb_unregister error -%d\n", -			err);  	spin_unlock(&sl->lock);  	return 0;  } @@ -582,7 +578,7 @@ static int x25_asy_open_tty(struct tty_struct *tty)  	if (err)  		return err;  	/* Done.  We have linked the TTY line to a channel. */ -	return sl->dev->base_addr; +	return 0;  } @@ -595,6 +591,7 @@ static int x25_asy_open_tty(struct tty_struct *tty)  static void x25_asy_close_tty(struct tty_struct *tty)  {  	struct x25_asy *sl = tty->disc_data; +	int err;  	/* First make sure we're connected. */  	if (!sl || sl->magic != X25_ASY_MAGIC) @@ -605,6 +602,11 @@ static void x25_asy_close_tty(struct tty_struct *tty)  		dev_close(sl->dev);  	rtnl_unlock(); +	err = lapb_unregister(sl->dev); +	if (err != LAPB_OK) +		pr_err("x25_asy_close: lapb_unregister error: %d\n", +		       err); +  	tty->disc_data = NULL;  	sl->tty = NULL;  	x25_asy_free(sl); @@ -781,16 +783,13 @@ static int __init init_x25_asy(void)  	if (x25_asy_maxdev < 4)  		x25_asy_maxdev = 4; /* Sanity */ -	printk(KERN_INFO "X.25 async: version 0.00 ALPHA " -			"(dynamic channels, max=%d).\n", x25_asy_maxdev); +	pr_info("X.25 async: version 0.00 ALPHA (dynamic channels, max=%d)\n", +		x25_asy_maxdev);  	x25_asy_devs = kcalloc(x25_asy_maxdev, sizeof(struct net_device *),  				GFP_KERNEL); -	if (!x25_asy_devs) { -		printk(KERN_WARNING "X25 async: Can't allocate x25_asy_ctrls[] " -				"array! Uaargh! (-> No X.25 available)\n"); +	if (!x25_asy_devs)  		return -ENOMEM; -	}  	return tty_register_ldisc(N_X25, &x25_ldisc);  } diff --git a/drivers/net/wan/x25_asy.h b/drivers/net/wan/x25_asy.h index 8f0fc2e57e2..f57ee67836a 100644 --- a/drivers/net/wan/x25_asy.h +++ b/drivers/net/wan/x25_asy.h @@ -41,6 +41,6 @@ struct x25_asy {  #define X25_ASY_MAGIC 0x5303 -extern int x25_asy_init(struct net_device *dev); +int x25_asy_init(struct net_device *dev);  #endif	/* _LINUX_X25_ASY.H */ diff --git a/drivers/net/wan/z85230.c b/drivers/net/wan/z85230.c index 93956861ea2..feacc3b994b 100644 --- a/drivers/net/wan/z85230.c +++ b/drivers/net/wan/z85230.c @@ -36,6 +36,8 @@   *	Synchronous mode without DMA is unlikely to pass about 2400 baud.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/mm.h> @@ -365,7 +367,7 @@ static void z8530_rx(struct z8530_channel *c)  				c->count=0;  				if(stat&Rx_OVR)  				{ -					printk(KERN_WARNING "%s: overrun\n", c->dev->name); +					pr_warn("%s: overrun\n", c->dev->name);  					c->rx_overrun++;  				}  				if(stat&CRC_ERR) @@ -464,12 +466,12 @@ static void z8530_status(struct z8530_channel *chan)  	if (altered & chan->dcdcheck)  	{  		if (status & chan->dcdcheck) { -			printk(KERN_INFO "%s: DCD raised\n", chan->dev->name); +			pr_info("%s: DCD raised\n", chan->dev->name);  			write_zsreg(chan, R3, chan->regs[3] | RxENABLE);  			if (chan->netdevice)  				netif_carrier_on(chan->netdevice);  		} else { -			printk(KERN_INFO "%s: DCD lost\n", chan->dev->name); +			pr_info("%s: DCD lost\n", chan->dev->name);  			write_zsreg(chan, R3, chan->regs[3] & ~RxENABLE);  			z8530_flush_fifo(chan);  			if (chan->netdevice) @@ -538,12 +540,12 @@ static void z8530_dma_tx(struct z8530_channel *chan)  {  	if(!chan->dma_tx)  	{ -		printk(KERN_WARNING "Hey who turned the DMA off?\n"); +		pr_warn("Hey who turned the DMA off?\n");  		z8530_tx(chan);  		return;  	} -	/* This shouldnt occur in DMA mode */ -	printk(KERN_ERR "DMA tx - bogus event!\n"); +	/* This shouldn't occur in DMA mode */ +	pr_err("DMA tx - bogus event!\n");  	z8530_tx(chan);  } @@ -585,12 +587,12 @@ static void z8530_dma_status(struct z8530_channel *chan)  	if (altered & chan->dcdcheck)  	{  		if (status & chan->dcdcheck) { -			printk(KERN_INFO "%s: DCD raised\n", chan->dev->name); +			pr_info("%s: DCD raised\n", chan->dev->name);  			write_zsreg(chan, R3, chan->regs[3] | RxENABLE);  			if (chan->netdevice)  				netif_carrier_on(chan->netdevice);  		} else { -			printk(KERN_INFO "%s:DCD lost\n", chan->dev->name); +			pr_info("%s: DCD lost\n", chan->dev->name);  			write_zsreg(chan, R3, chan->regs[3] & ~RxENABLE);  			z8530_flush_fifo(chan);  			if (chan->netdevice) @@ -712,7 +714,7 @@ irqreturn_t z8530_interrupt(int irq, void *dev_id)  	if(locker)  	{ -		printk(KERN_ERR "IRQ re-enter\n"); +		pr_err("IRQ re-enter\n");  		return IRQ_NONE;  	}  	locker=1; @@ -758,7 +760,8 @@ irqreturn_t z8530_interrupt(int irq, void *dev_id)  	}  	spin_unlock(&dev->lock);  	if(work==5000) -		printk(KERN_ERR "%s: interrupt jammed - abort(0x%X)!\n", dev->name, intr); +		pr_err("%s: interrupt jammed - abort(0x%X)!\n", +		       dev->name, intr);  	/* Ok all done */  	locker=0;  	return IRQ_HANDLED; @@ -1219,13 +1222,13 @@ static const char *z8530_type_name[]={   *	@io: the port value in question   *   *	Describe a Z8530 in a standard format. We must pass the I/O as - *	the port offset isnt predictable. The main reason for this function + *	the port offset isn't predictable. The main reason for this function   *	is to try and get a common format of report.   */  void z8530_describe(struct z8530_dev *dev, char *mapping, unsigned long io)  { -	printk(KERN_INFO "%s: %s found at %s 0x%lX, IRQ %d.\n", +	pr_info("%s: %s found at %s 0x%lX, IRQ %d\n",  		dev->name,   		z8530_type_name[dev->type],  		mapping, @@ -1588,7 +1591,7 @@ static void z8530_rx_done(struct z8530_channel *c)  		unsigned long flags;  		/* -		 *	Complete this DMA. Neccessary to find the length +		 *	Complete this DMA. Necessary to find the length  		 */		  		flags=claim_dma_lock(); @@ -1621,8 +1624,7 @@ static void z8530_rx_done(struct z8530_channel *c)  		else  			/* Can't occur as we dont reenable the DMA irq until  			   after the flip is done */ -			printk(KERN_WARNING "%s: DMA flip overrun!\n", -			       c->netdevice->name); +			netdev_warn(c->netdevice, "DMA flip overrun!\n");  		release_dma_lock(flags); @@ -1637,8 +1639,7 @@ static void z8530_rx_done(struct z8530_channel *c)  		skb = dev_alloc_skb(ct);  		if (skb == NULL) {  			c->netdevice->stats.rx_dropped++; -			printk(KERN_WARNING "%s: Memory squeeze.\n", -			       c->netdevice->name); +			netdev_warn(c->netdevice, "Memory squeeze\n");  		} else {  			skb_put(skb, ct);  			skb_copy_to_linear_data(skb, rxb, ct); @@ -1657,7 +1658,7 @@ static void z8530_rx_done(struct z8530_channel *c)  		 *	fifo length for this. Thus we want to flip to the new  		 *	buffer and then mess around copying and allocating  		 *	things. For the current case it doesn't matter but -		 *	if you build a system where the sync irq isnt blocked +		 *	if you build a system where the sync irq isn't blocked  		 *	by the kernel IRQ disable then you need only block the  		 *	sync IRQ for the RT_LOCK area.  		 * @@ -1678,8 +1679,7 @@ static void z8530_rx_done(struct z8530_channel *c)  		c->skb2 = dev_alloc_skb(c->mtu);  		if (c->skb2 == NULL) -			printk(KERN_WARNING "%s: memory squeeze.\n", -			       c->netdevice->name); +			netdev_warn(c->netdevice, "memory squeeze\n");  		else  			skb_put(c->skb2, c->mtu);  		c->netdevice->stats.rx_packets++; @@ -1693,7 +1693,7 @@ static void z8530_rx_done(struct z8530_channel *c)  		c->rx_function(c, skb);  	} else {  		c->netdevice->stats.rx_dropped++; -		printk(KERN_ERR "%s: Lost a frame\n", c->netdevice->name); +		netdev_err(c->netdevice, "Lost a frame\n");  	}  } @@ -1775,7 +1775,7 @@ EXPORT_SYMBOL(z8530_queue_xmit);  /*   *	Module support   */ -static const char banner[] __initdata = +static const char banner[] __initconst =  	KERN_INFO "Generic Z85C30/Z85230 interface driver v0.02\n";  static int __init z85230_init_driver(void) diff --git a/drivers/net/wan/z85230.h b/drivers/net/wan/z85230.h index f29d554fc07..2416a9d60bd 100644 --- a/drivers/net/wan/z85230.h +++ b/drivers/net/wan/z85230.h @@ -395,20 +395,19 @@ struct z8530_dev  extern u8 z8530_dead_port[];  extern u8 z8530_hdlc_kilostream_85230[];  extern u8 z8530_hdlc_kilostream[]; -extern irqreturn_t z8530_interrupt(int, void *); -extern void z8530_describe(struct z8530_dev *, char *mapping, unsigned long io); -extern int z8530_init(struct z8530_dev *); -extern int z8530_shutdown(struct z8530_dev *); -extern int z8530_sync_open(struct net_device *, struct z8530_channel *); -extern int z8530_sync_close(struct net_device *, struct z8530_channel *); -extern int z8530_sync_dma_open(struct net_device *, struct z8530_channel *); -extern int z8530_sync_dma_close(struct net_device *, struct z8530_channel *); -extern int z8530_sync_txdma_open(struct net_device *, struct z8530_channel *); -extern int z8530_sync_txdma_close(struct net_device *, struct z8530_channel *); -extern int z8530_channel_load(struct z8530_channel *, u8 *); -extern netdev_tx_t z8530_queue_xmit(struct z8530_channel *c, -					  struct sk_buff *skb); -extern void z8530_null_rx(struct z8530_channel *c, struct sk_buff *skb); +irqreturn_t z8530_interrupt(int, void *); +void z8530_describe(struct z8530_dev *, char *mapping, unsigned long io); +int z8530_init(struct z8530_dev *); +int z8530_shutdown(struct z8530_dev *); +int z8530_sync_open(struct net_device *, struct z8530_channel *); +int z8530_sync_close(struct net_device *, struct z8530_channel *); +int z8530_sync_dma_open(struct net_device *, struct z8530_channel *); +int z8530_sync_dma_close(struct net_device *, struct z8530_channel *); +int z8530_sync_txdma_open(struct net_device *, struct z8530_channel *); +int z8530_sync_txdma_close(struct net_device *, struct z8530_channel *); +int z8530_channel_load(struct z8530_channel *, u8 *); +netdev_tx_t z8530_queue_xmit(struct z8530_channel *c, struct sk_buff *skb); +void z8530_null_rx(struct z8530_channel *c, struct sk_buff *skb);  /*  | 
