Netdev List
 help / color / mirror / Atom feed
* [PATCH] Tulip: don't initialize SBE xT3E3 WAN ports.
From: Krzysztof Halasa @ 2010-07-31  9:32 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

SBE 2T3E3 cards use DECchips 21143 but they need a different driver.
Don't even try to use a normal tulip driver with them.

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>

--- a/drivers/net/tulip/tulip_core.c
+++ b/drivers/net/tulip/tulip_core.c
@@ -1309,6 +1309,12 @@ static int __devinit tulip_init_one (struct pci_dev *pdev,
         if (pdev->subsystem_vendor == PCI_VENDOR_ID_LMC) {
 		pr_err(PFX "skipping LMC card\n");
 		return -ENODEV;
+	} else if (pdev->subsystem_vendor == PCI_VENDOR_ID_SBE &&
+		   (pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_T3E3 ||
+		    pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_2T3E3_P0 ||
+		    pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_2T3E3_P1)) {
+		pr_err(PFX "skipping SBE T3E3 port\n");
+		return -ENODEV;
 	}
 
 	/*
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1494,6 +1494,9 @@
 #define PCI_DEVICE_ID_SBE_WANXL100	0x0301
 #define PCI_DEVICE_ID_SBE_WANXL200	0x0302
 #define PCI_DEVICE_ID_SBE_WANXL400	0x0104
+#define PCI_SUBDEVICE_ID_SBE_T3E3	0x0009
+#define PCI_SUBDEVICE_ID_SBE_2T3E3_P0	0x0901
+#define PCI_SUBDEVICE_ID_SBE_2T3E3_P1	0x0902
 
 #define PCI_VENDOR_ID_TOSHIBA		0x1179
 #define PCI_DEVICE_ID_TOSHIBA_PICCOLO_1	0x0101

^ permalink raw reply

* [PATCH staging] Add SBE 2T3E3 WAN driver
From: Krzysztof Halasa @ 2010-07-31  9:53 UTC (permalink / raw)
  To: Greg KH; +Cc: netdev

This is a driver for SBE Inc.'s dual port T3/E3 WAN cards. Based on
their original GPLed driver.
It needs at least a new generic HDLC setup code (not yet written) before
moving to drivers/net/wan.

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>

---
I have generated the patch against v2.6.35-rc6. Compiles cleanly.
Please let me know if it needs extra changes for e.g. staging tree.
Thanks.

 drivers/staging/Kconfig              |    2 +
 drivers/staging/Makefile             |    1 +
 drivers/staging/sbe-2t3e3/2t3e3.h    |  896 ++++++++++++++++++++++++++++++++++
 drivers/staging/sbe-2t3e3/Kconfig    |   13 +
 drivers/staging/sbe-2t3e3/Makefile   |    4 +
 drivers/staging/sbe-2t3e3/cpld.c     |  366 ++++++++++++++
 drivers/staging/sbe-2t3e3/ctrl.c     |  363 ++++++++++++++
 drivers/staging/sbe-2t3e3/ctrl.h     |  131 +++++
 drivers/staging/sbe-2t3e3/dc.c       |  507 +++++++++++++++++++
 drivers/staging/sbe-2t3e3/exar7250.c |  217 ++++++++
 drivers/staging/sbe-2t3e3/exar7300.c |  182 +++++++
 drivers/staging/sbe-2t3e3/intr.c     |  651 ++++++++++++++++++++++++
 drivers/staging/sbe-2t3e3/io.c       |  352 +++++++++++++
 drivers/staging/sbe-2t3e3/main.c     |  171 +++++++
 drivers/staging/sbe-2t3e3/maps.c     |  104 ++++
 drivers/staging/sbe-2t3e3/module.c   |  210 ++++++++
 drivers/staging/sbe-2t3e3/netdev.c   |  142 ++++++
 include/linux/pci_ids.h              |    3 +
 18 files changed, 4315 insertions(+), 0 deletions(-)

diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
index 984a754..3a21878 100644
--- a/drivers/staging/Kconfig
+++ b/drivers/staging/Kconfig
@@ -147,5 +147,7 @@ source "drivers/staging/mrst-touchscreen/Kconfig"
 
 source "drivers/staging/msm/Kconfig"
 
+source "drivers/staging/sbe-2t3e3/Kconfig"
+
 endif # !STAGING_EXCLUDE_BUILD
 endif # STAGING
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
index 9fa2513..39687c5 100644
--- a/drivers/staging/Makefile
+++ b/drivers/staging/Makefile
@@ -54,3 +54,4 @@ obj-$(CONFIG_ADIS16255)		+= adis16255/
 obj-$(CONFIG_FB_XGI)		+= xgifb/
 obj-$(CONFIG_TOUCHSCREEN_MRSTOUCH)	+= mrst-touchscreen/
 obj-$(CONFIG_MSM_STAGING)	+= msm/
+obj-$(CONFIG_SBE_2T3E3)		+= sbe-2t3e3/
diff --git a/drivers/staging/sbe-2t3e3/2t3e3.h b/drivers/staging/sbe-2t3e3/2t3e3.h
new file mode 100644
index 0000000..145f412
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/2t3e3.h
@@ -0,0 +1,896 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#ifndef T3E3_H
+#define T3E3_H
+
+#include <linux/hdlc.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/io.h>
+#include "ctrl.h"
+
+#define DRV_NAME "SBE 2T3E3"
+
+/**************************************************************
+ *  21143
+ **************************************************************/
+
+/* CSR */
+#define SBE_2T3E3_21143_REG_BUS_MODE					0
+#define SBE_2T3E3_21143_REG_TRANSMIT_POLL_DEMAND			1
+#define SBE_2T3E3_21143_REG_RECEIVE_POLL_DEMAND				2
+#define SBE_2T3E3_21143_REG_RECEIVE_LIST_BASE_ADDRESS			3
+#define SBE_2T3E3_21143_REG_TRANSMIT_LIST_BASE_ADDRESS			4
+#define SBE_2T3E3_21143_REG_STATUS					5
+#define SBE_2T3E3_21143_REG_OPERATION_MODE				6
+#define SBE_2T3E3_21143_REG_INTERRUPT_ENABLE				7
+#define SBE_2T3E3_21143_REG_MISSED_FRAMES_AND_OVERFLOW_COUNTER		8
+#define SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT	9
+#define SBE_2T3E3_21143_REG_BOOT_ROM_PROGRAMMING_ADDRESS		10
+#define SBE_2T3E3_21143_REG_GENERAL_PURPOSE_TIMER_AND_INTERRUPT_MITIGATION_CONTROL 11
+#define SBE_2T3E3_21143_REG_SIA_STATUS					12
+#define SBE_2T3E3_21143_REG_SIA_CONNECTIVITY				13
+#define SBE_2T3E3_21143_REG_SIA_TRANSMIT_AND_RECEIVE			14
+#define SBE_2T3E3_21143_REG_SIA_AND_GENERAL_PURPOSE_PORT		15
+#define SBE_2T3E3_21143_REG_MAX						16
+
+/* CSR0 - BUS_MODE */
+#define SBE_2T3E3_21143_VAL_WRITE_AND_INVALIDATE_ENABLE		0x01000000
+#define SBE_2T3E3_21143_VAL_READ_LINE_ENABLE			0x00800000
+#define SBE_2T3E3_21143_VAL_READ_MULTIPLE_ENABLE		0x00200000
+#define SBE_2T3E3_21143_VAL_TRANSMIT_AUTOMATIC_POLLING_200us	0x00020000
+#define SBE_2T3E3_21143_VAL_TRANSMIT_AUTOMATIC_POLLING_DISABLED	0x00000000
+#define SBE_2T3E3_21143_VAL_CACHE_ALIGNMENT_32			0x0000c000
+#define SBE_2T3E3_21143_VAL_CACHE_ALIGNMENT_16			0x00008000
+#define SBE_2T3E3_21143_VAL_CACHE_ALIGNMENT_8			0x00004000
+#define SBE_2T3E3_21143_VAL_BUS_ARBITRATION_RR			0x00000002
+#define SBE_2T3E3_21143_VAL_SOFTWARE_RESET			0x00000001
+
+/* CSR5 - STATUS */
+#define SBE_2T3E3_21143_VAL_GENERAL_PURPOSE_PORT_INTERRUPT	0x04000000
+#define SBE_2T3E3_21143_VAL_ERROR_BITS				0x03800000
+#define SBE_2T3E3_21143_VAL_PARITY_ERROR			0x00000000
+#define SBE_2T3E3_21143_VAL_MASTER_ABORT			0x00800000
+#define SBE_2T3E3_21143_VAL_TARGET_ABORT			0x01000000
+#define SBE_2T3E3_21143_VAL_TRANSMISSION_PROCESS_STATE		0x00700000
+#define SBE_2T3E3_21143_VAL_TX_STOPPED				0x00000000
+#define SBE_2T3E3_21143_VAL_TX_SUSPENDED			0x00600000
+#define SBE_2T3E3_21143_VAL_RECEIVE_PROCESS_STATE		0x000e0000
+#define SBE_2T3E3_21143_VAL_RX_STOPPED				0x00000000
+#define SBE_2T3E3_21143_VAL_RX_SUSPENDED			0x000a0000
+#define SBE_2T3E3_21143_VAL_NORMAL_INTERRUPT_SUMMARY		0x00010000
+#define SBE_2T3E3_21143_VAL_ABNORMAL_INTERRUPT_SUMMARY		0x00008000
+#define SBE_2T3E3_21143_VAL_EARLY_RECEIVE_INTERRUPT		0x00004000
+#define SBE_2T3E3_21143_VAL_FATAL_BUS_ERROR			0x00002000
+#define SBE_2T3E3_21143_VAL_GENERAL_PURPOSE_TIMER_EXPIRED	0x00000800
+#define SBE_2T3E3_21143_VAL_EARLY_TRANSMIT_INTERRUPT		0x00000400
+#define SBE_2T3E3_21143_VAL_RECEIVE_WATCHDOG_TIMEOUT		0x00000200
+#define SBE_2T3E3_21143_VAL_RECEIVE_PROCESS_STOPPED		0x00000100
+#define SBE_2T3E3_21143_VAL_RECEIVE_BUFFER_UNAVAILABLE		0x00000080
+#define SBE_2T3E3_21143_VAL_RECEIVE_INTERRUPT			0x00000040
+#define SBE_2T3E3_21143_VAL_TRANSMIT_UNDERFLOW			0x00000020
+#define SBE_2T3E3_21143_VAL_TRANSMIT_JABBER_TIMEOUT		0x00000008
+#define SBE_2T3E3_21143_VAL_TRANSMIT_BUFFER_UNAVAILABLE		0x00000004
+#define SBE_2T3E3_21143_VAL_TRANSMIT_PROCESS_STOPPED		0x00000002
+#define SBE_2T3E3_21143_VAL_TRANSMIT_INTERRUPT			0x00000001
+
+/* CSR6 - OPERATION_MODE */
+#define SBE_2T3E3_21143_VAL_SPECIAL_CAPTURE_EFFECT_ENABLE	0x80000000
+#define SBE_2T3E3_21143_VAL_RECEIVE_ALL				0x40000000
+#define SBE_2T3E3_21143_VAL_MUST_BE_ONE				0x02000000
+#define SBE_2T3E3_21143_VAL_SCRAMBLER_MODE			0x01000000
+#define SBE_2T3E3_21143_VAL_PCS_FUNCTION			0x00800000
+#define SBE_2T3E3_21143_VAL_TRANSMIT_THRESHOLD_MODE_10Mbs	0x00400000
+#define SBE_2T3E3_21143_VAL_TRANSMIT_THRESHOLD_MODE_100Mbs	0x00000000
+#define SBE_2T3E3_21143_VAL_STORE_AND_FORWARD			0x00200000
+#define SBE_2T3E3_21143_VAL_HEARTBEAT_DISABLE			0x00080000
+#define SBE_2T3E3_21143_VAL_PORT_SELECT				0x00040000
+#define SBE_2T3E3_21143_VAL_CAPTURE_EFFECT_ENABLE		0x00020000
+#define SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS		0x0000c000
+#define SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_1		0x00000000
+#define SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_2		0x00004000
+#define SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_3		0x00008000
+#define SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_4		0x0000c000
+#define SBE_2T3E3_21143_VAL_TRANSMISSION_START			0x00002000
+#define SBE_2T3E3_21143_VAL_OPERATING_MODE			0x00000c00
+#define SBE_2T3E3_21143_VAL_LOOPBACK_OFF			0x00000000
+#define SBE_2T3E3_21143_VAL_LOOPBACK_EXTERNAL			0x00000800
+#define SBE_2T3E3_21143_VAL_LOOPBACK_INTERNAL			0x00000400
+#define SBE_2T3E3_21143_VAL_FULL_DUPLEX_MODE			0x00000200
+#define SBE_2T3E3_21143_VAL_PASS_ALL_MULTICAST			0x00000080
+#define SBE_2T3E3_21143_VAL_PROMISCUOUS_MODE			0x00000040
+#define SBE_2T3E3_21143_VAL_PASS_BAD_FRAMES			0x00000008
+#define SBE_2T3E3_21143_VAL_RECEIVE_START			0x00000002
+
+/* CSR7 - INTERRUPT_ENABLE */
+#define SBE_2T3E3_21143_VAL_LINK_CHANGED_ENABLE			0x08000000
+#define SBE_2T3E3_21143_VAL_GENERAL_PURPOSE_PORT_ENABLE		0x04000000
+#define SBE_2T3E3_21143_VAL_NORMAL_INTERRUPT_SUMMARY_ENABLE	0x00010000
+#define SBE_2T3E3_21143_VAL_ABNORMAL_INTERRUPT_SUMMARY_ENABLE	0x00008000
+#define SBE_2T3E3_21143_VAL_EARLY_RECEIVE_INTERRUPT_ENABLE	0x00004000
+#define SBE_2T3E3_21143_VAL_FATAL_BUS_ERROR_ENABLE		0x00002000
+#define SBE_2T3E3_21143_VAL_LINK_FAIL_ENABLE			0x00001000
+#define SBE_2T3E3_21143_VAL_GENERAL_PURPOSE_TIMER_ENABLE	0x00000800
+#define SBE_2T3E3_21143_VAL_EARLY_TRANSMIT_INTERRUPT_ENABLE	0x00000400
+#define SBE_2T3E3_21143_VAL_RECEIVE_WATCHDOG_TIMEOUT_ENABLE	0x00000200
+#define SBE_2T3E3_21143_VAL_RECEIVE_STOPPED_ENABLE		0x00000100
+#define SBE_2T3E3_21143_VAL_RECEIVE_BUFFER_UNAVAILABLE_ENABLE	0x00000080
+#define SBE_2T3E3_21143_VAL_RECEIVE_INTERRUPT_ENABLE		0x00000040
+#define SBE_2T3E3_21143_VAL_TRANSMIT_UNDERFLOW_INTERRUPT_ENABLE	0x00000020
+#define SBE_2T3E3_21143_VAL_TRANSMIT_JABBER_TIMEOUT_ENABLE	0x00000008
+#define SBE_2T3E3_21143_VAL_TRANSMIT_BUFFER_UNAVAILABLE_ENABLE	0x00000004
+#define SBE_2T3E3_21143_VAL_TRANSMIT_STOPPED_ENABLE		0x00000002
+#define SBE_2T3E3_21143_VAL_TRANSMIT_INTERRUPT_ENABLE		0x00000001
+
+/* CSR8 - MISSED_FRAMES_AND_OVERFLOW_COUNTER */
+#define SBE_2T3E3_21143_VAL_OVERFLOW_COUNTER_OVERFLOW		0x10000000
+#define SBE_2T3E3_21143_VAL_OVERFLOW_COUNTER			0x0ffe0000
+#define SBE_2T3E3_21143_VAL_MISSED_FRAME_OVERFLOW		0x00010000
+#define SBE_2T3E3_21143_VAL_MISSED_FRAMES_COUNTER		0x0000ffff
+
+/* CSR9 - BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT */
+#define SBE_2T3E3_21143_VAL_MII_MANAGEMENT_DATA_IN		0x00080000
+#define SBE_2T3E3_21143_VAL_MII_MANAGEMENT_READ_MODE		0x00040000
+#define SBE_2T3E3_21143_VAL_MII_MANAGEMENT_DATA_OUT		0x00020000
+#define SBE_2T3E3_21143_VAL_MII_MANAGEMENT_CLOCK		0x00010000
+#define SBE_2T3E3_21143_VAL_READ_OPERATION			0x00004000
+#define SBE_2T3E3_21143_VAL_WRITE_OPERATION			0x00002000
+#define SBE_2T3E3_21143_VAL_BOOT_ROM_SELECT			0x00001000
+#define SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT			0x00000800
+#define SBE_2T3E3_21143_VAL_BOOT_ROM_DATA			0x000000ff
+#define SBE_2T3E3_21143_VAL_SERIAL_ROM_DATA_OUT			0x00000008
+#define SBE_2T3E3_21143_VAL_SERIAL_ROM_DATA_IN			0x00000004
+#define SBE_2T3E3_21143_VAL_SERIAL_ROM_CLOCK			0x00000002
+#define SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT		0x00000001
+
+/* CSR11 - GENERAL_PURPOSE_TIMER_AND_INTERRUPT_MITIGATION_CONTROL */
+#define SBE_2T3E3_21143_VAL_CYCLE_SIZE				0x80000000
+#define SBE_2T3E3_21143_VAL_TRANSMIT_TIMER			0x78000000
+#define SBE_2T3E3_21143_VAL_NUMBER_OF_TRANSMIT_PACKETS		0x07000000
+#define SBE_2T3E3_21143_VAL_RECEIVE_TIMER			0x00f00000
+#define SBE_2T3E3_21143_VAL_NUMBER_OF_RECEIVE_PACKETS		0x000e0000
+#define SBE_2T3E3_21143_VAL_CONTINUOUS_MODE			0x00010000
+#define SBE_2T3E3_21143_VAL_TIMER_VALUE				0x0000ffff
+
+/* CSR12 - SIA_STATUS */
+#define SBE_2T3E3_21143_VAL_10BASE_T_RECEIVE_PORT_ACTIVITY	0x00000200
+#define SBE_2T3E3_21143_VAL_AUI_RECEIVE_PORT_ACTIVITY		0x00000100
+#define SBE_2T3E3_21143_VAL_10Mbs_LINK_STATUS			0x00000004
+#define SBE_2T3E3_21143_VAL_100Mbs_LINK_STATUS			0x00000002
+#define SBE_2T3E3_21143_VAL_MII_RECEIVE_PORT_ACTIVITY		0x00000001
+
+/* CSR13 - SIA_CONNECTIVITY */
+#define SBE_2T3E3_21143_VAL_10BASE_T_OR_AUI			0x00000008
+#define SBE_2T3E3_21143_VAL_SIA_RESET				0x00000001
+
+/* CSR14 - SIA_TRANSMIT_AND_RECEIVE */
+#define SBE_2T3E3_21143_VAL_100BASE_TX_FULL_DUPLEX		0x00020000
+#define SBE_2T3E3_21143_VAL_COLLISION_DETECT_ENABLE		0x00000400
+#define SBE_2T3E3_21143_VAL_COLLISION_SQUELCH_ENABLE		0x00000200
+#define SBE_2T3E3_21143_VAL_RECEIVE_SQUELCH_ENABLE		0x00000100
+#define SBE_2T3E3_21143_VAL_LINK_PULSE_SEND_ENABLE		0x00000004
+#define SBE_2T3E3_21143_VAL_ENCODER_ENABLE			0x00000001
+
+/* CSR15 - SIA_AND_GENERAL_PURPOSE_PORT */
+#define SBE_2T3E3_21143_VAL_RECEIVE_WATCHDOG_DISABLE		0x00000010
+#define SBE_2T3E3_21143_VAL_AUI_BNC_MODE			0x00000008
+#define SBE_2T3E3_21143_VAL_HOST_UNJAB				0x00000002
+#define SBE_2T3E3_21143_VAL_JABBER_DISABLE			0x00000001
+
+/**************************************************************
+ *  CPLD
+ **************************************************************/
+
+/* reg_map indexes */
+#define SBE_2T3E3_CPLD_REG_PCRA				0
+#define SBE_2T3E3_CPLD_REG_PCRB				1
+#define SBE_2T3E3_CPLD_REG_PLCR				2
+#define SBE_2T3E3_CPLD_REG_PLTR				3
+#define SBE_2T3E3_CPLD_REG_PPFR				4
+#define SBE_2T3E3_CPLD_REG_BOARD_ID			5
+#define SBE_2T3E3_CPLD_REG_FPGA_VERSION			6
+#define SBE_2T3E3_CPLD_REG_FRAMER_BASE_ADDRESS		7
+#define SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT		8
+#define SBE_2T3E3_CPLD_REG_STATIC_RESET			9
+#define SBE_2T3E3_CPLD_REG_PULSE_RESET			10
+#define SBE_2T3E3_CPLD_REG_FPGA_RECONFIGURATION		11
+#define SBE_2T3E3_CPLD_REG_LEDR				12
+#define SBE_2T3E3_CPLD_REG_PICSR			13
+#define SBE_2T3E3_CPLD_REG_PIER				14
+#define SBE_2T3E3_CPLD_REG_PCRC				15
+#define SBE_2T3E3_CPLD_REG_PBWF				16
+#define SBE_2T3E3_CPLD_REG_PBWL				17
+
+#define SBE_2T3E3_CPLD_REG_MAX				18
+
+/**********/
+
+/* val_map indexes */
+#define SBE_2T3E3_CPLD_VAL_LIU_SELECT			0
+#define SBE_2T3E3_CPLD_VAL_DAC_SELECT			1
+#define SBE_2T3E3_CPLD_VAL_LOOP_TIMING_SOURCE		2
+#define SBE_2T3E3_CPLD_VAL_LIU_FRAMER_RESET		3
+
+/* PCRA */
+#define SBE_2T3E3_CPLD_VAL_CRC32				0x40
+#define SBE_2T3E3_CPLD_VAL_TRANSPARENT_MODE			0x20
+#define SBE_2T3E3_CPLD_VAL_REAR_PANEL				0x10
+#define SBE_2T3E3_CPLD_VAL_RAW_MODE				0x08
+#define SBE_2T3E3_CPLD_VAL_ALT					0x04
+#define SBE_2T3E3_CPLD_VAL_LOOP_TIMING				0x02
+#define SBE_2T3E3_CPLD_VAL_LOCAL_CLOCK_E3			0x01
+
+/* PCRB */
+#define SBE_2T3E3_CPLD_VAL_PAD_COUNT				0x30
+#define SBE_2T3E3_CPLD_VAL_PAD_COUNT_1				0x00
+#define SBE_2T3E3_CPLD_VAL_PAD_COUNT_2				0x10
+#define SBE_2T3E3_CPLD_VAL_PAD_COUNT_3				0x20
+#define SBE_2T3E3_CPLD_VAL_PAD_COUNT_4				0x30
+#define SBE_2T3E3_CPLD_VAL_SCRAMBLER_TYPE			0x02
+#define SBE_2T3E3_CPLD_VAL_SCRAMBLER_ENABLE			0x01
+
+/* PCRC */
+#define SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_NONE			0x00
+#define SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_0			0x01
+#define SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_1			0x11
+#define SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_2			0x21
+
+/* PLTR */
+#define SBE_2T3E3_CPLD_VAL_LCV_COUNTER				0xff
+
+/* SCSR */
+#define SBE_2T3E3_CPLD_VAL_EEPROM_SELECT			0x10
+
+/* PICSR */
+#define SBE_2T3E3_CPLD_VAL_LOSS_OF_SIGNAL_THRESHOLD_LEVEL_1	0x80
+#define SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_CHANGE	0x40
+#define SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_ETHERNET_ASSERTED	0x20
+#define SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_FRAMER_ASSERTED	0x10
+#define SBE_2T3E3_CPLD_VAL_LCV_LIMIT_EXCEEDED			0x08
+#define SBE_2T3E3_CPLD_VAL_DMO_SIGNAL_DETECTED			0x04
+#define SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_LOCK_DETECTED	0x02
+#define SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_DETECTED	0x01
+
+/* PIER */
+#define SBE_2T3E3_CPLD_VAL_RECEIVE_LOS_CHANGE_ENABLE		0x40
+#define SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_ETHERNET_ENABLE	0x20
+#define SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_FRAMER_ENABLE		0x10
+#define SBE_2T3E3_CPLD_VAL_LCV_INTERRUPT_ENABLE			0x08
+#define SBE_2T3E3_CPLD_VAL_DMO_ENABLE				0x04
+#define SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_LOCK_ENABLE		0x02
+#define SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_ENABLE	0x01
+
+/**************************************************************
+ *  Framer
+ **************************************************************/
+
+/* reg_map indexes */
+/* common */
+#define SBE_2T3E3_FRAMER_REG_OPERATING_MODE				0
+#define SBE_2T3E3_FRAMER_REG_IO_CONTROL					1
+#define SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE			2
+#define SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_STATUS			3
+#define SBE_2T3E3_FRAMER_REG_PMON_LCV_EVENT_COUNT_MSB			28
+#define SBE_2T3E3_FRAMER_REG_PMON_LCV_EVENT_COUNT_LSB			29
+#define SBE_2T3E3_FRAMER_REG_PMON_FRAMING_BIT_ERROR_EVENT_COUNT_MSB	30
+#define SBE_2T3E3_FRAMER_REG_PMON_FRAMING_BIT_ERROR_EVENT_COUNT_LSB	31
+#define SBE_2T3E3_FRAMER_REG_PMON_PARITY_ERROR_EVENT_COUNT_MSB		32
+#define SBE_2T3E3_FRAMER_REG_PMON_PARITY_ERROR_EVENT_COUNT_LSB		33
+#define SBE_2T3E3_FRAMER_REG_PMON_FEBE_EVENT_COUNT_MSB			34
+#define SBE_2T3E3_FRAMER_REG_PMON_FEBE_EVENT_COUNT_LSB			35
+#define SBE_2T3E3_FRAMER_REG_PMON_CP_BIT_ERROR_EVENT_COUNT_MSB		36
+#define SBE_2T3E3_FRAMER_REG_PMON_CP_BIT_ERROR_EVENT_COUNT_LSB		37
+#define SBE_2T3E3_FRAMER_REG_PMON_HOLDING_REGISTER			38
+#define SBE_2T3E3_FRAMER_REG_ONE_SECOND_ERROR_STATUS			39
+#define SBE_2T3E3_FRAMER_REG_LCV_ONE_SECOND_ACCUMULATOR_MSB		40
+#define SBE_2T3E3_FRAMER_REG_LCV_ONE_SECOND_ACCUMULATOR_LSB		41
+#define SBE_2T3E3_FRAMER_REG_FRAME_PARITY_ERROR_ONE_SECOND_ACCUMULATOR_MSB  42
+#define SBE_2T3E3_FRAMER_REG_FRAME_PARITY_ERROR_ONE_SECOND_ACCUMULATOR_LSB  43
+#define SBE_2T3E3_FRAMER_REG_FRAME_CP_BIT_ERROR_ONE_SECOND_ACCUMULATOR_MSB  44
+#define SBE_2T3E3_FRAMER_REG_FRAME_CP_BIT_ERROR_ONE_SECOND_ACCUMULATOR_LSB  45
+#define SBE_2T3E3_FRAMER_REG_LINE_INTERFACE_DRIVE			46
+#define SBE_2T3E3_FRAMER_REG_LINE_INTERFACE_SCAN			47
+
+/* T3 */
+#define SBE_2T3E3_FRAMER_REG_T3_RX_CONFIGURATION_STATUS			4
+#define SBE_2T3E3_FRAMER_REG_T3_RX_STATUS				5
+#define SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_ENABLE			6
+#define SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_STATUS			7
+#define SBE_2T3E3_FRAMER_REG_T3_RX_SYNC_DETECT_ENABLE			8
+#define SBE_2T3E3_FRAMER_REG_T3_RX_FEAC					10
+#define SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS		11
+#define SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL				12
+#define SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_STATUS				13
+#define SBE_2T3E3_FRAMER_REG_T3_TX_CONFIGURATION			16
+#define SBE_2T3E3_FRAMER_REG_T3_TX_FEAC_CONFIGURATION_STATUS		17
+#define SBE_2T3E3_FRAMER_REG_T3_TX_FEAC					18
+#define SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_CONFIGURATION			19
+#define SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_STATUS				20
+#define SBE_2T3E3_FRAMER_REG_T3_TX_MBIT_MASK				21
+#define SBE_2T3E3_FRAMER_REG_T3_TX_FBIT_MASK				22
+#define SBE_2T3E3_FRAMER_REG_T3_TX_FBIT_MASK_2				23
+#define SBE_2T3E3_FRAMER_REG_T3_TX_FBIT_MASK_3				24
+
+/* E3 */
+#define SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_1		4
+#define SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_2		5
+#define SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_1			6
+#define SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_2			7
+#define SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_1			8
+#define SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_2			9
+#define SBE_2T3E3_FRAMER_REG_E3_RX_LAPD_CONTROL				12
+#define SBE_2T3E3_FRAMER_REG_E3_RX_LAPD_STATUS				13
+#define SBE_2T3E3_FRAMER_REG_E3_RX_NR_BYTE				14
+#define SBE_2T3E3_FRAMER_REG_E3_RX_SERVICE_BITS				14
+#define SBE_2T3E3_FRAMER_REG_E3_RX_GC_BYTE				15
+#define SBE_2T3E3_FRAMER_REG_E3_TX_CONFIGURATION			16
+#define SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_CONFIGURATION			19
+#define SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_STATUS				19
+#define SBE_2T3E3_FRAMER_REG_E3_TX_GC_BYTE				21
+#define SBE_2T3E3_FRAMER_REG_E3_TX_SERVICE_BITS				21
+#define SBE_2T3E3_FRAMER_REG_E3_TX_MA_BYTE				22
+#define SBE_2T3E3_FRAMER_REG_E3_TX_NR_BYTE				23
+#define SBE_2T3E3_FRAMER_REG_E3_TX_FA1_ERROR_MASK			25
+#define SBE_2T3E3_FRAMER_REG_E3_TX_FAS_ERROR_MASK_UPPER			25
+#define SBE_2T3E3_FRAMER_REG_E3_TX_FA2_ERROR_MASK			26
+#define SBE_2T3E3_FRAMER_REG_E3_TX_FAS_ERROR_MASK_LOWER			26
+#define SBE_2T3E3_FRAMER_REG_E3_TX_BIP8_MASK				27
+#define SBE_2T3E3_FRAMER_REG_E3_TX_BIP4_MASK				27
+
+#define SBE_2T3E3_FRAMER_REG_MAX					48
+
+/**********/
+
+/* OPERATING_MODE */
+#define SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE		0x80
+#define SBE_2T3E3_FRAMER_VAL_T3_E3_SELECT			0x40
+#define SBE_2T3E3_FRAMER_VAL_INTERNAL_LOS_ENABLE		0x20
+#define SBE_2T3E3_FRAMER_VAL_RESET				0x10
+#define SBE_2T3E3_FRAMER_VAL_INTERRUPT_ENABLE_RESET		0x08
+#define SBE_2T3E3_FRAMER_VAL_FRAME_FORMAT_SELECT		0x04
+#define SBE_2T3E3_FRAMER_VAL_TIMING_ASYNCH_TXINCLK		0x03
+#define SBE_2T3E3_FRAMER_VAL_E3_G751				0x00
+#define SBE_2T3E3_FRAMER_VAL_E3_G832				0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_CBIT				0x40
+#define SBE_2T3E3_FRAMER_VAL_T3_M13				0x44
+#define SBE_2T3E3_FRAMER_VAL_LOOPBACK_ON			0x80
+#define SBE_2T3E3_FRAMER_VAL_LOOPBACK_OFF			0x00
+
+/* IO_CONTROL */
+#define SBE_2T3E3_FRAMER_VAL_DISABLE_TX_LOSS_OF_CLOCK		0x80
+#define SBE_2T3E3_FRAMER_VAL_LOSS_OF_CLOCK_STATUS		0x40
+#define SBE_2T3E3_FRAMER_VAL_DISABLE_RX_LOSS_OF_CLOCK		0x20
+#define SBE_2T3E3_FRAMER_VAL_AMI_LINE_CODE			0x10
+#define SBE_2T3E3_FRAMER_VAL_UNIPOLAR				0x08
+#define SBE_2T3E3_FRAMER_VAL_TX_LINE_CLOCK_INVERT		0x04
+#define SBE_2T3E3_FRAMER_VAL_RX_LINE_CLOCK_INVERT		0x02
+#define SBE_2T3E3_FRAMER_VAL_REFRAME				0x01
+
+/* BLOCK_INTERRUPT_ENABLE */
+#define SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_ENABLE		0x80
+#define SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_ENABLE		0x02
+#define SBE_2T3E3_FRAMER_VAL_ONE_SECOND_INTERRUPT_ENABLE	0x01
+
+/* BLOCK_INTERRUPT_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_STATUS		0x80
+#define SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_STATUS		0x02
+#define SBE_2T3E3_FRAMER_VAL_ONE_SECOND_INTERRUPT_STATUS	0x01
+
+/**********/
+
+/* T3_RX_CONFIGURATION_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_AIS				0x80
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LOS				0x40
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE				0x20
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_OOF				0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FRAMING_ON_PARITY		0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_F_SYNC_ALGO			0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_M_SYNC_ALGO			0x01
+
+/* T3_RX_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FERF				0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_AIC				0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FEBE				0x07
+
+/* T3_RX_INTERRUPT_ENABLE */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_CP_BIT_ERROR_INTERRUPT_ENABLE 0x80
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE		0x40
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_AIS_INTERRUPT_ENABLE		0x20
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE_INTERRUPT_ENABLE	0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FERF_INTERRUPT_ENABLE	0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_AIC_INTERRUPT_ENABLE		0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE		0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_P_BIT_INTERRUPT_ENABLE	0x01
+
+/* T3_RX_INTERRUPT_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_CP_BIT_ERROR_INTERRUPT_STATUS 0x80
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_STATUS		0x40
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_AIS_INTERRUPT_STATUS		0x20
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE_INTERRUPT_STATUS	0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FERF_INTERRUPT_STATUS	0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_AIC_INTERRUPT_STATUS		0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_STATUS		0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_P_BIT_INTERRUPT_STATUS	0x01
+
+/* T3_RX_FEAC_INTERRUPT_ENABLE_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_VALID			0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_REMOVE_INTERRUPT_ENABLE	0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_REMOVE_INTERRUPT_STATUS	0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_VALID_INTERRUPT_ENABLE	0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_VALID_INTERRUPT_STATUS	0x01
+
+/* T3_RX_LAPD_CONTROL */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LAPD_ENABLE			0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LAPD_INTERRUPT_ENABLE	0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LAPD_INTERRUPT_STATUS	0x01
+
+/* T3_RX_LAPD_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_ABORT			0x40
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_LAPD_TYPE			0x30
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_CR_TYPE			0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FCS_ERROR			0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_END_OF_MESSAGE		0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_RX_FLAG_PRESENT			0x01
+
+/* T3_TX_CONFIGURATION */
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_YELLOW_ALARM			0x80
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_X_BIT			0x40
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_IDLE				0x20
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_AIS				0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_LOS				0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FERF_ON_LOS			0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FERF_ON_OOF			0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FERF_ON_AIS			0x01
+
+/* T3_TX_FEAC_CONFIGURATION_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FEAC_INTERRUPT_ENABLE	0x10
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FEAC_INTERRUPT_STATUS	0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FEAC_ENABLE			0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FEAC_GO			0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_FEAC_BUSY			0x01
+
+/* T3_TX_LAPD_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_DL_START			0x08
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_DL_BUSY			0x04
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_LAPD_INTERRUPT_ENABLE	0x02
+#define SBE_2T3E3_FRAMER_VAL_T3_TX_LAPD_INTERRUPT_STATUS	0x01
+
+/**********/
+
+/* E3_RX_CONFIGURATION_STATUS_1 */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_PAYLOAD_TYPE			0xe0
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FERF_ALGO			0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_T_MARK_ALGO			0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_PAYLOAD_EXPECTED		0x07
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_BIP4				0x01
+
+/* E3_RX_CONFIGURATION_STATUS_2 */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOF_ALGO			0x80
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOF				0x40
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_OOF				0x20
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOS				0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_AIS				0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_PAYLOAD_UNSTABLE		0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_T_MARK			0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FERF				0x01
+
+/* E3_RX_INTERRUPT_ENABLE_1 */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_COFA_INTERRUPT_ENABLE	0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE		0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOF_INTERRUPT_ENABLE		0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE		0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_AIS_INTERRUPT_ENABLE		0x01
+
+/* E3_RX_INTERRUPT_ENABLE_2 */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_TTB_CHANGE_INTERRUPT_ENABLE	0x40
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FEBE_INTERRUPT_ENABLE	0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FERF_INTERRUPT_ENABLE	0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_BIP8_ERROR_INTERRUPT_ENABLE	0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_BIP4_ERROR_INTERRUPT_ENABLE	0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FRAMING_BYTE_ERROR_INTERRUPT_ENABLE 0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_PAYLOAD_MISMATCH_INTERRUPT_ENABLE 0x01
+
+/* E3_RX_INTERRUPT_STATUS_1 */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_COFA_INTERRUPT_STATUS	0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_STATUS		0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOF_INTERRUPT_STATUS		0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_STATUS		0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_AIS_INTERRUPT_STATUS		0x01
+
+/* E3_RX_INTERRUPT_STATUS_2 */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_TTB_CHANGE_INTERRUPT_STATUS	0x40
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FEBE_INTERRUPT_STATUS	0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FERF_INTERRUPT_STATUS	0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_BIP8_ERROR_INTERRUPT_STATUS	0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_BIP4_ERROR_INTERRUPT_STATUS	0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FRAMING_BYTE_ERROR_INTERRUPT_STATUS 0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_PAYLOAD_MISMATCH_INTERRUPT_STATUS 0x01
+
+/* E3_RX_LAPD_CONTROL */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_DL_FROM_NR			0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LAPD_ENABLE			0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LAPD_INTERRUPT_ENABLE	0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LAPD_INTERRUPT_STATUS	0x01
+
+/* E3_RX_LAPD_STATUS */
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_ABORT			0x40
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_LAPD_TYPE			0x30
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_CR_TYPE			0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FCS_ERROR			0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_END_OF_MESSAGE		0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_RX_FLAG_PRESENT			0x01
+
+/* E3_TX_CONFIGURATION */
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_BIP4_ENABLE			0x80
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_A_SOURCE_SELECT		0x60
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_DL_IN_NR			0x10
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_N_SOURCE_SELECT		0x18
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_AIS_ENABLE			0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_LOS_ENABLE			0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_MA_RX			0x01
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_FAS_SOURCE_SELECT		0x01
+
+/* E3_TX_LAPD_CONFIGURATION */
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_AUTO_RETRANSMIT		0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_LAPD_MESSAGE_LENGTH		0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_LAPD_ENABLE			0x01
+
+/* E3_TX_LAPD_STATUS_INTERRUPT */
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_DL_START			0x08
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_DL_BUSY			0x04
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_LAPD_INTERRUPT_ENABLE	0x02
+#define SBE_2T3E3_FRAMER_VAL_E3_TX_LAPD_INTERRUPT_STATUS	0x01
+
+
+
+
+
+
+/**************************************************************
+ *  LIU
+ **************************************************************/
+
+/* reg_map indexes */
+#define SBE_2T3E3_LIU_REG_REG0			0
+#define SBE_2T3E3_LIU_REG_REG1			1
+#define SBE_2T3E3_LIU_REG_REG2			2
+#define SBE_2T3E3_LIU_REG_REG3			3
+#define SBE_2T3E3_LIU_REG_REG4			4
+
+#define	SBE_2T3E3_LIU_REG_MAX			5
+
+/**********/
+
+/* REG0 */
+#define SBE_2T3E3_LIU_VAL_RECEIVE_LOSS_OF_LOCK_STATUS		0x10
+#define SBE_2T3E3_LIU_VAL_RECEIVE_LOSS_OF_SIGNAL_STATUS		0x08
+#define SBE_2T3E3_LIU_VAL_ANALOG_LOSS_OF_SIGNAL_STATUS		0x04
+#define SBE_2T3E3_LIU_VAL_DIGITAL_LOSS_OF_SIGNAL_STATUS		0x02
+#define SBE_2T3E3_LIU_VAL_DMO_STATUS				0x01
+
+/* REG1 */
+#define SBE_2T3E3_LIU_VAL_TRANSMITTER_OFF			0x10
+#define SBE_2T3E3_LIU_VAL_TRANSMIT_ALL_ONES			0x08
+#define SBE_2T3E3_LIU_VAL_TRANSMIT_CLOCK_INVERT			0x04
+#define SBE_2T3E3_LIU_VAL_TRANSMIT_LEVEL_SELECT			0x02
+#define SBE_2T3E3_LIU_VAL_TRANSMIT_BINARY_DATA			0x01
+
+/* REG2 */
+#define SBE_2T3E3_LIU_VAL_DECODER_DISABLE			0x10
+#define SBE_2T3E3_LIU_VAL_ENCODER_DISABLE			0x08
+#define SBE_2T3E3_LIU_VAL_ANALOG_LOSS_OF_SIGNAL_DISABLE		0x04
+#define SBE_2T3E3_LIU_VAL_DIGITAL_LOSS_OF_SIGNAL_DISABLE	0x02
+#define SBE_2T3E3_LIU_VAL_RECEIVE_EQUALIZATION_DISABLE		0x01
+
+/* REG3 */
+#define SBE_2T3E3_LIU_VAL_RECEIVE_BINARY_DATA			0x10
+#define SBE_2T3E3_LIU_VAL_RECOVERED_DATA_MUTING			0x08
+#define SBE_2T3E3_LIU_VAL_RECEIVE_CLOCK_OUTPUT_2		0x04
+#define SBE_2T3E3_LIU_VAL_INVERT_RECEIVE_CLOCK_2		0x02
+#define SBE_2T3E3_LIU_VAL_INVERT_RECEIVE_CLOCK_1		0x01
+
+/* REG4 */
+#define SBE_2T3E3_LIU_VAL_T3_MODE_SELECT			0x00
+#define SBE_2T3E3_LIU_VAL_E3_MODE_SELECT			0x04
+#define SBE_2T3E3_LIU_VAL_LOCAL_LOOPBACK			0x02
+#define SBE_2T3E3_LIU_VAL_REMOTE_LOOPBACK			0x01
+#define SBE_2T3E3_LIU_VAL_LOOPBACK_OFF				0x00
+#define SBE_2T3E3_LIU_VAL_LOOPBACK_REMOTE			0x01
+#define SBE_2T3E3_LIU_VAL_LOOPBACK_ANALOG			0x02
+#define SBE_2T3E3_LIU_VAL_LOOPBACK_DIGITAL			0x03
+
+/**********************************************************************
+ *
+ * descriptor list and data buffer
+ *
+ **********************************************************************/
+typedef struct {
+	u32 rdes0;
+	u32 rdes1;
+	u32 rdes2;
+	u32 rdes3;
+} t3e3_rx_desc_t;
+
+#define SBE_2T3E3_RX_DESC_RING_SIZE			64
+
+/* RDES0 */
+#define SBE_2T3E3_RX_DESC_21143_OWN			0X80000000
+#define SBE_2T3E3_RX_DESC_FRAME_LENGTH			0x3fff0000
+#define SBE_2T3E3_RX_DESC_FRAME_LENGTH_SHIFT		16
+#define SBE_2T3E3_RX_DESC_ERROR_SUMMARY			0x00008000
+#define SBE_2T3E3_RX_DESC_DESC_ERROR			0x00004000
+#define SBE_2T3E3_RX_DESC_DATA_TYPE			0x00003000
+#define SBE_2T3E3_RX_DESC_RUNT_FRAME			0x00000800
+#define SBE_2T3E3_RX_DESC_FIRST_DESC			0x00000200
+#define SBE_2T3E3_RX_DESC_LAST_DESC			0x00000100
+#define SBE_2T3E3_RX_DESC_FRAME_TOO_LONG		0x00000080
+#define SBE_2T3E3_RX_DESC_COLLISION_SEEN		0x00000040
+#define SBE_2T3E3_RX_DESC_FRAME_TYPE			0x00000020
+#define SBE_2T3E3_RX_DESC_RECEIVE_WATCHDOG		0x00000010
+#define SBE_2T3E3_RX_DESC_MII_ERROR			0x00000008
+#define SBE_2T3E3_RX_DESC_DRIBBLING_BIT			0x00000004
+#define SBE_2T3E3_RX_DESC_CRC_ERROR			0x00000002
+
+/* RDES1 */
+#define SBE_2T3E3_RX_DESC_END_OF_RING			0x02000000
+#define SBE_2T3E3_RX_DESC_SECOND_ADDRESS_CHAINED	0x01000000
+#define SBE_2T3E3_RX_DESC_BUFFER_2_SIZE			0x003ff800
+#define SBE_2T3E3_RX_DESC_BUFFER_1_SIZE			0x000007ff
+
+/*********************/
+
+typedef struct {
+	u32 tdes0;
+	u32 tdes1;
+	u32 tdes2;
+	u32 tdes3;
+} t3e3_tx_desc_t;
+
+#define SBE_2T3E3_TX_DESC_RING_SIZE			256
+
+/* TDES0 */
+#define SBE_2T3E3_TX_DESC_21143_OWN			0x80000000
+#define SBE_2T3E3_TX_DESC_ERROR_SUMMARY			0x00008000
+#define SBE_2T3E3_TX_DESC_TRANSMIT_JABBER_TIMEOUT	0x00004000
+#define SBE_2T3E3_TX_DESC_LOSS_OF_CARRIER		0x00000800
+#define SBE_2T3E3_TX_DESC_NO_CARRIER			0x00000400
+#define SBE_2T3E3_TX_DESC_LINK_FAIL_REPORT		0x00000004
+#define SBE_2T3E3_TX_DESC_UNDERFLOW_ERROR		0x00000002
+#define SBE_2T3E3_TX_DESC_DEFFERED			0x00000001
+
+/* TDES1 */
+#define SBE_2T3E3_TX_DESC_INTERRUPT_ON_COMPLETION	0x80000000
+#define SBE_2T3E3_TX_DESC_LAST_SEGMENT			0x40000000
+#define SBE_2T3E3_TX_DESC_FIRST_SEGMENT			0x20000000
+#define SBE_2T3E3_TX_DESC_CRC_DISABLE			0x04000000
+#define SBE_2T3E3_TX_DESC_END_OF_RING			0x02000000
+#define SBE_2T3E3_TX_DESC_SECOND_ADDRESS_CHAINED	0x01000000
+#define SBE_2T3E3_TX_DESC_DISABLE_PADDING		0x00800000
+#define SBE_2T3E3_TX_DESC_BUFFER_2_SIZE			0x003ff800
+#define SBE_2T3E3_TX_DESC_BUFFER_1_SIZE			0x000007ff
+
+
+#define SBE_2T3E3_MTU					1600
+#define SBE_2T3E3_CRC16_LENGTH				2
+#define SBE_2T3E3_CRC32_LENGTH				4
+
+#define MCLBYTES (SBE_2T3E3_MTU + 128)
+
+struct channel {
+	struct pci_dev *pdev;
+	struct net_device *dev;
+	struct card *card;
+	unsigned long addr;	/* DECchip */
+
+	int leds;
+
+	/* pci specific */
+	struct {
+		u32 slot;           /* should be 0 or 1 */
+		u32 command;
+		u8 cache_size;
+	} h;
+
+	/* statistics */
+	t3e3_stats_t s;
+
+	/* running */
+	struct {
+		u32 flags;
+	} r;
+
+	/* parameters */
+	t3e3_param_t p;
+
+	u32 liu_regs[SBE_2T3E3_LIU_REG_MAX];	   /* LIU registers */
+	u32 framer_regs[SBE_2T3E3_FRAMER_REG_MAX]; /* Framer registers */
+
+	/* Ethernet Controller */
+	struct {
+		u_int16_t card_serial_number[3];
+
+		u32 reg[SBE_2T3E3_21143_REG_MAX]; /* registers i.e. CSR */
+
+		u32 interrupt_enable_mask;
+
+		/* receive chain/ring */
+		t3e3_rx_desc_t *rx_ring;
+		struct sk_buff *rx_data[SBE_2T3E3_RX_DESC_RING_SIZE];
+		u32 rx_ring_current_read;
+
+		/* transmit chain/ring */
+		t3e3_tx_desc_t *tx_ring;
+		struct sk_buff *tx_data[SBE_2T3E3_TX_DESC_RING_SIZE];
+		u32 tx_ring_current_read;
+		u32 tx_ring_current_write;
+		int tx_full;
+		int tx_free_cnt;
+		spinlock_t tx_lock;
+	} ether;
+
+	int32_t interrupt_active;
+	int32_t rcv_count;
+};
+
+struct card {
+	spinlock_t bootrom_lock;
+	unsigned long bootrom_addr;
+	struct timer_list timer; /* for updating LEDs */
+	struct channel channels[0];
+};
+
+#define SBE_2T3E3_FLAG_NETWORK_UP		0x00000001
+#define SBE_2T3E3_FLAG_NO_ERROR_MESSAGES	0x00000002
+
+extern const u32 cpld_reg_map[][2];
+extern const u32 cpld_val_map[][2];
+extern const u32 t3e3_framer_reg_map[];
+extern const u32 t3e3_liu_reg_map[];
+
+void t3e3_init(struct channel *);
+void t3e3_if_up(struct channel *);
+void t3e3_if_down(struct channel *);
+int t3e3_if_start_xmit(struct sk_buff *skb, struct net_device *dev);
+void t3e3_if_config(struct channel *, u32, char *,
+		    t3e3_resp_t *, int *);
+void t3e3_set_frame_type(struct channel *, u32);
+u32 t3e3_eeprom_read_word(struct channel *, u32);
+void t3e3_read_card_serial_number(struct channel *);
+
+/* interrupt handlers */
+irqreturn_t t3e3_intr(int irq, void *dev_instance);
+void dc_intr(struct channel *);
+void dc_intr_rx(struct channel *);
+void dc_intr_tx(struct channel *);
+void dc_intr_tx_underflow(struct channel *);
+void exar7250_intr(struct channel *);
+void exar7250_E3_intr(struct channel *, u32);
+void exar7250_T3_intr(struct channel *, u32);
+
+/* Ethernet controller */
+u32 bootrom_read(struct channel *, u32);
+void bootrom_write(struct channel *, u32, u32);
+void dc_init(struct channel *);
+void dc_start(struct channel *);
+void dc_stop(struct channel *);
+void dc_start_intr(struct channel *);
+void dc_stop_intr(struct channel *);
+void dc_reset(struct channel *);
+void dc_restart(struct channel *);
+void dc_receiver_onoff(struct channel *, u32);
+void dc_transmitter_onoff(struct channel *, u32);
+void dc_set_loopback(struct channel *, u32);
+u32 dc_init_descriptor_list(struct channel *);
+void dc_clear_descriptor_list(struct channel *);
+void dc_drop_descriptor_list(struct channel *);
+void dc_set_output_port(struct channel *);
+void t3e3_sc_init(struct channel *);
+
+/* CPLD */
+void cpld_init(struct channel *sc);
+u32 cpld_read(struct channel *sc, u32 reg);
+void cpld_set_crc(struct channel *, u32);
+void cpld_start_intr(struct channel *);
+void cpld_stop_intr(struct channel *);
+#if 0
+void cpld_led_onoff(struct channel *, u32, u32, u32, u32);
+#endif
+void cpld_set_clock(struct channel *sc, u32 mode);
+void cpld_set_scrambler(struct channel *, u32);
+void cpld_select_panel(struct channel *, u32);
+void cpld_set_frame_mode(struct channel *, u32);
+void cpld_set_frame_type(struct channel *, u32);
+void cpld_set_pad_count(struct channel *, u32);
+void cpld_set_fractional_mode(struct channel *, u32, u32, u32);
+void cpld_LOS_update(struct channel *);
+
+/* Framer */
+extern u32 exar7250_read(struct channel *, u32);
+extern void exar7250_write(struct channel *, u32, u32);
+void exar7250_init(struct channel *);
+void exar7250_start_intr(struct channel *, u32);
+void exar7250_stop_intr(struct channel *, u32);
+void exar7250_set_frame_type(struct channel *, u32);
+void exar7250_set_loopback(struct channel *, u32);
+void exar7250_unipolar_onoff(struct channel *, u32);
+
+/* LIU */
+u32 exar7300_read(struct channel *, u32);
+void exar7300_write(struct channel *, u32, u32);
+void exar7300_init(struct channel *);
+void exar7300_line_build_out_onoff(struct channel *, u32);
+void exar7300_set_frame_type(struct channel *, u32);
+void exar7300_set_loopback(struct channel *, u32);
+void exar7300_transmit_all_ones_onoff(struct channel *, u32);
+void exar7300_receive_equalization_onoff(struct channel *, u32);
+void exar7300_unipolar_onoff(struct channel *, u32);
+
+void update_led(struct channel *, int);
+int setup_device(struct net_device *dev, struct channel *sc);
+
+static inline int has_two_ports(struct pci_dev *pdev)
+{
+	return pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_2T3E3_P0;
+}
+
+#define dev_to_priv(dev) (*(struct channel **) ((hdlc_device*)(dev) + 1))
+
+static inline u32 dc_read(unsigned long addr, u32 reg)
+{
+	return inl(addr + (reg << 3));
+}
+
+static inline void dc_write(unsigned long addr, u32 reg, u32 val)
+{
+	outl(val, addr + (reg << 3));
+}
+
+static inline void dc_set_bits(unsigned long addr, u32 reg, u32 bits)
+{
+	dc_write(addr, reg, dc_read(addr, reg) | bits);
+}
+
+static inline void dc_clear_bits(unsigned long addr, u32 reg, u32 bits)
+{
+	dc_write(addr, reg, dc_read(addr, reg) & ~bits);
+}
+
+#define CPLD_MAP_REG(reg, sc)	(cpld_reg_map[(reg)][(sc)->h.slot])
+
+static inline void cpld_write(struct channel *channel, unsigned reg, u32 val)
+{
+	unsigned long flags;
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+	bootrom_write(channel, CPLD_MAP_REG(reg, channel), val);
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+}
+
+#define exar7250_set_bit(sc, reg, bit)			\
+	exar7250_write((sc), (reg),			\
+		       exar7250_read(sc, reg) | (bit))
+
+#define exar7250_clear_bit(sc, reg, bit)		\
+	exar7250_write((sc), (reg),			\
+		       exar7250_read(sc, reg) & ~(bit))
+
+#define exar7300_set_bit(sc, reg, bit)			\
+	exar7300_write((sc), (reg),			\
+		       exar7300_read(sc, reg) | (bit))
+
+#define exar7300_clear_bit(sc, reg, bit)		\
+	exar7300_write((sc), (reg),			\
+		       exar7300_read(sc, reg) & ~(bit))
+
+
+#endif /* T3E3_H */
diff --git a/drivers/staging/sbe-2t3e3/Kconfig b/drivers/staging/sbe-2t3e3/Kconfig
new file mode 100644
index 0000000..8ec86cf
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/Kconfig
@@ -0,0 +1,13 @@
+config SBE_2T3E3
+	tristate "SBE wanPMC-2T3E3 support"
+	depends on HDLC && PCI
+	help
+	  Driver for wanPMC-2T3E3 cards by SBE Inc.
+
+	  If you have such a card, say Y here and see
+	  <http://www.kernel.org/pub/linux/utils/net/hdlc/>.
+
+	  To compile this as a module, choose M here: the
+	  module will be called sbe-2t3e3.
+
+	  If unsure, say N.
diff --git a/drivers/staging/sbe-2t3e3/Makefile b/drivers/staging/sbe-2t3e3/Makefile
new file mode 100644
index 0000000..2c7b097
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/Makefile
@@ -0,0 +1,4 @@
+obj-$(CONFIG_SBE_2T3E3) += sbe-2t3e3.o
+
+sbe-2t3e3-objs := module.o netdev.o maps.o	\
+	main.o cpld.o intr.o ctrl.o io.o dc.o exar7250.o exar7300.o
diff --git a/drivers/staging/sbe-2t3e3/cpld.c b/drivers/staging/sbe-2t3e3/cpld.c
new file mode 100644
index 0000000..6043a22
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/cpld.c
@@ -0,0 +1,366 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/delay.h>
+#include "2t3e3.h"
+#include "ctrl.h"
+
+#define bootrom_set_bit(sc, reg, bit)				\
+	bootrom_write((sc), (reg),				\
+		      bootrom_read((sc), (reg)) | (bit))
+
+#define bootrom_clear_bit(sc, reg, bit)				\
+	bootrom_write((sc), (reg),				\
+		      bootrom_read((sc), (reg)) & ~(bit))
+
+static inline void cpld_set_bit(struct channel *channel, unsigned reg, u32 bit)
+{
+	unsigned long flags;
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+	bootrom_set_bit(channel, CPLD_MAP_REG(reg, channel), bit);
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+}
+
+static inline void cpld_clear_bit(struct channel *channel, unsigned reg, u32 bit)
+{
+	unsigned long flags;
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+	bootrom_clear_bit(channel, CPLD_MAP_REG(reg, channel), bit);
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+}
+
+void cpld_init(struct channel *sc)
+{
+	u32 val;
+#if 0
+	/* reset LIU and Framer */
+	val = cpld_val_map[SBE_2T3E3_CPLD_VAL_LIU_FRAMER_RESET][sc->h.slot];
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_STATIC_RESET, val);
+	udelay(10000); /* TODO - how long? */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_STATIC_RESET, val);
+#endif
+
+	/* PCRA */
+	val = SBE_2T3E3_CPLD_VAL_CRC32 |
+		cpld_val_map[SBE_2T3E3_CPLD_VAL_LOOP_TIMING_SOURCE][sc->h.slot];
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRA, val);
+
+	/* PCRB */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRB, val);
+
+	/* PCRC */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRC, val);
+
+	/* PBWF */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PBWF, val);
+
+	/* PBWL */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PBWL, val);
+
+	/* PLTR */
+	val = SBE_2T3E3_CPLD_VAL_LCV_COUNTER;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PLTR, val);
+	udelay(1000);
+
+	/* PLCR */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PLCR, val);
+	udelay(1000);
+
+	/* PPFR */
+	val = 0x55;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PPFR, val);
+	/* TODO: this doesn't work!!! */
+
+	/* SERIAL_CHIP_SELECT */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT, val);
+
+	/* PICSR */
+	val = SBE_2T3E3_CPLD_VAL_DMO_SIGNAL_DETECTED |
+		SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_LOCK_DETECTED |
+		SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_DETECTED;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PICSR, val);
+
+	cpld_start_intr(sc);
+
+	udelay(1000);
+}
+
+void cpld_start_intr(struct channel *sc)
+{
+	u32 val;
+
+	/* PIER */
+	val = SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_ETHERNET_ENABLE |
+		SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_FRAMER_ENABLE;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PIER, val);
+#if 0
+	/*
+	  do you want to hang up your computer?
+	  ENABLE REST OF INTERRUPTS !!!
+	  you have been warned :).
+	*/
+#endif
+}
+
+void cpld_stop_intr(struct channel *sc)
+{
+	u32 val;
+
+	/* PIER */
+	val = 0;
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PIER, val);
+}
+
+void cpld_set_frame_mode(struct channel *sc, u32 mode)
+{
+	if (sc->p.frame_mode == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_FRAME_MODE_HDLC:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			       SBE_2T3E3_CPLD_VAL_TRANSPARENT_MODE |
+			       SBE_2T3E3_CPLD_VAL_RAW_MODE);
+		exar7250_unipolar_onoff(sc, SBE_2T3E3_OFF);
+		exar7300_unipolar_onoff(sc, SBE_2T3E3_OFF);
+		break;
+	case SBE_2T3E3_FRAME_MODE_TRANSPARENT:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			       SBE_2T3E3_CPLD_VAL_RAW_MODE);
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			     SBE_2T3E3_CPLD_VAL_TRANSPARENT_MODE);
+		exar7250_unipolar_onoff(sc, SBE_2T3E3_OFF);
+		exar7300_unipolar_onoff(sc, SBE_2T3E3_OFF);
+		break;
+	case SBE_2T3E3_FRAME_MODE_RAW:
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			     SBE_2T3E3_CPLD_VAL_RAW_MODE);
+		exar7250_unipolar_onoff(sc, SBE_2T3E3_ON);
+		exar7300_unipolar_onoff(sc, SBE_2T3E3_ON);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.frame_mode = mode;
+}
+
+/* set rate of the local clock */
+void cpld_set_frame_type(struct channel *sc, u32 type)
+{
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			     SBE_2T3E3_CPLD_VAL_LOCAL_CLOCK_E3);
+		break;
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			       SBE_2T3E3_CPLD_VAL_LOCAL_CLOCK_E3);
+		break;
+	default:
+		return;
+	}
+}
+
+void cpld_set_scrambler(struct channel *sc, u32 mode)
+{
+	if (sc->p.scrambler == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_SCRAMBLER_OFF:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRB,
+			       SBE_2T3E3_CPLD_VAL_SCRAMBLER_ENABLE);
+		break;
+	case SBE_2T3E3_SCRAMBLER_LARSCOM:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRB,
+			       SBE_2T3E3_CPLD_VAL_SCRAMBLER_TYPE);
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRB,
+			     SBE_2T3E3_CPLD_VAL_SCRAMBLER_ENABLE);
+		break;
+	case SBE_2T3E3_SCRAMBLER_ADC_KENTROX_DIGITAL:
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRB,
+			     SBE_2T3E3_CPLD_VAL_SCRAMBLER_TYPE);
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRB,
+			     SBE_2T3E3_CPLD_VAL_SCRAMBLER_ENABLE);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.scrambler = mode;
+}
+
+
+void cpld_set_crc(struct channel *sc, u32 crc)
+{
+	if (sc->p.crc == crc)
+		return;
+
+	switch (crc) {
+	case SBE_2T3E3_CRC_16:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			       SBE_2T3E3_CPLD_VAL_CRC32);
+		break;
+	case SBE_2T3E3_CRC_32:
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			     SBE_2T3E3_CPLD_VAL_CRC32);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.crc = crc;
+}
+
+
+void cpld_select_panel(struct channel *sc, u32 panel)
+{
+	if (sc->p.panel == panel)
+		return;
+	switch (panel) {
+	case SBE_2T3E3_PANEL_FRONT:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			       SBE_2T3E3_CPLD_VAL_REAR_PANEL);
+		break;
+	case SBE_2T3E3_PANEL_REAR:
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			     SBE_2T3E3_CPLD_VAL_REAR_PANEL);
+		break;
+	default:
+		return;
+	}
+
+	udelay(100);
+
+	sc->p.panel = panel;
+}
+
+
+extern void cpld_set_clock(struct channel *sc, u32 mode)
+{
+	if (sc->p.clock_source == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_TIMING_LOCAL:
+		cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			     SBE_2T3E3_CPLD_VAL_ALT);
+		break;
+	case SBE_2T3E3_TIMING_LOOP:
+		cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRA,
+			       SBE_2T3E3_CPLD_VAL_ALT);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.clock_source = mode;
+}
+
+void cpld_set_pad_count(struct channel *sc, u32 count)
+{
+	u32 val;
+
+	if (sc->p.pad_count == count)
+		return;
+
+	switch (count) {
+	case SBE_2T3E3_PAD_COUNT_1:
+		val = SBE_2T3E3_CPLD_VAL_PAD_COUNT_1;
+		break;
+	case SBE_2T3E3_PAD_COUNT_2:
+		val = SBE_2T3E3_CPLD_VAL_PAD_COUNT_2;
+		break;
+	case SBE_2T3E3_PAD_COUNT_3:
+		val = SBE_2T3E3_CPLD_VAL_PAD_COUNT_3;
+		break;
+	case SBE_2T3E3_PAD_COUNT_4:
+		val = SBE_2T3E3_CPLD_VAL_PAD_COUNT_4;
+		break;
+	default:
+		return;
+	}
+
+	cpld_clear_bit(sc, SBE_2T3E3_CPLD_REG_PCRB,
+		       SBE_2T3E3_CPLD_VAL_PAD_COUNT);
+	cpld_set_bit(sc, SBE_2T3E3_CPLD_REG_PCRB, val);
+	sc->p.pad_count = count;
+}
+
+void cpld_LOS_update(struct channel *sc)
+{
+	u_int8_t los;
+
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PICSR,
+		   SBE_2T3E3_CPLD_VAL_DMO_SIGNAL_DETECTED |
+		   SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_LOCK_DETECTED |
+		   SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_DETECTED);
+	los = cpld_read(sc, SBE_2T3E3_CPLD_REG_PICSR) &
+		SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_DETECTED;
+
+	if (los != sc->s.LOS)
+		dev_info(&sc->pdev->dev, DRV_NAME ": LOS status: %s\n",
+			 los ? "Loss of signal" : "Signal OK");
+	sc->s.LOS = los;
+}
+
+void cpld_set_fractional_mode(struct channel *sc, u32 mode,
+			      u32 start, u32 stop)
+{
+	if (mode == SBE_2T3E3_FRACTIONAL_MODE_NONE) {
+		start = 0;
+		stop = 0;
+	}
+
+	if (sc->p.fractional_mode == mode && sc->p.bandwidth_start == start &&
+	    sc->p.bandwidth_stop == stop)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_FRACTIONAL_MODE_NONE:
+		cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRC,
+			   SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_NONE);
+		break;
+	case SBE_2T3E3_FRACTIONAL_MODE_0:
+		cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRC,
+			   SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_0);
+		break;
+	case SBE_2T3E3_FRACTIONAL_MODE_1:
+		cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRC,
+			   SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_1);
+		break;
+	case SBE_2T3E3_FRACTIONAL_MODE_2:
+		cpld_write(sc, SBE_2T3E3_CPLD_REG_PCRC,
+			   SBE_2T3E3_CPLD_VAL_FRACTIONAL_MODE_2);
+		break;
+	default:
+		printk(KERN_ERR "wrong mode in set_fractional_mode\n");
+		return;
+	}
+
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PBWF, start);
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_PBWL, stop);
+
+	sc->p.fractional_mode = mode;
+	sc->p.bandwidth_start = start;
+	sc->p.bandwidth_stop = stop;
+}
diff --git a/drivers/staging/sbe-2t3e3/ctrl.c b/drivers/staging/sbe-2t3e3/ctrl.c
new file mode 100644
index 0000000..6caeed4
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/ctrl.c
@@ -0,0 +1,363 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/types.h>
+#include "2t3e3.h"
+#include "ctrl.h"
+
+void t3e3_set_frame_type(struct channel *sc, u32 mode)
+{
+	if (sc->p.frame_type == mode)
+		return;
+
+	if (sc->r.flags & SBE_2T3E3_FLAG_NETWORK_UP) {
+		dev_err(&sc->pdev->dev, DRV_NAME
+			": changing frame type during active connection\n");
+		return;
+	}
+
+	exar7300_set_frame_type(sc, mode);
+	exar7250_set_frame_type(sc, mode);
+	cpld_set_frame_type(sc, mode);
+
+	sc->p.frame_type = mode;
+}
+
+void t3e3_set_loopback(struct channel *sc, u32 mode)
+{
+	u32 tx, rx;
+
+	if (sc->p.loopback == mode)
+		return;
+
+	tx = sc->p.transmitter_on;
+	rx = sc->p.receiver_on;
+	if (tx == SBE_2T3E3_ON)
+		dc_transmitter_onoff(sc, SBE_2T3E3_OFF);
+	if (rx == SBE_2T3E3_ON)
+		dc_receiver_onoff(sc, SBE_2T3E3_OFF);
+
+	/* stop current loopback if any exists */
+	switch (sc->p.loopback) {
+	case SBE_2T3E3_LOOPBACK_NONE:
+		break;
+	case SBE_2T3E3_LOOPBACK_ETHERNET:
+		dc_set_loopback(sc, SBE_2T3E3_21143_VAL_LOOPBACK_OFF);
+		break;
+	case SBE_2T3E3_LOOPBACK_FRAMER:
+		exar7250_set_loopback(sc, SBE_2T3E3_FRAMER_VAL_LOOPBACK_OFF);
+		break;
+	case SBE_2T3E3_LOOPBACK_LIU_DIGITAL:
+	case SBE_2T3E3_LOOPBACK_LIU_ANALOG:
+	case SBE_2T3E3_LOOPBACK_LIU_REMOTE:
+		exar7300_set_loopback(sc, SBE_2T3E3_LIU_VAL_LOOPBACK_OFF);
+		break;
+	default:
+		return;
+	}
+
+	switch (mode) {
+	case SBE_2T3E3_LOOPBACK_NONE:
+		break;
+	case SBE_2T3E3_LOOPBACK_ETHERNET:
+		dc_set_loopback(sc, SBE_2T3E3_21143_VAL_LOOPBACK_INTERNAL);
+		break;
+	case SBE_2T3E3_LOOPBACK_FRAMER:
+		exar7250_set_loopback(sc, SBE_2T3E3_FRAMER_VAL_LOOPBACK_ON);
+		break;
+	case SBE_2T3E3_LOOPBACK_LIU_DIGITAL:
+		exar7300_set_loopback(sc, SBE_2T3E3_LIU_VAL_LOOPBACK_DIGITAL);
+		break;
+	case SBE_2T3E3_LOOPBACK_LIU_ANALOG:
+		exar7300_set_loopback(sc, SBE_2T3E3_LIU_VAL_LOOPBACK_ANALOG);
+		break;
+	case SBE_2T3E3_LOOPBACK_LIU_REMOTE:
+		exar7300_set_loopback(sc, SBE_2T3E3_LIU_VAL_LOOPBACK_REMOTE);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.loopback = mode;
+
+	if (tx == SBE_2T3E3_ON)
+		dc_transmitter_onoff(sc, SBE_2T3E3_ON);
+	if (rx == SBE_2T3E3_ON)
+		dc_receiver_onoff(sc, SBE_2T3E3_ON);
+}
+
+
+void t3e3_reg_read(struct channel *sc, u32 *reg, u32 *val)
+{
+	u32 i;
+
+	*val = 0;
+
+	switch (reg[0]) {
+	case SBE_2T3E3_CHIP_21143:
+		if (!(reg[1] & 7))
+			*val = dc_read(sc->addr, reg[1] / 8);
+		break;
+	case SBE_2T3E3_CHIP_CPLD:
+		for (i = 0; i < SBE_2T3E3_CPLD_REG_MAX; i++)
+			if (cpld_reg_map[i][sc->h.slot] == reg[1]) {
+				*val = cpld_read(sc, i);
+				break;
+			}
+		break;
+	case SBE_2T3E3_CHIP_FRAMER:
+		for (i = 0; i < SBE_2T3E3_FRAMER_REG_MAX; i++)
+			if (t3e3_framer_reg_map[i] == reg[1]) {
+				*val = exar7250_read(sc, i);
+				break;
+			}
+		break;
+	case SBE_2T3E3_CHIP_LIU:
+		for (i = 0; i < SBE_2T3E3_LIU_REG_MAX; i++)
+			if (t3e3_liu_reg_map[i] == reg[1]) {
+				*val = exar7300_read(sc, i);
+				break;
+			}
+		break;
+	default:
+		break;
+	}
+}
+
+void t3e3_reg_write(struct channel *sc, u32 *reg)
+{
+	u32 i;
+
+	switch (reg[0]) {
+	case SBE_2T3E3_CHIP_21143:
+		dc_write(sc->addr, reg[1], reg[2]);
+		break;
+	case SBE_2T3E3_CHIP_CPLD:
+		for (i = 0; i < SBE_2T3E3_CPLD_REG_MAX; i++)
+			if (cpld_reg_map[i][sc->h.slot] == reg[1]) {
+				cpld_write(sc, i, reg[2]);
+				break;
+			}
+		break;
+	case SBE_2T3E3_CHIP_FRAMER:
+		for (i = 0; i < SBE_2T3E3_FRAMER_REG_MAX; i++)
+			if (t3e3_framer_reg_map[i] == reg[1]) {
+				exar7250_write(sc, i, reg[2]);
+				break;
+			}
+		break;
+	case SBE_2T3E3_CHIP_LIU:
+		for (i = 0; i < SBE_2T3E3_LIU_REG_MAX; i++)
+			if (t3e3_liu_reg_map[i] == reg[1]) {
+				exar7300_write(sc, i, reg[2]);
+				break;
+			}
+		break;
+	}
+}
+
+void t3e3_port_get(struct channel *sc, t3e3_param_t *param)
+{
+	memcpy(param, &(sc->p), sizeof(t3e3_param_t));
+}
+
+void t3e3_port_set(struct channel *sc, t3e3_param_t *param)
+{
+	if (param->frame_mode != 0xff)
+		cpld_set_frame_mode(sc, param->frame_mode);
+
+	if (param->fractional_mode != 0xff)
+		cpld_set_fractional_mode(sc, param->fractional_mode,
+					 param->bandwidth_start,
+					 param->bandwidth_stop);
+
+	if (param->pad_count != 0xff)
+		cpld_set_pad_count(sc, param->pad_count);
+
+	if (param->crc != 0xff)
+		cpld_set_crc(sc, param->crc);
+
+	if (param->receiver_on != 0xff)
+		dc_receiver_onoff(sc, param->receiver_on);
+
+	if (param->transmitter_on != 0xff)
+		dc_transmitter_onoff(sc, param->transmitter_on);
+
+	if (param->frame_type != 0xff)
+		t3e3_set_frame_type(sc, param->frame_type);
+
+	if (param->panel != 0xff)
+		cpld_select_panel(sc, param->panel);
+
+	if (param->line_build_out != 0xff)
+		exar7300_line_build_out_onoff(sc, param->line_build_out);
+
+	if (param->receive_equalization != 0xff)
+		exar7300_receive_equalization_onoff(sc, param->receive_equalization);
+
+	if (param->transmit_all_ones != 0xff)
+		exar7300_transmit_all_ones_onoff(sc, param->transmit_all_ones);
+
+	if (param->loopback != 0xff)
+		t3e3_set_loopback(sc, param->loopback);
+
+	if (param->clock_source != 0xff)
+		cpld_set_clock(sc, param->clock_source);
+
+	if (param->scrambler != 0xff)
+		cpld_set_scrambler(sc, param->scrambler);
+}
+
+void t3e3_port_get_stats(struct channel *sc,
+			 t3e3_stats_t *stats)
+{
+	u32 result;
+
+	sc->s.LOC = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL)
+		& SBE_2T3E3_FRAMER_VAL_LOSS_OF_CLOCK_STATUS ? 1 : 0;
+
+	switch (sc->p.frame_type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_2);
+		sc->s.LOF = result & SBE_2T3E3_FRAMER_VAL_E3_RX_LOF ? 1 : 0;
+		sc->s.OOF = result & SBE_2T3E3_FRAMER_VAL_E3_RX_OOF ? 1 : 0;
+#if 0
+		sc->s.LOS = result & SBE_2T3E3_FRAMER_VAL_E3_RX_LOS ? 1 : 0;
+#else
+		cpld_LOS_update(sc);
+#endif
+		sc->s.AIS = result & SBE_2T3E3_FRAMER_VAL_E3_RX_AIS ? 1 : 0;
+		sc->s.FERF = result & SBE_2T3E3_FRAMER_VAL_E3_RX_FERF ? 1 : 0;
+		break;
+
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_CONFIGURATION_STATUS);
+		sc->s.AIS = result & SBE_2T3E3_FRAMER_VAL_T3_RX_AIS ? 1 : 0;
+#if 0
+		sc->s.LOS = result & SBE_2T3E3_FRAMER_VAL_T3_RX_LOS ? 1 : 0;
+#else
+		cpld_LOS_update(sc);
+#endif
+		sc->s.IDLE = result & SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE ? 1 : 0;
+		sc->s.OOF = result & SBE_2T3E3_FRAMER_VAL_T3_RX_OOF ? 1 : 0;
+
+		result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_STATUS);
+		sc->s.FERF = result & SBE_2T3E3_FRAMER_VAL_T3_RX_FERF ? 1 : 0;
+		sc->s.AIC = result & SBE_2T3E3_FRAMER_VAL_T3_RX_AIC ? 1 : 0;
+		sc->s.FEBE_code = result & SBE_2T3E3_FRAMER_VAL_T3_RX_FEBE;
+
+		sc->s.FEAC = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC);
+		break;
+
+	default:
+		break;
+	}
+
+	result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_LCV_EVENT_COUNT_MSB) << 8;
+	result += exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_HOLDING_REGISTER);
+	sc->s.LCV += result;
+
+	result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_FRAMING_BIT_ERROR_EVENT_COUNT_MSB) << 8;
+	result += exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_HOLDING_REGISTER);
+	sc->s.FRAMING_BIT += result;
+
+	result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_PARITY_ERROR_EVENT_COUNT_MSB) << 8;
+	result += exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_HOLDING_REGISTER);
+	sc->s.PARITY_ERROR += result;
+
+	result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_FEBE_EVENT_COUNT_MSB) << 8;
+	result += exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_HOLDING_REGISTER);
+	sc->s.FEBE_count += result;
+
+	result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_CP_BIT_ERROR_EVENT_COUNT_MSB) << 8;
+	result += exar7250_read(sc, SBE_2T3E3_FRAMER_REG_PMON_HOLDING_REGISTER);
+	sc->s.CP_BIT += result;
+
+	memcpy(stats, &(sc->s), sizeof(t3e3_stats_t));
+}
+
+void t3e3_port_del_stats(struct channel *sc)
+{
+	memset(&(sc->s), 0, sizeof(t3e3_stats_t));
+}
+
+void t3e3_if_config(struct channel *sc, u32 cmd, char *set,
+		    t3e3_resp_t *ret, int *rlen)
+{
+	t3e3_param_t *param = (t3e3_param_t *)set;
+	u32 *data = (u32 *)set;
+
+	/* turn off all interrupt */
+	/* cpld_stop_intr(sc); */
+
+	switch (cmd) {
+	case SBE_2T3E3_PORT_GET:
+		t3e3_port_get(sc, &(ret->u.param));
+		*rlen = sizeof(ret->u.param);
+		break;
+	case SBE_2T3E3_PORT_SET:
+		t3e3_port_set(sc, param);
+		*rlen = 0;
+		break;
+	case SBE_2T3E3_PORT_GET_STATS:
+		t3e3_port_get_stats(sc, &(ret->u.stats));
+		*rlen = sizeof(ret->u.stats);
+		break;
+	case SBE_2T3E3_PORT_DEL_STATS:
+		t3e3_port_del_stats(sc);
+		*rlen = 0;
+		break;
+	case SBE_2T3E3_PORT_READ_REGS:
+		t3e3_reg_read(sc, data, &(ret->u.data));
+		*rlen = sizeof(ret->u.data);
+		break;
+	case SBE_2T3E3_PORT_WRITE_REGS:
+#if 0
+		printk(KERN_DEBUG "SBE_2T3E3_PORT_WRITE_REGS, 0x%x, 0x%x, 0x%x\n",
+		       ((int*)data)[0], ((int*)data)[1], ((int*)data)[2]);
+#endif
+		t3e3_reg_write(sc, data);
+		*rlen = 0;
+		break;
+	case SBE_2T3E3_LOG_LEVEL:
+		*rlen = 0;
+		break;
+	default:
+		*rlen = 0;
+		break;
+	}
+
+	/* turn on interrupt */
+	/* cpld_start_intr(sc); */
+}
+
+void t3e3_sc_init(struct channel *sc)
+{
+	memset(sc, 0, sizeof(*sc));
+
+	sc->p.frame_mode = SBE_2T3E3_FRAME_MODE_HDLC;
+	sc->p.fractional_mode = SBE_2T3E3_FRACTIONAL_MODE_NONE;
+	sc->p.crc = SBE_2T3E3_CRC_32;
+	sc->p.receiver_on = SBE_2T3E3_OFF;
+	sc->p.transmitter_on = SBE_2T3E3_OFF;
+	sc->p.frame_type = SBE_2T3E3_FRAME_TYPE_T3_CBIT;
+	sc->p.panel = SBE_2T3E3_PANEL_FRONT;
+	sc->p.line_build_out = SBE_2T3E3_OFF;
+	sc->p.receive_equalization = SBE_2T3E3_OFF;
+	sc->p.transmit_all_ones = SBE_2T3E3_OFF;
+	sc->p.loopback = SBE_2T3E3_LOOPBACK_NONE;
+	sc->p.clock_source = SBE_2T3E3_TIMING_LOCAL;
+	sc->p.scrambler = SBE_2T3E3_SCRAMBLER_OFF;
+	sc->p.pad_count = SBE_2T3E3_PAD_COUNT_1;
+}
diff --git a/drivers/staging/sbe-2t3e3/ctrl.h b/drivers/staging/sbe-2t3e3/ctrl.h
new file mode 100644
index 0000000..c11a588
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/ctrl.h
@@ -0,0 +1,131 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#ifndef CTRL_H
+#define CTRL_H
+
+#define SBE_2T3E3_OFF					0
+#define SBE_2T3E3_ON					1
+
+#define SBE_2T3E3_LED_NONE				0
+#define SBE_2T3E3_LED_GREEN				1
+#define SBE_2T3E3_LED_YELLOW				2
+
+#define SBE_2T3E3_CABLE_LENGTH_LESS_THAN_255_FEET	0
+#define SBE_2T3E3_CABLE_LENGTH_GREATER_THAN_255_FEET	1
+
+#define SBE_2T3E3_CRC_16				0
+#define SBE_2T3E3_CRC_32				1
+
+#define SBE_2T3E3_PANEL_FRONT				0
+#define SBE_2T3E3_PANEL_REAR				1
+
+#define SBE_2T3E3_FRAME_MODE_HDLC			0
+#define SBE_2T3E3_FRAME_MODE_TRANSPARENT		1
+#define SBE_2T3E3_FRAME_MODE_RAW			2
+
+#define SBE_2T3E3_FRAME_TYPE_E3_G751			0
+#define SBE_2T3E3_FRAME_TYPE_E3_G832			1
+#define SBE_2T3E3_FRAME_TYPE_T3_CBIT			2
+#define SBE_2T3E3_FRAME_TYPE_T3_M13			3
+
+#define SBE_2T3E3_FRACTIONAL_MODE_NONE			0
+#define SBE_2T3E3_FRACTIONAL_MODE_0			1
+#define SBE_2T3E3_FRACTIONAL_MODE_1			2
+#define SBE_2T3E3_FRACTIONAL_MODE_2			3
+
+#define SBE_2T3E3_SCRAMBLER_OFF				0
+#define SBE_2T3E3_SCRAMBLER_LARSCOM			1
+#define SBE_2T3E3_SCRAMBLER_ADC_KENTROX_DIGITAL		2
+
+#define SBE_2T3E3_TIMING_LOCAL				0
+#define SBE_2T3E3_TIMING_LOOP				1
+
+#define SBE_2T3E3_LOOPBACK_NONE				0
+#define SBE_2T3E3_LOOPBACK_ETHERNET			1
+#define SBE_2T3E3_LOOPBACK_FRAMER			2
+#define SBE_2T3E3_LOOPBACK_LIU_DIGITAL			3
+#define SBE_2T3E3_LOOPBACK_LIU_ANALOG			4
+#define SBE_2T3E3_LOOPBACK_LIU_REMOTE			5
+
+#define SBE_2T3E3_PAD_COUNT_1				1
+#define SBE_2T3E3_PAD_COUNT_2				2
+#define SBE_2T3E3_PAD_COUNT_3				3
+#define SBE_2T3E3_PAD_COUNT_4				4
+
+#define SBE_2T3E3_CHIP_21143				0
+#define SBE_2T3E3_CHIP_CPLD				1
+#define SBE_2T3E3_CHIP_FRAMER				2
+#define SBE_2T3E3_CHIP_LIU				3
+
+#define SBE_2T3E3_LOG_LEVEL_NONE			0
+#define SBE_2T3E3_LOG_LEVEL_ERROR			1
+#define SBE_2T3E3_LOG_LEVEL_WARNING			2
+#define SBE_2T3E3_LOG_LEVEL_INFO			3
+
+/* commands */
+#define SBE_2T3E3_PORT_GET				0
+#define SBE_2T3E3_PORT_SET				1
+#define SBE_2T3E3_PORT_GET_STATS			2
+#define SBE_2T3E3_PORT_DEL_STATS			3
+#define SBE_2T3E3_PORT_READ_REGS			4
+#define SBE_2T3E3_LOG_LEVEL				5
+#define SBE_2T3E3_PORT_WRITE_REGS			6
+
+#define NG_SBE_2T3E3_NODE_TYPE  "sbe2T3E3"
+#define NG_SBE_2T3E3_COOKIE     0x03800891
+
+typedef struct t3e3_param {
+	u_int8_t frame_mode;		/* FRAME_MODE_* */
+	u_int8_t crc;			/* CRC_* */
+	u_int8_t receiver_on;		/* ON/OFF */
+	u_int8_t transmitter_on;	/* ON/OFF */
+	u_int8_t frame_type;		/* FRAME_TYPE_* */
+	u_int8_t panel;			/* PANEL_* */
+	u_int8_t line_build_out;	/* ON/OFF */
+	u_int8_t receive_equalization;	/* ON/OFF */
+	u_int8_t transmit_all_ones;	/* ON/OFF */
+	u_int8_t loopback;		/* LOOPBACK_* */
+	u_int8_t clock_source;		/* TIMING_* */
+	u_int8_t scrambler;		/* SCRAMBLER_* */
+	u_int8_t pad_count;		/* PAD_COUNT_* */
+	u_int8_t log_level;		/* LOG_LEVEL_* - unused */
+	u_int8_t fractional_mode;	/* FRACTIONAL_MODE_* */
+	u_int8_t bandwidth_start;	/* 0-255 */
+	u_int8_t bandwidth_stop;	/* 0-255 */
+} t3e3_param_t;
+
+typedef struct t3e3_stats {
+	u_int64_t in_bytes;
+	u32 in_packets, in_dropped;
+	u32 in_errors, in_error_desc, in_error_coll, in_error_drib,
+		in_error_crc, in_error_mii;
+	u_int64_t out_bytes;
+	u32 out_packets, out_dropped;
+	u32 out_errors, out_error_jab, out_error_lost_carr,
+		out_error_no_carr, out_error_link_fail, out_error_underflow,
+		out_error_dereferred;
+	u_int8_t LOC, LOF, OOF, LOS, AIS, FERF, IDLE, AIC, FEAC;
+	u_int16_t FEBE_code;
+	u32 LCV, FRAMING_BIT, PARITY_ERROR, FEBE_count, CP_BIT;
+} t3e3_stats_t;
+
+
+typedef struct t3e3_resp {
+	union {
+		t3e3_param_t param;
+		t3e3_stats_t stats;
+		u32 data;
+	} u;
+} t3e3_resp_t;
+
+#endif /* CTRL_H */
diff --git a/drivers/staging/sbe-2t3e3/dc.c b/drivers/staging/sbe-2t3e3/dc.c
new file mode 100644
index 0000000..c020546
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/dc.c
@@ -0,0 +1,507 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/netdevice.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/io.h>
+#include "2t3e3.h"
+#include "ctrl.h"
+
+void dc_init(struct channel *sc)
+{
+	u32 val;
+
+	dc_stop(sc);
+	/*dc_reset(sc);*/ /* do not want to reset here */
+
+	/*
+	 * BUS_MODE (CSR0)
+	 */
+	val = SBE_2T3E3_21143_VAL_READ_LINE_ENABLE |
+		SBE_2T3E3_21143_VAL_READ_MULTIPLE_ENABLE |
+		SBE_2T3E3_21143_VAL_TRANSMIT_AUTOMATIC_POLLING_200us |
+		SBE_2T3E3_21143_VAL_BUS_ARBITRATION_RR;
+
+	if (sc->h.command & 16)
+		val |= SBE_2T3E3_21143_VAL_WRITE_AND_INVALIDATE_ENABLE;
+
+	switch (sc->h.cache_size) {
+	case 32:
+		val |= SBE_2T3E3_21143_VAL_CACHE_ALIGNMENT_32;
+		break;
+	case 16:
+		val |= SBE_2T3E3_21143_VAL_CACHE_ALIGNMENT_16;
+		break;
+	case 8:
+		val |= SBE_2T3E3_21143_VAL_CACHE_ALIGNMENT_8;
+		break;
+	default:
+		break;
+	}
+
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_BUS_MODE, val);
+
+	/* OPERATION_MODE (CSR6) */
+	val = SBE_2T3E3_21143_VAL_RECEIVE_ALL |
+		SBE_2T3E3_21143_VAL_MUST_BE_ONE |
+		SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_1 |
+		SBE_2T3E3_21143_VAL_LOOPBACK_OFF |
+		SBE_2T3E3_21143_VAL_PASS_ALL_MULTICAST |
+		SBE_2T3E3_21143_VAL_PROMISCUOUS_MODE |
+		SBE_2T3E3_21143_VAL_PASS_BAD_FRAMES;
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE, val);
+	if (sc->p.loopback == SBE_2T3E3_LOOPBACK_ETHERNET)
+		sc->p.loopback = SBE_2T3E3_LOOPBACK_NONE;
+
+#if 0 /* No need to clear this register - and it may be in use */
+	/*
+	 * BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT (CSR9)
+	 */
+	val = 0;
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT, val);
+#endif
+
+	/*
+	 * GENERAL_PURPOSE_TIMER_AND_INTERRUPT_MITIGATION_CONTROL (CSR11)
+	 */
+	val = SBE_2T3E3_21143_VAL_CYCLE_SIZE |
+		SBE_2T3E3_21143_VAL_TRANSMIT_TIMER |
+		SBE_2T3E3_21143_VAL_NUMBER_OF_TRANSMIT_PACKETS |
+		SBE_2T3E3_21143_VAL_RECEIVE_TIMER |
+		SBE_2T3E3_21143_VAL_NUMBER_OF_RECEIVE_PACKETS;
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_GENERAL_PURPOSE_TIMER_AND_INTERRUPT_MITIGATION_CONTROL, val);
+
+	/* prepare descriptors and data for receive and transmit procecsses */
+	if (dc_init_descriptor_list(sc) != 0)
+		return;
+
+	/* clear ethernet interrupts status */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_STATUS, 0xFFFFFFFF);
+
+	/* SIA mode registers */
+	dc_set_output_port(sc);
+}
+
+void dc_start(struct channel *sc)
+{
+	u32 val;
+
+	if (!(sc->r.flags & SBE_2T3E3_FLAG_NETWORK_UP))
+		return;
+
+	dc_init(sc);
+
+	/* get actual LOS and OOF status */
+	switch (sc->p.frame_type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_2);
+		dev_dbg(&sc->pdev->dev, "Start Framer Rx Status = %02X\n", val);
+		sc->s.OOF = val & SBE_2T3E3_FRAMER_VAL_E3_RX_OOF ? 1 : 0;
+		break;
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_CONFIGURATION_STATUS);
+		dev_dbg(&sc->pdev->dev, "Start Framer Rx Status = %02X\n", val);
+		sc->s.OOF = val & SBE_2T3E3_FRAMER_VAL_T3_RX_OOF ? 1 : 0;
+		break;
+	default:
+		break;
+	}
+	cpld_LOS_update(sc);
+
+	/* start receive and transmit processes */
+	dc_transmitter_onoff(sc, SBE_2T3E3_ON);
+	dc_receiver_onoff(sc, SBE_2T3E3_ON);
+
+	/* start interrupts */
+	dc_start_intr(sc);
+}
+
+#define MAX_INT_WAIT_CNT	12000
+void dc_stop(struct channel *sc)
+{
+	int wcnt;
+
+	/* stop receive and transmit processes */
+	dc_receiver_onoff(sc, SBE_2T3E3_OFF);
+	dc_transmitter_onoff(sc, SBE_2T3E3_OFF);
+
+	/* turn off ethernet interrupts */
+	dc_stop_intr(sc);
+
+	/* wait to ensure the interrupts have been completed */
+	for (wcnt = 0; wcnt < MAX_INT_WAIT_CNT; wcnt++) {
+		udelay(5);
+		if (!sc->interrupt_active)
+			break;
+	}
+	if (wcnt >= MAX_INT_WAIT_CNT)
+		dev_warn(&sc->pdev->dev, DRV_NAME
+			 ": Interrupt Active too long\n");
+
+	/* clear all receive/transmit data */
+	dc_drop_descriptor_list(sc);
+}
+
+void dc_start_intr(struct channel *sc)
+{
+	if (sc->p.loopback == SBE_2T3E3_LOOPBACK_NONE && sc->s.OOF)
+		return;
+
+	if (sc->p.receiver_on || sc->p.transmitter_on) {
+		if (!sc->ether.interrupt_enable_mask)
+			dc_write(sc->addr, SBE_2T3E3_21143_REG_STATUS, 0xFFFFFFFF);
+
+		sc->ether.interrupt_enable_mask =
+			SBE_2T3E3_21143_VAL_NORMAL_INTERRUPT_SUMMARY_ENABLE |
+			SBE_2T3E3_21143_VAL_ABNORMAL_INTERRUPT_SUMMARY_ENABLE |
+			SBE_2T3E3_21143_VAL_RECEIVE_STOPPED_ENABLE |
+			SBE_2T3E3_21143_VAL_RECEIVE_BUFFER_UNAVAILABLE_ENABLE |
+			SBE_2T3E3_21143_VAL_RECEIVE_INTERRUPT_ENABLE |
+			SBE_2T3E3_21143_VAL_TRANSMIT_UNDERFLOW_INTERRUPT_ENABLE |
+			SBE_2T3E3_21143_VAL_TRANSMIT_BUFFER_UNAVAILABLE_ENABLE |
+			SBE_2T3E3_21143_VAL_TRANSMIT_STOPPED_ENABLE |
+			SBE_2T3E3_21143_VAL_TRANSMIT_INTERRUPT_ENABLE;
+
+		dc_write(sc->addr, SBE_2T3E3_21143_REG_INTERRUPT_ENABLE,
+			 sc->ether.interrupt_enable_mask);
+	}
+}
+
+void dc_stop_intr(struct channel *sc)
+{
+	sc->ether.interrupt_enable_mask = 0;
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_INTERRUPT_ENABLE, 0);
+}
+
+void dc_reset(struct channel *sc)
+{
+	/* turn off ethernet interrupts */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_INTERRUPT_ENABLE, 0);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_STATUS, 0xFFFFFFFF);
+
+	/* software reset */
+	dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_BUS_MODE,
+		   SBE_2T3E3_21143_VAL_SOFTWARE_RESET);
+	udelay(4); /* 50 PCI cycles < 2us */
+
+	/* clear hardware configuration */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_BUS_MODE, 0);
+
+	/* clear software configuration */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE, 0);
+
+	/* turn off SIA reset */
+	dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_SIA_CONNECTIVITY,
+		   SBE_2T3E3_21143_VAL_SIA_RESET);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_SIA_TRANSMIT_AND_RECEIVE, 0);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_SIA_AND_GENERAL_PURPOSE_PORT, 0);
+}
+
+
+void dc_receiver_onoff(struct channel *sc, u32 mode)
+{
+	u32 i, state = 0;
+
+	if (sc->p.receiver_on == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_OFF:
+		if (dc_read(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE) &
+		    SBE_2T3E3_21143_VAL_RECEIVE_START) {
+			dc_clear_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+				      SBE_2T3E3_21143_VAL_RECEIVE_START);
+
+			for (i = 0; i < 16; i++) {
+				state = dc_read(sc->addr, SBE_2T3E3_21143_REG_STATUS) &
+					SBE_2T3E3_21143_VAL_RECEIVE_PROCESS_STATE;
+				if (state == SBE_2T3E3_21143_VAL_RX_STOPPED)
+					break;
+				udelay(5);
+			}
+			if (state != SBE_2T3E3_21143_VAL_RX_STOPPED)
+				dev_warn(&sc->pdev->dev, DRV_NAME
+					 ": Rx Failed to Stop\n");
+			else
+				dev_info(&sc->pdev->dev, DRV_NAME ": Rx Off\n");
+		}
+		break;
+	case SBE_2T3E3_ON:
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			   SBE_2T3E3_21143_VAL_RECEIVE_START);
+		udelay(100);
+		dc_write(sc->addr, SBE_2T3E3_21143_REG_RECEIVE_POLL_DEMAND, 0xFFFFFFFF);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.receiver_on = mode;
+}
+
+void dc_transmitter_onoff(struct channel *sc, u32 mode)
+{
+	u32 i, state = 0;
+
+	if (sc->p.transmitter_on == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_OFF:
+		if (dc_read(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE) &
+		    SBE_2T3E3_21143_VAL_TRANSMISSION_START) {
+			dc_clear_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+				      SBE_2T3E3_21143_VAL_TRANSMISSION_START);
+
+			for (i = 0; i < 16; i++) {
+				state = dc_read(sc->addr, SBE_2T3E3_21143_REG_STATUS) &
+					SBE_2T3E3_21143_VAL_TRANSMISSION_PROCESS_STATE;
+				if (state == SBE_2T3E3_21143_VAL_TX_STOPPED)
+					break;
+				udelay(5);
+			}
+			if (state != SBE_2T3E3_21143_VAL_TX_STOPPED)
+				dev_warn(&sc->pdev->dev, DRV_NAME
+					 ": Tx Failed to Stop\n");
+		}
+		break;
+	case SBE_2T3E3_ON:
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			   SBE_2T3E3_21143_VAL_TRANSMISSION_START);
+		udelay(100);
+		dc_write(sc->addr, SBE_2T3E3_21143_REG_TRANSMIT_POLL_DEMAND, 0xFFFFFFFF);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.transmitter_on = mode;
+}
+
+
+
+void dc_set_loopback(struct channel *sc, u32 mode)
+{
+	u32 val;
+
+	switch (mode) {
+	case SBE_2T3E3_21143_VAL_LOOPBACK_OFF:
+	case SBE_2T3E3_21143_VAL_LOOPBACK_INTERNAL:
+		break;
+	default:
+		return;
+	}
+
+#if 0
+	/* restart SIA */
+	dc_clear_bits(sc->addr, SBE_2T3E3_21143_REG_SIA_CONNECTIVITY,
+		      SBE_2T3E3_21143_VAL_SIA_RESET);
+	udelay(1000);
+	dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_SIA_CONNECTIVITY,
+		    SBE_2T3E3_21143_VAL_SIA_RESET);
+#endif
+
+	/* select loopback mode */
+	val = dc_read(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE) &
+		~SBE_2T3E3_21143_VAL_OPERATING_MODE;
+	val |= mode;
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE, val);
+
+	if (mode == SBE_2T3E3_21143_VAL_LOOPBACK_OFF)
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			   SBE_2T3E3_21143_VAL_FULL_DUPLEX_MODE);
+	else
+		dc_clear_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			      SBE_2T3E3_21143_VAL_FULL_DUPLEX_MODE);
+}
+
+u32 dc_init_descriptor_list(struct channel *sc)
+{
+	u32 i, j;
+	struct sk_buff *m;
+
+	if (sc->ether.rx_ring == NULL)
+		sc->ether.rx_ring = kzalloc(SBE_2T3E3_RX_DESC_RING_SIZE *
+					    sizeof(t3e3_rx_desc_t), GFP_KERNEL);
+	if (sc->ether.rx_ring == NULL) {
+		dev_err(&sc->pdev->dev, DRV_NAME
+			": no buffer space for RX ring\n");
+		return ENOMEM;
+	}
+
+	if (sc->ether.tx_ring == NULL)
+		sc->ether.tx_ring = kzalloc(SBE_2T3E3_TX_DESC_RING_SIZE *
+					    sizeof(t3e3_tx_desc_t), GFP_KERNEL);
+	if (sc->ether.tx_ring == NULL) {
+#ifdef T3E3_USE_CONTIGMALLOC
+		t3e3_contigmemory_size = SBE_2T3E3_RX_DESC_RING_SIZE *
+			sizeof(t3e3_rx_desc_t);
+#endif
+		kfree(sc->ether.rx_ring);
+		sc->ether.rx_ring = NULL;
+		dev_err(&sc->pdev->dev, DRV_NAME
+			": no buffer space for RX ring\n");
+		return ENOMEM;
+	}
+
+
+	/*
+	 * Receive ring
+	 */
+	for (i = 0; i < SBE_2T3E3_RX_DESC_RING_SIZE; i++) {
+		sc->ether.rx_ring[i].rdes0 = SBE_2T3E3_RX_DESC_21143_OWN;
+		sc->ether.rx_ring[i].rdes1 =
+			SBE_2T3E3_RX_DESC_SECOND_ADDRESS_CHAINED | SBE_2T3E3_MTU;
+
+		if (sc->ether.rx_data[i] == NULL) {
+			if (!(m = dev_alloc_skb(MCLBYTES))) {
+				for (j = 0; j < i; j++) {
+					dev_kfree_skb_any(sc->ether.rx_data[j]);
+					sc->ether.rx_data[j] = NULL;
+				}
+#ifdef T3E3_USE_CONTIGMALLOC
+				t3e3_contigmemory_size = SBE_2T3E3_RX_DESC_RING_SIZE *
+					sizeof(t3e3_rx_desc_t);
+#endif
+				kfree(sc->ether.rx_ring);
+				sc->ether.rx_ring = NULL;
+#ifdef T3E3_USE_CONTIGMALLOC
+				t3e3_contigmemory_size = SBE_2T3E3_TX_DESC_RING_SIZE *
+					sizeof(t3e3_tx_desc_t);
+#endif
+				kfree(sc->ether.tx_ring);
+				sc->ether.tx_ring = NULL;
+				dev_err(&sc->pdev->dev, DRV_NAME
+					": token_alloc err: no buffer space for RX ring\n");
+				return ENOBUFS;
+			}
+			sc->ether.rx_data[i] = m;
+		}
+		sc->ether.rx_ring[i].rdes2 = virt_to_phys(sc->ether.rx_data[i]->data);
+
+		sc->ether.rx_ring[i].rdes3 = virt_to_phys(
+			&sc->ether.rx_ring[(i + 1) % SBE_2T3E3_RX_DESC_RING_SIZE]);
+	}
+	sc->ether.rx_ring[SBE_2T3E3_RX_DESC_RING_SIZE - 1].rdes1 |=
+		SBE_2T3E3_RX_DESC_END_OF_RING;
+	sc->ether.rx_ring_current_read = 0;
+
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_RECEIVE_LIST_BASE_ADDRESS,
+		 virt_to_phys(&sc->ether.rx_ring[0]));
+
+	/*
+	 * Transmit ring
+	 */
+	for (i = 0; i < SBE_2T3E3_TX_DESC_RING_SIZE; i++) {
+		sc->ether.tx_ring[i].tdes0 = 0;
+		sc->ether.tx_ring[i].tdes1 = SBE_2T3E3_TX_DESC_SECOND_ADDRESS_CHAINED |
+			SBE_2T3E3_TX_DESC_DISABLE_PADDING;
+
+		sc->ether.tx_ring[i].tdes2 = 0;
+		sc->ether.tx_data[i] = NULL;
+
+		sc->ether.tx_ring[i].tdes3 = virt_to_phys(
+			&sc->ether.tx_ring[(i + 1) % SBE_2T3E3_TX_DESC_RING_SIZE]);
+	}
+	sc->ether.tx_ring[SBE_2T3E3_TX_DESC_RING_SIZE - 1].tdes1 |=
+		SBE_2T3E3_TX_DESC_END_OF_RING;
+
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_TRANSMIT_LIST_BASE_ADDRESS,
+		 virt_to_phys(&sc->ether.tx_ring[0]));
+	sc->ether.tx_ring_current_read = 0;
+	sc->ether.tx_ring_current_write = 0;
+	sc->ether.tx_free_cnt = SBE_2T3E3_TX_DESC_RING_SIZE;
+	spin_lock_init(&sc->ether.tx_lock);
+
+	return 0;
+}
+
+void dc_clear_descriptor_list(struct channel *sc)
+{
+	u32 i;
+
+	/* clear CSR3 and CSR4 */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_RECEIVE_LIST_BASE_ADDRESS, 0);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_TRANSMIT_LIST_BASE_ADDRESS, 0);
+
+	/* free all data buffers on TX ring */
+	for (i = 0; i < SBE_2T3E3_TX_DESC_RING_SIZE; i++) {
+		if (sc->ether.tx_data[i] != NULL) {
+			dev_kfree_skb_any(sc->ether.tx_data[i]);
+			sc->ether.tx_data[i] = NULL;
+		}
+	}
+}
+
+void dc_drop_descriptor_list(struct channel *sc)
+{
+	u32 i;
+
+	dc_clear_descriptor_list(sc);
+
+	/* free all data buffers on RX ring */
+	for (i = 0; i < SBE_2T3E3_RX_DESC_RING_SIZE; i++) {
+		if (sc->ether.rx_data[i] != NULL) {
+			dev_kfree_skb_any(sc->ether.rx_data[i]);
+			sc->ether.rx_data[i] = NULL;
+		}
+	}
+
+	if (sc->ether.rx_ring != NULL) {
+#ifdef T3E3_USE_CONTIGMALLOC
+		t3e3_contigmemory_size = SBE_2T3E3_RX_DESC_RING_SIZE *
+			sizeof(t3e3_rx_desc_t);
+#endif
+		kfree(sc->ether.rx_ring);
+		sc->ether.rx_ring = NULL;
+	}
+
+	if (sc->ether.tx_ring != NULL) {
+#ifdef T3E3_USE_CONTIGMALLOC
+		t3e3_contigmemory_size = SBE_2T3E3_TX_DESC_RING_SIZE *
+			sizeof(t3e3_tx_desc_t);
+#endif
+		kfree(sc->ether.tx_ring);
+		sc->ether.tx_ring = NULL;
+	}
+}
+
+
+void dc_set_output_port(struct channel *sc)
+{
+	dc_clear_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+		      SBE_2T3E3_21143_VAL_PORT_SELECT);
+
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_SIA_STATUS, 0x00000301);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_SIA_CONNECTIVITY, 0);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_SIA_TRANSMIT_AND_RECEIVE, 0);
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_SIA_AND_GENERAL_PURPOSE_PORT, 0x08000011);
+
+	dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+		   SBE_2T3E3_21143_VAL_TRANSMIT_THRESHOLD_MODE_100Mbs |
+		   SBE_2T3E3_21143_VAL_HEARTBEAT_DISABLE |
+		   SBE_2T3E3_21143_VAL_PORT_SELECT |
+		   SBE_2T3E3_21143_VAL_FULL_DUPLEX_MODE);
+}
+
+void dc_restart(struct channel *sc)
+{
+	dev_warn(&sc->pdev->dev, DRV_NAME ": 21143 restart\n");
+
+	dc_stop(sc);
+	dc_reset(sc);
+	dc_init(sc);	/* stop + reset + init */
+	dc_start(sc);
+}
diff --git a/drivers/staging/sbe-2t3e3/exar7250.c b/drivers/staging/sbe-2t3e3/exar7250.c
new file mode 100644
index 0000000..809f446
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/exar7250.c
@@ -0,0 +1,217 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include "2t3e3.h"
+#include "ctrl.h"
+
+void exar7250_init(struct channel *sc)
+{
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE,
+		       SBE_2T3E3_FRAMER_VAL_T3_CBIT |
+		       SBE_2T3E3_FRAMER_VAL_INTERRUPT_ENABLE_RESET |
+		       SBE_2T3E3_FRAMER_VAL_TIMING_ASYNCH_TXINCLK);
+
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL,
+		       SBE_2T3E3_FRAMER_VAL_DISABLE_TX_LOSS_OF_CLOCK |
+		       SBE_2T3E3_FRAMER_VAL_DISABLE_RX_LOSS_OF_CLOCK |
+		       SBE_2T3E3_FRAMER_VAL_AMI_LINE_CODE |
+		       SBE_2T3E3_FRAMER_VAL_RX_LINE_CLOCK_INVERT);
+
+	exar7250_set_frame_type(sc, SBE_2T3E3_FRAME_TYPE_T3_CBIT);
+}
+
+void exar7250_set_frame_type(struct channel *sc, u32 type)
+{
+	u32 val;
+
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		break;
+	default:
+		return;
+	}
+
+	exar7250_stop_intr(sc, type);
+
+	val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE);
+	val &= ~(SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE |
+		 SBE_2T3E3_FRAMER_VAL_T3_E3_SELECT |
+		 SBE_2T3E3_FRAMER_VAL_FRAME_FORMAT_SELECT);
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+		val |= SBE_2T3E3_FRAMER_VAL_E3_G751;
+		break;
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		val |= SBE_2T3E3_FRAMER_VAL_E3_G832;
+		break;
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+		val |= SBE_2T3E3_FRAMER_VAL_T3_CBIT;
+		break;
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		val |= SBE_2T3E3_FRAMER_VAL_T3_M13;
+		break;
+	default:
+		return;
+	}
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE, val);
+	exar7250_start_intr(sc, type);
+}
+
+
+void exar7250_start_intr(struct channel *sc, u32 type)
+{
+	u32 val;
+
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_2);
+#if 0
+		sc->s.LOS = val & SBE_2T3E3_FRAMER_VAL_E3_RX_LOS ? 1 : 0;
+#else
+		cpld_LOS_update(sc);
+#endif
+		sc->s.OOF = val & SBE_2T3E3_FRAMER_VAL_E3_RX_OOF ? 1 : 0;
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_1);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_1,
+			       SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE |
+			       SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE);
+#if 0
+		/*SBE_2T3E3_FRAMER_VAL_E3_RX_COFA_INTERRUPT_ENABLE |
+		  SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE |
+		  SBE_2T3E3_FRAMER_VAL_E3_RX_LOF_INTERRUPT_ENABLE |
+		  SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE |
+		  SBE_2T3E3_FRAMER_VAL_E3_RX_AIS_INTERRUPT_ENABLE);*/
+#endif
+
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_2);
+#if 0
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_2,
+			       SBE_2T3E3_FRAMER_VAL_E3_RX_FEBE_INTERRUPT_ENABLE |
+			       SBE_2T3E3_FRAMER_VAL_E3_RX_FERF_INTERRUPT_ENABLE |
+			       SBE_2T3E3_FRAMER_VAL_E3_RX_FRAMING_BYTE_ERROR_INTERRUPT_ENABLE);
+#endif
+		break;
+
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_CONFIGURATION_STATUS);
+#if 0
+		sc->s.LOS = val & SBE_2T3E3_FRAMER_VAL_T3_RX_LOS ? 1 : 0;
+#else
+		cpld_LOS_update(sc);
+#endif
+		sc->s.OOF = val & SBE_2T3E3_FRAMER_VAL_T3_RX_OOF ? 1 : 0;
+
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_STATUS);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_ENABLE,
+			       SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE |
+			       SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE);
+#if 0
+		/* SBE_2T3E3_FRAMER_VAL_T3_RX_CP_BIT_ERROR_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_AIS_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_FERF_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_AIC_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE |
+		   SBE_2T3E3_FRAMER_VAL_T3_RX_P_BIT_INTERRUPT_ENABLE);*/
+#endif
+
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS);
+#if 0
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS,
+			       SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_REMOVE_INTERRUPT_ENABLE |
+			       SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_VALID_INTERRUPT_ENABLE);
+#endif
+
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL, 0);
+		break;
+
+	default:
+		return;
+	}
+
+	exar7250_read(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_STATUS);
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE,
+		       SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_ENABLE |
+		       SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_ENABLE);
+}
+
+
+void exar7250_stop_intr(struct channel *sc, u32 type)
+{
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE, 0);
+	exar7250_read(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_STATUS);
+
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_1, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_1);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_2, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_2);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_LAPD_CONTROL, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_LAPD_CONTROL);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_STATUS, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_STATUS);
+		break;
+
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_ENABLE, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_STATUS);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_TX_FEAC_CONFIGURATION_STATUS, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_TX_FEAC_CONFIGURATION_STATUS);
+		exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_STATUS, 0);
+		exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_STATUS);
+		break;
+	}
+}
+
+
+
+
+void exar7250_unipolar_onoff(struct channel *sc, u32 mode)
+{
+	switch (mode) {
+	case SBE_2T3E3_OFF:
+		exar7300_clear_bit(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL,
+				   SBE_2T3E3_FRAMER_VAL_UNIPOLAR);
+		break;
+	case SBE_2T3E3_ON:
+		exar7300_set_bit(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL,
+				 SBE_2T3E3_FRAMER_VAL_UNIPOLAR);
+		break;
+	}
+}
+
+void exar7250_set_loopback(struct channel *sc, u32 mode)
+{
+	switch (mode) {
+	case SBE_2T3E3_FRAMER_VAL_LOOPBACK_OFF:
+		exar7300_clear_bit(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE,
+				   SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE);
+		break;
+	case SBE_2T3E3_FRAMER_VAL_LOOPBACK_ON:
+		exar7300_set_bit(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE,
+				 SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE);
+		break;
+	}
+}
diff --git a/drivers/staging/sbe-2t3e3/exar7300.c b/drivers/staging/sbe-2t3e3/exar7300.c
new file mode 100644
index 0000000..d10d696
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/exar7300.c
@@ -0,0 +1,182 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include "2t3e3.h"
+#include "ctrl.h"
+
+void exar7300_init(struct channel *sc)
+{
+	exar7300_write(sc, SBE_2T3E3_LIU_REG_REG1, 0);
+
+	/* enable line decodeer and encoder */
+	exar7300_write(sc, SBE_2T3E3_LIU_REG_REG2, 0);
+	exar7300_write(sc, SBE_2T3E3_LIU_REG_REG3, 0);
+	exar7300_write(sc, SBE_2T3E3_LIU_REG_REG4,
+		       SBE_2T3E3_LIU_VAL_T3_MODE_SELECT |
+		       SBE_2T3E3_LIU_VAL_LOOPBACK_OFF);
+}
+
+void exar7300_set_loopback(struct channel *sc, u32 mode)
+{
+	u32 val;
+
+	switch (mode) {
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_OFF:
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_REMOTE:
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_ANALOG:
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_DIGITAL:
+		break;
+	default:
+		return;
+	}
+
+	val = exar7300_read(sc, SBE_2T3E3_LIU_REG_REG4);
+	val &= ~(SBE_2T3E3_LIU_VAL_LOCAL_LOOPBACK | SBE_2T3E3_LIU_VAL_REMOTE_LOOPBACK);
+	val |= mode;
+	exar7300_write(sc, SBE_2T3E3_LIU_REG_REG4, val);
+
+#if 0
+	/* TODO - is it necessary? idea from 2T3E3_HW_Test_code */
+	switch (mode) {
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_OFF:
+		break;
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_REMOTE:
+		exar7300_receive_equalization_onoff(sc, SBE_2T3E3_ON);
+		break;
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_ANALOG:
+		exar7300_receive_equalization_onoff(sc, SBE_2T3E3_OFF);
+		break;
+	case SBE_2T3E3_LIU_VAL_LOOPBACK_DIGITAL:
+		exar7300_receive_equalization_onoff(sc, SBE_2T3E3_ON);
+		break;
+	}
+#endif
+}
+
+void exar7300_set_frame_type(struct channel *sc, u32 type)
+{
+	u32 val;
+
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		break;
+	default:
+		return;
+	}
+
+	val = exar7300_read(sc, SBE_2T3E3_LIU_REG_REG4);
+	val &= ~(SBE_2T3E3_LIU_VAL_T3_MODE_SELECT |
+		 SBE_2T3E3_LIU_VAL_E3_MODE_SELECT);
+
+	switch (type) {
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		val |= SBE_2T3E3_LIU_VAL_T3_MODE_SELECT;
+		break;
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		val |= SBE_2T3E3_LIU_VAL_E3_MODE_SELECT;
+		break;
+	default:
+		return;
+	}
+
+	exar7300_write(sc, SBE_2T3E3_LIU_REG_REG4, val);
+}
+
+
+void exar7300_transmit_all_ones_onoff(struct channel *sc, u32 mode)
+{
+	if (sc->p.transmit_all_ones == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_ON:
+		exar7300_set_bit(sc, SBE_2T3E3_LIU_REG_REG1,
+				 SBE_2T3E3_LIU_VAL_TRANSMIT_ALL_ONES);
+		break;
+	case SBE_2T3E3_OFF:
+		exar7300_clear_bit(sc, SBE_2T3E3_LIU_REG_REG1,
+				   SBE_2T3E3_LIU_VAL_TRANSMIT_ALL_ONES);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.transmit_all_ones = mode;
+}
+
+void exar7300_receive_equalization_onoff(struct channel *sc, u32 mode)
+{
+	if (sc->p.receive_equalization == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_OFF:
+		exar7300_set_bit(sc, SBE_2T3E3_LIU_REG_REG2,
+				 SBE_2T3E3_LIU_VAL_RECEIVE_EQUALIZATION_DISABLE);
+		break;
+	case SBE_2T3E3_ON:
+		exar7300_clear_bit(sc, SBE_2T3E3_LIU_REG_REG2,
+				   SBE_2T3E3_LIU_VAL_RECEIVE_EQUALIZATION_DISABLE);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.receive_equalization = mode;
+}
+
+void exar7300_line_build_out_onoff(struct channel *sc, u32 mode)
+{
+	if (sc->p.line_build_out == mode)
+		return;
+
+	switch (mode) {
+	case SBE_2T3E3_OFF:
+		exar7300_set_bit(sc, SBE_2T3E3_LIU_REG_REG1,
+				 SBE_2T3E3_LIU_VAL_TRANSMIT_LEVEL_SELECT);
+		exar7300_receive_equalization_onoff(sc, SBE_2T3E3_OFF);
+		break;
+	case SBE_2T3E3_ON:
+		exar7300_clear_bit(sc, SBE_2T3E3_LIU_REG_REG1,
+				   SBE_2T3E3_LIU_VAL_TRANSMIT_LEVEL_SELECT);
+		exar7300_receive_equalization_onoff(sc, SBE_2T3E3_ON);
+		break;
+	default:
+		return;
+	}
+
+	sc->p.line_build_out = mode;
+}
+
+/* TODO - what about encoder in raw mode??? disable it too? */
+void exar7300_unipolar_onoff(struct channel *sc, u32 mode)
+{
+	switch (mode) {
+	case SBE_2T3E3_OFF:
+		exar7300_clear_bit(sc, SBE_2T3E3_LIU_REG_REG3,
+				   SBE_2T3E3_LIU_VAL_DECODER_DISABLE);
+		exar7300_clear_bit(sc, SBE_2T3E3_LIU_REG_REG1,
+				   SBE_2T3E3_LIU_VAL_TRANSMIT_BINARY_DATA);
+		break;
+	case SBE_2T3E3_ON:
+		exar7300_set_bit(sc, SBE_2T3E3_LIU_REG_REG3,
+				 SBE_2T3E3_LIU_VAL_DECODER_DISABLE);
+		exar7300_set_bit(sc, SBE_2T3E3_LIU_REG_REG1,
+				 SBE_2T3E3_LIU_VAL_TRANSMIT_BINARY_DATA);
+		break;
+	}
+}
diff --git a/drivers/staging/sbe-2t3e3/intr.c b/drivers/staging/sbe-2t3e3/intr.c
new file mode 100644
index 0000000..4c8922c
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/intr.c
@@ -0,0 +1,651 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/hdlc.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include "2t3e3.h"
+
+irqreturn_t t3e3_intr(int irq, void *dev_instance)
+{
+	struct channel *sc = dev_to_priv(dev_instance);
+	u32 val;
+	irqreturn_t ret = IRQ_NONE;
+
+	sc->interrupt_active = 1;
+
+	val = cpld_read(sc, SBE_2T3E3_CPLD_REG_PICSR);
+
+	if (val & SBE_2T3E3_CPLD_VAL_RECEIVE_LOSS_OF_SIGNAL_CHANGE) {
+		dev_dbg(&sc->pdev->dev,
+			"Rx LOS Chng Int r=%02x (LOS|OOF=%02x)\n",
+			val, (sc->s.LOS << 4) | sc->s.OOF);
+		cpld_LOS_update(sc);
+		ret = IRQ_HANDLED;
+	}
+
+	if (val & SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_ETHERNET_ASSERTED) {
+		dc_intr(sc);
+		ret = IRQ_HANDLED;
+	}
+
+	if (val & SBE_2T3E3_CPLD_VAL_INTERRUPT_FROM_FRAMER_ASSERTED) {
+		exar7250_intr(sc);
+		ret = IRQ_HANDLED;
+	}
+
+	/*
+	  we don't care about other interrupt sources (DMO, LOS, LCV) because
+	  they are handled by Framer too
+	*/
+
+	sc->interrupt_active = 0;
+	return ret;
+}
+
+void dc_intr(struct channel *sc)
+{
+	u32 val;
+
+	/* disable ethernet interrupts */
+	/* grrr this clears interrupt summary bits !!! */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_INTERRUPT_ENABLE, 0);
+
+	while ((val = dc_read(sc->addr, SBE_2T3E3_21143_REG_STATUS)) &
+	       (SBE_2T3E3_21143_VAL_RECEIVE_PROCESS_STOPPED |
+		SBE_2T3E3_21143_VAL_RECEIVE_BUFFER_UNAVAILABLE |
+		SBE_2T3E3_21143_VAL_RECEIVE_INTERRUPT |
+		SBE_2T3E3_21143_VAL_TRANSMIT_UNDERFLOW |
+		SBE_2T3E3_21143_VAL_TRANSMIT_BUFFER_UNAVAILABLE |
+		SBE_2T3E3_21143_VAL_TRANSMIT_PROCESS_STOPPED |
+		SBE_2T3E3_21143_VAL_TRANSMIT_INTERRUPT)) {
+		dc_write(sc->addr, SBE_2T3E3_21143_REG_STATUS, val);
+
+		dev_dbg(&sc->pdev->dev, DRV_NAME
+			": Ethernet Controller Interrupt! (CSR5 = %08X)\n",
+			val);
+
+		if (val & (SBE_2T3E3_21143_VAL_RECEIVE_INTERRUPT |
+			   SBE_2T3E3_21143_VAL_RECEIVE_BUFFER_UNAVAILABLE |
+			   SBE_2T3E3_21143_VAL_RECEIVE_PROCESS_STOPPED)) {
+			if (val & SBE_2T3E3_21143_VAL_RECEIVE_INTERRUPT)
+				dev_dbg(&sc->pdev->dev,
+					"Receive interrupt (LOS=%d, OOF=%d)\n",
+					sc->s.LOS, sc->s.OOF);
+			if (val & SBE_2T3E3_21143_VAL_RECEIVE_BUFFER_UNAVAILABLE)
+				dev_dbg(&sc->pdev->dev,
+					"Receive buffer unavailable\n");
+			if (val & SBE_2T3E3_21143_VAL_RECEIVE_PROCESS_STOPPED)
+				dev_dbg(&sc->pdev->dev,
+					"Receive process stopped\n");
+			dc_intr_rx(sc);
+		}
+
+		if (val & SBE_2T3E3_21143_VAL_TRANSMIT_UNDERFLOW) {
+			dev_dbg(&sc->pdev->dev, "Transmit underflow\n");
+			dc_intr_tx_underflow(sc);
+		}
+
+		if (val & (SBE_2T3E3_21143_VAL_TRANSMIT_BUFFER_UNAVAILABLE |
+			   SBE_2T3E3_21143_VAL_TRANSMIT_INTERRUPT |
+			   SBE_2T3E3_21143_VAL_TRANSMIT_PROCESS_STOPPED)) {
+			if (val & SBE_2T3E3_21143_VAL_TRANSMIT_INTERRUPT)
+				dev_dbg(&sc->pdev->dev, "Transmit interrupt\n");
+			if (val & SBE_2T3E3_21143_VAL_TRANSMIT_BUFFER_UNAVAILABLE)
+				dev_dbg(&sc->pdev->dev,
+					"Transmit buffer unavailable\n");
+			if (val & SBE_2T3E3_21143_VAL_TRANSMIT_PROCESS_STOPPED)
+				dev_dbg(&sc->pdev->dev,
+					"Transmit process stopped\n");
+			dc_intr_tx(sc);
+		}
+	}
+
+	/* enable ethernet interrupts */
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_INTERRUPT_ENABLE,
+		 sc->ether.interrupt_enable_mask);
+}
+
+void dc_intr_rx(struct channel *sc)
+{
+	u32 current_read;
+	u32 error_mask, error;
+	t3e3_rx_desc_t *current_desc;
+	struct sk_buff *m, *m2;
+	unsigned rcv_len;
+
+	sc->rcv_count++; /* for the activity LED */
+
+	current_read = sc->ether.rx_ring_current_read;
+	dev_dbg(&sc->pdev->dev, "intr_rx current_read = %d\n", current_read);
+
+	/* when ethernet loopback is set, ignore framer signals */
+	if ((sc->p.loopback != SBE_2T3E3_LOOPBACK_ETHERNET) && sc->s.OOF) {
+		while (!(sc->ether.rx_ring[current_read].rdes0 &
+			 SBE_2T3E3_RX_DESC_21143_OWN)) {
+			current_desc = &sc->ether.rx_ring[current_read];
+			current_desc->rdes1 &= SBE_2T3E3_RX_DESC_END_OF_RING |
+				SBE_2T3E3_RX_DESC_SECOND_ADDRESS_CHAINED;
+			current_desc->rdes1 |= SBE_2T3E3_MTU;
+			current_desc->rdes0 = SBE_2T3E3_RX_DESC_21143_OWN;
+			current_read = (current_read + 1) % SBE_2T3E3_RX_DESC_RING_SIZE;
+		}
+		sc->ether.rx_ring_current_read = current_read;
+		return;
+	}
+
+	while (!(sc->ether.rx_ring[current_read].rdes0 &
+		 SBE_2T3E3_RX_DESC_21143_OWN)) {
+		current_desc = &sc->ether.rx_ring[current_read];
+
+		dev_dbg(&sc->pdev->dev, "rdes0: %08X        rdes1: %08X\n",
+			current_desc->rdes0, current_desc->rdes1);
+
+		m = sc->ether.rx_data[current_read];
+		rcv_len = (current_desc->rdes0 & SBE_2T3E3_RX_DESC_FRAME_LENGTH) >>
+			SBE_2T3E3_RX_DESC_FRAME_LENGTH_SHIFT;
+
+		dev_dbg(&sc->pdev->dev, "mbuf was received (mbuf len = %d)\n",
+			rcv_len);
+
+		switch (sc->p.crc) {
+		case SBE_2T3E3_CRC_16:
+			rcv_len -= SBE_2T3E3_CRC16_LENGTH;
+			break;
+		case SBE_2T3E3_CRC_32:
+			rcv_len -= SBE_2T3E3_CRC32_LENGTH;
+			break;
+		default:
+			break;
+		}
+
+		if (current_desc->rdes0 & SBE_2T3E3_RX_DESC_LAST_DESC) {
+
+			/* TODO: is collision possible? */
+			error_mask = SBE_2T3E3_RX_DESC_DESC_ERROR |
+				SBE_2T3E3_RX_DESC_COLLISION_SEEN |
+				SBE_2T3E3_RX_DESC_DRIBBLING_BIT;
+
+			switch (sc->p.frame_mode) {
+			case SBE_2T3E3_FRAME_MODE_HDLC:
+				error_mask |= SBE_2T3E3_RX_DESC_MII_ERROR;
+				if (sc->p.crc == SBE_2T3E3_CRC_32)
+					error_mask |= SBE_2T3E3_RX_DESC_CRC_ERROR;
+				break;
+			case SBE_2T3E3_FRAME_MODE_TRANSPARENT:
+			case SBE_2T3E3_FRAME_MODE_RAW:
+				break;
+			default:
+				error_mask = 0;
+			}
+
+			if (sc->s.LOS) {
+				error_mask &= ~(SBE_2T3E3_RX_DESC_DRIBBLING_BIT ||
+						SBE_2T3E3_RX_DESC_MII_ERROR);
+			}
+
+			error = current_desc->rdes0 & error_mask;
+			if (error) {
+				sc->s.in_errors++;
+				dev_dbg(&sc->pdev->dev,
+					"error interrupt: NO_ERROR_MESSAGE = %d\n",
+					sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES ? 1 : 0);
+
+				current_desc->rdes1 &= SBE_2T3E3_RX_DESC_END_OF_RING |
+					SBE_2T3E3_RX_DESC_SECOND_ADDRESS_CHAINED;
+				current_desc->rdes1 |= SBE_2T3E3_MTU;
+				current_desc->rdes0 = SBE_2T3E3_RX_DESC_21143_OWN;
+
+				if (error & SBE_2T3E3_RX_DESC_DESC_ERROR) {
+					if (!(sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES))
+						dev_err(&sc->pdev->dev, DRV_NAME
+							": descriptor error\n");
+					sc->s.in_error_desc++;
+				}
+
+				if (error & SBE_2T3E3_RX_DESC_COLLISION_SEEN) {
+					if (!(sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES))
+						dev_err(&sc->pdev->dev, DRV_NAME
+							": collision seen\n");
+					sc->s.in_error_coll++;
+				} else {
+					if (error & SBE_2T3E3_RX_DESC_DRIBBLING_BIT) {
+						if (!(sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES))
+							dev_err(&sc->pdev->dev,
+								DRV_NAME
+								": dribbling bits error\n");
+						sc->s.in_error_drib++;
+					}
+
+					if (error & SBE_2T3E3_RX_DESC_CRC_ERROR) {
+						if (!(sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES))
+							dev_err(&sc->pdev->dev,
+								DRV_NAME
+								": crc error\n");
+						sc->s.in_error_crc++;
+					}
+				}
+
+				if (error & SBE_2T3E3_RX_DESC_MII_ERROR) {
+					if (!(sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES))
+						dev_err(&sc->pdev->dev, DRV_NAME
+							": mii error\n");
+					sc->s.in_error_mii++;
+				}
+
+				current_read = (current_read + 1) % SBE_2T3E3_RX_DESC_RING_SIZE;
+				sc->r.flags |= SBE_2T3E3_FLAG_NO_ERROR_MESSAGES;
+				continue;
+			}
+		}
+
+		current_desc->rdes1 &= SBE_2T3E3_RX_DESC_END_OF_RING |
+			SBE_2T3E3_RX_DESC_SECOND_ADDRESS_CHAINED;
+		current_desc->rdes1 |= SBE_2T3E3_MTU;
+
+		if (rcv_len > 1600) {
+			sc->s.in_errors++;
+			sc->s.in_dropped++;
+			if (!(sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES))
+				dev_err(&sc->pdev->dev, DRV_NAME
+					": oversized rx: rdes0 = %08X\n",
+					current_desc->rdes0);
+		} else {
+			m2 = dev_alloc_skb(MCLBYTES);
+			if (m2 != NULL) {
+				current_desc->rdes2 = virt_to_phys(m2->data);
+				sc->ether.rx_data[current_read] = m2;
+				sc->s.in_packets++;
+				sc->s.in_bytes += rcv_len;
+				m->dev = sc->dev;
+				skb_put(m, rcv_len);
+				skb_reset_mac_header(m);
+				m->protocol = hdlc_type_trans(m, m->dev);
+				netif_rx(m);
+
+				/* good packet was received so we will show error messages again... */
+				if (sc->r.flags & SBE_2T3E3_FLAG_NO_ERROR_MESSAGES) {
+					dev_dbg(&sc->pdev->dev,
+						"setting ERROR_MESSAGES->0\n");
+					sc->r.flags &= ~SBE_2T3E3_FLAG_NO_ERROR_MESSAGES;
+				}
+
+			} else {
+				sc->s.in_errors++;
+				sc->s.in_dropped++;
+			}
+		}
+		current_desc->rdes0 = SBE_2T3E3_RX_DESC_21143_OWN;
+		current_read = (current_read + 1) % SBE_2T3E3_RX_DESC_RING_SIZE;
+	}
+
+	sc->ether.rx_ring_current_read = current_read;
+
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_RECEIVE_POLL_DEMAND, 0xFFFFFFFF);
+}
+
+void dc_intr_tx(struct channel *sc)
+{
+	u32 current_read, current_write;
+	u32 last_segment, error;
+	t3e3_tx_desc_t *current_desc;
+
+	spin_lock(&sc->ether.tx_lock);
+
+	current_read = sc->ether.tx_ring_current_read;
+	current_write = sc->ether.tx_ring_current_write;
+
+	while (current_read != current_write) {
+		current_desc = &sc->ether.tx_ring[current_read];
+
+		if (current_desc->tdes0 & SBE_2T3E3_RX_DESC_21143_OWN)
+			break;
+
+		dev_dbg(&sc->pdev->dev,
+			"txeof: tdes0 = %08X        tdes1 = %08X\n",
+			current_desc->tdes0, current_desc->tdes1);
+
+		error = current_desc->tdes0 & (SBE_2T3E3_TX_DESC_ERROR_SUMMARY |
+					       SBE_2T3E3_TX_DESC_TRANSMIT_JABBER_TIMEOUT |
+					       SBE_2T3E3_TX_DESC_LOSS_OF_CARRIER |
+					       SBE_2T3E3_TX_DESC_NO_CARRIER |
+					       SBE_2T3E3_TX_DESC_LINK_FAIL_REPORT |
+					       SBE_2T3E3_TX_DESC_UNDERFLOW_ERROR |
+					       SBE_2T3E3_TX_DESC_DEFFERED);
+
+		last_segment = current_desc->tdes1 & SBE_2T3E3_TX_DESC_LAST_SEGMENT;
+
+		current_desc->tdes0 = 0;
+		current_desc->tdes1 &= SBE_2T3E3_TX_DESC_END_OF_RING |
+			SBE_2T3E3_TX_DESC_SECOND_ADDRESS_CHAINED;
+		current_desc->tdes2 = 0;
+		sc->ether.tx_free_cnt++;
+
+		if (last_segment != SBE_2T3E3_TX_DESC_LAST_SEGMENT) {
+			current_read = (current_read + 1) % SBE_2T3E3_TX_DESC_RING_SIZE;
+			continue;
+		}
+
+
+		if (sc->ether.tx_data[current_read]) {
+			sc->s.out_packets++;
+			sc->s.out_bytes += sc->ether.tx_data[current_read]->len;
+			dev_kfree_skb_any(sc->ether.tx_data[current_read]);
+			sc->ether.tx_data[current_read] = NULL;
+		}
+
+		if (error > 0) {
+			sc->s.out_errors++;
+
+			if (error & SBE_2T3E3_TX_DESC_TRANSMIT_JABBER_TIMEOUT) {
+				dev_err(&sc->pdev->dev, DRV_NAME
+					": transmit jabber timeout\n");
+				sc->s.out_error_jab++;
+			}
+
+			if (sc->p.loopback != SBE_2T3E3_LOOPBACK_ETHERNET) {
+				if (error & SBE_2T3E3_TX_DESC_LOSS_OF_CARRIER) {
+					dev_err(&sc->pdev->dev, DRV_NAME
+						": loss of carrier\n");
+					sc->s.out_error_lost_carr++;
+				}
+
+				if (error & SBE_2T3E3_TX_DESC_NO_CARRIER) {
+					dev_err(&sc->pdev->dev, DRV_NAME
+						": no carrier\n");
+					sc->s.out_error_no_carr++;
+				}
+			}
+
+			if (error & SBE_2T3E3_TX_DESC_LINK_FAIL_REPORT) {
+				dev_err(&sc->pdev->dev, DRV_NAME
+					": link fail report\n");
+				sc->s.out_error_link_fail++;
+			}
+
+			if (error & SBE_2T3E3_TX_DESC_UNDERFLOW_ERROR) {
+				dev_err(&sc->pdev->dev, DRV_NAME
+					": transmission underflow error\n");
+				sc->s.out_error_underflow++;
+				spin_unlock(&sc->ether.tx_lock);
+
+				dc_restart(sc);
+				return;
+			}
+
+			if (error & SBE_2T3E3_TX_DESC_DEFFERED) {
+				dev_err(&sc->pdev->dev, DRV_NAME
+					": transmission deferred\n");
+				sc->s.out_error_dereferred++;
+			}
+		}
+
+		current_read = (current_read + 1) % SBE_2T3E3_TX_DESC_RING_SIZE;
+	}
+
+	sc->ether.tx_ring_current_read = current_read;
+
+	/* Relieve flow control when the TX queue is drained at least half way */
+	if (sc->ether.tx_full &&
+	    (sc->ether.tx_free_cnt >= (SBE_2T3E3_TX_DESC_RING_SIZE / 2))) {
+		sc->ether.tx_full = 0;
+		netif_wake_queue(sc->dev);
+	}
+	spin_unlock(&sc->ether.tx_lock);
+}
+
+
+void dc_intr_tx_underflow(struct channel *sc)
+{
+	u32 val;
+
+	dc_transmitter_onoff(sc, SBE_2T3E3_OFF);
+
+	val = dc_read(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE);
+	dc_clear_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+		      SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS);
+
+	switch (val & SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS) {
+	case SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_1:
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			    SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_2);
+		break;
+	case SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_2:
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			    SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_3);
+		break;
+	case SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_3:
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			    SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_4);
+		break;
+	case SBE_2T3E3_21143_VAL_THRESHOLD_CONTROL_BITS_4:
+	default:
+		dc_set_bits(sc->addr, SBE_2T3E3_21143_REG_OPERATION_MODE,
+			    SBE_2T3E3_21143_VAL_STORE_AND_FORWARD);
+		break;
+	}
+
+	dc_transmitter_onoff(sc, SBE_2T3E3_ON);
+}
+
+
+
+
+void exar7250_intr(struct channel *sc)
+{
+	u32 status, old_OOF;
+
+#if 0
+	/* disable interrupts */
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE, 0);
+#endif
+
+	old_OOF = sc->s.OOF;
+
+	status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_STATUS);
+	dev_dbg(&sc->pdev->dev, DRV_NAME
+		": Framer Interrupt! (REG[0x05] = %02X)\n", status);
+
+	switch (sc->p.frame_type) {
+	case SBE_2T3E3_FRAME_TYPE_E3_G751:
+	case SBE_2T3E3_FRAME_TYPE_E3_G832:
+		exar7250_E3_intr(sc, status);
+		break;
+
+	case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
+	case SBE_2T3E3_FRAME_TYPE_T3_M13:
+		exar7250_T3_intr(sc, status);
+		break;
+
+	default:
+		break;
+	}
+
+	if (sc->s.OOF != old_OOF) {
+		if (sc->s.OOF) {
+			if (sc->p.loopback == SBE_2T3E3_LOOPBACK_NONE) {
+				dev_dbg(&sc->pdev->dev, DRV_NAME
+					": Disabling eth interrupts\n");
+				/* turn off ethernet interrupts */
+				dc_stop_intr(sc);
+			}
+		} else if (sc->r.flags & SBE_2T3E3_FLAG_NETWORK_UP) {
+			dev_dbg(&sc->pdev->dev, DRV_NAME
+				": Enabling eth interrupts\n");
+			/* start interrupts */
+			sc->s.OOF = 1;
+			dc_intr_rx(sc);
+			sc->s.OOF = 0;
+			if (sc->p.receiver_on) {
+				dc_receiver_onoff(sc, SBE_2T3E3_OFF);
+				dc_receiver_onoff(sc, SBE_2T3E3_ON);
+			}
+			dc_start_intr(sc);
+		}
+	}
+#if 0
+	/* reenable interrupts */
+	exar7250_write(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE,
+		       SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_ENABLE |
+		       SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_ENABLE
+		);
+#endif
+}
+
+
+void exar7250_T3_intr(struct channel *sc, u32 block_status)
+{
+	u32 status, result;
+
+	if (block_status & SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_STATUS) {
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_STATUS);
+
+		if (status) {
+			dev_dbg(&sc->pdev->dev,
+				"Framer interrupt T3 RX (REG[0x13] = %02X)\n",
+				status);
+
+			result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_CONFIGURATION_STATUS);
+
+#if 0
+			if (status & SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_STATUS) {
+				dev_dbg(&sc->pdev->dev,
+					"Framer interrupt T3: LOS\n");
+				sc->s.LOS = result & SBE_2T3E3_FRAMER_VAL_T3_RX_LOS ? 1 : 0;
+
+			}
+#else
+			cpld_LOS_update(sc);
+#endif
+			if (status & SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_STATUS) {
+				sc->s.OOF = result & SBE_2T3E3_FRAMER_VAL_T3_RX_OOF ? 1 : 0;
+				dev_dbg(&sc->pdev->dev,
+					"Framer interrupt T3: OOF (%d)\n",
+					sc->s.OOF);
+			}
+
+			exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_ENABLE,
+				       SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE |
+				       SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE);
+#if 0
+			SBE_2T3E3_FRAMER_VAL_T3_RX_CP_BIT_ERROR_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_AIS_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_FERF_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_AIC_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_T3_RX_P_BIT_INTERRUPT_ENABLE
+#endif
+				}
+
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS);
+		if (status) {
+			dev_dbg(&sc->pdev->dev,
+				"Framer interrupt T3 RX (REG[0x17] = %02X)\n",
+				status);
+#if 0
+			exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS,
+				       SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_REMOVE_INTERRUPT_ENABLE |
+				       SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_VALID_INTERRUPT_ENABLE
+				);
+#endif
+		}
+
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL);
+		if (status)
+			dev_dbg(&sc->pdev->dev,
+				"Framer interrupt T3 RX (REG[0x18] = %02X)\n",
+				status);
+	}
+
+
+	if (block_status & SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_STATUS) {
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_TX_FEAC_CONFIGURATION_STATUS);
+		dev_dbg(&sc->pdev->dev, DRV_NAME
+			": Framer interrupt T3 TX (REG[0x31] = %02X)\n",
+			status);
+
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_STATUS);
+		dev_dbg(&sc->pdev->dev, DRV_NAME
+			": Framer interrupt T3 TX (REG[0x34] = %02X)\n",
+			status);
+	}
+}
+
+
+void exar7250_E3_intr(struct channel *sc, u32 block_status)
+{
+	u32 status, result;
+
+	if (block_status & SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_STATUS) {
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_1);
+
+		if (status) {
+			dev_dbg(&sc->pdev->dev,
+				"Framer interrupt E3 RX (REG[0x14] = %02X)\n",
+				status);
+
+			result = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_2);
+
+#if 0
+			if (status & SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_STATUS) {
+				dev_dbg(&sc->pdev->dev,
+					"Framer interrupt E3: LOS\n");
+				sc->s.LOS = result & SBE_2T3E3_FRAMER_VAL_E3_RX_LOS ? 1 : 0;
+			}
+#else
+			cpld_LOS_update(sc);
+#endif
+			if (status & SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_STATUS) {
+				sc->s.OOF = result & SBE_2T3E3_FRAMER_VAL_E3_RX_OOF ? 1 : 0;
+				dev_dbg(&sc->pdev->dev,
+					"Framer interrupt E3: OOF (%d)\n",
+					sc->s.OOF);
+			}
+
+			exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_1,
+				       SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE |
+				       SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE
+				);
+#if 0
+			SBE_2T3E3_FRAMER_VAL_E3_RX_COFA_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_E3_RX_LOF_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE |
+				SBE_2T3E3_FRAMER_VAL_E3_RX_AIS_INTERRUPT_ENABLE
+#endif
+				}
+
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_2);
+		if (status) {
+			dev_dbg(&sc->pdev->dev,
+				"Framer interrupt E3 RX (REG[0x15] = %02X)\n",
+				status);
+
+#if 0
+			exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_2,
+				       SBE_2T3E3_FRAMER_VAL_E3_RX_FEBE_INTERRUPT_ENABLE |
+				       SBE_2T3E3_FRAMER_VAL_E3_RX_FERF_INTERRUPT_ENABLE |
+				       SBE_2T3E3_FRAMER_VAL_E3_RX_FRAMING_BYTE_ERROR_INTERRUPT_ENABLE);
+#endif
+		}
+
+	}
+
+	if (block_status & SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_STATUS) {
+		status = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_STATUS);
+		dev_dbg(&sc->pdev->dev, DRV_NAME
+			": Framer interrupt E3 TX (REG[0x34] = %02X)\n",
+			status);
+	}
+}
diff --git a/drivers/staging/sbe-2t3e3/io.c b/drivers/staging/sbe-2t3e3/io.c
new file mode 100644
index 0000000..b458ff0
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/io.c
@@ -0,0 +1,352 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/ip.h>
+#include <asm/system.h>
+#include "2t3e3.h"
+#include "ctrl.h"
+
+/* All access to registers done via the 21143 on port 0 must be
+ * protected via the card->bootrom_lock. */
+
+/* priviate define to be used here only - must be protected by card->bootrom_lock */
+#define cpld_write_nolock(channel, reg, val)			\
+	bootrom_write((channel), CPLD_MAP_REG(reg, channel), val)
+
+u32 cpld_read(struct channel *channel, u32 reg)
+{
+	unsigned long flags;
+	u32 val;
+
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+	val = bootrom_read((channel), CPLD_MAP_REG(reg, channel));
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+	return val;
+}
+
+/****************************************
+ * Access via BootROM port
+ ****************************************/
+
+u32 bootrom_read(struct channel *channel, u32 reg)
+{
+	unsigned long addr = channel->card->bootrom_addr;
+	u32 result;
+
+	/* select BootROM address */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_PROGRAMMING_ADDRESS, reg & 0x3FFFF);
+
+	/* select reading from BootROM */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_BOOT_ROM_SELECT);
+
+	udelay(2); /* 20 PCI cycles */
+
+	/* read from BootROM */
+	result = dc_read(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT) & 0xff;
+
+	/* reset CSR9 */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT, 0);
+
+	return result;
+}
+
+void bootrom_write(struct channel *channel, u32 reg, u32 val)
+{
+	unsigned long addr = channel->card->bootrom_addr;
+
+	/* select BootROM address */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_PROGRAMMING_ADDRESS, reg & 0x3FFFF);
+
+	/* select writting to BootROM */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_WRITE_OPERATION |
+		 SBE_2T3E3_21143_VAL_BOOT_ROM_SELECT |
+		 (val & 0xff));
+
+	udelay(2); /* 20 PCI cycles */
+
+	/* reset CSR9 */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT, 0);
+}
+
+
+/****************************************
+ * Access via Serial I/O port
+ ****************************************/
+
+static u32 serialrom_read_bit(struct channel *channel)
+{
+	unsigned long addr = channel->card->bootrom_addr;
+	u32 bit;
+
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CLOCK |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);	/* clock high */
+
+	bit = (dc_read(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT) &
+	       SBE_2T3E3_21143_VAL_SERIAL_ROM_DATA_OUT) > 0 ? 1 : 0;
+
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);	/* clock low */
+
+	return bit;
+}
+
+static void serialrom_write_bit(struct channel *channel, u32 bit)
+{
+	unsigned long addr = channel->card->bootrom_addr;
+	u32 lastbit = -1;
+
+	bit &= 1;
+
+	if (bit != lastbit) {
+		dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+			 SBE_2T3E3_21143_VAL_WRITE_OPERATION |
+			 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+			 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT |
+			 (bit << 2)); /* clock low */
+
+		lastbit = bit;
+	}
+
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_WRITE_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CLOCK |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT |
+		 (bit << 2)); /* clock high */
+
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_WRITE_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT |
+		 (bit << 2)); /* clock low */
+}
+
+/****************************************
+ * Access to SerialROM (eeprom)
+ ****************************************/
+
+u32 t3e3_eeprom_read_word(struct channel *channel, u32 address)
+{
+	unsigned long addr = channel->card->bootrom_addr;
+	u32 i, val;
+	unsigned long flags;
+
+	address &= 0x3f;
+
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+
+	/* select correct Serial Chip */
+	cpld_write_nolock(channel, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT,
+			  SBE_2T3E3_CPLD_VAL_EEPROM_SELECT);
+
+	/* select reading from Serial I/O Bus */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);        /* clock low */
+
+	/* select read operation */
+	serialrom_write_bit(channel, 0);
+	serialrom_write_bit(channel, 1);
+	serialrom_write_bit(channel, 1);
+	serialrom_write_bit(channel, 0);
+
+	for (i = 0x20; i; i >>= 1)
+		serialrom_write_bit(channel, address & i ? 1 : 0);
+
+	val = 0;
+	for (i = 0x8000; i; i >>= 1)
+		val |= (serialrom_read_bit(channel) ? i : 0);
+
+	/* Reset 21143's CSR9 */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);        /* clock low */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT, 0);
+
+	/* Unselect Serial Chip */
+	cpld_write_nolock(channel, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT, 0);
+
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+
+	return ntohs(val);
+}
+
+
+/****************************************
+ * Access to Framer
+ ****************************************/
+
+u32 exar7250_read(struct channel *channel, u32 reg)
+{
+	u32 result;
+	unsigned long flags;
+
+#if 0
+	switch (reg) {
+	case SBE_2T3E3_FRAMER_REG_OPERATING_MODE:
+		return channel->framer_regs[reg];
+		break;
+	default:
+	}
+#endif
+
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+
+	result = bootrom_read(channel, cpld_reg_map[SBE_2T3E3_CPLD_REG_FRAMER_BASE_ADDRESS]
+			      [channel->h.slot] + (t3e3_framer_reg_map[reg] << 2));
+
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+
+	return result;
+}
+
+void exar7250_write(struct channel *channel, u32 reg, u32 val)
+{
+	unsigned long flags;
+
+	val &= 0xff;
+	channel->framer_regs[reg] = val;
+
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+
+	bootrom_write(channel, cpld_reg_map[SBE_2T3E3_CPLD_REG_FRAMER_BASE_ADDRESS]
+		      [channel->h.slot] + (t3e3_framer_reg_map[reg] << 2), val);
+
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+}
+
+
+/****************************************
+ * Access to LIU
+ ****************************************/
+
+u32 exar7300_read(struct channel *channel, u32 reg)
+{
+	unsigned long addr = channel->card->bootrom_addr, flags;
+	u32 i, val;
+
+#if 0
+	switch (reg) {
+	case SBE_2T3E3_LIU_REG_REG1:
+	case SBE_2T3E3_LIU_REG_REG2:
+	case SBE_2T3E3_LIU_REG_REG3:
+	case SBE_2T3E3_LIU_REG_REG4:
+		return channel->liu_regs[reg];
+		break;
+	default:
+	}
+#endif
+
+	/* select correct Serial Chip */
+
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+
+	cpld_write_nolock(channel, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT,
+			  cpld_val_map[SBE_2T3E3_CPLD_VAL_LIU_SELECT][channel->h.slot]);
+
+	/* select reading from Serial I/O Bus */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);	/* clock low */
+
+	/* select read operation */
+	serialrom_write_bit(channel, 1);
+
+	/* Exar7300 register address is 4 bit long */
+	reg = t3e3_liu_reg_map[reg];
+	for (i = 0; i < 4; i++, reg >>= 1) /* 4 bits of SerialROM address */
+		serialrom_write_bit(channel, reg & 1);
+	for (i = 0; i < 3; i++)	/* remaining 3 bits of SerialROM address */
+		serialrom_write_bit(channel, 0);
+
+	val = 0; /* Exar7300 register value is 5 bit long */
+	for (i = 0; i < 8; i++)	/* 8 bits of SerialROM value */
+		val += (serialrom_read_bit(channel) << i);
+
+	/* Reset 21143's CSR9 */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_READ_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);	/* clock low */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT, 0);
+
+	/* Unselect Serial Chip */
+	cpld_write_nolock(channel, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT, 0);
+
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+
+	return val;
+}
+
+void exar7300_write(struct channel *channel, u32 reg, u32 val)
+{
+	unsigned long addr = channel->card->bootrom_addr, flags;
+	u32 i;
+
+	channel->liu_regs[reg] = val;
+
+	/* select correct Serial Chip */
+
+	spin_lock_irqsave(&channel->card->bootrom_lock, flags);
+
+	cpld_write_nolock(channel, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT,
+			  cpld_val_map[SBE_2T3E3_CPLD_VAL_LIU_SELECT][channel->h.slot]);
+
+	/* select writting to Serial I/O Bus */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_WRITE_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);	/* clock low */
+
+	/* select write operation */
+	serialrom_write_bit(channel, 0);
+
+	/* Exar7300 register address is 4 bit long */
+	reg = t3e3_liu_reg_map[reg];
+	for (i = 0; i < 4; i++) {	/* 4 bits */
+		serialrom_write_bit(channel, reg & 1);
+		reg >>= 1;
+	}
+	for (i = 0; i < 3; i++)	/* remaining 3 bits of SerialROM address */
+		serialrom_write_bit(channel, 0);
+
+	/* Exar7300 register value is 5 bit long */
+	for (i = 0; i < 5; i++) {
+		serialrom_write_bit(channel, val & 1);
+		val >>= 1;
+	}
+	for (i = 0; i < 3; i++)	/* remaining 3 bits of SerialROM value */
+		serialrom_write_bit(channel, 0);
+
+	/* Reset 21143_CSR9 */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT,
+		 SBE_2T3E3_21143_VAL_WRITE_OPERATION |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_SELECT |
+		 SBE_2T3E3_21143_VAL_SERIAL_ROM_CHIP_SELECT);	/* clock low */
+	dc_write(addr, SBE_2T3E3_21143_REG_BOOT_ROM_SERIAL_ROM_AND_MII_MANAGEMENT, 0);
+
+	/* Unselect Serial Chip */
+	cpld_write_nolock(channel, SBE_2T3E3_CPLD_REG_SERIAL_CHIP_SELECT, 0);
+
+	spin_unlock_irqrestore(&channel->card->bootrom_lock, flags);
+}
diff --git a/drivers/staging/sbe-2t3e3/main.c b/drivers/staging/sbe-2t3e3/main.c
new file mode 100644
index 0000000..8608afb
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/main.c
@@ -0,0 +1,171 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include "2t3e3.h"
+
+void t3e3_init(struct channel *sc)
+{
+	cpld_init(sc);
+	dc_reset(sc);
+	dc_init(sc);
+	exar7250_init(sc);
+	exar7300_init(sc);
+}
+
+int t3e3_if_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+	struct channel *sc = dev_to_priv(dev);
+	u32 current_write, last_write;
+	unsigned long flags;
+	struct sk_buff *skb2;
+
+	if (skb == NULL) {
+		sc->s.out_errors++;
+		return 0;
+	}
+
+	if (sc->p.transmitter_on != SBE_2T3E3_ON) {
+		sc->s.out_errors++;
+		sc->s.out_dropped++;
+		dev_kfree_skb_any(skb);
+		return 0;
+	}
+
+	if (sc->s.OOF && sc->p.loopback == SBE_2T3E3_LOOPBACK_NONE) {
+		sc->s.out_dropped++;
+		dev_kfree_skb_any(skb);
+		return 0;
+	}
+
+	spin_lock_irqsave(&sc->ether.tx_lock, flags);
+
+	current_write = sc->ether.tx_ring_current_write;
+	for (skb2 = skb; skb2 != NULL; skb2 = NULL) {
+		if (skb2->len) {
+			if ((sc->ether.tx_ring[current_write].tdes1 &
+			     SBE_2T3E3_TX_DESC_BUFFER_1_SIZE) > 0)
+				break;
+			current_write = (current_write + 1) % SBE_2T3E3_TX_DESC_RING_SIZE;
+			/*
+			 * Leave at least 1 tx desc free so that dc_intr_tx() can
+			 * identify empty list
+			 */
+			if (current_write == sc->ether.tx_ring_current_read)
+				break;
+		}
+	}
+	if (skb2 != NULL) {
+		netif_stop_queue(sc->dev);
+		sc->ether.tx_full = 1;
+		dev_dbg(&sc->pdev->dev, DRV_NAME ": out of descriptors\n");
+		spin_unlock_irqrestore(&sc->ether.tx_lock, flags);
+		return NETDEV_TX_BUSY;
+	}
+
+	current_write = last_write = sc->ether.tx_ring_current_write;
+	dev_dbg(&sc->pdev->dev, "sending mbuf (current_write = %d)\n",
+		current_write);
+
+	for (skb2 = skb; skb2 != NULL; skb2 = NULL) {
+		if (skb2->len) {
+			dev_dbg(&sc->pdev->dev,
+				"sending mbuf (len = %d, next = %p)\n",
+				skb2->len, NULL);
+
+			sc->ether.tx_free_cnt--;
+			sc->ether.tx_ring[current_write].tdes0 = 0;
+			sc->ether.tx_ring[current_write].tdes1 &=
+				SBE_2T3E3_TX_DESC_END_OF_RING |
+				SBE_2T3E3_TX_DESC_SECOND_ADDRESS_CHAINED;
+/* DISABLE_PADDING sometimes gets lost somehow, hands off... */
+			sc->ether.tx_ring[current_write].tdes1 |=
+				SBE_2T3E3_TX_DESC_DISABLE_PADDING | skb2->len;
+
+			if (current_write == sc->ether.tx_ring_current_write) {
+				sc->ether.tx_ring[current_write].tdes1 |=
+					SBE_2T3E3_TX_DESC_FIRST_SEGMENT;
+			} else {
+				sc->ether.tx_ring[current_write].tdes0 =
+					SBE_2T3E3_TX_DESC_21143_OWN;
+			}
+
+			sc->ether.tx_ring[current_write].tdes2 = virt_to_phys(skb2->data);
+			sc->ether.tx_data[current_write] = NULL;
+
+			last_write = current_write;
+			current_write = (current_write + 1) % SBE_2T3E3_TX_DESC_RING_SIZE;
+		}
+	}
+
+	sc->ether.tx_data[last_write] = skb;
+	sc->ether.tx_ring[last_write].tdes1 |=
+		SBE_2T3E3_TX_DESC_LAST_SEGMENT |
+		SBE_2T3E3_TX_DESC_INTERRUPT_ON_COMPLETION;
+	sc->ether.tx_ring[sc->ether.tx_ring_current_write].tdes0 |=
+		SBE_2T3E3_TX_DESC_21143_OWN;
+	sc->ether.tx_ring_current_write = current_write;
+
+	dev_dbg(&sc->pdev->dev, "txput: tdes0 = %08X        tdes1 = %08X\n",
+		sc->ether.tx_ring[last_write].tdes0,
+		sc->ether.tx_ring[last_write].tdes1);
+
+	dc_write(sc->addr, SBE_2T3E3_21143_REG_TRANSMIT_POLL_DEMAND,
+		 0xffffffff);
+
+	spin_unlock_irqrestore(&sc->ether.tx_lock, flags);
+	return 0;
+}
+
+
+void t3e3_read_card_serial_number(struct channel *sc)
+{
+	u32 i;
+
+	for (i = 0; i < 3; i++)
+		sc->ether.card_serial_number[i] = t3e3_eeprom_read_word(sc, 10 + i);
+
+	printk(KERN_INFO "SBE wanPMC-2T3E3 serial number: %04X%04X%04X\n",
+	       sc->ether.card_serial_number[0], sc->ether.card_serial_number[1],
+	       sc->ether.card_serial_number[2]);
+}
+
+/*
+  bit 0 led1 (green)
+  bit 1 led1 (yellow)
+
+  bit 2 led2 (green)
+  bit 3 led2 (yellow)
+
+  bit 4 led3 (green)
+  bit 5 led3 (yellow)
+
+  bit 6 led4 (green)
+  bit 7 led4 (yellow)
+*/
+
+void update_led(struct channel *sc, int blinker)
+{
+	int leds;
+	if (sc->s.LOS)
+		leds = 0; /* led1 = off */
+	else if (sc->s.OOF)
+		leds = 2; /* led1 = yellow */
+	else if ((blinker & 1) && sc->rcv_count) {
+		leds = 0; /* led1 = off */
+		sc->rcv_count = 0;
+	} else
+		leds = 1; /* led1 = green */
+	cpld_write(sc, SBE_2T3E3_CPLD_REG_LEDR, leds);
+	sc->leds = leds;
+}
diff --git a/drivers/staging/sbe-2t3e3/maps.c b/drivers/staging/sbe-2t3e3/maps.c
new file mode 100644
index 0000000..7084fbe
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/maps.c
@@ -0,0 +1,104 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/kernel.h>
+#include "2t3e3.h"
+
+const u32 cpld_reg_map[][2] =
+{
+	{ 0x0000, 0x0080 }, /* 0 - Port Control Register A (PCRA) */
+	{ 0x0004, 0x0084 }, /* 1 - Port Control Register B (PCRB) */
+	{ 0x0008, 0x0088 }, /* 2 - LCV Count Register (PLCR) */
+	{ 0x000c, 0x008c }, /* 3 - LCV Threshold register (PLTR) */
+	{ 0x0010, 0x0090 }, /* 4 - Payload Fill Register (PPFR) */
+	{ 0x0200, 0x0200 }, /* 5 - Board ID / FPGA Programming Status Register */
+	{ 0x0204, 0x0204 }, /* 6 - FPGA Version Register */
+	{ 0x0800, 0x1000 }, /* 7 - Framer Registers Base Address */
+	{ 0x2000, 0x2000 }, /* 8 - Serial Chip Select Register */
+	{ 0x2004, 0x2004 }, /* 9 - Static Reset Register */
+	{ 0x2008, 0x2008 }, /* 10 - Pulse Reset Register */
+	{ 0x200c, 0x200c }, /* 11 - FPGA Reconfiguration Register */
+	{ 0x2010, 0x2014 }, /* 12 - LED Register (LEDR) */
+	{ 0x2018, 0x201c }, /* 13 - LIU Control and Status Register (PISCR) */
+	{ 0x2020, 0x2024 }, /* 14 - Interrupt Enable Register (PIER) */
+	{ 0x0068, 0x00e8 }, /* 15 - Port Control Register C (PCRC) */
+	{ 0x006c, 0x00ec }, /* 16 - Port Bandwidth Start (PBWF) */
+	{ 0x0070, 0x00f0 }, /* 17 - Port Bandwidth Stop (PBWL) */
+};
+
+const u32 cpld_val_map[][2] =
+{
+	{ 0x01, 0x02 }, /* LIU1 / LIU2 select for Serial Chip Select */
+	{ 0x04, 0x08 }, /* DAC1 / DAC2 select for Serial Chip Select */
+	{ 0x00, 0x04 }, /* LOOP1 / LOOP2 - select of loop timing source */
+	{ 0x01, 0x02 }  /* PORT1 / PORT2 - select LIU and Framer for reset */
+};
+
+const u32 t3e3_framer_reg_map[] = {
+	0x00, /* 0 - OPERATING_MODE */
+	0x01, /* 1 - IO_CONTROL */
+	0x04, /* 2 - BLOCK_INTERRUPT_ENABLE */
+	0x05, /* 3 - BLOCK_INTERRUPT_STATUS */
+	0x10, /* 4 - T3_RX_CONFIGURATION_STATUS, E3_RX_CONFIGURATION_STATUS_1 */
+	0x11, /* 5 - T3_RX_STATUS, E3_RX_CONFIGURATION_STATUS_2 */
+	0x12, /* 6 - T3_RX_INTERRUPT_ENABLE, E3_RX_INTERRUPT_ENABLE_1 */
+	0x13, /* 7 - T3_RX_INTERRUPT_STATUS, E3_RX_INTERRUPT_ENABLE_2 */
+	0x14, /* 8 - T3_RX_SYNC_DETECT_ENABLE, E3_RX_INTERRUPT_STATUS_1 */
+	0x15, /* 9 - E3_RX_INTERRUPT_STATUS_2 */
+	0x16, /* 10 - T3_RX_FEAC */
+	0x17, /* 11 - T3_RX_FEAC_INTERRUPT_ENABLE_STATUS */
+	0x18, /* 12 - T3_RX_LAPD_CONTROL, E3_RX_LAPD_CONTROL */
+	0x19, /* 13 - T3_RX_LAPD_STATUS, E3_RX_LAPD_STATUS */
+	0x1a, /* 14 - E3_RX_NR_BYTE, E3_RX_SERVICE_BITS */
+	0x1b, /* 15 - E3_RX_GC_BYTE */
+	0x30, /* 16 - T3_TX_CONFIGURATION, E3_TX_CONFIGURATION */
+	0x31, /* 17 - T3_TX_FEAC_CONFIGURATION_STATUS */
+	0x32, /* 18 - T3_TX_FEAC */
+	0x33, /* 19 - T3_TX_LAPD_CONFIGURATION, E3_TX_LAPD_CONFIGURATION */
+	0x34, /* 20 - T3_TX_LAPD_STATUS, E3_TX_LAPD_STATUS_INTERRUPT */
+	0x35, /* 21 - T3_TX_MBIT_MASK, E3_TX_GC_BYTE, E3_TX_SERVICE_BITS */
+	0x36, /* 22 - T3_TX_FBIT_MASK, E3_TX_MA_BYTE */
+	0x37, /* 23 - T3_TX_FBIT_MASK_2, E3_TX_NR_BYTE */
+	0x38, /* 24 - T3_TX_FBIT_MASK_3 */
+	0x48, /* 25 - E3_TX_FA1_ERROR_MASK, E3_TX_FAS_ERROR_MASK_UPPER */
+	0x49, /* 26 - E3_TX_FA2_ERROR_MASK, E3_TX_FAS_ERROR_MASK_LOWER */
+	0x4a, /* 27 - E3_TX_BIP8_MASK, E3_TX_BIP4_MASK */
+	0x50, /* 28 - PMON_LCV_EVENT_COUNT_MSB */
+	0x51, /* 29 - PMON_LCV_EVENT_COUNT_LSB */
+	0x52, /* 30 - PMON_FRAMING_BIT_ERROR_EVENT_COUNT_MSB */
+	0x53, /* 31 - PMON_FRAMING_BIT_ERROR_EVENT_COUNT_LSB */
+	0x54, /* 32 - PMON_PARITY_ERROR_EVENT_COUNT_MSB */
+	0x55, /* 33 - PMON_PARITY_ERROR_EVENT_COUNT_LSB */
+	0x56, /* 34 - PMON_FEBE_EVENT_COUNT_MSB */
+	0x57, /* 35 - PMON_FEBE_EVENT_COUNT_LSB */
+	0x58, /* 36 - PMON_CP_BIT_ERROR_EVENT_COUNT_MSB */
+	0x59, /* 37 - PMON_CP_BIT_ERROR_EVENT_COUNT_LSB */
+	0x6c, /* 38 - PMON_HOLDING_REGISTER */
+	0x6d, /* 39 - ONE_SECOND_ERROR_STATUS */
+	0x6e, /* 40 - LCV_ONE_SECOND_ACCUMULATOR_MSB */
+	0x6f, /* 41 - LCV_ONE_SECOND_ACCUMULATOR_LSB */
+	0x70, /* 42 - FRAME_PARITY_ERROR_ONE_SECOND_ACCUMULATOR_MSB */
+	0x71, /* 43 - FRAME_PARITY_ERROR_ONE_SECOND_ACCUMULATOR_LSB */
+	0x72, /* 44 - FRAME_CP_BIT_ERROR_ONE_SECOND_ACCUMULATOR_MSB */
+	0x73, /* 45 - FRAME_CP_BIT_ERROR_ONE_SECOND_ACCUMULATOR_LSB */
+	0x80, /* 46 - LINE_INTERFACE_DRIVE */
+	0x81  /* 47 - LINE_INTERFACE_SCAN */
+};
+
+const u32 t3e3_liu_reg_map[] =
+{
+	0x00, /* REG0 */
+	0x01, /* REG1 */
+	0x02, /* REG2 */
+	0x03, /* REG3 */
+	0x04 /* REG4 */
+};
diff --git a/drivers/staging/sbe-2t3e3/module.c b/drivers/staging/sbe-2t3e3/module.c
new file mode 100644
index 0000000..e60d44c
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/module.c
@@ -0,0 +1,210 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/hdlc.h>
+#include <linux/if_arp.h>
+#include <linux/interrupt.h>
+#include "2t3e3.h"
+
+static void check_leds(unsigned long arg)
+{
+	struct card *card = (struct card *)arg;
+	struct channel *channel0 = &card->channels[0];
+	static int blinker;
+
+	update_led(channel0, ++blinker);
+	if (has_two_ports(channel0->pdev))
+		update_led(&card->channels[1], blinker);
+
+	card->timer.expires = jiffies + HZ / 10;
+	add_timer(&card->timer);
+}
+
+static void t3e3_remove_channel(struct channel *channel)
+{
+	struct pci_dev *pdev = channel->pdev;
+	struct net_device *dev = channel->dev;
+
+	/* system hangs if board asserts irq while module is unloaded */
+	cpld_stop_intr(channel);
+	free_irq(dev->irq, dev);
+	dc_drop_descriptor_list(channel);
+	unregister_hdlc_device(dev);
+	free_netdev(dev);
+	pci_release_regions(pdev);
+	pci_disable_device(pdev);
+	pci_set_drvdata(pdev, NULL);
+}
+
+static int __devinit t3e3_init_channel(struct channel *channel, struct pci_dev *pdev, struct card *card)
+{
+	struct net_device *dev;
+	unsigned int val;
+	int err;
+
+	err = pci_enable_device(pdev);
+	if (err)
+		return err;
+
+	err = pci_request_regions(pdev, DRV_NAME);
+	if (err)
+		goto disable;
+
+	dev = alloc_hdlcdev(channel);
+	if (!dev) {
+		printk(KERN_ERR DRV_NAME ": Out of memory\n");
+		goto free_regions;
+	}
+
+	t3e3_sc_init(channel);
+	dev_to_priv(dev) = channel;
+
+	channel->pdev = pdev;
+	channel->dev = dev;
+	channel->card = card;
+	channel->addr = pci_resource_start(pdev, 0);
+	if (pdev->subsystem_device == PCI_SUBDEVICE_ID_SBE_2T3E3_P1)
+		channel->h.slot = 1;
+	else
+		channel->h.slot = 0;
+
+	if (setup_device(dev, channel))
+		goto free_regions;
+
+	pci_read_config_dword(channel->pdev, 0x40, &val); /* mask sleep mode */
+	pci_write_config_dword(channel->pdev, 0x40, val & 0x3FFFFFFF);
+
+	pci_read_config_byte(channel->pdev, PCI_CACHE_LINE_SIZE, &channel->h.cache_size);
+	pci_read_config_dword(channel->pdev, PCI_COMMAND, &channel->h.command);
+	t3e3_init(channel);
+
+	if (request_irq(dev->irq, &t3e3_intr, IRQF_SHARED, dev->name, dev)) {
+		printk(KERN_WARNING "%s: could not get irq: %d\n", dev->name, dev->irq);
+		goto free_regions;
+	}
+
+	pci_set_drvdata(pdev, channel);
+	return 0;
+
+free_regions:
+	pci_release_regions(pdev);
+disable:
+	pci_disable_device(pdev);
+	return err;
+}
+
+static void __devexit t3e3_remove_card(struct pci_dev *pdev)
+{
+	struct channel *channel0 = pci_get_drvdata(pdev);
+	struct card *card = channel0->card;
+
+	del_timer(&card->timer);
+	if (has_two_ports(channel0->pdev)) {
+		t3e3_remove_channel(&card->channels[1]);
+		pci_dev_put(card->channels[1].pdev);
+	}
+	t3e3_remove_channel(channel0);
+	kfree(card);
+}
+
+static int __devinit t3e3_init_card(struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+	/* pdev points to channel #0 */
+	struct pci_dev *pdev1 = NULL;
+	struct card *card;
+	int channels = 1, err;
+
+	if (has_two_ports(pdev)) {
+		while ((pdev1 = pci_get_subsys(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142,
+					       PCI_VENDOR_ID_SBE, PCI_SUBDEVICE_ID_SBE_2T3E3_P1,
+					       pdev1)))
+			if (pdev1->bus == pdev->bus &&
+			    pdev1->devfn == pdev->devfn + 8 /* next device on the same bus */)
+				break; /* found the second channel */
+
+		if (!pdev1) {
+			printk(KERN_ERR DRV_NAME ": Can't find the second channel\n");
+			return -EFAULT;
+		}
+		channels = 2;
+		/* holds the reference for pdev1 */
+	}
+
+	card = kzalloc(sizeof(struct card) + channels * sizeof(struct channel), GFP_KERNEL);
+	if (!card) {
+		printk(KERN_ERR DRV_NAME ": Out of memory\n");
+		return -ENOBUFS;
+	}
+
+	spin_lock_init(&card->bootrom_lock);
+	card->bootrom_addr = pci_resource_start(pdev, 0);
+
+	err = t3e3_init_channel(&card->channels[0], pdev, card);
+	if (err)
+		goto free_card;
+
+	if (channels == 2) {
+		err = t3e3_init_channel(&card->channels[1], pdev1, card);
+		if (err) {
+			t3e3_remove_channel(&card->channels[0]);
+			goto free_card;
+		}
+	}
+
+	/* start LED timer */
+	init_timer(&card->timer);
+	card->timer.function = check_leds;
+	card->timer.expires = jiffies + HZ / 10;
+	card->timer.data = (unsigned long)card;
+	add_timer(&card->timer);
+	return 0;
+
+free_card:
+	kfree(card);
+	return err;
+}
+
+static struct pci_device_id t3e3_pci_tbl[] __devinitdata = {
+	{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142,
+	  PCI_VENDOR_ID_SBE, PCI_SUBDEVICE_ID_SBE_T3E3, 0, 0, 0 },
+	{ PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_21142,
+	  PCI_VENDOR_ID_SBE, PCI_SUBDEVICE_ID_SBE_2T3E3_P0, 0, 0, 0 },
+	/* channel 1 will be initialized after channel 0 */
+	{ 0, }
+};
+
+static struct pci_driver t3e3_pci_driver = {
+	.name     = "SBE T3E3",
+	.id_table = t3e3_pci_tbl,
+	.probe    = t3e3_init_card,
+	.remove   = t3e3_remove_card,
+};
+
+static int __init t3e3_init_module(void)
+{
+	return pci_register_driver(&t3e3_pci_driver);
+}
+
+static void __exit t3e3_cleanup_module(void)
+{
+	pci_unregister_driver(&t3e3_pci_driver);
+}
+
+module_init(t3e3_init_module);
+module_exit(t3e3_cleanup_module);
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, t3e3_pci_tbl);
diff --git a/drivers/staging/sbe-2t3e3/netdev.c b/drivers/staging/sbe-2t3e3/netdev.c
new file mode 100644
index 0000000..c7b5e8b
--- /dev/null
+++ b/drivers/staging/sbe-2t3e3/netdev.c
@@ -0,0 +1,142 @@
+/*
+ * SBE 2T3E3 synchronous serial card driver for Linux
+ *
+ * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This code is based on a driver written by SBE Inc.
+ */
+
+#include <linux/capability.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/hdlc.h>
+#include <linux/if_arp.h>
+#include <linux/interrupt.h>
+#include "2t3e3.h"
+
+int t3e3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+	struct channel *sc = dev_to_priv(dev);
+	int cmd_2t3e3, len, rlen;
+	t3e3_param_t param;
+	t3e3_resp_t  resp;
+	void *data = ifr->ifr_data + sizeof(cmd_2t3e3) + sizeof(len);
+
+	if (cmd == SIOCWANDEV)
+		return hdlc_ioctl(dev, ifr, cmd);
+	if (!capable(CAP_SYS_ADMIN))
+		return -EPERM;
+	if (cmd != SIOCDEVPRIVATE + 15)
+		return -EINVAL;
+
+	if (copy_from_user(&cmd_2t3e3, ifr->ifr_data, sizeof(cmd_2t3e3)))
+		return -EFAULT;
+	if (copy_from_user(&len, ifr->ifr_data + sizeof(cmd_2t3e3), sizeof(len)))
+		return -EFAULT;
+
+	if (len > sizeof(param))
+		return -EFAULT;
+
+	if (len)
+		if (copy_from_user(&param, data, len))
+			return -EFAULT;
+
+	t3e3_if_config(sc, cmd_2t3e3, (char *)&param, &resp, &rlen);
+
+	if (rlen)
+		if (copy_to_user(data, &resp, rlen))
+			return -EFAULT;
+
+	return 0;
+}
+
+static struct net_device_stats* t3e3_get_stats(struct net_device *dev)
+{
+	struct net_device_stats *nstats = &dev->stats;
+	struct channel *sc = dev_to_priv(dev);
+	t3e3_stats_t *stats = &sc->s;
+
+	memset(nstats, 0, sizeof(struct net_device_stats));
+	nstats->rx_packets = stats->in_packets;
+	nstats->tx_packets = stats->out_packets;
+	nstats->rx_bytes = stats->in_bytes;
+	nstats->tx_bytes = stats->out_bytes;
+
+	nstats->rx_errors = stats->in_errors;
+	nstats->tx_errors = stats->out_errors;
+	nstats->rx_crc_errors = stats->in_error_crc;
+
+
+	nstats->rx_dropped = stats->in_dropped;
+	nstats->tx_dropped = stats->out_dropped;
+	nstats->tx_carrier_errors = stats->out_error_lost_carr +
+		stats->out_error_no_carr;
+
+	return nstats;
+}
+
+int t3e3_open(struct net_device *dev)
+{
+	struct channel *sc = dev_to_priv(dev);
+	int ret = hdlc_open(dev);
+
+	if (ret)
+		return ret;
+
+	sc->r.flags |= SBE_2T3E3_FLAG_NETWORK_UP;
+	dc_start(dev_to_priv(dev));
+	netif_start_queue(dev);
+	try_module_get(THIS_MODULE);
+	return 0;
+}
+
+int t3e3_close(struct net_device *dev)
+{
+	struct channel *sc = dev_to_priv(dev);
+	hdlc_close(dev);
+	netif_stop_queue(dev);
+	dc_stop(sc);
+	sc->r.flags &= ~SBE_2T3E3_FLAG_NETWORK_UP;
+	module_put(THIS_MODULE);
+	return 0;
+}
+
+static int t3e3_attach(struct net_device *dev, unsigned short foo1,
+		       unsigned short foo2)
+{
+	return 0;
+}
+
+static const struct net_device_ops t3e3_ops = {
+	.ndo_open       = t3e3_open,
+	.ndo_stop       = t3e3_close,
+	.ndo_change_mtu = hdlc_change_mtu,
+	.ndo_start_xmit = hdlc_start_xmit,
+	.ndo_do_ioctl   = t3e3_ioctl,
+	.ndo_get_stats  = t3e3_get_stats,
+};
+
+int setup_device(struct net_device *dev, struct channel *sc)
+{
+	hdlc_device *hdlc = dev_to_hdlc(dev);
+	int retval;
+
+	dev->base_addr = pci_resource_start(sc->pdev, 0);
+	dev->irq = sc->pdev->irq;
+	dev->netdev_ops = &t3e3_ops;
+	dev->tx_queue_len = 100;
+	hdlc->xmit = t3e3_if_start_xmit;
+	hdlc->attach = t3e3_attach;
+	if ((retval = register_hdlc_device(dev))) {
+		dev_err(&sc->pdev->dev, "error registering HDLC device\n");
+		return retval;
+	}
+	return 0;
+}
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
index 3bedcc1..1ee7ab0 100644
--- a/include/linux/pci_ids.h
+++ b/include/linux/pci_ids.h
@@ -1494,6 +1494,9 @@
 #define PCI_DEVICE_ID_SBE_WANXL100	0x0301
 #define PCI_DEVICE_ID_SBE_WANXL200	0x0302
 #define PCI_DEVICE_ID_SBE_WANXL400	0x0104
+#define PCI_SUBDEVICE_ID_SBE_T3E3	0x0009
+#define PCI_SUBDEVICE_ID_SBE_2T3E3_P0	0x0901
+#define PCI_SUBDEVICE_ID_SBE_2T3E3_P1	0x0902
 
 #define PCI_VENDOR_ID_TOSHIBA		0x1179
 #define PCI_DEVICE_ID_TOSHIBA_PICCOLO_1	0x0101

^ permalink raw reply related

* [PATCH] net/rose: Use GFP_ATOMIC
From: Julia Lawall @ 2010-07-31  9:56 UTC (permalink / raw)
  To: Ralf Baechle, David S. Miller, linux-hams, linux-kernel, netdev,
	kernel-janitors

From: Julia Lawall <julia@diku.dk>

The other calls to kmalloc in the same function use GFP_ATOMIC, and indeed
two locks are held within the body of the function.

The semantic match that finds this problem is as follows:
(http://coccinelle.lip6.fr/)

// <smpl>
@@ identifier f; @@

*f(...,GFP_ATOMIC,...)
... when != spin_unlock(...)
    when != read_unlock(...)
    when != write_unlock(...)
    when != read_unlock_irq(...)
    when != write_unlock_irq(...)
    when != read_unlock_irqrestore(...)
    when != write_unlock_irqrestore(...)
    when != spin_unlock_irq(...)
    when != spin_unlock_irqrestore(...)
*f(...,GFP_KERNEL,...)
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>

---
 net/rose/rose_route.c               |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c
index cbc244a..b4fdaac 100644
--- a/net/rose/rose_route.c
+++ b/net/rose/rose_route.c
@@ -109,7 +109,9 @@ static int __must_check rose_add_node(struct rose_route_struct *rose_route,
 		init_timer(&rose_neigh->t0timer);
 
 		if (rose_route->ndigis != 0) {
-			if ((rose_neigh->digipeat = kmalloc(sizeof(ax25_digi), GFP_KERNEL)) == NULL) {
+			rose_neigh->digipeat =
+				kmalloc(sizeof(ax25_digi), GFP_ATOMIC);
+			if (rose_neigh->digipeat == NULL) {
 				kfree(rose_neigh);
 				res = -ENOMEM;
 				goto out;

^ permalink raw reply related

* Re: [PATCH 1/2] nf_nat: make unique_tuple return void
From: Jan Engelhardt @ 2010-07-31 11:54 UTC (permalink / raw)
  To: Changli Gao; +Cc: Patrick McHardy, David S. Miller, netfilter-devel, netdev
In-Reply-To: <1280542516-14567-1-git-send-email-xiaosuo@gmail.com>

On Saturday 2010-07-31 04:15, Changli Gao wrote:

>the only user of unique_tuple() get_unique_tuple() doesn't care about the
>return value of unique_tuple(), so make unique_tuple() return void (nothing).

Shouldn't the callers (get_unique_tuple in nf_nat_core.c) ideally 
return NF_DROP or something such that connections that cannot be 
uniquely mangled be rejected rather than forwarded without mangling?



^ permalink raw reply

* Re: [PATCH 1/2] nf_nat: make unique_tuple return void
From: Changli Gao @ 2010-07-31 12:47 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Patrick McHardy, David S. Miller, netfilter-devel, netdev
In-Reply-To: <alpine.LSU.2.01.1007311352490.17359@obet.zrqbmnf.qr>

On Sat, Jul 31, 2010 at 7:54 PM, Jan Engelhardt <jengelh@medozas.de> wrote:
> On Saturday 2010-07-31 04:15, Changli Gao wrote:
>
>>the only user of unique_tuple() get_unique_tuple() doesn't care about the
>>return value of unique_tuple(), so make unique_tuple() return void (nothing).
>
> Shouldn't the callers (get_unique_tuple in nf_nat_core.c) ideally
> return NF_DROP or something such that connections that cannot be
> uniquely mangled be rejected rather than forwarded without mangling?
>

 220/* Manipulate the tuple into the range given.  For NF_INET_POST_ROUTING,
 221 * we change the source to map into the range.  For NF_INET_PRE_ROUTING
 222 * and NF_INET_LOCAL_OUT, we change the destination to map into the
 223 * range.  It might not be possible to get a unique tuple, but we try.
 224 * At worst (or if we race), we will end up with a final duplicate in
 225 * __ip_conntrack_confirm and drop the packet. */
 226static void
 227get_unique_tuple(struct nf_conntrack_tuple *tuple,
 228                 const struct nf_conntrack_tuple *orig_tuple,
 229                 const struct nf_nat_range *range,
 230                 struct nf_conn *ct,
 231                 enum nf_nat_manip_type maniptype)

the above is the comment for get_unique_tuple(). So no connection is
forwarded without mangling.

-- 
Regards,
Changli Gao(xiaosuo@gmail.com)

^ permalink raw reply

* [PATCH] Multiqueue macvtap driver
From: Krishna Kumar @ 2010-07-31 13:57 UTC (permalink / raw)
  To: davem, arnd; +Cc: netdev, Krishna Kumar, mst

From: Krishna Kumar <krkumar2@in.ibm.com>

Implement multiqueue facility for macvtap driver. The idea is that
a macvtap device can be opened multiple times and the fd's can be
used to register eg, as backend for vhost.

Please review.

Signed-off-by: Krishna Kumar <krkumar2@in.ibm.com>
---
 drivers/net/macvtap.c      |   85 ++++++++++++++++++++++++++++-------
 include/linux/if_macvlan.h |   11 ++++
 2 files changed, 78 insertions(+), 18 deletions(-)

diff -ruNp org/include/linux/if_macvlan.h new/include/linux/if_macvlan.h
--- org/include/linux/if_macvlan.h	2010-07-28 15:10:10.000000000 +0530
+++ new/include/linux/if_macvlan.h	2010-07-31 19:18:38.000000000 +0530
@@ -40,6 +40,14 @@ struct macvlan_rx_stats {
 	unsigned long		rx_errors;
 };
 
+#define MIN(x, y)		(((x) < (y)) ? (x) : (y))
+
+/*
+ * Maximum times a macvtap device can be opened. This can be used to
+ * configure the number of receive queue, e.g. for multiqueue virtio.
+ */
+#define MAX_MACVTAP_QUEUES	MIN(16, NR_CPUS)
+
 struct macvlan_dev {
 	struct net_device	*dev;
 	struct list_head	list;
@@ -50,7 +58,8 @@ struct macvlan_dev {
 	enum macvlan_mode	mode;
 	int (*receive)(struct sk_buff *skb);
 	int (*forward)(struct net_device *dev, struct sk_buff *skb);
-	struct macvtap_queue	*tap;
+	struct macvtap_queue	*taps[MAX_MACVTAP_QUEUES];
+	int			numvtaps;
 };
 
 static inline void macvlan_count_rx(const struct macvlan_dev *vlan,
diff -ruNp org/drivers/net/macvtap.c new/drivers/net/macvtap.c
--- org/drivers/net/macvtap.c	2010-07-28 15:10:10.000000000 +0530
+++ new/drivers/net/macvtap.c	2010-07-31 19:07:22.000000000 +0530
@@ -84,26 +84,45 @@ static const struct proto_ops macvtap_so
 static DEFINE_SPINLOCK(macvtap_lock);
 
 /*
- * Choose the next free queue, for now there is only one
+ * get_slot: return a [unused/occupied] slot in vlan->taps[]:
+ *	- if 'q' is NULL, return the first empty slot;
+ *	- otherwise, return the slot this pointer occupies.
  */
+static int get_slot(struct macvlan_dev *vlan, struct macvtap_queue *q)
+{
+	int i;
+
+	for (i = 0; i < MAX_MACVTAP_QUEUES; i++) {
+		if (rcu_dereference(vlan->taps[i]) == q)
+			return i;
+	}
+
+	/* Should never happen */
+	BUG_ON(1);
+}
+
 static int macvtap_set_queue(struct net_device *dev, struct file *file,
 				struct macvtap_queue *q)
 {
 	struct macvlan_dev *vlan = netdev_priv(dev);
+	int index;
 	int err = -EBUSY;
 
 	spin_lock(&macvtap_lock);
-	if (rcu_dereference(vlan->tap))
+	if (vlan->numvtaps == MAX_MACVTAP_QUEUES)
 		goto out;
 
 	err = 0;
+	index = get_slot(vlan, NULL);
 	rcu_assign_pointer(q->vlan, vlan);
-	rcu_assign_pointer(vlan->tap, q);
+	rcu_assign_pointer(vlan->taps[index], q);
 	sock_hold(&q->sk);
 
 	q->file = file;
 	file->private_data = q;
 
+	vlan->numvtaps++;
+
 out:
 	spin_unlock(&macvtap_lock);
 	return err;
@@ -124,9 +143,12 @@ static void macvtap_put_queue(struct mac
 	spin_lock(&macvtap_lock);
 	vlan = rcu_dereference(q->vlan);
 	if (vlan) {
-		rcu_assign_pointer(vlan->tap, NULL);
+		int index = get_slot(vlan, q);
+
+		rcu_assign_pointer(vlan->taps[index], NULL);
 		rcu_assign_pointer(q->vlan, NULL);
 		sock_put(&q->sk);
+		--vlan->numvtaps;
 	}
 
 	spin_unlock(&macvtap_lock);
@@ -136,39 +158,68 @@ static void macvtap_put_queue(struct mac
 }
 
 /*
- * Since we only support one queue, just dereference the pointer.
+ * Select a queue based on the rxq of the device on which this packet
+ * arrived. If the incoming device is not mq, then use our cpu number
+ * to select a queue. vlan->numvtaps is cached in case it changes
+ * during the execution of this function.
  */
 static struct macvtap_queue *macvtap_get_queue(struct net_device *dev,
 					       struct sk_buff *skb)
 {
 	struct macvlan_dev *vlan = netdev_priv(dev);
+	struct macvtap_queue *tap = NULL;
+	int numvtaps = vlan->numvtaps;
+	u16 rxq;
+
+	if (!numvtaps)
+		return NULL;
+
+	if (likely(skb_rx_queue_recorded(skb))) {
+		rxq = skb_get_rx_queue(skb);
 
-	return rcu_dereference(vlan->tap);
+		while (unlikely(rxq >= numvtaps))
+			rxq -= numvtaps;
+
+		tap = rcu_dereference(vlan->taps[rxq]);
+	}
+
+	if (unlikely(!tap)) {
+		rxq = smp_processor_id() % numvtaps;
+		tap = rcu_dereference(vlan->taps[rxq]);
+	}
+
+	return tap;
 }
 
 /*
  * The net_device is going away, give up the reference
- * that it holds on the queue (all the queues one day)
- * and safely set the pointer from the queues to NULL.
+ * that it holds on all queues and safely set the pointer
+ * from the queues to NULL.
  */
 static void macvtap_del_queues(struct net_device *dev)
 {
 	struct macvlan_dev *vlan = netdev_priv(dev);
-	struct macvtap_queue *q;
+	struct macvtap_queue *q, *qlist[MAX_MACVTAP_QUEUES];
+	int i, j = 0;
 
+	/* macvtap_put_queue can free some slots, so go through all slots */
 	spin_lock(&macvtap_lock);
-	q = rcu_dereference(vlan->tap);
-	if (!q) {
-		spin_unlock(&macvtap_lock);
-		return;
+	for (i = 0; i < MAX_MACVTAP_QUEUES && vlan->numvtaps; i++) {
+		q = rcu_dereference(vlan->taps[i]);
+		if (q) {
+			qlist[j++] = q;
+			rcu_assign_pointer(vlan->taps[i], NULL);
+			rcu_assign_pointer(q->vlan, NULL);
+			vlan->numvtaps--;
+		}
 	}
-
-	rcu_assign_pointer(vlan->tap, NULL);
-	rcu_assign_pointer(q->vlan, NULL);
+	BUG_ON(vlan->numvtaps != 0);
 	spin_unlock(&macvtap_lock);
 
 	synchronize_rcu();
-	sock_put(&q->sk);
+
+	for (--j; j >= 0; j--)
+		sock_put(&qlist[j]->sk);
 }
 
 /*

^ permalink raw reply

* Re: [PATCH 2/2] nf_nat: don't check if the tuple is unique when there isn't any other choice
From: Jan Engelhardt @ 2010-07-31 14:03 UTC (permalink / raw)
  To: Changli Gao; +Cc: Patrick McHardy, David S. Miller, netfilter-devel, netdev
In-Reply-To: <1280542939-14606-1-git-send-email-xiaosuo@gmail.com>


On Saturday 2010-07-31 04:22, Changli Gao wrote:
>+++ b/net/ipv4/netfilter/nf_nat_proto_common.c
>@@ -81,9 +81,9 @@ void nf_nat_proto_unique_tuple(struct nf_conntrack_tuple *tuple,
> 	else
> 		off = *rover;
> 
>-	for (i = 0; i < range_size; i++, off++) {
>+	for (i = 0; 1; off++) {

The 1 looks strange. It's more common to express this without
a condition, as in (i = 0; ; ++off).


^ permalink raw reply

* Re: [PATCH 2/2] nf_nat: don't check if the tuple is unique when there isn't any other choice
From: Changli Gao @ 2010-07-31 14:07 UTC (permalink / raw)
  To: Jan Engelhardt; +Cc: Patrick McHardy, David S. Miller, netfilter-devel, netdev
In-Reply-To: <alpine.LSU.2.01.1007311603010.32289@obet.zrqbmnf.qr>

On Sat, Jul 31, 2010 at 10:03 PM, Jan Engelhardt <jengelh@medozas.de> wrote:
>
> On Saturday 2010-07-31 04:22, Changli Gao wrote:
>>+++ b/net/ipv4/netfilter/nf_nat_proto_common.c
>>@@ -81,9 +81,9 @@ void nf_nat_proto_unique_tuple(struct nf_conntrack_tuple *tuple,
>>       else
>>               off = *rover;
>>
>>-      for (i = 0; i < range_size; i++, off++) {
>>+      for (i = 0; 1; off++) {
>
> The 1 looks strange. It's more common to express this without
> a condition, as in (i = 0; ; ++off).
>
>

OK, Thanks.

-- 
Regards,
Changli Gao(xiaosuo@gmail.com)
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply

* [PULL REQ] WAN: LMC driver
From: Krzysztof Halasa @ 2010-07-31 14:36 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

David,

I have done a bit of work on the LMC WAN driver. It's still far from
perfection, though I think it's a visible improvement. It merges with
your current "next" tree cleanly. I'll also post the individual patches.
Please pull. Thanks.

The following changes since Linux 2.6.35-rc6 are available in the git
repository at:
  git://git.kernel.org/pub/scm/linux/kernel/git/chris/linux-2.6.git lmc

Krzysztof Hałasa (29):
      LMC: whitespace and cosmetic fixes.
      LMC: Remove "lmc_" prefix from source file names.
      LMC: Remove 3 typedefs.
      LMC: fix initialization messages.
      LMC: Remove non-LMC_PPP modes, everything is already handled by generic HDLC.
      LMC: Remove stub files proto.[ch].
      LMC: Convert media structs to named initializers.
      LMC: Remove "dummy" media functions.
      LMC: shuffle protocol routines to avoid a need for prototypes.
      LMC: Remove empty media functions.
      LMC: Get rid of lmcConsoleLog().
      LMC: Get rid of the event logger.
      LMC: Get rid of debug.[ch].
      LMC: Remove now empty header file lmc.h.
      LMC: lanmedia.com is not functional anymore.
      LMC: Remove unused macros.
      LMC: don't wait in lmc_trace().
      LMC: strip "lmc_" prefix from field names in struct card.
      LMC: Remove sc->check. We don't do such checks in drivers.
      LMC: Remove unused sc->board_idx.
      LMC: I'm sure Linux doesn't swap PCI subsystem device and vendor IDs.
      LMC: Move model logic to media structs.
      LMC: lmc_set_protocol() is effectively a NOP, remove it.
      LMC: Remove unused variables.
      LMC: Remove unneeded prototypes.
      LMC: Remove redundant macro.
      LMC: Remove redundant card->name.
      LMC: Simplify and fix CSR names and logic.
      LMC: Report proper card type before the first dev->open().

 drivers/net/wan/lmc/Makefile    |    4 +-
 drivers/net/wan/lmc/ioctl.h     |  228 +++++
 drivers/net/wan/lmc/lmc.h       |   32 -
 drivers/net/wan/lmc/lmc_debug.c |   82 --
 drivers/net/wan/lmc/lmc_debug.h |   52 -
 drivers/net/wan/lmc/lmc_ioctl.h |  257 -----
 drivers/net/wan/lmc/lmc_main.c  | 2145 ---------------------------------------
 drivers/net/wan/lmc/lmc_media.c | 1211 ----------------------
 drivers/net/wan/lmc/lmc_proto.c |  135 ---
 drivers/net/wan/lmc/lmc_proto.h |   18 -
 drivers/net/wan/lmc/lmc_var.h   |  470 ---------
 drivers/net/wan/lmc/main.c      | 1834 +++++++++++++++++++++++++++++++++
 drivers/net/wan/lmc/media.c     |  944 +++++++++++++++++
 drivers/net/wan/lmc/var.h       |  423 ++++++++
 14 files changed, 3431 insertions(+), 4404 deletions(-)
 create mode 100644 drivers/net/wan/lmc/ioctl.h
 delete mode 100644 drivers/net/wan/lmc/lmc.h
 delete mode 100644 drivers/net/wan/lmc/lmc_debug.c
 delete mode 100644 drivers/net/wan/lmc/lmc_debug.h
 delete mode 100644 drivers/net/wan/lmc/lmc_ioctl.h
 delete mode 100644 drivers/net/wan/lmc/lmc_main.c
 delete mode 100644 drivers/net/wan/lmc/lmc_media.c
 delete mode 100644 drivers/net/wan/lmc/lmc_proto.c
 delete mode 100644 drivers/net/wan/lmc/lmc_proto.h
 delete mode 100644 drivers/net/wan/lmc/lmc_var.h
 create mode 100644 drivers/net/wan/lmc/main.c
 create mode 100644 drivers/net/wan/lmc/media.c
 create mode 100644 drivers/net/wan/lmc/var.h

-- 
Krzysztof Halasa

^ permalink raw reply

* [PATCH 02/29] LMC: Remove "lmc_" prefix from source file names.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/Makefile                 |    4 ++--
 drivers/net/wan/lmc/{lmc_debug.c => debug.c} |    2 +-
 drivers/net/wan/lmc/{lmc_debug.h => debug.h} |    0
 drivers/net/wan/lmc/{lmc_ioctl.h => ioctl.h} |    0
 drivers/net/wan/lmc/lmc.h                    |    2 +-
 drivers/net/wan/lmc/{lmc_main.c => main.c}   |    8 ++++----
 drivers/net/wan/lmc/{lmc_media.c => media.c} |    6 +++---
 drivers/net/wan/lmc/{lmc_proto.c => proto.c} |    8 ++++----
 drivers/net/wan/lmc/{lmc_proto.h => proto.h} |    0
 drivers/net/wan/lmc/{lmc_var.h => var.h}     |    0
 10 files changed, 15 insertions(+), 15 deletions(-)
 rename drivers/net/wan/lmc/{lmc_debug.c => debug.c} (98%)
 rename drivers/net/wan/lmc/{lmc_debug.h => debug.h} (100%)
 rename drivers/net/wan/lmc/{lmc_ioctl.h => ioctl.h} (100%)
 rename drivers/net/wan/lmc/{lmc_main.c => main.c} (99%)
 rename drivers/net/wan/lmc/{lmc_media.c => media.c} (99%)
 rename drivers/net/wan/lmc/{lmc_proto.c => proto.c} (97%)
 rename drivers/net/wan/lmc/{lmc_proto.h => proto.h} (100%)
 rename drivers/net/wan/lmc/{lmc_var.h => var.h} (100%)

diff --git a/drivers/net/wan/lmc/Makefile b/drivers/net/wan/lmc/Makefile
index dabdcfe..2c14b98 100644
--- a/drivers/net/wan/lmc/Makefile
+++ b/drivers/net/wan/lmc/Makefile
@@ -1,11 +1,11 @@
 #
-# Makefile for the Lan Media 21140 based WAN cards
+# Makefile for the Lan Media/SBE 21140-based WAN cards
 # Specifically the 1000,1200,5200,5245
 #
 
 obj-$(CONFIG_LANMEDIA) += lmc.o
 
-lmc-objs := lmc_debug.o lmc_media.o lmc_main.o lmc_proto.o
+lmc-objs := debug.o media.o main.o proto.o
 
 # Like above except every packet gets echoed to KERN_DEBUG
 # in hex
diff --git a/drivers/net/wan/lmc/lmc_debug.c b/drivers/net/wan/lmc/debug.c
similarity index 98%
rename from drivers/net/wan/lmc/lmc_debug.c
rename to drivers/net/wan/lmc/debug.c
index 35a8610..0abae05 100644
--- a/drivers/net/wan/lmc/lmc_debug.c
+++ b/drivers/net/wan/lmc/debug.c
@@ -1,7 +1,7 @@
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/interrupt.h>
-#include "lmc_debug.h"
+#include "debug.h"
 
 /*
  * Prints out len, max to 80 octets using printk, 20 per line
diff --git a/drivers/net/wan/lmc/lmc_debug.h b/drivers/net/wan/lmc/debug.h
similarity index 100%
rename from drivers/net/wan/lmc/lmc_debug.h
rename to drivers/net/wan/lmc/debug.h
diff --git a/drivers/net/wan/lmc/lmc_ioctl.h b/drivers/net/wan/lmc/ioctl.h
similarity index 100%
rename from drivers/net/wan/lmc/lmc_ioctl.h
rename to drivers/net/wan/lmc/ioctl.h
diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h
index 6d3af03..9742650 100644
--- a/drivers/net/wan/lmc/lmc.h
+++ b/drivers/net/wan/lmc/lmc.h
@@ -1,7 +1,7 @@
 #ifndef _LMC_H_
 #define _LMC_H_
 
-#include "lmc_var.h"
+#include "var.h"
 
 int lmc_probe(struct net_device *dev);
 unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned
diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/main.c
similarity index 99%
rename from drivers/net/wan/lmc/lmc_main.c
rename to drivers/net/wan/lmc/main.c
index 3c7f23a..e22aa0c 100644
--- a/drivers/net/wan/lmc/lmc_main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -69,10 +69,10 @@
 #define DRIVER_VERSION  ((DRIVER_MAJOR_VERSION << 8) + DRIVER_MINOR_VERSION)
 
 #include "lmc.h"
-#include "lmc_var.h"
-#include "lmc_ioctl.h"
-#include "lmc_debug.h"
-#include "lmc_proto.h"
+#include "var.h"
+#include "ioctl.h"
+#include "debug.h"
+#include "proto.h"
 
 static int LMC_PKT_BUF_SZ = 1542;
 
diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/media.c
similarity index 99%
rename from drivers/net/wan/lmc/lmc_media.c
rename to drivers/net/wan/lmc/media.c
index a3aa2a0..7a545f8 100644
--- a/drivers/net/wan/lmc/lmc_media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -17,9 +17,9 @@
 #include <asm/processor.h>   /* Processor type for cache alignment. */
 #include <asm/dma.h>
 #include "lmc.h"
-#include "lmc_var.h"
-#include "lmc_ioctl.h"
-#include "lmc_debug.h"
+#include "var.h"
+#include "ioctl.h"
+#include "debug.h"
 
 #define CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE 1
 
diff --git a/drivers/net/wan/lmc/lmc_proto.c b/drivers/net/wan/lmc/proto.c
similarity index 97%
rename from drivers/net/wan/lmc/lmc_proto.c
rename to drivers/net/wan/lmc/proto.c
index ac1fef5..d6c0cc2 100644
--- a/drivers/net/wan/lmc/lmc_proto.c
+++ b/drivers/net/wan/lmc/proto.c
@@ -41,10 +41,10 @@
 #include <linux/smp.h>
 
 #include "lmc.h"
-#include "lmc_var.h"
-#include "lmc_debug.h"
-#include "lmc_ioctl.h"
-#include "lmc_proto.h"
+#include "var.h"
+#include "debug.h"
+#include "ioctl.h"
+#include "proto.h"
 
 void lmc_proto_attach(lmc_softc_t *sc)
 {
diff --git a/drivers/net/wan/lmc/lmc_proto.h b/drivers/net/wan/lmc/proto.h
similarity index 100%
rename from drivers/net/wan/lmc/lmc_proto.h
rename to drivers/net/wan/lmc/proto.h
diff --git a/drivers/net/wan/lmc/lmc_var.h b/drivers/net/wan/lmc/var.h
similarity index 100%
rename from drivers/net/wan/lmc/lmc_var.h
rename to drivers/net/wan/lmc/var.h
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 04/29] LMC: fix initialization messages.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/main.c |   15 ++++++---------
 1 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index 4fa75ad..63297a5 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -837,12 +837,9 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 	spin_lock_init(&sc->lmc_lock);
 	pci_set_master(pdev);
 
-	printk(KERN_INFO "%s: detected at %lx, irq %d\n", dev->name,
-	       dev->base_addr, dev->irq);
-
 	err = register_hdlc_device(dev);
 	if (err) {
-		printk(KERN_ERR "%s: register_netdev failed.\n", dev->name);
+		dev_err(&pdev->dev, "lmc: register_hdlc_device() failed.\n");
 		free_netdev(dev);
 		goto err_hdlcdev;
 	}
@@ -860,27 +857,27 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 
 	switch (subdevice) {
 	case PCI_DEVICE_ID_LMC_HSSI:
-		printk(KERN_INFO "%s: LMC HSSI\n", dev->name);
+		dev_info(&pdev->dev, "%s = LMC HSSI\n", dev->name);
 		sc->lmc_cardtype = LMC_CARDTYPE_HSSI;
 		sc->lmc_media = &lmc_hssi_media;
 		break;
 	case PCI_DEVICE_ID_LMC_DS3:
-		printk(KERN_INFO "%s: LMC DS3\n", dev->name);
+		dev_info(&pdev->dev, "%s = LMC DS3\n", dev->name);
 		sc->lmc_cardtype = LMC_CARDTYPE_DS3;
 		sc->lmc_media = &lmc_ds3_media;
 		break;
 	case PCI_DEVICE_ID_LMC_SSI:
-		printk(KERN_INFO "%s: LMC SSI\n", dev->name);
+		dev_info(&pdev->dev, "%s = LMC SSI\n", dev->name);
 		sc->lmc_cardtype = LMC_CARDTYPE_SSI;
 		sc->lmc_media = &lmc_ssi_media;
 		break;
 	case PCI_DEVICE_ID_LMC_T1:
-		printk(KERN_INFO "%s: LMC T1\n", dev->name);
+		dev_info(&pdev->dev, "%s = LMC T1\n", dev->name);
 		sc->lmc_cardtype = LMC_CARDTYPE_T1;
 		sc->lmc_media = &lmc_t1_media;
 		break;
 	default:
-		printk(KERN_WARNING "%s: LMC UNKNOWN CARD!\n", dev->name);
+		dev_warn(&pdev->dev, "%s = LMC UNKNOWN CARD!\n", dev->name);
 		break;
 	}
 
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 05/29] LMC: Remove non-LMC_PPP modes, everything is already handled by generic HDLC.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/main.c  |   31 ------------------------
 drivers/net/wan/lmc/proto.c |   55 ++++++------------------------------------
 drivers/net/wan/lmc/var.h   |    1 -
 3 files changed, 8 insertions(+), 79 deletions(-)

diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index 63297a5..a6de32f 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -161,36 +161,6 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 		ret = 0;
 		break;
 
-	case LMCIOCIFTYPE:
-	{
-		u16 old_type = sc->if_type;
-		u16 new_type;
-
-		if (!capable(CAP_NET_ADMIN)) {
-			ret = -EPERM;
-			break;
-		}
-
-		if (copy_from_user(&new_type, ifr->ifr_data, sizeof(u16))) {
-			ret = -EFAULT;
-			break;
-		}
-
-		if (new_type == old_type) {
-			ret = 0 ;
-			break;				/* no change */
-		}
-
-		spin_lock_irqsave(&sc->lmc_lock, flags);
-		lmc_proto_close(sc);
-
-		sc->if_type = new_type;
-		lmc_proto_attach(sc);
-		ret = lmc_proto_open(sc);
-		spin_unlock_irqrestore(&sc->lmc_lock, flags);
-		break;
-	}
-
 	case LMCIOCGETXINFO:
 		spin_lock_irqsave(&sc->lmc_lock, flags);
 		sc->lmc_xinfo.Magic0 = 0xBEEFCAFE;
@@ -819,7 +789,6 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 	dev->tx_queue_len = 100;
 	sc->lmc_device = dev;
 	sc->name = dev->name;
-	sc->if_type = LMC_PPP;
 	sc->check = 0xBEAFCAFE;
 	dev->base_addr = pci_resource_start(pdev, 0);
 	dev->irq = pdev->irq;
diff --git a/drivers/net/wan/lmc/proto.c b/drivers/net/wan/lmc/proto.c
index 547c8d8..ffd952a 100644
--- a/drivers/net/wan/lmc/proto.c
+++ b/drivers/net/wan/lmc/proto.c
@@ -49,22 +49,13 @@
 void lmc_proto_attach(struct card *sc)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_attach in");
-	if (sc->if_type == LMC_NET) {
-		struct net_device *dev = sc->lmc_device;
-		/* They set a few basics because they don't use HDLC */
-		dev->flags |= IFF_POINTOPOINT;
-		dev->hard_header_len = 0;
-		dev->addr_len = 0;
-	}
 	lmc_trace(sc->lmc_device, "lmc_proto_attach out");
 }
 
 int lmc_proto_ioctl(struct card *sc, struct ifreq *ifr, int cmd)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_ioctl");
-	if (sc->if_type == LMC_PPP)
-		return hdlc_ioctl(sc->lmc_device, ifr, cmd);
-	return -EOPNOTSUPP;
+	return hdlc_ioctl(sc->lmc_device, ifr, cmd);
 }
 
 int lmc_proto_open(struct card *sc)
@@ -73,12 +64,10 @@ int lmc_proto_open(struct card *sc)
 
 	lmc_trace(sc->lmc_device, "lmc_proto_open in");
 
-	if (sc->if_type == LMC_PPP) {
-		ret = hdlc_open(sc->lmc_device);
-		if (ret < 0)
-			printk(KERN_WARNING "%s: HDLC open failed: %d\n",
-			       sc->name, ret);
-	}
+	ret = hdlc_open(sc->lmc_device);
+	if (ret < 0)
+		printk(KERN_WARNING "%s: HDLC open failed: %d\n",
+		       sc->name, ret);
 
 	lmc_trace(sc->lmc_device, "lmc_proto_open out");
 	return ret;
@@ -87,48 +76,20 @@ int lmc_proto_open(struct card *sc)
 void lmc_proto_close(struct card *sc)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_close in");
-
-	if (sc->if_type == LMC_PPP)
-		hdlc_close(sc->lmc_device);
-
+	hdlc_close(sc->lmc_device);
 	lmc_trace(sc->lmc_device, "lmc_proto_close out");
 }
 
 __be16 lmc_proto_type(struct card *sc, struct sk_buff *skb)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_type in");
-	switch (sc->if_type) {
-	case LMC_PPP:
-		return hdlc_type_trans(skb, sc->lmc_device);
-		break;
-	case LMC_NET:
-		return htons(ETH_P_802_2);
-		break;
-	case LMC_RAW: /* Packet type for skbuff kind of useless */
-		return htons(ETH_P_802_2);
-		break;
-	default:
-		printk(KERN_WARNING
-		       "%s: No protocol set for this interface, assuming 802.2 (which is wrong!!)\n",
-		       sc->name);
-		return htons(ETH_P_802_2);
-		break;
-	}
+	return hdlc_type_trans(skb, sc->lmc_device);
 	lmc_trace(sc->lmc_device, "lmc_proto_tye out");
-
 }
 
 void lmc_proto_netif(struct card *sc, struct sk_buff *skb)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_netif in");
-	switch (sc->if_type) {
-	case LMC_PPP:
-	case LMC_NET:
-	default:
-		netif_rx(skb);
-		break;
-	case LMC_RAW:
-		break;
-	}
+	netif_rx(skb);
 	lmc_trace(sc->lmc_device, "lmc_proto_netif out");
 }
diff --git a/drivers/net/wan/lmc/var.h b/drivers/net/wan/lmc/var.h
index e9aad37..b889bf6 100644
--- a/drivers/net/wan/lmc/var.h
+++ b/drivers/net/wan/lmc/var.h
@@ -321,7 +321,6 @@ struct card {
 	u32 num_int;
 
 	spinlock_t lmc_lock;
-	u16 if_type;			/* HDLC/PPP or NET */
 
 	u8 failed_ring;			/* Failure cases */
 	u8 failed_recv_alloc;
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 03/29] LMC: Remove 3 typedefs.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/lmc.h   |   27 +++----
 drivers/net/wan/lmc/main.c  |   63 ++++++++--------
 drivers/net/wan/lmc/media.c |  178 +++++++++++++++++++++---------------------
 drivers/net/wan/lmc/proto.c |   12 ++--
 drivers/net/wan/lmc/proto.h |   16 ++--
 drivers/net/wan/lmc/var.h   |   43 +++++------
 6 files changed, 168 insertions(+), 171 deletions(-)

diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h
index 9742650..c3464b6 100644
--- a/drivers/net/wan/lmc/lmc.h
+++ b/drivers/net/wan/lmc/lmc.h
@@ -4,23 +4,22 @@
 #include "var.h"
 
 int lmc_probe(struct net_device *dev);
-unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned
-			 devaddr, unsigned regno);
-void lmc_mii_writereg(lmc_softc_t * const sc, unsigned devaddr,
+unsigned lmc_mii_readreg(struct card * const sc, unsigned devaddr,
+			 unsigned regno);
+void lmc_mii_writereg(struct card * const sc, unsigned devaddr,
 		      unsigned regno, unsigned data);
-void lmc_led_on(lmc_softc_t * const, u32);
-void lmc_led_off(lmc_softc_t * const, u32);
-unsigned lmc_mii_readreg(lmc_softc_t * const, unsigned, unsigned);
-void lmc_mii_writereg(lmc_softc_t * const, unsigned, unsigned, unsigned);
-void lmc_gpio_mkinput(lmc_softc_t * const sc, u32 bits);
-void lmc_gpio_mkoutput(lmc_softc_t * const sc, u32 bits);
-
+void lmc_led_on(struct card * const, u32);
+void lmc_led_off(struct card * const, u32);
+unsigned lmc_mii_readreg(struct card * const, unsigned, unsigned);
+void lmc_mii_writereg(struct card * const, unsigned, unsigned, unsigned);
+void lmc_gpio_mkinput(struct card * const sc, u32 bits);
+void lmc_gpio_mkoutput(struct card * const sc, u32 bits);
 int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
 
-extern lmc_media_t lmc_ds3_media;
-extern lmc_media_t lmc_ssi_media;
-extern lmc_media_t lmc_t1_media;
-extern lmc_media_t lmc_hssi_media;
+extern struct media lmc_ds3_media;
+extern struct media lmc_ssi_media;
+extern struct media lmc_t1_media;
+extern struct media lmc_hssi_media;
 
 #ifdef _DBG_EVENTLOG
 static void lmcEventLog(u32 EventNum, u32 arg2, u32 arg3);
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index e22aa0c..4fa75ad 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -94,22 +94,22 @@ static int lmc_open(struct net_device *dev);
 static int lmc_close(struct net_device *dev);
 static struct net_device_stats *lmc_get_stats(struct net_device *dev);
 static irqreturn_t lmc_interrupt(int irq, void *dev_instance);
-static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,
+static void lmc_initcsrs(struct card * const sc, lmc_csrptr_t csr_base,
 			 size_t csr_size);
-static void lmc_softreset(lmc_softc_t * const);
+static void lmc_softreset(struct card * const);
 static void lmc_running_reset(struct net_device *dev);
 static int lmc_ifdown(struct net_device * const);
 static void lmc_watchdog(unsigned long data);
-static void lmc_reset(lmc_softc_t * const sc);
-static void lmc_dec_reset(lmc_softc_t * const sc);
+static void lmc_reset(struct card * const sc);
+static void lmc_dec_reset(struct card * const sc);
 static void lmc_driver_timeout(struct net_device *dev);
 
 /* linux reserves 16 device specific IOCTLs.  We call them
    LMCIOC* to control various bits of our world. */
 int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
-	lmc_ctl_t ctl;
+	struct card *sc = dev_to_sc(dev);
+	struct control ctl;
 	int ret = -EOPNOTSUPP;
 	u16 regVal;
 	unsigned long flags;
@@ -123,7 +123,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 		/* Return current driver state.  Since we keep this up
 		   To date internally, just copy this out to the user. */
 	case LMCIOCGINFO:
-		if (copy_to_user(ifr->ifr_data, &sc->ictl, sizeof(lmc_ctl_t)))
+		if (copy_to_user(ifr->ifr_data, &sc->ictl, sizeof(struct control)))
 			ret = -EFAULT;
 		else
 			ret = 0;
@@ -140,7 +140,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 			break;
 		}
 
-		if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
+		if (copy_from_user(&ctl, ifr->ifr_data, sizeof(struct control))) {
 			ret = -EFAULT;
 			break;
 		}
@@ -280,7 +280,8 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 			break;
 		}
 
-		if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
+		if (copy_from_user(&ctl, ifr->ifr_data,
+				   sizeof(struct control))) {
 			ret = -EFAULT;
 			break;
 		}
@@ -608,7 +609,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 static void lmc_watchdog(unsigned long data)
 {
 	struct net_device *dev = (struct net_device *)data;
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	int link_status;
 	u32 ticks;
 	unsigned long flags;
@@ -773,7 +774,7 @@ static const struct net_device_ops lmc_ops = {
 static int __devinit lmc_init_one(struct pci_dev *pdev,
 				  const struct pci_device_id *ent)
 {
-	lmc_softc_t *sc;
+	struct card *sc;
 	struct net_device *dev;
 	u16 subdevice;
 	u16 AdapModelNum;
@@ -797,7 +798,7 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 	/*
 	 * Allocate our own device structure
 	 */
-	sc = kzalloc(sizeof(lmc_softc_t), GFP_KERNEL);
+	sc = kzalloc(sizeof(struct card), GFP_KERNEL);
 	if (!sc) {
 		err = -ENOMEM;
 		goto err_kzalloc;
@@ -952,7 +953,7 @@ static void __devexit lmc_remove_one(struct pci_dev *pdev)
    the addresses */
 static int lmc_open(struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	int err;
 
 	lmc_trace(dev, "lmc_open in");
@@ -1050,7 +1051,7 @@ static int lmc_open(struct net_device *dev)
 
 static void lmc_running_reset(struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 
 	lmc_trace(dev, "lmc_runnig_reset in");
 
@@ -1085,7 +1086,7 @@ static void lmc_running_reset(struct net_device *dev)
 static int lmc_close(struct net_device *dev)
 {
 	/* not calling release_region() as we should */
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 
 	lmc_trace(dev, "lmc_close in");
 
@@ -1104,7 +1105,7 @@ static int lmc_close(struct net_device *dev)
    When the interface goes down, this is called */
 static int lmc_ifdown(struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	u32 csr6;
 	int i;
 
@@ -1167,7 +1168,7 @@ static int lmc_ifdown(struct net_device *dev)
 static irqreturn_t lmc_interrupt(int irq, void *dev_instance)
 {
 	struct net_device *dev = (struct net_device *) dev_instance;
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	u32 csr;
 	int i;
 	s32 stat;
@@ -1342,7 +1343,7 @@ lmc_int_fail_out:
 static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 					struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	u32 flag;
 	int entry;
 	unsigned long flags;
@@ -1421,7 +1422,7 @@ static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 
 static int lmc_rx(struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	int i;
 	int rx_work_limit = LMC_RXDESCS;
 	unsigned int next_rx;
@@ -1606,7 +1607,7 @@ skip_out_of_mem:
 
 static struct net_device_stats *lmc_get_stats(struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	unsigned long flags;
 
 	lmc_trace(dev, "lmc_get_stats in");
@@ -1642,7 +1643,7 @@ static void __exit exit_lmc(void)
 module_init(init_lmc);
 module_exit(exit_lmc);
 
-unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned devaddr,
+unsigned lmc_mii_readreg(struct card * const sc, unsigned devaddr,
 			 unsigned regno)
 {
 	int i;
@@ -1684,7 +1685,7 @@ unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned devaddr,
 	return (retval >> 1) & 0xffff;
 }
 
-void lmc_mii_writereg(lmc_softc_t * const sc, unsigned devaddr, unsigned regno,
+void lmc_mii_writereg(struct card * const sc, unsigned devaddr, unsigned regno,
 		      unsigned data)
 {
 	int i = 32;
@@ -1726,7 +1727,7 @@ void lmc_mii_writereg(lmc_softc_t * const sc, unsigned devaddr, unsigned regno,
 	lmc_trace(sc->lmc_device, "lmc_mii_writereg out");
 }
 
-static void lmc_softreset(lmc_softc_t * const sc)
+static void lmc_softreset(struct card * const sc)
 {
 	int i;
 
@@ -1805,7 +1806,7 @@ static void lmc_softreset(lmc_softc_t * const sc)
 	lmc_trace(sc->lmc_device, "lmc_softreset out");
 }
 
-void lmc_gpio_mkinput(lmc_softc_t * const sc, u32 bits)
+void lmc_gpio_mkinput(struct card * const sc, u32 bits)
 {
 	lmc_trace(sc->lmc_device, "lmc_gpio_mkinput in");
 	sc->lmc_gpio_io &= ~bits;
@@ -1813,7 +1814,7 @@ void lmc_gpio_mkinput(lmc_softc_t * const sc, u32 bits)
 	lmc_trace(sc->lmc_device, "lmc_gpio_mkinput out");
 }
 
-void lmc_gpio_mkoutput(lmc_softc_t * const sc, u32 bits)
+void lmc_gpio_mkoutput(struct card * const sc, u32 bits)
 {
 	lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput in");
 	sc->lmc_gpio_io |= bits;
@@ -1821,7 +1822,7 @@ void lmc_gpio_mkoutput(lmc_softc_t * const sc, u32 bits)
 	lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput out");
 }
 
-void lmc_led_on(lmc_softc_t * const sc, u32 led)
+void lmc_led_on(struct card * const sc, u32 led)
 {
 	lmc_trace(sc->lmc_device, "lmc_led_on in");
 	if ((~sc->lmc_miireg16) & led) { /* Already on! */
@@ -1834,7 +1835,7 @@ void lmc_led_on(lmc_softc_t * const sc, u32 led)
 	lmc_trace(sc->lmc_device, "lmc_led_on out");
 }
 
-void lmc_led_off(lmc_softc_t * const sc, u32 led)
+void lmc_led_off(struct card * const sc, u32 led)
 {
 	lmc_trace(sc->lmc_device, "lmc_led_off in");
 	if (sc->lmc_miireg16 & led) { /* Already set don't do anything */
@@ -1847,7 +1848,7 @@ void lmc_led_off(lmc_softc_t * const sc, u32 led)
 	lmc_trace(sc->lmc_device, "lmc_led_off out");
 }
 
-static void lmc_reset(lmc_softc_t * const sc)
+static void lmc_reset(struct card * const sc)
 {
 	lmc_trace(sc->lmc_device, "lmc_reset in");
 	sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
@@ -1877,7 +1878,7 @@ static void lmc_reset(lmc_softc_t * const sc)
 	lmc_trace(sc->lmc_device, "lmc_reset out");
 }
 
-static void lmc_dec_reset(lmc_softc_t * const sc)
+static void lmc_dec_reset(struct card * const sc)
 {
 	u32 val;
 	lmc_trace(sc->lmc_device, "lmc_dec_reset in");
@@ -1926,7 +1927,7 @@ static void lmc_dec_reset(lmc_softc_t * const sc)
 	lmc_trace(sc->lmc_device, "lmc_dec_reset out");
 }
 
-static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,
+static void lmc_initcsrs(struct card * const sc, lmc_csrptr_t csr_base,
 			 size_t csr_size)
 {
 	lmc_trace(sc->lmc_device, "lmc_initcsrs in");
@@ -1951,7 +1952,7 @@ static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,
 
 static void lmc_driver_timeout(struct net_device *dev)
 {
-	lmc_softc_t *sc = dev_to_sc(dev);
+	struct card *sc = dev_to_sc(dev);
 	u32 csr6;
 	unsigned long flags;
 
diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 7a545f8..8e236b0 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -38,53 +38,53 @@
  */
 
 /* protocol independent method. */
-static void lmc_set_protocol(lmc_softc_t * const, lmc_ctl_t *);
+static void lmc_set_protocol(struct card * const, struct control *);
 
 /* media independent methods to check on media status, link, light LEDs, etc. */
-static void lmc_ds3_init(lmc_softc_t * const);
-static void lmc_ds3_default(lmc_softc_t * const);
-static void lmc_ds3_set_status(lmc_softc_t * const, lmc_ctl_t *);
-static void lmc_ds3_set_100ft(lmc_softc_t * const, int);
-static int lmc_ds3_get_link_status(lmc_softc_t * const);
-static void lmc_ds3_set_crc_length(lmc_softc_t * const, int);
-static void lmc_ds3_set_scram(lmc_softc_t * const, int);
-static void lmc_ds3_watchdog(lmc_softc_t * const);
-
-static void lmc_hssi_init(lmc_softc_t * const);
-static void lmc_hssi_default(lmc_softc_t * const);
-static void lmc_hssi_set_status(lmc_softc_t * const, lmc_ctl_t *);
-static void lmc_hssi_set_clock(lmc_softc_t * const, int);
-static int lmc_hssi_get_link_status(lmc_softc_t * const);
-static void lmc_hssi_set_link_status(lmc_softc_t * const, int);
-static void lmc_hssi_set_crc_length(lmc_softc_t * const, int);
-static void lmc_hssi_watchdog(lmc_softc_t * const);
-
-static void lmc_ssi_init(lmc_softc_t * const);
-static void lmc_ssi_default(lmc_softc_t * const);
-static void lmc_ssi_set_status(lmc_softc_t * const, lmc_ctl_t *);
-static void lmc_ssi_set_clock(lmc_softc_t * const, int);
-static void lmc_ssi_set_speed(lmc_softc_t * const, lmc_ctl_t *);
-static int lmc_ssi_get_link_status(lmc_softc_t * const);
-static void lmc_ssi_set_link_status(lmc_softc_t * const, int);
-static void lmc_ssi_set_crc_length(lmc_softc_t * const, int);
-static void lmc_ssi_watchdog(lmc_softc_t * const);
-
-static void lmc_t1_init(lmc_softc_t * const);
-static void lmc_t1_default(lmc_softc_t * const);
-static void lmc_t1_set_status(lmc_softc_t * const, lmc_ctl_t *);
-static int lmc_t1_get_link_status(lmc_softc_t * const);
-static void lmc_t1_set_circuit_type(lmc_softc_t * const, int);
-static void lmc_t1_set_crc_length(lmc_softc_t * const, int);
-static void lmc_t1_set_clock(lmc_softc_t * const, int);
-static void lmc_t1_watchdog(lmc_softc_t * const);
-
-static void lmc_dummy_set_1(lmc_softc_t * const, int);
-static void lmc_dummy_set2_1(lmc_softc_t * const, lmc_ctl_t *);
-
-static inline void write_av9110_bit(lmc_softc_t *, int);
-static void write_av9110(lmc_softc_t *, u32, u32, u32, u32, u32);
-
-lmc_media_t lmc_ds3_media = {
+static void lmc_ds3_init(struct card * const);
+static void lmc_ds3_default(struct card * const);
+static void lmc_ds3_set_status(struct card * const, struct control *);
+static void lmc_ds3_set_100ft(struct card * const, int);
+static int lmc_ds3_get_link_status(struct card * const);
+static void lmc_ds3_set_crc_length(struct card * const, int);
+static void lmc_ds3_set_scram(struct card * const, int);
+static void lmc_ds3_watchdog(struct card * const);
+
+static void lmc_hssi_init(struct card * const);
+static void lmc_hssi_default(struct card * const);
+static void lmc_hssi_set_status(struct card * const, struct control *);
+static void lmc_hssi_set_clock(struct card * const, int);
+static int lmc_hssi_get_link_status(struct card * const);
+static void lmc_hssi_set_link_status(struct card * const, int);
+static void lmc_hssi_set_crc_length(struct card * const, int);
+static void lmc_hssi_watchdog(struct card * const);
+
+static void lmc_ssi_init(struct card * const);
+static void lmc_ssi_default(struct card * const);
+static void lmc_ssi_set_status(struct card * const, struct control *);
+static void lmc_ssi_set_clock(struct card * const, int);
+static void lmc_ssi_set_speed(struct card * const, struct control *);
+static int lmc_ssi_get_link_status(struct card * const);
+static void lmc_ssi_set_link_status(struct card * const, int);
+static void lmc_ssi_set_crc_length(struct card * const, int);
+static void lmc_ssi_watchdog(struct card * const);
+
+static void lmc_t1_init(struct card * const);
+static void lmc_t1_default(struct card * const);
+static void lmc_t1_set_status(struct card * const, struct control *);
+static int lmc_t1_get_link_status(struct card * const);
+static void lmc_t1_set_circuit_type(struct card * const, int);
+static void lmc_t1_set_crc_length(struct card * const, int);
+static void lmc_t1_set_clock(struct card * const, int);
+static void lmc_t1_watchdog(struct card * const);
+
+static void lmc_dummy_set_1(struct card * const, int);
+static void lmc_dummy_set2_1(struct card * const, struct control *);
+
+static inline void write_av9110_bit(struct card *, int);
+static void write_av9110(struct card *, u32, u32, u32, u32, u32);
+
+struct media lmc_ds3_media = {
 	lmc_ds3_init,		/* special media init stuff */
 	lmc_ds3_default,	/* reset to default state */
 	lmc_ds3_set_status,	/* reset status to state provided */
@@ -99,7 +99,7 @@ lmc_media_t lmc_ds3_media = {
 	lmc_ds3_watchdog
 };
 
-lmc_media_t lmc_hssi_media = {
+struct media lmc_hssi_media = {
 	lmc_hssi_init,		/* special media init stuff */
 	lmc_hssi_default,	/* reset to default state */
 	lmc_hssi_set_status,	/* reset status to state provided */
@@ -114,7 +114,7 @@ lmc_media_t lmc_hssi_media = {
 	lmc_hssi_watchdog
 };
 
-lmc_media_t lmc_ssi_media = {
+struct media lmc_ssi_media = {
 	lmc_ssi_init,		/* special media init stuff */
 	lmc_ssi_default,	/* reset to default state */
 	lmc_ssi_set_status,	/* reset status to state provided */
@@ -129,7 +129,7 @@ lmc_media_t lmc_ssi_media = {
 	lmc_ssi_watchdog
 };
 
-lmc_media_t lmc_t1_media = {
+struct media lmc_t1_media = {
 	lmc_t1_init,		/* special media init stuff */
 	lmc_t1_default,		/* reset to default state */
 	lmc_t1_set_status,	/* reset status to state provided */
@@ -144,23 +144,23 @@ lmc_media_t lmc_t1_media = {
 	lmc_t1_watchdog
 };
 
-static void lmc_dummy_set_1(lmc_softc_t * const sc, int a)
+static void lmc_dummy_set_1(struct card * const sc, int a)
 {
 }
 
-static void lmc_dummy_set2_1(lmc_softc_t * const sc, lmc_ctl_t * a)
+static void lmc_dummy_set2_1(struct card * const sc, struct control * a)
 {
 }
 
 /* HSSI methods */
 
-static void lmc_hssi_init(lmc_softc_t * const sc)
+static void lmc_hssi_init(struct card * const sc)
 {
 	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5200;
 	lmc_gpio_mkoutput(sc, LMC_GEP_HSSI_CLOCK);
 }
 
-static void lmc_hssi_default(lmc_softc_t * const sc)
+static void lmc_hssi_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
@@ -171,7 +171,7 @@ static void lmc_hssi_default(lmc_softc_t * const sc)
 
 /* Given a user provided state, set ourselves up to match it.
    This will always reset the card if needed. */
-static void lmc_hssi_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_hssi_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
 		sc->lmc_media->set_clock_source(sc, sc->ictl.clock_source);
@@ -193,7 +193,7 @@ static void lmc_hssi_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 }
 
 /* 1 == internal, 0 == external */
-static void lmc_hssi_set_clock(lmc_softc_t * const sc, int ie)
+static void lmc_hssi_set_clock(struct card * const sc, int ie)
 {
 	int old;
 	old = sc->ictl.clock_source;
@@ -215,14 +215,14 @@ static void lmc_hssi_set_clock(lmc_softc_t * const sc, int ie)
 }
 
 /* Return hardware link status. 0 == link is down, 1 == link is up. */
-static int lmc_hssi_get_link_status(lmc_softc_t * const sc)
+static int lmc_hssi_get_link_status(struct card * const sc)
 {
 	/* We're using the same code as SSI since they're practically
 	   the same */
 	return lmc_ssi_get_link_status(sc);
 }
 
-static void lmc_hssi_set_link_status(lmc_softc_t * const sc, int state)
+static void lmc_hssi_set_link_status(struct card * const sc, int state)
 {
 	if (state == LMC_LINK_UP)
 		sc->lmc_miireg16 |= LMC_MII16_HSSI_TA;
@@ -233,7 +233,7 @@ static void lmc_hssi_set_link_status(lmc_softc_t * const sc, int state)
 }
 
 /* 0 == 16bit, 1 == 32bit */
-static void lmc_hssi_set_crc_length(lmc_softc_t * const sc, int state)
+static void lmc_hssi_set_crc_length(struct card * const sc, int state)
 {
 	if (state == LMC_CTL_CRC_LENGTH_32) {
 		/* 32 bit */
@@ -248,7 +248,7 @@ static void lmc_hssi_set_crc_length(lmc_softc_t * const sc, int state)
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void lmc_hssi_watchdog(lmc_softc_t * const sc)
+static void lmc_hssi_watchdog(struct card * const sc)
 {
 	/* HSSI is blank */
 }
@@ -256,7 +256,7 @@ static void lmc_hssi_watchdog(lmc_softc_t * const sc)
 /* DS3 methods */
 
 /* Set cable length */
-static void lmc_ds3_set_100ft(lmc_softc_t * const sc, int ie)
+static void lmc_ds3_set_100ft(struct card * const sc, int ie)
 {
 	if (ie == LMC_CTL_CABLE_LENGTH_GT_100FT) {
 		sc->lmc_miireg16 &= ~LMC_MII16_DS3_ZERO;
@@ -268,7 +268,7 @@ static void lmc_ds3_set_100ft(lmc_softc_t * const sc, int ie)
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void lmc_ds3_default(lmc_softc_t * const sc)
+static void lmc_ds3_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
@@ -280,7 +280,7 @@ static void lmc_ds3_default(lmc_softc_t * const sc)
 
 /* Given a user provided state, set ourselves up to match it.
    This will always reset the card if needed. */
-static void lmc_ds3_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_ds3_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
 		sc->lmc_media->set_cable_length(sc, sc->ictl.cable_length);
@@ -304,7 +304,7 @@ static void lmc_ds3_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 	lmc_set_protocol(sc, ctl);
 }
 
-static void lmc_ds3_init(lmc_softc_t * const sc)
+static void lmc_ds3_init(struct card * const sc)
 {
 	int i;
 
@@ -334,7 +334,7 @@ static void lmc_ds3_init(lmc_softc_t * const sc)
 }
 
 /* 1 == DS3 payload scrambled, 0 == not scrambled */
-static void lmc_ds3_set_scram(lmc_softc_t * const sc, int ie)
+static void lmc_ds3_set_scram(struct card * const sc, int ie)
 {
 	if (ie == LMC_CTL_ON) {
 		sc->lmc_miireg16 |= LMC_MII16_DS3_SCRAM;
@@ -347,7 +347,7 @@ static void lmc_ds3_set_scram(lmc_softc_t * const sc, int ie)
 }
 
 /* Return hardware link status. 0 == link is down, 1 == link is up. */
-static int lmc_ds3_get_link_status(lmc_softc_t * const sc)
+static int lmc_ds3_get_link_status(struct card * const sc)
 {
 	u16 link_status, link_status_11;
 	int ret = 1;
@@ -436,7 +436,7 @@ static int lmc_ds3_get_link_status(lmc_softc_t * const sc)
 }
 
 /* 0 == 16bit, 1 == 32bit */
-static void lmc_ds3_set_crc_length(lmc_softc_t * const sc, int state)
+static void lmc_ds3_set_crc_length(struct card * const sc, int state)
 {
 	if (state == LMC_CTL_CRC_LENGTH_32) {
 		/* 32 bit */
@@ -451,14 +451,14 @@ static void lmc_ds3_set_crc_length(lmc_softc_t * const sc, int state)
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void lmc_ds3_watchdog(lmc_softc_t * const sc)
+static void lmc_ds3_watchdog(struct card * const sc)
 {
 }
 
 
 /* SSI methods */
 
-static void lmc_ssi_init(lmc_softc_t * const sc)
+static void lmc_ssi_init(struct card * const sc)
 {
 	u16 mii17;
 	int cable;
@@ -473,7 +473,7 @@ static void lmc_ssi_init(lmc_softc_t * const sc)
 	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
 }
 
-static void lmc_ssi_default(lmc_softc_t * const sc)
+static void lmc_ssi_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
@@ -488,7 +488,7 @@ static void lmc_ssi_default(lmc_softc_t * const sc)
 
 /* Given a user provided state, set ourselves up to match it.
    This will always reset the card if needed. */
-static void lmc_ssi_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_ssi_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
 		sc->lmc_media->set_clock_source(sc, sc->ictl.clock_source);
@@ -515,7 +515,7 @@ static void lmc_ssi_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 }
 
 /* 1 == internal, 0 == external */
-static void lmc_ssi_set_clock(lmc_softc_t * const sc, int ie)
+static void lmc_ssi_set_clock(struct card * const sc, int ie)
 {
 	int old;
 	old = ie;
@@ -536,9 +536,9 @@ static void lmc_ssi_set_clock(lmc_softc_t * const sc, int ie)
 	}
 }
 
-static void lmc_ssi_set_speed(lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_ssi_set_speed(struct card * const sc, struct control *ctl)
 {
-	lmc_ctl_t *ictl = &sc->ictl;
+	struct control *ictl = &sc->ictl;
 	lmc_av9110_t *av;
 
 	/* original settings for clock rate of 100 Khz (8,25,0,0,2) were
@@ -570,7 +570,7 @@ static void lmc_ssi_set_speed(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 }
 
 /* Return hardware link status. 0 == link is down, 1 == link is up. */
-static int lmc_ssi_get_link_status(lmc_softc_t * const sc)
+static int lmc_ssi_get_link_status(struct card * const sc)
 {
 	u16 link_status;
 	u32 ticks;
@@ -649,7 +649,7 @@ static int lmc_ssi_get_link_status(lmc_softc_t * const sc)
 	return ret;
 }
 
-static void lmc_ssi_set_link_status(lmc_softc_t * const sc, int state)
+static void lmc_ssi_set_link_status(struct card * const sc, int state)
 {
 	if (state == LMC_LINK_UP) {
 		sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
@@ -666,7 +666,7 @@ static void lmc_ssi_set_link_status(lmc_softc_t * const sc, int state)
 }
 
 /* 0 == 16bit, 1 == 32bit */
-static void lmc_ssi_set_crc_length(lmc_softc_t * const sc, int state)
+static void lmc_ssi_set_crc_length(struct card * const sc, int state)
 {
 	if (state == LMC_CTL_CRC_LENGTH_32) {
 		/* 32 bit */
@@ -685,7 +685,7 @@ static void lmc_ssi_set_crc_length(lmc_softc_t * const sc, int state)
 }
 
 /* These are bits to program the ssi frequency generator */
-static inline void write_av9110_bit(lmc_softc_t *sc, int c)
+static inline void write_av9110_bit(struct card *sc, int c)
 {
 	/* set the data bit as we need it. */
 	sc->lmc_gpio &= ~(LMC_GEP_CLK);
@@ -704,7 +704,7 @@ static inline void write_av9110_bit(lmc_softc_t *sc, int c)
 	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
 }
 
-static void write_av9110(lmc_softc_t *sc, u32 n, u32 m, u32 v, u32 x, u32 r)
+static void write_av9110(struct card *sc, u32 n, u32 m, u32 v, u32 x, u32 r)
 {
 	int i;
 
@@ -743,7 +743,7 @@ static void write_av9110(lmc_softc_t *sc, u32 n, u32 m, u32 v, u32 x, u32 r)
 			      LMC_GEP_SSI_GENERATOR));
 }
 
-static void lmc_ssi_watchdog(lmc_softc_t * const sc)
+static void lmc_ssi_watchdog(struct card * const sc)
 {
 	u16 mii17 = lmc_mii_readreg(sc, 0, 17);
 	if (((mii17 >> 3) & 7) == 7)
@@ -756,14 +756,14 @@ static void lmc_ssi_watchdog(lmc_softc_t * const sc)
 
 /* The framer regs are multiplexed through MII regs 17 & 18 write the register
    address to MII reg 17 and the data to MII reg 18. */
-static void lmc_t1_write(lmc_softc_t * const sc, int a, int d)
+static void lmc_t1_write(struct card * const sc, int a, int d)
 {
 	lmc_mii_writereg(sc, 0, 17, a);
 	lmc_mii_writereg(sc, 0, 18, d);
 }
 
 /* Save a warning
-static int lmc_t1_read(lmc_softc_t * const sc, int a)
+static int lmc_t1_read(struct card * const sc, int a)
 {
 	lmc_mii_writereg(sc, 0, 17, a);
 	return lmc_mii_readreg(sc, 0, 18);
@@ -771,7 +771,7 @@ static int lmc_t1_read(lmc_softc_t * const sc, int a)
 */
 
 
-static void lmc_t1_init(lmc_softc_t * const sc)
+static void lmc_t1_init(struct card * const sc)
 {
 	u16 mii16;
 	int i;
@@ -830,7 +830,7 @@ static void lmc_t1_init(lmc_softc_t * const sc)
 	sc->lmc_miireg16 = mii16;
 }
 
-static void lmc_t1_default(lmc_softc_t * const sc)
+static void lmc_t1_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
@@ -841,7 +841,7 @@ static void lmc_t1_default(lmc_softc_t * const sc)
 }
 /* Given a user provided state, set ourselves up to match it.
    This will always reset the card if needed. */
-static void lmc_t1_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_t1_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
 		sc->lmc_media->set_circuit_type(sc, sc->ictl.circuit_type);
@@ -860,7 +860,7 @@ static void lmc_t1_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 }
 
 /* Return hardware link status. 0 == link is down, 1 == link is up. */
-static int lmc_t1_get_link_status(lmc_softc_t * const sc)
+static int lmc_t1_get_link_status(struct card * const sc)
 {
 	u16 link_status;
 	int ret = 1;
@@ -970,7 +970,7 @@ static int lmc_t1_get_link_status(lmc_softc_t * const sc)
 }
 
 /* 1 == T1 Circuit Type , 0 == E1 Circuit Type */
-static void lmc_t1_set_circuit_type(lmc_softc_t * const sc, int ie)
+static void lmc_t1_set_circuit_type(struct card * const sc, int ie)
 {
 	if (ie == LMC_CTL_CIRCUIT_TYPE_T1) {
 		sc->lmc_miireg16 |= LMC_MII16_T1_Z;
@@ -986,7 +986,7 @@ static void lmc_t1_set_circuit_type(lmc_softc_t * const sc, int ie)
 }
 
 /* 0 == 16bit, 1 == 32bit */
-static void lmc_t1_set_crc_length(lmc_softc_t * const sc, int state)
+static void lmc_t1_set_crc_length(struct card * const sc, int state)
 {
 	if (state == LMC_CTL_CRC_LENGTH_32) {
 		/* 32 bit */
@@ -1005,7 +1005,7 @@ static void lmc_t1_set_crc_length(lmc_softc_t * const sc, int state)
 }
 
 /* 1 == internal, 0 == external */
-static void lmc_t1_set_clock(lmc_softc_t * const sc, int ie)
+static void lmc_t1_set_clock(struct card * const sc, int ie)
 {
 	int old;
 	old = ie;
@@ -1026,11 +1026,11 @@ static void lmc_t1_set_clock(lmc_softc_t * const sc, int ie)
 	}
 }
 
-static void lmc_t1_watchdog(lmc_softc_t * const sc)
+static void lmc_t1_watchdog(struct card * const sc)
 {
 }
 
-static void lmc_set_protocol(lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_set_protocol(struct card * const sc, struct control *ctl)
 {
 	if (!ctl)
 		sc->ictl.keepalive_onoff = LMC_CTL_ON;
diff --git a/drivers/net/wan/lmc/proto.c b/drivers/net/wan/lmc/proto.c
index d6c0cc2..547c8d8 100644
--- a/drivers/net/wan/lmc/proto.c
+++ b/drivers/net/wan/lmc/proto.c
@@ -46,7 +46,7 @@
 #include "ioctl.h"
 #include "proto.h"
 
-void lmc_proto_attach(lmc_softc_t *sc)
+void lmc_proto_attach(struct card *sc)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_attach in");
 	if (sc->if_type == LMC_NET) {
@@ -59,7 +59,7 @@ void lmc_proto_attach(lmc_softc_t *sc)
 	lmc_trace(sc->lmc_device, "lmc_proto_attach out");
 }
 
-int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd)
+int lmc_proto_ioctl(struct card *sc, struct ifreq *ifr, int cmd)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_ioctl");
 	if (sc->if_type == LMC_PPP)
@@ -67,7 +67,7 @@ int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd)
 	return -EOPNOTSUPP;
 }
 
-int lmc_proto_open(lmc_softc_t *sc)
+int lmc_proto_open(struct card *sc)
 {
 	int ret = 0;
 
@@ -84,7 +84,7 @@ int lmc_proto_open(lmc_softc_t *sc)
 	return ret;
 }
 
-void lmc_proto_close(lmc_softc_t *sc)
+void lmc_proto_close(struct card *sc)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_close in");
 
@@ -94,7 +94,7 @@ void lmc_proto_close(lmc_softc_t *sc)
 	lmc_trace(sc->lmc_device, "lmc_proto_close out");
 }
 
-__be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb)
+__be16 lmc_proto_type(struct card *sc, struct sk_buff *skb)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_type in");
 	switch (sc->if_type) {
@@ -118,7 +118,7 @@ __be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb)
 
 }
 
-void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb)
+void lmc_proto_netif(struct card *sc, struct sk_buff *skb)
 {
 	lmc_trace(sc->lmc_device, "lmc_proto_netif in");
 	switch (sc->if_type) {
diff --git a/drivers/net/wan/lmc/proto.h b/drivers/net/wan/lmc/proto.h
index 662148c..23094ed 100644
--- a/drivers/net/wan/lmc/proto.h
+++ b/drivers/net/wan/lmc/proto.h
@@ -3,16 +3,16 @@
 
 #include <linux/hdlc.h>
 
-void lmc_proto_attach(lmc_softc_t *sc);
-int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd);
-int lmc_proto_open(lmc_softc_t *sc);
-void lmc_proto_close(lmc_softc_t *sc);
-__be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb);
-void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb);
+void lmc_proto_attach(struct card *sc);
+int lmc_proto_ioctl(struct card *sc, struct ifreq *ifr, int cmd);
+int lmc_proto_open(struct card *sc);
+void lmc_proto_close(struct card *sc);
+__be16 lmc_proto_type(struct card *sc, struct sk_buff *skb);
+void lmc_proto_netif(struct card *sc, struct sk_buff *skb);
 
-static inline lmc_softc_t* dev_to_sc(struct net_device *dev)
+static inline struct card* dev_to_sc(struct net_device *dev)
 {
-	return (lmc_softc_t *)dev_to_hdlc(dev)->priv;
+	return (struct card *)dev_to_hdlc(dev)->priv;
 }
 
 #endif
diff --git a/drivers/net/wan/lmc/var.h b/drivers/net/wan/lmc/var.h
index 9b14979..e9aad37 100644
--- a/drivers/net/wan/lmc/var.h
+++ b/drivers/net/wan/lmc/var.h
@@ -19,10 +19,6 @@
 
 /* basic definitions used in lmc include files */
 
-typedef struct lmc___softc	lmc_softc_t;
-typedef struct lmc___media	lmc_media_t;
-typedef struct lmc___ctl	lmc_ctl_t;
-
 #define lmc_csrptr_t		unsigned long
 
 #define LMC_REG_RANGE		0x80
@@ -137,6 +133,8 @@ struct lmc_regfile_t {
 				   LMC_RDES_REPORT_ON_MII_ERR |	 \
 				   LMC_RDES_COLLISION_SEEN))
 
+struct card;
+
 /* Ioctl info */
 
 typedef struct {
@@ -150,7 +148,7 @@ typedef struct {
 } lmc_av9110_t;
 
 /* Common structure passed to the ioctl code. */
-struct lmc___ctl {
+struct control {
 	u32 cardtype;
 	u32 clock_source;		/* HSSI, T1 */
 	u32 clock_rate;			/* T1 */
@@ -163,7 +161,7 @@ struct lmc___ctl {
 	union {
 		lmc_av9110_t ssi;
 	} cardspec;
-	u32	circuit_type;		/* T1 or E1 */
+	u32 circuit_type;		/* T1 or E1 */
 };
 
 
@@ -188,19 +186,19 @@ struct tulip_desc_t {
 };
 
 /* media independent methods to check on media status, link, light LEDs, etc. */
-struct lmc___media {
-	void (* init)(lmc_softc_t * const);
-	void (* defaults)(lmc_softc_t * const);
-	void (* set_status)(lmc_softc_t * const, lmc_ctl_t *);
-	void (* set_clock_source)(lmc_softc_t * const, int);
-	void (* set_speed)(lmc_softc_t * const, lmc_ctl_t *);
-	void (* set_cable_length)(lmc_softc_t * const, int);
-	void (* set_scrambler)(lmc_softc_t * const, int);
-	int (* get_link_status)(lmc_softc_t * const);
-	void (* set_link_status)(lmc_softc_t * const, int);
-	void (* set_crc_length)(lmc_softc_t * const, int);
-	void (* set_circuit_type)(lmc_softc_t * const, int);
-	void (* watchdog)(lmc_softc_t * const);
+struct media {
+	void (* init)(struct card * const);
+	void (* defaults)(struct card * const);
+	void (* set_status)(struct card * const, struct control *);
+	void (* set_clock_source)(struct card * const, int);
+	void (* set_speed)(struct card * const, struct control *);
+	void (* set_cable_length)(struct card * const, int);
+	void (* set_scrambler)(struct card * const, int);
+	int (* get_link_status)(struct card * const);
+	void (* set_link_status)(struct card * const, int);
+	void (* set_crc_length)(struct card * const, int);
+	void (* set_circuit_type)(struct card * const, int);
+	void (* watchdog)(struct card * const);
 };
 
 #define STATCHECK 0xBEEFCAFE
@@ -271,7 +269,7 @@ typedef struct lmc_xinfo {
 
 
 /* forward decl */
-struct lmc___softc {
+struct card {
 	char *name;
 	u8 board_idx;
 	struct lmc_extra_statistics extra_stats;
@@ -301,9 +299,9 @@ struct lmc___softc {
 	int last_link_status;
 	int lmc_cardtype;
 	u32 last_frameerr;
-	lmc_media_t *lmc_media;
+	struct media *lmc_media;
 	struct timer_list timer;
-	lmc_ctl_t ictl;
+	struct control ictl;
 	u32 TxDescriptControlInit;
 
 	int tx_TimeoutInd;		/* additional driver state */
@@ -328,7 +326,6 @@ struct lmc___softc {
 	u8 failed_ring;			/* Failure cases */
 	u8 failed_recv_alloc;
 
-
 	u32 check;			/* Structure check */
 };
 
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 07/29] LMC: Convert media structs to named initializers.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/media.c |   96 +++++++++++++++++++++---------------------
 1 files changed, 48 insertions(+), 48 deletions(-)

diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 8e236b0..36b685f 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -85,63 +85,63 @@ static inline void write_av9110_bit(struct card *, int);
 static void write_av9110(struct card *, u32, u32, u32, u32, u32);
 
 struct media lmc_ds3_media = {
-	lmc_ds3_init,		/* special media init stuff */
-	lmc_ds3_default,	/* reset to default state */
-	lmc_ds3_set_status,	/* reset status to state provided */
-	lmc_dummy_set_1,	/* set clock source */
-	lmc_dummy_set2_1,	/* set line speed */
-	lmc_ds3_set_100ft,	/* set cable length */
-	lmc_ds3_set_scram,	/* set scrambler */
-	lmc_ds3_get_link_status, /* get link status */
-	lmc_dummy_set_1,	/* set link status */
-	lmc_ds3_set_crc_length,	/* set CRC length */
-	lmc_dummy_set_1,	/* set T1 or E1 circuit type */
-	lmc_ds3_watchdog
+	.init = lmc_ds3_init,
+	.defaults = lmc_ds3_default,
+	.set_status = lmc_ds3_set_status,
+	.set_clock_source = lmc_dummy_set_1,
+	.set_speed = lmc_dummy_set2_1,
+	.set_cable_length = lmc_ds3_set_100ft,
+	.set_scrambler = lmc_ds3_set_scram,
+	.get_link_status = lmc_ds3_get_link_status,
+	.set_link_status = lmc_dummy_set_1,
+	.set_crc_length = lmc_ds3_set_crc_length,
+	.set_circuit_type = lmc_dummy_set_1,
+	.watchdog = lmc_ds3_watchdog,
 };
 
 struct media lmc_hssi_media = {
-	lmc_hssi_init,		/* special media init stuff */
-	lmc_hssi_default,	/* reset to default state */
-	lmc_hssi_set_status,	/* reset status to state provided */
-	lmc_hssi_set_clock,	/* set clock source */
-	lmc_dummy_set2_1,	/* set line speed */
-	lmc_dummy_set_1,	/* set cable length */
-	lmc_dummy_set_1,	/* set scrambler */
-	lmc_hssi_get_link_status, /* get link status */
-	lmc_hssi_set_link_status, /* set link status */
-	lmc_hssi_set_crc_length, /* set CRC length */
-	lmc_dummy_set_1,	/* set T1 or E1 circuit type */
-	lmc_hssi_watchdog
+	.init = lmc_hssi_init,
+	.defaults = lmc_hssi_default,
+	.set_status = lmc_hssi_set_status,
+	.set_clock_source = lmc_hssi_set_clock,
+	.set_speed = lmc_dummy_set2_1,
+	.set_cable_length = lmc_dummy_set_1,
+	.set_scrambler = lmc_dummy_set_1,
+	.get_link_status = lmc_hssi_get_link_status,
+	.set_link_status = lmc_hssi_set_link_status,
+	.set_crc_length = lmc_hssi_set_crc_length,
+	.set_circuit_type = lmc_dummy_set_1,
+	.watchdog = lmc_hssi_watchdog,
 };
 
 struct media lmc_ssi_media = {
-	lmc_ssi_init,		/* special media init stuff */
-	lmc_ssi_default,	/* reset to default state */
-	lmc_ssi_set_status,	/* reset status to state provided */
-	lmc_ssi_set_clock,	/* set clock source */
-	lmc_ssi_set_speed,	/* set line speed */
-	lmc_dummy_set_1,	/* set cable length */
-	lmc_dummy_set_1,	/* set scrambler */
-	lmc_ssi_get_link_status, /* get link status */
-	lmc_ssi_set_link_status, /* set link status */
-	lmc_ssi_set_crc_length,	/* set CRC length */
-	lmc_dummy_set_1,	/* set T1 or E1 circuit type */
-	lmc_ssi_watchdog
+	.init = lmc_ssi_init,
+	.defaults = lmc_ssi_default,
+	.set_status = lmc_ssi_set_status,
+	.set_clock_source = lmc_ssi_set_clock,
+	.set_speed = lmc_ssi_set_speed,
+	.set_cable_length = lmc_dummy_set_1,
+	.set_scrambler = lmc_dummy_set_1,
+	.get_link_status = lmc_ssi_get_link_status,
+	.set_link_status = lmc_ssi_set_link_status,
+	.set_crc_length = lmc_ssi_set_crc_length,
+	.set_circuit_type = lmc_dummy_set_1,
+	.watchdog = lmc_ssi_watchdog,
 };
 
 struct media lmc_t1_media = {
-	lmc_t1_init,		/* special media init stuff */
-	lmc_t1_default,		/* reset to default state */
-	lmc_t1_set_status,	/* reset status to state provided */
-	lmc_t1_set_clock,	/* set clock source */
-	lmc_dummy_set2_1,	/* set line speed */
-	lmc_dummy_set_1,	/* set cable length */
-	lmc_dummy_set_1,	/* set scrambler */
-	lmc_t1_get_link_status,	/* get link status */
-	lmc_dummy_set_1,	/* set link status */
-	lmc_t1_set_crc_length,	/* set CRC length */
-	lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */
-	lmc_t1_watchdog
+	.init = lmc_t1_init,
+	.defaults = lmc_t1_default,
+	.set_status = lmc_t1_set_status,
+	.set_clock_source = lmc_t1_set_clock,
+	.set_speed = lmc_dummy_set2_1,
+	.set_cable_length = lmc_dummy_set_1,
+	.set_scrambler = lmc_dummy_set_1,
+	.get_link_status = lmc_t1_get_link_status,
+	.set_link_status = lmc_dummy_set_1,
+	.set_crc_length = lmc_t1_set_crc_length,
+	.set_circuit_type = lmc_t1_set_circuit_type,
+	.watchdog = lmc_t1_watchdog,
 };
 
 static void lmc_dummy_set_1(struct card * const sc, int a)
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 06/29] LMC: Remove stub files proto.[ch].
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/Makefile |    2 +-
 drivers/net/wan/lmc/main.c   |   29 ++++++-------
 drivers/net/wan/lmc/proto.c  |   95 ------------------------------------------
 drivers/net/wan/lmc/proto.h  |   18 --------
 4 files changed, 14 insertions(+), 130 deletions(-)
 delete mode 100644 drivers/net/wan/lmc/proto.c
 delete mode 100644 drivers/net/wan/lmc/proto.h

diff --git a/drivers/net/wan/lmc/Makefile b/drivers/net/wan/lmc/Makefile
index 2c14b98..2f461a7 100644
--- a/drivers/net/wan/lmc/Makefile
+++ b/drivers/net/wan/lmc/Makefile
@@ -5,7 +5,7 @@
 
 obj-$(CONFIG_LANMEDIA) += lmc.o
 
-lmc-objs := debug.o media.o main.o proto.o
+lmc-objs := debug.o media.o main.o
 
 # Like above except every packet gets echoed to KERN_DEBUG
 # in hex
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index a6de32f..13bb6f6 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -72,7 +72,6 @@
 #include "var.h"
 #include "ioctl.h"
 #include "debug.h"
-#include "proto.h"
 
 static int LMC_PKT_BUF_SZ = 1542;
 
@@ -104,6 +103,12 @@ static void lmc_reset(struct card * const sc);
 static void lmc_dec_reset(struct card * const sc);
 static void lmc_driver_timeout(struct net_device *dev);
 
+static inline struct card* dev_to_sc(struct net_device *dev)
+{
+	return (struct card *)dev_to_hdlc(dev)->priv;
+}
+
+
 /* linux reserves 16 device specific IOCTLs.  We call them
    LMCIOC* to control various bits of our world. */
 int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
@@ -566,7 +571,7 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 	break;
 	default:
 		/* If we don't know what to do, give the protocol a shot. */
-		ret = lmc_proto_ioctl(sc, ifr, cmd);
+		ret = hdlc_ioctl(sc->lmc_device, ifr, cmd);
 		break;
 	}
 
@@ -795,12 +800,6 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 	pci_set_drvdata(pdev, dev);
 	SET_NETDEV_DEV(dev, &pdev->dev);
 
-	/*
-	 * This will get the protocol layer ready and do any 1 time init's
-	 * Must have a valid sc and dev structure
-	 */
-	lmc_proto_attach(sc);
-
 	/* Init the spin lock so can call it latter */
 
 	spin_lock_init(&sc->lmc_lock);
@@ -973,9 +972,7 @@ static int lmc_open(struct net_device *dev)
 	sc->lmc_media->set_crc_length(sc, sc->ictl.crc_length);
 	/* Acknowledge the Terminal Active and light LEDs */
 
-	/* dev->flags |= IFF_UP; */
-
-	if ((err = lmc_proto_open(sc)) != 0)
+	if ((err = hdlc_open(sc->lmc_device)) != 0)
 		return err;
 
 	netif_start_queue(dev);
@@ -1059,7 +1056,7 @@ static int lmc_close(struct net_device *dev)
 	sc->lmc_ok = 0;
 	sc->lmc_media->set_link_status(sc, 0);
 	del_timer(&sc->timer);
-	lmc_proto_close(sc);
+	hdlc_close(sc->lmc_device);
 	lmc_ifdown(dev);
 
 	lmc_trace(dev, "lmc_close out");
@@ -1489,11 +1486,11 @@ give_it_anyways:
 			sc->lmc_rxring[i].buffer1 = 0x0;
 
 			skb_put(skb, len);
-			skb->protocol = lmc_proto_type(sc, skb);
+			skb->protocol = hdlc_type_trans(skb, sc->lmc_device);
 			skb_reset_mac_header(skb);
 			/* skb_reset_network_header(skb); */
 			skb->dev = dev;
-			lmc_proto_netif(sc, skb);
+			netif_rx(skb);
 
 			/* This skb will be destroyed by the upper layers,
 			   make a new one */
@@ -1520,11 +1517,11 @@ give_it_anyways:
 			if (!nsb)
 				goto give_it_anyways;
 			skb_copy_from_linear_data(skb, skb_put(nsb, len), len);
-			nsb->protocol = lmc_proto_type(sc, nsb);
+			nsb->protocol = hdlc_type_trans(nsb, sc->lmc_device);
 			skb_reset_mac_header(nsb);
 			/* skb_reset_network_header(nsb); */
 			nsb->dev = dev;
-			lmc_proto_netif(sc, nsb);
+			netif_rx(nsb);
 		}
 
 skip_packet:
diff --git a/drivers/net/wan/lmc/proto.c b/drivers/net/wan/lmc/proto.c
deleted file mode 100644
index ffd952a..0000000
--- a/drivers/net/wan/lmc/proto.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
- * All rights reserved.  www.lanmedia.com
- *
- * This code is written by:
- * Andrew Stanley-Jones (asj@cban.com)
- * Rob Braun (bbraun@vix.com),
- * Michael Graff (explorer@vix.com) and
- * Matt Thomas (matt@3am-software.com).
- *
- * With Help By:
- * David Boggs
- * Ron Crane
- * Allan Cox
- *
- * This software may be used and distributed according to the terms of
- * the GNU General Public License version 2, incorporated herein by reference.
- *
- * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
- */
-
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/timer.h>
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/in.h>
-#include <linux/if_arp.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/inet.h>
-#include <linux/workqueue.h>
-#include <linux/proc_fs.h>
-#include <linux/bitops.h>
-#include <linux/io.h>
-#include <asm/processor.h>   /* Processor type for cache alignment. */
-#include <asm/dma.h>
-#include <linux/smp.h>
-
-#include "lmc.h"
-#include "var.h"
-#include "debug.h"
-#include "ioctl.h"
-#include "proto.h"
-
-void lmc_proto_attach(struct card *sc)
-{
-	lmc_trace(sc->lmc_device, "lmc_proto_attach in");
-	lmc_trace(sc->lmc_device, "lmc_proto_attach out");
-}
-
-int lmc_proto_ioctl(struct card *sc, struct ifreq *ifr, int cmd)
-{
-	lmc_trace(sc->lmc_device, "lmc_proto_ioctl");
-	return hdlc_ioctl(sc->lmc_device, ifr, cmd);
-}
-
-int lmc_proto_open(struct card *sc)
-{
-	int ret = 0;
-
-	lmc_trace(sc->lmc_device, "lmc_proto_open in");
-
-	ret = hdlc_open(sc->lmc_device);
-	if (ret < 0)
-		printk(KERN_WARNING "%s: HDLC open failed: %d\n",
-		       sc->name, ret);
-
-	lmc_trace(sc->lmc_device, "lmc_proto_open out");
-	return ret;
-}
-
-void lmc_proto_close(struct card *sc)
-{
-	lmc_trace(sc->lmc_device, "lmc_proto_close in");
-	hdlc_close(sc->lmc_device);
-	lmc_trace(sc->lmc_device, "lmc_proto_close out");
-}
-
-__be16 lmc_proto_type(struct card *sc, struct sk_buff *skb)
-{
-	lmc_trace(sc->lmc_device, "lmc_proto_type in");
-	return hdlc_type_trans(skb, sc->lmc_device);
-	lmc_trace(sc->lmc_device, "lmc_proto_tye out");
-}
-
-void lmc_proto_netif(struct card *sc, struct sk_buff *skb)
-{
-	lmc_trace(sc->lmc_device, "lmc_proto_netif in");
-	netif_rx(skb);
-	lmc_trace(sc->lmc_device, "lmc_proto_netif out");
-}
diff --git a/drivers/net/wan/lmc/proto.h b/drivers/net/wan/lmc/proto.h
deleted file mode 100644
index 23094ed..0000000
--- a/drivers/net/wan/lmc/proto.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _LMC_PROTO_H_
-#define _LMC_PROTO_H_
-
-#include <linux/hdlc.h>
-
-void lmc_proto_attach(struct card *sc);
-int lmc_proto_ioctl(struct card *sc, struct ifreq *ifr, int cmd);
-int lmc_proto_open(struct card *sc);
-void lmc_proto_close(struct card *sc);
-__be16 lmc_proto_type(struct card *sc, struct sk_buff *skb);
-void lmc_proto_netif(struct card *sc, struct sk_buff *skb);
-
-static inline struct card* dev_to_sc(struct net_device *dev)
-{
-	return (struct card *)dev_to_hdlc(dev)->priv;
-}
-
-#endif
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 08/29] LMC: Remove "dummy" media functions.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/main.c  |   18 ++++++---
 drivers/net/wan/lmc/media.c |   80 +++++++++++++-----------------------------
 2 files changed, 37 insertions(+), 61 deletions(-)

diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index 13bb6f6..6b7c09a 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -261,7 +261,8 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 			break;
 		}
 		spin_lock_irqsave(&sc->lmc_lock, flags);
-		sc->lmc_media->set_circuit_type(sc, ctl.circuit_type);
+		if (sc->lmc_media->set_circuit_type)
+			sc->lmc_media->set_circuit_type(sc, ctl.circuit_type);
 		sc->ictl.circuit_type = ctl.circuit_type;
 		spin_unlock_irqrestore(&sc->lmc_lock, flags);
 		ret = 0;
@@ -356,7 +357,8 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 			lmc_gpio_mkinput(sc, 0xff);
 
 			/* Reset the frammer hardware */
-			sc->lmc_media->set_link_status(sc, 1);
+			if (sc->lmc_media->set_link_status)
+				sc->lmc_media->set_link_status(sc, 1);
 			sc->lmc_media->set_status(sc, NULL);
 			/* lmc_softreset(sc); */
 
@@ -856,7 +858,8 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 
 	sc->lmc_media->defaults(sc);
 
-	sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
+	if (sc->lmc_media->set_link_status)
+		sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
 
 	/* verify that the PCI Sub System ID matches the Adapter Model number
 	   from the MII register */
@@ -951,7 +954,8 @@ static int lmc_open(struct net_device *dev)
 
 	/* Assert Terminal Active */
 	sc->lmc_miireg16 |= LMC_MII16_LED_ALL;
-	sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
+	if (sc->lmc_media->set_link_status)
+		sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
 
 	/*
 	 * reset to last state.
@@ -1026,7 +1030,8 @@ static void lmc_running_reset(struct net_device *dev)
 	lmc_reset(sc);
 	lmc_softreset(sc);
 	/* sc->lmc_miireg16 |= LMC_MII16_LED_ALL; */
-	sc->lmc_media->set_link_status(sc, 1);
+	if (sc->lmc_media->set_link_status)
+		sc->lmc_media->set_link_status(sc, 1);
 	sc->lmc_media->set_status(sc, NULL);
 
 	netif_wake_queue(dev);
@@ -1054,7 +1059,8 @@ static int lmc_close(struct net_device *dev)
 	lmc_trace(dev, "lmc_close in");
 
 	sc->lmc_ok = 0;
-	sc->lmc_media->set_link_status(sc, 0);
+	if (sc->lmc_media->set_link_status)
+		sc->lmc_media->set_link_status(sc, 0);
 	del_timer(&sc->timer);
 	hdlc_close(sc->lmc_device);
 	lmc_ifdown(dev);
diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 36b685f..baf6e43 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -78,9 +78,6 @@ static void lmc_t1_set_crc_length(struct card * const, int);
 static void lmc_t1_set_clock(struct card * const, int);
 static void lmc_t1_watchdog(struct card * const);
 
-static void lmc_dummy_set_1(struct card * const, int);
-static void lmc_dummy_set2_1(struct card * const, struct control *);
-
 static inline void write_av9110_bit(struct card *, int);
 static void write_av9110(struct card *, u32, u32, u32, u32, u32);
 
@@ -88,14 +85,10 @@ struct media lmc_ds3_media = {
 	.init = lmc_ds3_init,
 	.defaults = lmc_ds3_default,
 	.set_status = lmc_ds3_set_status,
-	.set_clock_source = lmc_dummy_set_1,
-	.set_speed = lmc_dummy_set2_1,
 	.set_cable_length = lmc_ds3_set_100ft,
 	.set_scrambler = lmc_ds3_set_scram,
 	.get_link_status = lmc_ds3_get_link_status,
-	.set_link_status = lmc_dummy_set_1,
 	.set_crc_length = lmc_ds3_set_crc_length,
-	.set_circuit_type = lmc_dummy_set_1,
 	.watchdog = lmc_ds3_watchdog,
 };
 
@@ -104,13 +97,9 @@ struct media lmc_hssi_media = {
 	.defaults = lmc_hssi_default,
 	.set_status = lmc_hssi_set_status,
 	.set_clock_source = lmc_hssi_set_clock,
-	.set_speed = lmc_dummy_set2_1,
-	.set_cable_length = lmc_dummy_set_1,
-	.set_scrambler = lmc_dummy_set_1,
 	.get_link_status = lmc_hssi_get_link_status,
 	.set_link_status = lmc_hssi_set_link_status,
 	.set_crc_length = lmc_hssi_set_crc_length,
-	.set_circuit_type = lmc_dummy_set_1,
 	.watchdog = lmc_hssi_watchdog,
 };
 
@@ -120,12 +109,9 @@ struct media lmc_ssi_media = {
 	.set_status = lmc_ssi_set_status,
 	.set_clock_source = lmc_ssi_set_clock,
 	.set_speed = lmc_ssi_set_speed,
-	.set_cable_length = lmc_dummy_set_1,
-	.set_scrambler = lmc_dummy_set_1,
 	.get_link_status = lmc_ssi_get_link_status,
 	.set_link_status = lmc_ssi_set_link_status,
 	.set_crc_length = lmc_ssi_set_crc_length,
-	.set_circuit_type = lmc_dummy_set_1,
 	.watchdog = lmc_ssi_watchdog,
 };
 
@@ -134,24 +120,12 @@ struct media lmc_t1_media = {
 	.defaults = lmc_t1_default,
 	.set_status = lmc_t1_set_status,
 	.set_clock_source = lmc_t1_set_clock,
-	.set_speed = lmc_dummy_set2_1,
-	.set_cable_length = lmc_dummy_set_1,
-	.set_scrambler = lmc_dummy_set_1,
 	.get_link_status = lmc_t1_get_link_status,
-	.set_link_status = lmc_dummy_set_1,
 	.set_crc_length = lmc_t1_set_crc_length,
 	.set_circuit_type = lmc_t1_set_circuit_type,
 	.watchdog = lmc_t1_watchdog,
 };
 
-static void lmc_dummy_set_1(struct card * const sc, int a)
-{
-}
-
-static void lmc_dummy_set2_1(struct card * const sc, struct control * a)
-{
-}
-
 /* HSSI methods */
 
 static void lmc_hssi_init(struct card * const sc)
@@ -163,10 +137,9 @@ static void lmc_hssi_init(struct card * const sc)
 static void lmc_hssi_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-
-	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
-	sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
-	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	lmc_hssi_set_link_status(sc, LMC_LINK_DOWN);
+	lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	lmc_hssi_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
 /* Given a user provided state, set ourselves up to match it.
@@ -174,7 +147,7 @@ static void lmc_hssi_default(struct card * const sc)
 static void lmc_hssi_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
-		sc->lmc_media->set_clock_source(sc, sc->ictl.clock_source);
+		lmc_hssi_set_clock(sc, sc->ictl.clock_source);
 		lmc_set_protocol(sc, NULL);
 
 		return;
@@ -182,11 +155,11 @@ static void lmc_hssi_set_status(struct card * const sc, struct control *ctl)
 
 	/* check for change in clock source */
 	if (ctl->clock_source && !sc->ictl.clock_source) {
-		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_INT);
+		lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_INT);
 		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
 	} else if (!ctl->clock_source && sc->ictl.clock_source) {
 		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+		lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
 	}
 
 	lmc_set_protocol(sc, ctl);
@@ -272,10 +245,9 @@ static void lmc_ds3_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
-	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
-	sc->lmc_media->set_cable_length(sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
-	sc->lmc_media->set_scrambler(sc, LMC_CTL_OFF);
-	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	lmc_ds3_set_100ft(sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
+	lmc_ds3_set_scram(sc, LMC_CTL_OFF);
+	lmc_ds3_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
 /* Given a user provided state, set ourselves up to match it.
@@ -283,8 +255,8 @@ static void lmc_ds3_default(struct card * const sc)
 static void lmc_ds3_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
-		sc->lmc_media->set_cable_length(sc, sc->ictl.cable_length);
-		sc->lmc_media->set_scrambler(sc, sc->ictl.scrambler_onoff);
+		lmc_ds3_set_100ft(sc, sc->ictl.cable_length);
+		lmc_ds3_set_scram(sc, sc->ictl.scrambler_onoff);
 		lmc_set_protocol(sc, NULL);
 		return;
 	}
@@ -480,10 +452,10 @@ static void lmc_ssi_default(struct card * const sc)
 	/* make TXCLOCK always be an output */
 	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
 
-	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
-	sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
-	sc->lmc_media->set_speed(sc, NULL);
-	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	lmc_ssi_set_link_status(sc, LMC_LINK_DOWN);
+	lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	lmc_ssi_set_speed(sc, NULL);
+	lmc_ssi_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
 /* Given a user provided state, set ourselves up to match it.
@@ -491,8 +463,8 @@ static void lmc_ssi_default(struct card * const sc)
 static void lmc_ssi_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
-		sc->lmc_media->set_clock_source(sc, sc->ictl.clock_source);
-		sc->lmc_media->set_speed(sc, &sc->ictl);
+		lmc_ssi_set_clock(sc, sc->ictl.clock_source);
+		lmc_ssi_set_speed(sc, &sc->ictl);
 		lmc_set_protocol(sc, NULL);
 		return;
 	}
@@ -500,16 +472,16 @@ static void lmc_ssi_set_status(struct card * const sc, struct control *ctl)
 	/* check for change in clock source */
 	if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_INT
 	    && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_EXT) {
-		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_INT);
+		lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_INT);
 		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
 	} else if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_EXT
 		 && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_INT) {
-		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+		lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
 		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
 	}
 
 	if (ctl->clock_rate != sc->ictl.clock_rate)
-		sc->lmc_media->set_speed(sc, ctl);
+		lmc_ssi_set_speed(sc, ctl);
 
 	lmc_set_protocol(sc, ctl);
 }
@@ -833,9 +805,8 @@ static void lmc_t1_init(struct card * const sc)
 static void lmc_t1_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
-	sc->lmc_media->set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
-	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
+	lmc_t1_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 	/* Right now we can only clock from out internal source */
 	sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
 }
@@ -844,18 +815,17 @@ static void lmc_t1_default(struct card * const sc)
 static void lmc_t1_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
-		sc->lmc_media->set_circuit_type(sc, sc->ictl.circuit_type);
+		lmc_t1_set_circuit_type(sc, sc->ictl.circuit_type);
 		lmc_set_protocol(sc, NULL);
-
 		return;
 	}
 	/* check for change in circuit type */
 	if (ctl->circuit_type == LMC_CTL_CIRCUIT_TYPE_T1
 	    && sc->ictl.circuit_type == LMC_CTL_CIRCUIT_TYPE_E1)
-		sc->lmc_media->set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_E1);
+		lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_E1);
 	else if (ctl->circuit_type == LMC_CTL_CIRCUIT_TYPE_E1
 		 && sc->ictl.circuit_type == LMC_CTL_CIRCUIT_TYPE_T1)
-		sc->lmc_media->set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
+		lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
 	lmc_set_protocol(sc, ctl);
 }
 
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 10/29] LMC: Remove empty media functions.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/main.c  |    3 ++-
 drivers/net/wan/lmc/media.c |   16 ----------------
 2 files changed, 2 insertions(+), 17 deletions(-)

diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index 6b7c09a..1fbd802 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -692,7 +692,8 @@ static void lmc_watchdog(unsigned long data)
 	}
 
 	/* Call media specific watchdog functions */
-	sc->lmc_media->watchdog(sc);
+	if (sc->lmc_media->watchdog)
+		sc->lmc_media->watchdog(sc);
 
 	/* Poke the transmitter to make sure it never stops, even if we run
 	   out of mem */
diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 9701d30..2411214 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -428,11 +428,6 @@ static void lmc_hssi_set_crc_length(struct card * const sc, int state)
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void lmc_hssi_watchdog(struct card * const sc)
-{
-	/* HSSI is blank */
-}
-
 static void lmc_hssi_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
@@ -630,10 +625,6 @@ static void lmc_ds3_set_crc_length(struct card * const sc, int state)
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void lmc_ds3_watchdog(struct card * const sc)
-{
-}
-
 static void lmc_ds3_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
@@ -907,10 +898,6 @@ static void lmc_t1_set_clock(struct card * const sc, int ie)
 	}
 }
 
-static void lmc_t1_watchdog(struct card * const sc)
-{
-}
-
 static void lmc_t1_default(struct card * const sc)
 {
 	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
@@ -941,7 +928,6 @@ struct media lmc_hssi_media = {
 	.get_link_status = lmc_hssi_get_link_status,
 	.set_link_status = lmc_hssi_set_link_status,
 	.set_crc_length = lmc_hssi_set_crc_length,
-	.watchdog = lmc_hssi_watchdog,
 };
 
 struct media lmc_ds3_media = {
@@ -952,7 +938,6 @@ struct media lmc_ds3_media = {
 	.set_scrambler = lmc_ds3_set_scram,
 	.get_link_status = lmc_ds3_get_link_status,
 	.set_crc_length = lmc_ds3_set_crc_length,
-	.watchdog = lmc_ds3_watchdog,
 };
 
 struct media lmc_t1_media = {
@@ -963,5 +948,4 @@ struct media lmc_t1_media = {
 	.get_link_status = lmc_t1_get_link_status,
 	.set_crc_length = lmc_t1_set_crc_length,
 	.set_circuit_type = lmc_t1_set_circuit_type,
-	.watchdog = lmc_t1_watchdog,
 };
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 09/29] LMC: shuffle protocol routines to avoid a need for prototypes.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/media.c |  940 +++++++++++++++++++++----------------------
 1 files changed, 450 insertions(+), 490 deletions(-)

diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index baf6e43..9701d30 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -37,134 +37,318 @@
  * the GNU General Public License version 2, incorporated herein by reference.
  */
 
-/* protocol independent method. */
-static void lmc_set_protocol(struct card * const, struct control *);
-
-/* media independent methods to check on media status, link, light LEDs, etc. */
-static void lmc_ds3_init(struct card * const);
-static void lmc_ds3_default(struct card * const);
-static void lmc_ds3_set_status(struct card * const, struct control *);
-static void lmc_ds3_set_100ft(struct card * const, int);
-static int lmc_ds3_get_link_status(struct card * const);
-static void lmc_ds3_set_crc_length(struct card * const, int);
-static void lmc_ds3_set_scram(struct card * const, int);
-static void lmc_ds3_watchdog(struct card * const);
-
-static void lmc_hssi_init(struct card * const);
-static void lmc_hssi_default(struct card * const);
-static void lmc_hssi_set_status(struct card * const, struct control *);
-static void lmc_hssi_set_clock(struct card * const, int);
-static int lmc_hssi_get_link_status(struct card * const);
-static void lmc_hssi_set_link_status(struct card * const, int);
-static void lmc_hssi_set_crc_length(struct card * const, int);
-static void lmc_hssi_watchdog(struct card * const);
-
-static void lmc_ssi_init(struct card * const);
-static void lmc_ssi_default(struct card * const);
-static void lmc_ssi_set_status(struct card * const, struct control *);
-static void lmc_ssi_set_clock(struct card * const, int);
-static void lmc_ssi_set_speed(struct card * const, struct control *);
-static int lmc_ssi_get_link_status(struct card * const);
-static void lmc_ssi_set_link_status(struct card * const, int);
-static void lmc_ssi_set_crc_length(struct card * const, int);
-static void lmc_ssi_watchdog(struct card * const);
-
-static void lmc_t1_init(struct card * const);
-static void lmc_t1_default(struct card * const);
-static void lmc_t1_set_status(struct card * const, struct control *);
-static int lmc_t1_get_link_status(struct card * const);
-static void lmc_t1_set_circuit_type(struct card * const, int);
-static void lmc_t1_set_crc_length(struct card * const, int);
-static void lmc_t1_set_clock(struct card * const, int);
-static void lmc_t1_watchdog(struct card * const);
-
-static inline void write_av9110_bit(struct card *, int);
-static void write_av9110(struct card *, u32, u32, u32, u32, u32);
+static void lmc_set_protocol(struct card * const sc, struct control *ctl)
+{
+	if (!ctl)
+		sc->ictl.keepalive_onoff = LMC_CTL_ON;
+}
 
-struct media lmc_ds3_media = {
-	.init = lmc_ds3_init,
-	.defaults = lmc_ds3_default,
-	.set_status = lmc_ds3_set_status,
-	.set_cable_length = lmc_ds3_set_100ft,
-	.set_scrambler = lmc_ds3_set_scram,
-	.get_link_status = lmc_ds3_get_link_status,
-	.set_crc_length = lmc_ds3_set_crc_length,
-	.watchdog = lmc_ds3_watchdog,
-};
 
-struct media lmc_hssi_media = {
-	.init = lmc_hssi_init,
-	.defaults = lmc_hssi_default,
-	.set_status = lmc_hssi_set_status,
-	.set_clock_source = lmc_hssi_set_clock,
-	.get_link_status = lmc_hssi_get_link_status,
-	.set_link_status = lmc_hssi_set_link_status,
-	.set_crc_length = lmc_hssi_set_crc_length,
-	.watchdog = lmc_hssi_watchdog,
-};
+/* SSI methods */
 
-struct media lmc_ssi_media = {
-	.init = lmc_ssi_init,
-	.defaults = lmc_ssi_default,
-	.set_status = lmc_ssi_set_status,
-	.set_clock_source = lmc_ssi_set_clock,
-	.set_speed = lmc_ssi_set_speed,
-	.get_link_status = lmc_ssi_get_link_status,
-	.set_link_status = lmc_ssi_set_link_status,
-	.set_crc_length = lmc_ssi_set_crc_length,
-	.watchdog = lmc_ssi_watchdog,
-};
+/* These are bits to program the ssi frequency generator */
+static inline void write_av9110_bit(struct card *sc, int c)
+{
+	/* set the data bit as we need it. */
+	sc->lmc_gpio &= ~(LMC_GEP_CLK);
+	if (c & 0x01)
+		sc->lmc_gpio |= LMC_GEP_DATA;
+	else
+		sc->lmc_gpio &= ~(LMC_GEP_DATA);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
 
-struct media lmc_t1_media = {
-	.init = lmc_t1_init,
-	.defaults = lmc_t1_default,
-	.set_status = lmc_t1_set_status,
-	.set_clock_source = lmc_t1_set_clock,
-	.get_link_status = lmc_t1_get_link_status,
-	.set_crc_length = lmc_t1_set_crc_length,
-	.set_circuit_type = lmc_t1_set_circuit_type,
-	.watchdog = lmc_t1_watchdog,
-};
+	/* set the clock to high */
+	sc->lmc_gpio |= LMC_GEP_CLK;
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
 
-/* HSSI methods */
+	/* set the clock to low again. */
+	sc->lmc_gpio &= ~(LMC_GEP_CLK);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+}
 
-static void lmc_hssi_init(struct card * const sc)
+static void write_av9110(struct card *sc, u32 n, u32 m, u32 v, u32 x, u32 r)
 {
-	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5200;
-	lmc_gpio_mkoutput(sc, LMC_GEP_HSSI_CLOCK);
+	int i;
+
+#if 0
+	printk(LMC_PRINTF_FMT ": speed %u, %d %d %d %d %d\n",
+	       LMC_PRINTF_ARGS, sc->ictl.clock_rate, n, m, v, x, r);
+#endif
+
+	sc->lmc_gpio |= LMC_GEP_SSI_GENERATOR;
+	sc->lmc_gpio &= ~(LMC_GEP_DATA | LMC_GEP_CLK);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* Set the TXCLOCK, GENERATOR, SERIAL, and SERIALCLK as outputs. */
+	lmc_gpio_mkoutput(sc, (LMC_GEP_DATA | LMC_GEP_CLK
+				| LMC_GEP_SSI_GENERATOR));
+
+	sc->lmc_gpio &= ~(LMC_GEP_SSI_GENERATOR);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* a shifting we will go... */
+	for (i = 0; i < 7; i++)
+		write_av9110_bit(sc, n >> i);
+	for (i = 0; i < 7; i++)
+		write_av9110_bit(sc, m >> i);
+	for (i = 0; i < 1; i++)
+		write_av9110_bit(sc, v >> i);
+	for (i = 0; i < 2; i++)
+		write_av9110_bit(sc, x >> i);
+	for (i = 0; i < 2; i++)
+		write_av9110_bit(sc, r >> i);
+	for (i = 0; i < 5; i++)
+		write_av9110_bit(sc, 0x17 >> i);
+
+	/* stop driving serial-related signals */
+	lmc_gpio_mkinput(sc, (LMC_GEP_DATA | LMC_GEP_CLK |
+			      LMC_GEP_SSI_GENERATOR));
 }
 
-static void lmc_hssi_default(struct card * const sc)
+static void lmc_ssi_init(struct card * const sc)
 {
-	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-	lmc_hssi_set_link_status(sc, LMC_LINK_DOWN);
-	lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
-	lmc_hssi_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	u16 mii17;
+	int cable;
+
+	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1000;
+
+	mii17 = lmc_mii_readreg(sc, 0, 17);
+
+	cable = (mii17 & LMC_MII17_SSI_CABLE_MASK) >> LMC_MII17_SSI_CABLE_SHIFT;
+	sc->ictl.cable_type = cable;
+
+	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
+}
+
+/* 1 == internal, 0 == external */
+static void lmc_ssi_set_clock(struct card * const sc, int ie)
+{
+	int old;
+	old = ie;
+	if (ie == LMC_CTL_CLOCK_SOURCE_EXT) {
+		sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
+		if (ie != old)
+			printk(LMC_PRINTF_FMT ": clock external\n",
+			       LMC_PRINTF_ARGS);
+	} else {
+		sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
+		if (ie != old)
+			printk(LMC_PRINTF_FMT ": clock internal\n",
+			       LMC_PRINTF_ARGS);
+	}
+}
+
+static void lmc_ssi_set_speed(struct card * const sc, struct control *ctl)
+{
+	struct control *ictl = &sc->ictl;
+	lmc_av9110_t *av;
+
+	/* original settings for clock rate of 100 Khz (8,25,0,0,2) were
+	   incorrect. They should have been 80,125,1,3,3. There are 17 param
+	   combinations to produce this freq. For 1.5 Mhz use 120,100,1,1,2
+	   (226 param. combinations) */
+	if (ctl == NULL) {
+		av = &ictl->cardspec.ssi;
+		ictl->clock_rate = 1500000;
+		av->f = ictl->clock_rate;
+		av->n = 120;
+		av->m = 100;
+		av->v = 1;
+		av->x = 1;
+		av->r = 2;
+		write_av9110(sc, av->n, av->m, av->v, av->x, av->r);
+		return;
+	}
+
+	av = &ctl->cardspec.ssi;
+
+	if (av->f == 0)
+		return;
+
+	ictl->clock_rate = av->f;	/* really, this is the rate we are */
+	ictl->cardspec.ssi = *av;
+
+	write_av9110(sc, av->n, av->m, av->v, av->x, av->r);
 }
 
 /* Given a user provided state, set ourselves up to match it.
    This will always reset the card if needed. */
-static void lmc_hssi_set_status(struct card * const sc, struct control *ctl)
+static void lmc_ssi_set_status(struct card * const sc, struct control *ctl)
 {
 	if (ctl == NULL) {
-		lmc_hssi_set_clock(sc, sc->ictl.clock_source);
+		lmc_ssi_set_clock(sc, sc->ictl.clock_source);
+		lmc_ssi_set_speed(sc, &sc->ictl);
 		lmc_set_protocol(sc, NULL);
-
 		return;
 	}
 
 	/* check for change in clock source */
-	if (ctl->clock_source && !sc->ictl.clock_source) {
-		lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_INT);
+	if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_INT
+	    && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_EXT) {
+		lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_INT);
 		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
-	} else if (!ctl->clock_source && sc->ictl.clock_source) {
+	} else if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_EXT
+		 && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_INT) {
+		lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
 		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-		lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
 	}
 
+	if (ctl->clock_rate != sc->ictl.clock_rate)
+		lmc_ssi_set_speed(sc, ctl);
+
 	lmc_set_protocol(sc, ctl);
 }
 
+/* Return hardware link status. 0 == link is down, 1 == link is up. */
+static int lmc_ssi_get_link_status(struct card * const sc)
+{
+	u16 link_status;
+	u32 ticks;
+	int ret = 1;
+	int hw_hdsk = 1;
+
+	/* missing CTS?  Hmm.  If we require CTS on, we may never get the
+	   link to come up, so omit it in this test.
+
+	   Also, it seems that with a loopback cable, DCD isn't asserted,
+	   so just check for things like this:
+	   - DSR _must_ be asserted.
+	   - One of DCD or CTS must be asserted. */
+
+	/* LMC 1000 (SSI) LED definitions
+	   - led0 green = power to adapter, Gate Array loaded & driver attached
+	   - led1 green = DSR and DTR and RTS and CTS are set
+	   - led2 green = Cable detected
+	   - led3 red   = No timing is available from the cable or the on-board
+			  frequency generator. */
+
+	link_status = lmc_mii_readreg(sc, 0, 16);
+
+	/* Is the transmit clock still available */
+	ticks = LMC_CSR_READ(sc, csr_gp_timer);
+	ticks = 0x0000ffff - (ticks & 0x0000ffff);
+
+	lmc_led_on(sc, LMC_MII16_LED0);
+
+	/* transmit clock determination */
+	if (sc->lmc_timing == LMC_CTL_CLOCK_SOURCE_INT)
+		lmc_led_off(sc, LMC_MII16_LED3);
+	else if (ticks == 0) {	/* no clock found ? */
+		ret = 0;
+		if (sc->last_led_err[3] != 1) {
+			sc->extra_stats.tx_lossOfClockCnt++;
+			printk(KERN_WARNING "%s: Lost Clock, Link Down\n",
+			       sc->name);
+		}
+		sc->last_led_err[3] = 1;
+		lmc_led_on(sc, LMC_MII16_LED3);	/* turn ON red LED */
+	} else {
+		if (sc->last_led_err[3] == 1)
+			printk(KERN_WARNING "%s: Clock Returned\n", sc->name);
+		sc->last_led_err[3] = 0;
+		lmc_led_off(sc, LMC_MII16_LED3); /* turn OFF red LED */
+	}
+
+	if ((link_status & LMC_MII16_SSI_DSR) == 0) { /* Also HSSI CA */
+		ret = 0;
+		hw_hdsk = 0;
+	}
+
+#ifdef CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE
+	if ((link_status & (LMC_MII16_SSI_CTS | LMC_MII16_SSI_DCD)) == 0) {
+		ret = 0;
+		hw_hdsk = 0;
+	}
+#endif
+
+	if (hw_hdsk == 0) {
+		if (sc->last_led_err[1] != 1)
+			printk(KERN_WARNING "%s: DSR not asserted\n", sc->name);
+		sc->last_led_err[1] = 1;
+		lmc_led_off(sc, LMC_MII16_LED1);
+	} else {
+		if (sc->last_led_err[1] != 0)
+			printk(KERN_WARNING "%s: DSR now asserted\n", sc->name);
+		sc->last_led_err[1] = 0;
+		lmc_led_on(sc, LMC_MII16_LED1);
+	}
+
+	if (ret == 1)
+		lmc_led_on(sc, LMC_MII16_LED2); /* Over all good status? */
+
+	return ret;
+}
+
+static void lmc_ssi_set_link_status(struct card * const sc, int state)
+{
+	if (state == LMC_LINK_UP) {
+		sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
+		printk(LMC_PRINTF_FMT ": asserting DTR and RTS\n",
+		       LMC_PRINTF_ARGS);
+	} else {
+		sc->lmc_miireg16 &= ~(LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
+		printk(LMC_PRINTF_FMT ": deasserting DTR and RTS\n",
+		       LMC_PRINTF_ARGS);
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+
+}
+
+/* 0 == 16bit, 1 == 32bit */
+static void lmc_ssi_set_crc_length(struct card * const sc, int state)
+{
+	if (state == LMC_CTL_CRC_LENGTH_32) {
+		/* 32 bit */
+		sc->lmc_miireg16 |= LMC_MII16_SSI_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
+
+	} else {
+		/* 16 bit */
+		sc->lmc_miireg16 &= ~LMC_MII16_SSI_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+}
+
+static void lmc_ssi_default(struct card * const sc)
+{
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+
+	/* make TXCLOCK always be an output */
+	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
+
+	lmc_ssi_set_link_status(sc, LMC_LINK_DOWN);
+	lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	lmc_ssi_set_speed(sc, NULL);
+	lmc_ssi_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+}
+
+static void lmc_ssi_watchdog(struct card * const sc)
+{
+	u16 mii17 = lmc_mii_readreg(sc, 0, 17);
+	if (((mii17 >> 3) & 7) == 7)
+		lmc_led_off(sc, LMC_MII16_LED2);
+	else
+		lmc_led_on(sc, LMC_MII16_LED2);
+}
+
+
+/* HSSI methods */
+
+static void lmc_hssi_init(struct card * const sc)
+{
+	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5200;
+	lmc_gpio_mkoutput(sc, LMC_GEP_HSSI_CLOCK);
+}
+
 /* 1 == internal, 0 == external */
 static void lmc_hssi_set_clock(struct card * const sc, int ie)
 {
@@ -187,8 +371,31 @@ static void lmc_hssi_set_clock(struct card * const sc, int ie)
 	}
 }
 
+/* Given a user provided state, set ourselves up to match it.
+   This will always reset the card if needed. */
+static void lmc_hssi_set_status(struct card * const sc, struct control *ctl)
+{
+	if (ctl == NULL) {
+		lmc_hssi_set_clock(sc, sc->ictl.clock_source);
+		lmc_set_protocol(sc, NULL);
+
+		return;
+	}
+
+	/* check for change in clock source */
+	if (ctl->clock_source && !sc->ictl.clock_source) {
+		lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_INT);
+		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
+	} else if (!ctl->clock_source && sc->ictl.clock_source) {
+		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
+		lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	}
+
+	lmc_set_protocol(sc, ctl);
+}
+
 /* Return hardware link status. 0 == link is down, 1 == link is up. */
-static int lmc_hssi_get_link_status(struct card * const sc)
+static inline int lmc_hssi_get_link_status(struct card * const sc)
 {
 	/* We're using the same code as SSI since they're practically
 	   the same */
@@ -226,6 +433,15 @@ static void lmc_hssi_watchdog(struct card * const sc)
 	/* HSSI is blank */
 }
 
+static void lmc_hssi_default(struct card * const sc)
+{
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+	lmc_hssi_set_link_status(sc, LMC_LINK_DOWN);
+	lmc_hssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	lmc_hssi_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+}
+
+
 /* DS3 methods */
 
 /* Set cable length */
@@ -241,13 +457,17 @@ static void lmc_ds3_set_100ft(struct card * const sc, int ie)
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void lmc_ds3_default(struct card * const sc)
+/* 1 == DS3 payload scrambled, 0 == not scrambled */
+static void lmc_ds3_set_scram(struct card * const sc, int ie)
 {
-	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-
-	lmc_ds3_set_100ft(sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
-	lmc_ds3_set_scram(sc, LMC_CTL_OFF);
-	lmc_ds3_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	if (ie == LMC_CTL_ON) {
+		sc->lmc_miireg16 |= LMC_MII16_DS3_SCRAM;
+		sc->ictl.scrambler_onoff = LMC_CTL_ON;
+	} else {
+		sc->lmc_miireg16 &= ~LMC_MII16_DS3_SCRAM;
+		sc->ictl.scrambler_onoff = LMC_CTL_OFF;
+	}
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
 /* Given a user provided state, set ourselves up to match it.
@@ -305,19 +525,6 @@ static void lmc_ds3_init(struct card * const sc)
 	}
 }
 
-/* 1 == DS3 payload scrambled, 0 == not scrambled */
-static void lmc_ds3_set_scram(struct card * const sc, int ie)
-{
-	if (ie == LMC_CTL_ON) {
-		sc->lmc_miireg16 |= LMC_MII16_DS3_SCRAM;
-		sc->ictl.scrambler_onoff = LMC_CTL_ON;
-	} else {
-		sc->lmc_miireg16 &= ~LMC_MII16_DS3_SCRAM;
-		sc->ictl.scrambler_onoff = LMC_CTL_OFF;
-	}
-	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-}
-
 /* Return hardware link status. 0 == link is down, 1 == link is up. */
 static int lmc_ds3_get_link_status(struct card * const sc)
 {
@@ -339,390 +546,103 @@ static int lmc_ds3_get_link_status(struct card * const sc)
 	lmc_led_on(sc, LMC_DS3_LED2);
 
 	if ((link_status & LMC_FRAMER_REG0_DLOS) ||
-	    (link_status & LMC_FRAMER_REG0_OOFS)) {
-		ret = 0;
-		if (sc->last_led_err[3] != 1) {
-			u16 r1;
-
-			 /* Turn on Xbit error as our cisco does */
-			lmc_mii_writereg(sc, 0, 17, 01);
-			r1 = lmc_mii_readreg(sc, 0, 18);
-			r1 &= 0xfe;
-			lmc_mii_writereg(sc, 0, 18, r1);
-			printk(KERN_WARNING
-			       "%s: Red Alarm - Loss of Signal or Loss of Framing\n",
-			       sc->name);
-		}
-		lmc_led_on(sc, LMC_DS3_LED3);	/* turn on red LED */
-		sc->last_led_err[3] = 1;
-	} else {
-		lmc_led_off(sc, LMC_DS3_LED3);	/* turn on red LED */
-		if (sc->last_led_err[3] == 1) {
-			u16 r1;
-			/* Turn off Xbit error */
-			lmc_mii_writereg(sc, 0, 17, 01);
-			r1 = lmc_mii_readreg(sc, 0, 18);
-			r1 |= 0x01;
-			lmc_mii_writereg(sc, 0, 18, r1);
-		}
-		sc->last_led_err[3] = 0;
-	}
-
-	lmc_mii_writereg(sc, 0, 17, 0x10);
-	link_status_11 = lmc_mii_readreg(sc, 0, 18);
-	if ((link_status & LMC_FRAMER_REG0_AIS) ||
-	   (link_status_11 & LMC_FRAMER_REG10_XBIT)) {
-		ret = 0;
-		if (sc->last_led_err[0] != 1) {
-			printk(KERN_WARNING
-			       "%s: AIS Alarm or XBit Error\n", sc->name);
-			printk(KERN_WARNING
-			       "%s: Remote end has loss of signal or framing\n",
-			       sc->name);
-		}
-		lmc_led_on(sc, LMC_DS3_LED0);
-		sc->last_led_err[0] = 1;
-	} else {
-		lmc_led_off(sc, LMC_DS3_LED0);
-		sc->last_led_err[0] = 0;
-	}
-
-	lmc_mii_writereg(sc, 0, 17, 9);
-	link_status = lmc_mii_readreg(sc, 0, 18);
-
-	if (link_status & LMC_FRAMER_REG9_RBLUE) {
-		ret = 0;
-		if (sc->last_led_err[1] != 1) {
-			printk(KERN_WARNING
-			       "%s: Blue Alarm - Receiving all 1's\n",
-			       sc->name);
-		}
-		lmc_led_on(sc, LMC_DS3_LED1);
-		sc->last_led_err[1] = 1;
-	} else {
-		lmc_led_off(sc, LMC_DS3_LED1);
-		sc->last_led_err[1] = 0;
-	}
-
-	return ret;
-}
-
-/* 0 == 16bit, 1 == 32bit */
-static void lmc_ds3_set_crc_length(struct card * const sc, int state)
-{
-	if (state == LMC_CTL_CRC_LENGTH_32) {
-		/* 32 bit */
-		sc->lmc_miireg16 |= LMC_MII16_DS3_CRC;
-		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
-	} else {
-		/* 16 bit */
-		sc->lmc_miireg16 &= ~LMC_MII16_DS3_CRC;
-		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
-	}
-
-	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-}
-
-static void lmc_ds3_watchdog(struct card * const sc)
-{
-}
-
-
-/* SSI methods */
-
-static void lmc_ssi_init(struct card * const sc)
-{
-	u16 mii17;
-	int cable;
-
-	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1000;
-
-	mii17 = lmc_mii_readreg(sc, 0, 17);
-
-	cable = (mii17 & LMC_MII17_SSI_CABLE_MASK) >> LMC_MII17_SSI_CABLE_SHIFT;
-	sc->ictl.cable_type = cable;
-
-	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
-}
-
-static void lmc_ssi_default(struct card * const sc)
-{
-	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-
-	/* make TXCLOCK always be an output */
-	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
-
-	lmc_ssi_set_link_status(sc, LMC_LINK_DOWN);
-	lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
-	lmc_ssi_set_speed(sc, NULL);
-	lmc_ssi_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
-}
-
-/* Given a user provided state, set ourselves up to match it.
-   This will always reset the card if needed. */
-static void lmc_ssi_set_status(struct card * const sc, struct control *ctl)
-{
-	if (ctl == NULL) {
-		lmc_ssi_set_clock(sc, sc->ictl.clock_source);
-		lmc_ssi_set_speed(sc, &sc->ictl);
-		lmc_set_protocol(sc, NULL);
-		return;
-	}
-
-	/* check for change in clock source */
-	if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_INT
-	    && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_EXT) {
-		lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_INT);
-		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
-	} else if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_EXT
-		 && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_INT) {
-		lmc_ssi_set_clock(sc, LMC_CTL_CLOCK_SOURCE_EXT);
-		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-	}
-
-	if (ctl->clock_rate != sc->ictl.clock_rate)
-		lmc_ssi_set_speed(sc, ctl);
-
-	lmc_set_protocol(sc, ctl);
-}
-
-/* 1 == internal, 0 == external */
-static void lmc_ssi_set_clock(struct card * const sc, int ie)
-{
-	int old;
-	old = ie;
-	if (ie == LMC_CTL_CLOCK_SOURCE_EXT) {
-		sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
-		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-		if (ie != old)
-			printk(LMC_PRINTF_FMT ": clock external\n",
-			       LMC_PRINTF_ARGS);
-	} else {
-		sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
-		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-		if (ie != old)
-			printk(LMC_PRINTF_FMT ": clock internal\n",
-			       LMC_PRINTF_ARGS);
-	}
-}
-
-static void lmc_ssi_set_speed(struct card * const sc, struct control *ctl)
-{
-	struct control *ictl = &sc->ictl;
-	lmc_av9110_t *av;
-
-	/* original settings for clock rate of 100 Khz (8,25,0,0,2) were
-	   incorrect. They should have been 80,125,1,3,3. There are 17 param
-	   combinations to produce this freq. For 1.5 Mhz use 120,100,1,1,2
-	   (226 param. combinations) */
-	if (ctl == NULL) {
-		av = &ictl->cardspec.ssi;
-		ictl->clock_rate = 1500000;
-		av->f = ictl->clock_rate;
-		av->n = 120;
-		av->m = 100;
-		av->v = 1;
-		av->x = 1;
-		av->r = 2;
-		write_av9110(sc, av->n, av->m, av->v, av->x, av->r);
-		return;
-	}
-
-	av = &ctl->cardspec.ssi;
-
-	if (av->f == 0)
-		return;
-
-	ictl->clock_rate = av->f;	/* really, this is the rate we are */
-	ictl->cardspec.ssi = *av;
-
-	write_av9110(sc, av->n, av->m, av->v, av->x, av->r);
-}
-
-/* Return hardware link status. 0 == link is down, 1 == link is up. */
-static int lmc_ssi_get_link_status(struct card * const sc)
-{
-	u16 link_status;
-	u32 ticks;
-	int ret = 1;
-	int hw_hdsk = 1;
-
-	/* missing CTS?  Hmm.  If we require CTS on, we may never get the
-	   link to come up, so omit it in this test.
-
-	   Also, it seems that with a loopback cable, DCD isn't asserted,
-	   so just check for things like this:
-	   - DSR _must_ be asserted.
-	   - One of DCD or CTS must be asserted. */
-
-	/* LMC 1000 (SSI) LED definitions
-	   - led0 green = power to adapter, Gate Array loaded & driver attached
-	   - led1 green = DSR and DTR and RTS and CTS are set
-	   - led2 green = Cable detected
-	   - led3 red   = No timing is available from the cable or the on-board
-			  frequency generator. */
-
-	link_status = lmc_mii_readreg(sc, 0, 16);
-
-	/* Is the transmit clock still available */
-	ticks = LMC_CSR_READ(sc, csr_gp_timer);
-	ticks = 0x0000ffff - (ticks & 0x0000ffff);
-
-	lmc_led_on(sc, LMC_MII16_LED0);
-
-	/* transmit clock determination */
-	if (sc->lmc_timing == LMC_CTL_CLOCK_SOURCE_INT)
-		lmc_led_off(sc, LMC_MII16_LED3);
-	else if (ticks == 0) {	/* no clock found ? */
+	    (link_status & LMC_FRAMER_REG0_OOFS)) {
 		ret = 0;
 		if (sc->last_led_err[3] != 1) {
-			sc->extra_stats.tx_lossOfClockCnt++;
-			printk(KERN_WARNING "%s: Lost Clock, Link Down\n",
+			u16 r1;
+
+			 /* Turn on Xbit error as our cisco does */
+			lmc_mii_writereg(sc, 0, 17, 01);
+			r1 = lmc_mii_readreg(sc, 0, 18);
+			r1 &= 0xfe;
+			lmc_mii_writereg(sc, 0, 18, r1);
+			printk(KERN_WARNING
+			       "%s: Red Alarm - Loss of Signal or Loss of Framing\n",
 			       sc->name);
 		}
+		lmc_led_on(sc, LMC_DS3_LED3);	/* turn on red LED */
 		sc->last_led_err[3] = 1;
-		lmc_led_on(sc, LMC_MII16_LED3);	/* turn ON red LED */
 	} else {
-		if (sc->last_led_err[3] == 1)
-			printk(KERN_WARNING "%s: Clock Returned\n", sc->name);
+		lmc_led_off(sc, LMC_DS3_LED3);	/* turn on red LED */
+		if (sc->last_led_err[3] == 1) {
+			u16 r1;
+			/* Turn off Xbit error */
+			lmc_mii_writereg(sc, 0, 17, 01);
+			r1 = lmc_mii_readreg(sc, 0, 18);
+			r1 |= 0x01;
+			lmc_mii_writereg(sc, 0, 18, r1);
+		}
 		sc->last_led_err[3] = 0;
-		lmc_led_off(sc, LMC_MII16_LED3); /* turn OFF red LED */
 	}
 
-	if ((link_status & LMC_MII16_SSI_DSR) == 0) { /* Also HSSI CA */
+	lmc_mii_writereg(sc, 0, 17, 0x10);
+	link_status_11 = lmc_mii_readreg(sc, 0, 18);
+	if ((link_status & LMC_FRAMER_REG0_AIS) ||
+	   (link_status_11 & LMC_FRAMER_REG10_XBIT)) {
 		ret = 0;
-		hw_hdsk = 0;
+		if (sc->last_led_err[0] != 1) {
+			printk(KERN_WARNING
+			       "%s: AIS Alarm or XBit Error\n", sc->name);
+			printk(KERN_WARNING
+			       "%s: Remote end has loss of signal or framing\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED0);
+		sc->last_led_err[0] = 1;
+	} else {
+		lmc_led_off(sc, LMC_DS3_LED0);
+		sc->last_led_err[0] = 0;
 	}
 
-#ifdef CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE
-	if ((link_status & (LMC_MII16_SSI_CTS | LMC_MII16_SSI_DCD)) == 0) {
-		ret = 0;
-		hw_hdsk = 0;
-	}
-#endif
+	lmc_mii_writereg(sc, 0, 17, 9);
+	link_status = lmc_mii_readreg(sc, 0, 18);
 
-	if (hw_hdsk == 0) {
-		if (sc->last_led_err[1] != 1)
-			printk(KERN_WARNING "%s: DSR not asserted\n", sc->name);
+	if (link_status & LMC_FRAMER_REG9_RBLUE) {
+		ret = 0;
+		if (sc->last_led_err[1] != 1) {
+			printk(KERN_WARNING
+			       "%s: Blue Alarm - Receiving all 1's\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED1);
 		sc->last_led_err[1] = 1;
-		lmc_led_off(sc, LMC_MII16_LED1);
 	} else {
-		if (sc->last_led_err[1] != 0)
-			printk(KERN_WARNING "%s: DSR now asserted\n", sc->name);
+		lmc_led_off(sc, LMC_DS3_LED1);
 		sc->last_led_err[1] = 0;
-		lmc_led_on(sc, LMC_MII16_LED1);
 	}
 
-	if (ret == 1)
-		lmc_led_on(sc, LMC_MII16_LED2); /* Over all good status? */
-
 	return ret;
 }
 
-static void lmc_ssi_set_link_status(struct card * const sc, int state)
-{
-	if (state == LMC_LINK_UP) {
-		sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
-		printk(LMC_PRINTF_FMT ": asserting DTR and RTS\n",
-		       LMC_PRINTF_ARGS);
-	} else {
-		sc->lmc_miireg16 &= ~(LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
-		printk(LMC_PRINTF_FMT ": deasserting DTR and RTS\n",
-		       LMC_PRINTF_ARGS);
-	}
-
-	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-
-}
-
 /* 0 == 16bit, 1 == 32bit */
-static void lmc_ssi_set_crc_length(struct card * const sc, int state)
+static void lmc_ds3_set_crc_length(struct card * const sc, int state)
 {
 	if (state == LMC_CTL_CRC_LENGTH_32) {
 		/* 32 bit */
-		sc->lmc_miireg16 |= LMC_MII16_SSI_CRC;
+		sc->lmc_miireg16 |= LMC_MII16_DS3_CRC;
 		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
-		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
-
 	} else {
 		/* 16 bit */
-		sc->lmc_miireg16 &= ~LMC_MII16_SSI_CRC;
+		sc->lmc_miireg16 &= ~LMC_MII16_DS3_CRC;
 		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
-		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
 	}
 
 	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-/* These are bits to program the ssi frequency generator */
-static inline void write_av9110_bit(struct card *sc, int c)
+static void lmc_ds3_watchdog(struct card * const sc)
 {
-	/* set the data bit as we need it. */
-	sc->lmc_gpio &= ~(LMC_GEP_CLK);
-	if (c & 0x01)
-		sc->lmc_gpio |= LMC_GEP_DATA;
-	else
-		sc->lmc_gpio &= ~(LMC_GEP_DATA);
-	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-	/* set the clock to high */
-	sc->lmc_gpio |= LMC_GEP_CLK;
-	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-	/* set the clock to low again. */
-	sc->lmc_gpio &= ~(LMC_GEP_CLK);
-	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
 }
 
-static void write_av9110(struct card *sc, u32 n, u32 m, u32 v, u32 x, u32 r)
+static void lmc_ds3_default(struct card * const sc)
 {
-	int i;
-
-#if 0
-	printk(LMC_PRINTF_FMT ": speed %u, %d %d %d %d %d\n",
-	       LMC_PRINTF_ARGS, sc->ictl.clock_rate, n, m, v, x, r);
-#endif
-
-	sc->lmc_gpio |= LMC_GEP_SSI_GENERATOR;
-	sc->lmc_gpio &= ~(LMC_GEP_DATA | LMC_GEP_CLK);
-	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-	/* Set the TXCLOCK, GENERATOR, SERIAL, and SERIALCLK as outputs. */
-	lmc_gpio_mkoutput(sc, (LMC_GEP_DATA | LMC_GEP_CLK
-				| LMC_GEP_SSI_GENERATOR));
-
-	sc->lmc_gpio &= ~(LMC_GEP_SSI_GENERATOR);
-	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-	/* a shifting we will go... */
-	for (i = 0; i < 7; i++)
-		write_av9110_bit(sc, n >> i);
-	for (i = 0; i < 7; i++)
-		write_av9110_bit(sc, m >> i);
-	for (i = 0; i < 1; i++)
-		write_av9110_bit(sc, v >> i);
-	for (i = 0; i < 2; i++)
-		write_av9110_bit(sc, x >> i);
-	for (i = 0; i < 2; i++)
-		write_av9110_bit(sc, r >> i);
-	for (i = 0; i < 5; i++)
-		write_av9110_bit(sc, 0x17 >> i);
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
-	/* stop driving serial-related signals */
-	lmc_gpio_mkinput(sc, (LMC_GEP_DATA | LMC_GEP_CLK |
-			      LMC_GEP_SSI_GENERATOR));
+	lmc_ds3_set_100ft(sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
+	lmc_ds3_set_scram(sc, LMC_CTL_OFF);
+	lmc_ds3_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
-static void lmc_ssi_watchdog(struct card * const sc)
-{
-	u16 mii17 = lmc_mii_readreg(sc, 0, 17);
-	if (((mii17 >> 3) & 7) == 7)
-		lmc_led_off(sc, LMC_MII16_LED2);
-	else
-		lmc_led_on(sc, LMC_MII16_LED2);
-}
 
 /* T1 methods */
 
@@ -742,6 +662,21 @@ static int lmc_t1_read(struct card * const sc, int a)
 }
 */
 
+/* 1 == T1 Circuit Type , 0 == E1 Circuit Type */
+static void lmc_t1_set_circuit_type(struct card * const sc, int ie)
+{
+	if (ie == LMC_CTL_CIRCUIT_TYPE_T1) {
+		sc->lmc_miireg16 |= LMC_MII16_T1_Z;
+		sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_T1;
+		printk(KERN_INFO "%s: In T1 Mode\n", sc->name);
+	} else {
+		sc->lmc_miireg16 &= ~LMC_MII16_T1_Z;
+		sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_E1;
+		printk(KERN_INFO "%s: In E1 Mode\n", sc->name);
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+}
 
 static void lmc_t1_init(struct card * const sc)
 {
@@ -802,14 +737,6 @@ static void lmc_t1_init(struct card * const sc)
 	sc->lmc_miireg16 = mii16;
 }
 
-static void lmc_t1_default(struct card * const sc)
-{
-	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-	lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
-	lmc_t1_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
-	/* Right now we can only clock from out internal source */
-	sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-}
 /* Given a user provided state, set ourselves up to match it.
    This will always reset the card if needed. */
 static void lmc_t1_set_status(struct card * const sc, struct control *ctl)
@@ -939,22 +866,6 @@ static int lmc_t1_get_link_status(struct card * const sc)
 	return ret;
 }
 
-/* 1 == T1 Circuit Type , 0 == E1 Circuit Type */
-static void lmc_t1_set_circuit_type(struct card * const sc, int ie)
-{
-	if (ie == LMC_CTL_CIRCUIT_TYPE_T1) {
-		sc->lmc_miireg16 |= LMC_MII16_T1_Z;
-		sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_T1;
-		printk(KERN_INFO "%s: In T1 Mode\n", sc->name);
-	} else {
-		sc->lmc_miireg16 &= ~LMC_MII16_T1_Z;
-		sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_E1;
-		printk(KERN_INFO "%s: In E1 Mode\n", sc->name);
-	}
-
-	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-}
-
 /* 0 == 16bit, 1 == 32bit */
 static void lmc_t1_set_crc_length(struct card * const sc, int state)
 {
@@ -1000,8 +911,57 @@ static void lmc_t1_watchdog(struct card * const sc)
 {
 }
 
-static void lmc_set_protocol(struct card * const sc, struct control *ctl)
+static void lmc_t1_default(struct card * const sc)
 {
-	if (!ctl)
-		sc->ictl.keepalive_onoff = LMC_CTL_ON;
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+	lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
+	lmc_t1_set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	/* Right now we can only clock from out internal source */
+	sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
 }
+
+
+struct media lmc_ssi_media = {
+	.init = lmc_ssi_init,
+	.defaults = lmc_ssi_default,
+	.set_status = lmc_ssi_set_status,
+	.set_clock_source = lmc_ssi_set_clock,
+	.set_speed = lmc_ssi_set_speed,
+	.get_link_status = lmc_ssi_get_link_status,
+	.set_link_status = lmc_ssi_set_link_status,
+	.set_crc_length = lmc_ssi_set_crc_length,
+	.watchdog = lmc_ssi_watchdog,
+};
+
+struct media lmc_hssi_media = {
+	.init = lmc_hssi_init,
+	.defaults = lmc_hssi_default,
+	.set_status = lmc_hssi_set_status,
+	.set_clock_source = lmc_hssi_set_clock,
+	.get_link_status = lmc_hssi_get_link_status,
+	.set_link_status = lmc_hssi_set_link_status,
+	.set_crc_length = lmc_hssi_set_crc_length,
+	.watchdog = lmc_hssi_watchdog,
+};
+
+struct media lmc_ds3_media = {
+	.init = lmc_ds3_init,
+	.defaults = lmc_ds3_default,
+	.set_status = lmc_ds3_set_status,
+	.set_cable_length = lmc_ds3_set_100ft,
+	.set_scrambler = lmc_ds3_set_scram,
+	.get_link_status = lmc_ds3_get_link_status,
+	.set_crc_length = lmc_ds3_set_crc_length,
+	.watchdog = lmc_ds3_watchdog,
+};
+
+struct media lmc_t1_media = {
+	.init = lmc_t1_init,
+	.defaults = lmc_t1_default,
+	.set_status = lmc_t1_set_status,
+	.set_clock_source = lmc_t1_set_clock,
+	.get_link_status = lmc_t1_get_link_status,
+	.set_crc_length = lmc_t1_set_crc_length,
+	.set_circuit_type = lmc_t1_set_circuit_type,
+	.watchdog = lmc_t1_watchdog,
+};
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 11/29] LMC: Get rid of lmcConsoleLog().
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/debug.c |   34 ----------------------------------
 drivers/net/wan/lmc/debug.h |   13 -------------
 drivers/net/wan/lmc/main.c  |   17 ++++++++++++++---
 3 files changed, 14 insertions(+), 50 deletions(-)

diff --git a/drivers/net/wan/lmc/debug.c b/drivers/net/wan/lmc/debug.c
index 0abae05..e01b6e2 100644
--- a/drivers/net/wan/lmc/debug.c
+++ b/drivers/net/wan/lmc/debug.c
@@ -7,40 +7,6 @@
  * Prints out len, max to 80 octets using printk, 20 per line
  */
 
-#if defined(DEBUG) && defined(LMC_PACKET_LOG)
-void lmcConsoleLog(char *type, unsigned char *ucData, int iLen)
-{
-	int iNewLine = 1;
-	char str[80], *pstr;
-
-	sprintf(str, KERN_DEBUG "lmc: %s: ", type);
-	pstr = str+strlen(str);
-
-	if (iLen > 240) {
-		printk(KERN_DEBUG "lmc: Printing 240 chars... out of: %d\n",
-		       iLen);
-		iLen = 240;
-	} else
-		printk(KERN_DEBUG "lmc: Printing %d chars\n", iLen);
-
-	while (iLen > 0) {
-		sprintf(pstr, "%02x ", *ucData);
-		pstr += 3;
-		ucData++;
-		if (!(iNewLine % 20)) {
-			sprintf(pstr, "\n");
-			printk(str);
-			sprintf(str, KERN_DEBUG "lmc: %s: ", type);
-			pstr = str + strlen(str);
-		}
-		iNewLine++;
-		iLen--;
-	}
-	sprintf(pstr, "\n");
-	printk(str);
-}
-#endif
-
 #ifdef DEBUG
 u32 lmcEventLogIndex;
 u32 lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
diff --git a/drivers/net/wan/lmc/debug.h b/drivers/net/wan/lmc/debug.h
index 289f7d9..6bee4ee 100644
--- a/drivers/net/wan/lmc/debug.h
+++ b/drivers/net/wan/lmc/debug.h
@@ -1,18 +1,6 @@
 #ifndef _LMC_DEBUG_H_
 #define _LMC_DEBUG_H_
 
-#ifdef DEBUG
-#ifdef LMC_PACKET_LOG
-#define LMC_CONSOLE_LOG(x, y, z) lmcConsoleLog((x), (y), (z))
-#else
-#define LMC_CONSOLE_LOG(x, y, z)
-#endif
-#else
-#define LMC_CONSOLE_LOG(x, y, z)
-#endif
-
-
-
 /* Debug --- Event log definitions --- */
 /* EVENTLOGSIZE*EVENTLOGARGS needs to be a power of 2 */
 #define LMC_EVENTLOGSIZE 1024	/* number of events in eventlog */
@@ -45,7 +33,6 @@ extern u32 lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
 #define LMC_EVENT_LOG(x, y, z)
 #endif /* end ifdef _DBG_EVENTLOG */
 
-void lmcConsoleLog(char *type, unsigned char *ucData, int iLen);
 void lmcEventLog(u32 EventNum, u32 arg2, u32 arg3);
 void lmc_trace(struct net_device *dev, char *msg);
 
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index 1fbd802..a19d63a 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -62,6 +62,8 @@
 #include <asm/processor.h>   /* Processor type for cache alignment. */
 #include <asm/dma.h>
 
+#undef DEBUG_PKT
+
 #define DRIVER_MAJOR_VERSION     1
 #define DRIVER_MINOR_VERSION    34
 #define DRIVER_SUB_VERSION       0
@@ -1329,7 +1331,10 @@ static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 	sc->lmc_txq[entry] = skb;
 	sc->lmc_txring[entry].buffer1 = virt_to_bus(skb->data);
 
-	LMC_CONSOLE_LOG("xmit", skb->data, skb->len);
+#ifdef DEBUG_PKT
+	printk(KERN_DEBUG "%s TX(%i):", dev->name, skb->len);
+	debug_frame(skb);
+#endif
 
 #ifndef GCOM
 	/* If the queue is less than half full, don't interrupt */
@@ -1479,8 +1484,6 @@ static int lmc_rx(struct net_device *dev)
 		sc->lmc_device->stats.rx_packets++;
 		sc->lmc_device->stats.rx_bytes += len;
 
-		LMC_CONSOLE_LOG("recv", skb->data, len);
-
 		/* I'm not sure of the sanity of this. Packets could be arriving
 		   at a constant 44.210mbits/sec and we're going to copy them
 		   into a new buffer?? */
@@ -1493,6 +1496,10 @@ give_it_anyways:
 			sc->lmc_rxring[i].buffer1 = 0x0;
 
 			skb_put(skb, len);
+#ifdef DEBUG_PKT
+			printk(KERN_DEBUG "%s RX(%i):", dev->name, len);
+			debug_frame(skb);
+#endif
 			skb->protocol = hdlc_type_trans(skb, sc->lmc_device);
 			skb_reset_mac_header(skb);
 			/* skb_reset_network_header(skb); */
@@ -1524,6 +1531,10 @@ give_it_anyways:
 			if (!nsb)
 				goto give_it_anyways;
 			skb_copy_from_linear_data(skb, skb_put(nsb, len), len);
+#ifdef DEBUG_PKT
+			printk(KERN_DEBUG "%s RX(%i):", dev->name, len);
+			debug_frame(nsb);
+#endif
 			nsb->protocol = hdlc_type_trans(nsb, sc->lmc_device);
 			skb_reset_mac_header(nsb);
 			/* skb_reset_network_header(nsb); */
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 13/29] LMC: Get rid of debug.[ch].
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/Makefile |    2 +-
 drivers/net/wan/lmc/debug.c  |   23 -----------------------
 drivers/net/wan/lmc/debug.h  |    6 ------
 drivers/net/wan/lmc/lmc.h    |   18 ------------------
 drivers/net/wan/lmc/main.c   |    1 -
 drivers/net/wan/lmc/media.c  |    1 -
 drivers/net/wan/lmc/var.h    |   38 ++++++++++++++++++++++++++++++++++++++
 7 files changed, 39 insertions(+), 50 deletions(-)
 delete mode 100644 drivers/net/wan/lmc/debug.c
 delete mode 100644 drivers/net/wan/lmc/debug.h

diff --git a/drivers/net/wan/lmc/Makefile b/drivers/net/wan/lmc/Makefile
index 2f461a7..6c21b7c 100644
--- a/drivers/net/wan/lmc/Makefile
+++ b/drivers/net/wan/lmc/Makefile
@@ -5,7 +5,7 @@
 
 obj-$(CONFIG_LANMEDIA) += lmc.o
 
-lmc-objs := debug.o media.o main.o
+lmc-objs := media.o main.o
 
 # Like above except every packet gets echoed to KERN_DEBUG
 # in hex
diff --git a/drivers/net/wan/lmc/debug.c b/drivers/net/wan/lmc/debug.c
deleted file mode 100644
index 7c05cfe..0000000
--- a/drivers/net/wan/lmc/debug.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <linux/types.h>
-#include <linux/netdevice.h>
-#include <linux/interrupt.h>
-#include "debug.h"
-
-void lmc_trace(struct net_device *dev, char *msg)
-{
-#ifdef LMC_TRACE
-	unsigned long j = jiffies + 3; /* Wait for 50 ms */
-
-	if (in_interrupt()) {
-		printk(KERN_DEBUG "%s: * %s\n", dev->name, msg);
-#if 0
-		while (time_before(jiffies, j + 10))
-			;
-#endif
-	} else {
-		printk(KERN_DEBUG "%s: %s\n", dev->name, msg);
-		while (time_before(jiffies, j))
-			schedule();
-	}
-#endif
-}
diff --git a/drivers/net/wan/lmc/debug.h b/drivers/net/wan/lmc/debug.h
deleted file mode 100644
index f026077..0000000
--- a/drivers/net/wan/lmc/debug.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _LMC_DEBUG_H_
-#define _LMC_DEBUG_H_
-
-void lmc_trace(struct net_device *dev, char *msg);
-
-#endif
diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h
index 4ab8fe8..5f467d1 100644
--- a/drivers/net/wan/lmc/lmc.h
+++ b/drivers/net/wan/lmc/lmc.h
@@ -3,22 +3,4 @@
 
 #include "var.h"
 
-int lmc_probe(struct net_device *dev);
-unsigned lmc_mii_readreg(struct card * const sc, unsigned devaddr,
-			 unsigned regno);
-void lmc_mii_writereg(struct card * const sc, unsigned devaddr,
-		      unsigned regno, unsigned data);
-void lmc_led_on(struct card * const, u32);
-void lmc_led_off(struct card * const, u32);
-unsigned lmc_mii_readreg(struct card * const, unsigned, unsigned);
-void lmc_mii_writereg(struct card * const, unsigned, unsigned, unsigned);
-void lmc_gpio_mkinput(struct card * const sc, u32 bits);
-void lmc_gpio_mkoutput(struct card * const sc, u32 bits);
-int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-
-extern struct media lmc_ds3_media;
-extern struct media lmc_ssi_media;
-extern struct media lmc_t1_media;
-extern struct media lmc_hssi_media;
-
 #endif
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index dc7e435..c80131f 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -73,7 +73,6 @@
 #include "lmc.h"
 #include "var.h"
 #include "ioctl.h"
-#include "debug.h"
 
 static int LMC_PKT_BUF_SZ = 1542;
 
diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 2411214..9b1c394 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -19,7 +19,6 @@
 #include "lmc.h"
 #include "var.h"
 #include "ioctl.h"
-#include "debug.h"
 
 #define CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE 1
 
diff --git a/drivers/net/wan/lmc/var.h b/drivers/net/wan/lmc/var.h
index b889bf6..d694731 100644
--- a/drivers/net/wan/lmc/var.h
+++ b/drivers/net/wan/lmc/var.h
@@ -433,4 +433,42 @@ struct card {
 #define LMC_CRC_LEN_16		2	/* 16-bit CRC */
 #define LMC_CRC_LEN_32		4
 
+extern struct media lmc_ds3_media;
+extern struct media lmc_ssi_media;
+extern struct media lmc_t1_media;
+extern struct media lmc_hssi_media;
+
+static inline void lmc_trace(struct net_device *dev, char *msg)
+{
+#ifdef LMC_TRACE
+	unsigned long j = jiffies + 3; /* Wait for 50 ms */
+
+	if (in_interrupt()) {
+		printk(KERN_DEBUG "%s: * %s\n", dev->name, msg);
+#if 0
+		while (time_before(jiffies, j + 10))
+			;
+#endif
+	} else {
+		printk(KERN_DEBUG "%s: %s\n", dev->name, msg);
+		while (time_before(jiffies, j))
+			schedule();
+	}
+#endif
+}
+
+
+int lmc_probe(struct net_device *dev);
+unsigned lmc_mii_readreg(struct card * const sc, unsigned devaddr,
+			 unsigned regno);
+void lmc_mii_writereg(struct card * const sc, unsigned devaddr,
+		      unsigned regno, unsigned data);
+void lmc_led_on(struct card * const, u32);
+void lmc_led_off(struct card * const, u32);
+unsigned lmc_mii_readreg(struct card * const, unsigned, unsigned);
+void lmc_mii_writereg(struct card * const, unsigned, unsigned, unsigned);
+void lmc_gpio_mkinput(struct card * const sc, u32 bits);
+void lmc_gpio_mkoutput(struct card * const sc, u32 bits);
+int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
+
 #endif /* _LMC_VAR_H_ */
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 12/29] LMC: Get rid of the event logger.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Nobody will use this stuff anyway. It's much simpler to debug this with
printk() and friends.

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/debug.c |   18 ----------
 drivers/net/wan/lmc/debug.h |   33 ------------------
 drivers/net/wan/lmc/ioctl.h |    2 +-
 drivers/net/wan/lmc/lmc.h   |    4 --
 drivers/net/wan/lmc/main.c  |   79 ++++--------------------------------------
 5 files changed, 9 insertions(+), 127 deletions(-)

diff --git a/drivers/net/wan/lmc/debug.c b/drivers/net/wan/lmc/debug.c
index e01b6e2..7c05cfe 100644
--- a/drivers/net/wan/lmc/debug.c
+++ b/drivers/net/wan/lmc/debug.c
@@ -3,24 +3,6 @@
 #include <linux/interrupt.h>
 #include "debug.h"
 
-/*
- * Prints out len, max to 80 octets using printk, 20 per line
- */
-
-#ifdef DEBUG
-u32 lmcEventLogIndex;
-u32 lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
-
-void lmcEventLog(u32 EventNum, u32 arg2, u32 arg3)
-{
-	lmcEventLogBuf[lmcEventLogIndex++] = EventNum;
-	lmcEventLogBuf[lmcEventLogIndex++] = arg2;
-	lmcEventLogBuf[lmcEventLogIndex++] = arg3;
-	lmcEventLogBuf[lmcEventLogIndex++] = jiffies;
-	lmcEventLogIndex &= (LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS) - 1;
-}
-#endif  /* DEBUG */
-
 void lmc_trace(struct net_device *dev, char *msg)
 {
 #ifdef LMC_TRACE
diff --git a/drivers/net/wan/lmc/debug.h b/drivers/net/wan/lmc/debug.h
index 6bee4ee..f026077 100644
--- a/drivers/net/wan/lmc/debug.h
+++ b/drivers/net/wan/lmc/debug.h
@@ -1,39 +1,6 @@
 #ifndef _LMC_DEBUG_H_
 #define _LMC_DEBUG_H_
 
-/* Debug --- Event log definitions --- */
-/* EVENTLOGSIZE*EVENTLOGARGS needs to be a power of 2 */
-#define LMC_EVENTLOGSIZE 1024	/* number of events in eventlog */
-#define LMC_EVENTLOGARGS 4		/* number of args for each event */
-
-/* event indicators */
-#define LMC_EVENT_XMT           1
-#define LMC_EVENT_XMTEND        2
-#define LMC_EVENT_XMTINT        3
-#define LMC_EVENT_RCVINT        4
-#define LMC_EVENT_RCVEND        5
-#define LMC_EVENT_INT           6
-#define LMC_EVENT_XMTINTTMO     7
-#define LMC_EVENT_XMTPRCTMO     8
-#define LMC_EVENT_INTEND        9
-#define LMC_EVENT_RESET1       10
-#define LMC_EVENT_RESET2       11
-#define LMC_EVENT_FORCEDRESET  12
-#define LMC_EVENT_WATCHDOG     13
-#define LMC_EVENT_BADPKTSURGE  14
-#define LMC_EVENT_TBUSY0       15
-#define LMC_EVENT_TBUSY1       16
-
-
-#ifdef DEBUG
-extern u32 lmcEventLogIndex;
-extern u32 lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
-#define LMC_EVENT_LOG(x, y, z) lmcEventLog((x), (y), (z))
-#else
-#define LMC_EVENT_LOG(x, y, z)
-#endif /* end ifdef _DBG_EVENTLOG */
-
-void lmcEventLog(u32 EventNum, u32 arg2, u32 arg3);
 void lmc_trace(struct net_device *dev, char *msg);
 
 #endif
diff --git a/drivers/net/wan/lmc/ioctl.h b/drivers/net/wan/lmc/ioctl.h
index 45b97e0..1b7820f 100644
--- a/drivers/net/wan/lmc/ioctl.h
+++ b/drivers/net/wan/lmc/ioctl.h
@@ -18,7 +18,7 @@
 #define LMCIOCSINFO         (SIOCDEVPRIVATE + 4) /* set state to user values */
 #define LMCIOCGETLMCSTATS   (SIOCDEVPRIVATE + 5)
 #define LMCIOCCLEARLMCSTATS (SIOCDEVPRIVATE + 6)
-#define LMCIOCDUMPEVENTLOG  (SIOCDEVPRIVATE + 7)
+#define LMCIOCDUMPEVENTLOG  (SIOCDEVPRIVATE + 7) /* now unused */
 #define LMCIOCGETXINFO      (SIOCDEVPRIVATE + 8)
 #define LMCIOCSETCIRCUIT    (SIOCDEVPRIVATE + 9)
 #define LMCIOCUNUSEDATM     (SIOCDEVPRIVATE + 10)
diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h
index c3464b6..4ab8fe8 100644
--- a/drivers/net/wan/lmc/lmc.h
+++ b/drivers/net/wan/lmc/lmc.h
@@ -21,8 +21,4 @@ extern struct media lmc_ssi_media;
 extern struct media lmc_t1_media;
 extern struct media lmc_hssi_media;
 
-#ifdef _DBG_EVENTLOG
-static void lmcEventLog(u32 EventNum, u32 arg2, u32 arg3);
-#endif
-
 #endif
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index a19d63a..dc7e435 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -278,34 +278,16 @@ int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 
 		spin_lock_irqsave(&sc->lmc_lock, flags);
 		/* Reset driver and bring back to current state */
-		printk(KERN_DEBUG " REG16 before reset +%04x\n",
-		       lmc_mii_readreg(sc, 0, 16));
+		pr_debug("%s: REG16 before reset +%04x\n", dev->name,
+			 lmc_mii_readreg(sc, 0, 16));
 		lmc_running_reset(dev);
-		printk(KERN_DEBUG " REG16 after reset +%04x\n",
-		       lmc_mii_readreg(sc, 0, 16));
+		pr_debug("%s: REG16 after reset +%04x\n", dev->name,
+			 lmc_mii_readreg(sc, 0, 16));
 
-		LMC_EVENT_LOG(LMC_EVENT_FORCEDRESET,
-			      LMC_CSR_READ(sc, csr_status),
-			      lmc_mii_readreg(sc, 0, 16));
 		spin_unlock_irqrestore(&sc->lmc_lock, flags);
 		ret = 0;
 		break;
 
-#ifdef DEBUG
-	case LMCIOCDUMPEVENTLOG:
-		if (copy_to_user(ifr->ifr_data, &lmcEventLogIndex,
-				 sizeof(u32))) {
-			ret = -EFAULT;
-			break;
-		}
-		if (copy_to_user(ifr->ifr_data + sizeof(u32), lmcEventLogBuf,
-				 sizeof(lmcEventLogBuf)))
-			ret = -EFAULT;
-		else
-			ret = 0;
-
-		break;
-#endif /* end ifdef _DBG_EVENTLOG */
 	case LMCIOCT1CONTROL:
 		if (sc->lmc_cardtype != LMC_CARDTYPE_T1) {
 			ret = -EOPNOTSUPP;
@@ -616,9 +598,6 @@ static void lmc_watchdog(unsigned long data)
 	if (sc->lmc_ok == 0)
 		goto kick_timer;
 
-	LMC_EVENT_LOG(LMC_EVENT_WATCHDOG, LMC_CSR_READ(sc, csr_status),
-		      lmc_mii_readreg(sc, 0, 16));
-
 	/* --- begin time out check -----------------------------------
 	 * check for a transmit interrupt timeout
 	 * Has the packet xmt vs xmt serviced threshold been exceeded */
@@ -632,29 +611,16 @@ static void lmc_watchdog(unsigned long data)
 		   sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&
 		   sc->tx_TimeoutInd) {
 
-		LMC_EVENT_LOG(LMC_EVENT_XMTINTTMO,
-			      LMC_CSR_READ(sc, csr_status), 0);
-
 		sc->tx_TimeoutDisplay = 1;
 		sc->extra_stats.tx_TimeoutCnt++;
 
 		/* DEC chip is stuck, hit it with a RESET!!!! */
 		lmc_running_reset(dev);
 
-
 		/* look at receive & transmit process state to make sure
-		   they are running */
-		LMC_EVENT_LOG(LMC_EVENT_RESET1,
-			      LMC_CSR_READ(sc, csr_status), 0);
-
-		/* look at: DSR - 02  for Reg 16
-		 *          CTS - 08
-		 *          DCD - 10
-		 *          RI  - 20
-		 * for Reg 17
-		 */
-		LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
-			      lmc_mii_readreg(sc, 0, 17));
+		   they are running
+		   Reg 16: DSR = 2
+		   Reg 17: CTS = 8, DCD = 10, RI = 20 */
 
 		/* reset the transmit timeout detection flag */
 		sc->tx_TimeoutInd = 0;
@@ -934,10 +900,6 @@ static int lmc_open(struct net_device *dev)
 	lmc_dec_reset(sc);
 	lmc_reset(sc);
 
-	LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ(sc, csr_status), 0);
-	LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
-		      lmc_mii_readreg(sc, 0, 17));
-
 	if (sc->lmc_ok) {
 		lmc_trace(dev, "lmc_open lmc_ok out");
 		return 0;
@@ -1204,8 +1166,6 @@ static irqreturn_t lmc_interrupt(int irq, void *dev_instance)
 			while ((badtx < sc->lmc_next_tx)) {
 				stat = sc->lmc_txring[i].status;
 
-				LMC_EVENT_LOG(LMC_EVENT_XMTINT, stat,
-					      sc->lmc_txring[i].length);
 				/* If bit 31 is 1 the tulip owns it break out
 				   of the loop */
 				if (stat & 0x80000000)
@@ -1249,7 +1209,6 @@ static irqreturn_t lmc_interrupt(int irq, void *dev_instance)
 				       dev->name);
 				badtx += LMC_TXDESCS;
 			}
-			LMC_EVENT_LOG(LMC_EVENT_TBUSY0, n_compl, 0);
 			sc->lmc_txfull = 0;
 			netif_wake_queue(dev);
 			sc->extra_stats.tx_tbusy0++;
@@ -1289,12 +1248,6 @@ static irqreturn_t lmc_interrupt(int irq, void *dev_instance)
 			}
 			lmc_dec_reset(sc);
 			lmc_reset(sc);
-			LMC_EVENT_LOG(LMC_EVENT_RESET1,
-				      LMC_CSR_READ(sc, csr_status), 0);
-			LMC_EVENT_LOG(LMC_EVENT_RESET2,
-				      lmc_mii_readreg(sc, 0, 16),
-				      lmc_mii_readreg(sc, 0, 17));
-
 		}
 
 		if (max_work-- <= 0)
@@ -1304,7 +1257,6 @@ static irqreturn_t lmc_interrupt(int irq, void *dev_instance)
 		   interrupts */
 		csr = LMC_CSR_READ(sc, csr_status);
 	} /* end interrupt loop */
-	LMC_EVENT_LOG(LMC_EVENT_INT, firstcsr, csr);
 
 lmc_int_fail_out:
 	spin_unlock(&sc->lmc_lock);
@@ -1364,7 +1316,6 @@ static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 		sc->lmc_txfull = 1;
 		netif_stop_queue(dev);
 		sc->extra_stats.tx_tbusy1++;
-		LMC_EVENT_LOG(LMC_EVENT_TBUSY1, entry, 0);
 	}
 #endif
 
@@ -1382,7 +1333,6 @@ static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 	sc->lmc_next_tx++;
 
 	/* give ownership to the chip */
-	LMC_EVENT_LOG(LMC_EVENT_XMT, flag, entry);
 	sc->lmc_txring[entry].status = 0x80000000;
 
 	/* send now! */
@@ -1522,7 +1472,6 @@ give_it_anyways:
 				   and stop in which care we'll try to allocate
 				   the buffer again (once a second). */
 				sc->extra_stats.rx_BuffAllocErr++;
-				LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);
 				sc->failed_recv_alloc = 1;
 				goto skip_out_of_mem;
 			}
@@ -1543,7 +1492,6 @@ give_it_anyways:
 		}
 
 skip_packet:
-		LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);
 		sc->lmc_rxring[i].status = DESC_OWNED_BY_DC21X4;
 
 		sc->lmc_next_rx++;
@@ -1557,11 +1505,8 @@ skip_packet:
 	/* detect condition for LMC1000 where DSU cable attaches and fills
 	   descriptors with bogus packets */
 
-	if (localLengthErrCnt > LMC_RXDESCS - 3) {
+	if (localLengthErrCnt > LMC_RXDESCS - 3)
 		sc->extra_stats.rx_BadPktSurgeCnt++;
-		LMC_EVENT_LOG(LMC_EVENT_BADPKTSURGE, localLengthErrCnt,
-			      sc->extra_stats.rx_BadPktSurgeCnt);
-	}
 #endif
 
 	/* save max count of receive descriptors serviced */
@@ -1575,7 +1520,6 @@ skip_packet:
 			    != DESC_OWNED_BY_DC21X4)
 				rxIntLoopCnt++;
 		}
-		LMC_EVENT_LOG(LMC_EVENT_RCVEND, rxIntLoopCnt, 0);
 	}
 #endif
 
@@ -1950,15 +1894,8 @@ static void lmc_driver_timeout(struct net_device *dev)
 	/* Chip seems to have locked up. Reset it. This whips out all our
 	   decriptor table and starts from scartch. */
 
-	LMC_EVENT_LOG(LMC_EVENT_XMTPRCTMO, LMC_CSR_READ(sc, csr_status),
-		      sc->extra_stats.tx_ProcTimeout);
-
 	lmc_running_reset(dev);
 
-	LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ(sc, csr_status), 0);
-	LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
-		      lmc_mii_readreg(sc, 0, 17));
-
 	/* restart the tx processes */
 	csr6 = LMC_CSR_READ(sc, csr_command);
 	LMC_CSR_WRITE(sc, csr_command, csr6 | 0x0002);
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 01/29] LMC: whitespace and cosmetic fixes.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/lmc.h       |    9 +-
 drivers/net/wan/lmc/lmc_debug.c |  103 +-
 drivers/net/wan/lmc/lmc_debug.h |    8 +-
 drivers/net/wan/lmc/lmc_ioctl.h |  349 ++---
 drivers/net/wan/lmc/lmc_main.c  | 3348 +++++++++++++++++++--------------------
 drivers/net/wan/lmc/lmc_media.c | 1840 ++++++++++------------
 drivers/net/wan/lmc/lmc_proto.c |  129 +-
 drivers/net/wan/lmc/lmc_var.h   |  726 ++++-----
 8 files changed, 3059 insertions(+), 3453 deletions(-)

diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h
index 4ced7ac..6d3af03 100644
--- a/drivers/net/wan/lmc/lmc.h
+++ b/drivers/net/wan/lmc/lmc.h
@@ -3,14 +3,11 @@
 
 #include "lmc_var.h"
 
-/*
- * prototypes for everyone
- */
-int lmc_probe(struct net_device * dev);
+int lmc_probe(struct net_device *dev);
 unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned
-      			  devaddr, unsigned regno);
+			 devaddr, unsigned regno);
 void lmc_mii_writereg(lmc_softc_t * const sc, unsigned devaddr,
-			       unsigned regno, unsigned data);
+		      unsigned regno, unsigned data);
 void lmc_led_on(lmc_softc_t * const, u32);
 void lmc_led_off(lmc_softc_t * const, u32);
 unsigned lmc_mii_readreg(lmc_softc_t * const, unsigned, unsigned);
diff --git a/drivers/net/wan/lmc/lmc_debug.c b/drivers/net/wan/lmc/lmc_debug.c
index 15049d7..35a8610 100644
--- a/drivers/net/wan/lmc/lmc_debug.c
+++ b/drivers/net/wan/lmc/lmc_debug.c
@@ -1,50 +1,45 @@
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/interrupt.h>
-
 #include "lmc_debug.h"
 
 /*
  * Prints out len, max to 80 octets using printk, 20 per line
  */
-#ifdef DEBUG
-#ifdef LMC_PACKET_LOG
+
+#if defined(DEBUG) && defined(LMC_PACKET_LOG)
 void lmcConsoleLog(char *type, unsigned char *ucData, int iLen)
 {
-  int iNewLine = 1;
-  char str[80], *pstr;
-  
-  sprintf(str, KERN_DEBUG "lmc: %s: ", type);
-  pstr = str+strlen(str);
-  
-  if(iLen > 240){
-      printk(KERN_DEBUG "lmc: Printing 240 chars... out of: %d\n", iLen);
-    iLen = 240;
-  }
-  else{
-      printk(KERN_DEBUG "lmc: Printing %d chars\n", iLen);
-  }
+	int iNewLine = 1;
+	char str[80], *pstr;
 
-  while(iLen > 0) 
-    {
-      sprintf(pstr, "%02x ", *ucData);
-      pstr+=3;
-      ucData++;
-      if( !(iNewLine % 20))
-	{
-	  sprintf(pstr, "\n");
-	  printk(str);
-	  sprintf(str, KERN_DEBUG "lmc: %s: ", type);
-	  pstr=str+strlen(str);
+	sprintf(str, KERN_DEBUG "lmc: %s: ", type);
+	pstr = str+strlen(str);
+
+	if (iLen > 240) {
+		printk(KERN_DEBUG "lmc: Printing 240 chars... out of: %d\n",
+		       iLen);
+		iLen = 240;
+	} else
+		printk(KERN_DEBUG "lmc: Printing %d chars\n", iLen);
+
+	while (iLen > 0) {
+		sprintf(pstr, "%02x ", *ucData);
+		pstr += 3;
+		ucData++;
+		if (!(iNewLine % 20)) {
+			sprintf(pstr, "\n");
+			printk(str);
+			sprintf(str, KERN_DEBUG "lmc: %s: ", type);
+			pstr = str + strlen(str);
+		}
+		iNewLine++;
+		iLen--;
 	}
-      iNewLine++;
-      iLen--;
-    }
-  sprintf(pstr, "\n");
-  printk(str);
+	sprintf(pstr, "\n");
+	printk(str);
 }
 #endif
-#endif
 
 #ifdef DEBUG
 u32 lmcEventLogIndex;
@@ -52,31 +47,29 @@ u32 lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
 
 void lmcEventLog(u32 EventNum, u32 arg2, u32 arg3)
 {
-  lmcEventLogBuf[lmcEventLogIndex++] = EventNum;
-  lmcEventLogBuf[lmcEventLogIndex++] = arg2;
-  lmcEventLogBuf[lmcEventLogIndex++] = arg3;
-  lmcEventLogBuf[lmcEventLogIndex++] = jiffies;
-
-  lmcEventLogIndex &= (LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS) - 1;
+	lmcEventLogBuf[lmcEventLogIndex++] = EventNum;
+	lmcEventLogBuf[lmcEventLogIndex++] = arg2;
+	lmcEventLogBuf[lmcEventLogIndex++] = arg3;
+	lmcEventLogBuf[lmcEventLogIndex++] = jiffies;
+	lmcEventLogIndex &= (LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS) - 1;
 }
-#endif  /*  DEBUG  */
+#endif  /* DEBUG */
 
-void lmc_trace(struct net_device *dev, char *msg){
+void lmc_trace(struct net_device *dev, char *msg)
+{
 #ifdef LMC_TRACE
-    unsigned long j = jiffies + 3; /* Wait for 50 ms */
+	unsigned long j = jiffies + 3; /* Wait for 50 ms */
 
-    if(in_interrupt()){
-        printk("%s: * %s\n", dev->name, msg);
-//        while(time_before(jiffies, j+10))
-//            ;
-    }
-    else {
-        printk("%s: %s\n", dev->name, msg);
-        while(time_before(jiffies, j))
-            schedule();
-    }
+	if (in_interrupt()) {
+		printk(KERN_DEBUG "%s: * %s\n", dev->name, msg);
+#if 0
+		while (time_before(jiffies, j + 10))
+			;
+#endif
+	} else {
+		printk(KERN_DEBUG "%s: %s\n", dev->name, msg);
+		while (time_before(jiffies, j))
+			schedule();
+	}
 #endif
 }
-
-
-/* --------------------------- end if_lmc_linux.c ------------------------ */
diff --git a/drivers/net/wan/lmc/lmc_debug.h b/drivers/net/wan/lmc/lmc_debug.h
index 2d46f12..289f7d9 100644
--- a/drivers/net/wan/lmc/lmc_debug.h
+++ b/drivers/net/wan/lmc/lmc_debug.h
@@ -3,12 +3,12 @@
 
 #ifdef DEBUG
 #ifdef LMC_PACKET_LOG
-#define LMC_CONSOLE_LOG(x,y,z) lmcConsoleLog((x), (y), (z))
+#define LMC_CONSOLE_LOG(x, y, z) lmcConsoleLog((x), (y), (z))
 #else
-#define LMC_CONSOLE_LOG(x,y,z)
+#define LMC_CONSOLE_LOG(x, y, z)
 #endif
 #else
-#define LMC_CONSOLE_LOG(x,y,z)
+#define LMC_CONSOLE_LOG(x, y, z)
 #endif
 
 
@@ -42,7 +42,7 @@ extern u32 lmcEventLogIndex;
 extern u32 lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS];
 #define LMC_EVENT_LOG(x, y, z) lmcEventLog((x), (y), (z))
 #else
-#define LMC_EVENT_LOG(x,y,z)
+#define LMC_EVENT_LOG(x, y, z)
 #endif /* end ifdef _DBG_EVENTLOG */
 
 void lmcConsoleLog(char *type, unsigned char *ucData, int iLen);
diff --git a/drivers/net/wan/lmc/lmc_ioctl.h b/drivers/net/wan/lmc/lmc_ioctl.h
index 72fb113..45b97e0 100644
--- a/drivers/net/wan/lmc/lmc_ioctl.h
+++ b/drivers/net/wan/lmc/lmc_ioctl.h
@@ -1,76 +1,69 @@
 #ifndef _LMC_IOCTL_H_
 #define _LMC_IOCTL_H_
-/*	$Id: lmc_ioctl.h,v 1.15 2000/04/06 12:16:43 asj Exp $	*/
-
- /*
-  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
-  * All rights reserved.  www.lanmedia.com
-  *
-  * This code is written by:
-  * Andrew Stanley-Jones (asj@cban.com)
-  * Rob Braun (bbraun@vix.com),
-  * Michael Graff (explorer@vix.com) and
-  * Matt Thomas (matt@3am-software.com).
-  *
-  * This software may be used and distributed according to the terms
-  * of the GNU General Public License version 2, incorporated herein by reference.
-  */
-
-#define LMCIOCGINFO             SIOCDEVPRIVATE+3 /* get current state */
-#define LMCIOCSINFO             SIOCDEVPRIVATE+4 /* set state to user values */
-#define LMCIOCGETLMCSTATS       SIOCDEVPRIVATE+5
-#define LMCIOCCLEARLMCSTATS     SIOCDEVPRIVATE+6
-#define LMCIOCDUMPEVENTLOG      SIOCDEVPRIVATE+7
-#define LMCIOCGETXINFO          SIOCDEVPRIVATE+8
-#define LMCIOCSETCIRCUIT        SIOCDEVPRIVATE+9
-#define LMCIOCUNUSEDATM         SIOCDEVPRIVATE+10
-#define LMCIOCRESET             SIOCDEVPRIVATE+11
-#define LMCIOCT1CONTROL         SIOCDEVPRIVATE+12
-#define LMCIOCIFTYPE            SIOCDEVPRIVATE+13
-#define LMCIOCXILINX            SIOCDEVPRIVATE+14
-
-#define LMC_CARDTYPE_UNKNOWN            -1
-#define LMC_CARDTYPE_HSSI               1       /* probed card is a HSSI card */
-#define LMC_CARDTYPE_DS3                2       /* probed card is a DS3 card */
-#define LMC_CARDTYPE_SSI                3       /* probed card is a SSI card */
-#define LMC_CARDTYPE_T1                 4       /* probed card is a T1 card */
-
-#define LMC_CTL_CARDTYPE_LMC5200	0	/* HSSI */
-#define LMC_CTL_CARDTYPE_LMC5245	1	/* DS3 */
-#define LMC_CTL_CARDTYPE_LMC1000	2	/* SSI, V.35 */
-#define LMC_CTL_CARDTYPE_LMC1200        3       /* DS1 */
-
-#define LMC_CTL_OFF			0	/* generic OFF value */
-#define LMC_CTL_ON			1	/* generic ON value */
-
-#define LMC_CTL_CLOCK_SOURCE_EXT	0	/* clock off line */
-#define LMC_CTL_CLOCK_SOURCE_INT	1	/* internal clock */
+/*
+ * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
+ * All rights reserved.  www.lanmedia.com
+ *
+ * This code is written by:
+ * Andrew Stanley-Jones (asj@cban.com)
+ * Rob Braun (bbraun@vix.com),
+ * Michael Graff (explorer@vix.com) and
+ * Matt Thomas (matt@3am-software.com).
+ *
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License version 2, incorporated herein by reference.
+ */
+
+#define LMCIOCGINFO         (SIOCDEVPRIVATE + 3) /* get current state */
+#define LMCIOCSINFO         (SIOCDEVPRIVATE + 4) /* set state to user values */
+#define LMCIOCGETLMCSTATS   (SIOCDEVPRIVATE + 5)
+#define LMCIOCCLEARLMCSTATS (SIOCDEVPRIVATE + 6)
+#define LMCIOCDUMPEVENTLOG  (SIOCDEVPRIVATE + 7)
+#define LMCIOCGETXINFO      (SIOCDEVPRIVATE + 8)
+#define LMCIOCSETCIRCUIT    (SIOCDEVPRIVATE + 9)
+#define LMCIOCUNUSEDATM     (SIOCDEVPRIVATE + 10)
+#define LMCIOCRESET         (SIOCDEVPRIVATE + 11)
+#define LMCIOCT1CONTROL     (SIOCDEVPRIVATE + 12)
+#define LMCIOCIFTYPE        (SIOCDEVPRIVATE + 13)
+#define LMCIOCXILINX        (SIOCDEVPRIVATE + 14)
+
+#define LMC_CARDTYPE_UNKNOWN		-1
+#define LMC_CARDTYPE_HSSI		1 /* probed card is a HSSI card */
+#define LMC_CARDTYPE_DS3		2 /* probed card is a DS3 card */
+#define LMC_CARDTYPE_SSI		3 /* probed card is a SSI card */
+#define LMC_CARDTYPE_T1			4 /* probed card is a T1 card */
+
+#define LMC_CTL_CARDTYPE_LMC5200	0 /* HSSI */
+#define LMC_CTL_CARDTYPE_LMC5245	1 /* DS3 */
+#define LMC_CTL_CARDTYPE_LMC1000	2 /* SSI, V.35 */
+#define LMC_CTL_CARDTYPE_LMC1200	3 /* DS1 */
+
+#define LMC_CTL_OFF			0 /* generic OFF value */
+#define LMC_CTL_ON			1 /* generic ON value */
+
+#define LMC_CTL_CLOCK_SOURCE_EXT	0 /* clock off line */
+#define LMC_CTL_CLOCK_SOURCE_INT	1 /* internal clock */
 
 #define LMC_CTL_CRC_LENGTH_16		16
 #define LMC_CTL_CRC_LENGTH_32		32
-#define LMC_CTL_CRC_BYTESIZE_2          2
-#define LMC_CTL_CRC_BYTESIZE_4          4
+#define LMC_CTL_CRC_BYTESIZE_2		2
+#define LMC_CTL_CRC_BYTESIZE_4		4
 
 
-#define LMC_CTL_CABLE_LENGTH_LT_100FT	0	/* DS3 cable < 100 feet */
-#define LMC_CTL_CABLE_LENGTH_GT_100FT	1	/* DS3 cable >= 100 feet */
+#define LMC_CTL_CABLE_LENGTH_LT_100FT	0 /* DS3 cable < 100 feet */
+#define LMC_CTL_CABLE_LENGTH_GT_100FT	1 /* DS3 cable >= 100 feet */
 
-#define LMC_CTL_CIRCUIT_TYPE_E1 0
-#define LMC_CTL_CIRCUIT_TYPE_T1 1
+#define LMC_CTL_CIRCUIT_TYPE_E1		0
+#define LMC_CTL_CIRCUIT_TYPE_T1		1
 
-/*
- * IFTYPE defines
- */
-#define LMC_PPP         1               /* use generic HDLC interface */
-#define LMC_NET         2               /* use direct net interface */
-#define LMC_RAW         3               /* use direct net interface */
+/* IFTYPE defines */
+#define LMC_PPP				1 /* use generic HDLC interface */
+#define LMC_NET				2 /* use direct net interface */
+#define LMC_RAW				3 /* use direct net interface */
 
-/*
- * These are not in the least IOCTL related, but I want them common.
- */
-/*
- * assignments for the GPIO register on the DEC chip (common)
- */
+/* These are not in the least IOCTL related, but I want them common. */
+
+/* assignments for the GPIO register on the DEC chip (common) */
 #define LMC_GEP_INIT		0x01 /* 0: */
 #define LMC_GEP_RESET		0x02 /* 1: */
 #define LMC_GEP_MODE		0x10 /* 4: */
@@ -78,42 +71,32 @@
 #define LMC_GEP_DATA		0x40 /* 6: serial out */
 #define LMC_GEP_CLK	        0x80 /* 7: serial clock */
 
-/*
- * HSSI GPIO assignments
- */
+/* HSSI GPIO assignments */
 #define LMC_GEP_HSSI_ST		0x04 /* 2: receive timing sense (deprecated) */
 #define LMC_GEP_HSSI_CLOCK	0x08 /* 3: clock source */
 
-/*
- * T1 GPIO assignments
- */
+/* T1 GPIO assignments */
 #define LMC_GEP_SSI_GENERATOR	0x04 /* 2: enable prog freq gen serial i/f */
 #define LMC_GEP_SSI_TXCLOCK	0x08 /* 3: provide clock on TXCLOCK output */
 
-/*
- * Common MII16 bits
- */
-#define LMC_MII16_LED0         0x0080
-#define LMC_MII16_LED1         0x0100
-#define LMC_MII16_LED2         0x0200
-#define LMC_MII16_LED3         0x0400  /* Error, and the red one */
-#define LMC_MII16_LED_ALL      0x0780  /* LED bit mask */
-#define LMC_MII16_FIFO_RESET   0x0800
-
-/*
- * definitions for HSSI
- */
-#define LMC_MII16_HSSI_TA      0x0001
-#define LMC_MII16_HSSI_CA      0x0002
-#define LMC_MII16_HSSI_LA      0x0004
-#define LMC_MII16_HSSI_LB      0x0008
-#define LMC_MII16_HSSI_LC      0x0010
-#define LMC_MII16_HSSI_TM      0x0020
-#define LMC_MII16_HSSI_CRC     0x0040
-
-/*
- * assignments for the MII register 16 (DS3)
- */
+/* Common MII16 bits */
+#define LMC_MII16_LED0		0x0080
+#define LMC_MII16_LED1		0x0100
+#define LMC_MII16_LED2		0x0200
+#define LMC_MII16_LED3		0x0400  /* Error, and the red one */
+#define LMC_MII16_LED_ALL	0x0780  /* LED bit mask */
+#define LMC_MII16_FIFO_RESET	0x0800
+
+/* definitions for HSSI */
+#define LMC_MII16_HSSI_TA	0x0001
+#define LMC_MII16_HSSI_CA	0x0002
+#define LMC_MII16_HSSI_LA	0x0004
+#define LMC_MII16_HSSI_LB	0x0008
+#define LMC_MII16_HSSI_LC	0x0010
+#define LMC_MII16_HSSI_TM	0x0020
+#define LMC_MII16_HSSI_CRC	0x0040
+
+/* assignments for the MII register 16 (DS3) */
 #define LMC_MII16_DS3_ZERO	0x0001
 #define LMC_MII16_DS3_TRLBK	0x0002
 #define LMC_MII16_DS3_LNLBK	0x0004
@@ -126,127 +109,115 @@
 #define LMC_MII16_DS3_SCRAM_LARS 0x4000
 
 /* Note: 2 pairs of LEDs where swapped by mistake
- * in Xilinx code for DS3 & DS1 adapters */
-#define LMC_DS3_LED0    0x0100          /* bit 08  yellow */
-#define LMC_DS3_LED1    0x0080          /* bit 07  blue   */
-#define LMC_DS3_LED2    0x0400          /* bit 10  green  */
-#define LMC_DS3_LED3    0x0200          /* bit 09  red    */
-
-/*
- * framer register 0 and 7 (7 is latched and reset on read)
- */
-#define LMC_FRAMER_REG0_DLOS            0x80    /* digital loss of service */
-#define LMC_FRAMER_REG0_OOFS            0x40    /* out of frame sync */
-#define LMC_FRAMER_REG0_AIS             0x20    /* alarm indication signal */
-#define LMC_FRAMER_REG0_CIS             0x10    /* channel idle */
-#define LMC_FRAMER_REG0_LOC             0x08    /* loss of clock */
-
-/*
- * Framer register 9 contains the blue alarm signal
- */
-#define LMC_FRAMER_REG9_RBLUE          0x02     /* Blue alarm failure */
-
-/*
- * Framer register 0x10 contains xbit error
- */
-#define LMC_FRAMER_REG10_XBIT          0x01     /* X bit error alarm failure */
-
-/*
- * And SSI, LMC1000
- */
-#define LMC_MII16_SSI_DTR	0x0001	/* DTR output RW */
-#define LMC_MII16_SSI_DSR	0x0002	/* DSR input RO */
-#define LMC_MII16_SSI_RTS	0x0004	/* RTS output RW */
-#define LMC_MII16_SSI_CTS	0x0008	/* CTS input RO */
-#define LMC_MII16_SSI_DCD	0x0010	/* DCD input RO */
-#define LMC_MII16_SSI_RI		0x0020	/* RI input RO */
-#define LMC_MII16_SSI_CRC                0x1000  /* CRC select - RW */
-
-/*
- * bits 0x0080 through 0x0800 are generic, and described
- * above with LMC_MII16_LED[0123] _LED_ALL, and _FIFO_RESET
- */
-#define LMC_MII16_SSI_LL		0x1000	/* LL output RW */
-#define LMC_MII16_SSI_RL		0x2000	/* RL output RW */
-#define LMC_MII16_SSI_TM		0x4000	/* TM input RO */
-#define LMC_MII16_SSI_LOOP	0x8000	/* loopback enable RW */
-
-/*
- * Some of the MII16 bits are mirrored in the MII17 register as well,
- * but let's keep thing separate for now, and get only the cable from
- * the MII17.
- */
-#define LMC_MII17_SSI_CABLE_MASK	0x0038	/* mask to extract the cable type */
-#define LMC_MII17_SSI_CABLE_SHIFT 3	/* shift to extract the cable type */
+   in Xilinx code for DS3 & DS1 adapters */
+#define LMC_DS3_LED0		0x0100 /* bit 08 yellow */
+#define LMC_DS3_LED1		0x0080 /* bit 07 blue   */
+#define LMC_DS3_LED2		0x0400 /* bit 10 green  */
+#define LMC_DS3_LED3		0x0200 /* bit 09 red    */
+
+/* framer register 0 and 7 (7 is latched and reset on read) */
+#define LMC_FRAMER_REG0_DLOS	0x80 /* digital loss of service */
+#define LMC_FRAMER_REG0_OOFS	0x40 /* out of frame sync */
+#define LMC_FRAMER_REG0_AIS	0x20 /* alarm indication signal */
+#define LMC_FRAMER_REG0_CIS	0x10 /* channel idle */
+#define LMC_FRAMER_REG0_LOC	0x08 /* loss of clock */
+
+/* Framer register 9 contains the blue alarm signal */
+#define LMC_FRAMER_REG9_RBLUE	0x02 /* Blue alarm failure */
+
+/* Framer register 0x10 contains xbit error */
+#define LMC_FRAMER_REG10_XBIT	0x01 /* X bit error alarm failure */
+
+/* And SSI, LMC1000 */
+#define LMC_MII16_SSI_DTR	0x0001 /* DTR output RW */
+#define LMC_MII16_SSI_DSR	0x0002 /* DSR input RO */
+#define LMC_MII16_SSI_RTS	0x0004 /* RTS output RW */
+#define LMC_MII16_SSI_CTS	0x0008 /* CTS input RO */
+#define LMC_MII16_SSI_DCD	0x0010 /* DCD input RO */
+#define LMC_MII16_SSI_RI	0x0020 /* RI input RO */
+#define LMC_MII16_SSI_CRC	0x1000 /* CRC select - RW */
+
+/* bits 0x0080 through 0x0800 are generic, and described
+   above with LMC_MII16_LED[0123] _LED_ALL, and _FIFO_RESET */
+#define LMC_MII16_SSI_LL	0x1000 /* LL output RW */
+#define LMC_MII16_SSI_RL	0x2000 /* RL output RW */
+#define LMC_MII16_SSI_TM	0x4000 /* TM input RO */
+#define LMC_MII16_SSI_LOOP	0x8000 /* loopback enable RW */
+
+/* Some of the MII16 bits are mirrored in the MII17 register as well,
+   but let's keep thing separate for now, and get only the cable from
+   the MII17. */
+#define LMC_MII17_SSI_CABLE_MASK	0x0038 /* mask to extract the cable type */
+#define LMC_MII17_SSI_CABLE_SHIFT	3 /* shift to extract the cable type */
 
 /*
  * And T1, LMC1200
  */
-#define LMC_MII16_T1_UNUSED1    0x0003
-#define LMC_MII16_T1_XOE                0x0004
-#define LMC_MII16_T1_RST                0x0008  /* T1 chip reset - RW */
-#define LMC_MII16_T1_Z                  0x0010  /* output impedance T1=1, E1=0 output - RW */
-#define LMC_MII16_T1_INTR               0x0020  /* interrupt from 8370 - RO */
-#define LMC_MII16_T1_ONESEC             0x0040  /* one second square wave - ro */
+#define LMC_MII16_T1_UNUSED1	0x0003
+#define LMC_MII16_T1_XOE	0x0004
+#define LMC_MII16_T1_RST	0x0008 /* T1 chip reset - RW */
+#define LMC_MII16_T1_Z		0x0010 /* output impedance T1=1, E1=0 output - RW */
+#define LMC_MII16_T1_INTR	0x0020 /* interrupt from 8370 - RO */
+#define LMC_MII16_T1_ONESEC	0x0040 /* one second square wave - ro */
 
-#define LMC_MII16_T1_LED0               0x0100
-#define LMC_MII16_T1_LED1               0x0080
-#define LMC_MII16_T1_LED2               0x0400
-#define LMC_MII16_T1_LED3               0x0200
-#define LMC_MII16_T1_FIFO_RESET 0x0800
+#define LMC_MII16_T1_LED0	0x0100
+#define LMC_MII16_T1_LED1	0x0080
+#define LMC_MII16_T1_LED2	0x0400
+#define LMC_MII16_T1_LED3	0x0200
+#define LMC_MII16_T1_FIFO_RESET	0x0800
 
-#define LMC_MII16_T1_CRC                0x1000  /* CRC select - RW */
-#define LMC_MII16_T1_UNUSED2    0xe000
+#define LMC_MII16_T1_CRC	0x1000 /* CRC select - RW */
+#define LMC_MII16_T1_UNUSED2	0xe000
 
 
-/* 8370 framer registers  */
+/* 8370 framer registers */
 
-#define T1FRAMER_ALARM1_STATUS  0x47
-#define T1FRAMER_ALARM2_STATUS  0x48
-#define T1FRAMER_FERR_LSB               0x50
-#define T1FRAMER_FERR_MSB               0x51    /* framing bit error counter */
-#define T1FRAMER_LCV_LSB                0x54
-#define T1FRAMER_LCV_MSB                0x55    /* line code violation counter */
-#define T1FRAMER_AERR                   0x5A
+#define T1FRAMER_ALARM1_STATUS	0x47
+#define T1FRAMER_ALARM2_STATUS	0x48
+#define T1FRAMER_FERR_LSB	0x50
+#define T1FRAMER_FERR_MSB	0x51 /* framing bit error counter */
+#define T1FRAMER_LCV_LSB	0x54
+#define T1FRAMER_LCV_MSB	0x55 /* line code violation counter */
+#define T1FRAMER_AERR		0x5A
 
 /* mask for the above AERR register */
-#define T1FRAMER_LOF_MASK               (0x0f0) /* receive loss of frame */
-#define T1FRAMER_COFA_MASK              (0x0c0) /* change of frame alignment */
-#define T1FRAMER_SEF_MASK               (0x03)  /* severely errored frame  */
+#define T1FRAMER_LOF_MASK	(0x0f0) /* receive loss of frame */
+#define T1FRAMER_COFA_MASK	(0x0c0) /* change of frame alignment */
+#define T1FRAMER_SEF_MASK	(0x03)/* severely errored frame  */
 
 /* 8370 framer register ALM1 (0x47) values
  * used to determine link status
  */
 
-#define T1F_SIGFRZ      0x01    /* signaling freeze */
-#define T1F_RLOF        0x02    /* receive loss of frame alignment */
-#define T1F_RLOS        0x04    /* receive loss of signal */
-#define T1F_RALOS       0x08    /* receive analog loss of signal or RCKI loss of clock */
-#define T1F_RAIS        0x10    /* receive alarm indication signal */
-#define T1F_UNUSED      0x20
-#define T1F_RYEL        0x40    /* receive yellow alarm */
-#define T1F_RMYEL       0x80    /* receive multiframe yellow alarm */
+#define T1F_SIGFRZ	0x01 /* signaling freeze */
+#define T1F_RLOF	0x02 /* receive loss of frame alignment */
+#define T1F_RLOS	0x04 /* receive loss of signal */
+#define T1F_RALOS	0x08 /* receive analog loss of signal or RCKI loss of clock */
+#define T1F_RAIS	0x10 /* receive alarm indication signal */
+#define T1F_UNUSED	0x20
+#define T1F_RYEL	0x40 /* receive yellow alarm */
+#define T1F_RMYEL	0x80 /* receive multiframe yellow alarm */
 
-#define LMC_T1F_WRITE       0
-#define LMC_T1F_READ        1
+#define LMC_T1F_WRITE	0
+#define LMC_T1F_READ	1
 
 typedef struct lmc_st1f_control {
-  int command;
-  int address;
-  int value;
-  char __user *data;
+	int command;
+	int address;
+	int value;
+	char __user *data;
 } lmc_t1f_control;
 
 enum lmc_xilinx_c {
-    lmc_xilinx_reset = 1,
-    lmc_xilinx_load_prom = 2,
-    lmc_xilinx_load = 3
+	lmc_xilinx_reset = 1,
+	lmc_xilinx_load_prom = 2,
+	lmc_xilinx_load = 3
 };
 
 struct lmc_xilinx_control {
-    enum lmc_xilinx_c command;
-    int len;
-    char __user *data;
+	enum lmc_xilinx_c command;
+	int len;
+	char __user *data;
 };
 
 /* ------------------ end T1 defs ------------------- */
diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c
index e2c6f7f..3c7f23a 100644
--- a/drivers/net/wan/lmc/lmc_main.c
+++ b/drivers/net/wan/lmc/lmc_main.c
@@ -1,41 +1,41 @@
- /*
-  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
-  * All rights reserved.  www.lanmedia.com
-  * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>
-  *
-  * This code is written by:
-  * Andrew Stanley-Jones (asj@cban.com)
-  * Rob Braun (bbraun@vix.com),
-  * Michael Graff (explorer@vix.com) and
-  * Matt Thomas (matt@3am-software.com).
-  *
-  * With Help By:
-  * David Boggs
-  * Ron Crane
-  * Alan Cox
-  *
-  * This software may be used and distributed according to the terms
-  * of the GNU General Public License version 2, incorporated herein by reference.
-  *
-  * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
-  *
-  * To control link specific options lmcctl is required.
-  * It can be obtained from ftp.lanmedia.com.
-  *
-  * Linux driver notes:
-  * Linux uses the device struct lmc_private to pass private information
-  * arround.
-  *
-  * The initialization portion of this driver (the lmc_reset() and the
-  * lmc_dec_reset() functions, as well as the led controls and the
-  * lmc_initcsrs() functions.
-  *
-  * The watchdog function runs every second and checks to see if
-  * we still have link, and that the timing source is what we expected
-  * it to be.  If link is lost, the interface is marked down, and
-  * we no longer can transmit.
-  *
-  */
+/*
+ * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
+ * All rights reserved.  www.lanmedia.com
+ * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>
+ *
+ * This code is written by:
+ * Andrew Stanley-Jones (asj@cban.com)
+ * Rob Braun (bbraun@vix.com),
+ * Michael Graff (explorer@vix.com) and
+ * Matt Thomas (matt@3am-software.com).
+ *
+ * With Help By:
+ * David Boggs
+ * Ron Crane
+ * Alan Cox
+ *
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License version 2, incorporated herein by reference.
+ *
+ * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
+ *
+ * To control link specific options lmcctl is required.
+ * It can be obtained from ftp.lanmedia.com.
+ *
+ * Linux driver notes:
+ * Linux uses the device struct lmc_private to pass private information
+ * arround.
+ *
+ * The initialization portion of this driver (the lmc_reset() and the
+ * lmc_dec_reset() functions, as well as the led controls and the
+ * lmc_initcsrs() functions.
+ *
+ * The watchdog function runs every second and checks to see if
+ * we still have link, and that the timing source is what we expected
+ * it to be.  If link is lost, the interface is marked down, and
+ * we no longer can transmit.
+ *
+ */
 
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -56,12 +56,11 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 #include <linux/inet.h>
+#include <linux/io.h>
 #include <linux/bitops.h>
-#include <asm/processor.h>             /* Processor type for cache alignment. */
-#include <asm/io.h>
+#include <linux/uaccess.h>
+#include <asm/processor.h>   /* Processor type for cache alignment. */
 #include <asm/dma.h>
-#include <asm/uaccess.h>
-//#include <asm/spinlock.h>
 
 #define DRIVER_MAJOR_VERSION     1
 #define DRIVER_MINOR_VERSION    34
@@ -88,15 +87,15 @@ static DEFINE_PCI_DEVICE_TABLE(lmc_pci_tbl) = {
 MODULE_DEVICE_TABLE(pci, lmc_pci_tbl);
 MODULE_LICENSE("GPL v2");
 
-
 static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 					struct net_device *dev);
-static int lmc_rx (struct net_device *dev);
+static int lmc_rx(struct net_device *dev);
 static int lmc_open(struct net_device *dev);
 static int lmc_close(struct net_device *dev);
 static struct net_device_stats *lmc_get_stats(struct net_device *dev);
 static irqreturn_t lmc_interrupt(int irq, void *dev_instance);
-static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base, size_t csr_size);
+static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,
+			 size_t csr_size);
 static void lmc_softreset(lmc_softc_t * const);
 static void lmc_running_reset(struct net_device *dev);
 static int lmc_ifdown(struct net_device * const);
@@ -105,698 +104,652 @@ static void lmc_reset(lmc_softc_t * const sc);
 static void lmc_dec_reset(lmc_softc_t * const sc);
 static void lmc_driver_timeout(struct net_device *dev);
 
-/*
- * linux reserves 16 device specific IOCTLs.  We call them
- * LMCIOC* to control various bits of our world.
- */
-int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) /*fold00*/
+/* linux reserves 16 device specific IOCTLs.  We call them
+   LMCIOC* to control various bits of our world. */
+int lmc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    lmc_ctl_t ctl;
-    int ret = -EOPNOTSUPP;
-    u16 regVal;
-    unsigned long flags;
-
-    lmc_trace(dev, "lmc_ioctl in");
-
-    /*
-     * Most functions mess with the structure
-     * Disable interrupts while we do the polling
-     */
-
-    switch (cmd) {
-        /*
-         * Return current driver state.  Since we keep this up
-         * To date internally, just copy this out to the user.
-         */
-    case LMCIOCGINFO: /*fold01*/
-	if (copy_to_user(ifr->ifr_data, &sc->ictl, sizeof(lmc_ctl_t)))
-		ret = -EFAULT;
-	else
+	lmc_softc_t *sc = dev_to_sc(dev);
+	lmc_ctl_t ctl;
+	int ret = -EOPNOTSUPP;
+	u16 regVal;
+	unsigned long flags;
+
+	lmc_trace(dev, "lmc_ioctl in");
+
+	/* Most functions mess with the structure
+	   Disable interrupts while we do the polling */
+
+	switch (cmd) {
+		/* Return current driver state.  Since we keep this up
+		   To date internally, just copy this out to the user. */
+	case LMCIOCGINFO:
+		if (copy_to_user(ifr->ifr_data, &sc->ictl, sizeof(lmc_ctl_t)))
+			ret = -EFAULT;
+		else
+			ret = 0;
+		break;
+
+	case LMCIOCSINFO:
+		if (!capable(CAP_NET_ADMIN)) {
+			ret = -EPERM;
+			break;
+		}
+
+		if (dev->flags & IFF_UP) {
+			ret = -EBUSY;
+			break;
+		}
+
+		if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
+			ret = -EFAULT;
+			break;
+		}
+
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		sc->lmc_media->set_status(sc, &ctl);
+
+		if (ctl.crc_length != sc->ictl.crc_length) {
+			sc->lmc_media->set_crc_length(sc, ctl.crc_length);
+			if (sc->ictl.crc_length == LMC_CTL_CRC_LENGTH_16)
+				sc->TxDescriptControlInit |=
+					LMC_TDES_ADD_CRC_DISABLE;
+			else
+				sc->TxDescriptControlInit &=
+					~LMC_TDES_ADD_CRC_DISABLE;
+		}
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
 		ret = 0;
-        break;
+		break;
+
+	case LMCIOCIFTYPE:
+	{
+		u16 old_type = sc->if_type;
+		u16 new_type;
+
+		if (!capable(CAP_NET_ADMIN)) {
+			ret = -EPERM;
+			break;
+		}
 
-    case LMCIOCSINFO: /*fold01*/
-        if (!capable(CAP_NET_ADMIN)) {
-            ret = -EPERM;
-            break;
-        }
+		if (copy_from_user(&new_type, ifr->ifr_data, sizeof(u16))) {
+			ret = -EFAULT;
+			break;
+		}
 
-        if(dev->flags & IFF_UP){
-            ret = -EBUSY;
-            break;
-        }
+		if (new_type == old_type) {
+			ret = 0 ;
+			break;				/* no change */
+		}
 
-	if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
-		ret = -EFAULT;
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		lmc_proto_close(sc);
+
+		sc->if_type = new_type;
+		lmc_proto_attach(sc);
+		ret = lmc_proto_open(sc);
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
 		break;
 	}
 
-	spin_lock_irqsave(&sc->lmc_lock, flags);
-        sc->lmc_media->set_status (sc, &ctl);
-
-        if(ctl.crc_length != sc->ictl.crc_length) {
-            sc->lmc_media->set_crc_length(sc, ctl.crc_length);
-	    if (sc->ictl.crc_length == LMC_CTL_CRC_LENGTH_16)
-		sc->TxDescriptControlInit |=  LMC_TDES_ADD_CRC_DISABLE;
-	    else
-		sc->TxDescriptControlInit &= ~LMC_TDES_ADD_CRC_DISABLE;
-        }
-	spin_unlock_irqrestore(&sc->lmc_lock, flags);
+	case LMCIOCGETXINFO:
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		sc->lmc_xinfo.Magic0 = 0xBEEFCAFE;
+
+		sc->lmc_xinfo.PciCardType = sc->lmc_cardtype;
+		sc->lmc_xinfo.PciSlotNumber = 0;
+		sc->lmc_xinfo.DriverMajorVersion = DRIVER_MAJOR_VERSION;
+		sc->lmc_xinfo.DriverMinorVersion = DRIVER_MINOR_VERSION;
+		sc->lmc_xinfo.DriverSubVersion = DRIVER_SUB_VERSION;
+		sc->lmc_xinfo.XilinxRevisionNumber =
+			lmc_mii_readreg(sc, 0, 3) & 0xf;
+		sc->lmc_xinfo.MaxFrameSize = LMC_PKT_BUF_SZ;
+		sc->lmc_xinfo.link_status = sc->lmc_media->get_link_status(sc);
+		sc->lmc_xinfo.mii_reg16 = lmc_mii_readreg(sc, 0, 16);
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
+
+		sc->lmc_xinfo.Magic1 = 0xDEADBEEF;
+
+		if (copy_to_user(ifr->ifr_data, &sc->lmc_xinfo,
+				 sizeof(struct lmc_xinfo)))
+			ret = -EFAULT;
+		else
+			ret = 0;
+		break;
 
-        ret = 0;
-        break;
+	case LMCIOCGETLMCSTATS:
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		if (sc->lmc_cardtype == LMC_CARDTYPE_T1) {
+			lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_LSB);
+			sc->extra_stats.framingBitErrorCount +=
+				lmc_mii_readreg(sc, 0, 18) & 0xff;
+			lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_MSB);
+			sc->extra_stats.framingBitErrorCount +=
+				(lmc_mii_readreg(sc, 0, 18) & 0xff) << 8;
+			lmc_mii_writereg(sc, 0, 17, T1FRAMER_LCV_LSB);
+			sc->extra_stats.lineCodeViolationCount +=
+				lmc_mii_readreg(sc, 0, 18) & 0xff;
+			lmc_mii_writereg(sc, 0, 17, T1FRAMER_LCV_MSB);
+			sc->extra_stats.lineCodeViolationCount +=
+				(lmc_mii_readreg(sc, 0, 18) & 0xff) << 8;
+			lmc_mii_writereg(sc, 0, 17, T1FRAMER_AERR);
+			regVal = lmc_mii_readreg(sc, 0, 18) & 0xff;
+
+			sc->extra_stats.lossOfFrameCount +=
+				(regVal & T1FRAMER_LOF_MASK) >> 4;
+			sc->extra_stats.changeOfFrameAlignmentCount +=
+				(regVal & T1FRAMER_COFA_MASK) >> 2;
+			sc->extra_stats.severelyErroredFrameCount +=
+				regVal & T1FRAMER_SEF_MASK;
+		}
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
+		if (copy_to_user(ifr->ifr_data, &sc->lmc_device->stats,
+				 sizeof(sc->lmc_device->stats)) ||
+		    copy_to_user(ifr->ifr_data + sizeof(sc->lmc_device->stats),
+				 &sc->extra_stats, sizeof(sc->extra_stats)))
+			ret = -EFAULT;
+		else
+			ret = 0;
+		break;
 
-    case LMCIOCIFTYPE: /*fold01*/
-        {
-	    u16 old_type = sc->if_type;
-	    u16	new_type;
+	case LMCIOCCLEARLMCSTATS:
+		if (!capable(CAP_NET_ADMIN)) {
+			ret = -EPERM;
+			break;
+		}
 
-	    if (!capable(CAP_NET_ADMIN)) {
-		ret = -EPERM;
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		memset(&sc->lmc_device->stats, 0,
+		       sizeof(sc->lmc_device->stats));
+		memset(&sc->extra_stats, 0, sizeof(sc->extra_stats));
+		sc->extra_stats.check = STATCHECK;
+		sc->extra_stats.version_size = (DRIVER_VERSION << 16) +
+			sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);
+		sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
+		ret = 0;
 		break;
-	    }
 
-	    if (copy_from_user(&new_type, ifr->ifr_data, sizeof(u16))) {
-		ret = -EFAULT;
-		break;
-	    }
-
-            
-	    if (new_type == old_type)
-	    {
-		ret = 0 ;
-		break;				/* no change */
-            }
-            
-	    spin_lock_irqsave(&sc->lmc_lock, flags);
-            lmc_proto_close(sc);
-
-            sc->if_type = new_type;
-            lmc_proto_attach(sc);
-	    ret = lmc_proto_open(sc);
-	    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-	    break;
-	}
+	case LMCIOCSETCIRCUIT:
+		if (!capable(CAP_NET_ADMIN)) {
+			ret = -EPERM;
+			break;
+		}
 
-    case LMCIOCGETXINFO: /*fold01*/
-	spin_lock_irqsave(&sc->lmc_lock, flags);
-        sc->lmc_xinfo.Magic0 = 0xBEEFCAFE;
-
-        sc->lmc_xinfo.PciCardType = sc->lmc_cardtype;
-        sc->lmc_xinfo.PciSlotNumber = 0;
-        sc->lmc_xinfo.DriverMajorVersion = DRIVER_MAJOR_VERSION;
-        sc->lmc_xinfo.DriverMinorVersion = DRIVER_MINOR_VERSION;
-        sc->lmc_xinfo.DriverSubVersion = DRIVER_SUB_VERSION;
-        sc->lmc_xinfo.XilinxRevisionNumber =
-            lmc_mii_readreg (sc, 0, 3) & 0xf;
-        sc->lmc_xinfo.MaxFrameSize = LMC_PKT_BUF_SZ;
-        sc->lmc_xinfo.link_status = sc->lmc_media->get_link_status (sc);
-        sc->lmc_xinfo.mii_reg16 = lmc_mii_readreg (sc, 0, 16);
-	spin_unlock_irqrestore(&sc->lmc_lock, flags);
+		if (dev->flags & IFF_UP) {
+			ret = -EBUSY;
+			break;
+		}
 
-        sc->lmc_xinfo.Magic1 = 0xDEADBEEF;
+		if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
+			ret = -EFAULT;
+			break;
+		}
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		sc->lmc_media->set_circuit_type(sc, ctl.circuit_type);
+		sc->ictl.circuit_type = ctl.circuit_type;
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
+		ret = 0;
+		break;
+
+	case LMCIOCRESET:
+		if (!capable(CAP_NET_ADMIN)) {
+			ret = -EPERM;
+			break;
+		}
 
-        if (copy_to_user(ifr->ifr_data, &sc->lmc_xinfo,
-			 sizeof(struct lmc_xinfo)))
-		ret = -EFAULT;
-	else
+		spin_lock_irqsave(&sc->lmc_lock, flags);
+		/* Reset driver and bring back to current state */
+		printk(KERN_DEBUG " REG16 before reset +%04x\n",
+		       lmc_mii_readreg(sc, 0, 16));
+		lmc_running_reset(dev);
+		printk(KERN_DEBUG " REG16 after reset +%04x\n",
+		       lmc_mii_readreg(sc, 0, 16));
+
+		LMC_EVENT_LOG(LMC_EVENT_FORCEDRESET,
+			      LMC_CSR_READ(sc, csr_status),
+			      lmc_mii_readreg(sc, 0, 16));
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
 		ret = 0;
+		break;
+
+#ifdef DEBUG
+	case LMCIOCDUMPEVENTLOG:
+		if (copy_to_user(ifr->ifr_data, &lmcEventLogIndex,
+				 sizeof(u32))) {
+			ret = -EFAULT;
+			break;
+		}
+		if (copy_to_user(ifr->ifr_data + sizeof(u32), lmcEventLogBuf,
+				 sizeof(lmcEventLogBuf)))
+			ret = -EFAULT;
+		else
+			ret = 0;
 
-        break;
-
-    case LMCIOCGETLMCSTATS:
-	    spin_lock_irqsave(&sc->lmc_lock, flags);
-	    if (sc->lmc_cardtype == LMC_CARDTYPE_T1) {
-		    lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_LSB);
-		    sc->extra_stats.framingBitErrorCount +=
-			    lmc_mii_readreg(sc, 0, 18) & 0xff;
-		    lmc_mii_writereg(sc, 0, 17, T1FRAMER_FERR_MSB);
-		    sc->extra_stats.framingBitErrorCount +=
-			    (lmc_mii_readreg(sc, 0, 18) & 0xff) << 8;
-		    lmc_mii_writereg(sc, 0, 17, T1FRAMER_LCV_LSB);
-		    sc->extra_stats.lineCodeViolationCount +=
-			    lmc_mii_readreg(sc, 0, 18) & 0xff;
-		    lmc_mii_writereg(sc, 0, 17, T1FRAMER_LCV_MSB);
-		    sc->extra_stats.lineCodeViolationCount +=
-			    (lmc_mii_readreg(sc, 0, 18) & 0xff) << 8;
-		    lmc_mii_writereg(sc, 0, 17, T1FRAMER_AERR);
-		    regVal = lmc_mii_readreg(sc, 0, 18) & 0xff;
-
-		    sc->extra_stats.lossOfFrameCount +=
-			    (regVal & T1FRAMER_LOF_MASK) >> 4;
-		    sc->extra_stats.changeOfFrameAlignmentCount +=
-			    (regVal & T1FRAMER_COFA_MASK) >> 2;
-		    sc->extra_stats.severelyErroredFrameCount +=
-			    regVal & T1FRAMER_SEF_MASK;
-	    }
-	    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-	    if (copy_to_user(ifr->ifr_data, &sc->lmc_device->stats,
-			     sizeof(sc->lmc_device->stats)) ||
-		copy_to_user(ifr->ifr_data + sizeof(sc->lmc_device->stats),
-			     &sc->extra_stats, sizeof(sc->extra_stats)))
-		    ret = -EFAULT;
-	    else
-		    ret = 0;
-	    break;
-
-    case LMCIOCCLEARLMCSTATS:
-	    if (!capable(CAP_NET_ADMIN)) {
-		    ret = -EPERM;
-		    break;
-	    }
-
-	    spin_lock_irqsave(&sc->lmc_lock, flags);
-	    memset(&sc->lmc_device->stats, 0, sizeof(sc->lmc_device->stats));
-	    memset(&sc->extra_stats, 0, sizeof(sc->extra_stats));
-	    sc->extra_stats.check = STATCHECK;
-	    sc->extra_stats.version_size = (DRIVER_VERSION << 16) +
-		    sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);
-	    sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;
-	    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-	    ret = 0;
-	    break;
-
-    case LMCIOCSETCIRCUIT: /*fold01*/
-        if (!capable(CAP_NET_ADMIN)){
-            ret = -EPERM;
-            break;
-        }
-
-        if(dev->flags & IFF_UP){
-            ret = -EBUSY;
-            break;
-        }
-
-	if (copy_from_user(&ctl, ifr->ifr_data, sizeof(lmc_ctl_t))) {
-		ret = -EFAULT;
 		break;
-	}
-	spin_lock_irqsave(&sc->lmc_lock, flags);
-        sc->lmc_media->set_circuit_type(sc, ctl.circuit_type);
-        sc->ictl.circuit_type = ctl.circuit_type;
-	spin_unlock_irqrestore(&sc->lmc_lock, flags);
-        ret = 0;
+#endif /* end ifdef _DBG_EVENTLOG */
+	case LMCIOCT1CONTROL:
+		if (sc->lmc_cardtype != LMC_CARDTYPE_T1) {
+			ret = -EOPNOTSUPP;
+			break;
+		}
+		break;
+	case LMCIOCXILINX:
+	{
+		struct lmc_xilinx_control xc;
 
-        break;
+		if (!capable(CAP_NET_ADMIN)) {
+			ret = -EPERM;
+			break;
+		}
 
-    case LMCIOCRESET: /*fold01*/
-        if (!capable(CAP_NET_ADMIN)){
-            ret = -EPERM;
-            break;
-        }
+		/* Stop the xwitter whlie we restart the hardware */
+		netif_stop_queue(dev);
 
-	spin_lock_irqsave(&sc->lmc_lock, flags);
-        /* Reset driver and bring back to current state */
-        printk (" REG16 before reset +%04x\n", lmc_mii_readreg (sc, 0, 16));
-        lmc_running_reset (dev);
-        printk (" REG16 after reset +%04x\n", lmc_mii_readreg (sc, 0, 16));
+		if (copy_from_user(&xc, ifr->ifr_data,
+				   sizeof(struct lmc_xilinx_control))) {
+			ret = -EFAULT;
+			break;
+		}
+		switch (xc.command) {
+		case lmc_xilinx_reset:
+		{
+			u16 mii;
+			spin_lock_irqsave(&sc->lmc_lock, flags);
+			mii = lmc_mii_readreg(sc, 0, 16);
+
+			/* Make all of them 0 and make */
+			lmc_gpio_mkinput(sc, 0xff);
+
+			/* make the reset output */
+			lmc_gpio_mkoutput(sc, LMC_GEP_RESET);
+
+			/* RESET low to force configuration.  This also forces
+			   the transmitter clock to be internal, but we expect
+			   to reset that later anyway. */
+
+			sc->lmc_gpio &= ~LMC_GEP_RESET;
+			LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+			/* hold for more than 10 microseconds */
+			udelay(50);
+
+			sc->lmc_gpio |= LMC_GEP_RESET;
+			LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+			/* stop driving Xilinx-related signals */
+			lmc_gpio_mkinput(sc, 0xff);
+
+			/* Reset the frammer hardware */
+			sc->lmc_media->set_link_status(sc, 1);
+			sc->lmc_media->set_status(sc, NULL);
+			/* lmc_softreset(sc); */
+
+			{
+				int i;
+				for (i = 0; i < 5; i++) {
+					lmc_led_on(sc, LMC_DS3_LED0);
+					mdelay(100);
+					lmc_led_off(sc, LMC_DS3_LED0);
+					lmc_led_on(sc, LMC_DS3_LED1);
+					mdelay(100);
+					lmc_led_off(sc, LMC_DS3_LED1);
+					lmc_led_on(sc, LMC_DS3_LED3);
+					mdelay(100);
+					lmc_led_off(sc, LMC_DS3_LED3);
+					lmc_led_on(sc, LMC_DS3_LED2);
+					mdelay(100);
+					lmc_led_off(sc, LMC_DS3_LED2);
+				}
+			}
+			spin_unlock_irqrestore(&sc->lmc_lock, flags);
+			ret = 0x0;
+		}
+		break;
 
-        LMC_EVENT_LOG(LMC_EVENT_FORCEDRESET, LMC_CSR_READ (sc, csr_status), lmc_mii_readreg (sc, 0, 16));
-	spin_unlock_irqrestore(&sc->lmc_lock, flags);
+		case lmc_xilinx_load_prom:
+		{
+			u16 mii;
+			int timeout = 500000;
+			spin_lock_irqsave(&sc->lmc_lock, flags);
+			mii = lmc_mii_readreg(sc, 0, 16);
 
-        ret = 0;
-        break;
+			/* Make all of them 0 and make input */
+			lmc_gpio_mkinput(sc, 0xff);
 
-#ifdef DEBUG
-    case LMCIOCDUMPEVENTLOG:
-	if (copy_to_user(ifr->ifr_data, &lmcEventLogIndex, sizeof(u32))) {
-		ret = -EFAULT;
+			/* make the reset output */
+			lmc_gpio_mkoutput(sc,  LMC_GEP_DP | LMC_GEP_RESET);
+
+			/* RESET low to force configuration.  This also forces
+			   the transmitter clock to be internal, but we expect
+			   to reset that later anyway. */
+
+			sc->lmc_gpio &= ~(LMC_GEP_RESET | LMC_GEP_DP);
+			LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+			/* hold for more than 10 microseconds */
+			udelay(50);
+
+			sc->lmc_gpio |= LMC_GEP_DP | LMC_GEP_RESET;
+			LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+			/* busy wait for the chip to reset */
+			while ((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 &&
+			       (timeout-- > 0))
+				cpu_relax();
+
+			/* stop driving Xilinx-related signals */
+			lmc_gpio_mkinput(sc, 0xff);
+			spin_unlock_irqrestore(&sc->lmc_lock, flags);
+			ret = 0x0;
+			break;
+		}
+
+		case lmc_xilinx_load:
+		{
+			char *data;
+			int pos;
+			int timeout = 500000;
+
+			if (!xc.data) {
+				ret = -EINVAL;
+				break;
+			}
+
+			data = kmalloc(xc.len, GFP_KERNEL);
+			if (!data) {
+				printk(KERN_WARNING
+				       "%s: Failed to allocate memory for copy\n",
+				       dev->name);
+				ret = -ENOMEM;
+				break;
+			}
+
+			if (copy_from_user(data, xc.data, xc.len)) {
+				kfree(data);
+				ret = -ENOMEM;
+				break;
+			}
+
+			printk(KERN_DEBUG
+			       "%s: Starting load of data Len: %d at 0x%p == 0x%p\n",
+			       dev->name, xc.len, xc.data, data);
+
+			spin_lock_irqsave(&sc->lmc_lock, flags);
+			lmc_gpio_mkinput(sc, 0xff);
+
+			/* Clear the Xilinx and start programming from
+			   the DEC */
+
+			/* Set ouput as:
+			   Reset: 0 (active)
+			   DP:    0 (active)
+			   Mode:  1 */
+			sc->lmc_gpio = 0x00;
+			sc->lmc_gpio &= ~LMC_GEP_DP;
+			sc->lmc_gpio &= ~LMC_GEP_RESET;
+			sc->lmc_gpio |=  LMC_GEP_MODE;
+			LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+			lmc_gpio_mkoutput(sc, LMC_GEP_MODE | LMC_GEP_DP |
+					  LMC_GEP_RESET);
+
+			/*
+			 * Wait at least 10 us 20 to be safe
+			 */
+			udelay(50);
+
+			/*
+			 * Clear reset and activate programming lines
+			 * Reset: Input
+			 * DP:    Input
+			 * Clock: Output
+			 * Data:  Output
+			 * Mode:  Output
+			 */
+			lmc_gpio_mkinput(sc, LMC_GEP_DP | LMC_GEP_RESET);
+
+			/*
+			 * Set LOAD, DATA, Clock to 1
+			 */
+			sc->lmc_gpio = 0x00;
+			sc->lmc_gpio |= LMC_GEP_MODE;
+			sc->lmc_gpio |= LMC_GEP_DATA;
+			sc->lmc_gpio |= LMC_GEP_CLK;
+			LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+			lmc_gpio_mkoutput(sc, LMC_GEP_DATA | LMC_GEP_CLK |
+					  LMC_GEP_MODE);
+
+			/* busy wait for the chip to reset */
+			while ((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 &&
+			       (timeout-- > 0))
+				cpu_relax();
+
+			printk(KERN_DEBUG
+			       "%s: Waited %d for the Xilinx to clear it's memory\n",
+			       dev->name, 500000-timeout);
+
+			for (pos = 0; pos < xc.len; pos++) {
+				switch (data[pos]) {
+				case 0:
+					/* Data is 0 */
+					sc->lmc_gpio &= ~LMC_GEP_DATA;
+					break;
+				case 1:
+					/* Data is 1 */
+					sc->lmc_gpio |= LMC_GEP_DATA;
+					break;
+				default:
+					printk(KERN_WARNING
+					       "%s Bad data in xilinx programming data at %d, got %d wanted 0 or 1\n",
+					       dev->name, pos, data[pos]);
+					/* Assume it's 1 */
+					sc->lmc_gpio |= LMC_GEP_DATA;
+				}
+				/* Clock to zero */
+				sc->lmc_gpio &= ~LMC_GEP_CLK;
+				sc->lmc_gpio |= LMC_GEP_MODE;
+				LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+				udelay(1);
+
+				/* Put the clack back to one */
+				sc->lmc_gpio |= LMC_GEP_CLK;
+				sc->lmc_gpio |= LMC_GEP_MODE;
+				LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+				udelay(1);
+			}
+			if ((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0) {
+				printk(KERN_WARNING
+				       "%s: Reprogramming FAILED. Needs to be reprogrammed. (corrupted data)\n",
+				       dev->name);
+			} else if ((LMC_CSR_READ(sc, csr_gp) &
+				    LMC_GEP_DP) == 0){
+				printk(KERN_WARNING "%s: Reprogramming FAILED. Needs to be reprogrammed. (done)\n",
+				       dev->name);
+			} else
+				printk(KERN_DEBUG
+				       "%s: Done reprogramming Xilinx, %d bits, good luck!\n",
+				       dev->name, pos);
+
+			lmc_gpio_mkinput(sc, 0xff);
+
+			sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
+			lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+
+			sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET;
+			lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+			spin_unlock_irqrestore(&sc->lmc_lock, flags);
+
+			kfree(data);
+			ret = 0;
+			break;
+		}
+		default:
+			ret = -EBADE;
+			break;
+		}
+
+		netif_wake_queue(dev);
+		sc->lmc_txfull = 0;
+	}
+	break;
+	default:
+		/* If we don't know what to do, give the protocol a shot. */
+		ret = lmc_proto_ioctl(sc, ifr, cmd);
 		break;
 	}
-	if (copy_to_user(ifr->ifr_data + sizeof(u32), lmcEventLogBuf,
-			 sizeof(lmcEventLogBuf)))
-		ret = -EFAULT;
-	else
-		ret = 0;
 
-        break;
-#endif /* end ifdef _DBG_EVENTLOG */
-    case LMCIOCT1CONTROL: /*fold01*/
-        if (sc->lmc_cardtype != LMC_CARDTYPE_T1){
-            ret = -EOPNOTSUPP;
-            break;
-        }
-        break;
-    case LMCIOCXILINX: /*fold01*/
-        {
-            struct lmc_xilinx_control xc; /*fold02*/
-
-            if (!capable(CAP_NET_ADMIN)){
-                ret = -EPERM;
-                break;
-            }
-
-            /*
-             * Stop the xwitter whlie we restart the hardware
-             */
-            netif_stop_queue(dev);
-
-	    if (copy_from_user(&xc, ifr->ifr_data, sizeof(struct lmc_xilinx_control))) {
-		ret = -EFAULT;
-		break;
-	    }
-            switch(xc.command){
-            case lmc_xilinx_reset: /*fold02*/
-                {
-                    u16 mii;
-		    spin_lock_irqsave(&sc->lmc_lock, flags);
-                    mii = lmc_mii_readreg (sc, 0, 16);
-
-                    /*
-                     * Make all of them 0 and make input
-                     */
-                    lmc_gpio_mkinput(sc, 0xff);
-
-                    /*
-                     * make the reset output
-                     */
-                    lmc_gpio_mkoutput(sc, LMC_GEP_RESET);
-
-                    /*
-                     * RESET low to force configuration.  This also forces
-                     * the transmitter clock to be internal, but we expect to reset
-                     * that later anyway.
-                     */
-
-                    sc->lmc_gpio &= ~LMC_GEP_RESET;
-                    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-
-                    /*
-                     * hold for more than 10 microseconds
-                     */
-                    udelay(50);
-
-                    sc->lmc_gpio |= LMC_GEP_RESET;
-                    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-
-                    /*
-                     * stop driving Xilinx-related signals
-                     */
-                    lmc_gpio_mkinput(sc, 0xff);
-
-                    /* Reset the frammer hardware */
-                    sc->lmc_media->set_link_status (sc, 1);
-                    sc->lmc_media->set_status (sc, NULL);
-//                    lmc_softreset(sc);
-
-                    {
-                        int i;
-                        for(i = 0; i < 5; i++){
-                            lmc_led_on(sc, LMC_DS3_LED0);
-                            mdelay(100);
-                            lmc_led_off(sc, LMC_DS3_LED0);
-                            lmc_led_on(sc, LMC_DS3_LED1);
-                            mdelay(100);
-                            lmc_led_off(sc, LMC_DS3_LED1);
-                            lmc_led_on(sc, LMC_DS3_LED3);
-                            mdelay(100);
-                            lmc_led_off(sc, LMC_DS3_LED3);
-                            lmc_led_on(sc, LMC_DS3_LED2);
-                            mdelay(100);
-                            lmc_led_off(sc, LMC_DS3_LED2);
-                        }
-                    }
-		    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-                    
-                    
-
-                    ret = 0x0;
-
-                }
-
-                break;
-            case lmc_xilinx_load_prom: /*fold02*/
-                {
-                    u16 mii;
-                    int timeout = 500000;
-		    spin_lock_irqsave(&sc->lmc_lock, flags);
-                    mii = lmc_mii_readreg (sc, 0, 16);
-
-                    /*
-                     * Make all of them 0 and make input
-                     */
-                    lmc_gpio_mkinput(sc, 0xff);
-
-                    /*
-                     * make the reset output
-                     */
-                    lmc_gpio_mkoutput(sc,  LMC_GEP_DP | LMC_GEP_RESET);
-
-                    /*
-                     * RESET low to force configuration.  This also forces
-                     * the transmitter clock to be internal, but we expect to reset
-                     * that later anyway.
-                     */
-
-                    sc->lmc_gpio &= ~(LMC_GEP_RESET | LMC_GEP_DP);
-                    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-
-                    /*
-                     * hold for more than 10 microseconds
-                     */
-                    udelay(50);
-
-                    sc->lmc_gpio |= LMC_GEP_DP | LMC_GEP_RESET;
-                    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-                    /*
-                     * busy wait for the chip to reset
-                     */
-                    while( (LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 &&
-                           (timeout-- > 0))
-                        cpu_relax();
-
-
-                    /*
-                     * stop driving Xilinx-related signals
-                     */
-                    lmc_gpio_mkinput(sc, 0xff);
-		    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-
-                    ret = 0x0;
-                    
-
-                    break;
-
-                }
-
-            case lmc_xilinx_load: /*fold02*/
-                {
-                    char *data;
-                    int pos;
-                    int timeout = 500000;
-
-                    if (!xc.data) {
-                            ret = -EINVAL;
-                            break;
-                    }
-
-                    data = kmalloc(xc.len, GFP_KERNEL);
-                    if (!data) {
-                            printk(KERN_WARNING "%s: Failed to allocate memory for copy\n", dev->name);
-                            ret = -ENOMEM;
-                            break;
-                    }
-                    
-                    if(copy_from_user(data, xc.data, xc.len))
-                    {
-                    	kfree(data);
-                    	ret = -ENOMEM;
-                    	break;
-                    }
-
-                    printk("%s: Starting load of data Len: %d at 0x%p == 0x%p\n", dev->name, xc.len, xc.data, data);
-
-		    spin_lock_irqsave(&sc->lmc_lock, flags);
-                    lmc_gpio_mkinput(sc, 0xff);
-
-                    /*
-                     * Clear the Xilinx and start prgramming from the DEC
-                     */
-
-                    /*
-                     * Set ouput as:
-                     * Reset: 0 (active)
-                     * DP:    0 (active)
-                     * Mode:  1
-                     *
-                     */
-                    sc->lmc_gpio = 0x00;
-                    sc->lmc_gpio &= ~LMC_GEP_DP;
-                    sc->lmc_gpio &= ~LMC_GEP_RESET;
-                    sc->lmc_gpio |=  LMC_GEP_MODE;
-                    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-                    lmc_gpio_mkoutput(sc, LMC_GEP_MODE | LMC_GEP_DP | LMC_GEP_RESET);
-
-                    /*
-                     * Wait at least 10 us 20 to be safe
-                     */
-                    udelay(50);
-
-                    /*
-                     * Clear reset and activate programming lines
-                     * Reset: Input
-                     * DP:    Input
-                     * Clock: Output
-                     * Data:  Output
-                     * Mode:  Output
-                     */
-                    lmc_gpio_mkinput(sc, LMC_GEP_DP | LMC_GEP_RESET);
-
-                    /*
-                     * Set LOAD, DATA, Clock to 1
-                     */
-                    sc->lmc_gpio = 0x00;
-                    sc->lmc_gpio |= LMC_GEP_MODE;
-                    sc->lmc_gpio |= LMC_GEP_DATA;
-                    sc->lmc_gpio |= LMC_GEP_CLK;
-                    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-                    
-                    lmc_gpio_mkoutput(sc, LMC_GEP_DATA | LMC_GEP_CLK | LMC_GEP_MODE );
-
-                    /*
-                     * busy wait for the chip to reset
-                     */
-                    while( (LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0 &&
-                           (timeout-- > 0))
-                        cpu_relax();
-
-                    printk(KERN_DEBUG "%s: Waited %d for the Xilinx to clear it's memory\n", dev->name, 500000-timeout);
-
-                    for(pos = 0; pos < xc.len; pos++){
-                        switch(data[pos]){
-                        case 0:
-                            sc->lmc_gpio &= ~LMC_GEP_DATA; /* Data is 0 */
-                            break;
-                        case 1:
-                            sc->lmc_gpio |= LMC_GEP_DATA; /* Data is 1 */
-                            break;
-                        default:
-                            printk(KERN_WARNING "%s Bad data in xilinx programming data at %d, got %d wanted 0 or 1\n", dev->name, pos, data[pos]);
-                            sc->lmc_gpio |= LMC_GEP_DATA; /* Assume it's 1 */
-                        }
-                        sc->lmc_gpio &= ~LMC_GEP_CLK; /* Clock to zero */
-                        sc->lmc_gpio |= LMC_GEP_MODE;
-                        LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-                        udelay(1);
-                        
-                        sc->lmc_gpio |= LMC_GEP_CLK; /* Put the clack back to one */
-                        sc->lmc_gpio |= LMC_GEP_MODE;
-                        LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-                        udelay(1);
-                    }
-                    if((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_INIT) == 0){
-                        printk(KERN_WARNING "%s: Reprogramming FAILED. Needs to be reprogrammed. (corrupted data)\n", dev->name);
-                    }
-                    else if((LMC_CSR_READ(sc, csr_gp) & LMC_GEP_DP) == 0){
-                        printk(KERN_WARNING "%s: Reprogramming FAILED. Needs to be reprogrammed. (done)\n", dev->name);
-                    }
-                    else {
-                        printk(KERN_DEBUG "%s: Done reprogramming Xilinx, %d bits, good luck!\n", dev->name, pos);
-                    }
-
-                    lmc_gpio_mkinput(sc, 0xff);
-                    
-                    sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
-                    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-
-                    sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET;
-                    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-		    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-
-                    kfree(data);
-                    
-                    ret = 0;
-                    
-                    break;
-                }
-            default: /*fold02*/
-                ret = -EBADE;
-                break;
-            }
-
-            netif_wake_queue(dev);
-            sc->lmc_txfull = 0;
-
-        }
-        break;
-    default: /*fold01*/
-        /* If we don't know what to do, give the protocol a shot. */
-        ret = lmc_proto_ioctl (sc, ifr, cmd);
-        break;
-    }
-
-    lmc_trace(dev, "lmc_ioctl out");
-
-    return ret;
+	lmc_trace(dev, "lmc_ioctl out");
+	return ret;
 }
 
 
 /* the watchdog process that cruises around */
-static void lmc_watchdog (unsigned long data) /*fold00*/
+static void lmc_watchdog(unsigned long data)
 {
-    struct net_device *dev = (struct net_device *)data;
-    lmc_softc_t *sc = dev_to_sc(dev);
-    int link_status;
-    u32 ticks;
-    unsigned long flags;
+	struct net_device *dev = (struct net_device *)data;
+	lmc_softc_t *sc = dev_to_sc(dev);
+	int link_status;
+	u32 ticks;
+	unsigned long flags;
 
-    lmc_trace(dev, "lmc_watchdog in");
+	lmc_trace(dev, "lmc_watchdog in");
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+	spin_lock_irqsave(&sc->lmc_lock, flags);
 
-    if(sc->check != 0xBEAFCAFE){
-        printk("LMC: Corrupt net_device struct, breaking out\n");
-	spin_unlock_irqrestore(&sc->lmc_lock, flags);
-        return;
-    }
-
-
-    /* Make sure the tx jabber and rx watchdog are off,
-     * and the transmit and receive processes are running.
-     */
-
-    LMC_CSR_WRITE (sc, csr_15, 0x00000011);
-    sc->lmc_cmdmode |= TULIP_CMD_TXRUN | TULIP_CMD_RXRUN;
-    LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
-
-    if (sc->lmc_ok == 0)
-        goto kick_timer;
-
-    LMC_EVENT_LOG(LMC_EVENT_WATCHDOG, LMC_CSR_READ (sc, csr_status), lmc_mii_readreg (sc, 0, 16));
-
-    /* --- begin time out check -----------------------------------
-     * check for a transmit interrupt timeout
-     * Has the packet xmt vs xmt serviced threshold been exceeded */
-    if (sc->lmc_taint_tx == sc->lastlmc_taint_tx &&
-	sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&
-	sc->tx_TimeoutInd == 0)
-    {
-
-        /* wait for the watchdog to come around again */
-        sc->tx_TimeoutInd = 1;
-    }
-    else if (sc->lmc_taint_tx == sc->lastlmc_taint_tx &&
-	     sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&
-	     sc->tx_TimeoutInd)
-    {
-
-        LMC_EVENT_LOG(LMC_EVENT_XMTINTTMO, LMC_CSR_READ (sc, csr_status), 0);
-
-        sc->tx_TimeoutDisplay = 1;
-	sc->extra_stats.tx_TimeoutCnt++;
-
-        /* DEC chip is stuck, hit it with a RESET!!!! */
-        lmc_running_reset (dev);
-
-
-        /* look at receive & transmit process state to make sure they are running */
-        LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-
-        /* look at: DSR - 02  for Reg 16
-         *                  CTS - 08
-         *                  DCD - 10
-         *                  RI  - 20
-         * for Reg 17
-         */
-        LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg (sc, 0, 16), lmc_mii_readreg (sc, 0, 17));
-
-        /* reset the transmit timeout detection flag */
-        sc->tx_TimeoutInd = 0;
-        sc->lastlmc_taint_tx = sc->lmc_taint_tx;
-	sc->lasttx_packets = sc->lmc_device->stats.tx_packets;
-    } else {
-        sc->tx_TimeoutInd = 0;
-        sc->lastlmc_taint_tx = sc->lmc_taint_tx;
-	sc->lasttx_packets = sc->lmc_device->stats.tx_packets;
-    }
-
-    /* --- end time out check ----------------------------------- */
-
-
-    link_status = sc->lmc_media->get_link_status (sc);
-
-    /*
-     * hardware level link lost, but the interface is marked as up.
-     * Mark it as down.
-     */
-    if ((link_status == 0) && (sc->last_link_status != 0)) {
-        printk(KERN_WARNING "%s: hardware/physical link down\n", dev->name);
-        sc->last_link_status = 0;
-        /* lmc_reset (sc); Why reset??? The link can go down ok */
-
-        /* Inform the world that link has been lost */
-	netif_carrier_off(dev);
-    }
-
-    /*
-     * hardware link is up, but the interface is marked as down.
-     * Bring it back up again.
-     */
-     if (link_status != 0 && sc->last_link_status == 0) {
-         printk(KERN_WARNING "%s: hardware/physical link up\n", dev->name);
-         sc->last_link_status = 1;
-         /* lmc_reset (sc); Again why reset??? */
-
-	 netif_carrier_on(dev);
-     }
-
-    /* Call media specific watchdog functions */
-    sc->lmc_media->watchdog(sc);
-
-    /*
-     * Poke the transmitter to make sure it
-     * never stops, even if we run out of mem
-     */
-    LMC_CSR_WRITE(sc, csr_rxpoll, 0);
-
-    /*
-     * Check for code that failed
-     * and try and fix it as appropriate
-     */
-    if(sc->failed_ring == 1){
-        /*
-         * Failed to setup the recv/xmit rin
-         * Try again
-         */
-        sc->failed_ring = 0;
-        lmc_softreset(sc);
-    }
-    if(sc->failed_recv_alloc == 1){
-        /*
-         * We failed to alloc mem in the
-         * interrupt handler, go through the rings
-         * and rebuild them
-         */
-        sc->failed_recv_alloc = 0;
-        lmc_softreset(sc);
-    }
-
-
-    /*
-     * remember the timer value
-     */
-kick_timer:
+	if (sc->check != 0xBEAFCAFE) {
+		printk(KERN_ERR
+		       "LMC: Corrupt net_device struct, breaking out\n");
+		spin_unlock_irqrestore(&sc->lmc_lock, flags);
+		return;
+	}
+
+
+	/* Make sure the tx jabber and rx watchdog are off,
+	 * and the transmit and receive processes are running.
+	 */
+
+	LMC_CSR_WRITE(sc, csr_15, 0x00000011);
+	sc->lmc_cmdmode |= TULIP_CMD_TXRUN | TULIP_CMD_RXRUN;
+	LMC_CSR_WRITE(sc, csr_command, sc->lmc_cmdmode);
+
+	if (sc->lmc_ok == 0)
+		goto kick_timer;
+
+	LMC_EVENT_LOG(LMC_EVENT_WATCHDOG, LMC_CSR_READ(sc, csr_status),
+		      lmc_mii_readreg(sc, 0, 16));
+
+	/* --- begin time out check -----------------------------------
+	 * check for a transmit interrupt timeout
+	 * Has the packet xmt vs xmt serviced threshold been exceeded */
+	if (sc->lmc_taint_tx == sc->lastlmc_taint_tx &&
+	    sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&
+	    sc->tx_TimeoutInd == 0) {
+
+		/* wait for the watchdog to come around again */
+		sc->tx_TimeoutInd = 1;
+	} else if (sc->lmc_taint_tx == sc->lastlmc_taint_tx &&
+		   sc->lmc_device->stats.tx_packets > sc->lasttx_packets &&
+		   sc->tx_TimeoutInd) {
+
+		LMC_EVENT_LOG(LMC_EVENT_XMTINTTMO,
+			      LMC_CSR_READ(sc, csr_status), 0);
+
+		sc->tx_TimeoutDisplay = 1;
+		sc->extra_stats.tx_TimeoutCnt++;
+
+		/* DEC chip is stuck, hit it with a RESET!!!! */
+		lmc_running_reset(dev);
+
+
+		/* look at receive & transmit process state to make sure
+		   they are running */
+		LMC_EVENT_LOG(LMC_EVENT_RESET1,
+			      LMC_CSR_READ(sc, csr_status), 0);
+
+		/* look at: DSR - 02  for Reg 16
+		 *          CTS - 08
+		 *          DCD - 10
+		 *          RI  - 20
+		 * for Reg 17
+		 */
+		LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
+			      lmc_mii_readreg(sc, 0, 17));
+
+		/* reset the transmit timeout detection flag */
+		sc->tx_TimeoutInd = 0;
+		sc->lastlmc_taint_tx = sc->lmc_taint_tx;
+		sc->lasttx_packets = sc->lmc_device->stats.tx_packets;
+	} else {
+		sc->tx_TimeoutInd = 0;
+		sc->lastlmc_taint_tx = sc->lmc_taint_tx;
+		sc->lasttx_packets = sc->lmc_device->stats.tx_packets;
+	}
+
+	/* --- end time out check ----------------------------------- */
+
+	link_status = sc->lmc_media->get_link_status(sc);
+
+	/* Hardware level link lost, but the interface is marked as up.
+	   Mark it as down. */
+	if ((link_status == 0) && (sc->last_link_status != 0)) {
+		printk(KERN_WARNING "%s: hardware/physical link down\n",
+		       dev->name);
+		sc->last_link_status = 0;
+		/* lmc_reset(sc); Why reset??? The link can go down ok */
+
+		/* Inform the world that link has been lost */
+		netif_carrier_off(dev);
+	}
+
+	/* Hardware link is up, but the interface is marked as down.
+	   Bring it back up again. */
+	if (link_status != 0 && sc->last_link_status == 0) {
+		printk(KERN_WARNING "%s: hardware/physical link up\n",
+		       dev->name);
+		sc->last_link_status = 1;
+		/* lmc_reset(sc); Again why reset??? */
+
+		netif_carrier_on(dev);
+	}
+
+	/* Call media specific watchdog functions */
+	sc->lmc_media->watchdog(sc);
+
+	/* Poke the transmitter to make sure it never stops, even if we run
+	   out of mem */
+	LMC_CSR_WRITE(sc, csr_rxpoll, 0);
+
+	/* Check for code that failed and try and fix it as appropriate */
+	if (sc->failed_ring == 1) {
+		/* Failed to setup the recv/xmit rin. Try again */
+		sc->failed_ring = 0;
+		lmc_softreset(sc);
+	}
 
-    ticks = LMC_CSR_READ (sc, csr_gp_timer);
-    LMC_CSR_WRITE (sc, csr_gp_timer, 0xffffffffUL);
-    sc->ictl.ticks = 0x0000ffff - (ticks & 0x0000ffff);
+	if (sc->failed_recv_alloc == 1) {
+		/*
+		 * We failed to alloc mem in the
+		 * interrupt handler, go through the rings
+		 * and rebuild them
+		 */
+		sc->failed_recv_alloc = 0;
+		lmc_softreset(sc);
+	}
 
-    /*
-     * restart this timer.
-     */
-    sc->timer.expires = jiffies + (HZ);
-    add_timer (&sc->timer);
+	/* remember the timer value */
+kick_timer:
+	ticks = LMC_CSR_READ(sc, csr_gp_timer);
+	LMC_CSR_WRITE(sc, csr_gp_timer, 0xffffffffUL);
+	sc->ictl.ticks = 0x0000ffff - (ticks & 0x0000ffff);
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+	/* restart this timer. */
+	sc->timer.expires = jiffies + HZ;
+	add_timer(&sc->timer);
 
-    lmc_trace(dev, "lmc_watchdog out");
+	spin_unlock_irqrestore(&sc->lmc_lock, flags);
 
+	lmc_trace(dev, "lmc_watchdog out");
 }
 
 static int lmc_attach(struct net_device *dev, unsigned short encoding,
@@ -893,86 +846,82 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 		goto err_hdlcdev;
 	}
 
-    sc->lmc_cardtype = LMC_CARDTYPE_UNKNOWN;
-    sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-
-    /*
-     *
-     * Check either the subvendor or the subdevice, some systems reverse
-     * the setting in the bois, seems to be version and arch dependent?
-     * Fix the error, exchange the two values 
-     */
-    if ((subdevice = pdev->subsystem_device) == PCI_VENDOR_ID_LMC)
-	    subdevice = pdev->subsystem_vendor;
-
-    switch (subdevice) {
-    case PCI_DEVICE_ID_LMC_HSSI:
-	printk(KERN_INFO "%s: LMC HSSI\n", dev->name);
-        sc->lmc_cardtype = LMC_CARDTYPE_HSSI;
-        sc->lmc_media = &lmc_hssi_media;
-        break;
-    case PCI_DEVICE_ID_LMC_DS3:
-	printk(KERN_INFO "%s: LMC DS3\n", dev->name);
-        sc->lmc_cardtype = LMC_CARDTYPE_DS3;
-        sc->lmc_media = &lmc_ds3_media;
-        break;
-    case PCI_DEVICE_ID_LMC_SSI:
-	printk(KERN_INFO "%s: LMC SSI\n", dev->name);
-        sc->lmc_cardtype = LMC_CARDTYPE_SSI;
-        sc->lmc_media = &lmc_ssi_media;
-        break;
-    case PCI_DEVICE_ID_LMC_T1:
-	printk(KERN_INFO "%s: LMC T1\n", dev->name);
-        sc->lmc_cardtype = LMC_CARDTYPE_T1;
-        sc->lmc_media = &lmc_t1_media;
-        break;
-    default:
-	printk(KERN_WARNING "%s: LMC UNKNOWN CARD!\n", dev->name);
-        break;
-    }
-
-    lmc_initcsrs (sc, dev->base_addr, 8);
-
-    lmc_gpio_mkinput (sc, 0xff);
-    sc->lmc_gpio = 0;		/* drive no signals yet */
-
-    sc->lmc_media->defaults (sc);
-
-    sc->lmc_media->set_link_status (sc, LMC_LINK_UP);
-
-    /* verify that the PCI Sub System ID matches the Adapter Model number
-     * from the MII register
-     */
-    AdapModelNum = (lmc_mii_readreg (sc, 0, 3) & 0x3f0) >> 4;
-
-    if ((AdapModelNum != LMC_ADAP_T1 || /* detect LMC1200 */
-	 subdevice != PCI_DEVICE_ID_LMC_T1) &&
-	(AdapModelNum != LMC_ADAP_SSI || /* detect LMC1000 */
-	 subdevice != PCI_DEVICE_ID_LMC_SSI) &&
-	(AdapModelNum != LMC_ADAP_DS3 || /* detect LMC5245 */
-	 subdevice != PCI_DEVICE_ID_LMC_DS3) &&
-	(AdapModelNum != LMC_ADAP_HSSI || /* detect LMC5200 */
-	 subdevice != PCI_DEVICE_ID_LMC_HSSI))
-	    printk(KERN_WARNING "%s: Model number (%d) miscompare for PCI"
-		   " Subsystem ID = 0x%04x\n",
-		   dev->name, AdapModelNum, subdevice);
-
-    /*
-     * reset clock
-     */
-    LMC_CSR_WRITE (sc, csr_gp_timer, 0xFFFFFFFFUL);
-
-    sc->board_idx = cards_found++;
-    sc->extra_stats.check = STATCHECK;
-    sc->extra_stats.version_size = (DRIVER_VERSION << 16) +
-	    sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);
-    sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;
-
-    sc->lmc_ok = 0;
-    sc->last_link_status = 0;
-
-    lmc_trace(dev, "lmc_init_one out");
-    return 0;
+	sc->lmc_cardtype = LMC_CARDTYPE_UNKNOWN;
+	sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
+
+	/*
+	 * Check either the subvendor or the subdevice, some systems reverse
+	 * the setting in the bois, seems to be version and arch dependent?
+	 * Fix the error, exchange the two values
+	 */
+	if ((subdevice = pdev->subsystem_device) == PCI_VENDOR_ID_LMC)
+		subdevice = pdev->subsystem_vendor;
+
+	switch (subdevice) {
+	case PCI_DEVICE_ID_LMC_HSSI:
+		printk(KERN_INFO "%s: LMC HSSI\n", dev->name);
+		sc->lmc_cardtype = LMC_CARDTYPE_HSSI;
+		sc->lmc_media = &lmc_hssi_media;
+		break;
+	case PCI_DEVICE_ID_LMC_DS3:
+		printk(KERN_INFO "%s: LMC DS3\n", dev->name);
+		sc->lmc_cardtype = LMC_CARDTYPE_DS3;
+		sc->lmc_media = &lmc_ds3_media;
+		break;
+	case PCI_DEVICE_ID_LMC_SSI:
+		printk(KERN_INFO "%s: LMC SSI\n", dev->name);
+		sc->lmc_cardtype = LMC_CARDTYPE_SSI;
+		sc->lmc_media = &lmc_ssi_media;
+		break;
+	case PCI_DEVICE_ID_LMC_T1:
+		printk(KERN_INFO "%s: LMC T1\n", dev->name);
+		sc->lmc_cardtype = LMC_CARDTYPE_T1;
+		sc->lmc_media = &lmc_t1_media;
+		break;
+	default:
+		printk(KERN_WARNING "%s: LMC UNKNOWN CARD!\n", dev->name);
+		break;
+	}
+
+	lmc_initcsrs(sc, dev->base_addr, 8);
+
+	lmc_gpio_mkinput(sc, 0xff);
+	sc->lmc_gpio = 0;		/* drive no signals yet */
+
+	sc->lmc_media->defaults(sc);
+
+	sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
+
+	/* verify that the PCI Sub System ID matches the Adapter Model number
+	   from the MII register */
+	AdapModelNum = (lmc_mii_readreg(sc, 0, 3) & 0x3f0) >> 4;
+
+	if ((AdapModelNum != LMC_ADAP_T1 || /* detect LMC1200 */
+	     subdevice != PCI_DEVICE_ID_LMC_T1) &&
+	    (AdapModelNum != LMC_ADAP_SSI || /* detect LMC1000 */
+	     subdevice != PCI_DEVICE_ID_LMC_SSI) &&
+	    (AdapModelNum != LMC_ADAP_DS3 || /* detect LMC5245 */
+	     subdevice != PCI_DEVICE_ID_LMC_DS3) &&
+	    (AdapModelNum != LMC_ADAP_HSSI || /* detect LMC5200 */
+	     subdevice != PCI_DEVICE_ID_LMC_HSSI))
+		printk(KERN_WARNING "%s: Model number (%d) miscompare for PCI"
+		       " Subsystem ID = 0x%04x\n",
+		       dev->name, AdapModelNum, subdevice);
+
+	/* reset clock */
+	LMC_CSR_WRITE(sc, csr_gp_timer, 0xFFFFFFFFUL);
+
+	sc->board_idx = cards_found++;
+	sc->extra_stats.check = STATCHECK;
+	sc->extra_stats.version_size = (DRIVER_VERSION << 16) +
+		sizeof(sc->lmc_device->stats) + sizeof(sc->extra_stats);
+	sc->extra_stats.lmc_cardtype = sc->lmc_cardtype;
+
+	sc->lmc_ok = 0;
+	sc->last_link_status = 0;
+
+	lmc_trace(dev, "lmc_init_one out");
+	return 0;
 
 err_hdlcdev:
 	pci_set_drvdata(pdev, NULL);
@@ -984,9 +933,7 @@ err_req_io:
 	return err;
 }
 
-/*
- * Called from pci when removing module.
- */
+/* Called from pci when removing module. */
 static void __devexit lmc_remove_one(struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata(pdev);
@@ -1001,733 +948,678 @@ static void __devexit lmc_remove_one(struct pci_dev *pdev)
 	}
 }
 
-/* After this is called, packets can be sent.
- * Does not initialize the addresses
- */
+/* After this is called, packets can be sent. Does not initialize
+   the addresses */
 static int lmc_open(struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    int err;
-
-    lmc_trace(dev, "lmc_open in");
-
-    lmc_led_on(sc, LMC_DS3_LED0);
-
-    lmc_dec_reset(sc);
-    lmc_reset(sc);
-
-    LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ(sc, csr_status), 0);
-    LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
-		  lmc_mii_readreg(sc, 0, 17));
-
-    if (sc->lmc_ok){
-        lmc_trace(dev, "lmc_open lmc_ok out");
-        return (0);
-    }
-
-    lmc_softreset (sc);
-
-    /* Since we have to use PCI bus, this should work on x86,alpha,ppc */
-    if (request_irq (dev->irq, lmc_interrupt, IRQF_SHARED, dev->name, dev)){
-        printk(KERN_WARNING "%s: could not get irq: %d\n", dev->name, dev->irq);
-        lmc_trace(dev, "lmc_open irq failed out");
-        return -EAGAIN;
-    }
-    sc->got_irq = 1;
-
-    /* Assert Terminal Active */
-    sc->lmc_miireg16 |= LMC_MII16_LED_ALL;
-    sc->lmc_media->set_link_status (sc, LMC_LINK_UP);
-
-    /*
-     * reset to last state.
-     */
-    sc->lmc_media->set_status (sc, NULL);
-
-    /* setup default bits to be used in tulip_desc_t transmit descriptor
-     * -baz */
-    sc->TxDescriptControlInit = (
-                                 LMC_TDES_INTERRUPT_ON_COMPLETION
-                                 | LMC_TDES_FIRST_SEGMENT
-                                 | LMC_TDES_LAST_SEGMENT
-                                 | LMC_TDES_SECOND_ADDR_CHAINED
-                                 | LMC_TDES_DISABLE_PADDING
-                                );
-
-    if (sc->ictl.crc_length == LMC_CTL_CRC_LENGTH_16) {
-        /* disable 32 bit CRC generated by ASIC */
-        sc->TxDescriptControlInit |= LMC_TDES_ADD_CRC_DISABLE;
-    }
-    sc->lmc_media->set_crc_length(sc, sc->ictl.crc_length);
-    /* Acknoledge the Terminal Active and light LEDs */
-
-    /* dev->flags |= IFF_UP; */
-
-    if ((err = lmc_proto_open(sc)) != 0)
-	    return err;
-
-    netif_start_queue(dev);
-    sc->extra_stats.tx_tbusy0++;
-
-    /*
-     * select what interrupts we want to get
-     */
-    sc->lmc_intrmask = 0;
-    /* Should be using the default interrupt mask defined in the .h file. */
-    sc->lmc_intrmask |= (TULIP_STS_NORMALINTR
-                         | TULIP_STS_RXINTR
-                         | TULIP_STS_TXINTR
-                         | TULIP_STS_ABNRMLINTR
-                         | TULIP_STS_SYSERROR
-                         | TULIP_STS_TXSTOPPED
-                         | TULIP_STS_TXUNDERFLOW
-                         | TULIP_STS_RXSTOPPED
-		         | TULIP_STS_RXNOBUF
-                        );
-    LMC_CSR_WRITE (sc, csr_intr, sc->lmc_intrmask);
-
-    sc->lmc_cmdmode |= TULIP_CMD_TXRUN;
-    sc->lmc_cmdmode |= TULIP_CMD_RXRUN;
-    LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
-
-    sc->lmc_ok = 1; /* Run watchdog */
-
-    /*
-     * Set the if up now - pfb
-     */
-
-    sc->last_link_status = 1;
-
-    /*
-     * Setup a timer for the watchdog on probe, and start it running.
-     * Since lmc_ok == 0, it will be a NOP for now.
-     */
-    init_timer (&sc->timer);
-    sc->timer.expires = jiffies + HZ;
-    sc->timer.data = (unsigned long) dev;
-    sc->timer.function = &lmc_watchdog;
-    add_timer (&sc->timer);
-
-    lmc_trace(dev, "lmc_open out");
-
-    return (0);
+	lmc_softc_t *sc = dev_to_sc(dev);
+	int err;
+
+	lmc_trace(dev, "lmc_open in");
+
+	lmc_led_on(sc, LMC_DS3_LED0);
+
+	lmc_dec_reset(sc);
+	lmc_reset(sc);
+
+	LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ(sc, csr_status), 0);
+	LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
+		      lmc_mii_readreg(sc, 0, 17));
+
+	if (sc->lmc_ok) {
+		lmc_trace(dev, "lmc_open lmc_ok out");
+		return 0;
+	}
+
+	lmc_softreset(sc);
+
+	/* Since we have to use PCI bus, this should work on x86, alpha, ppc */
+	if (request_irq(dev->irq, lmc_interrupt, IRQF_SHARED,
+			dev->name, dev)) {
+		printk(KERN_WARNING "%s: could not get irq: %d\n",
+		       dev->name, dev->irq);
+		lmc_trace(dev, "lmc_open irq failed out");
+		return -EAGAIN;
+	}
+	sc->got_irq = 1;
+
+	/* Assert Terminal Active */
+	sc->lmc_miireg16 |= LMC_MII16_LED_ALL;
+	sc->lmc_media->set_link_status(sc, LMC_LINK_UP);
+
+	/*
+	 * reset to last state.
+	 */
+	sc->lmc_media->set_status(sc, NULL);
+
+	/* setup default bits to be used in tulip_desc_t transmit descriptor */
+	sc->TxDescriptControlInit = (LMC_TDES_INTERRUPT_ON_COMPLETION |
+				     LMC_TDES_FIRST_SEGMENT |
+				     LMC_TDES_LAST_SEGMENT |
+				     LMC_TDES_SECOND_ADDR_CHAINED |
+				     LMC_TDES_DISABLE_PADDING);
+
+	if (sc->ictl.crc_length == LMC_CTL_CRC_LENGTH_16)
+		/* disable 32 bit CRC generated by ASIC */
+		sc->TxDescriptControlInit |= LMC_TDES_ADD_CRC_DISABLE;
+
+	sc->lmc_media->set_crc_length(sc, sc->ictl.crc_length);
+	/* Acknowledge the Terminal Active and light LEDs */
+
+	/* dev->flags |= IFF_UP; */
+
+	if ((err = lmc_proto_open(sc)) != 0)
+		return err;
+
+	netif_start_queue(dev);
+	sc->extra_stats.tx_tbusy0++;
+
+	/* select what interrupts we want to get */
+	sc->lmc_intrmask = 0;
+	/* Should be using the default interrupt mask defined in the .h file. */
+	sc->lmc_intrmask |= (TULIP_STS_NORMALINTR | TULIP_STS_RXINTR |
+			     TULIP_STS_TXINTR | TULIP_STS_ABNRMLINTR |
+			     TULIP_STS_SYSERROR | TULIP_STS_TXSTOPPED |
+			     TULIP_STS_TXUNDERFLOW | TULIP_STS_RXSTOPPED |
+			     TULIP_STS_RXNOBUF);
+	LMC_CSR_WRITE(sc, csr_intr, sc->lmc_intrmask);
+
+	sc->lmc_cmdmode |= TULIP_CMD_TXRUN;
+	sc->lmc_cmdmode |= TULIP_CMD_RXRUN;
+	LMC_CSR_WRITE(sc, csr_command, sc->lmc_cmdmode);
+
+	sc->lmc_ok = 1; /* Run watchdog */
+
+	/* Set the if up now */
+	sc->last_link_status = 1;
+
+	/* Setup a timer for the watchdog on probe, and start it running.
+	   Since lmc_ok == 0, it will be a NOP for now. */
+	init_timer(&sc->timer);
+	sc->timer.expires = jiffies + HZ;
+	sc->timer.data = (unsigned long) dev;
+	sc->timer.function = &lmc_watchdog;
+	add_timer(&sc->timer);
+
+	lmc_trace(dev, "lmc_open out");
+	return 0;
 }
 
-/* Total reset to compensate for the AdTran DSU doing bad things
- *  under heavy load
- */
+/* Total reset to compensate for the AdTran DSU doing bad things under
+   heavy load */
 
-static void lmc_running_reset (struct net_device *dev) /*fold00*/
+static void lmc_running_reset(struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
+	lmc_softc_t *sc = dev_to_sc(dev);
 
-    lmc_trace(dev, "lmc_runnig_reset in");
+	lmc_trace(dev, "lmc_runnig_reset in");
 
-    /* stop interrupts */
-    /* Clear the interrupt mask */
-    LMC_CSR_WRITE (sc, csr_intr, 0x00000000);
+	/* stop interrupts */
+	/* Clear the interrupt mask */
+	LMC_CSR_WRITE(sc, csr_intr, 0x00000000);
 
-    lmc_dec_reset (sc);
-    lmc_reset (sc);
-    lmc_softreset (sc);
-    /* sc->lmc_miireg16 |= LMC_MII16_LED_ALL; */
-    sc->lmc_media->set_link_status (sc, 1);
-    sc->lmc_media->set_status (sc, NULL);
+	lmc_dec_reset(sc);
+	lmc_reset(sc);
+	lmc_softreset(sc);
+	/* sc->lmc_miireg16 |= LMC_MII16_LED_ALL; */
+	sc->lmc_media->set_link_status(sc, 1);
+	sc->lmc_media->set_status(sc, NULL);
 
-    netif_wake_queue(dev);
+	netif_wake_queue(dev);
 
-    sc->lmc_txfull = 0;
-    sc->extra_stats.tx_tbusy0++;
+	sc->lmc_txfull = 0;
+	sc->extra_stats.tx_tbusy0++;
 
-    sc->lmc_intrmask = TULIP_DEFAULT_INTR_MASK;
-    LMC_CSR_WRITE (sc, csr_intr, sc->lmc_intrmask);
+	sc->lmc_intrmask = TULIP_DEFAULT_INTR_MASK;
+	LMC_CSR_WRITE(sc, csr_intr, sc->lmc_intrmask);
 
-    sc->lmc_cmdmode |= (TULIP_CMD_TXRUN | TULIP_CMD_RXRUN);
-    LMC_CSR_WRITE (sc, csr_command, sc->lmc_cmdmode);
+	sc->lmc_cmdmode |= (TULIP_CMD_TXRUN | TULIP_CMD_RXRUN);
+	LMC_CSR_WRITE(sc, csr_command, sc->lmc_cmdmode);
 
-    lmc_trace(dev, "lmc_runnin_reset_out");
+	lmc_trace(dev, "lmc_runnin_reset_out");
 }
 
 
-/* This is what is called when you ifconfig down a device.
- * This disables the timer for the watchdog and keepalives,
- * and disables the irq for dev.
- */
+/* This is what is called when you ifconfig down a device. This disables
+   the timer for the watchdog and keepalives, and disables the irq for dev. */
 static int lmc_close(struct net_device *dev)
 {
-    /* not calling release_region() as we should */
-    lmc_softc_t *sc = dev_to_sc(dev);
+	/* not calling release_region() as we should */
+	lmc_softc_t *sc = dev_to_sc(dev);
 
-    lmc_trace(dev, "lmc_close in");
+	lmc_trace(dev, "lmc_close in");
 
-    sc->lmc_ok = 0;
-    sc->lmc_media->set_link_status (sc, 0);
-    del_timer (&sc->timer);
-    lmc_proto_close(sc);
-    lmc_ifdown (dev);
+	sc->lmc_ok = 0;
+	sc->lmc_media->set_link_status(sc, 0);
+	del_timer(&sc->timer);
+	lmc_proto_close(sc);
+	lmc_ifdown(dev);
 
-    lmc_trace(dev, "lmc_close out");
+	lmc_trace(dev, "lmc_close out");
 
-    return 0;
+	return 0;
 }
 
-/* Ends the transfer of packets */
-/* When the interface goes down, this is called */
-static int lmc_ifdown (struct net_device *dev) /*fold00*/
+/* Ends the transfer of packets.
+   When the interface goes down, this is called */
+static int lmc_ifdown(struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    u32 csr6;
-    int i;
-
-    lmc_trace(dev, "lmc_ifdown in");
-
-    /* Don't let anything else go on right now */
-    //    dev->start = 0;
-    netif_stop_queue(dev);
-    sc->extra_stats.tx_tbusy1++;
-
-    /* stop interrupts */
-    /* Clear the interrupt mask */
-    LMC_CSR_WRITE (sc, csr_intr, 0x00000000);
-
-    /* Stop Tx and Rx on the chip */
-    csr6 = LMC_CSR_READ (sc, csr_command);
-    csr6 &= ~LMC_DEC_ST;		/* Turn off the Transmission bit */
-    csr6 &= ~LMC_DEC_SR;		/* Turn off the Receive bit */
-    LMC_CSR_WRITE (sc, csr_command, csr6);
-
-    sc->lmc_device->stats.rx_missed_errors +=
-	    LMC_CSR_READ(sc, csr_missed_frames) & 0xffff;
-
-    /* release the interrupt */
-    if(sc->got_irq == 1){
-        free_irq (dev->irq, dev);
-        sc->got_irq = 0;
-    }
-
-    /* free skbuffs in the Rx queue */
-    for (i = 0; i < LMC_RXDESCS; i++)
-    {
-        struct sk_buff *skb = sc->lmc_rxq[i];
-        sc->lmc_rxq[i] = NULL;
-        sc->lmc_rxring[i].status = 0;
-        sc->lmc_rxring[i].length = 0;
-        sc->lmc_rxring[i].buffer1 = 0xDEADBEEF;
-        if (skb != NULL)
-            dev_kfree_skb(skb);
-        sc->lmc_rxq[i] = NULL;
-    }
-
-    for (i = 0; i < LMC_TXDESCS; i++)
-    {
-        if (sc->lmc_txq[i] != NULL)
-            dev_kfree_skb(sc->lmc_txq[i]);
-        sc->lmc_txq[i] = NULL;
-    }
-
-    lmc_led_off (sc, LMC_MII16_LED_ALL);
-
-    netif_wake_queue(dev);
-    sc->extra_stats.tx_tbusy0++;
-
-    lmc_trace(dev, "lmc_ifdown out");
-
-    return 0;
+	lmc_softc_t *sc = dev_to_sc(dev);
+	u32 csr6;
+	int i;
+
+	lmc_trace(dev, "lmc_ifdown in");
+
+	/* Don't let anything else go on right now */
+	/* dev->start = 0; */
+	netif_stop_queue(dev);
+	sc->extra_stats.tx_tbusy1++;
+
+	/* stop interrupts */
+	/* Clear the interrupt mask */
+	LMC_CSR_WRITE(sc, csr_intr, 0x00000000);
+
+	/* Stop Tx and Rx on the chip */
+	csr6 = LMC_CSR_READ(sc, csr_command);
+	csr6 &= ~LMC_DEC_ST;		/* Turn off the Transmission bit */
+	csr6 &= ~LMC_DEC_SR;		/* Turn off the Receive bit */
+	LMC_CSR_WRITE(sc, csr_command, csr6);
+
+	sc->lmc_device->stats.rx_missed_errors +=
+		LMC_CSR_READ(sc, csr_missed_frames) & 0xffff;
+
+	/* release the interrupt */
+	if (sc->got_irq == 1) {
+		free_irq(dev->irq, dev);
+		sc->got_irq = 0;
+	}
+
+	/* free skbuffs in the Rx queue */
+	for (i = 0; i < LMC_RXDESCS; i++) {
+		struct sk_buff *skb = sc->lmc_rxq[i];
+		sc->lmc_rxq[i] = NULL;
+		sc->lmc_rxring[i].status = 0;
+		sc->lmc_rxring[i].length = 0;
+		sc->lmc_rxring[i].buffer1 = 0xDEADBEEF;
+		if (skb != NULL)
+			dev_kfree_skb(skb);
+		sc->lmc_rxq[i] = NULL;
+	}
+
+	for (i = 0; i < LMC_TXDESCS; i++) {
+		if (sc->lmc_txq[i] != NULL)
+			dev_kfree_skb(sc->lmc_txq[i]);
+		sc->lmc_txq[i] = NULL;
+	}
+
+	lmc_led_off(sc, LMC_MII16_LED_ALL);
+
+	netif_wake_queue(dev);
+	sc->extra_stats.tx_tbusy0++;
+
+	lmc_trace(dev, "lmc_ifdown out");
+
+	return 0;
 }
 
 /* Interrupt handling routine.  This will take an incoming packet, or clean
- * up after a trasmit.
- */
-static irqreturn_t lmc_interrupt (int irq, void *dev_instance) /*fold00*/
+   up after a trasmit. */
+static irqreturn_t lmc_interrupt(int irq, void *dev_instance)
 {
-    struct net_device *dev = (struct net_device *) dev_instance;
-    lmc_softc_t *sc = dev_to_sc(dev);
-    u32 csr;
-    int i;
-    s32 stat;
-    unsigned int badtx;
-    u32 firstcsr;
-    int max_work = LMC_RXDESCS;
-    int handled = 0;
-
-    lmc_trace(dev, "lmc_interrupt in");
-
-    spin_lock(&sc->lmc_lock);
-
-    /*
-     * Read the csr to find what interrupts we have (if any)
-     */
-    csr = LMC_CSR_READ (sc, csr_status);
-
-    /*
-     * Make sure this is our interrupt
-     */
-    if ( ! (csr & sc->lmc_intrmask)) {
-        goto lmc_int_fail_out;
-    }
-
-    firstcsr = csr;
-
-    /* always go through this loop at least once */
-    while (csr & sc->lmc_intrmask) {
-	handled = 1;
-
-        /*
-         * Clear interrupt bits, we handle all case below
-         */
-        LMC_CSR_WRITE (sc, csr_status, csr);
-
-        /*
-         * One of
-         *  - Transmit process timed out CSR5<1>
-         *  - Transmit jabber timeout    CSR5<3>
-         *  - Transmit underflow         CSR5<5>
-         *  - Transmit Receiver buffer unavailable CSR5<7>
-         *  - Receive process stopped    CSR5<8>
-         *  - Receive watchdog timeout   CSR5<9>
-         *  - Early transmit interrupt   CSR5<10>
-         *
-         * Is this really right? Should we do a running reset for jabber?
-         * (being a WAN card and all)
-         */
-        if (csr & TULIP_STS_ABNRMLINTR){
-            lmc_running_reset (dev);
-            break;
-        }
-        
-        if (csr & TULIP_STS_RXINTR){
-            lmc_trace(dev, "rx interrupt");
-            lmc_rx (dev);
-            
-        }
-        if (csr & (TULIP_STS_TXINTR | TULIP_STS_TXNOBUF | TULIP_STS_TXSTOPPED)) {
-
-	    int		n_compl = 0 ;
-            /* reset the transmit timeout detection flag -baz */
-	    sc->extra_stats.tx_NoCompleteCnt = 0;
-
-            badtx = sc->lmc_taint_tx;
-            i = badtx % LMC_TXDESCS;
-
-            while ((badtx < sc->lmc_next_tx)) {
-                stat = sc->lmc_txring[i].status;
-
-                LMC_EVENT_LOG (LMC_EVENT_XMTINT, stat,
-						 sc->lmc_txring[i].length);
-                /*
-                 * If bit 31 is 1 the tulip owns it break out of the loop
-                 */
-                if (stat & 0x80000000)
-                    break;
-
-		n_compl++ ;		/* i.e., have an empty slot in ring */
-                /*
-                 * If we have no skbuff or have cleared it
-                 * Already continue to the next buffer
-                 */
-                if (sc->lmc_txq[i] == NULL)
-                    continue;
+	struct net_device *dev = (struct net_device *) dev_instance;
+	lmc_softc_t *sc = dev_to_sc(dev);
+	u32 csr;
+	int i;
+	s32 stat;
+	unsigned int badtx;
+	u32 firstcsr;
+	int max_work = LMC_RXDESCS;
+	int handled = 0;
 
-		/*
-		 * Check the total error summary to look for any errors
-		 */
-		if (stat & 0x8000) {
-			sc->lmc_device->stats.tx_errors++;
-			if (stat & 0x4104)
-				sc->lmc_device->stats.tx_aborted_errors++;
-			if (stat & 0x0C00)
-				sc->lmc_device->stats.tx_carrier_errors++;
-			if (stat & 0x0200)
-				sc->lmc_device->stats.tx_window_errors++;
-			if (stat & 0x0002)
-				sc->lmc_device->stats.tx_fifo_errors++;
-		} else {
-			sc->lmc_device->stats.tx_bytes += sc->lmc_txring[i].length & 0x7ff;
+	lmc_trace(dev, "lmc_interrupt in");
 
-			sc->lmc_device->stats.tx_packets++;
-                }
+	spin_lock(&sc->lmc_lock);
 
-                //                dev_kfree_skb(sc->lmc_txq[i]);
-                dev_kfree_skb_irq(sc->lmc_txq[i]);
-                sc->lmc_txq[i] = NULL;
+	/* Read the csr to find what interrupts we have (if any) */
+	csr = LMC_CSR_READ(sc, csr_status);
 
-                badtx++;
-                i = badtx % LMC_TXDESCS;
-            }
+	/* Make sure this is our interrupt */
+	if (!(csr & sc->lmc_intrmask))
+		goto lmc_int_fail_out;
 
-            if (sc->lmc_next_tx - badtx > LMC_TXDESCS)
-            {
-                printk ("%s: out of sync pointer\n", dev->name);
-                badtx += LMC_TXDESCS;
-            }
-            LMC_EVENT_LOG(LMC_EVENT_TBUSY0, n_compl, 0);
-            sc->lmc_txfull = 0;
-            netif_wake_queue(dev);
-	    sc->extra_stats.tx_tbusy0++;
+	firstcsr = csr;
 
+	/* always go through this loop at least once */
+	while (csr & sc->lmc_intrmask) {
+		handled = 1;
+
+		/* Clear interrupt bits, we handle all case below */
+		LMC_CSR_WRITE(sc, csr_status, csr);
+
+		/*
+		 * One of
+		 *  - Transmit process timed out CSR5<1>
+		 *  - Transmit jabber timeout    CSR5<3>
+		 *  - Transmit underflow         CSR5<5>
+		 *  - Transmit Receiver buffer unavailable CSR5<7>
+		 *  - Receive process stopped    CSR5<8>
+		 *  - Receive watchdog timeout   CSR5<9>
+		 *  - Early transmit interrupt   CSR5<10>
+
+		 Is this really right? Should we do a running reset for
+		 jabber? (being a WAN card and all) */
+		if (csr & TULIP_STS_ABNRMLINTR) {
+			lmc_running_reset(dev);
+			break;
+		}
 
+		if (csr & TULIP_STS_RXINTR) {
+			lmc_trace(dev, "rx interrupt");
+			lmc_rx(dev);
+
+		}
+		if (csr & (TULIP_STS_TXINTR | TULIP_STS_TXNOBUF |
+			   TULIP_STS_TXSTOPPED)) {
+
+			int n_compl = 0 ;
+			/* reset the transmit timeout detection flag */
+			sc->extra_stats.tx_NoCompleteCnt = 0;
+
+			badtx = sc->lmc_taint_tx;
+			i = badtx % LMC_TXDESCS;
+
+			while ((badtx < sc->lmc_next_tx)) {
+				stat = sc->lmc_txring[i].status;
+
+				LMC_EVENT_LOG(LMC_EVENT_XMTINT, stat,
+					      sc->lmc_txring[i].length);
+				/* If bit 31 is 1 the tulip owns it break out
+				   of the loop */
+				if (stat & 0x80000000)
+					break;
+
+				/* i.e., have an empty slot in ring */
+				n_compl++;
+				/* If we have no skbuff or have cleared it
+				   already. Continue to the next buffer */
+				if (sc->lmc_txq[i] == NULL)
+					continue;
+
+				/* Check the total error summary to look for
+				   any errors */
+				if (stat & 0x8000) {
+					sc->lmc_device->stats.tx_errors++;
+					if (stat & 0x4104)
+						sc->lmc_device->stats.tx_aborted_errors++;
+					if (stat & 0x0C00)
+						sc->lmc_device->stats.tx_carrier_errors++;
+					if (stat & 0x0200)
+						sc->lmc_device->stats.tx_window_errors++;
+					if (stat & 0x0002)
+						sc->lmc_device->stats.tx_fifo_errors++;
+				} else {
+					sc->lmc_device->stats.tx_bytes +=
+						sc->lmc_txring[i].length & 0x7ff;
+
+					sc->lmc_device->stats.tx_packets++;
+				}
+
+				dev_kfree_skb_irq(sc->lmc_txq[i]);
+				sc->lmc_txq[i] = NULL;
+
+				badtx++;
+				i = badtx % LMC_TXDESCS;
+			}
+
+			if (sc->lmc_next_tx - badtx > LMC_TXDESCS) {
+				printk(KERN_WARNING "%s: out of sync pointer\n",
+				       dev->name);
+				badtx += LMC_TXDESCS;
+			}
+			LMC_EVENT_LOG(LMC_EVENT_TBUSY0, n_compl, 0);
+			sc->lmc_txfull = 0;
+			netif_wake_queue(dev);
+			sc->extra_stats.tx_tbusy0++;
 #ifdef DEBUG
-	    sc->extra_stats.dirtyTx = badtx;
-	    sc->extra_stats.lmc_next_tx = sc->lmc_next_tx;
-	    sc->extra_stats.lmc_txfull = sc->lmc_txfull;
+			sc->extra_stats.dirtyTx = badtx;
+			sc->extra_stats.lmc_next_tx = sc->lmc_next_tx;
+			sc->extra_stats.lmc_txfull = sc->lmc_txfull;
 #endif
-            sc->lmc_taint_tx = badtx;
-
-            /*
-             * Why was there a break here???
-             */
-        }			/* end handle transmit interrupt */
-
-        if (csr & TULIP_STS_SYSERROR) {
-            u32 error;
-            printk (KERN_WARNING "%s: system bus error csr: %#8.8x\n", dev->name, csr);
-            error = csr>>23 & 0x7;
-            switch(error){
-            case 0x000:
-                printk(KERN_WARNING "%s: Parity Fault (bad)\n", dev->name);
-                break;
-            case 0x001:
-                printk(KERN_WARNING "%s: Master Abort (naughty)\n", dev->name);
-                break;
-            case 0x010:
-                printk(KERN_WARNING "%s: Target Abort (not so naughty)\n", dev->name);
-                break;
-            default:
-                printk(KERN_WARNING "%s: This bus error code was supposed to be reserved!\n", dev->name);
-            }
-            lmc_dec_reset (sc);
-            lmc_reset (sc);
-            LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-            LMC_EVENT_LOG(LMC_EVENT_RESET2,
-                          lmc_mii_readreg (sc, 0, 16),
-                          lmc_mii_readreg (sc, 0, 17));
-
-        }
-
-        
-        if(max_work-- <= 0)
-            break;
-        
-        /*
-         * Get current csr status to make sure
-         * we've cleared all interrupts
-         */
-        csr = LMC_CSR_READ (sc, csr_status);
-    }				/* end interrupt loop */
-    LMC_EVENT_LOG(LMC_EVENT_INT, firstcsr, csr);
+			sc->lmc_taint_tx = badtx;
+		} /* end handle transmit interrupt */
+
+		if (csr & TULIP_STS_SYSERROR) {
+			u32 error;
+			printk(KERN_WARNING
+				"%s: system bus error csr: %#8.8x\n",
+				dev->name, csr);
+			error = csr>>23 & 0x7;
+			switch (error) {
+			case 0x000:
+				printk(KERN_WARNING
+				       "%s: Parity Fault (bad)\n", dev->name);
+				break;
+			case 0x001:
+				printk(KERN_WARNING
+				       "%s: Master Abort (naughty)\n",
+				       dev->name);
+				break;
+			case 0x010:
+				printk(KERN_WARNING
+				       "%s: Target Abort (not so naughty)\n",
+				       dev->name);
+				break;
+			default:
+				printk(KERN_WARNING
+				       "%s: This bus error code was supposed to be reserved!\n",
+				       dev->name);
+			}
+			lmc_dec_reset(sc);
+			lmc_reset(sc);
+			LMC_EVENT_LOG(LMC_EVENT_RESET1,
+				      LMC_CSR_READ(sc, csr_status), 0);
+			LMC_EVENT_LOG(LMC_EVENT_RESET2,
+				      lmc_mii_readreg(sc, 0, 16),
+				      lmc_mii_readreg(sc, 0, 17));
 
-lmc_int_fail_out:
+		}
 
-    spin_unlock(&sc->lmc_lock);
+		if (max_work-- <= 0)
+			break;
 
-    lmc_trace(dev, "lmc_interrupt out");
-    return IRQ_RETVAL(handled);
+		/* Get current csr status to make sure we've cleared all
+		   interrupts */
+		csr = LMC_CSR_READ(sc, csr_status);
+	} /* end interrupt loop */
+	LMC_EVENT_LOG(LMC_EVENT_INT, firstcsr, csr);
+
+lmc_int_fail_out:
+	spin_unlock(&sc->lmc_lock);
+	lmc_trace(dev, "lmc_interrupt out");
+	return IRQ_RETVAL(handled);
 }
 
 static netdev_tx_t lmc_start_xmit(struct sk_buff *skb,
 					struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    u32 flag;
-    int entry;
-    unsigned long flags;
+	lmc_softc_t *sc = dev_to_sc(dev);
+	u32 flag;
+	int entry;
+	unsigned long flags;
 
-    lmc_trace(dev, "lmc_start_xmit in");
+	lmc_trace(dev, "lmc_start_xmit in");
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+	spin_lock_irqsave(&sc->lmc_lock, flags);
 
-    /* normal path, tbusy known to be zero */
+	/* normal path, tbusy known to be zero */
 
-    entry = sc->lmc_next_tx % LMC_TXDESCS;
+	entry = sc->lmc_next_tx % LMC_TXDESCS;
 
-    sc->lmc_txq[entry] = skb;
-    sc->lmc_txring[entry].buffer1 = virt_to_bus (skb->data);
+	sc->lmc_txq[entry] = skb;
+	sc->lmc_txring[entry].buffer1 = virt_to_bus(skb->data);
 
-    LMC_CONSOLE_LOG("xmit", skb->data, skb->len);
+	LMC_CONSOLE_LOG("xmit", skb->data, skb->len);
 
 #ifndef GCOM
-    /* If the queue is less than half full, don't interrupt */
-    if (sc->lmc_next_tx - sc->lmc_taint_tx < LMC_TXDESCS / 2)
-    {
-        /* Do not interrupt on completion of this packet */
-        flag = 0x60000000;
-        netif_wake_queue(dev);
-    }
-    else if (sc->lmc_next_tx - sc->lmc_taint_tx == LMC_TXDESCS / 2)
-    {
-        /* This generates an interrupt on completion of this packet */
-        flag = 0xe0000000;
-        netif_wake_queue(dev);
-    }
-    else if (sc->lmc_next_tx - sc->lmc_taint_tx < LMC_TXDESCS - 1)
-    {
-        /* Do not interrupt on completion of this packet */
-        flag = 0x60000000;
-        netif_wake_queue(dev);
-    }
-    else
-    {
-        /* This generates an interrupt on completion of this packet */
-        flag = 0xe0000000;
-        sc->lmc_txfull = 1;
-        netif_stop_queue(dev);
-    }
+	/* If the queue is less than half full, don't interrupt */
+	if (sc->lmc_next_tx - sc->lmc_taint_tx < LMC_TXDESCS / 2) {
+		/* Do not interrupt on completion of this packet */
+		flag = 0x60000000;
+		netif_wake_queue(dev);
+	} else if (sc->lmc_next_tx - sc->lmc_taint_tx == LMC_TXDESCS / 2) {
+		/* This generates an interrupt on completion of this packet */
+		flag = 0xe0000000;
+		netif_wake_queue(dev);
+	} else if (sc->lmc_next_tx - sc->lmc_taint_tx < LMC_TXDESCS - 1) {
+		/* Do not interrupt on completion of this packet */
+		flag = 0x60000000;
+		netif_wake_queue(dev);
+	} else {
+		/* This generates an interrupt on completion of this packet */
+		flag = 0xe0000000;
+		sc->lmc_txfull = 1;
+		netif_stop_queue(dev);
+	}
 #else
-    flag = LMC_TDES_INTERRUPT_ON_COMPLETION;
-
-    if (sc->lmc_next_tx - sc->lmc_taint_tx >= LMC_TXDESCS - 1)
-    {				/* ring full, go busy */
-        sc->lmc_txfull = 1;
-	netif_stop_queue(dev);
-	sc->extra_stats.tx_tbusy1++;
-        LMC_EVENT_LOG(LMC_EVENT_TBUSY1, entry, 0);
-    }
+	flag = LMC_TDES_INTERRUPT_ON_COMPLETION;
+
+	if (sc->lmc_next_tx - sc->lmc_taint_tx >= LMC_TXDESCS - 1) {
+		/* ring full, go busy */
+		sc->lmc_txfull = 1;
+		netif_stop_queue(dev);
+		sc->extra_stats.tx_tbusy1++;
+		LMC_EVENT_LOG(LMC_EVENT_TBUSY1, entry, 0);
+	}
 #endif
 
+	if (entry == LMC_TXDESCS - 1)	/* last descriptor in ring */
+		flag |= LMC_TDES_END_OF_RING;	/* flag as such for Tulip */
 
-    if (entry == LMC_TXDESCS - 1)	/* last descriptor in ring */
-	flag |= LMC_TDES_END_OF_RING;	/* flag as such for Tulip */
-
-    /* don't pad small packets either */
-    flag = sc->lmc_txring[entry].length = (skb->len) | flag |
-						sc->TxDescriptControlInit;
+	/* don't pad small packets either */
+	flag = sc->lmc_txring[entry].length = (skb->len) | flag |
+		sc->TxDescriptControlInit;
 
-    /* set the transmit timeout flag to be checked in
-     * the watchdog timer handler. -baz
-     */
+	/* set the transmit timeout flag to be checked in the watchdog timer
+	   handler. */
 
-    sc->extra_stats.tx_NoCompleteCnt++;
-    sc->lmc_next_tx++;
+	sc->extra_stats.tx_NoCompleteCnt++;
+	sc->lmc_next_tx++;
 
-    /* give ownership to the chip */
-    LMC_EVENT_LOG(LMC_EVENT_XMT, flag, entry);
-    sc->lmc_txring[entry].status = 0x80000000;
+	/* give ownership to the chip */
+	LMC_EVENT_LOG(LMC_EVENT_XMT, flag, entry);
+	sc->lmc_txring[entry].status = 0x80000000;
 
-    /* send now! */
-    LMC_CSR_WRITE (sc, csr_txpoll, 0);
+	/* send now! */
+	LMC_CSR_WRITE(sc, csr_txpoll, 0);
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+	spin_unlock_irqrestore(&sc->lmc_lock, flags);
 
-    lmc_trace(dev, "lmc_start_xmit_out");
-    return NETDEV_TX_OK;
+	lmc_trace(dev, "lmc_start_xmit_out");
+	return NETDEV_TX_OK;
 }
 
 
 static int lmc_rx(struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    int i;
-    int rx_work_limit = LMC_RXDESCS;
-    unsigned int next_rx;
-    int rxIntLoopCnt;		/* debug -baz */
-    int localLengthErrCnt = 0;
-    long stat;
-    struct sk_buff *skb, *nsb;
-    u16 len;
-
-    lmc_trace(dev, "lmc_rx in");
-
-    lmc_led_on(sc, LMC_DS3_LED3);
-
-    rxIntLoopCnt = 0;		/* debug -baz */
-
-    i = sc->lmc_next_rx % LMC_RXDESCS;
-    next_rx = sc->lmc_next_rx;
-
-    while (((stat = sc->lmc_rxring[i].status) & LMC_RDES_OWN_BIT) != DESC_OWNED_BY_DC21X4)
-    {
-        rxIntLoopCnt++;		/* debug -baz */
-        len = ((stat & LMC_RDES_FRAME_LENGTH) >> RDES_FRAME_LENGTH_BIT_NUMBER);
-        if ((stat & 0x0300) != 0x0300) {  /* Check first segment and last segment */
-		if ((stat & 0x0000ffff) != 0x7fff) {
-			/* Oversized frame */
+	lmc_softc_t *sc = dev_to_sc(dev);
+	int i;
+	int rx_work_limit = LMC_RXDESCS;
+	unsigned int next_rx;
+	int rxIntLoopCnt;		/* debug */
+	int localLengthErrCnt = 0;
+	long stat;
+	struct sk_buff *skb, *nsb;
+	u16 len;
+
+	lmc_trace(dev, "lmc_rx in");
+
+	lmc_led_on(sc, LMC_DS3_LED3);
+
+	rxIntLoopCnt = 0;		/* debug */
+
+	i = sc->lmc_next_rx % LMC_RXDESCS;
+	next_rx = sc->lmc_next_rx;
+
+	while (((stat = sc->lmc_rxring[i].status) & LMC_RDES_OWN_BIT) !=
+	       DESC_OWNED_BY_DC21X4) {
+		rxIntLoopCnt++;		/* debug */
+		len = ((stat & LMC_RDES_FRAME_LENGTH) >>
+		       RDES_FRAME_LENGTH_BIT_NUMBER);
+		if ((stat & 0x0300) != 0x0300) {
+			/* Check first segment and last segment */
+			if ((stat & 0x0000ffff) != 0x7fff) {
+				/* Oversized frame */
+				sc->lmc_device->stats.rx_length_errors++;
+				goto skip_packet;
+			}
+		}
+
+		if (stat & 0x00000008) { /* Catch a dribbling bit error */
+			sc->lmc_device->stats.rx_errors++;
+			sc->lmc_device->stats.rx_frame_errors++;
+			goto skip_packet;
+		}
+
+
+		if (stat & 0x00000004) { /* Catch a CRC error by the Xilinx */
+			sc->lmc_device->stats.rx_errors++;
+			sc->lmc_device->stats.rx_crc_errors++;
+			goto skip_packet;
+		}
+
+		if (len > LMC_PKT_BUF_SZ) {
 			sc->lmc_device->stats.rx_length_errors++;
+			localLengthErrCnt++;
 			goto skip_packet;
 		}
-	}
 
-	if (stat & 0x00000008) { /* Catch a dribbling bit error */
-		sc->lmc_device->stats.rx_errors++;
-		sc->lmc_device->stats.rx_frame_errors++;
-		goto skip_packet;
-	}
+		if (len < sc->lmc_crcSize + 2) {
+			sc->lmc_device->stats.rx_length_errors++;
+			sc->extra_stats.rx_SmallPktCnt++;
+			localLengthErrCnt++;
+			goto skip_packet;
+		}
 
+		if (stat & 0x00004000) {
+			printk(KERN_WARNING
+			       "%s: Receiver descriptor error, receiver out of sync?\n",
+			       dev->name);
+		}
 
-	if (stat & 0x00000004) { /* Catch a CRC error by the Xilinx */
-		sc->lmc_device->stats.rx_errors++;
-		sc->lmc_device->stats.rx_crc_errors++;
-		goto skip_packet;
-	}
+		len -= sc->lmc_crcSize;
 
-	if (len > LMC_PKT_BUF_SZ) {
-		sc->lmc_device->stats.rx_length_errors++;
-		localLengthErrCnt++;
-		goto skip_packet;
+		skb = sc->lmc_rxq[i];
+
+		/* We ran out of memory at some point just allocate an skb buff
+		   and continue. */
+
+		if (!skb) {
+			nsb = dev_alloc_skb(LMC_PKT_BUF_SZ + 2);
+			if (nsb) {
+				sc->lmc_rxq[i] = nsb;
+				nsb->dev = dev;
+				sc->lmc_rxring[i].buffer1 =
+					virt_to_bus(skb_tail_pointer(nsb));
+			}
+			sc->failed_recv_alloc = 1;
+			goto skip_packet;
+		}
+
+		sc->lmc_device->stats.rx_packets++;
+		sc->lmc_device->stats.rx_bytes += len;
+
+		LMC_CONSOLE_LOG("recv", skb->data, len);
+
+		/* I'm not sure of the sanity of this. Packets could be arriving
+		   at a constant 44.210mbits/sec and we're going to copy them
+		   into a new buffer?? */
+
+		if (len > (LMC_MTU - (LMC_MTU>>2))) { /* len > LMC_MTU * 0.75 */
+			/* If it's a large packet don't copy it just hand it
+			   up */
+give_it_anyways:
+			sc->lmc_rxq[i] = NULL;
+			sc->lmc_rxring[i].buffer1 = 0x0;
+
+			skb_put(skb, len);
+			skb->protocol = lmc_proto_type(sc, skb);
+			skb_reset_mac_header(skb);
+			/* skb_reset_network_header(skb); */
+			skb->dev = dev;
+			lmc_proto_netif(sc, skb);
+
+			/* This skb will be destroyed by the upper layers,
+			   make a new one */
+			nsb = dev_alloc_skb(LMC_PKT_BUF_SZ + 2);
+			if (nsb) {
+				sc->lmc_rxq[i] = nsb;
+				nsb->dev = dev;
+				sc->lmc_rxring[i].buffer1 =
+					virt_to_bus(skb_tail_pointer(nsb));
+				/* Transferred to 21140 below */
+			} else {
+				/* We've run out of memory, stop trying to
+				   allocate memory and exit the interrupt
+				   handler The chip may run out of receivers
+				   and stop in which care we'll try to allocate
+				   the buffer again (once a second). */
+				sc->extra_stats.rx_BuffAllocErr++;
+				LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);
+				sc->failed_recv_alloc = 1;
+				goto skip_out_of_mem;
+			}
+		} else {
+			nsb = dev_alloc_skb(len);
+			if (!nsb)
+				goto give_it_anyways;
+			skb_copy_from_linear_data(skb, skb_put(nsb, len), len);
+			nsb->protocol = lmc_proto_type(sc, nsb);
+			skb_reset_mac_header(nsb);
+			/* skb_reset_network_header(nsb); */
+			nsb->dev = dev;
+			lmc_proto_netif(sc, nsb);
+		}
+
+skip_packet:
+		LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);
+		sc->lmc_rxring[i].status = DESC_OWNED_BY_DC21X4;
+
+		sc->lmc_next_rx++;
+		i = sc->lmc_next_rx % LMC_RXDESCS;
+		rx_work_limit--;
+		if (rx_work_limit < 0)
+			break;
 	}
 
-	if (len < sc->lmc_crcSize + 2) {
-		sc->lmc_device->stats.rx_length_errors++;
-		sc->extra_stats.rx_SmallPktCnt++;
-		localLengthErrCnt++;
-		goto skip_packet;
+#if 0
+	/* detect condition for LMC1000 where DSU cable attaches and fills
+	   descriptors with bogus packets */
+
+	if (localLengthErrCnt > LMC_RXDESCS - 3) {
+		sc->extra_stats.rx_BadPktSurgeCnt++;
+		LMC_EVENT_LOG(LMC_EVENT_BADPKTSURGE, localLengthErrCnt,
+			      sc->extra_stats.rx_BadPktSurgeCnt);
 	}
+#endif
 
-        if(stat & 0x00004000){
-            printk(KERN_WARNING "%s: Receiver descriptor error, receiver out of sync?\n", dev->name);
-        }
-
-        len -= sc->lmc_crcSize;
-
-        skb = sc->lmc_rxq[i];
-
-        /*
-         * We ran out of memory at some point
-         * just allocate an skb buff and continue.
-         */
-        
-        if (!skb) {
-            nsb = dev_alloc_skb (LMC_PKT_BUF_SZ + 2);
-            if (nsb) {
-                sc->lmc_rxq[i] = nsb;
-                nsb->dev = dev;
-                sc->lmc_rxring[i].buffer1 = virt_to_bus(skb_tail_pointer(nsb));
-            }
-            sc->failed_recv_alloc = 1;
-            goto skip_packet;
-        }
-        
-	sc->lmc_device->stats.rx_packets++;
-	sc->lmc_device->stats.rx_bytes += len;
-
-        LMC_CONSOLE_LOG("recv", skb->data, len);
-
-        /*
-         * I'm not sure of the sanity of this
-         * Packets could be arriving at a constant
-         * 44.210mbits/sec and we're going to copy
-         * them into a new buffer??
-         */
-        
-        if(len > (LMC_MTU - (LMC_MTU>>2))){ /* len > LMC_MTU * 0.75 */
-            /*
-             * If it's a large packet don't copy it just hand it up
-             */
-        give_it_anyways:
-
-            sc->lmc_rxq[i] = NULL;
-            sc->lmc_rxring[i].buffer1 = 0x0;
-
-            skb_put (skb, len);
-            skb->protocol = lmc_proto_type(sc, skb);
-            skb_reset_mac_header(skb);
-            /* skb_reset_network_header(skb); */
-            skb->dev = dev;
-            lmc_proto_netif(sc, skb);
-
-            /*
-             * This skb will be destroyed by the upper layers, make a new one
-             */
-            nsb = dev_alloc_skb (LMC_PKT_BUF_SZ + 2);
-            if (nsb) {
-                sc->lmc_rxq[i] = nsb;
-                nsb->dev = dev;
-                sc->lmc_rxring[i].buffer1 = virt_to_bus(skb_tail_pointer(nsb));
-                /* Transferred to 21140 below */
-            }
-            else {
-                /*
-                 * We've run out of memory, stop trying to allocate
-                 * memory and exit the interrupt handler
-                 *
-                 * The chip may run out of receivers and stop
-                 * in which care we'll try to allocate the buffer
-                 * again.  (once a second)
-                 */
-		sc->extra_stats.rx_BuffAllocErr++;
-                LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);
-                sc->failed_recv_alloc = 1;
-                goto skip_out_of_mem;
-            }
-        }
-        else {
-            nsb = dev_alloc_skb(len);
-            if(!nsb) {
-                goto give_it_anyways;
-            }
-            skb_copy_from_linear_data(skb, skb_put(nsb, len), len);
-            
-            nsb->protocol = lmc_proto_type(sc, nsb);
-            skb_reset_mac_header(nsb);
-            /* skb_reset_network_header(nsb); */
-            nsb->dev = dev;
-            lmc_proto_netif(sc, nsb);
-        }
-
-    skip_packet:
-        LMC_EVENT_LOG(LMC_EVENT_RCVINT, stat, len);
-        sc->lmc_rxring[i].status = DESC_OWNED_BY_DC21X4;
-
-        sc->lmc_next_rx++;
-        i = sc->lmc_next_rx % LMC_RXDESCS;
-        rx_work_limit--;
-        if (rx_work_limit < 0)
-            break;
-    }
-
-    /* detect condition for LMC1000 where DSU cable attaches and fills
-     * descriptors with bogus packets
-     *
-    if (localLengthErrCnt > LMC_RXDESCS - 3) {
-	sc->extra_stats.rx_BadPktSurgeCnt++;
-	LMC_EVENT_LOG(LMC_EVENT_BADPKTSURGE, localLengthErrCnt,
-		      sc->extra_stats.rx_BadPktSurgeCnt);
-    } */
-
-    /* save max count of receive descriptors serviced */
-    if (rxIntLoopCnt > sc->extra_stats.rxIntLoopCnt)
-	    sc->extra_stats.rxIntLoopCnt = rxIntLoopCnt; /* debug -baz */
+	/* save max count of receive descriptors serviced */
+	if (rxIntLoopCnt > sc->extra_stats.rxIntLoopCnt)
+		sc->extra_stats.rxIntLoopCnt = rxIntLoopCnt; /* debug */
 
 #ifdef DEBUG
-    if (rxIntLoopCnt == 0)
-    {
-        for (i = 0; i < LMC_RXDESCS; i++)
-        {
-            if ((sc->lmc_rxring[i].status & LMC_RDES_OWN_BIT)
-                != DESC_OWNED_BY_DC21X4)
-            {
-                rxIntLoopCnt++;
-            }
-        }
-        LMC_EVENT_LOG(LMC_EVENT_RCVEND, rxIntLoopCnt, 0);
-    }
+	if (rxIntLoopCnt == 0) {
+		for (i = 0; i < LMC_RXDESCS; i++) {
+			if ((sc->lmc_rxring[i].status & LMC_RDES_OWN_BIT)
+			    != DESC_OWNED_BY_DC21X4)
+				rxIntLoopCnt++;
+		}
+		LMC_EVENT_LOG(LMC_EVENT_RCVEND, rxIntLoopCnt, 0);
+	}
 #endif
 
-
-    lmc_led_off(sc, LMC_DS3_LED3);
+	lmc_led_off(sc, LMC_DS3_LED3);
 
 skip_out_of_mem:
-
-    lmc_trace(dev, "lmc_rx out");
-
-    return 0;
+	lmc_trace(dev, "lmc_rx out");
+	return 0;
 }
 
 static struct net_device_stats *lmc_get_stats(struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    unsigned long flags;
-
-    lmc_trace(dev, "lmc_get_stats in");
+	lmc_softc_t *sc = dev_to_sc(dev);
+	unsigned long flags;
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+	lmc_trace(dev, "lmc_get_stats in");
 
-    sc->lmc_device->stats.rx_missed_errors += LMC_CSR_READ(sc, csr_missed_frames) & 0xffff;
+	spin_lock_irqsave(&sc->lmc_lock, flags);
 
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
+	sc->lmc_device->stats.rx_missed_errors +=
+		LMC_CSR_READ(sc, csr_missed_frames) & 0xffff;
 
-    lmc_trace(dev, "lmc_get_stats out");
+	spin_unlock_irqrestore(&sc->lmc_lock, flags);
 
-    return &sc->lmc_device->stats;
+	lmc_trace(dev, "lmc_get_stats out");
+	return &sc->lmc_device->stats;
 }
 
 static struct pci_driver lmc_driver = {
@@ -1739,407 +1631,365 @@ static struct pci_driver lmc_driver = {
 
 static int __init init_lmc(void)
 {
-    return pci_register_driver(&lmc_driver);
+	return pci_register_driver(&lmc_driver);
 }
 
 static void __exit exit_lmc(void)
 {
-    pci_unregister_driver(&lmc_driver);
+	pci_unregister_driver(&lmc_driver);
 }
 
 module_init(init_lmc);
 module_exit(exit_lmc);
 
-unsigned lmc_mii_readreg (lmc_softc_t * const sc, unsigned devaddr, unsigned regno) /*fold00*/
+unsigned lmc_mii_readreg(lmc_softc_t * const sc, unsigned devaddr,
+			 unsigned regno)
 {
-    int i;
-    int command = (0xf6 << 10) | (devaddr << 5) | regno;
-    int retval = 0;
+	int i;
+	int command = (0xf6 << 10) | (devaddr << 5) | regno;
+	int retval = 0;
 
-    lmc_trace(sc->lmc_device, "lmc_mii_readreg in");
+	lmc_trace(sc->lmc_device, "lmc_mii_readreg in");
 
-    LMC_MII_SYNC (sc);
+	LMC_MII_SYNC(sc);
 
-    lmc_trace(sc->lmc_device, "lmc_mii_readreg: done sync");
+	lmc_trace(sc->lmc_device, "lmc_mii_readreg: done sync");
 
-    for (i = 15; i >= 0; i--)
-    {
-        int dataval = (command & (1 << i)) ? 0x20000 : 0;
+	for (i = 15; i >= 0; i--) {
+		int dataval = (command & (1 << i)) ? 0x20000 : 0;
 
-        LMC_CSR_WRITE (sc, csr_9, dataval);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-        LMC_CSR_WRITE (sc, csr_9, dataval | 0x10000);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-    }
-
-    lmc_trace(sc->lmc_device, "lmc_mii_readreg: done1");
+		LMC_CSR_WRITE(sc, csr_9, dataval);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+		LMC_CSR_WRITE(sc, csr_9, dataval | 0x10000);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+	}
 
-    for (i = 19; i > 0; i--)
-    {
-        LMC_CSR_WRITE (sc, csr_9, 0x40000);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-        retval = (retval << 1) | ((LMC_CSR_READ (sc, csr_9) & 0x80000) ? 1 : 0);
-        LMC_CSR_WRITE (sc, csr_9, 0x40000 | 0x10000);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-    }
+	lmc_trace(sc->lmc_device, "lmc_mii_readreg: done1");
+
+	for (i = 19; i > 0; i--) {
+		LMC_CSR_WRITE(sc, csr_9, 0x40000);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+		retval = (retval << 1) |
+			((LMC_CSR_READ(sc, csr_9) & 0x80000) ? 1 : 0);
+		LMC_CSR_WRITE(sc, csr_9, 0x40000 | 0x10000);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+	}
 
-    lmc_trace(sc->lmc_device, "lmc_mii_readreg out");
+	lmc_trace(sc->lmc_device, "lmc_mii_readreg out");
 
-    return (retval >> 1) & 0xffff;
+	return (retval >> 1) & 0xffff;
 }
 
-void lmc_mii_writereg (lmc_softc_t * const sc, unsigned devaddr, unsigned regno, unsigned data) /*fold00*/
+void lmc_mii_writereg(lmc_softc_t * const sc, unsigned devaddr, unsigned regno,
+		      unsigned data)
 {
-    int i = 32;
-    int command = (0x5002 << 16) | (devaddr << 23) | (regno << 18) | data;
-
-    lmc_trace(sc->lmc_device, "lmc_mii_writereg in");
-
-    LMC_MII_SYNC (sc);
-
-    i = 31;
-    while (i >= 0)
-    {
-        int datav;
-
-        if (command & (1 << i))
-            datav = 0x20000;
-        else
-            datav = 0x00000;
-
-        LMC_CSR_WRITE (sc, csr_9, datav);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-        LMC_CSR_WRITE (sc, csr_9, (datav | 0x10000));
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-        i--;
-    }
-
-    i = 2;
-    while (i > 0)
-    {
-        LMC_CSR_WRITE (sc, csr_9, 0x40000);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-        LMC_CSR_WRITE (sc, csr_9, 0x50000);
-        lmc_delay ();
-        /* __SLOW_DOWN_IO; */
-        i--;
-    }
-
-    lmc_trace(sc->lmc_device, "lmc_mii_writereg out");
+	int i = 32;
+	int command = (0x5002 << 16) | (devaddr << 23) | (regno << 18) | data;
+
+	lmc_trace(sc->lmc_device, "lmc_mii_writereg in");
+
+	LMC_MII_SYNC(sc);
+
+	i = 31;
+	while (i >= 0) {
+		int datav;
+
+		if (command & (1 << i))
+			datav = 0x20000;
+		else
+			datav = 0x00000;
+
+		LMC_CSR_WRITE(sc, csr_9, datav);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+		LMC_CSR_WRITE(sc, csr_9, (datav | 0x10000));
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+		i--;
+	}
+
+	i = 2;
+	while (i > 0) {
+		LMC_CSR_WRITE(sc, csr_9, 0x40000);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+		LMC_CSR_WRITE(sc, csr_9, 0x50000);
+		lmc_delay();
+		/* __SLOW_DOWN_IO; */
+		i--;
+	}
+
+	lmc_trace(sc->lmc_device, "lmc_mii_writereg out");
 }
 
-static void lmc_softreset (lmc_softc_t * const sc) /*fold00*/
+static void lmc_softreset(lmc_softc_t * const sc)
 {
-    int i;
-
-    lmc_trace(sc->lmc_device, "lmc_softreset in");
-
-    /* Initialize the receive rings and buffers. */
-    sc->lmc_txfull = 0;
-    sc->lmc_next_rx = 0;
-    sc->lmc_next_tx = 0;
-    sc->lmc_taint_rx = 0;
-    sc->lmc_taint_tx = 0;
-
-    /*
-     * Setup each one of the receiver buffers
-     * allocate an skbuff for each one, setup the descriptor table
-     * and point each buffer at the next one
-     */
-
-    for (i = 0; i < LMC_RXDESCS; i++)
-    {
-        struct sk_buff *skb;
-
-        if (sc->lmc_rxq[i] == NULL)
-        {
-            skb = dev_alloc_skb (LMC_PKT_BUF_SZ + 2);
-            if(skb == NULL){
-                printk(KERN_WARNING "%s: Failed to allocate receiver ring, will try again\n", sc->name);
-                sc->failed_ring = 1;
-                break;
-            }
-            else{
-                sc->lmc_rxq[i] = skb;
-            }
-        }
-        else
-        {
-            skb = sc->lmc_rxq[i];
-        }
-
-        skb->dev = sc->lmc_device;
-
-        /* owned by 21140 */
-        sc->lmc_rxring[i].status = 0x80000000;
-
-        /* used to be PKT_BUF_SZ now uses skb since we lose some to head room */
-        sc->lmc_rxring[i].length = skb_tailroom(skb);
-
-        /* use to be tail which is dumb since you're thinking why write
-         * to the end of the packj,et but since there's nothing there tail == data
-         */
-        sc->lmc_rxring[i].buffer1 = virt_to_bus (skb->data);
-
-        /* This is fair since the structure is static and we have the next address */
-        sc->lmc_rxring[i].buffer2 = virt_to_bus (&sc->lmc_rxring[i + 1]);
-
-    }
-
-    /*
-     * Sets end of ring
-     */
-    if (i != 0) {
-        sc->lmc_rxring[i - 1].length |= 0x02000000; /* Set end of buffers flag */
-        sc->lmc_rxring[i - 1].buffer2 = virt_to_bus(&sc->lmc_rxring[0]); /* Point back to the start */
-    }
-    LMC_CSR_WRITE (sc, csr_rxlist, virt_to_bus (sc->lmc_rxring)); /* write base address */
-
-    /* Initialize the transmit rings and buffers */
-    for (i = 0; i < LMC_TXDESCS; i++)
-    {
-        if (sc->lmc_txq[i] != NULL){		/* have buffer */
-            dev_kfree_skb(sc->lmc_txq[i]);	/* free it */
-	    sc->lmc_device->stats.tx_dropped++;	/* We just dropped a packet */
-        }
-        sc->lmc_txq[i] = NULL;
-        sc->lmc_txring[i].status = 0x00000000;
-        sc->lmc_txring[i].buffer2 = virt_to_bus (&sc->lmc_txring[i + 1]);
-    }
-    sc->lmc_txring[i - 1].buffer2 = virt_to_bus (&sc->lmc_txring[0]);
-    LMC_CSR_WRITE (sc, csr_txlist, virt_to_bus (sc->lmc_txring));
-
-    lmc_trace(sc->lmc_device, "lmc_softreset out");
+	int i;
+
+	lmc_trace(sc->lmc_device, "lmc_softreset in");
+
+	/* Initialize the receive rings and buffers. */
+	sc->lmc_txfull = 0;
+	sc->lmc_next_rx = 0;
+	sc->lmc_next_tx = 0;
+	sc->lmc_taint_rx = 0;
+	sc->lmc_taint_tx = 0;
+
+	/* Setup each one of the receiver buffers allocate an skbuff for
+	   each one, setup the descriptor table and point each buffer at
+	   the next one */
+
+	for (i = 0; i < LMC_RXDESCS; i++) {
+		struct sk_buff *skb;
+
+		if (sc->lmc_rxq[i] == NULL) {
+			skb = dev_alloc_skb(LMC_PKT_BUF_SZ + 2);
+			if (skb == NULL) {
+				printk(KERN_WARNING
+				       "%s: Failed to allocate receiver ring, will try again\n",
+				       sc->name);
+				sc->failed_ring = 1;
+				break;
+			} else
+				sc->lmc_rxq[i] = skb;
+		} else
+			skb = sc->lmc_rxq[i];
+
+		skb->dev = sc->lmc_device;
+
+		/* owned by 21140 */
+		sc->lmc_rxring[i].status = 0x80000000;
+
+		/* used to be PKT_BUF_SZ now uses skb since we lose some
+		   to head room */
+		sc->lmc_rxring[i].length = skb_tailroom(skb);
+
+		/* use to be tail which is dumb since you're thinking why write
+		   to the end of the packet but since there's nothing there
+		   tail == data */
+		sc->lmc_rxring[i].buffer1 = virt_to_bus(skb->data);
+
+		/* This is fair since the structure is static and we have
+		   the next address */
+		sc->lmc_rxring[i].buffer2 = virt_to_bus(&sc->lmc_rxring[i + 1]);
+	}
+
+	/* Sets end of ring */
+	if (i != 0) {
+		/* Set end of buffers flag */
+		sc->lmc_rxring[i - 1].length |= 0x02000000;
+		/* Point back to the start */
+		sc->lmc_rxring[i - 1].buffer2 = virt_to_bus(&sc->lmc_rxring[0]);
+	}
+	/* write base address */
+	LMC_CSR_WRITE(sc, csr_rxlist, virt_to_bus(sc->lmc_rxring));
+
+	/* Initialize the transmit rings and buffers */
+	for (i = 0; i < LMC_TXDESCS; i++) {
+		if (sc->lmc_txq[i] != NULL) {		/* have buffer */
+			dev_kfree_skb(sc->lmc_txq[i]);	/* free it */
+			/* We just dropped a packet */
+			sc->lmc_device->stats.tx_dropped++;
+		}
+		sc->lmc_txq[i] = NULL;
+		sc->lmc_txring[i].status = 0x00000000;
+		sc->lmc_txring[i].buffer2 = virt_to_bus(&sc->lmc_txring[i + 1]);
+	}
+	sc->lmc_txring[i - 1].buffer2 = virt_to_bus(&sc->lmc_txring[0]);
+	LMC_CSR_WRITE(sc, csr_txlist, virt_to_bus(sc->lmc_txring));
+
+	lmc_trace(sc->lmc_device, "lmc_softreset out");
 }
 
-void lmc_gpio_mkinput(lmc_softc_t * const sc, u32 bits) /*fold00*/
+void lmc_gpio_mkinput(lmc_softc_t * const sc, u32 bits)
 {
-    lmc_trace(sc->lmc_device, "lmc_gpio_mkinput in");
-    sc->lmc_gpio_io &= ~bits;
-    LMC_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET | (sc->lmc_gpio_io));
-    lmc_trace(sc->lmc_device, "lmc_gpio_mkinput out");
+	lmc_trace(sc->lmc_device, "lmc_gpio_mkinput in");
+	sc->lmc_gpio_io &= ~bits;
+	LMC_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET | (sc->lmc_gpio_io));
+	lmc_trace(sc->lmc_device, "lmc_gpio_mkinput out");
 }
 
-void lmc_gpio_mkoutput(lmc_softc_t * const sc, u32 bits) /*fold00*/
+void lmc_gpio_mkoutput(lmc_softc_t * const sc, u32 bits)
 {
-    lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput in");
-    sc->lmc_gpio_io |= bits;
-    LMC_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET | (sc->lmc_gpio_io));
-    lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput out");
+	lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput in");
+	sc->lmc_gpio_io |= bits;
+	LMC_CSR_WRITE(sc, csr_gp, TULIP_GP_PINSET | (sc->lmc_gpio_io));
+	lmc_trace(sc->lmc_device, "lmc_gpio_mkoutput out");
 }
 
-void lmc_led_on(lmc_softc_t * const sc, u32 led) /*fold00*/
+void lmc_led_on(lmc_softc_t * const sc, u32 led)
 {
-    lmc_trace(sc->lmc_device, "lmc_led_on in");
-    if((~sc->lmc_miireg16) & led){ /* Already on! */
-        lmc_trace(sc->lmc_device, "lmc_led_on aon out");
-        return;
-    }
-    
-    sc->lmc_miireg16 &= ~led;
-    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-    lmc_trace(sc->lmc_device, "lmc_led_on out");
+	lmc_trace(sc->lmc_device, "lmc_led_on in");
+	if ((~sc->lmc_miireg16) & led) { /* Already on! */
+		lmc_trace(sc->lmc_device, "lmc_led_on aon out");
+		return;
+	}
+
+	sc->lmc_miireg16 &= ~led;
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+	lmc_trace(sc->lmc_device, "lmc_led_on out");
 }
 
-void lmc_led_off(lmc_softc_t * const sc, u32 led) /*fold00*/
+void lmc_led_off(lmc_softc_t * const sc, u32 led)
 {
-    lmc_trace(sc->lmc_device, "lmc_led_off in");
-    if(sc->lmc_miireg16 & led){ /* Already set don't do anything */
-        lmc_trace(sc->lmc_device, "lmc_led_off aoff out");
-        return;
-    }
-    
-    sc->lmc_miireg16 |= led;
-    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-    lmc_trace(sc->lmc_device, "lmc_led_off out");
+	lmc_trace(sc->lmc_device, "lmc_led_off in");
+	if (sc->lmc_miireg16 & led) { /* Already set don't do anything */
+		lmc_trace(sc->lmc_device, "lmc_led_off aoff out");
+		return;
+	}
+
+	sc->lmc_miireg16 |= led;
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+	lmc_trace(sc->lmc_device, "lmc_led_off out");
 }
 
-static void lmc_reset(lmc_softc_t * const sc) /*fold00*/
+static void lmc_reset(lmc_softc_t * const sc)
 {
-    lmc_trace(sc->lmc_device, "lmc_reset in");
-    sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
-    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-
-    sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET;
-    lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
-
-    /*
-     * make some of the GPIO pins be outputs
-     */
-    lmc_gpio_mkoutput(sc, LMC_GEP_RESET);
-
-    /*
-     * RESET low to force state reset.  This also forces
-     * the transmitter clock to be internal, but we expect to reset
-     * that later anyway.
-     */
-    sc->lmc_gpio &= ~(LMC_GEP_RESET);
-    LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
-
-    /*
-     * hold for more than 10 microseconds
-     */
-    udelay(50);
-
-    /*
-     * stop driving Xilinx-related signals
-     */
-    lmc_gpio_mkinput(sc, LMC_GEP_RESET);
-
-    /*
-     * Call media specific init routine
-     */
-    sc->lmc_media->init(sc);
-
-    sc->extra_stats.resetCount++;
-    lmc_trace(sc->lmc_device, "lmc_reset out");
+	lmc_trace(sc->lmc_device, "lmc_reset in");
+	sc->lmc_miireg16 |= LMC_MII16_FIFO_RESET;
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+
+	sc->lmc_miireg16 &= ~LMC_MII16_FIFO_RESET;
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
+
+	/* make some of the GPIO pins be outputs */
+	lmc_gpio_mkoutput(sc, LMC_GEP_RESET);
+
+	/* RESET low to force state reset.  This also forces the transmitter
+	   clock to be internal, but we expect to reset that later anyway. */
+	sc->lmc_gpio &= ~(LMC_GEP_RESET);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* hold for more than 10 microseconds */
+	udelay(50);
+
+	/* stop driving Xilinx-related signals */
+	lmc_gpio_mkinput(sc, LMC_GEP_RESET);
+
+	/* Call media specific init routine */
+	sc->lmc_media->init(sc);
+
+	sc->extra_stats.resetCount++;
+	lmc_trace(sc->lmc_device, "lmc_reset out");
 }
 
-static void lmc_dec_reset(lmc_softc_t * const sc) /*fold00*/
+static void lmc_dec_reset(lmc_softc_t * const sc)
 {
-    u32 val;
-    lmc_trace(sc->lmc_device, "lmc_dec_reset in");
-
-    /*
-     * disable all interrupts
-     */
-    sc->lmc_intrmask = 0;
-    LMC_CSR_WRITE(sc, csr_intr, sc->lmc_intrmask);
-
-    /*
-     * Reset the chip with a software reset command.
-     * Wait 10 microseconds (actually 50 PCI cycles but at
-     * 33MHz that comes to two microseconds but wait a
-     * bit longer anyways)
-     */
-    LMC_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
-    udelay(25);
+	u32 val;
+	lmc_trace(sc->lmc_device, "lmc_dec_reset in");
+
+	/* disable all interrupts */
+	sc->lmc_intrmask = 0;
+	LMC_CSR_WRITE(sc, csr_intr, sc->lmc_intrmask);
+
+	/* Reset the chip with a software reset command. Wait 10 microseconds
+	   (actually 50 PCI cycles but at 33MHz that comes to two microseconds
+	   but wait a bit longer anyways) */
+	LMC_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
+	udelay(25);
 #ifdef __sparc__
-    sc->lmc_busmode = LMC_CSR_READ(sc, csr_busmode);
-    sc->lmc_busmode = 0x00100000;
-    sc->lmc_busmode &= ~TULIP_BUSMODE_SWRESET;
-    LMC_CSR_WRITE(sc, csr_busmode, sc->lmc_busmode);
+	sc->lmc_busmode = LMC_CSR_READ(sc, csr_busmode);
+	sc->lmc_busmode = 0x00100000;
+	sc->lmc_busmode &= ~TULIP_BUSMODE_SWRESET;
+	LMC_CSR_WRITE(sc, csr_busmode, sc->lmc_busmode);
 #endif
-    sc->lmc_cmdmode = LMC_CSR_READ(sc, csr_command);
-
-    /*
-     * We want:
-     *   no ethernet address in frames we write
-     *   disable padding (txdesc, padding disable)
-     *   ignore runt frames (rdes0 bit 15)
-     *   no receiver watchdog or transmitter jabber timer
-     *       (csr15 bit 0,14 == 1)
-     *   if using 16-bit CRC, turn off CRC (trans desc, crc disable)
-     */
-
-    sc->lmc_cmdmode |= ( TULIP_CMD_PROMISCUOUS
-                         | TULIP_CMD_FULLDUPLEX
-                         | TULIP_CMD_PASSBADPKT
-                         | TULIP_CMD_NOHEARTBEAT
-                         | TULIP_CMD_PORTSELECT
-                         | TULIP_CMD_RECEIVEALL
-                         | TULIP_CMD_MUSTBEONE
-                       );
-    sc->lmc_cmdmode &= ~( TULIP_CMD_OPERMODE
-                          | TULIP_CMD_THRESHOLDCTL
-                          | TULIP_CMD_STOREFWD
-                          | TULIP_CMD_TXTHRSHLDCTL
-                        );
-
-    LMC_CSR_WRITE(sc, csr_command, sc->lmc_cmdmode);
-
-    /*
-     * disable receiver watchdog and transmit jabber
-     */
-    val = LMC_CSR_READ(sc, csr_sia_general);
-    val |= (TULIP_WATCHDOG_TXDISABLE | TULIP_WATCHDOG_RXDISABLE);
-    LMC_CSR_WRITE(sc, csr_sia_general, val);
-
-    lmc_trace(sc->lmc_device, "lmc_dec_reset out");
+	sc->lmc_cmdmode = LMC_CSR_READ(sc, csr_command);
+
+	/*
+	 * We want:
+	 *   no ethernet address in frames we write
+	 *   disable padding (txdesc, padding disable)
+	 *   ignore runt frames (rdes0 bit 15)
+	 *   no receiver watchdog or transmitter jabber timer
+	 *       (csr15 bit 0,14 == 1)
+	 *   if using 16-bit CRC, turn off CRC (trans desc, crc disable)
+	 */
+
+	sc->lmc_cmdmode |= (TULIP_CMD_PROMISCUOUS | TULIP_CMD_FULLDUPLEX |
+			    TULIP_CMD_PASSBADPKT | TULIP_CMD_NOHEARTBEAT |
+			    TULIP_CMD_PORTSELECT | TULIP_CMD_RECEIVEALL |
+			    TULIP_CMD_MUSTBEONE);
+	sc->lmc_cmdmode &= ~(TULIP_CMD_OPERMODE | TULIP_CMD_THRESHOLDCTL |
+			     TULIP_CMD_STOREFWD | TULIP_CMD_TXTHRSHLDCTL);
+
+	LMC_CSR_WRITE(sc, csr_command, sc->lmc_cmdmode);
+
+	/* disable receiver watchdog and transmit jabber */
+	val = LMC_CSR_READ(sc, csr_sia_general);
+	val |= (TULIP_WATCHDOG_TXDISABLE | TULIP_WATCHDOG_RXDISABLE);
+	LMC_CSR_WRITE(sc, csr_sia_general, val);
+
+	lmc_trace(sc->lmc_device, "lmc_dec_reset out");
 }
 
-static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base, /*fold00*/
-                         size_t csr_size)
+static void lmc_initcsrs(lmc_softc_t * const sc, lmc_csrptr_t csr_base,
+			 size_t csr_size)
 {
-    lmc_trace(sc->lmc_device, "lmc_initcsrs in");
-    sc->lmc_csrs.csr_busmode	        = csr_base +  0 * csr_size;
-    sc->lmc_csrs.csr_txpoll		= csr_base +  1 * csr_size;
-    sc->lmc_csrs.csr_rxpoll		= csr_base +  2 * csr_size;
-    sc->lmc_csrs.csr_rxlist		= csr_base +  3 * csr_size;
-    sc->lmc_csrs.csr_txlist		= csr_base +  4 * csr_size;
-    sc->lmc_csrs.csr_status		= csr_base +  5 * csr_size;
-    sc->lmc_csrs.csr_command	        = csr_base +  6 * csr_size;
-    sc->lmc_csrs.csr_intr		= csr_base +  7 * csr_size;
-    sc->lmc_csrs.csr_missed_frames	= csr_base +  8 * csr_size;
-    sc->lmc_csrs.csr_9		        = csr_base +  9 * csr_size;
-    sc->lmc_csrs.csr_10		        = csr_base + 10 * csr_size;
-    sc->lmc_csrs.csr_11		        = csr_base + 11 * csr_size;
-    sc->lmc_csrs.csr_12		        = csr_base + 12 * csr_size;
-    sc->lmc_csrs.csr_13		        = csr_base + 13 * csr_size;
-    sc->lmc_csrs.csr_14		        = csr_base + 14 * csr_size;
-    sc->lmc_csrs.csr_15		        = csr_base + 15 * csr_size;
-    lmc_trace(sc->lmc_device, "lmc_initcsrs out");
+	lmc_trace(sc->lmc_device, "lmc_initcsrs in");
+	sc->lmc_csrs.csr_busmode	= csr_base +  0 * csr_size;
+	sc->lmc_csrs.csr_txpoll		= csr_base +  1 * csr_size;
+	sc->lmc_csrs.csr_rxpoll		= csr_base +  2 * csr_size;
+	sc->lmc_csrs.csr_rxlist		= csr_base +  3 * csr_size;
+	sc->lmc_csrs.csr_txlist		= csr_base +  4 * csr_size;
+	sc->lmc_csrs.csr_status		= csr_base +  5 * csr_size;
+	sc->lmc_csrs.csr_command	= csr_base +  6 * csr_size;
+	sc->lmc_csrs.csr_intr		= csr_base +  7 * csr_size;
+	sc->lmc_csrs.csr_missed_frames	= csr_base +  8 * csr_size;
+	sc->lmc_csrs.csr_9		= csr_base +  9 * csr_size;
+	sc->lmc_csrs.csr_10		= csr_base + 10 * csr_size;
+	sc->lmc_csrs.csr_11		= csr_base + 11 * csr_size;
+	sc->lmc_csrs.csr_12		= csr_base + 12 * csr_size;
+	sc->lmc_csrs.csr_13		= csr_base + 13 * csr_size;
+	sc->lmc_csrs.csr_14		= csr_base + 14 * csr_size;
+	sc->lmc_csrs.csr_15		= csr_base + 15 * csr_size;
+	lmc_trace(sc->lmc_device, "lmc_initcsrs out");
 }
 
 static void lmc_driver_timeout(struct net_device *dev)
 {
-    lmc_softc_t *sc = dev_to_sc(dev);
-    u32 csr6;
-    unsigned long flags;
-
-    lmc_trace(dev, "lmc_driver_timeout in");
+	lmc_softc_t *sc = dev_to_sc(dev);
+	u32 csr6;
+	unsigned long flags;
 
-    spin_lock_irqsave(&sc->lmc_lock, flags);
+	lmc_trace(dev, "lmc_driver_timeout in");
 
-    printk("%s: Xmitter busy|\n", dev->name);
+	spin_lock_irqsave(&sc->lmc_lock, flags);
 
-    sc->extra_stats.tx_tbusy_calls++;
-    if (jiffies - dev_trans_start(dev) < TX_TIMEOUT)
-	    goto bug_out;
+	printk(KERN_DEBUG "%s: Xmitter busy|\n", dev->name);
 
-    /*
-     * Chip seems to have locked up
-     * Reset it
-     * This whips out all our decriptor
-     * table and starts from scartch
-     */
+	sc->extra_stats.tx_tbusy_calls++;
+	if (jiffies - dev_trans_start(dev) < TX_TIMEOUT)
+		goto bug_out;
 
-    LMC_EVENT_LOG(LMC_EVENT_XMTPRCTMO,
-                  LMC_CSR_READ (sc, csr_status),
-		  sc->extra_stats.tx_ProcTimeout);
+	/* Chip seems to have locked up. Reset it. This whips out all our
+	   decriptor table and starts from scartch. */
 
-    lmc_running_reset (dev);
+	LMC_EVENT_LOG(LMC_EVENT_XMTPRCTMO, LMC_CSR_READ(sc, csr_status),
+		      sc->extra_stats.tx_ProcTimeout);
 
-    LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ (sc, csr_status), 0);
-    LMC_EVENT_LOG(LMC_EVENT_RESET2,
-                  lmc_mii_readreg (sc, 0, 16),
-                  lmc_mii_readreg (sc, 0, 17));
+	lmc_running_reset(dev);
 
-    /* restart the tx processes */
-    csr6 = LMC_CSR_READ (sc, csr_command);
-    LMC_CSR_WRITE (sc, csr_command, csr6 | 0x0002);
-    LMC_CSR_WRITE (sc, csr_command, csr6 | 0x2002);
+	LMC_EVENT_LOG(LMC_EVENT_RESET1, LMC_CSR_READ(sc, csr_status), 0);
+	LMC_EVENT_LOG(LMC_EVENT_RESET2, lmc_mii_readreg(sc, 0, 16),
+		      lmc_mii_readreg(sc, 0, 17));
 
-    /* immediate transmit */
-    LMC_CSR_WRITE (sc, csr_txpoll, 0);
+	/* restart the tx processes */
+	csr6 = LMC_CSR_READ(sc, csr_command);
+	LMC_CSR_WRITE(sc, csr_command, csr6 | 0x0002);
+	LMC_CSR_WRITE(sc, csr_command, csr6 | 0x2002);
 
-    sc->lmc_device->stats.tx_errors++;
-    sc->extra_stats.tx_ProcTimeout++; /* -baz */
+	/* immediate transmit */
+	LMC_CSR_WRITE(sc, csr_txpoll, 0);
 
-    dev->trans_start = jiffies; /* prevent tx timeout */
+	sc->lmc_device->stats.tx_errors++;
+	sc->extra_stats.tx_ProcTimeout++;
+	dev->trans_start = jiffies; /* prevent tx timeout */
 
 bug_out:
-
-    spin_unlock_irqrestore(&sc->lmc_lock, flags);
-
-    lmc_trace(dev, "lmc_driver_timout out");
-
-
+	spin_unlock_irqrestore(&sc->lmc_lock, flags);
+	lmc_trace(dev, "lmc_driver_timout out");
 }
diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c
index 5920c99..a3aa2a0 100644
--- a/drivers/net/wan/lmc/lmc_media.c
+++ b/drivers/net/wan/lmc/lmc_media.c
@@ -1,5 +1,3 @@
-/* $Id: lmc_media.c,v 1.13 2000/04/11 05:25:26 asj Exp $ */
-
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/timer.h>
@@ -8,19 +6,16 @@
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
 #include <linux/in.h>
+#include <linux/io.h>
 #include <linux/if_arp.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 #include <linux/inet.h>
 #include <linux/bitops.h>
-
-#include <asm/processor.h>             /* Processor type for cache alignment. */
-#include <asm/io.h>
+#include <linux/uaccess.h>
+#include <asm/processor.h>   /* Processor type for cache alignment. */
 #include <asm/dma.h>
-
-#include <asm/uaccess.h>
-
 #include "lmc.h"
 #include "lmc_var.h"
 #include "lmc_ioctl.h"
@@ -28,513 +23,440 @@
 
 #define CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE 1
 
- /*
-  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
-  * All rights reserved.  www.lanmedia.com
-  *
-  * This code is written by:
-  * Andrew Stanley-Jones (asj@cban.com)
-  * Rob Braun (bbraun@vix.com),
-  * Michael Graff (explorer@vix.com) and
-  * Matt Thomas (matt@3am-software.com).
-  *
-  * This software may be used and distributed according to the terms
-  * of the GNU General Public License version 2, incorporated herein by reference.
-  */
-
 /*
- * protocol independent method.
+ * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
+ * All rights reserved.  www.lanmedia.com
+ *
+ * This code is written by:
+ * Andrew Stanley-Jones (asj@cban.com)
+ * Rob Braun (bbraun@vix.com),
+ * Michael Graff (explorer@vix.com) and
+ * Matt Thomas (matt@3am-software.com).
+ *
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License version 2, incorporated herein by reference.
  */
-static void lmc_set_protocol (lmc_softc_t * const, lmc_ctl_t *);
 
-/*
- * media independent methods to check on media status, link, light LEDs,
- * etc.
- */
-static void lmc_ds3_init (lmc_softc_t * const);
-static void lmc_ds3_default (lmc_softc_t * const);
-static void lmc_ds3_set_status (lmc_softc_t * const, lmc_ctl_t *);
-static void lmc_ds3_set_100ft (lmc_softc_t * const, int);
-static int lmc_ds3_get_link_status (lmc_softc_t * const);
-static void lmc_ds3_set_crc_length (lmc_softc_t * const, int);
-static void lmc_ds3_set_scram (lmc_softc_t * const, int);
-static void lmc_ds3_watchdog (lmc_softc_t * const);
-
-static void lmc_hssi_init (lmc_softc_t * const);
-static void lmc_hssi_default (lmc_softc_t * const);
-static void lmc_hssi_set_status (lmc_softc_t * const, lmc_ctl_t *);
-static void lmc_hssi_set_clock (lmc_softc_t * const, int);
-static int lmc_hssi_get_link_status (lmc_softc_t * const);
-static void lmc_hssi_set_link_status (lmc_softc_t * const, int);
-static void lmc_hssi_set_crc_length (lmc_softc_t * const, int);
-static void lmc_hssi_watchdog (lmc_softc_t * const);
-
-static void lmc_ssi_init (lmc_softc_t * const);
-static void lmc_ssi_default (lmc_softc_t * const);
-static void lmc_ssi_set_status (lmc_softc_t * const, lmc_ctl_t *);
-static void lmc_ssi_set_clock (lmc_softc_t * const, int);
-static void lmc_ssi_set_speed (lmc_softc_t * const, lmc_ctl_t *);
-static int lmc_ssi_get_link_status (lmc_softc_t * const);
-static void lmc_ssi_set_link_status (lmc_softc_t * const, int);
-static void lmc_ssi_set_crc_length (lmc_softc_t * const, int);
-static void lmc_ssi_watchdog (lmc_softc_t * const);
-
-static void lmc_t1_init (lmc_softc_t * const);
-static void lmc_t1_default (lmc_softc_t * const);
-static void lmc_t1_set_status (lmc_softc_t * const, lmc_ctl_t *);
-static int lmc_t1_get_link_status (lmc_softc_t * const);
-static void lmc_t1_set_circuit_type (lmc_softc_t * const, int);
-static void lmc_t1_set_crc_length (lmc_softc_t * const, int);
-static void lmc_t1_set_clock (lmc_softc_t * const, int);
-static void lmc_t1_watchdog (lmc_softc_t * const);
-
-static void lmc_dummy_set_1 (lmc_softc_t * const, int);
-static void lmc_dummy_set2_1 (lmc_softc_t * const, lmc_ctl_t *);
-
-static inline void write_av9110_bit (lmc_softc_t *, int);
+/* protocol independent method. */
+static void lmc_set_protocol(lmc_softc_t * const, lmc_ctl_t *);
+
+/* media independent methods to check on media status, link, light LEDs, etc. */
+static void lmc_ds3_init(lmc_softc_t * const);
+static void lmc_ds3_default(lmc_softc_t * const);
+static void lmc_ds3_set_status(lmc_softc_t * const, lmc_ctl_t *);
+static void lmc_ds3_set_100ft(lmc_softc_t * const, int);
+static int lmc_ds3_get_link_status(lmc_softc_t * const);
+static void lmc_ds3_set_crc_length(lmc_softc_t * const, int);
+static void lmc_ds3_set_scram(lmc_softc_t * const, int);
+static void lmc_ds3_watchdog(lmc_softc_t * const);
+
+static void lmc_hssi_init(lmc_softc_t * const);
+static void lmc_hssi_default(lmc_softc_t * const);
+static void lmc_hssi_set_status(lmc_softc_t * const, lmc_ctl_t *);
+static void lmc_hssi_set_clock(lmc_softc_t * const, int);
+static int lmc_hssi_get_link_status(lmc_softc_t * const);
+static void lmc_hssi_set_link_status(lmc_softc_t * const, int);
+static void lmc_hssi_set_crc_length(lmc_softc_t * const, int);
+static void lmc_hssi_watchdog(lmc_softc_t * const);
+
+static void lmc_ssi_init(lmc_softc_t * const);
+static void lmc_ssi_default(lmc_softc_t * const);
+static void lmc_ssi_set_status(lmc_softc_t * const, lmc_ctl_t *);
+static void lmc_ssi_set_clock(lmc_softc_t * const, int);
+static void lmc_ssi_set_speed(lmc_softc_t * const, lmc_ctl_t *);
+static int lmc_ssi_get_link_status(lmc_softc_t * const);
+static void lmc_ssi_set_link_status(lmc_softc_t * const, int);
+static void lmc_ssi_set_crc_length(lmc_softc_t * const, int);
+static void lmc_ssi_watchdog(lmc_softc_t * const);
+
+static void lmc_t1_init(lmc_softc_t * const);
+static void lmc_t1_default(lmc_softc_t * const);
+static void lmc_t1_set_status(lmc_softc_t * const, lmc_ctl_t *);
+static int lmc_t1_get_link_status(lmc_softc_t * const);
+static void lmc_t1_set_circuit_type(lmc_softc_t * const, int);
+static void lmc_t1_set_crc_length(lmc_softc_t * const, int);
+static void lmc_t1_set_clock(lmc_softc_t * const, int);
+static void lmc_t1_watchdog(lmc_softc_t * const);
+
+static void lmc_dummy_set_1(lmc_softc_t * const, int);
+static void lmc_dummy_set2_1(lmc_softc_t * const, lmc_ctl_t *);
+
+static inline void write_av9110_bit(lmc_softc_t *, int);
 static void write_av9110(lmc_softc_t *, u32, u32, u32, u32, u32);
 
 lmc_media_t lmc_ds3_media = {
-  lmc_ds3_init,			/* special media init stuff */
-  lmc_ds3_default,		/* reset to default state */
-  lmc_ds3_set_status,		/* reset status to state provided */
-  lmc_dummy_set_1,		/* set clock source */
-  lmc_dummy_set2_1,		/* set line speed */
-  lmc_ds3_set_100ft,		/* set cable length */
-  lmc_ds3_set_scram,		/* set scrambler */
-  lmc_ds3_get_link_status,	/* get link status */
-  lmc_dummy_set_1,		/* set link status */
-  lmc_ds3_set_crc_length,	/* set CRC length */
-  lmc_dummy_set_1,		/* set T1 or E1 circuit type */
-  lmc_ds3_watchdog
+	lmc_ds3_init,		/* special media init stuff */
+	lmc_ds3_default,	/* reset to default state */
+	lmc_ds3_set_status,	/* reset status to state provided */
+	lmc_dummy_set_1,	/* set clock source */
+	lmc_dummy_set2_1,	/* set line speed */
+	lmc_ds3_set_100ft,	/* set cable length */
+	lmc_ds3_set_scram,	/* set scrambler */
+	lmc_ds3_get_link_status, /* get link status */
+	lmc_dummy_set_1,	/* set link status */
+	lmc_ds3_set_crc_length,	/* set CRC length */
+	lmc_dummy_set_1,	/* set T1 or E1 circuit type */
+	lmc_ds3_watchdog
 };
 
 lmc_media_t lmc_hssi_media = {
-  lmc_hssi_init,		/* special media init stuff */
-  lmc_hssi_default,		/* reset to default state */
-  lmc_hssi_set_status,		/* reset status to state provided */
-  lmc_hssi_set_clock,		/* set clock source */
-  lmc_dummy_set2_1,		/* set line speed */
-  lmc_dummy_set_1,		/* set cable length */
-  lmc_dummy_set_1,		/* set scrambler */
-  lmc_hssi_get_link_status,	/* get link status */
-  lmc_hssi_set_link_status,	/* set link status */
-  lmc_hssi_set_crc_length,	/* set CRC length */
-  lmc_dummy_set_1,		/* set T1 or E1 circuit type */
-  lmc_hssi_watchdog
+	lmc_hssi_init,		/* special media init stuff */
+	lmc_hssi_default,	/* reset to default state */
+	lmc_hssi_set_status,	/* reset status to state provided */
+	lmc_hssi_set_clock,	/* set clock source */
+	lmc_dummy_set2_1,	/* set line speed */
+	lmc_dummy_set_1,	/* set cable length */
+	lmc_dummy_set_1,	/* set scrambler */
+	lmc_hssi_get_link_status, /* get link status */
+	lmc_hssi_set_link_status, /* set link status */
+	lmc_hssi_set_crc_length, /* set CRC length */
+	lmc_dummy_set_1,	/* set T1 or E1 circuit type */
+	lmc_hssi_watchdog
 };
 
-lmc_media_t lmc_ssi_media = { lmc_ssi_init,	/* special media init stuff */
-  lmc_ssi_default,		/* reset to default state */
-  lmc_ssi_set_status,		/* reset status to state provided */
-  lmc_ssi_set_clock,		/* set clock source */
-  lmc_ssi_set_speed,		/* set line speed */
-  lmc_dummy_set_1,		/* set cable length */
-  lmc_dummy_set_1,		/* set scrambler */
-  lmc_ssi_get_link_status,	/* get link status */
-  lmc_ssi_set_link_status,	/* set link status */
-  lmc_ssi_set_crc_length,	/* set CRC length */
-  lmc_dummy_set_1,		/* set T1 or E1 circuit type */
-  lmc_ssi_watchdog
+lmc_media_t lmc_ssi_media = {
+	lmc_ssi_init,		/* special media init stuff */
+	lmc_ssi_default,	/* reset to default state */
+	lmc_ssi_set_status,	/* reset status to state provided */
+	lmc_ssi_set_clock,	/* set clock source */
+	lmc_ssi_set_speed,	/* set line speed */
+	lmc_dummy_set_1,	/* set cable length */
+	lmc_dummy_set_1,	/* set scrambler */
+	lmc_ssi_get_link_status, /* get link status */
+	lmc_ssi_set_link_status, /* set link status */
+	lmc_ssi_set_crc_length,	/* set CRC length */
+	lmc_dummy_set_1,	/* set T1 or E1 circuit type */
+	lmc_ssi_watchdog
 };
 
 lmc_media_t lmc_t1_media = {
-  lmc_t1_init,			/* special media init stuff */
-  lmc_t1_default,		/* reset to default state */
-  lmc_t1_set_status,		/* reset status to state provided */
-  lmc_t1_set_clock,		/* set clock source */
-  lmc_dummy_set2_1,		/* set line speed */
-  lmc_dummy_set_1,		/* set cable length */
-  lmc_dummy_set_1,		/* set scrambler */
-  lmc_t1_get_link_status,	/* get link status */
-  lmc_dummy_set_1,		/* set link status */
-  lmc_t1_set_crc_length,	/* set CRC length */
-  lmc_t1_set_circuit_type,	/* set T1 or E1 circuit type */
-  lmc_t1_watchdog
+	lmc_t1_init,		/* special media init stuff */
+	lmc_t1_default,		/* reset to default state */
+	lmc_t1_set_status,	/* reset status to state provided */
+	lmc_t1_set_clock,	/* set clock source */
+	lmc_dummy_set2_1,	/* set line speed */
+	lmc_dummy_set_1,	/* set cable length */
+	lmc_dummy_set_1,	/* set scrambler */
+	lmc_t1_get_link_status,	/* get link status */
+	lmc_dummy_set_1,	/* set link status */
+	lmc_t1_set_crc_length,	/* set CRC length */
+	lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */
+	lmc_t1_watchdog
 };
 
-static void
-lmc_dummy_set_1 (lmc_softc_t * const sc, int a)
+static void lmc_dummy_set_1(lmc_softc_t * const sc, int a)
 {
 }
 
-static void
-lmc_dummy_set2_1 (lmc_softc_t * const sc, lmc_ctl_t * a)
+static void lmc_dummy_set2_1(lmc_softc_t * const sc, lmc_ctl_t * a)
 {
 }
 
-/*
- *  HSSI methods
- */
+/* HSSI methods */
 
-static void
-lmc_hssi_init (lmc_softc_t * const sc)
+static void lmc_hssi_init(lmc_softc_t * const sc)
 {
-  sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5200;
-
-  lmc_gpio_mkoutput (sc, LMC_GEP_HSSI_CLOCK);
+	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5200;
+	lmc_gpio_mkoutput(sc, LMC_GEP_HSSI_CLOCK);
 }
 
-static void
-lmc_hssi_default (lmc_softc_t * const sc)
+static void lmc_hssi_default(lmc_softc_t * const sc)
 {
-  sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
-  sc->lmc_media->set_link_status (sc, LMC_LINK_DOWN);
-  sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_EXT);
-  sc->lmc_media->set_crc_length (sc, LMC_CTL_CRC_LENGTH_16);
+	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
+	sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
-/*
- * Given a user provided state, set ourselves up to match it.  This will
- * always reset the card if needed.
- */
-static void
-lmc_hssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+/* Given a user provided state, set ourselves up to match it.
+   This will always reset the card if needed. */
+static void lmc_hssi_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 {
-  if (ctl == NULL)
-    {
-      sc->lmc_media->set_clock_source (sc, sc->ictl.clock_source);
-      lmc_set_protocol (sc, NULL);
-
-      return;
-    }
-
-  /*
-   * check for change in clock source
-   */
-  if (ctl->clock_source && !sc->ictl.clock_source)
-    {
-      sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_INT);
-      sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
-    }
-  else if (!ctl->clock_source && sc->ictl.clock_source)
-    {
-      sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-      sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_EXT);
-    }
-
-  lmc_set_protocol (sc, ctl);
+	if (ctl == NULL) {
+		sc->lmc_media->set_clock_source(sc, sc->ictl.clock_source);
+		lmc_set_protocol(sc, NULL);
+
+		return;
+	}
+
+	/* check for change in clock source */
+	if (ctl->clock_source && !sc->ictl.clock_source) {
+		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_INT);
+		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
+	} else if (!ctl->clock_source && sc->ictl.clock_source) {
+		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
+		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	}
+
+	lmc_set_protocol(sc, ctl);
 }
 
-/*
- * 1 == internal, 0 == external
- */
-static void
-lmc_hssi_set_clock (lmc_softc_t * const sc, int ie)
+/* 1 == internal, 0 == external */
+static void lmc_hssi_set_clock(lmc_softc_t * const sc, int ie)
 {
-  int old;
-  old = sc->ictl.clock_source;
-  if (ie == LMC_CTL_CLOCK_SOURCE_EXT)
-    {
-      sc->lmc_gpio |= LMC_GEP_HSSI_CLOCK;
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-      if(old != ie)
-        printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS);
-    }
-  else
-    {
-      sc->lmc_gpio &= ~(LMC_GEP_HSSI_CLOCK);
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-      if(old != ie)
-        printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS);
-    }
+	int old;
+	old = sc->ictl.clock_source;
+	if (ie == LMC_CTL_CLOCK_SOURCE_EXT) {
+		sc->lmc_gpio |= LMC_GEP_HSSI_CLOCK;
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
+		if (old != ie)
+			printk(LMC_PRINTF_FMT ": clock external\n",
+			       LMC_PRINTF_ARGS);
+	} else {
+		sc->lmc_gpio &= ~(LMC_GEP_HSSI_CLOCK);
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
+		if (old != ie)
+			printk(LMC_PRINTF_FMT ": clock internal\n",
+			       LMC_PRINTF_ARGS);
+	}
 }
 
-/*
- * return hardware link status.
- * 0 == link is down, 1 == link is up.
- */
-static int
-lmc_hssi_get_link_status (lmc_softc_t * const sc)
+/* Return hardware link status. 0 == link is down, 1 == link is up. */
+static int lmc_hssi_get_link_status(lmc_softc_t * const sc)
 {
-    /*
-     * We're using the same code as SSI since
-     * they're practically the same
-     */
-    return lmc_ssi_get_link_status(sc);
+	/* We're using the same code as SSI since they're practically
+	   the same */
+	return lmc_ssi_get_link_status(sc);
 }
 
-static void
-lmc_hssi_set_link_status (lmc_softc_t * const sc, int state)
+static void lmc_hssi_set_link_status(lmc_softc_t * const sc, int state)
 {
-  if (state == LMC_LINK_UP)
-    sc->lmc_miireg16 |= LMC_MII16_HSSI_TA;
-  else
-    sc->lmc_miireg16 &= ~LMC_MII16_HSSI_TA;
+	if (state == LMC_LINK_UP)
+		sc->lmc_miireg16 |= LMC_MII16_HSSI_TA;
+	else
+		sc->lmc_miireg16 &= ~LMC_MII16_HSSI_TA;
 
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-/*
- * 0 == 16bit, 1 == 32bit
- */
-static void
-lmc_hssi_set_crc_length (lmc_softc_t * const sc, int state)
+/* 0 == 16bit, 1 == 32bit */
+static void lmc_hssi_set_crc_length(lmc_softc_t * const sc, int state)
 {
-  if (state == LMC_CTL_CRC_LENGTH_32)
-    {
-      /* 32 bit */
-      sc->lmc_miireg16 |= LMC_MII16_HSSI_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
-    }
-  else
-    {
-      /* 16 bit */
-      sc->lmc_miireg16 &= ~LMC_MII16_HSSI_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
-    }
-
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (state == LMC_CTL_CRC_LENGTH_32) {
+		/* 32 bit */
+		sc->lmc_miireg16 |= LMC_MII16_HSSI_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+	} else {
+		/* 16 bit */
+		sc->lmc_miireg16 &= ~LMC_MII16_HSSI_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void
-lmc_hssi_watchdog (lmc_softc_t * const sc)
+static void lmc_hssi_watchdog(lmc_softc_t * const sc)
 {
-  /* HSSI is blank */
+	/* HSSI is blank */
 }
 
-/*
- *  DS3 methods
- */
+/* DS3 methods */
 
-/*
- * Set cable length
- */
-static void
-lmc_ds3_set_100ft (lmc_softc_t * const sc, int ie)
+/* Set cable length */
+static void lmc_ds3_set_100ft(lmc_softc_t * const sc, int ie)
 {
-  if (ie == LMC_CTL_CABLE_LENGTH_GT_100FT)
-    {
-      sc->lmc_miireg16 &= ~LMC_MII16_DS3_ZERO;
-      sc->ictl.cable_length = LMC_CTL_CABLE_LENGTH_GT_100FT;
-    }
-  else if (ie == LMC_CTL_CABLE_LENGTH_LT_100FT)
-    {
-      sc->lmc_miireg16 |= LMC_MII16_DS3_ZERO;
-      sc->ictl.cable_length = LMC_CTL_CABLE_LENGTH_LT_100FT;
-    }
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (ie == LMC_CTL_CABLE_LENGTH_GT_100FT) {
+		sc->lmc_miireg16 &= ~LMC_MII16_DS3_ZERO;
+		sc->ictl.cable_length = LMC_CTL_CABLE_LENGTH_GT_100FT;
+	} else if (ie == LMC_CTL_CABLE_LENGTH_LT_100FT) {
+		sc->lmc_miireg16 |= LMC_MII16_DS3_ZERO;
+		sc->ictl.cable_length = LMC_CTL_CABLE_LENGTH_LT_100FT;
+	}
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void
-lmc_ds3_default (lmc_softc_t * const sc)
+static void lmc_ds3_default(lmc_softc_t * const sc)
 {
-  sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
-  sc->lmc_media->set_link_status (sc, LMC_LINK_DOWN);
-  sc->lmc_media->set_cable_length (sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
-  sc->lmc_media->set_scrambler (sc, LMC_CTL_OFF);
-  sc->lmc_media->set_crc_length (sc, LMC_CTL_CRC_LENGTH_16);
+	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
+	sc->lmc_media->set_cable_length(sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
+	sc->lmc_media->set_scrambler(sc, LMC_CTL_OFF);
+	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
-/*
- * Given a user provided state, set ourselves up to match it.  This will
- * always reset the card if needed.
- */
-static void
-lmc_ds3_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+/* Given a user provided state, set ourselves up to match it.
+   This will always reset the card if needed. */
+static void lmc_ds3_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 {
-  if (ctl == NULL)
-    {
-      sc->lmc_media->set_cable_length (sc, sc->ictl.cable_length);
-      sc->lmc_media->set_scrambler (sc, sc->ictl.scrambler_onoff);
-      lmc_set_protocol (sc, NULL);
-
-      return;
-    }
-
-  /*
-   * check for change in cable length setting
-   */
-  if (ctl->cable_length && !sc->ictl.cable_length)
-    lmc_ds3_set_100ft (sc, LMC_CTL_CABLE_LENGTH_GT_100FT);
-  else if (!ctl->cable_length && sc->ictl.cable_length)
-    lmc_ds3_set_100ft (sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
-
-  /*
-   * Check for change in scrambler setting (requires reset)
-   */
-  if (ctl->scrambler_onoff && !sc->ictl.scrambler_onoff)
-    lmc_ds3_set_scram (sc, LMC_CTL_ON);
-  else if (!ctl->scrambler_onoff && sc->ictl.scrambler_onoff)
-    lmc_ds3_set_scram (sc, LMC_CTL_OFF);
-
-  lmc_set_protocol (sc, ctl);
+	if (ctl == NULL) {
+		sc->lmc_media->set_cable_length(sc, sc->ictl.cable_length);
+		sc->lmc_media->set_scrambler(sc, sc->ictl.scrambler_onoff);
+		lmc_set_protocol(sc, NULL);
+		return;
+	}
+
+	/* check for change in cable length setting */
+	if (ctl->cable_length && !sc->ictl.cable_length)
+		lmc_ds3_set_100ft(sc, LMC_CTL_CABLE_LENGTH_GT_100FT);
+	else if (!ctl->cable_length && sc->ictl.cable_length)
+		lmc_ds3_set_100ft(sc, LMC_CTL_CABLE_LENGTH_LT_100FT);
+
+	/* Check for change in scrambler setting (requires reset) */
+	if (ctl->scrambler_onoff && !sc->ictl.scrambler_onoff)
+		lmc_ds3_set_scram(sc, LMC_CTL_ON);
+	else if (!ctl->scrambler_onoff && sc->ictl.scrambler_onoff)
+		lmc_ds3_set_scram(sc, LMC_CTL_OFF);
+
+	lmc_set_protocol(sc, ctl);
 }
 
-static void
-lmc_ds3_init (lmc_softc_t * const sc)
+static void lmc_ds3_init(lmc_softc_t * const sc)
 {
-  int i;
+	int i;
 
-  sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5245;
+	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC5245;
 
-  /* writes zeros everywhere */
-  for (i = 0; i < 21; i++)
-    {
-      lmc_mii_writereg (sc, 0, 17, i);
-      lmc_mii_writereg (sc, 0, 18, 0);
-    }
+	/* writes zeros everywhere */
+	for (i = 0; i < 21; i++) {
+		lmc_mii_writereg(sc, 0, 17, i);
+		lmc_mii_writereg(sc, 0, 18, 0);
+	}
 
-  /* set some essential bits */
-  lmc_mii_writereg (sc, 0, 17, 1);
-  lmc_mii_writereg (sc, 0, 18, 0x25);	/* ser, xtx */
+	/* set some essential bits */
+	lmc_mii_writereg(sc, 0, 17, 1);
+	lmc_mii_writereg(sc, 0, 18, 0x25);	/* ser, xtx */
 
-  lmc_mii_writereg (sc, 0, 17, 5);
-  lmc_mii_writereg (sc, 0, 18, 0x80);	/* emode */
+	lmc_mii_writereg(sc, 0, 17, 5);
+	lmc_mii_writereg(sc, 0, 18, 0x80);	/* emode */
 
-  lmc_mii_writereg (sc, 0, 17, 14);
-  lmc_mii_writereg (sc, 0, 18, 0x30);	/* rcgen, tcgen */
+	lmc_mii_writereg(sc, 0, 17, 14);
+	lmc_mii_writereg(sc, 0, 18, 0x30);	/* rcgen, tcgen */
 
-  /* clear counters and latched bits */
-  for (i = 0; i < 21; i++)
-    {
-      lmc_mii_writereg (sc, 0, 17, i);
-      lmc_mii_readreg (sc, 0, 18);
-    }
+	/* clear counters and latched bits */
+	for (i = 0; i < 21; i++) {
+		lmc_mii_writereg(sc, 0, 17, i);
+		lmc_mii_readreg(sc, 0, 18);
+	}
 }
 
-/*
- * 1 == DS3 payload scrambled, 0 == not scrambled
- */
-static void
-lmc_ds3_set_scram (lmc_softc_t * const sc, int ie)
+/* 1 == DS3 payload scrambled, 0 == not scrambled */
+static void lmc_ds3_set_scram(lmc_softc_t * const sc, int ie)
 {
-  if (ie == LMC_CTL_ON)
-    {
-      sc->lmc_miireg16 |= LMC_MII16_DS3_SCRAM;
-      sc->ictl.scrambler_onoff = LMC_CTL_ON;
-    }
-  else
-    {
-      sc->lmc_miireg16 &= ~LMC_MII16_DS3_SCRAM;
-      sc->ictl.scrambler_onoff = LMC_CTL_OFF;
-    }
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (ie == LMC_CTL_ON) {
+		sc->lmc_miireg16 |= LMC_MII16_DS3_SCRAM;
+		sc->ictl.scrambler_onoff = LMC_CTL_ON;
+	} else {
+		sc->lmc_miireg16 &= ~LMC_MII16_DS3_SCRAM;
+		sc->ictl.scrambler_onoff = LMC_CTL_OFF;
+	}
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-/*
- * return hardware link status.
- * 0 == link is down, 1 == link is up.
- */
-static int
-lmc_ds3_get_link_status (lmc_softc_t * const sc)
+/* Return hardware link status. 0 == link is down, 1 == link is up. */
+static int lmc_ds3_get_link_status(lmc_softc_t * const sc)
 {
-    u16 link_status, link_status_11;
-    int ret = 1;
-
-    lmc_mii_writereg (sc, 0, 17, 7);
-    link_status = lmc_mii_readreg (sc, 0, 18);
-
-    /* LMC5245 (DS3) & LMC1200 (DS1) LED definitions
-     * led0 yellow = far-end adapter is in Red alarm condition
-     * led1 blue   = received an Alarm Indication signal
-     *               (upstream failure)
-     * led2 Green  = power to adapter, Gate Array loaded & driver
-     *               attached
-     * led3 red    = Loss of Signal (LOS) or out of frame (OOF)
-     *               conditions detected on T3 receive signal
-     */
-
-    lmc_led_on(sc, LMC_DS3_LED2);
-
-    if ((link_status & LMC_FRAMER_REG0_DLOS) ||
-        (link_status & LMC_FRAMER_REG0_OOFS)){
-        ret = 0;
-        if(sc->last_led_err[3] != 1){
-	    u16 r1;
-            lmc_mii_writereg (sc, 0, 17, 01); /* Turn on Xbit error as our cisco does */
-            r1 = lmc_mii_readreg (sc, 0, 18);
-            r1 &= 0xfe;
-            lmc_mii_writereg(sc, 0, 18, r1);
-            printk(KERN_WARNING "%s: Red Alarm - Loss of Signal or Loss of Framing\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED3);	/* turn on red LED */
-        sc->last_led_err[3] = 1;
-    }
-    else {
-        lmc_led_off(sc, LMC_DS3_LED3);	/* turn on red LED */
-        if(sc->last_led_err[3] == 1){
-	    u16 r1;
-            lmc_mii_writereg (sc, 0, 17, 01); /* Turn off Xbit error */
-            r1 = lmc_mii_readreg (sc, 0, 18);
-            r1 |= 0x01;
-            lmc_mii_writereg(sc, 0, 18, r1);
-        }
-        sc->last_led_err[3] = 0;
-    }
-
-    lmc_mii_writereg(sc, 0, 17, 0x10);
-    link_status_11 = lmc_mii_readreg(sc, 0, 18);
-    if((link_status & LMC_FRAMER_REG0_AIS) ||
-       (link_status_11 & LMC_FRAMER_REG10_XBIT)) {
-        ret = 0;
-        if(sc->last_led_err[0] != 1){
-            printk(KERN_WARNING "%s: AIS Alarm or XBit Error\n", sc->name);
-            printk(KERN_WARNING "%s: Remote end has loss of signal or framing\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED0);
-        sc->last_led_err[0] = 1;
-    }
-    else {
-        lmc_led_off(sc, LMC_DS3_LED0);
-        sc->last_led_err[0] = 0;
-    }
-
-    lmc_mii_writereg (sc, 0, 17, 9);
-    link_status = lmc_mii_readreg (sc, 0, 18);
-    
-    if(link_status & LMC_FRAMER_REG9_RBLUE){
-        ret = 0;
-        if(sc->last_led_err[1] != 1){
-            printk(KERN_WARNING "%s: Blue Alarm - Receiving all 1's\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED1);
-        sc->last_led_err[1] = 1;
-    }
-    else {
-        lmc_led_off(sc, LMC_DS3_LED1);
-        sc->last_led_err[1] = 0;
-    }
-
-    return ret;
+	u16 link_status, link_status_11;
+	int ret = 1;
+
+	lmc_mii_writereg(sc, 0, 17, 7);
+	link_status = lmc_mii_readreg(sc, 0, 18);
+
+	/* LMC5245 (DS3) & LMC1200 (DS1) LED definitions
+	 * led0 yellow = far-end adapter is in Red alarm condition
+	 * led1 blue   = received an Alarm Indication signal
+	 *               (upstream failure)
+	 * led2 Green  = power to adapter, Gate Array loaded & driver
+	 *               attached
+	 * led3 red    = Loss of Signal (LOS) or out of frame (OOF)
+	 *               conditions detected on T3 receive signal */
+
+	lmc_led_on(sc, LMC_DS3_LED2);
+
+	if ((link_status & LMC_FRAMER_REG0_DLOS) ||
+	    (link_status & LMC_FRAMER_REG0_OOFS)) {
+		ret = 0;
+		if (sc->last_led_err[3] != 1) {
+			u16 r1;
+
+			 /* Turn on Xbit error as our cisco does */
+			lmc_mii_writereg(sc, 0, 17, 01);
+			r1 = lmc_mii_readreg(sc, 0, 18);
+			r1 &= 0xfe;
+			lmc_mii_writereg(sc, 0, 18, r1);
+			printk(KERN_WARNING
+			       "%s: Red Alarm - Loss of Signal or Loss of Framing\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED3);	/* turn on red LED */
+		sc->last_led_err[3] = 1;
+	} else {
+		lmc_led_off(sc, LMC_DS3_LED3);	/* turn on red LED */
+		if (sc->last_led_err[3] == 1) {
+			u16 r1;
+			/* Turn off Xbit error */
+			lmc_mii_writereg(sc, 0, 17, 01);
+			r1 = lmc_mii_readreg(sc, 0, 18);
+			r1 |= 0x01;
+			lmc_mii_writereg(sc, 0, 18, r1);
+		}
+		sc->last_led_err[3] = 0;
+	}
+
+	lmc_mii_writereg(sc, 0, 17, 0x10);
+	link_status_11 = lmc_mii_readreg(sc, 0, 18);
+	if ((link_status & LMC_FRAMER_REG0_AIS) ||
+	   (link_status_11 & LMC_FRAMER_REG10_XBIT)) {
+		ret = 0;
+		if (sc->last_led_err[0] != 1) {
+			printk(KERN_WARNING
+			       "%s: AIS Alarm or XBit Error\n", sc->name);
+			printk(KERN_WARNING
+			       "%s: Remote end has loss of signal or framing\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED0);
+		sc->last_led_err[0] = 1;
+	} else {
+		lmc_led_off(sc, LMC_DS3_LED0);
+		sc->last_led_err[0] = 0;
+	}
+
+	lmc_mii_writereg(sc, 0, 17, 9);
+	link_status = lmc_mii_readreg(sc, 0, 18);
+
+	if (link_status & LMC_FRAMER_REG9_RBLUE) {
+		ret = 0;
+		if (sc->last_led_err[1] != 1) {
+			printk(KERN_WARNING
+			       "%s: Blue Alarm - Receiving all 1's\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED1);
+		sc->last_led_err[1] = 1;
+	} else {
+		lmc_led_off(sc, LMC_DS3_LED1);
+		sc->last_led_err[1] = 0;
+	}
+
+	return ret;
 }
 
-/*
- * 0 == 16bit, 1 == 32bit
- */
-static void
-lmc_ds3_set_crc_length (lmc_softc_t * const sc, int state)
+/* 0 == 16bit, 1 == 32bit */
+static void lmc_ds3_set_crc_length(lmc_softc_t * const sc, int state)
 {
-  if (state == LMC_CTL_CRC_LENGTH_32)
-    {
-      /* 32 bit */
-      sc->lmc_miireg16 |= LMC_MII16_DS3_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
-    }
-  else
-    {
-      /* 16 bit */
-      sc->lmc_miireg16 &= ~LMC_MII16_DS3_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
-    }
-
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (state == LMC_CTL_CRC_LENGTH_32) {
+		/* 32 bit */
+		sc->lmc_miireg16 |= LMC_MII16_DS3_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+	} else {
+		/* 16 bit */
+		sc->lmc_miireg16 &= ~LMC_MII16_DS3_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-static void
-lmc_ds3_watchdog (lmc_softc_t * const sc)
+static void lmc_ds3_watchdog(lmc_softc_t * const sc)
 {
-    
 }
 
 
-/*
- *  SSI methods
- */
+/* SSI methods */
 
 static void lmc_ssi_init(lmc_softc_t * const sc)
 {
@@ -551,333 +473,274 @@ static void lmc_ssi_init(lmc_softc_t * const sc)
 	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
 }
 
-static void
-lmc_ssi_default (lmc_softc_t * const sc)
+static void lmc_ssi_default(lmc_softc_t * const sc)
 {
-  sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
 
-  /*
-   * make TXCLOCK always be an output
-   */
-  lmc_gpio_mkoutput (sc, LMC_GEP_SSI_TXCLOCK);
+	/* make TXCLOCK always be an output */
+	lmc_gpio_mkoutput(sc, LMC_GEP_SSI_TXCLOCK);
 
-  sc->lmc_media->set_link_status (sc, LMC_LINK_DOWN);
-  sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_EXT);
-  sc->lmc_media->set_speed (sc, NULL);
-  sc->lmc_media->set_crc_length (sc, LMC_CTL_CRC_LENGTH_16);
+	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
+	sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+	sc->lmc_media->set_speed(sc, NULL);
+	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
 }
 
-/*
- * Given a user provided state, set ourselves up to match it.  This will
- * always reset the card if needed.
- */
-static void
-lmc_ssi_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+/* Given a user provided state, set ourselves up to match it.
+   This will always reset the card if needed. */
+static void lmc_ssi_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 {
-  if (ctl == NULL)
-    {
-      sc->lmc_media->set_clock_source (sc, sc->ictl.clock_source);
-      sc->lmc_media->set_speed (sc, &sc->ictl);
-      lmc_set_protocol (sc, NULL);
-
-      return;
-    }
-
-  /*
-   * check for change in clock source
-   */
-  if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_INT
-      && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_EXT)
-    {
-      sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_INT);
-      sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
-    }
-  else if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_EXT
-	   && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_INT)
-    {
-      sc->lmc_media->set_clock_source (sc, LMC_CTL_CLOCK_SOURCE_EXT);
-      sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
-    }
-
-  if (ctl->clock_rate != sc->ictl.clock_rate)
-    sc->lmc_media->set_speed (sc, ctl);
-
-  lmc_set_protocol (sc, ctl);
+	if (ctl == NULL) {
+		sc->lmc_media->set_clock_source(sc, sc->ictl.clock_source);
+		sc->lmc_media->set_speed(sc, &sc->ictl);
+		lmc_set_protocol(sc, NULL);
+		return;
+	}
+
+	/* check for change in clock source */
+	if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_INT
+	    && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_EXT) {
+		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_INT);
+		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_INT;
+	} else if (ctl->clock_source == LMC_CTL_CLOCK_SOURCE_EXT
+		 && sc->ictl.clock_source == LMC_CTL_CLOCK_SOURCE_INT) {
+		sc->lmc_media->set_clock_source(sc, LMC_CTL_CLOCK_SOURCE_EXT);
+		sc->lmc_timing = LMC_CTL_CLOCK_SOURCE_EXT;
+	}
+
+	if (ctl->clock_rate != sc->ictl.clock_rate)
+		sc->lmc_media->set_speed(sc, ctl);
+
+	lmc_set_protocol(sc, ctl);
 }
 
-/*
- * 1 == internal, 0 == external
- */
-static void
-lmc_ssi_set_clock (lmc_softc_t * const sc, int ie)
+/* 1 == internal, 0 == external */
+static void lmc_ssi_set_clock(lmc_softc_t * const sc, int ie)
 {
-  int old;
-  old = ie;
-  if (ie == LMC_CTL_CLOCK_SOURCE_EXT)
-    {
-      sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-      if(ie != old)
-        printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS);
-    }
-  else
-    {
-      sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-      if(ie != old)
-        printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS);
-    }
+	int old;
+	old = ie;
+	if (ie == LMC_CTL_CLOCK_SOURCE_EXT) {
+		sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
+		if (ie != old)
+			printk(LMC_PRINTF_FMT ": clock external\n",
+			       LMC_PRINTF_ARGS);
+	} else {
+		sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
+		if (ie != old)
+			printk(LMC_PRINTF_FMT ": clock internal\n",
+			       LMC_PRINTF_ARGS);
+	}
 }
 
-static void
-lmc_ssi_set_speed (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_ssi_set_speed(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 {
-  lmc_ctl_t *ictl = &sc->ictl;
-  lmc_av9110_t *av;
-
-  /* original settings for clock rate of:
-   *  100 Khz (8,25,0,0,2) were incorrect
-   *  they should have been 80,125,1,3,3
-   *  There are 17 param combinations to produce this freq.
-   *  For 1.5 Mhz use 120,100,1,1,2 (226 param. combinations)
-   */
-  if (ctl == NULL)
-    {
-      av = &ictl->cardspec.ssi;
-      ictl->clock_rate = 1500000;
-      av->f = ictl->clock_rate;
-      av->n = 120;
-      av->m = 100;
-      av->v = 1;
-      av->x = 1;
-      av->r = 2;
-
-      write_av9110 (sc, av->n, av->m, av->v, av->x, av->r);
-      return;
-    }
-
-  av = &ctl->cardspec.ssi;
-
-  if (av->f == 0)
-    return;
-
-  ictl->clock_rate = av->f;	/* really, this is the rate we are */
-  ictl->cardspec.ssi = *av;
-
-  write_av9110 (sc, av->n, av->m, av->v, av->x, av->r);
+	lmc_ctl_t *ictl = &sc->ictl;
+	lmc_av9110_t *av;
+
+	/* original settings for clock rate of 100 Khz (8,25,0,0,2) were
+	   incorrect. They should have been 80,125,1,3,3. There are 17 param
+	   combinations to produce this freq. For 1.5 Mhz use 120,100,1,1,2
+	   (226 param. combinations) */
+	if (ctl == NULL) {
+		av = &ictl->cardspec.ssi;
+		ictl->clock_rate = 1500000;
+		av->f = ictl->clock_rate;
+		av->n = 120;
+		av->m = 100;
+		av->v = 1;
+		av->x = 1;
+		av->r = 2;
+		write_av9110(sc, av->n, av->m, av->v, av->x, av->r);
+		return;
+	}
+
+	av = &ctl->cardspec.ssi;
+
+	if (av->f == 0)
+		return;
+
+	ictl->clock_rate = av->f;	/* really, this is the rate we are */
+	ictl->cardspec.ssi = *av;
+
+	write_av9110(sc, av->n, av->m, av->v, av->x, av->r);
 }
 
-/*
- * return hardware link status.
- * 0 == link is down, 1 == link is up.
- */
-static int
-lmc_ssi_get_link_status (lmc_softc_t * const sc)
+/* Return hardware link status. 0 == link is down, 1 == link is up. */
+static int lmc_ssi_get_link_status(lmc_softc_t * const sc)
 {
-  u16 link_status;
-  u32 ticks;
-  int ret = 1;
-  int hw_hdsk = 1;
-
-  /*
-   * missing CTS?  Hmm.  If we require CTS on, we may never get the
-   * link to come up, so omit it in this test.
-   *
-   * Also, it seems that with a loopback cable, DCD isn't asserted,
-   * so just check for things like this:
-   *      DSR _must_ be asserted.
-   *      One of DCD or CTS must be asserted.
-   */
-
-  /* LMC 1000 (SSI) LED definitions
-   * led0 Green = power to adapter, Gate Array loaded &
-   *              driver attached
-   * led1 Green = DSR and DTR and RTS and CTS are set
-   * led2 Green = Cable detected
-   * led3 red   = No timing is available from the
-   *              cable or the on-board frequency
-   *              generator.
-   */
-
-  link_status = lmc_mii_readreg (sc, 0, 16);
-
-  /* Is the transmit clock still available */
-  ticks = LMC_CSR_READ (sc, csr_gp_timer);
-  ticks = 0x0000ffff - (ticks & 0x0000ffff);
-
-  lmc_led_on (sc, LMC_MII16_LED0);
-
-  /* ====== transmit clock determination ===== */
-  if (sc->lmc_timing == LMC_CTL_CLOCK_SOURCE_INT) {
-      lmc_led_off(sc, LMC_MII16_LED3);
-  }
-  else if (ticks == 0 ) {				/* no clock found ? */
-      ret = 0;
-      if (sc->last_led_err[3] != 1) {
-	      sc->extra_stats.tx_lossOfClockCnt++;
-	      printk(KERN_WARNING "%s: Lost Clock, Link Down\n", sc->name);
-      }
-      sc->last_led_err[3] = 1;
-      lmc_led_on (sc, LMC_MII16_LED3);	/* turn ON red LED */
-  }
-  else {
-      if(sc->last_led_err[3] == 1)
-          printk(KERN_WARNING "%s: Clock Returned\n", sc->name);
-      sc->last_led_err[3] = 0;
-      lmc_led_off (sc, LMC_MII16_LED3);		/* turn OFF red LED */
-  }
-
-  if ((link_status & LMC_MII16_SSI_DSR) == 0) { /* Also HSSI CA */
-      ret = 0;
-      hw_hdsk = 0;
-  }
+	u16 link_status;
+	u32 ticks;
+	int ret = 1;
+	int hw_hdsk = 1;
+
+	/* missing CTS?  Hmm.  If we require CTS on, we may never get the
+	   link to come up, so omit it in this test.
+
+	   Also, it seems that with a loopback cable, DCD isn't asserted,
+	   so just check for things like this:
+	   - DSR _must_ be asserted.
+	   - One of DCD or CTS must be asserted. */
+
+	/* LMC 1000 (SSI) LED definitions
+	   - led0 green = power to adapter, Gate Array loaded & driver attached
+	   - led1 green = DSR and DTR and RTS and CTS are set
+	   - led2 green = Cable detected
+	   - led3 red   = No timing is available from the cable or the on-board
+			  frequency generator. */
+
+	link_status = lmc_mii_readreg(sc, 0, 16);
+
+	/* Is the transmit clock still available */
+	ticks = LMC_CSR_READ(sc, csr_gp_timer);
+	ticks = 0x0000ffff - (ticks & 0x0000ffff);
+
+	lmc_led_on(sc, LMC_MII16_LED0);
+
+	/* transmit clock determination */
+	if (sc->lmc_timing == LMC_CTL_CLOCK_SOURCE_INT)
+		lmc_led_off(sc, LMC_MII16_LED3);
+	else if (ticks == 0) {	/* no clock found ? */
+		ret = 0;
+		if (sc->last_led_err[3] != 1) {
+			sc->extra_stats.tx_lossOfClockCnt++;
+			printk(KERN_WARNING "%s: Lost Clock, Link Down\n",
+			       sc->name);
+		}
+		sc->last_led_err[3] = 1;
+		lmc_led_on(sc, LMC_MII16_LED3);	/* turn ON red LED */
+	} else {
+		if (sc->last_led_err[3] == 1)
+			printk(KERN_WARNING "%s: Clock Returned\n", sc->name);
+		sc->last_led_err[3] = 0;
+		lmc_led_off(sc, LMC_MII16_LED3); /* turn OFF red LED */
+	}
+
+	if ((link_status & LMC_MII16_SSI_DSR) == 0) { /* Also HSSI CA */
+		ret = 0;
+		hw_hdsk = 0;
+	}
 
 #ifdef CONFIG_LMC_IGNORE_HARDWARE_HANDSHAKE
-  if ((link_status & (LMC_MII16_SSI_CTS | LMC_MII16_SSI_DCD)) == 0){
-      ret = 0;
-      hw_hdsk = 0;
-  }
+	if ((link_status & (LMC_MII16_SSI_CTS | LMC_MII16_SSI_DCD)) == 0) {
+		ret = 0;
+		hw_hdsk = 0;
+	}
 #endif
 
-  if(hw_hdsk == 0){
-      if(sc->last_led_err[1] != 1)
-          printk(KERN_WARNING "%s: DSR not asserted\n", sc->name);
-      sc->last_led_err[1] = 1;
-      lmc_led_off(sc, LMC_MII16_LED1);
-  }
-  else {
-      if(sc->last_led_err[1] != 0)
-          printk(KERN_WARNING "%s: DSR now asserted\n", sc->name);
-      sc->last_led_err[1] = 0;
-      lmc_led_on(sc, LMC_MII16_LED1);
-  }
-
-  if(ret == 1) {
-      lmc_led_on(sc, LMC_MII16_LED2); /* Over all good status? */
-  }
-  
-  return ret;
+	if (hw_hdsk == 0) {
+		if (sc->last_led_err[1] != 1)
+			printk(KERN_WARNING "%s: DSR not asserted\n", sc->name);
+		sc->last_led_err[1] = 1;
+		lmc_led_off(sc, LMC_MII16_LED1);
+	} else {
+		if (sc->last_led_err[1] != 0)
+			printk(KERN_WARNING "%s: DSR now asserted\n", sc->name);
+		sc->last_led_err[1] = 0;
+		lmc_led_on(sc, LMC_MII16_LED1);
+	}
+
+	if (ret == 1)
+		lmc_led_on(sc, LMC_MII16_LED2); /* Over all good status? */
+
+	return ret;
 }
 
-static void
-lmc_ssi_set_link_status (lmc_softc_t * const sc, int state)
+static void lmc_ssi_set_link_status(lmc_softc_t * const sc, int state)
 {
-  if (state == LMC_LINK_UP)
-    {
-      sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
-      printk (LMC_PRINTF_FMT ": asserting DTR and RTS\n", LMC_PRINTF_ARGS);
-    }
-  else
-    {
-      sc->lmc_miireg16 &= ~(LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
-      printk (LMC_PRINTF_FMT ": deasserting DTR and RTS\n", LMC_PRINTF_ARGS);
-    }
-
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (state == LMC_LINK_UP) {
+		sc->lmc_miireg16 |= (LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
+		printk(LMC_PRINTF_FMT ": asserting DTR and RTS\n",
+		       LMC_PRINTF_ARGS);
+	} else {
+		sc->lmc_miireg16 &= ~(LMC_MII16_SSI_DTR | LMC_MII16_SSI_RTS);
+		printk(LMC_PRINTF_FMT ": deasserting DTR and RTS\n",
+		       LMC_PRINTF_ARGS);
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 
 }
 
-/*
- * 0 == 16bit, 1 == 32bit
- */
-static void
-lmc_ssi_set_crc_length (lmc_softc_t * const sc, int state)
+/* 0 == 16bit, 1 == 32bit */
+static void lmc_ssi_set_crc_length(lmc_softc_t * const sc, int state)
 {
-  if (state == LMC_CTL_CRC_LENGTH_32)
-    {
-      /* 32 bit */
-      sc->lmc_miireg16 |= LMC_MII16_SSI_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
-      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
-
-    }
-  else
-    {
-      /* 16 bit */
-      sc->lmc_miireg16 &= ~LMC_MII16_SSI_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
-      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
-    }
-
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (state == LMC_CTL_CRC_LENGTH_32) {
+		/* 32 bit */
+		sc->lmc_miireg16 |= LMC_MII16_SSI_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
+
+	} else {
+		/* 16 bit */
+		sc->lmc_miireg16 &= ~LMC_MII16_SSI_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-/*
- * These are bits to program the ssi frequency generator
- */
-static inline void
-write_av9110_bit (lmc_softc_t * sc, int c)
+/* These are bits to program the ssi frequency generator */
+static inline void write_av9110_bit(lmc_softc_t *sc, int c)
 {
-  /*
-   * set the data bit as we need it.
-   */
-  sc->lmc_gpio &= ~(LMC_GEP_CLK);
-  if (c & 0x01)
-    sc->lmc_gpio |= LMC_GEP_DATA;
-  else
-    sc->lmc_gpio &= ~(LMC_GEP_DATA);
-  LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-
-  /*
-   * set the clock to high
-   */
-  sc->lmc_gpio |= LMC_GEP_CLK;
-  LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-
-  /*
-   * set the clock to low again.
-   */
-  sc->lmc_gpio &= ~(LMC_GEP_CLK);
-  LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
+	/* set the data bit as we need it. */
+	sc->lmc_gpio &= ~(LMC_GEP_CLK);
+	if (c & 0x01)
+		sc->lmc_gpio |= LMC_GEP_DATA;
+	else
+		sc->lmc_gpio &= ~(LMC_GEP_DATA);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* set the clock to high */
+	sc->lmc_gpio |= LMC_GEP_CLK;
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* set the clock to low again. */
+	sc->lmc_gpio &= ~(LMC_GEP_CLK);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
 }
 
 static void write_av9110(lmc_softc_t *sc, u32 n, u32 m, u32 v, u32 x, u32 r)
 {
-  int i;
+	int i;
 
 #if 0
-  printk (LMC_PRINTF_FMT ": speed %u, %d %d %d %d %d\n",
-	  LMC_PRINTF_ARGS, sc->ictl.clock_rate, n, m, v, x, r);
+	printk(LMC_PRINTF_FMT ": speed %u, %d %d %d %d %d\n",
+	       LMC_PRINTF_ARGS, sc->ictl.clock_rate, n, m, v, x, r);
 #endif
 
-  sc->lmc_gpio |= LMC_GEP_SSI_GENERATOR;
-  sc->lmc_gpio &= ~(LMC_GEP_DATA | LMC_GEP_CLK);
-  LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-
-  /*
-   * Set the TXCLOCK, GENERATOR, SERIAL, and SERIALCLK
-   * as outputs.
-   */
-  lmc_gpio_mkoutput (sc, (LMC_GEP_DATA | LMC_GEP_CLK
-			  | LMC_GEP_SSI_GENERATOR));
-
-  sc->lmc_gpio &= ~(LMC_GEP_SSI_GENERATOR);
-  LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-
-  /*
-   * a shifting we will go...
-   */
-  for (i = 0; i < 7; i++)
-    write_av9110_bit (sc, n >> i);
-  for (i = 0; i < 7; i++)
-    write_av9110_bit (sc, m >> i);
-  for (i = 0; i < 1; i++)
-    write_av9110_bit (sc, v >> i);
-  for (i = 0; i < 2; i++)
-    write_av9110_bit (sc, x >> i);
-  for (i = 0; i < 2; i++)
-    write_av9110_bit (sc, r >> i);
-  for (i = 0; i < 5; i++)
-    write_av9110_bit (sc, 0x17 >> i);
-
-  /*
-   * stop driving serial-related signals
-   */
-  lmc_gpio_mkinput (sc,
-		    (LMC_GEP_DATA | LMC_GEP_CLK
-		     | LMC_GEP_SSI_GENERATOR));
+	sc->lmc_gpio |= LMC_GEP_SSI_GENERATOR;
+	sc->lmc_gpio &= ~(LMC_GEP_DATA | LMC_GEP_CLK);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* Set the TXCLOCK, GENERATOR, SERIAL, and SERIALCLK as outputs. */
+	lmc_gpio_mkoutput(sc, (LMC_GEP_DATA | LMC_GEP_CLK
+				| LMC_GEP_SSI_GENERATOR));
+
+	sc->lmc_gpio &= ~(LMC_GEP_SSI_GENERATOR);
+	LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+
+	/* a shifting we will go... */
+	for (i = 0; i < 7; i++)
+		write_av9110_bit(sc, n >> i);
+	for (i = 0; i < 7; i++)
+		write_av9110_bit(sc, m >> i);
+	for (i = 0; i < 1; i++)
+		write_av9110_bit(sc, v >> i);
+	for (i = 0; i < 2; i++)
+		write_av9110_bit(sc, x >> i);
+	for (i = 0; i < 2; i++)
+		write_av9110_bit(sc, r >> i);
+	for (i = 0; i < 5; i++)
+		write_av9110_bit(sc, 0x17 >> i);
+
+	/* stop driving serial-related signals */
+	lmc_gpio_mkinput(sc, (LMC_GEP_DATA | LMC_GEP_CLK |
+			      LMC_GEP_SSI_GENERATOR));
 }
 
 static void lmc_ssi_watchdog(lmc_softc_t * const sc)
@@ -889,322 +752,285 @@ static void lmc_ssi_watchdog(lmc_softc_t * const sc)
 		lmc_led_on(sc, LMC_MII16_LED2);
 }
 
-/*
- *  T1 methods
- */
+/* T1 methods */
 
-/*
- * The framer regs are multiplexed through MII regs 17 & 18
- *  write the register address to MII reg 17 and the *  data to MII reg 18. */
-static void
-lmc_t1_write (lmc_softc_t * const sc, int a, int d)
+/* The framer regs are multiplexed through MII regs 17 & 18 write the register
+   address to MII reg 17 and the data to MII reg 18. */
+static void lmc_t1_write(lmc_softc_t * const sc, int a, int d)
 {
-  lmc_mii_writereg (sc, 0, 17, a);
-  lmc_mii_writereg (sc, 0, 18, d);
+	lmc_mii_writereg(sc, 0, 17, a);
+	lmc_mii_writereg(sc, 0, 18, d);
 }
 
 /* Save a warning
-static int
-lmc_t1_read (lmc_softc_t * const sc, int a)
+static int lmc_t1_read(lmc_softc_t * const sc, int a)
 {
-  lmc_mii_writereg (sc, 0, 17, a);
-  return lmc_mii_readreg (sc, 0, 18);
+	lmc_mii_writereg(sc, 0, 17, a);
+	return lmc_mii_readreg(sc, 0, 18);
 }
 */
 
 
-static void
-lmc_t1_init (lmc_softc_t * const sc)
+static void lmc_t1_init(lmc_softc_t * const sc)
 {
-  u16 mii16;
-  int i;
-
-  sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1200;
-  mii16 = lmc_mii_readreg (sc, 0, 16);
-
-  /* reset 8370 */
-  mii16 &= ~LMC_MII16_T1_RST;
-  lmc_mii_writereg (sc, 0, 16, mii16 | LMC_MII16_T1_RST);
-  lmc_mii_writereg (sc, 0, 16, mii16);
-
-  /* set T1 or E1 line.  Uses sc->lmcmii16 reg in function so update it */
-  sc->lmc_miireg16 = mii16;
-  lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
-  mii16 = sc->lmc_miireg16;
-
-  lmc_t1_write (sc, 0x01, 0x1B);	/* CR0     - primary control             */
-  lmc_t1_write (sc, 0x02, 0x42);	/* JAT_CR  - jitter atten config         */
-  lmc_t1_write (sc, 0x14, 0x00);	/* LOOP    - loopback config             */
-  lmc_t1_write (sc, 0x15, 0x00);	/* DL3_TS  - external data link timeslot */
-  lmc_t1_write (sc, 0x18, 0xFF);	/* PIO     - programmable I/O            */
-  lmc_t1_write (sc, 0x19, 0x30);	/* POE     - programmable OE             */
-  lmc_t1_write (sc, 0x1A, 0x0F);	/* CMUX    - clock input mux             */
-  lmc_t1_write (sc, 0x20, 0x41);	/* LIU_CR  - RX LIU config               */
-  lmc_t1_write (sc, 0x22, 0x76);	/* RLIU_CR - RX LIU config               */
-  lmc_t1_write (sc, 0x40, 0x03);	/* RCR0    - RX config                   */
-  lmc_t1_write (sc, 0x45, 0x00);	/* RALM    - RX alarm config             */
-  lmc_t1_write (sc, 0x46, 0x05);	/* LATCH   - RX alarm/err/cntr latch     */
-  lmc_t1_write (sc, 0x68, 0x40);	/* TLIU_CR - TX LIU config               */
-  lmc_t1_write (sc, 0x70, 0x0D);	/* TCR0    - TX framer config            */
-  lmc_t1_write (sc, 0x71, 0x05);	/* TCR1    - TX config                   */
-  lmc_t1_write (sc, 0x72, 0x0B);	/* TFRM    - TX frame format             */
-  lmc_t1_write (sc, 0x73, 0x00);	/* TERROR  - TX error insert             */
-  lmc_t1_write (sc, 0x74, 0x00);	/* TMAN    - TX manual Sa/FEBE config    */
-  lmc_t1_write (sc, 0x75, 0x00);	/* TALM    - TX alarm signal config      */
-  lmc_t1_write (sc, 0x76, 0x00);	/* TPATT   - TX test pattern config      */
-  lmc_t1_write (sc, 0x77, 0x00);	/* TLB     - TX inband loopback config   */
-  lmc_t1_write (sc, 0x90, 0x05);	/* CLAD_CR - clock rate adapter config   */
-  lmc_t1_write (sc, 0x91, 0x05);	/* CSEL    - clad freq sel               */
-  lmc_t1_write (sc, 0xA6, 0x00);	/* DL1_CTL - DL1 control                 */
-  lmc_t1_write (sc, 0xB1, 0x00);	/* DL2_CTL - DL2 control                 */
-  lmc_t1_write (sc, 0xD0, 0x47);	/* SBI_CR  - sys bus iface config        */
-  lmc_t1_write (sc, 0xD1, 0x70);	/* RSB_CR  - RX sys bus config           */
-  lmc_t1_write (sc, 0xD4, 0x30);	/* TSB_CR  - TX sys bus config           */
-  for (i = 0; i < 32; i++)
-    {
-      lmc_t1_write (sc, 0x0E0 + i, 0x00);	/* SBCn - sys bus per-channel ctl    */
-      lmc_t1_write (sc, 0x100 + i, 0x00);	/* TPCn - TX per-channel ctl         */
-      lmc_t1_write (sc, 0x180 + i, 0x00);	/* RPCn - RX per-channel ctl         */
-    }
-  for (i = 1; i < 25; i++)
-    {
-      lmc_t1_write (sc, 0x0E0 + i, 0x0D);	/* SBCn - sys bus per-channel ctl    */
-    }
-
-  mii16 |= LMC_MII16_T1_XOE;
-  lmc_mii_writereg (sc, 0, 16, mii16);
-  sc->lmc_miireg16 = mii16;
+	u16 mii16;
+	int i;
+
+	sc->ictl.cardtype = LMC_CTL_CARDTYPE_LMC1200;
+	mii16 = lmc_mii_readreg(sc, 0, 16);
+
+	/* reset 8370 */
+	mii16 &= ~LMC_MII16_T1_RST;
+	lmc_mii_writereg(sc, 0, 16, mii16 | LMC_MII16_T1_RST);
+	lmc_mii_writereg(sc, 0, 16, mii16);
+
+	/* set T1 or E1 line.  Uses sc->lmcmii16 reg in function so update it */
+	sc->lmc_miireg16 = mii16;
+	lmc_t1_set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
+	mii16 = sc->lmc_miireg16;
+
+	lmc_t1_write(sc, 0x01, 0x1B); /* CR0     - primary control */
+	lmc_t1_write(sc, 0x02, 0x42); /* JAT_CR  - jitter atten config */
+	lmc_t1_write(sc, 0x14, 0x00); /* LOOP    - loopback config */
+	lmc_t1_write(sc, 0x15, 0x00); /* DL3_TS  - external data link timeslot */
+	lmc_t1_write(sc, 0x18, 0xFF); /* PIO     - programmable I/O */
+	lmc_t1_write(sc, 0x19, 0x30); /* POE     - programmable OE */
+	lmc_t1_write(sc, 0x1A, 0x0F); /* CMUX    - clock input mux */
+	lmc_t1_write(sc, 0x20, 0x41); /* LIU_CR  - RX LIU config */
+	lmc_t1_write(sc, 0x22, 0x76); /* RLIU_CR - RX LIU config */
+	lmc_t1_write(sc, 0x40, 0x03); /* RCR0    - RX config */
+	lmc_t1_write(sc, 0x45, 0x00); /* RALM    - RX alarm config */
+	lmc_t1_write(sc, 0x46, 0x05); /* LATCH   - RX alarm/err/cntr latch */
+	lmc_t1_write(sc, 0x68, 0x40); /* TLIU_CR - TX LIU config */
+	lmc_t1_write(sc, 0x70, 0x0D); /* TCR0    - TX framer config */
+	lmc_t1_write(sc, 0x71, 0x05); /* TCR1    - TX config */
+	lmc_t1_write(sc, 0x72, 0x0B); /* TFRM    - TX frame format */
+	lmc_t1_write(sc, 0x73, 0x00); /* TERROR  - TX error insert */
+	lmc_t1_write(sc, 0x74, 0x00); /* TMAN    - TX manual Sa/FEBE config */
+	lmc_t1_write(sc, 0x75, 0x00); /* TALM    - TX alarm signal config */
+	lmc_t1_write(sc, 0x76, 0x00); /* TPATT   - TX test pattern config */
+	lmc_t1_write(sc, 0x77, 0x00); /* TLB     - TX inband loopback config */
+	lmc_t1_write(sc, 0x90, 0x05); /* CLAD_CR - clock rate adapter config */
+	lmc_t1_write(sc, 0x91, 0x05); /* CSEL    - clad freq sel */
+	lmc_t1_write(sc, 0xA6, 0x00); /* DL1_CTL - DL1 control */
+	lmc_t1_write(sc, 0xB1, 0x00); /* DL2_CTL - DL2 control */
+	lmc_t1_write(sc, 0xD0, 0x47); /* SBI_CR  - sys bus iface config */
+	lmc_t1_write(sc, 0xD1, 0x70); /* RSB_CR  - RX sys bus config */
+	lmc_t1_write(sc, 0xD4, 0x30); /* TSB_CR  - TX sys bus config */
+	for (i = 0; i < 32; i++) {
+		lmc_t1_write(sc, 0x0E0 + i, 0x00); /* SBCn - sys bus per-channel ctl */
+		lmc_t1_write(sc, 0x100 + i, 0x00); /* TPCn - TX per-channel ctl */
+		lmc_t1_write(sc, 0x180 + i, 0x00); /* RPCn - RX per-channel ctl */
+	}
+	for (i = 1; i < 25; i++)
+		lmc_t1_write(sc, 0x0E0 + i, 0x0D); /* SBCn - sys bus per-channel ctl */
+
+	mii16 |= LMC_MII16_T1_XOE;
+	lmc_mii_writereg(sc, 0, 16, mii16);
+	sc->lmc_miireg16 = mii16;
 }
 
-static void
-lmc_t1_default (lmc_softc_t * const sc)
+static void lmc_t1_default(lmc_softc_t * const sc)
 {
-  sc->lmc_miireg16 = LMC_MII16_LED_ALL;
-  sc->lmc_media->set_link_status (sc, LMC_LINK_DOWN);
-  sc->lmc_media->set_circuit_type (sc, LMC_CTL_CIRCUIT_TYPE_T1);
-  sc->lmc_media->set_crc_length (sc, LMC_CTL_CRC_LENGTH_16);
-  /* Right now we can only clock from out internal source */
-  sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
+	sc->lmc_miireg16 = LMC_MII16_LED_ALL;
+	sc->lmc_media->set_link_status(sc, LMC_LINK_DOWN);
+	sc->lmc_media->set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
+	sc->lmc_media->set_crc_length(sc, LMC_CTL_CRC_LENGTH_16);
+	/* Right now we can only clock from out internal source */
+	sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
 }
-/* * Given a user provided state, set ourselves up to match it.  This will * always reset the card if needed.
- */
-static void
-lmc_t1_set_status (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+/* Given a user provided state, set ourselves up to match it.
+   This will always reset the card if needed. */
+static void lmc_t1_set_status(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 {
-  if (ctl == NULL)
-    {
-      sc->lmc_media->set_circuit_type (sc, sc->ictl.circuit_type);
-      lmc_set_protocol (sc, NULL);
-
-      return;
-    }
-  /*
-   * check for change in circuit type         */
-  if (ctl->circuit_type == LMC_CTL_CIRCUIT_TYPE_T1
-      && sc->ictl.circuit_type ==
-      LMC_CTL_CIRCUIT_TYPE_E1) sc->lmc_media->set_circuit_type (sc,
-								LMC_CTL_CIRCUIT_TYPE_E1);
-  else if (ctl->circuit_type == LMC_CTL_CIRCUIT_TYPE_E1
-	   && sc->ictl.circuit_type == LMC_CTL_CIRCUIT_TYPE_T1)
-    sc->lmc_media->set_circuit_type (sc, LMC_CTL_CIRCUIT_TYPE_T1);
-  lmc_set_protocol (sc, ctl);
+	if (ctl == NULL) {
+		sc->lmc_media->set_circuit_type(sc, sc->ictl.circuit_type);
+		lmc_set_protocol(sc, NULL);
+
+		return;
+	}
+	/* check for change in circuit type */
+	if (ctl->circuit_type == LMC_CTL_CIRCUIT_TYPE_T1
+	    && sc->ictl.circuit_type == LMC_CTL_CIRCUIT_TYPE_E1)
+		sc->lmc_media->set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_E1);
+	else if (ctl->circuit_type == LMC_CTL_CIRCUIT_TYPE_E1
+		 && sc->ictl.circuit_type == LMC_CTL_CIRCUIT_TYPE_T1)
+		sc->lmc_media->set_circuit_type(sc, LMC_CTL_CIRCUIT_TYPE_T1);
+	lmc_set_protocol(sc, ctl);
 }
-/*
- * return hardware link status.
- * 0 == link is down, 1 == link is up.
- */ static int
-lmc_t1_get_link_status (lmc_softc_t * const sc)
+
+/* Return hardware link status. 0 == link is down, 1 == link is up. */
+static int lmc_t1_get_link_status(lmc_softc_t * const sc)
 {
-    u16 link_status;
-    int ret = 1;
-
-  /* LMC5245 (DS3) & LMC1200 (DS1) LED definitions
-   * led0 yellow = far-end adapter is in Red alarm condition
-   * led1 blue   = received an Alarm Indication signal
-   *               (upstream failure)
-   * led2 Green  = power to adapter, Gate Array loaded & driver
-   *               attached
-   * led3 red    = Loss of Signal (LOS) or out of frame (OOF)
-   *               conditions detected on T3 receive signal
-   */
-    lmc_trace(sc->lmc_device, "lmc_t1_get_link_status in");
-    lmc_led_on(sc, LMC_DS3_LED2);
-
-    lmc_mii_writereg (sc, 0, 17, T1FRAMER_ALARM1_STATUS);
-    link_status = lmc_mii_readreg (sc, 0, 18);
-
-
-    if (link_status & T1F_RAIS) {			/* turn on blue LED */
-        ret = 0;
-        if(sc->last_led_err[1] != 1){
-            printk(KERN_WARNING "%s: Receive AIS/Blue Alarm. Far end in RED alarm\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED1);
-        sc->last_led_err[1] = 1;
-    }
-    else {
-        if(sc->last_led_err[1] != 0){
-            printk(KERN_WARNING "%s: End AIS/Blue Alarm\n", sc->name);
-        }
-        lmc_led_off (sc, LMC_DS3_LED1);
-        sc->last_led_err[1] = 0;
-    }
-
-    /*
-     * Yellow Alarm is nasty evil stuff, looks at data patterns
-     * inside the channel and confuses it with HDLC framing
-     * ignore all yellow alarms.
-     *
-     * Do listen to MultiFrame Yellow alarm which while implemented
-     * different ways isn't in the channel and hence somewhat
-     * more reliable
-     */
-
-    if (link_status & T1F_RMYEL) {
-        ret = 0;
-        if(sc->last_led_err[0] != 1){
-            printk(KERN_WARNING "%s: Receive Yellow AIS Alarm\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED0);
-        sc->last_led_err[0] = 1;
-    }
-    else {
-        if(sc->last_led_err[0] != 0){
-            printk(KERN_WARNING "%s: End of Yellow AIS Alarm\n", sc->name);
-        }
-        lmc_led_off(sc, LMC_DS3_LED0);
-        sc->last_led_err[0] = 0;
-    }
-
-    /*
-     * Loss of signal and los of frame
-     * Use the green bit to identify which one lit the led
-     */
-    if(link_status & T1F_RLOF){
-        ret = 0;
-        if(sc->last_led_err[3] != 1){
-            printk(KERN_WARNING "%s: Local Red Alarm: Loss of Framing\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED3);
-        sc->last_led_err[3] = 1;
-
-    }
-    else {
-        if(sc->last_led_err[3] != 0){
-            printk(KERN_WARNING "%s: End Red Alarm (LOF)\n", sc->name);
-        }
-        if( ! (link_status & T1F_RLOS))
-            lmc_led_off(sc, LMC_DS3_LED3);
-        sc->last_led_err[3] = 0;
-    }
-    
-    if(link_status & T1F_RLOS){
-        ret = 0;
-        if(sc->last_led_err[2] != 1){
-            printk(KERN_WARNING "%s: Local Red Alarm: Loss of Signal\n", sc->name);
-        }
-        lmc_led_on(sc, LMC_DS3_LED3);
-        sc->last_led_err[2] = 1;
-
-    }
-    else {
-        if(sc->last_led_err[2] != 0){
-            printk(KERN_WARNING "%s: End Red Alarm (LOS)\n", sc->name);
-        }
-        if( ! (link_status & T1F_RLOF))
-            lmc_led_off(sc, LMC_DS3_LED3);
-        sc->last_led_err[2] = 0;
-    }
-
-    sc->lmc_xinfo.t1_alarm1_status = link_status;
-
-    lmc_mii_writereg (sc, 0, 17, T1FRAMER_ALARM2_STATUS);
-    sc->lmc_xinfo.t1_alarm2_status = lmc_mii_readreg (sc, 0, 18);
-
-    
-    lmc_trace(sc->lmc_device, "lmc_t1_get_link_status out");
-
-    return ret;
+	u16 link_status;
+	int ret = 1;
+
+	/* LMC5245 (DS3) & LMC1200 (DS1) LED definitions
+	   - led0 yellow = far-end adapter is in Red alarm condition
+	   - led1 blue  = received an Alarm Indication signal (upstream failure)
+	   - led2 green  = power to adapter, Gate Array loaded & driver attached
+	   - led3 red    = Loss of Signal (LOS) or out of frame (OOF)
+			   conditions detected on T3 receive signal */
+	lmc_trace(sc->lmc_device, "lmc_t1_get_link_status in");
+	lmc_led_on(sc, LMC_DS3_LED2);
+
+	lmc_mii_writereg(sc, 0, 17, T1FRAMER_ALARM1_STATUS);
+	link_status = lmc_mii_readreg(sc, 0, 18);
+
+	if (link_status & T1F_RAIS) { /* turn on blue LED */
+		ret = 0;
+		if (sc->last_led_err[1] != 1) {
+			printk(KERN_WARNING
+			       "%s: Receive AIS/Blue Alarm. Far end in RED alarm\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED1);
+		sc->last_led_err[1] = 1;
+	} else {
+		if (sc->last_led_err[1] != 0) {
+			printk(KERN_WARNING "%s: End AIS/Blue Alarm\n",
+			       sc->name);
+		}
+		lmc_led_off(sc, LMC_DS3_LED1);
+		sc->last_led_err[1] = 0;
+	}
+
+	/* Yellow Alarm is nasty evil stuff, looks at data patterns inside the
+	   channel and confuses it with HDLC framing ignore all yellow alarms.
+	   Do listen to MultiFrame Yellow alarm which while implemented
+	   different ways isn't in the channel and hence somewhat more
+	   reliable */
+
+	if (link_status & T1F_RMYEL) {
+		ret = 0;
+		if (sc->last_led_err[0] != 1) {
+			printk(KERN_WARNING "%s: Receive Yellow AIS Alarm\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED0);
+		sc->last_led_err[0] = 1;
+	} else {
+		if (sc->last_led_err[0] != 0) {
+			printk(KERN_WARNING "%s: End of Yellow AIS Alarm\n",
+			       sc->name);
+		}
+		lmc_led_off(sc, LMC_DS3_LED0);
+		sc->last_led_err[0] = 0;
+	}
+
+	/* Loss of signal and los of frame. Use the green bit to identify which
+	   one lit the led */
+	if (link_status & T1F_RLOF) {
+		ret = 0;
+		if (sc->last_led_err[3] != 1) {
+			printk(KERN_WARNING
+			       "%s: Local Red Alarm: Loss of Framing\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED3);
+		sc->last_led_err[3] = 1;
+
+	} else {
+		if (sc->last_led_err[3] != 0) {
+			printk(KERN_WARNING "%s: End Red Alarm (LOF)\n",
+			       sc->name);
+		}
+		if (!(link_status & T1F_RLOS))
+			lmc_led_off(sc, LMC_DS3_LED3);
+		sc->last_led_err[3] = 0;
+	}
+
+	if (link_status & T1F_RLOS) {
+		ret = 0;
+		if (sc->last_led_err[2] != 1) {
+			printk(KERN_WARNING
+			       "%s: Local Red Alarm: Loss of Signal\n",
+			       sc->name);
+		}
+		lmc_led_on(sc, LMC_DS3_LED3);
+		sc->last_led_err[2] = 1;
+
+	} else {
+		if (sc->last_led_err[2] != 0) {
+			printk(KERN_WARNING "%s: End Red Alarm (LOS)\n",
+			       sc->name);
+		}
+		if (!(link_status & T1F_RLOF))
+			lmc_led_off(sc, LMC_DS3_LED3);
+		sc->last_led_err[2] = 0;
+	}
+
+	sc->lmc_xinfo.t1_alarm1_status = link_status;
+
+	lmc_mii_writereg(sc, 0, 17, T1FRAMER_ALARM2_STATUS);
+	sc->lmc_xinfo.t1_alarm2_status = lmc_mii_readreg(sc, 0, 18);
+
+	lmc_trace(sc->lmc_device, "lmc_t1_get_link_status out");
+	return ret;
 }
 
-/*
- * 1 == T1 Circuit Type , 0 == E1 Circuit Type
- */
-static void
-lmc_t1_set_circuit_type (lmc_softc_t * const sc, int ie)
+/* 1 == T1 Circuit Type , 0 == E1 Circuit Type */
+static void lmc_t1_set_circuit_type(lmc_softc_t * const sc, int ie)
 {
-  if (ie == LMC_CTL_CIRCUIT_TYPE_T1) {
-      sc->lmc_miireg16 |= LMC_MII16_T1_Z;
-      sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_T1;
-      printk(KERN_INFO "%s: In T1 Mode\n", sc->name);
-  }
-  else {
-      sc->lmc_miireg16 &= ~LMC_MII16_T1_Z;
-      sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_E1;
-      printk(KERN_INFO "%s: In E1 Mode\n", sc->name);
-  }
-
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
-  
+	if (ie == LMC_CTL_CIRCUIT_TYPE_T1) {
+		sc->lmc_miireg16 |= LMC_MII16_T1_Z;
+		sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_T1;
+		printk(KERN_INFO "%s: In T1 Mode\n", sc->name);
+	} else {
+		sc->lmc_miireg16 &= ~LMC_MII16_T1_Z;
+		sc->ictl.circuit_type = LMC_CTL_CIRCUIT_TYPE_E1;
+		printk(KERN_INFO "%s: In E1 Mode\n", sc->name);
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-/*
- * 0 == 16bit, 1 == 32bit */
-static void
-lmc_t1_set_crc_length (lmc_softc_t * const sc, int state)
+/* 0 == 16bit, 1 == 32bit */
+static void lmc_t1_set_crc_length(lmc_softc_t * const sc, int state)
 {
-  if (state == LMC_CTL_CRC_LENGTH_32)
-    {
-      /* 32 bit */
-      sc->lmc_miireg16 |= LMC_MII16_T1_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
-      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
-
-    }
-  else
-    {
-      /* 16 bit */ sc->lmc_miireg16 &= ~LMC_MII16_T1_CRC;
-      sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
-      sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
-
-    }
-
-  lmc_mii_writereg (sc, 0, 16, sc->lmc_miireg16);
+	if (state == LMC_CTL_CRC_LENGTH_32) {
+		/* 32 bit */
+		sc->lmc_miireg16 |= LMC_MII16_T1_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_32;
+		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_4;
+
+	} else {
+		/* 16 bit */ sc->lmc_miireg16 &= ~LMC_MII16_T1_CRC;
+		sc->ictl.crc_length = LMC_CTL_CRC_LENGTH_16;
+		sc->lmc_crcSize = LMC_CTL_CRC_BYTESIZE_2;
+
+	}
+
+	lmc_mii_writereg(sc, 0, 16, sc->lmc_miireg16);
 }
 
-/*
- * 1 == internal, 0 == external
- */
-static void
-lmc_t1_set_clock (lmc_softc_t * const sc, int ie)
+/* 1 == internal, 0 == external */
+static void lmc_t1_set_clock(lmc_softc_t * const sc, int ie)
 {
-  int old;
-  old = ie;
-  if (ie == LMC_CTL_CLOCK_SOURCE_EXT)
-    {
-      sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
-      if(old != ie)
-        printk (LMC_PRINTF_FMT ": clock external\n", LMC_PRINTF_ARGS);
-    }
-  else
-    {
-      sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
-      LMC_CSR_WRITE (sc, csr_gp, sc->lmc_gpio);
-      sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
-      if(old != ie)
-        printk (LMC_PRINTF_FMT ": clock internal\n", LMC_PRINTF_ARGS);
-    }
+	int old;
+	old = ie;
+	if (ie == LMC_CTL_CLOCK_SOURCE_EXT) {
+		sc->lmc_gpio &= ~(LMC_GEP_SSI_TXCLOCK);
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_EXT;
+		if (old != ie)
+			printk(LMC_PRINTF_FMT ": clock external\n",
+			       LMC_PRINTF_ARGS);
+	} else {
+		sc->lmc_gpio |= LMC_GEP_SSI_TXCLOCK;
+		LMC_CSR_WRITE(sc, csr_gp, sc->lmc_gpio);
+		sc->ictl.clock_source = LMC_CTL_CLOCK_SOURCE_INT;
+		if (old != ie)
+			printk(LMC_PRINTF_FMT ": clock internal\n",
+			       LMC_PRINTF_ARGS);
+	}
 }
 
-static void
-lmc_t1_watchdog (lmc_softc_t * const sc)
+static void lmc_t1_watchdog(lmc_softc_t * const sc)
 {
 }
 
-static void
-lmc_set_protocol (lmc_softc_t * const sc, lmc_ctl_t * ctl)
+static void lmc_set_protocol(lmc_softc_t * const sc, lmc_ctl_t * ctl)
 {
 	if (!ctl)
 		sc->ictl.keepalive_onoff = LMC_CTL_ON;
diff --git a/drivers/net/wan/lmc/lmc_proto.c b/drivers/net/wan/lmc/lmc_proto.c
index f600075..ac1fef5 100644
--- a/drivers/net/wan/lmc/lmc_proto.c
+++ b/drivers/net/wan/lmc/lmc_proto.c
@@ -1,23 +1,23 @@
- /*
-  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
-  * All rights reserved.  www.lanmedia.com
-  *
-  * This code is written by:
-  * Andrew Stanley-Jones (asj@cban.com)
-  * Rob Braun (bbraun@vix.com),
-  * Michael Graff (explorer@vix.com) and
-  * Matt Thomas (matt@3am-software.com).
-  *
-  * With Help By:
-  * David Boggs
-  * Ron Crane
-  * Allan Cox
-  *
-  * This software may be used and distributed according to the terms
-  * of the GNU General Public License version 2, incorporated herein by reference.
-  *
-  * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
-  */
+/*
+ * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
+ * All rights reserved.  www.lanmedia.com
+ *
+ * This code is written by:
+ * Andrew Stanley-Jones (asj@cban.com)
+ * Rob Braun (bbraun@vix.com),
+ * Michael Graff (explorer@vix.com) and
+ * Matt Thomas (matt@3am-software.com).
+ *
+ * With Help By:
+ * David Boggs
+ * Ron Crane
+ * Allan Cox
+ *
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License version 2, incorporated herein by reference.
+ *
+ * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
+ */
 
 #include <linux/kernel.h>
 #include <linux/string.h>
@@ -35,8 +35,8 @@
 #include <linux/workqueue.h>
 #include <linux/proc_fs.h>
 #include <linux/bitops.h>
-#include <asm/processor.h>             /* Processor type for cache alignment. */
-#include <asm/io.h>
+#include <linux/io.h>
+#include <asm/processor.h>   /* Processor type for cache alignment. */
 #include <asm/dma.h>
 #include <linux/smp.h>
 
@@ -46,20 +46,17 @@
 #include "lmc_ioctl.h"
 #include "lmc_proto.h"
 
-// attach
-void lmc_proto_attach(lmc_softc_t *sc) /*FOLD00*/
+void lmc_proto_attach(lmc_softc_t *sc)
 {
-    lmc_trace(sc->lmc_device, "lmc_proto_attach in");
-    if (sc->if_type == LMC_NET) {
-            struct net_device *dev = sc->lmc_device;
-            /*
-	     * They set a few basics because they don't use HDLC
-             */
-            dev->flags |= IFF_POINTOPOINT;
-            dev->hard_header_len = 0;
-            dev->addr_len = 0;
-        }
-    lmc_trace(sc->lmc_device, "lmc_proto_attach out");
+	lmc_trace(sc->lmc_device, "lmc_proto_attach in");
+	if (sc->if_type == LMC_NET) {
+		struct net_device *dev = sc->lmc_device;
+		/* They set a few basics because they don't use HDLC */
+		dev->flags |= IFF_POINTOPOINT;
+		dev->hard_header_len = 0;
+		dev->addr_len = 0;
+	}
+	lmc_trace(sc->lmc_device, "lmc_proto_attach out");
 }
 
 int lmc_proto_ioctl(lmc_softc_t *sc, struct ifreq *ifr, int cmd)
@@ -97,39 +94,41 @@ void lmc_proto_close(lmc_softc_t *sc)
 	lmc_trace(sc->lmc_device, "lmc_proto_close out");
 }
 
-__be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/
+__be16 lmc_proto_type(lmc_softc_t *sc, struct sk_buff *skb)
 {
-    lmc_trace(sc->lmc_device, "lmc_proto_type in");
-    switch(sc->if_type){
-    case LMC_PPP:
-	    return hdlc_type_trans(skb, sc->lmc_device);
-	    break;
-    case LMC_NET:
-        return htons(ETH_P_802_2);
-        break;
-    case LMC_RAW: /* Packet type for skbuff kind of useless */
-        return htons(ETH_P_802_2);
-        break;
-    default:
-        printk(KERN_WARNING "%s: No protocol set for this interface, assuming 802.2 (which is wrong!!)\n", sc->name);
-        return htons(ETH_P_802_2);
-        break;
-    }
-    lmc_trace(sc->lmc_device, "lmc_proto_tye out");
+	lmc_trace(sc->lmc_device, "lmc_proto_type in");
+	switch (sc->if_type) {
+	case LMC_PPP:
+		return hdlc_type_trans(skb, sc->lmc_device);
+		break;
+	case LMC_NET:
+		return htons(ETH_P_802_2);
+		break;
+	case LMC_RAW: /* Packet type for skbuff kind of useless */
+		return htons(ETH_P_802_2);
+		break;
+	default:
+		printk(KERN_WARNING
+		       "%s: No protocol set for this interface, assuming 802.2 (which is wrong!!)\n",
+		       sc->name);
+		return htons(ETH_P_802_2);
+		break;
+	}
+	lmc_trace(sc->lmc_device, "lmc_proto_tye out");
 
 }
 
-void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb) /*FOLD00*/
+void lmc_proto_netif(lmc_softc_t *sc, struct sk_buff *skb)
 {
-    lmc_trace(sc->lmc_device, "lmc_proto_netif in");
-    switch(sc->if_type){
-    case LMC_PPP:
-    case LMC_NET:
-    default:
-        netif_rx(skb);
-        break;
-    case LMC_RAW:
-        break;
-    }
-    lmc_trace(sc->lmc_device, "lmc_proto_netif out");
+	lmc_trace(sc->lmc_device, "lmc_proto_netif in");
+	switch (sc->if_type) {
+	case LMC_PPP:
+	case LMC_NET:
+	default:
+		netif_rx(skb);
+		break;
+	case LMC_RAW:
+		break;
+	}
+	lmc_trace(sc->lmc_device, "lmc_proto_netif out");
 }
diff --git a/drivers/net/wan/lmc/lmc_var.h b/drivers/net/wan/lmc/lmc_var.h
index 65d0197..9b14979 100644
--- a/drivers/net/wan/lmc/lmc_var.h
+++ b/drivers/net/wan/lmc/lmc_var.h
@@ -1,197 +1,184 @@
 #ifndef _LMC_VAR_H_
 #define _LMC_VAR_H_
 
- /*
-  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
-  * All rights reserved.  www.lanmedia.com
-  *
-  * This code is written by:
-  * Andrew Stanley-Jones (asj@cban.com)
-  * Rob Braun (bbraun@vix.com),
-  * Michael Graff (explorer@vix.com) and
-  * Matt Thomas (matt@3am-software.com).
-  *
-  * This software may be used and distributed according to the terms
-  * of the GNU General Public License version 2, incorporated herein by reference.
-  */
+/*
+ * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
+ * All rights reserved.  www.lanmedia.com
+ *
+ * This code is written by:
+ * Andrew Stanley-Jones (asj@cban.com)
+ * Rob Braun (bbraun@vix.com),
+ * Michael Graff (explorer@vix.com) and
+ * Matt Thomas (matt@3am-software.com).
+ *
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License version 2, incorporated herein by reference.
+ */
 
 #include <linux/timer.h>
 
-/*
- * basic definitions used in lmc include files
- */
+/* basic definitions used in lmc include files */
 
-typedef struct lmc___softc lmc_softc_t;
-typedef struct lmc___media lmc_media_t;
-typedef struct lmc___ctl lmc_ctl_t;
+typedef struct lmc___softc	lmc_softc_t;
+typedef struct lmc___media	lmc_media_t;
+typedef struct lmc___ctl	lmc_ctl_t;
 
-#define lmc_csrptr_t    unsigned long
+#define lmc_csrptr_t		unsigned long
 
-#define LMC_REG_RANGE 0x80
+#define LMC_REG_RANGE		0x80
 
-#define LMC_PRINTF_FMT  "%s"
-#define LMC_PRINTF_ARGS	(sc->lmc_device->name)
+#define LMC_PRINTF_FMT		"%s"
+#define LMC_PRINTF_ARGS		(sc->lmc_device->name)
 
-#define TX_TIMEOUT (2*HZ)
+#define TX_TIMEOUT		(2*HZ)
 
-#define LMC_TXDESCS            32
-#define LMC_RXDESCS            32
+#define LMC_TXDESCS		32
+#define LMC_RXDESCS		32
 
-#define LMC_LINK_UP            1
-#define LMC_LINK_DOWN          0
+#define LMC_LINK_UP		1
+#define LMC_LINK_DOWN		0
 
 /* These macros for generic read and write to and from the dec chip */
-#define LMC_CSR_READ(sc, csr) \
-	inl((sc)->lmc_csrs.csr)
-#define LMC_CSR_WRITE(sc, reg, val) \
-	outl((val), (sc)->lmc_csrs.reg)
-
-//#ifdef _LINUX_DELAY_H
-//	#define SLOW_DOWN_IO udelay(2);
-//	#undef __SLOW_DOWN_IO
-//	#define __SLOW_DOWN_IO udelay(2);
-//#endif
+#define LMC_CSR_READ(sc, csr)		inl((sc)->lmc_csrs.csr)
+#define LMC_CSR_WRITE(sc, reg, val)	outl((val), (sc)->lmc_csrs.reg)
 
-#define DELAY(n) SLOW_DOWN_IO
+#define DELAY(n)		SLOW_DOWN_IO
 
-#define lmc_delay() inl(sc->lmc_csrs.csr_9)
+#define lmc_delay()		inl(sc->lmc_csrs.csr_9)
 
 /* This macro sync's up with the mii so that reads and writes can take place */
-#define LMC_MII_SYNC(sc) do {int n=32; while( n >= 0 ) { \
-                LMC_CSR_WRITE((sc), csr_9, 0x20000); \
-		lmc_delay(); \
-		LMC_CSR_WRITE((sc), csr_9, 0x30000); \
-                lmc_delay(); \
-		n--; }} while(0)
+#define LMC_MII_SYNC(sc)					\
+	do {							\
+		int n = 32;					\
+		while (n >= 0) {				\
+			LMC_CSR_WRITE((sc), csr_9, 0x20000);	\
+			lmc_delay();				\
+			LMC_CSR_WRITE((sc), csr_9, 0x30000);	\
+			lmc_delay();				\
+			n--;					\
+		}						\
+	} while (0)
 
 struct lmc_regfile_t {
-    lmc_csrptr_t csr_busmode;                  /* CSR0 */
-    lmc_csrptr_t csr_txpoll;                   /* CSR1 */
-    lmc_csrptr_t csr_rxpoll;                   /* CSR2 */
-    lmc_csrptr_t csr_rxlist;                   /* CSR3 */
-    lmc_csrptr_t csr_txlist;                   /* CSR4 */
-    lmc_csrptr_t csr_status;                   /* CSR5 */
-    lmc_csrptr_t csr_command;                  /* CSR6 */
-    lmc_csrptr_t csr_intr;                     /* CSR7 */
-    lmc_csrptr_t csr_missed_frames;            /* CSR8 */
-    lmc_csrptr_t csr_9;                        /* CSR9 */
-    lmc_csrptr_t csr_10;                       /* CSR10 */
-    lmc_csrptr_t csr_11;                       /* CSR11 */
-    lmc_csrptr_t csr_12;                       /* CSR12 */
-    lmc_csrptr_t csr_13;                       /* CSR13 */
-    lmc_csrptr_t csr_14;                       /* CSR14 */
-    lmc_csrptr_t csr_15;                       /* CSR15 */
+	lmc_csrptr_t csr_busmode;	/* CSR0 */
+	lmc_csrptr_t csr_txpoll;	/* CSR1 */
+	lmc_csrptr_t csr_rxpoll;	/* CSR2 */
+	lmc_csrptr_t csr_rxlist;	/* CSR3 */
+	lmc_csrptr_t csr_txlist;	/* CSR4 */
+	lmc_csrptr_t csr_status;	/* CSR5 */
+	lmc_csrptr_t csr_command;	/* CSR6 */
+	lmc_csrptr_t csr_intr;		/* CSR7 */
+	lmc_csrptr_t csr_missed_frames;	/* CSR8 */
+	lmc_csrptr_t csr_9;		/* CSR9 */
+	lmc_csrptr_t csr_10;		/* CSR10 */
+	lmc_csrptr_t csr_11;		/* CSR11 */
+	lmc_csrptr_t csr_12;		/* CSR12 */
+	lmc_csrptr_t csr_13;		/* CSR13 */
+	lmc_csrptr_t csr_14;		/* CSR14 */
+	lmc_csrptr_t csr_15;		/* CSR15 */
 };
 
-#define csr_enetrom             csr_9   /* 21040 */
-#define csr_reserved            csr_10  /* 21040 */
-#define csr_full_duplex         csr_11  /* 21040 */
-#define csr_bootrom             csr_10  /* 21041/21140A/?? */
-#define csr_gp                  csr_12  /* 21140* */
-#define csr_watchdog            csr_15  /* 21140* */
-#define csr_gp_timer            csr_11  /* 21041/21140* */
-#define csr_srom_mii            csr_9   /* 21041/21140* */
-#define csr_sia_status          csr_12  /* 2104x */
-#define csr_sia_connectivity    csr_13  /* 2104x */
-#define csr_sia_tx_rx           csr_14  /* 2104x */
-#define csr_sia_general         csr_15  /* 2104x */
-
-/* tulip length/control transmit descriptor definitions
- *  used to define bits in the second tulip_desc_t field (length)
- *  for the transmit descriptor -baz */
-
-#define LMC_TDES_FIRST_BUFFER_SIZE       ((u32)(0x000007FF))
-#define LMC_TDES_SECOND_BUFFER_SIZE      ((u32)(0x003FF800))
-#define LMC_TDES_HASH_FILTERING          ((u32)(0x00400000))
-#define LMC_TDES_DISABLE_PADDING         ((u32)(0x00800000))
-#define LMC_TDES_SECOND_ADDR_CHAINED     ((u32)(0x01000000))
-#define LMC_TDES_END_OF_RING             ((u32)(0x02000000))
-#define LMC_TDES_ADD_CRC_DISABLE         ((u32)(0x04000000))
-#define LMC_TDES_SETUP_PACKET            ((u32)(0x08000000))
-#define LMC_TDES_INVERSE_FILTERING       ((u32)(0x10000000))
-#define LMC_TDES_FIRST_SEGMENT           ((u32)(0x20000000))
-#define LMC_TDES_LAST_SEGMENT            ((u32)(0x40000000))
+#define csr_enetrom		csr_9	/* 21040 */
+#define csr_reserved		csr_10	/* 21040 */
+#define csr_full_duplex		csr_11	/* 21040 */
+#define csr_bootrom		csr_10	/* 21041/21140A/?? */
+#define csr_gp			csr_12	/* 21140* */
+#define csr_watchdog		csr_15	/* 21140* */
+#define csr_gp_timer		csr_11	/* 21041/21140* */
+#define csr_srom_mii		csr_9	/* 21041/21140* */
+#define csr_sia_status		csr_12	/* 2104x */
+#define csr_sia_connectivity	csr_13	/* 2104x */
+#define csr_sia_tx_rx		csr_14	/* 2104x */
+#define csr_sia_general		csr_15	/* 2104x */
+
+/* tulip length/control transmit descriptor definitions used to define bits
+   in the second tulip_desc_t field (length) for the transmit descriptor */
+
+#define LMC_TDES_FIRST_BUFFER_SIZE	((u32)(0x000007FF))
+#define LMC_TDES_SECOND_BUFFER_SIZE	((u32)(0x003FF800))
+#define LMC_TDES_HASH_FILTERING		((u32)(0x00400000))
+#define LMC_TDES_DISABLE_PADDING	((u32)(0x00800000))
+#define LMC_TDES_SECOND_ADDR_CHAINED	((u32)(0x01000000))
+#define LMC_TDES_END_OF_RING		((u32)(0x02000000))
+#define LMC_TDES_ADD_CRC_DISABLE	((u32)(0x04000000))
+#define LMC_TDES_SETUP_PACKET		((u32)(0x08000000))
+#define LMC_TDES_INVERSE_FILTERING	((u32)(0x10000000))
+#define LMC_TDES_FIRST_SEGMENT		((u32)(0x20000000))
+#define LMC_TDES_LAST_SEGMENT		((u32)(0x40000000))
 #define LMC_TDES_INTERRUPT_ON_COMPLETION ((u32)(0x80000000))
 
-#define TDES_SECOND_BUFFER_SIZE_BIT_NUMBER  11
-#define TDES_COLLISION_COUNT_BIT_NUMBER     3
+#define TDES_SECOND_BUFFER_SIZE_BIT_NUMBER	11
+#define TDES_COLLISION_COUNT_BIT_NUMBER		3
 
 /* Constants for the RCV descriptor RDES */
 
-#define LMC_RDES_OVERFLOW             ((u32)(0x00000001))
-#define LMC_RDES_CRC_ERROR            ((u32)(0x00000002))
-#define LMC_RDES_DRIBBLING_BIT        ((u32)(0x00000004))
-#define LMC_RDES_REPORT_ON_MII_ERR    ((u32)(0x00000008))
-#define LMC_RDES_RCV_WATCHDOG_TIMEOUT ((u32)(0x00000010))
-#define LMC_RDES_FRAME_TYPE           ((u32)(0x00000020))
-#define LMC_RDES_COLLISION_SEEN       ((u32)(0x00000040))
-#define LMC_RDES_FRAME_TOO_LONG       ((u32)(0x00000080))
-#define LMC_RDES_LAST_DESCRIPTOR      ((u32)(0x00000100))
-#define LMC_RDES_FIRST_DESCRIPTOR     ((u32)(0x00000200))
-#define LMC_RDES_MULTICAST_FRAME      ((u32)(0x00000400))
-#define LMC_RDES_RUNT_FRAME           ((u32)(0x00000800))
-#define LMC_RDES_DATA_TYPE            ((u32)(0x00003000))
-#define LMC_RDES_LENGTH_ERROR         ((u32)(0x00004000))
-#define LMC_RDES_ERROR_SUMMARY        ((u32)(0x00008000))
-#define LMC_RDES_FRAME_LENGTH         ((u32)(0x3FFF0000))
-#define LMC_RDES_OWN_BIT              ((u32)(0x80000000))
-
-#define RDES_FRAME_LENGTH_BIT_NUMBER       16
-
-#define LMC_RDES_ERROR_MASK ( (u32)( \
-	  LMC_RDES_OVERFLOW \
-	| LMC_RDES_DRIBBLING_BIT \
-	| LMC_RDES_REPORT_ON_MII_ERR \
-        | LMC_RDES_COLLISION_SEEN ) )
-
-
-/*
- * Ioctl info
- */
+#define LMC_RDES_OVERFLOW		((u32)(0x00000001))
+#define LMC_RDES_CRC_ERROR		((u32)(0x00000002))
+#define LMC_RDES_DRIBBLING_BIT		((u32)(0x00000004))
+#define LMC_RDES_REPORT_ON_MII_ERR	((u32)(0x00000008))
+#define LMC_RDES_RCV_WATCHDOG_TIMEOUT	((u32)(0x00000010))
+#define LMC_RDES_FRAME_TYPE		((u32)(0x00000020))
+#define LMC_RDES_COLLISION_SEEN		((u32)(0x00000040))
+#define LMC_RDES_FRAME_TOO_LONG		((u32)(0x00000080))
+#define LMC_RDES_LAST_DESCRIPTOR	((u32)(0x00000100))
+#define LMC_RDES_FIRST_DESCRIPTOR	((u32)(0x00000200))
+#define LMC_RDES_MULTICAST_FRAME	((u32)(0x00000400))
+#define LMC_RDES_RUNT_FRAME		((u32)(0x00000800))
+#define LMC_RDES_DATA_TYPE		((u32)(0x00003000))
+#define LMC_RDES_LENGTH_ERROR		((u32)(0x00004000))
+#define LMC_RDES_ERROR_SUMMARY		((u32)(0x00008000))
+#define LMC_RDES_FRAME_LENGTH		((u32)(0x3FFF0000))
+#define LMC_RDES_OWN_BIT		((u32)(0x80000000))
+
+#define RDES_FRAME_LENGTH_BIT_NUMBER	16
+
+#define LMC_RDES_ERROR_MASK ((u32)(LMC_RDES_OVERFLOW |		 \
+				   LMC_RDES_DRIBBLING_BIT |	 \
+				   LMC_RDES_REPORT_ON_MII_ERR |	 \
+				   LMC_RDES_COLLISION_SEEN))
+
+/* Ioctl info */
 
 typedef struct {
-	u32	n;
-	u32	m;
-	u32	v;
-	u32	x;
-	u32	r;
-	u32	f;
-	u32	exact;
+	u32 n;
+	u32 m;
+	u32 v;
+	u32 x;
+	u32 r;
+	u32 f;
+	u32 exact;
 } lmc_av9110_t;
 
-/*
- * Common structure passed to the ioctl code.
- */
+/* Common structure passed to the ioctl code. */
 struct lmc___ctl {
-	u32	cardtype;
-	u32	clock_source;		/* HSSI, T1 */
-	u32	clock_rate;		/* T1 */
-	u32	crc_length;
-	u32	cable_length;		/* DS3 */
-	u32	scrambler_onoff;	/* DS3 */
-	u32	cable_type;		/* T1 */
-	u32	keepalive_onoff;	/* protocol */
-	u32	ticks;			/* ticks/sec */
+	u32 cardtype;
+	u32 clock_source;		/* HSSI, T1 */
+	u32 clock_rate;			/* T1 */
+	u32 crc_length;
+	u32 cable_length;		/* DS3 */
+	u32 scrambler_onoff;		/* DS3 */
+	u32 cable_type;			/* T1 */
+	u32 keepalive_onoff;		/* protocol */
+	u32 ticks;			/* ticks/sec */
 	union {
-		lmc_av9110_t	ssi;
+		lmc_av9110_t ssi;
 	} cardspec;
-	u32       circuit_type;   /* T1 or E1 */
+	u32	circuit_type;		/* T1 or E1 */
 };
 
 
 /*
- * Carefull, look at the data sheet, there's more to this
- * structure than meets the eye.  It should probably be:
- *
- * struct tulip_desc_t {
- *         u8  own:1;
- *         u32 status:31;
- *         u32 control:10;
- *         u32 buffer1;
- *         u32 buffer2;
- * };
- * You could also expand status control to provide more bit information
- */
+  Carefull, look at the data sheet, there's more to this structure than meets
+  the eye.  It should probably be:
+
+  struct tulip_desc_t {
+	u8 own:1;
+	u32 status:31;
+	u32 control:10;
+	u32 buffer1;
+	u32 buffer2;
+  };
+  You could also expand status control to provide more bit information */
 
 struct tulip_desc_t {
 	s32 status;
@@ -200,271 +187,254 @@ struct tulip_desc_t {
 	u32 buffer2;
 };
 
-/*
- * media independent methods to check on media status, link, light LEDs,
- * etc.
- */
+/* media independent methods to check on media status, link, light LEDs, etc. */
 struct lmc___media {
-	void	(* init)(lmc_softc_t * const);
-	void	(* defaults)(lmc_softc_t * const);
-	void	(* set_status)(lmc_softc_t * const, lmc_ctl_t *);
-	void	(* set_clock_source)(lmc_softc_t * const, int);
-	void	(* set_speed)(lmc_softc_t * const, lmc_ctl_t *);
-	void	(* set_cable_length)(lmc_softc_t * const, int);
-	void	(* set_scrambler)(lmc_softc_t * const, int);
-	int	(* get_link_status)(lmc_softc_t * const);
-	void	(* set_link_status)(lmc_softc_t * const, int);
-	void	(* set_crc_length)(lmc_softc_t * const, int);
-        void    (* set_circuit_type)(lmc_softc_t * const, int);
-        void	(* watchdog)(lmc_softc_t * const);
+	void (* init)(lmc_softc_t * const);
+	void (* defaults)(lmc_softc_t * const);
+	void (* set_status)(lmc_softc_t * const, lmc_ctl_t *);
+	void (* set_clock_source)(lmc_softc_t * const, int);
+	void (* set_speed)(lmc_softc_t * const, lmc_ctl_t *);
+	void (* set_cable_length)(lmc_softc_t * const, int);
+	void (* set_scrambler)(lmc_softc_t * const, int);
+	int (* get_link_status)(lmc_softc_t * const);
+	void (* set_link_status)(lmc_softc_t * const, int);
+	void (* set_crc_length)(lmc_softc_t * const, int);
+	void (* set_circuit_type)(lmc_softc_t * const, int);
+	void (* watchdog)(lmc_softc_t * const);
 };
 
-
-#define STATCHECK     0xBEEFCAFE
-
-struct lmc_extra_statistics
-{
-	u32       version_size;
-	u32       lmc_cardtype;
-
-	u32       tx_ProcTimeout;
-	u32       tx_IntTimeout;
-	u32       tx_NoCompleteCnt;
-	u32       tx_MaxXmtsB4Int;
-	u32       tx_TimeoutCnt;
-	u32       tx_OutOfSyncPtr;
-	u32       tx_tbusy0;
-	u32       tx_tbusy1;
-	u32       tx_tbusy_calls;
-	u32       resetCount;
-	u32       lmc_txfull;
-	u32       tbusy;
-	u32       dirtyTx;
-	u32       lmc_next_tx;
-	u32       otherTypeCnt;
-	u32       lastType;
-	u32       lastTypeOK;
-	u32       txLoopCnt;
-	u32       usedXmtDescripCnt;
-	u32       txIndexCnt;
-	u32       rxIntLoopCnt;
-
-	u32       rx_SmallPktCnt;
-	u32       rx_BadPktSurgeCnt;
-	u32       rx_BuffAllocErr;
-	u32       tx_lossOfClockCnt;
+#define STATCHECK 0xBEEFCAFE
+
+struct lmc_extra_statistics {
+	u32 version_size;
+	u32 lmc_cardtype;
+
+	u32 tx_ProcTimeout;
+	u32 tx_IntTimeout;
+	u32 tx_NoCompleteCnt;
+	u32 tx_MaxXmtsB4Int;
+	u32 tx_TimeoutCnt;
+	u32 tx_OutOfSyncPtr;
+	u32 tx_tbusy0;
+	u32 tx_tbusy1;
+	u32 tx_tbusy_calls;
+	u32 resetCount;
+	u32 lmc_txfull;
+	u32 tbusy;
+	u32 dirtyTx;
+	u32 lmc_next_tx;
+	u32 otherTypeCnt;
+	u32 lastType;
+	u32 lastTypeOK;
+	u32 txLoopCnt;
+	u32 usedXmtDescripCnt;
+	u32 txIndexCnt;
+	u32 rxIntLoopCnt;
+
+	u32 rx_SmallPktCnt;
+	u32 rx_BadPktSurgeCnt;
+	u32 rx_BuffAllocErr;
+	u32 tx_lossOfClockCnt;
 
 	/* T1 error counters */
-	u32       framingBitErrorCount;
-	u32       lineCodeViolationCount;
+	u32 framingBitErrorCount;
+	u32 lineCodeViolationCount;
 
-	u32       lossOfFrameCount;
-	u32       changeOfFrameAlignmentCount;
-	u32       severelyErroredFrameCount;
+	u32 lossOfFrameCount;
+	u32 changeOfFrameAlignmentCount;
+	u32 severelyErroredFrameCount;
 
-	u32       check;
+	u32 check;
 };
 
 typedef struct lmc_xinfo {
-	u32       Magic0;                         /* BEEFCAFE */
+	u32 Magic0;		/* BEEFCAFE */
 
-	u32       PciCardType;
-	u32       PciSlotNumber;          /* PCI slot number       */
+	u32 PciCardType;
+	u32 PciSlotNumber;	/* PCI slot number	*/
 
-	u16	       DriverMajorVersion;
-	u16	       DriverMinorVersion;
-	u16	       DriverSubVersion;
+	u16 DriverMajorVersion;
+	u16 DriverMinorVersion;
+	u16 DriverSubVersion;
 
-	u16	       XilinxRevisionNumber;
-	u16	       MaxFrameSize;
+	u16 XilinxRevisionNumber;
+	u16 MaxFrameSize;
 
-	u16     	  t1_alarm1_status;
-	u16       	t1_alarm2_status;
+	u16 t1_alarm1_status;
+	u16 t1_alarm2_status;
 
-	int             link_status;
-	u32       mii_reg16;
+	int link_status;
+	u32 mii_reg16;
 
-	u32       Magic1;                         /* DEADBEEF */
+	u32 Magic1;		/* DEADBEEF */
 } LMC_XINFO;
 
 
-/*
- * forward decl
- */
+/* forward decl */
 struct lmc___softc {
-	char                   *name;
-	u8			board_idx;
+	char *name;
+	u8 board_idx;
 	struct lmc_extra_statistics extra_stats;
-	struct net_device      *lmc_device;
-
-	int                     hang, rxdesc, bad_packet, some_counter;
-	u32  	         	txgo;
-	struct lmc_regfile_t	lmc_csrs;
-	volatile u32		lmc_txtick;
-	volatile u32		lmc_rxtick;
-	u32			lmc_flags;
-	u32			lmc_intrmask;	/* our copy of csr_intr */
-	u32			lmc_cmdmode;	/* our copy of csr_cmdmode */
-	u32			lmc_busmode;	/* our copy of csr_busmode */
-	u32			lmc_gpio_io;	/* state of in/out settings */
-	u32			lmc_gpio;	/* state of outputs */
-	struct sk_buff*		lmc_txq[LMC_TXDESCS];
-	struct sk_buff*		lmc_rxq[LMC_RXDESCS];
-	volatile
-	struct tulip_desc_t	lmc_rxring[LMC_RXDESCS];
-	volatile
-	struct tulip_desc_t	lmc_txring[LMC_TXDESCS];
-	unsigned int		lmc_next_rx, lmc_next_tx;
-	volatile
-	unsigned int		lmc_taint_tx, lmc_taint_rx;
-	int			lmc_tx_start, lmc_txfull;
-	int			lmc_txbusy;
-	u16			lmc_miireg16;
-	int			lmc_ok;
-	int			last_link_status;
-	int			lmc_cardtype;
-	u32               	last_frameerr;
-	lmc_media_t	       *lmc_media;
-	struct timer_list	timer;
-	lmc_ctl_t		ictl;
-	u32			TxDescriptControlInit;
-
-	int                     tx_TimeoutInd; /* additional driver state */
-	int                     tx_TimeoutDisplay;
-	unsigned int		lastlmc_taint_tx;
-	int                     lasttx_packets;
-	u32			tx_clockState;
-	u32			lmc_crcSize;
-	LMC_XINFO		lmc_xinfo;
-	char                    lmc_yel, lmc_blue, lmc_red; /* for T1 and DS3 */
-	char                    lmc_timing; /* for HSSI and SSI */
-	int                     got_irq;
-
-	char                    last_led_err[4];
-
-	u32                     last_int;
-	u32                     num_int;
-
-	spinlock_t              lmc_lock;
-	u16			if_type;       /* HDLC/PPP or NET */
-
-	/* Failure cases */
-	u8			failed_ring;
-	u8			failed_recv_alloc;
-
-	/* Structure check */
-	u32                     check;
+	struct net_device *lmc_device;
+
+	int hang, rxdesc, bad_packet, some_counter;
+	u32 txgo;
+	struct lmc_regfile_t lmc_csrs;
+	volatile u32 lmc_txtick;
+	volatile u32 lmc_rxtick;
+	u32 lmc_flags;
+	u32 lmc_intrmask;	/* our copy of csr_intr */
+	u32 lmc_cmdmode;	/* our copy of csr_cmdmode */
+	u32 lmc_busmode;	/* our copy of csr_busmode */
+	u32 lmc_gpio_io;	/* state of in/out settings */
+	u32 lmc_gpio;		/* state of outputs */
+	struct sk_buff *lmc_txq[LMC_TXDESCS];
+	struct sk_buff *lmc_rxq[LMC_RXDESCS];
+	volatile struct tulip_desc_t lmc_rxring[LMC_RXDESCS];
+	volatile struct tulip_desc_t lmc_txring[LMC_TXDESCS];
+	unsigned int lmc_next_rx, lmc_next_tx;
+	volatile unsigned int lmc_taint_tx, lmc_taint_rx;
+	int lmc_tx_start, lmc_txfull;
+	int lmc_txbusy;
+	u16 lmc_miireg16;
+	int lmc_ok;
+	int last_link_status;
+	int lmc_cardtype;
+	u32 last_frameerr;
+	lmc_media_t *lmc_media;
+	struct timer_list timer;
+	lmc_ctl_t ictl;
+	u32 TxDescriptControlInit;
+
+	int tx_TimeoutInd;		/* additional driver state */
+	int tx_TimeoutDisplay;
+	unsigned int lastlmc_taint_tx;
+	int lasttx_packets;
+	u32 tx_clockState;
+	u32 lmc_crcSize;
+	LMC_XINFO lmc_xinfo;
+	char lmc_yel, lmc_blue, lmc_red; /* for T1 and DS3 */
+	char lmc_timing;		/* for HSSI and SSI */
+	int got_irq;
+
+	char last_led_err[4];
+
+	u32 last_int;
+	u32 num_int;
+
+	spinlock_t lmc_lock;
+	u16 if_type;			/* HDLC/PPP or NET */
+
+	u8 failed_ring;			/* Failure cases */
+	u8 failed_recv_alloc;
+
+
+	u32 check;			/* Structure check */
 };
 
-#define LMC_PCI_TIME 1
-#define LMC_EXT_TIME 0
+#define LMC_PCI_TIME		1
+#define LMC_EXT_TIME		0
 
-#define PKT_BUF_SZ              1542  /* was 1536 */
+#define PKT_BUF_SZ		1542
 
 /* CSR5 settings */
-#define TIMER_INT     0x00000800
-#define TP_LINK_FAIL  0x00001000
-#define TP_LINK_PASS  0x00000010
-#define NORMAL_INT    0x00010000
-#define ABNORMAL_INT  0x00008000
-#define RX_JABBER_INT 0x00000200
-#define RX_DIED       0x00000100
-#define RX_NOBUFF     0x00000080
-#define RX_INT        0x00000040
-#define TX_FIFO_UNDER 0x00000020
-#define TX_JABBER     0x00000008
-#define TX_NOBUFF     0x00000004
-#define TX_DIED       0x00000002
-#define TX_INT        0x00000001
+#define TIMER_INT		0x00000800
+#define TP_LINK_FAIL		0x00001000
+#define TP_LINK_PASS		0x00000010
+#define NORMAL_INT		0x00010000
+#define ABNORMAL_INT		0x00008000
+#define RX_JABBER_INT		0x00000200
+#define RX_DIED			0x00000100
+#define RX_NOBUFF		0x00000080
+#define RX_INT			0x00000040
+#define TX_FIFO_UNDER		0x00000020
+#define TX_JABBER		0x00000008
+#define TX_NOBUFF		0x00000004
+#define TX_DIED			0x00000002
+#define TX_INT			0x00000001
 
 /* CSR6 settings */
-#define OPERATION_MODE  0x00000200 /* Full Duplex      */
-#define PROMISC_MODE    0x00000040 /* Promiscuous Mode */
-#define RECIEVE_ALL     0x40000000 /* Recieve All      */
-#define PASS_BAD_FRAMES 0x00000008 /* Pass Bad Frames  */
+#define OPERATION_MODE		0x00000200 /* Full Duplex */
+#define PROMISC_MODE		0x00000040 /* Promiscuous Mode */
+#define RECIEVE_ALL		0x40000000 /* Recieve All */
+#define PASS_BAD_FRAMES		0x00000008 /* Pass Bad Frames */
 
-/* Dec control registers  CSR6 as well */
-#define LMC_DEC_ST 0x00002000
-#define LMC_DEC_SR 0x00000002
+/* Dec control registers. CSR6 as well */
+#define LMC_DEC_ST		0x00002000
+#define LMC_DEC_SR		0x00000002
 
 /* CSR15 settings */
-#define RECV_WATCHDOG_DISABLE 0x00000010
-#define JABBER_DISABLE        0x00000001
+#define RECV_WATCHDOG_DISABLE	0x00000010
+#define JABBER_DISABLE		0x00000001
 
 /* More settings */
-/*
- * aSR6 -- Command (Operation Mode) Register
- */
-#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_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 */
-#define TULIP_CMD_OPERMODE      0x00000C00L /* (RW)  Operating Mode */
-#define TULIP_CMD_PROMISCUOUS   0x00000041L /* (RW)  Promiscuous Mode */
-#define TULIP_CMD_PASSBADPKT    0x00000008L /* (RW)  Pass Bad Frames */
-#define TULIP_CMD_THRESHOLDCTL  0x0000C000L /* (RW)  Threshold Control */
-
-#define TULIP_GP_PINSET         0x00000100L
-#define TULIP_BUSMODE_SWRESET   0x00000001L
+/* aSR6 -- Command (Operation Mode) Register */
+#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_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 */
+#define TULIP_CMD_OPERMODE	0x00000C00L /* (RW) Operating Mode */
+#define TULIP_CMD_PROMISCUOUS	0x00000041L /* (RW) Promiscuous Mode */
+#define TULIP_CMD_PASSBADPKT	0x00000008L /* (RW) Pass Bad Frames */
+#define TULIP_CMD_THRESHOLDCTL	0x0000C000L /* (RW) Threshold Control */
+
+#define TULIP_GP_PINSET		0x00000100L
+#define TULIP_BUSMODE_SWRESET	0x00000001L
 #define TULIP_WATCHDOG_TXDISABLE 0x00000001L
 #define TULIP_WATCHDOG_RXDISABLE 0x00000010L
 
-#define TULIP_STS_NORMALINTR    0x00010000L /* (RW)  Normal Interrupt */
-#define TULIP_STS_ABNRMLINTR    0x00008000L /* (RW)  Abnormal Interrupt */
-#define TULIP_STS_ERI           0x00004000L /* (RW)  Early Receive Interrupt */
-#define TULIP_STS_SYSERROR      0x00002000L /* (RW)  System Error */
-#define TULIP_STS_GTE           0x00000800L /* (RW)  General Pupose Timer Exp */
-#define TULIP_STS_ETI           0x00000400L /* (RW)  Early Transmit Interrupt */
-#define TULIP_STS_RXWT          0x00000200L /* (RW)  Receiver Watchdog Timeout */
-#define TULIP_STS_RXSTOPPED     0x00000100L /* (RW)  Receiver Process Stopped */
-#define TULIP_STS_RXNOBUF       0x00000080L /* (RW)  Receive Buf Unavail */
-#define TULIP_STS_RXINTR        0x00000040L /* (RW)  Receive Interrupt */
-#define TULIP_STS_TXUNDERFLOW   0x00000020L /* (RW)  Transmit Underflow */
-#define TULIP_STS_TXJABER       0x00000008L /* (RW)  Jabber timeout */
-#define TULIP_STS_TXNOBUF       0x00000004L
-#define TULIP_STS_TXSTOPPED     0x00000002L /* (RW)  Transmit Process Stopped */
-#define TULIP_STS_TXINTR        0x00000001L /* (RW)  Transmit Interrupt */
-
-#define TULIP_STS_RXS_STOPPED   0x00000000L /*        000 - Stopped */
-
-#define TULIP_STS_RXSTOPPED     0x00000100L             /* (RW)  Receive Process Stopped */
-#define TULIP_STS_RXNOBUF       0x00000080L
-
-#define TULIP_CMD_TXRUN         0x00002000L /* (RW)  Start/Stop Transmitter */
-#define TULIP_CMD_RXRUN         0x00000002L /* (RW)  Start/Stop Receive Filtering */
-#define TULIP_DSTS_TxDEFERRED   0x00000001      /* Initially Deferred */
-#define TULIP_DSTS_OWNER        0x80000000      /* Owner (1 = 21040) */
-#define TULIP_DSTS_RxMIIERR     0x00000008
-#define LMC_DSTS_ERRSUM         (TULIP_DSTS_RxMIIERR)
-
-#define TULIP_DEFAULT_INTR_MASK  (TULIP_STS_NORMALINTR \
-  | TULIP_STS_RXINTR       \
-  | TULIP_STS_TXINTR     \
-  | TULIP_STS_ABNRMLINTR \
-  | TULIP_STS_SYSERROR   \
-  | TULIP_STS_TXSTOPPED  \
-  | TULIP_STS_TXUNDERFLOW\
-  | TULIP_STS_RXSTOPPED )
-
-#define DESC_OWNED_BY_SYSTEM   ((u32)(0x00000000))
-#define DESC_OWNED_BY_DC21X4   ((u32)(0x80000000))
+#define TULIP_STS_NORMALINTR	0x00010000L /* (RW) Normal Interrupt */
+#define TULIP_STS_ABNRMLINTR	0x00008000L /* (RW) Abnormal Interrupt */
+#define TULIP_STS_ERI		0x00004000L /* (RW) Early Receive Interrupt */
+#define TULIP_STS_SYSERROR	0x00002000L /* (RW) System Error */
+#define TULIP_STS_GTE		0x00000800L /* (RW) General Pupose Timer Exp */
+#define TULIP_STS_ETI		0x00000400L /* (RW) Early Transmit Interrupt */
+#define TULIP_STS_RXWT		0x00000200L /* (RW) Receiver Watchdog Timeout */
+#define TULIP_STS_RXSTOPPED	0x00000100L /* (RW) Receiver Process Stopped */
+#define TULIP_STS_RXNOBUF	0x00000080L /* (RW) Receive Buf Unavail */
+#define TULIP_STS_RXINTR	0x00000040L /* (RW) Receive Interrupt */
+#define TULIP_STS_TXUNDERFLOW	0x00000020L /* (RW) Transmit Underflow */
+#define TULIP_STS_TXJABER	0x00000008L /* (RW) Jabber timeout */
+#define TULIP_STS_TXNOBUF	0x00000004L
+#define TULIP_STS_TXSTOPPED	0x00000002L /* (RW) Transmit Process Stopped */
+#define TULIP_STS_TXINTR	0x00000001L /* (RW) Transmit Interrupt */
+
+#define TULIP_STS_RXS_STOPPED	0x00000000L /*	000 - Stopped */
+
+#define TULIP_STS_RXSTOPPED	0x00000100L /* (RW) Receive Process Stopped */
+#define TULIP_STS_RXNOBUF	0x00000080L
+
+#define TULIP_CMD_TXRUN		0x00002000L /* (RW) Start/Stop Transmitter */
+#define TULIP_CMD_RXRUN		0x00000002L /* (RW) Start/Stop Receive Filtering */
+#define TULIP_DSTS_TxDEFERRED	0x00000001	/* Initially Deferred */
+#define TULIP_DSTS_OWNER	0x80000000	/* Owner (1 = 21040) */
+#define TULIP_DSTS_RxMIIERR	0x00000008
+#define LMC_DSTS_ERRSUM		(TULIP_DSTS_RxMIIERR)
+
+#define TULIP_DEFAULT_INTR_MASK	(TULIP_STS_NORMALINTR | TULIP_STS_RXINTR | \
+				 TULIP_STS_TXINTR | TULIP_STS_ABNRMLINTR | \
+				 TULIP_STS_SYSERROR | TULIP_STS_TXSTOPPED | \
+				 TULIP_STS_TXUNDERFLOW | TULIP_STS_RXSTOPPED)
+
+#define DESC_OWNED_BY_SYSTEM	((u32)(0x00000000))
+#define DESC_OWNED_BY_DC21X4	((u32)(0x80000000))
 
 #ifndef TULIP_CMD_RECEIVEALL
-#define TULIP_CMD_RECEIVEALL 0x40000000L
+#define TULIP_CMD_RECEIVEALL	0x40000000L
 #endif
 
 /* Adapter module number */
-#define LMC_ADAP_HSSI           2
-#define LMC_ADAP_DS3            3
-#define LMC_ADAP_SSI            4
-#define LMC_ADAP_T1             5
+#define LMC_ADAP_HSSI		2
+#define LMC_ADAP_DS3		3
+#define LMC_ADAP_SSI		4
+#define LMC_ADAP_T1		5
 
-#define LMC_MTU 1500
+#define LMC_MTU			1500
 
-#define LMC_CRC_LEN_16 2  /* 16-bit CRC */
-#define LMC_CRC_LEN_32 4
+#define LMC_CRC_LEN_16		2	/* 16-bit CRC */
+#define LMC_CRC_LEN_32		4
 
 #endif /* _LMC_VAR_H_ */
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 14/29] LMC: Remove now empty header file lmc.h.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/lmc.h   |    6 ------
 drivers/net/wan/lmc/main.c  |    1 -
 drivers/net/wan/lmc/media.c |    1 -
 3 files changed, 0 insertions(+), 8 deletions(-)
 delete mode 100644 drivers/net/wan/lmc/lmc.h

diff --git a/drivers/net/wan/lmc/lmc.h b/drivers/net/wan/lmc/lmc.h
deleted file mode 100644
index 5f467d1..0000000
--- a/drivers/net/wan/lmc/lmc.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _LMC_H_
-#define _LMC_H_
-
-#include "var.h"
-
-#endif
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index c80131f..eb5b2ea 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -70,7 +70,6 @@
 
 #define DRIVER_VERSION  ((DRIVER_MAJOR_VERSION << 8) + DRIVER_MINOR_VERSION)
 
-#include "lmc.h"
 #include "var.h"
 #include "ioctl.h"
 
diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 9b1c394..411138f 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -16,7 +16,6 @@
 #include <linux/uaccess.h>
 #include <asm/processor.h>   /* Processor type for cache alignment. */
 #include <asm/dma.h>
-#include "lmc.h"
 #include "var.h"
 #include "ioctl.h"
 
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 15/29] LMC: lanmedia.com is not functional anymore.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/ioctl.h |    2 +-
 drivers/net/wan/lmc/main.c  |    3 +--
 drivers/net/wan/lmc/media.c |    2 +-
 drivers/net/wan/lmc/var.h   |    2 +-
 4 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wan/lmc/ioctl.h b/drivers/net/wan/lmc/ioctl.h
index 1b7820f..4914ede 100644
--- a/drivers/net/wan/lmc/ioctl.h
+++ b/drivers/net/wan/lmc/ioctl.h
@@ -2,7 +2,7 @@
 #define _LMC_IOCTL_H_
 /*
  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
- * All rights reserved.  www.lanmedia.com
+ * All rights reserved.
  *
  * This code is written by:
  * Andrew Stanley-Jones (asj@cban.com)
diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index eb5b2ea..64bd6d5 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
- * All rights reserved.  www.lanmedia.com
+ * All rights reserved.
  * Generic HDLC port Copyright (C) 2008 Krzysztof Halasa <khc@pm.waw.pl>
  *
  * This code is written by:
@@ -20,7 +20,6 @@
  * Driver for the LanMedia LMC5200, LMC5245, LMC1000, LMC1200 cards.
  *
  * To control link specific options lmcctl is required.
- * It can be obtained from ftp.lanmedia.com.
  *
  * Linux driver notes:
  * Linux uses the device struct lmc_private to pass private information
diff --git a/drivers/net/wan/lmc/media.c b/drivers/net/wan/lmc/media.c
index 411138f..5851d19 100644
--- a/drivers/net/wan/lmc/media.c
+++ b/drivers/net/wan/lmc/media.c
@@ -23,7 +23,7 @@
 
 /*
  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
- * All rights reserved.  www.lanmedia.com
+ * All rights reserved.
  *
  * This code is written by:
  * Andrew Stanley-Jones (asj@cban.com)
diff --git a/drivers/net/wan/lmc/var.h b/drivers/net/wan/lmc/var.h
index d694731..09b901c 100644
--- a/drivers/net/wan/lmc/var.h
+++ b/drivers/net/wan/lmc/var.h
@@ -3,7 +3,7 @@
 
 /*
  * Copyright (c) 1997-2000 LAN Media Corporation (LMC)
- * All rights reserved.  www.lanmedia.com
+ * All rights reserved.
  *
  * This code is written by:
  * Andrew Stanley-Jones (asj@cban.com)
-- 
1.7.1.1


^ permalink raw reply related

* [PATCH 20/29] LMC: Remove unused sc->board_idx.
From: Krzysztof Halasa @ 2010-07-31 15:05 UTC (permalink / raw)
  To: David Miller; +Cc: netdev
In-Reply-To: <m3fwyzzpjf.fsf@intrepid.localdomain>

From: Krzysztof Hałasa <khc@pm.waw.pl>

Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
---
 drivers/net/wan/lmc/main.c |    1 -
 drivers/net/wan/lmc/var.h  |    1 -
 2 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wan/lmc/main.c b/drivers/net/wan/lmc/main.c
index 56631d4..2229e0a 100644
--- a/drivers/net/wan/lmc/main.c
+++ b/drivers/net/wan/lmc/main.c
@@ -836,7 +836,6 @@ static int __devinit lmc_init_one(struct pci_dev *pdev,
 	/* reset clock */
 	LMC_CSR_WRITE(sc, csr_gp_timer, 0xFFFFFFFFUL);
 
-	sc->board_idx = cards_found++;
 	sc->extra_stats.check = STATCHECK;
 	sc->extra_stats.version_size = (DRIVER_VERSION << 16) +
 		sizeof(sc->netdev->stats) + sizeof(sc->extra_stats);
diff --git a/drivers/net/wan/lmc/var.h b/drivers/net/wan/lmc/var.h
index 10cb70d..729ab9f 100644
--- a/drivers/net/wan/lmc/var.h
+++ b/drivers/net/wan/lmc/var.h
@@ -267,7 +267,6 @@ typedef struct lmc_xinfo {
 /* forward decl */
 struct card {
 	char *name;
-	u8 board_idx;
 	struct lmc_extra_statistics extra_stats;
 	struct net_device *netdev;
 
-- 
1.7.1.1


^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox